





















@@ -1,12 +1,10 @@
11import type { Command } from "commander";
22import {
3-buildCommandGroupEntries,
43registerCommandGroups,
54resolveCliArgvInvocation,
65shouldEagerRegisterSubcommands,
76type CommandGroupEntry,
8-type CommandGroupDescriptorSpec,
9-type NamedCommandDescriptor,
7+type CommandGroupPlaceholder,
108} from "openclaw/plugin-sdk/cli-runtime";
119import { browserActionExamples, browserCoreExamples } from "./browser-cli-examples.js";
1210import type { BrowserParentOpts } from "./browser-cli-shared.js";
@@ -20,178 +18,107 @@ import {
2018theme,
2119} from "./core-api.js";
222023-type BrowserCommandDescriptor = NamedCommandDescriptor;
2421type BrowserCommandRegistrar = (args: {
2522browser: Command;
2623parentOpts: (cmd: Command) => BrowserParentOpts;
2724}) => Promise<void> | void;
282529-const browserCommandDescriptors: readonly BrowserCommandDescriptor[] = [
30-{ name: "status", description: "Show browser status", hasSubcommands: false },
31-{
32-name: "start",
33-description: "Start the browser (no-op if already running)",
34-hasSubcommands: false,
35-},
36-{ name: "stop", description: "Stop the browser (best-effort)", hasSubcommands: false },
37-{
38-name: "reset-profile",
39-description: "Reset browser profile (moves it to Trash)",
40-hasSubcommands: false,
41-},
42-{ name: "tabs", description: "List open tabs", hasSubcommands: false },
43-{ name: "tab", description: "Tab shortcuts (index-based)", hasSubcommands: true },
44-{ name: "open", description: "Open a URL in a new tab", hasSubcommands: false },
45-{
46-name: "focus",
47-description: "Focus a tab by target id (or unique prefix)",
48-hasSubcommands: false,
49-},
50-{ name: "close", description: "Close a tab (target id optional)", hasSubcommands: false },
51-{ name: "profiles", description: "List all browser profiles", hasSubcommands: false },
52-{ name: "create-profile", description: "Create a new browser profile", hasSubcommands: false },
53-{ name: "delete-profile", description: "Delete a browser profile", hasSubcommands: false },
54-{ name: "screenshot", description: "Capture a screenshot (MEDIA:<path>)", hasSubcommands: false },
55-{
56-name: "snapshot",
57-description: "Capture a snapshot (default: ai; aria is the accessibility tree)",
58-hasSubcommands: false,
59-},
60-{ name: "navigate", description: "Navigate the current tab to a URL", hasSubcommands: false },
61-{ name: "resize", description: "Resize the viewport", hasSubcommands: false },
62-{ name: "click", description: "Click an element by ref from snapshot", hasSubcommands: false },
63-{ name: "click-coords", description: "Click viewport coordinates", hasSubcommands: false },
64-{ name: "type", description: "Type into an element by ref from snapshot", hasSubcommands: false },
65-{ name: "press", description: "Press a key", hasSubcommands: false },
66-{ name: "hover", description: "Hover an element by ai ref", hasSubcommands: false },
67-{
68-name: "scrollintoview",
69-description: "Scroll an element into view by ref from snapshot",
70-hasSubcommands: false,
71-},
72-{ name: "drag", description: "Drag from one ref to another", hasSubcommands: false },
73-{ name: "select", description: "Select option(s) in a select element", hasSubcommands: false },
74-{
75-name: "upload",
76-description: "Arm file upload for the next file chooser",
77-hasSubcommands: false,
78-},
79-{
80-name: "waitfordownload",
81-description: "Wait for the next download (and save it)",
82-hasSubcommands: false,
83-},
84-{
85-name: "download",
86-description: "Click a ref and save the resulting download",
87-hasSubcommands: false,
88-},
89-{
90-name: "dialog",
91-description: "Arm the next modal dialog (alert/confirm/prompt)",
92-hasSubcommands: false,
93-},
94-{ name: "fill", description: "Fill a form with JSON field descriptors", hasSubcommands: false },
95-{
96-name: "wait",
97-description: "Wait for time, selector, URL, load state, or JS conditions",
98-hasSubcommands: false,
99-},
100-{
101-name: "evaluate",
102-description: "Evaluate a function against the page or a ref",
103-hasSubcommands: false,
104-},
105-{ name: "console", description: "Get recent console messages", hasSubcommands: false },
106-{ name: "pdf", description: "Save page as PDF", hasSubcommands: false },
107-{
108-name: "responsebody",
109-description: "Wait for a network response and return its body",
110-hasSubcommands: false,
111-},
112-{ name: "highlight", description: "Highlight an element by ref", hasSubcommands: false },
113-{ name: "errors", description: "Get recent page errors", hasSubcommands: false },
114-{
115-name: "requests",
116-description: "Get recent network requests (best-effort)",
117-hasSubcommands: false,
118-},
119-{ name: "doctor", description: "Diagnose browser readiness", hasSubcommands: false },
120-{ name: "trace", description: "Record a Playwright trace", hasSubcommands: true },
121-{ name: "cookies", description: "Read/write cookies", hasSubcommands: true },
122-{ name: "storage", description: "Read/write localStorage/sessionStorage", hasSubcommands: true },
123-{ name: "set", description: "Browser environment settings", hasSubcommands: true },
124-];
26+type BrowserCommandGroupDefinition = {
27+placeholders: readonly CommandGroupPlaceholder[];
28+register: BrowserCommandRegistrar;
29+};
12530126-const browserCommandGroupSpecs: readonly CommandGroupDescriptorSpec<BrowserCommandRegistrar>[] = [
127-{
128-commandNames: [
129-"status",
130-"start",
131-"stop",
132-"reset-profile",
133-"tabs",
134-"tab",
135-"open",
136-"focus",
137-"close",
138-"profiles",
139-"create-profile",
140-"delete-profile",
31+const command = (name: string, description: string): CommandGroupPlaceholder => ({
32+ name,
33+ description,
34+});
35+36+const browserCommandGroupDefinitions: readonly BrowserCommandGroupDefinition[] = [
37+{
38+placeholders: [
39+command("status", "Show browser status"),
40+command("start", "Start the browser (no-op if already running)"),
41+command("stop", "Stop the browser (best-effort)"),
42+command("reset-profile", "Reset browser profile (moves it to Trash)"),
43+command("tabs", "List open tabs"),
44+command("tab", "Tab shortcuts (index-based)"),
45+command("open", "Open a URL in a new tab"),
46+command("focus", "Focus a tab by target id, tab id, label, or unique target id prefix"),
47+command("close", "Close a tab (target id optional)"),
48+command("profiles", "List all browser profiles"),
49+command("create-profile", "Create a new browser profile"),
50+command("delete-profile", "Delete a browser profile"),
14151],
14252register: async (args) => {
14353const module = await import("./browser-cli-manage.js");
14454module.registerBrowserManageCommands(args.browser, args.parentOpts);
14555},
14656},
14757{
148-commandNames: ["screenshot", "snapshot"],
58+placeholders: [
59+command("screenshot", "Capture a screenshot (MEDIA:<path>)"),
60+command("snapshot", "Capture a snapshot (default: ai; aria is the accessibility tree)"),
61+],
14962register: async (args) => {
15063const module = await import("./browser-cli-inspect.js");
15164module.registerBrowserInspectCommands(args.browser, args.parentOpts);
15265},
15366},
15467{
155-commandNames: [
156-"navigate",
157-"resize",
158-"click",
159-"click-coords",
160-"type",
161-"press",
162-"hover",
163-"scrollintoview",
164-"drag",
165-"select",
166-"upload",
167-"waitfordownload",
168-"download",
169-"dialog",
170-"fill",
171-"wait",
172-"evaluate",
68+placeholders: [
69+command("navigate", "Navigate the current tab to a URL"),
70+command("resize", "Resize the viewport"),
71+command("click", "Click an element by ref from snapshot"),
72+command("click-coords", "Click viewport coordinates"),
73+command("type", "Type into an element by ref from snapshot"),
74+command("press", "Press a key"),
75+command("hover", "Hover an element by ai ref"),
76+command("scrollintoview", "Scroll an element into view by ref from snapshot"),
77+command("drag", "Drag from one ref to another"),
78+command("select", "Select option(s) in a select element"),
79+command("upload", "Arm file upload for the next file chooser"),
80+command("waitfordownload", "Wait for the next download (and save it)"),
81+command("download", "Click a ref and save the resulting download"),
82+command("dialog", "Arm the next modal dialog (alert/confirm/prompt)"),
83+command("fill", "Fill a form with JSON field descriptors"),
84+command("wait", "Wait for time, selector, URL, load state, or JS conditions"),
85+command("evaluate", "Evaluate a function against the page or a ref"),
17386],
17487register: async (args) => {
17588const module = await import("./browser-cli-actions-input.js");
17689module.registerBrowserActionInputCommands(args.browser, args.parentOpts);
17790},
17891},
17992{
180-commandNames: ["console", "pdf", "responsebody"],
93+placeholders: [
94+command("console", "Get recent console messages"),
95+command("pdf", "Save page as PDF"),
96+command("responsebody", "Wait for a network response and return its body"),
97+],
18198register: async (args) => {
18299const module = await import("./browser-cli-actions-observe.js");
183100module.registerBrowserActionObserveCommands(args.browser, args.parentOpts);
184101},
185102},
186103{
187-commandNames: ["highlight", "errors", "requests", "doctor", "trace"],
104+placeholders: [
105+command("highlight", "Highlight an element by ref"),
106+command("errors", "Get recent page errors"),
107+command("requests", "Get recent network requests (best-effort)"),
108+command("doctor", "Check browser plugin readiness"),
109+command("trace", "Record a Playwright trace"),
110+],
188111register: async (args) => {
189112const module = await import("./browser-cli-debug.js");
190113module.registerBrowserDebugCommands(args.browser, args.parentOpts);
191114},
192115},
193116{
194-commandNames: ["cookies", "storage", "set"],
117+placeholders: [
118+command("cookies", "Read/write cookies"),
119+command("storage", "Read/write localStorage/sessionStorage"),
120+command("set", "Browser environment settings"),
121+],
195122register: async (args) => {
196123const module = await import("./browser-cli-state.js");
197124module.registerBrowserStateCommands(args.browser, args.parentOpts);
@@ -203,11 +130,10 @@ function buildBrowserCommandGroups(params: {
203130browser: Command;
204131parentOpts: (cmd: Command) => BrowserParentOpts;
205132}): CommandGroupEntry[] {
206-return buildCommandGroupEntries(
207-browserCommandDescriptors,
208-browserCommandGroupSpecs,
209-(register) => async () => await register(params),
210-);
133+return browserCommandGroupDefinitions.map((entry) => ({
134+placeholders: entry.placeholders,
135+register: async () => await entry.register(params),
136+}));
211137}
212138213139function registerLazyBrowserCommands(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。