


























1+import { normalizeLowercaseStringOrEmpty } from "@openclaw/normalization-core/string-coerce";
2+import type { Command } from "commander";
3+import { formatDocsLink } from "../../../packages/terminal-core/src/links.js";
4+import { theme } from "../../../packages/terminal-core/src/theme.js";
5+import { formatHelpExamples } from "../help-format.js";
6+7+type AgentViaGatewayModule = typeof import("../../commands/agent-via-gateway.js");
8+type CliUtilsModule = typeof import("../cli-utils.js");
9+type GlobalStateModule = typeof import("../../global-state.js");
10+type RuntimeModule = typeof import("../../runtime.js");
11+12+async function loadAgentCliCommand(): Promise<AgentViaGatewayModule["agentCliCommand"]> {
13+return (await import("../../commands/agent-via-gateway.js")).agentCliCommand;
14+}
15+16+async function loadDefaultRuntime(): Promise<RuntimeModule["defaultRuntime"]> {
17+return (await import("../../runtime.js")).defaultRuntime;
18+}
19+20+async function loadRunCommandWithRuntime(): Promise<CliUtilsModule["runCommandWithRuntime"]> {
21+return (await import("../cli-utils.js")).runCommandWithRuntime;
22+}
23+24+async function loadSetVerbose(): Promise<GlobalStateModule["setVerbose"]> {
25+return (await import("../../global-state.js")).setVerbose;
26+}
27+28+export function registerAgentTurnCommand(
29+program: Command,
30+args: { agentChannelOptions: string },
31+): void {
32+program
33+.command("agent")
34+.description("Run an agent turn via the Gateway (use --local for embedded)")
35+.requiredOption("-m, --message <text>", "Message body for the agent")
36+.option("-t, --to <number>", "Recipient number in E.164 used to derive the session key")
37+.option("--session-key <key>", "Explicit session key (agent:<id>:<key>, or scoped to --agent)")
38+.option("--session-id <id>", "Use an explicit session id")
39+.option("--agent <id>", "Agent id (overrides routing bindings)")
40+.option("--model <id>", "Model override for this run (provider/model or model id)")
41+.option(
42+"--thinking <level>",
43+"Thinking level: off | minimal | low | medium | high | xhigh | adaptive | max where supported",
44+)
45+.option("--verbose <on|off>", "Persist agent verbose level for the session")
46+.option(
47+"--channel <channel>",
48+`Delivery channel: ${args.agentChannelOptions} (omit to use the main session channel)`,
49+)
50+.option("--reply-to <target>", "Delivery target override (separate from session routing)")
51+.option("--reply-channel <channel>", "Delivery channel override (separate from routing)")
52+.option("--reply-account <id>", "Delivery account id override")
53+.option(
54+"--local",
55+"Run the embedded agent locally (requires model provider API keys in your shell)",
56+false,
57+)
58+.option("--deliver", "Send the agent's reply back to the selected channel", false)
59+.option("--json", "Output result as JSON", false)
60+.option(
61+"--timeout <seconds>",
62+"Override agent command timeout (seconds, default 600 or config value)",
63+)
64+.addHelpText(
65+"after",
66+() =>
67+`
68+${theme.heading("Examples:")}
69+${formatHelpExamples([
70+ ['openclaw agent --to +15555550123 --message "status update"', "Start a new session."],
71+ ['openclaw agent --agent ops --message "Summarize logs"', "Use a specific agent."],
72+ [
73+ 'openclaw agent --session-key agent:ops:incident-42 --message "Summarize status"',
74+ "Target an exact session key.",
75+ ],
76+ [
77+ 'openclaw agent --session-id 1234 --message "Summarize inbox" --thinking medium',
78+ "Target a session with explicit thinking level.",
79+ ],
80+ [
81+ 'openclaw agent --to +15555550123 --message "Trace logs" --verbose on --json',
82+ "Enable verbose logging and JSON output.",
83+ ],
84+ ['openclaw agent --to +15555550123 --message "Summon reply" --deliver', "Deliver reply."],
85+ [
86+ 'openclaw agent --agent ops --message "Generate report" --deliver --reply-channel slack --reply-to "#reports"',
87+ "Send reply to a different channel/target.",
88+ ],
89+])}
90+91+${theme.muted("Docs:")} ${formatDocsLink("/cli/agent", "docs.openclaw.ai/cli/agent")}`,
92+)
93+.action(async (opts): Promise<void> => {
94+const verboseLevel =
95+typeof opts.verbose === "string" ? normalizeLowercaseStringOrEmpty(opts.verbose) : "";
96+const [defaultRuntime, runCommandWithRuntime, setVerbose, agentCliCommand] =
97+await Promise.all([
98+loadDefaultRuntime(),
99+loadRunCommandWithRuntime(),
100+loadSetVerbose(),
101+loadAgentCliCommand(),
102+]);
103+await runCommandWithRuntime(defaultRuntime, async () => {
104+setVerbose(verboseLevel === "on");
105+await agentCliCommand(opts, defaultRuntime);
106+});
107+});
108+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。