browser-opt 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-opt/index.d.ts +9 -0
- package/dist/browser-opt/index.d.ts.map +1 -0
- package/dist/browser-opt/index.js +7 -0
- package/dist/browser-opt/index.js.map +1 -0
- package/dist/browser-opt/runner/actions/index.d.ts +13 -0
- package/dist/browser-opt/runner/actions/index.d.ts.map +1 -0
- package/dist/browser-opt/runner/actions/index.js +44 -0
- package/dist/browser-opt/runner/actions/index.js.map +1 -0
- package/dist/browser-opt/runner/actions/utils/click-action.d.ts +10 -0
- package/dist/browser-opt/runner/actions/utils/click-action.d.ts.map +1 -0
- package/dist/browser-opt/runner/actions/utils/click-action.js +17 -0
- package/dist/browser-opt/runner/actions/utils/click-action.js.map +1 -0
- package/dist/browser-opt/runner/actions/utils/date-action.d.ts +21 -0
- package/dist/browser-opt/runner/actions/utils/date-action.d.ts.map +1 -0
- package/dist/browser-opt/runner/actions/utils/date-action.js +464 -0
- package/dist/browser-opt/runner/actions/utils/date-action.js.map +1 -0
- package/dist/browser-opt/runner/actions/utils/dom-action.d.ts +8 -0
- package/dist/browser-opt/runner/actions/utils/dom-action.d.ts.map +1 -0
- package/dist/browser-opt/runner/actions/utils/dom-action.js +167 -0
- package/dist/browser-opt/runner/actions/utils/dom-action.js.map +1 -0
- package/dist/browser-opt/runner/actions/utils/fill-action.d.ts +10 -0
- package/dist/browser-opt/runner/actions/utils/fill-action.d.ts.map +1 -0
- package/dist/browser-opt/runner/actions/utils/fill-action.js +20 -0
- package/dist/browser-opt/runner/actions/utils/fill-action.js.map +1 -0
- package/dist/browser-opt/runner/actions/utils/handoff-action.d.ts +10 -0
- package/dist/browser-opt/runner/actions/utils/handoff-action.d.ts.map +1 -0
- package/dist/browser-opt/runner/actions/utils/handoff-action.js +6 -0
- package/dist/browser-opt/runner/actions/utils/handoff-action.js.map +1 -0
- package/dist/browser-opt/runner/actions/utils/open-action.d.ts +10 -0
- package/dist/browser-opt/runner/actions/utils/open-action.d.ts.map +1 -0
- package/dist/browser-opt/runner/actions/utils/open-action.js +9 -0
- package/dist/browser-opt/runner/actions/utils/open-action.js.map +1 -0
- package/dist/browser-opt/runner/actions/utils/select-option-action.d.ts +17 -0
- package/dist/browser-opt/runner/actions/utils/select-option-action.d.ts.map +1 -0
- package/dist/browser-opt/runner/actions/utils/select-option-action.js +532 -0
- package/dist/browser-opt/runner/actions/utils/select-option-action.js.map +1 -0
- package/dist/browser-opt/runner/actions/utils/upload-action.d.ts +7 -0
- package/dist/browser-opt/runner/actions/utils/upload-action.d.ts.map +1 -0
- package/dist/browser-opt/runner/actions/utils/upload-action.js +173 -0
- package/dist/browser-opt/runner/actions/utils/upload-action.js.map +1 -0
- package/dist/browser-opt/runner/evidence.d.ts +18 -0
- package/dist/browser-opt/runner/evidence.d.ts.map +1 -0
- package/dist/browser-opt/runner/evidence.js +116 -0
- package/dist/browser-opt/runner/evidence.js.map +1 -0
- package/dist/browser-opt/runner/handoff.d.ts +28 -0
- package/dist/browser-opt/runner/handoff.d.ts.map +1 -0
- package/dist/browser-opt/runner/handoff.js +132 -0
- package/dist/browser-opt/runner/handoff.js.map +1 -0
- package/dist/browser-opt/runner/index.d.ts +11 -0
- package/dist/browser-opt/runner/index.d.ts.map +1 -0
- package/dist/browser-opt/runner/index.js +244 -0
- package/dist/browser-opt/runner/index.js.map +1 -0
- package/dist/browser-opt/runner/step-executor.d.ts +5 -0
- package/dist/browser-opt/runner/step-executor.d.ts.map +1 -0
- package/dist/browser-opt/runner/step-executor.js +302 -0
- package/dist/browser-opt/runner/step-executor.js.map +1 -0
- package/dist/browser-opt/type.d.ts +120 -0
- package/dist/browser-opt/type.d.ts.map +1 -0
- package/dist/browser-opt/type.js +2 -0
- package/dist/browser-opt/type.js.map +1 -0
- package/dist/browser-opt/utils.d.ts +48 -0
- package/dist/browser-opt/utils.d.ts.map +1 -0
- package/dist/browser-opt/utils.js +885 -0
- package/dist/browser-opt/utils.js.map +1 -0
- package/dist/browser-opt/workflow/index.d.ts +7 -0
- package/dist/browser-opt/workflow/index.d.ts.map +1 -0
- package/dist/browser-opt/workflow/index.js +6 -0
- package/dist/browser-opt/workflow/index.js.map +1 -0
- package/dist/browser-opt/workflow/matcher.d.ts +12 -0
- package/dist/browser-opt/workflow/matcher.d.ts.map +1 -0
- package/dist/browser-opt/workflow/matcher.js +102 -0
- package/dist/browser-opt/workflow/matcher.js.map +1 -0
- package/dist/browser-opt/workflow/store.d.ts +15 -0
- package/dist/browser-opt/workflow/store.d.ts.map +1 -0
- package/dist/browser-opt/workflow/store.js +175 -0
- package/dist/browser-opt/workflow/store.js.map +1 -0
- package/dist/browser-opt/workflow/type.d.ts +43 -0
- package/dist/browser-opt/workflow/type.d.ts.map +1 -0
- package/dist/browser-opt/workflow/type.js +6 -0
- package/dist/browser-opt/workflow/type.js.map +1 -0
- package/dist/cli/browser-opt.d.ts +3 -0
- package/dist/cli/browser-opt.d.ts.map +1 -0
- package/dist/cli/browser-opt.js +11 -0
- package/dist/cli/browser-opt.js.map +1 -0
- package/dist/cli/commands/browser-opt.d.ts +2 -0
- package/dist/cli/commands/browser-opt.d.ts.map +1 -0
- package/dist/cli/commands/browser-opt.js +514 -0
- package/dist/cli/commands/browser-opt.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +10 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +35 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/utils/args.d.ts +17 -0
- package/dist/cli/utils/args.d.ts.map +1 -0
- package/dist/cli/utils/args.js +74 -0
- package/dist/cli/utils/args.js.map +1 -0
- package/dist/cli/utils/constants.d.ts +8 -0
- package/dist/cli/utils/constants.d.ts.map +1 -0
- package/dist/cli/utils/constants.js +18 -0
- package/dist/cli/utils/constants.js.map +1 -0
- package/dist/cli/utils/output.d.ts +7 -0
- package/dist/cli/utils/output.d.ts.map +1 -0
- package/dist/cli/utils/output.js +45 -0
- package/dist/cli/utils/output.js.map +1 -0
- package/package.json +35 -0
- package/skills/browser-opt/SKILL.md +249 -0
- package/skills/browser-opt/manifest.json +75 -0
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 承载 browser-opt 即时执行、Workflow 管理子命令的参数解析与执行编排。
|
|
3
|
+
* 文件只协调 CLI 交互,存储、匹配和浏览器执行分别交由对应领域模块处理。
|
|
4
|
+
*/
|
|
5
|
+
import { BrowserOptRunner, browserOptTemplate, extractBrowserOptUrl, } from '../../browser-opt/runner/index.js';
|
|
6
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import { findBrowserOptWorkflowById, loadBrowserOptWorkflows, matchBrowserOptWorkflows, renderBrowserOptWorkflowFlow, resolveBrowserOptWorkflowDir, saveBrowserOptWorkflow, } from '../../browser-opt/workflow/index.js';
|
|
9
|
+
import * as fs from 'node:fs';
|
|
10
|
+
import * as path from 'node:path';
|
|
11
|
+
import * as readline from 'node:readline';
|
|
12
|
+
import { getBooleanFlag, getStringFlag, parseCliArgs, resolveLiveViewport, resolveProfile, resolveStatePath, } from '../utils/args.js';
|
|
13
|
+
import { BROWSER_OPT_USAGE, HANDOFF_DONE_ANSWERS, LIVE_VIEWPORT_DASHBOARD_URL } from '../utils/constants.js';
|
|
14
|
+
import { printBrowserOptResult } from '../utils/output.js';
|
|
15
|
+
import { setupBrowserOpt } from './setup.js';
|
|
16
|
+
const BROWSER_OPT_EXIT_CODE_FAILURE = 1;
|
|
17
|
+
const BROWSER_OPT_EXIT_CODE_HANDOFF = 2;
|
|
18
|
+
const BROWSER_OPT_EXIT_CODE_AMBIGUOUS = 3;
|
|
19
|
+
const BROWSER_OPT_EXIT_CODE_NOT_FOUND = 4;
|
|
20
|
+
const DEFAULT_BROWSER_PROFILE = 'Default';
|
|
21
|
+
const DEFAULT_AUTH_STATE_DIR = '.browser-opt/states';
|
|
22
|
+
const DEFAULT_HANDOFF_RUN_DIR = '.browser-opt/handoffs';
|
|
23
|
+
const HANDOFF_SIGNAL_POLL_INTERVAL_MS = 250;
|
|
24
|
+
export async function cmdBrowserOpt(args) {
|
|
25
|
+
const parsed = parseCliArgs(args);
|
|
26
|
+
const [subcommand] = parsed.positionals;
|
|
27
|
+
const positionalText = parsed.positionals.join(' ').trim();
|
|
28
|
+
const isImmediateFlow = Boolean(extractBrowserOptUrl(positionalText));
|
|
29
|
+
if (subcommand === 'setup' && !isImmediateFlow) {
|
|
30
|
+
setupBrowserOpt({
|
|
31
|
+
installSystemDependencies: getBooleanFlag(parsed.flags, 'with-deps'),
|
|
32
|
+
installSkill: !getBooleanFlag(parsed.flags, 'skip-skill'),
|
|
33
|
+
agent: getStringFlag(parsed.flags, 'agent'),
|
|
34
|
+
skillsDir: getStringFlag(parsed.flags, 'skills-dir'),
|
|
35
|
+
});
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (subcommand === 'save' && (!isImmediateFlow || getStringFlag(parsed.flags, 'flow'))) {
|
|
39
|
+
saveWorkflowCommand(parsed.positionals.slice(1).join(' '), parsed.flags);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (subcommand === 'list' && !isImmediateFlow) {
|
|
43
|
+
listWorkflowCommand(parsed.flags);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (subcommand === 'match' && !isImmediateFlow) {
|
|
47
|
+
matchWorkflowCommand(parsed.positionals.slice(1).join(' '), parsed.flags);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (subcommand === 'run' && (!isImmediateFlow || getStringFlag(parsed.flags, 'workflow-id'))) {
|
|
51
|
+
await runWorkflowCommand(parsed.positionals.slice(1).join(' '), parsed.flags);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (subcommand === 'start' && !isImmediateFlow) {
|
|
55
|
+
startWorkflowCommand(parsed.positionals.slice(1).join(' '), parsed.flags);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (subcommand === 'status' && !isImmediateFlow) {
|
|
59
|
+
statusWorkflowCommand(parsed.flags);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (subcommand === 'resume' && !isImmediateFlow) {
|
|
63
|
+
resumeWorkflowCommand(parsed.flags);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const text = positionalText;
|
|
67
|
+
if (!text) {
|
|
68
|
+
console.log(`${BROWSER_OPT_USAGE}\n\n${browserOptTemplate()}`);
|
|
69
|
+
process.exit(BROWSER_OPT_EXIT_CODE_FAILURE);
|
|
70
|
+
}
|
|
71
|
+
await executeBrowserOptFlow(text, parsed.flags);
|
|
72
|
+
}
|
|
73
|
+
/** 统一执行即时或已保存流程,确保两条入口共享登录态、浏览器和报告参数。 */
|
|
74
|
+
async function executeBrowserOptFlow(text, flags, identity) {
|
|
75
|
+
const liveViewport = resolveLiveViewport(flags);
|
|
76
|
+
const requestedProfile = resolveProfile(flags) ?? DEFAULT_BROWSER_PROFILE;
|
|
77
|
+
const authState = resolveBrowserOptAuthState(flags, requestedProfile);
|
|
78
|
+
const outputDir = getStringFlag(flags, 'output-dir');
|
|
79
|
+
const useAgentChat = getBooleanFlag(flags, 'agent-chat');
|
|
80
|
+
const handoffSignalPath = getStringFlag(flags, 'handoff-signal');
|
|
81
|
+
const runner = new BrowserOptRunner();
|
|
82
|
+
const runnerOptions = {
|
|
83
|
+
sessionId: resolveBrowserOptSessionId(flags, identity ?? text),
|
|
84
|
+
profile: authState.profile,
|
|
85
|
+
statePath: authState.statePath,
|
|
86
|
+
authStateSavePath: authState.authStateSavePath,
|
|
87
|
+
authStateFallbackProfile: authState.fallbackProfile,
|
|
88
|
+
liveViewport,
|
|
89
|
+
outputDir,
|
|
90
|
+
useAgentChat,
|
|
91
|
+
handoff: createBrowserOptHandoffOptions(liveViewport, handoffSignalPath),
|
|
92
|
+
};
|
|
93
|
+
const result = await runner.run(text, runnerOptions);
|
|
94
|
+
printBrowserOptResult(result);
|
|
95
|
+
if (result.passed) {
|
|
96
|
+
process.exit(0);
|
|
97
|
+
}
|
|
98
|
+
process.exit(result.report.handoffTriggered ? BROWSER_OPT_EXIT_CODE_HANDOFF : BROWSER_OPT_EXIT_CODE_FAILURE);
|
|
99
|
+
}
|
|
100
|
+
/** 保存完整自然语言流程;默认拒绝覆盖已有同名 Workflow。 */
|
|
101
|
+
function saveWorkflowCommand(name, flags) {
|
|
102
|
+
const flow = getStringFlag(flags, 'flow');
|
|
103
|
+
if (!name.trim() || !flow?.trim()) {
|
|
104
|
+
console.error('使用方式:npx browser-opt save "<名称>" --flow "<完整自然语言流程>" [--workflow-dir <目录>] [--force]');
|
|
105
|
+
process.exit(BROWSER_OPT_EXIT_CODE_FAILURE);
|
|
106
|
+
}
|
|
107
|
+
const result = saveBrowserOptWorkflow({
|
|
108
|
+
name,
|
|
109
|
+
flow,
|
|
110
|
+
workflowDir: getStringFlag(flags, 'workflow-dir'),
|
|
111
|
+
force: getBooleanFlag(flags, 'force'),
|
|
112
|
+
});
|
|
113
|
+
console.log(`${result.created ? '已保存' : '已更新'} Workflow:${result.workflow.name}`);
|
|
114
|
+
console.log(`文件:${result.filePath}`);
|
|
115
|
+
}
|
|
116
|
+
/** 列出项目目录第一层的有效 Workflow,JSON 模式供 Skill 和脚本稳定解析。 */
|
|
117
|
+
function listWorkflowCommand(flags) {
|
|
118
|
+
const workflowDir = getStringFlag(flags, 'workflow-dir');
|
|
119
|
+
const loaded = loadBrowserOptWorkflows(workflowDir);
|
|
120
|
+
printWorkflowWarnings(loaded.warnings);
|
|
121
|
+
if (getBooleanFlag(flags, 'json')) {
|
|
122
|
+
console.log(JSON.stringify({
|
|
123
|
+
workflowDir: resolveBrowserOptWorkflowDir(workflowDir),
|
|
124
|
+
workflows: loaded.workflows,
|
|
125
|
+
warnings: loaded.warnings,
|
|
126
|
+
}, null, 2));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (loaded.workflows.length === 0) {
|
|
130
|
+
console.log(`未找到已保存的 Workflow:${resolveBrowserOptWorkflowDir(workflowDir)}`);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
console.log(`已保存的 Workflow(${resolveBrowserOptWorkflowDir(workflowDir)}):`);
|
|
134
|
+
for (const workflow of loaded.workflows) {
|
|
135
|
+
console.log(` - ${workflow.name} [${workflow.id}]`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** 输出查询解析结果;该命令本身不启动浏览器,供 Skill 决定是否需要用户选择。 */
|
|
139
|
+
function matchWorkflowCommand(query, flags) {
|
|
140
|
+
if (!query.trim()) {
|
|
141
|
+
console.error('使用方式:npx browser-opt match "<查询语句>" [--workflow-dir <目录>] [--json]');
|
|
142
|
+
process.exit(BROWSER_OPT_EXIT_CODE_FAILURE);
|
|
143
|
+
}
|
|
144
|
+
const loaded = loadBrowserOptWorkflows(getStringFlag(flags, 'workflow-dir'));
|
|
145
|
+
const result = matchBrowserOptWorkflows(query, loaded.workflows);
|
|
146
|
+
printWorkflowWarnings(loaded.warnings);
|
|
147
|
+
if (getBooleanFlag(flags, 'json')) {
|
|
148
|
+
console.log(JSON.stringify(toWorkflowMatchOutput(result, loaded.warnings), null, 2));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
printWorkflowMatch(result);
|
|
152
|
+
}
|
|
153
|
+
/** 先解析查询或指定 ID,只有结果唯一时才进入现有 BrowserOptRunner。 */
|
|
154
|
+
async function runWorkflowCommand(query, flags) {
|
|
155
|
+
const loaded = loadBrowserOptWorkflows(getStringFlag(flags, 'workflow-dir'));
|
|
156
|
+
printWorkflowWarnings(loaded.warnings);
|
|
157
|
+
const workflowId = getStringFlag(flags, 'workflow-id');
|
|
158
|
+
if (workflowId) {
|
|
159
|
+
const workflow = findBrowserOptWorkflowById(workflowId, loaded.workflows);
|
|
160
|
+
if (!workflow) {
|
|
161
|
+
console.error(`未找到 Workflow ID:${workflowId}`);
|
|
162
|
+
printAvailableWorkflows(loaded.workflows);
|
|
163
|
+
process.exit(BROWSER_OPT_EXIT_CODE_NOT_FOUND);
|
|
164
|
+
}
|
|
165
|
+
await executeBrowserOptFlow(renderBrowserOptWorkflowFlow(workflow), flags, workflow.id);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (!query.trim()) {
|
|
169
|
+
console.error('使用方式:npx browser-opt run "<查询语句>" [--workflow-dir <目录>]');
|
|
170
|
+
process.exit(BROWSER_OPT_EXIT_CODE_FAILURE);
|
|
171
|
+
}
|
|
172
|
+
const result = matchBrowserOptWorkflows(query, loaded.workflows);
|
|
173
|
+
if (result.status === 'ambiguous') {
|
|
174
|
+
printWorkflowMatch(result);
|
|
175
|
+
process.exit(BROWSER_OPT_EXIT_CODE_AMBIGUOUS);
|
|
176
|
+
}
|
|
177
|
+
if (result.status === 'not-found' || !result.matched) {
|
|
178
|
+
printWorkflowMatch(result);
|
|
179
|
+
process.exit(BROWSER_OPT_EXIT_CODE_NOT_FOUND);
|
|
180
|
+
}
|
|
181
|
+
await executeBrowserOptFlow(renderBrowserOptWorkflowFlow(result.matched.workflow), flags, result.matched.workflow.id);
|
|
182
|
+
}
|
|
183
|
+
/** 后台启动可跨 Codex turn 恢复的 Workflow,handoff 期间不依赖临时 PTY 会话。 */
|
|
184
|
+
function startWorkflowCommand(query, flags) {
|
|
185
|
+
const loaded = loadBrowserOptWorkflows(getStringFlag(flags, 'workflow-dir'));
|
|
186
|
+
printWorkflowWarnings(loaded.warnings);
|
|
187
|
+
const workflow = resolveWorkflowForExecution(query, flags, loaded.workflows);
|
|
188
|
+
const runId = randomUUID();
|
|
189
|
+
const runDir = path.resolve(process.cwd(), DEFAULT_HANDOFF_RUN_DIR, runId);
|
|
190
|
+
const signalPath = path.join(runDir, 'resume.signal');
|
|
191
|
+
const outputPath = path.join(runDir, 'output.log');
|
|
192
|
+
const metadataPath = path.join(runDir, 'run.json');
|
|
193
|
+
fs.mkdirSync(runDir, { recursive: true });
|
|
194
|
+
const outputFd = fs.openSync(outputPath, 'a');
|
|
195
|
+
const child = spawn(process.execPath, buildDetachedWorkflowArgs(workflow.id, signalPath, flags), {
|
|
196
|
+
detached: true,
|
|
197
|
+
stdio: ['ignore', outputFd, outputFd],
|
|
198
|
+
env: {
|
|
199
|
+
...process.env,
|
|
200
|
+
BROWSER_OPT_HANDOFF_RUN_ID: runId,
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
fs.closeSync(outputFd);
|
|
204
|
+
if (!child.pid) {
|
|
205
|
+
throw new Error('无法启动后台 browser-opt Workflow。');
|
|
206
|
+
}
|
|
207
|
+
child.unref();
|
|
208
|
+
const metadata = {
|
|
209
|
+
runId,
|
|
210
|
+
pid: child.pid,
|
|
211
|
+
workflowId: workflow.id,
|
|
212
|
+
signalPath,
|
|
213
|
+
outputPath,
|
|
214
|
+
startedAt: new Date().toISOString(),
|
|
215
|
+
};
|
|
216
|
+
fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));
|
|
217
|
+
printDetachedRun(metadata, 'RUNNING', getBooleanFlag(flags, 'json'));
|
|
218
|
+
}
|
|
219
|
+
/** 查询后台 Workflow 的稳定状态,并返回最近输出供 Skill 识别 handoff 与最终报告。 */
|
|
220
|
+
function statusWorkflowCommand(flags) {
|
|
221
|
+
const metadata = loadDetachedRun(flags);
|
|
222
|
+
const output = readDetachedRunOutput(metadata.outputPath);
|
|
223
|
+
const status = resolveDetachedRunStatus(metadata.pid, output);
|
|
224
|
+
printDetachedRun(metadata, status, getBooleanFlag(flags, 'json'), output);
|
|
225
|
+
}
|
|
226
|
+
/** 向后台 Workflow 写入一次性恢复信号,原 runner 会在同一浏览器实例中继续。 */
|
|
227
|
+
function resumeWorkflowCommand(flags) {
|
|
228
|
+
const metadata = loadDetachedRun(flags);
|
|
229
|
+
fs.mkdirSync(path.dirname(metadata.signalPath), { recursive: true });
|
|
230
|
+
fs.writeFileSync(metadata.signalPath, 'done\n');
|
|
231
|
+
if (getBooleanFlag(flags, 'json')) {
|
|
232
|
+
console.log(JSON.stringify({ status: 'RESUME_REQUESTED', ...metadata }, null, 2));
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
console.log(`已发送恢复信号:${metadata.runId}`);
|
|
236
|
+
}
|
|
237
|
+
/** start 与 run 共用 Workflow 唯一匹配规则,避免后台入口选择不同的流程。 */
|
|
238
|
+
function resolveWorkflowForExecution(query, flags, workflows) {
|
|
239
|
+
const workflowId = getStringFlag(flags, 'workflow-id');
|
|
240
|
+
if (workflowId) {
|
|
241
|
+
const workflow = findBrowserOptWorkflowById(workflowId, workflows);
|
|
242
|
+
if (workflow) {
|
|
243
|
+
return workflow;
|
|
244
|
+
}
|
|
245
|
+
throw new Error(`未找到 Workflow ID:${workflowId}`);
|
|
246
|
+
}
|
|
247
|
+
if (!query.trim()) {
|
|
248
|
+
throw new Error('使用方式:npx browser-opt start "<查询语句>" [--workflow-dir <目录>]');
|
|
249
|
+
}
|
|
250
|
+
const result = matchBrowserOptWorkflows(query, workflows);
|
|
251
|
+
if (result.status !== 'matched' || !result.matched) {
|
|
252
|
+
throw new Error(result.status === 'ambiguous' ? 'Workflow 匹配结果不唯一,请使用 --workflow-id。' : '未找到匹配的 Workflow。');
|
|
253
|
+
}
|
|
254
|
+
return result.matched.workflow;
|
|
255
|
+
}
|
|
256
|
+
/** 复用当前 Node/tsx 入口启动子进程,并只透传会影响 Workflow 执行的参数。 */
|
|
257
|
+
function buildDetachedWorkflowArgs(workflowId, signalPath, flags) {
|
|
258
|
+
const executableName = path.basename(process.argv[1] ?? '');
|
|
259
|
+
const commandPrefix = executableName.startsWith('browser-opt') ? [] : ['browser-opt'];
|
|
260
|
+
const childArgs = [
|
|
261
|
+
...process.execArgv,
|
|
262
|
+
process.argv[1] ?? '',
|
|
263
|
+
...commandPrefix,
|
|
264
|
+
'run',
|
|
265
|
+
'--workflow-id',
|
|
266
|
+
workflowId,
|
|
267
|
+
'--handoff-signal',
|
|
268
|
+
signalPath,
|
|
269
|
+
];
|
|
270
|
+
const excludedFlags = new Set(['workflow-id', 'json', 'run-id', 'handoff-signal']);
|
|
271
|
+
for (const [key, value] of Object.entries(flags)) {
|
|
272
|
+
if (excludedFlags.has(key)) {
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
childArgs.push(`--${key}`);
|
|
276
|
+
if (typeof value === 'string') {
|
|
277
|
+
childArgs.push(value);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return childArgs;
|
|
281
|
+
}
|
|
282
|
+
/** 从固定控制目录读取后台任务元数据,runId 是跨 turn 的唯一恢复凭据。 */
|
|
283
|
+
function loadDetachedRun(flags) {
|
|
284
|
+
const runId = getStringFlag(flags, 'run-id')?.trim();
|
|
285
|
+
if (!runId) {
|
|
286
|
+
throw new Error('缺少 --run-id。');
|
|
287
|
+
}
|
|
288
|
+
const metadataPath = path.resolve(process.cwd(), DEFAULT_HANDOFF_RUN_DIR, runId, 'run.json');
|
|
289
|
+
const parsed = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));
|
|
290
|
+
if (parsed.runId !== runId) {
|
|
291
|
+
throw new Error(`后台 Workflow 元数据与 runId 不一致:${runId}`);
|
|
292
|
+
}
|
|
293
|
+
return parsed;
|
|
294
|
+
}
|
|
295
|
+
/** 后台输出只返回尾部,既保留最新 handoff/报告信息,也避免历史日志无限增长。 */
|
|
296
|
+
function readDetachedRunOutput(outputPath) {
|
|
297
|
+
if (!fs.existsSync(outputPath)) {
|
|
298
|
+
return '';
|
|
299
|
+
}
|
|
300
|
+
return fs.readFileSync(outputPath, 'utf-8').slice(-12_000);
|
|
301
|
+
}
|
|
302
|
+
/** 结合进程存活状态与 CLI 输出判断当前阶段。 */
|
|
303
|
+
function resolveDetachedRunStatus(pid, output) {
|
|
304
|
+
if (isProcessRunning(pid)) {
|
|
305
|
+
const handoffIndex = output.lastIndexOf('=== Browser Opt Handoff ===');
|
|
306
|
+
const resumedIndex = output.lastIndexOf('人工操作完成,恢复 browser-opt 自动化执行。');
|
|
307
|
+
return handoffIndex > resumedIndex ? 'HANDOFF' : 'RUNNING';
|
|
308
|
+
}
|
|
309
|
+
return output.includes('执行成功') ? 'PASS' : 'FAIL';
|
|
310
|
+
}
|
|
311
|
+
/** 只探测后台进程是否仍存在,不发送信号或改变运行状态。 */
|
|
312
|
+
function isProcessRunning(pid) {
|
|
313
|
+
try {
|
|
314
|
+
process.kill(pid, 0);
|
|
315
|
+
return true;
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/** 人类输出与 JSON 输出共享同一组后台任务字段。 */
|
|
322
|
+
function printDetachedRun(metadata, status, json, output = '') {
|
|
323
|
+
if (json) {
|
|
324
|
+
console.log(JSON.stringify({ status, ...metadata, output }, null, 2));
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
console.log(`Status: ${status}`);
|
|
328
|
+
console.log(`Run ID: ${metadata.runId}`);
|
|
329
|
+
console.log(`Output: ${metadata.outputPath}`);
|
|
330
|
+
if (output.trim()) {
|
|
331
|
+
console.log(output.trim());
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/** JSON 输出收敛为候选元数据,避免匹配阶段把完整自动化正文回显给调用方。 */
|
|
335
|
+
function toWorkflowMatchOutput(result, warnings) {
|
|
336
|
+
const compact = (workflow, score) => ({
|
|
337
|
+
id: workflow.id,
|
|
338
|
+
name: workflow.name,
|
|
339
|
+
...(workflow.filePath ? { filePath: workflow.filePath } : {}),
|
|
340
|
+
...(workflow.filePath ? { displayPath: formatWorkflowDisplayPath(workflow.filePath) } : {}),
|
|
341
|
+
...(score === undefined ? {} : { score }),
|
|
342
|
+
});
|
|
343
|
+
return {
|
|
344
|
+
status: result.status,
|
|
345
|
+
matched: result.matched ? compact(result.matched.workflow, result.matched.score) : null,
|
|
346
|
+
candidates: result.candidates.map((candidate) => compact(candidate.workflow, candidate.score)),
|
|
347
|
+
available: result.available.map((workflow) => compact(workflow)),
|
|
348
|
+
warnings,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
/** 人类可读输出明确区分唯一命中、需要选择和完全未命中。 */
|
|
352
|
+
function printWorkflowMatch(result) {
|
|
353
|
+
if (result.status === 'matched' && result.matched) {
|
|
354
|
+
console.log(`匹配到 Workflow:${result.matched.workflow.name} [${result.matched.workflow.id}]`);
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
if (result.status === 'ambiguous') {
|
|
358
|
+
const label = result.candidates.length > 1 ? '找到多个相似 Workflow' : '找到相似 Workflow';
|
|
359
|
+
console.log(`${label},请选择候选序号,或使用 --workflow-id 执行:`);
|
|
360
|
+
result.candidates.forEach((candidate, index) => {
|
|
361
|
+
console.log(` ${index + 1}. ${formatWorkflowLink(candidate.workflow)} [${candidate.workflow.id}]`);
|
|
362
|
+
});
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
console.log('未找到匹配的 Workflow,请补充描述或从可用流程中选择。');
|
|
366
|
+
printAvailableWorkflows(result.available);
|
|
367
|
+
}
|
|
368
|
+
function printAvailableWorkflows(workflows) {
|
|
369
|
+
if (workflows.length === 0) {
|
|
370
|
+
console.log('当前项目尚未保存 Workflow。');
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
console.log('可用 Workflow:');
|
|
374
|
+
for (const workflow of workflows) {
|
|
375
|
+
console.log(` - ${formatWorkflowLink(workflow)} [${workflow.id}]`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
function printWorkflowWarnings(warnings) {
|
|
379
|
+
for (const warning of warnings) {
|
|
380
|
+
console.error(`跳过无效 Workflow:${warning}`);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
/** 在支持 Markdown 的界面里把候选流程渲染为可点击文件链接,终端里仍保留可读名称。 */
|
|
384
|
+
function formatWorkflowLink(workflow) {
|
|
385
|
+
if (!workflow.filePath) {
|
|
386
|
+
return workflow.name;
|
|
387
|
+
}
|
|
388
|
+
return `[${escapeMarkdownLinkText(workflow.name)}](<${workflow.filePath}>)`;
|
|
389
|
+
}
|
|
390
|
+
function escapeMarkdownLinkText(text) {
|
|
391
|
+
return text.replace(/([\\\[\]])/g, '\\$1');
|
|
392
|
+
}
|
|
393
|
+
/** 优先给调用方返回工作区相对路径,便于 VS Code/Copilot 识别为本地文件引用。 */
|
|
394
|
+
function formatWorkflowDisplayPath(filePath) {
|
|
395
|
+
const relativePath = path.relative(process.cwd(), filePath);
|
|
396
|
+
if (relativePath && !relativePath.startsWith('..') && !path.isAbsolute(relativePath)) {
|
|
397
|
+
return relativePath;
|
|
398
|
+
}
|
|
399
|
+
return filePath;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* 登录态复用策略:
|
|
403
|
+
* 1. 默认 state 存在时优先加载,避免每次从完整 Chrome profile 启动。
|
|
404
|
+
* 2. 默认 state 不存在时由唯一主 agent 使用 profile 打开,并把 cookies/storage 保存成 state。
|
|
405
|
+
* 3. 默认 state 失效时切换到 profile 窗口,让交互式 handoff 可使用 Chrome 密码管理器。
|
|
406
|
+
* 4. 显式 --state 保持隔离语义,不自动回退到 profile。
|
|
407
|
+
*/
|
|
408
|
+
function resolveBrowserOptAuthState(flags, profile) {
|
|
409
|
+
const configuredStatePath = resolveStatePath(flags);
|
|
410
|
+
const authStateSavePath = configuredStatePath ?? defaultBrowserOptStatePath(profile);
|
|
411
|
+
if (fs.existsSync(authStateSavePath)) {
|
|
412
|
+
return {
|
|
413
|
+
statePath: authStateSavePath,
|
|
414
|
+
authStateSavePath,
|
|
415
|
+
fallbackProfile: configuredStatePath ? undefined : profile,
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
return {
|
|
419
|
+
profile,
|
|
420
|
+
authStateSavePath,
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
/** 默认 state 文件按 profile 分开保存,避免 Work/Default 等登录态互相覆盖。 */
|
|
424
|
+
function defaultBrowserOptStatePath(profile) {
|
|
425
|
+
const stateDir = process.env.BROWSER_OPT_AUTH_STATE_DIR || path.resolve(process.cwd(), DEFAULT_AUTH_STATE_DIR);
|
|
426
|
+
const stateName = profile.toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '') || 'default';
|
|
427
|
+
return path.join(stateDir, `browser-opt-${stateName}.json`);
|
|
428
|
+
}
|
|
429
|
+
/** 为同一项目里的同一流程生成稳定 session,便于不同入口一致标识浏览器会话。 */
|
|
430
|
+
function resolveBrowserOptSessionId(flags, identity) {
|
|
431
|
+
const configuredSession = getStringFlag(flags, 'session')?.trim();
|
|
432
|
+
if (configuredSession) {
|
|
433
|
+
return configuredSession;
|
|
434
|
+
}
|
|
435
|
+
const seed = `${process.cwd()}\n${identity}`;
|
|
436
|
+
return `browser-opt-${createHash('sha256').update(seed).digest('hex').slice(0, 16)}`;
|
|
437
|
+
}
|
|
438
|
+
/** 读取终端输入,供 handoff 暂停点等待用户确认继续。 */
|
|
439
|
+
function promptUser(question) {
|
|
440
|
+
const rl = readline.createInterface({
|
|
441
|
+
input: process.stdin,
|
|
442
|
+
output: process.stdout,
|
|
443
|
+
});
|
|
444
|
+
return new Promise((resolve) => {
|
|
445
|
+
rl.question(question, (answer) => {
|
|
446
|
+
rl.close();
|
|
447
|
+
resolve(answer.trim());
|
|
448
|
+
});
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
/** 判断用户是否已确认人工登录或处理动作完成。 */
|
|
452
|
+
function isDoneAnswer(input) {
|
|
453
|
+
const value = input.trim().toLowerCase();
|
|
454
|
+
return HANDOFF_DONE_ANSWERS.includes(value);
|
|
455
|
+
}
|
|
456
|
+
/** browser-opt 默认等待终端输入;后台 Workflow 改用信号文件跨 turn 恢复同一个会话。 */
|
|
457
|
+
function createBrowserOptHandoffOptions(liveViewport, handoffSignalPath) {
|
|
458
|
+
return {
|
|
459
|
+
onHandoffRequired: async (context) => {
|
|
460
|
+
console.log('\n=== Browser Opt Handoff ===');
|
|
461
|
+
console.log(`Reason: ${context.message}`);
|
|
462
|
+
if (context.sessionId) {
|
|
463
|
+
console.log(`Session: ${context.sessionId}`);
|
|
464
|
+
}
|
|
465
|
+
if (liveViewport) {
|
|
466
|
+
console.log(`Live viewport: ${LIVE_VIEWPORT_DASHBOARD_URL}`);
|
|
467
|
+
}
|
|
468
|
+
console.log('已打开可视浏览器,请手动完成页面要求的操作。');
|
|
469
|
+
if (handoffSignalPath) {
|
|
470
|
+
const runId = process.env.BROWSER_OPT_HANDOFF_RUN_ID;
|
|
471
|
+
console.log(`完成后请恢复后台任务${runId ? ` ${runId}` : ''},自动化会继续复用当前浏览器。`);
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
console.log('完成后请在这里输入 done(或 ok / 继续 / 完成)以恢复自动化。');
|
|
475
|
+
}
|
|
476
|
+
if (context.output.trim()) {
|
|
477
|
+
console.log(context.output.trim());
|
|
478
|
+
}
|
|
479
|
+
},
|
|
480
|
+
waitForUserResume: handoffSignalPath
|
|
481
|
+
? () => waitForBrowserOptHandoffSignal(handoffSignalPath)
|
|
482
|
+
: waitForBrowserOptHandoffDone,
|
|
483
|
+
onHandoffCompleted: async () => {
|
|
484
|
+
console.log('人工操作完成,恢复 browser-opt 自动化执行。\n');
|
|
485
|
+
},
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
/** 循环等待明确完成信号,避免误触回车后过早恢复自动化。 */
|
|
489
|
+
async function waitForBrowserOptHandoffDone() {
|
|
490
|
+
while (true) {
|
|
491
|
+
const answer = await promptUser('请输入 done 继续:\n> ');
|
|
492
|
+
if (isDoneAnswer(answer)) {
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
console.log('未识别输入,请输入 done / ok / 继续 / 完成。');
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
/** 后台任务轮询一次性信号文件,消费后删除以支持同一 Workflow 多次 handoff。 */
|
|
499
|
+
async function waitForBrowserOptHandoffSignal(signalPath) {
|
|
500
|
+
const resolvedSignalPath = path.resolve(signalPath);
|
|
501
|
+
fs.mkdirSync(path.dirname(resolvedSignalPath), { recursive: true });
|
|
502
|
+
fs.rmSync(resolvedSignalPath, { force: true });
|
|
503
|
+
while (true) {
|
|
504
|
+
if (fs.existsSync(resolvedSignalPath)) {
|
|
505
|
+
const answer = fs.readFileSync(resolvedSignalPath, 'utf-8');
|
|
506
|
+
if (isDoneAnswer(answer)) {
|
|
507
|
+
fs.rmSync(resolvedSignalPath, { force: true });
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
await new Promise((resolve) => setTimeout(resolve, HANDOFF_SIGNAL_POLL_INTERVAL_MS));
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
//# sourceMappingURL=browser-opt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-opt.js","sourceRoot":"","sources":["../../../src/cli/commands/browser-opt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface BrowserOptSetupOptions {
|
|
2
|
+
installSystemDependencies: boolean;
|
|
3
|
+
installSkill: boolean;
|
|
4
|
+
agent?: string;
|
|
5
|
+
skillsDir?: string;
|
|
6
|
+
}
|
|
7
|
+
/** 执行 agent-browser 安装,并在需要时把 browser-opt Skill 放到目标 Agent 的用户级目录。 */
|
|
8
|
+
export declare function setupBrowserOpt(options: BrowserOptSetupOptions): void;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAUA,UAAU,sBAAsB;IAC9B,yBAAyB,EAAE,OAAO,CAAC;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAmBrE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 安装 browser-opt 运行所需的浏览器与 Agent Skill,使调用方只需执行一次 setup。
|
|
3
|
+
* 该命令只在用户显式调用时写入本机目录,不影响普通工作流执行。
|
|
4
|
+
*/
|
|
5
|
+
import { resolveSkillInstallTarget } from '@browser-automated/browser-core/skill-install';
|
|
6
|
+
import { spawnSync } from 'node:child_process';
|
|
7
|
+
import * as fs from 'node:fs';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
/** 执行 agent-browser 安装,并在需要时把 browser-opt Skill 放到目标 Agent 的用户级目录。 */
|
|
11
|
+
export function setupBrowserOpt(options) {
|
|
12
|
+
const installArgs = ['install', ...(options.installSystemDependencies ? ['--with-deps'] : [])];
|
|
13
|
+
const result = spawnSync('agent-browser', installArgs, { stdio: 'inherit' });
|
|
14
|
+
if (result.error) {
|
|
15
|
+
throw new Error(`无法启动 agent-browser:${result.error.message}`);
|
|
16
|
+
}
|
|
17
|
+
if (result.status !== 0) {
|
|
18
|
+
throw new Error(`agent-browser install 失败(退出码 ${result.status ?? 'unknown'})。`);
|
|
19
|
+
}
|
|
20
|
+
if (options.installSkill) {
|
|
21
|
+
const { label, targetDir } = resolveSkillInstallTarget('browser-opt', {
|
|
22
|
+
agent: options.agent,
|
|
23
|
+
skillsDir: options.skillsDir,
|
|
24
|
+
});
|
|
25
|
+
fs.cpSync(resolveBundledSkillDir(), targetDir, { recursive: true, force: true });
|
|
26
|
+
console.log(`已安装 ${label}:${targetDir}`);
|
|
27
|
+
}
|
|
28
|
+
console.log('browser-opt 已就绪。');
|
|
29
|
+
}
|
|
30
|
+
/** 从编译后的 CLI 位置反查 npm 包内随包发布的 browser-opt Skill。 */
|
|
31
|
+
function resolveBundledSkillDir() {
|
|
32
|
+
const commandDir = path.dirname(fileURLToPath(import.meta.url));
|
|
33
|
+
return path.resolve(commandDir, '../../../skills/browser-opt');
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,yBAAyB,EAAE,MAAM,+CAA+C,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AASzC,sEAAsE;AACtE,MAAM,UAAU,eAAe,CAAC,OAA+B;IAC7D,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/F,MAAM,MAAM,GAAG,SAAS,CAAC,eAAe,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7E,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,MAAM,IAAI,SAAS,IAAI,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,yBAAyB,CAAC,aAAa,EAAE;YACpE,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,sBAAsB,EAAE,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAClC,CAAC;AAED,oDAAoD;AACpD,SAAS,sBAAsB;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,6BAA6B,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 统一封装 CLI 参数解析与常用 flag 读取逻辑,避免各命令重复处理细节。
|
|
3
|
+
* 这里仅负责轻量解析,不引入命令语义,让命令文件保持聚焦在业务流程上。
|
|
4
|
+
*/
|
|
5
|
+
export interface CliParseResult {
|
|
6
|
+
positionals: string[];
|
|
7
|
+
flags: Record<string, string | boolean>;
|
|
8
|
+
}
|
|
9
|
+
export declare function parseCliArgs(args: string[]): CliParseResult;
|
|
10
|
+
export declare function getStringFlag(flags: Record<string, string | boolean>, key: string): string | undefined;
|
|
11
|
+
export declare function getBooleanFlag(flags: Record<string, string | boolean>, key: string): boolean;
|
|
12
|
+
export declare function resolveProfile(flags: Record<string, string | boolean>): string | undefined;
|
|
13
|
+
export declare function resolveStatePath(flags: Record<string, string | boolean>): string | undefined;
|
|
14
|
+
export declare function resolveReuseRunningBrowser(flags: Record<string, string | boolean>, statePath?: string, defaultValue?: boolean): boolean;
|
|
15
|
+
export declare function resolveLiveViewport(flags: Record<string, string | boolean>): boolean;
|
|
16
|
+
export declare function parseCsv(value?: string): string[];
|
|
17
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/args.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CACzC;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CAsB3D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGtG;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAE5F;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAE1F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAQ5F;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EACvC,SAAS,CAAC,EAAE,MAAM,EAClB,YAAY,UAAQ,GACnB,OAAO,CAWT;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAQpF;AAED,wBAAgB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CASjD"}
|