@beeos-ai/device-agent 0.12.7 → 0.14.0
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/agent-runtime/adapters/base.d.ts +2 -0
- package/dist/agent-runtime/adapters/base.js +1 -0
- package/dist/agent-runtime/adapters/base.js.map +1 -1
- package/dist/agent-runtime/adapters/openai.js +39 -17
- package/dist/agent-runtime/adapters/openai.js.map +1 -1
- package/dist/agent-runtime/advanced/app-card.d.ts +23 -0
- package/dist/agent-runtime/advanced/app-card.js +99 -0
- package/dist/agent-runtime/advanced/app-card.js.map +1 -0
- package/dist/agent-runtime/advanced/knowledge.d.ts +15 -0
- package/dist/agent-runtime/advanced/knowledge.js +85 -0
- package/dist/agent-runtime/advanced/knowledge.js.map +1 -0
- package/dist/agent-runtime/advanced/subgoal-verifier.d.ts +37 -0
- package/dist/agent-runtime/advanced/subgoal-verifier.js +190 -0
- package/dist/agent-runtime/advanced/subgoal-verifier.js.map +1 -0
- package/dist/agent-runtime/advanced/task-state.d.ts +20 -0
- package/dist/agent-runtime/advanced/task-state.js +60 -0
- package/dist/agent-runtime/advanced/task-state.js.map +1 -0
- package/dist/agent-runtime/agent-runner.d.ts +16 -27
- package/dist/agent-runtime/agent-runner.js +19 -132
- package/dist/agent-runtime/agent-runner.js.map +1 -1
- package/dist/agent-runtime/core.d.ts +8 -0
- package/dist/agent-runtime/core.js +24 -2
- package/dist/agent-runtime/core.js.map +1 -1
- package/dist/agent-runtime/execution-mode.d.ts +28 -0
- package/dist/agent-runtime/execution-mode.js +51 -0
- package/dist/agent-runtime/execution-mode.js.map +1 -0
- package/dist/agent-runtime/factory.d.ts +6 -4
- package/dist/agent-runtime/factory.js +4 -4
- package/dist/agent-runtime/factory.js.map +1 -1
- package/dist/agent-runtime/index.d.ts +9 -2
- package/dist/agent-runtime/index.js +7 -0
- package/dist/agent-runtime/index.js.map +1 -1
- package/dist/agent-runtime/models/base.d.ts +2 -0
- package/dist/agent-runtime/models/client.d.ts +1 -0
- package/dist/agent-runtime/models/client.js +90 -1
- package/dist/agent-runtime/models/client.js.map +1 -1
- package/dist/agent-runtime/models/runtime-registry.d.ts +28 -0
- package/dist/agent-runtime/models/runtime-registry.js +59 -0
- package/dist/agent-runtime/models/runtime-registry.js.map +1 -0
- package/dist/agent-runtime/models/vlm/autoglm.js +14 -9
- package/dist/agent-runtime/models/vlm/autoglm.js.map +1 -1
- package/dist/agent-runtime/models/vlm/base.d.ts +15 -1
- package/dist/agent-runtime/models/vlm/base.js +31 -10
- package/dist/agent-runtime/models/vlm/base.js.map +1 -1
- package/dist/agent-runtime/models/vlm/general.d.ts +7 -1
- package/dist/agent-runtime/models/vlm/general.js +43 -9
- package/dist/agent-runtime/models/vlm/general.js.map +1 -1
- package/dist/agent-runtime/models/vlm/guiowl.js +4 -13
- package/dist/agent-runtime/models/vlm/guiowl.js.map +1 -1
- package/dist/agent-runtime/models/vlm/index.d.ts +1 -0
- package/dist/agent-runtime/models/vlm/index.js +1 -0
- package/dist/agent-runtime/models/vlm/index.js.map +1 -1
- package/dist/agent-runtime/models/vlm/maiui.js +4 -6
- package/dist/agent-runtime/models/vlm/maiui.js.map +1 -1
- package/dist/agent-runtime/models/vlm/qwen38.d.ts +1 -0
- package/dist/agent-runtime/models/vlm/qwen38.js +241 -0
- package/dist/agent-runtime/models/vlm/qwen38.js.map +1 -0
- package/dist/agent-runtime/models/vlm/qwenvl.js +4 -6
- package/dist/agent-runtime/models/vlm/qwenvl.js.map +1 -1
- package/dist/agent-runtime/models/vlm/shared/tool-call.d.ts +6 -2
- package/dist/agent-runtime/models/vlm/shared/tool-call.js +91 -17
- package/dist/agent-runtime/models/vlm/shared/tool-call.js.map +1 -1
- package/dist/agent-runtime/modes/hybrid/index.d.ts +25 -13
- package/dist/agent-runtime/modes/hybrid/index.js +74 -28
- package/dist/agent-runtime/modes/hybrid/index.js.map +1 -1
- package/dist/agent-runtime/modes/hybrid/planner/base.d.ts +4 -0
- package/dist/agent-runtime/modes/hybrid/planner/base.js.map +1 -1
- package/dist/agent-runtime/modes/hybrid/planner/llm-planner.js +2 -0
- package/dist/agent-runtime/modes/hybrid/planner/llm-planner.js.map +1 -1
- package/dist/agent-runtime/modes/hybrid/planner/noop-planner.d.ts +1 -1
- package/dist/agent-runtime/modes/hybrid/planner/noop-planner.js +1 -1
- package/dist/agent-runtime/modes/hybrid/planner/prompts.d.ts +2 -0
- package/dist/agent-runtime/modes/hybrid/planner/prompts.js +8 -0
- package/dist/agent-runtime/modes/hybrid/planner/prompts.js.map +1 -1
- package/dist/agent-runtime/modes/orchestrator/index.d.ts +6 -0
- package/dist/agent-runtime/modes/orchestrator/index.js +4 -0
- package/dist/agent-runtime/modes/orchestrator/index.js.map +1 -1
- package/dist/agent-runtime/observation-mode.d.ts +2 -0
- package/dist/agent-runtime/observation-mode.js +2 -0
- package/dist/agent-runtime/observation-mode.js.map +1 -1
- package/dist/agent-runtime/plan-executor.d.ts +8 -2
- package/dist/agent-runtime/plan-executor.js +109 -14
- package/dist/agent-runtime/plan-executor.js.map +1 -1
- package/dist/agent-runtime/reflectors/policy.d.ts +2 -5
- package/dist/agent-runtime/reflectors/policy.js +6 -14
- package/dist/agent-runtime/reflectors/policy.js.map +1 -1
- package/dist/agent-runtime/reflectors/trajectory-reflector.d.ts +3 -4
- package/dist/agent-runtime/reflectors/trajectory-reflector.js +4 -4
- package/dist/agent-runtime/reflectors/trajectory-reflector.js.map +1 -1
- package/dist/agent-runtime/skills/replay.js +1 -0
- package/dist/agent-runtime/skills/replay.js.map +1 -1
- package/dist/agent-runtime/vlm.d.ts +2 -3
- package/dist/agent-runtime/vlm.js +2 -3
- package/dist/agent-runtime/vlm.js.map +1 -1
- package/dist/api.js +1 -0
- package/dist/api.js.map +1 -1
- package/dist/app/agent-host.js +3 -3
- package/dist/app/agent-host.js.map +1 -1
- package/dist/app/multi-device-host.d.ts +2 -2
- package/dist/app/multi-device-host.js +1 -1
- package/dist/app/session-manager.d.ts +20 -3
- package/dist/app/session-manager.js +33 -4
- package/dist/app/session-manager.js.map +1 -1
- package/dist/bootstrap.d.ts +2 -8
- package/dist/bootstrap.js +61 -103
- package/dist/bootstrap.js.map +1 -1
- package/dist/config/loader.d.ts +2 -9
- package/dist/config/loader.js +32 -34
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +5 -29
- package/dist/config/schema.js +8 -42
- package/dist/config/schema.js.map +1 -1
- package/dist/device/apps.js +51 -1
- package/dist/device/apps.js.map +1 -1
- package/dist/fleet/adapters/process/in-process-manager.d.ts +1 -1
- package/dist/fleet/adapters/process/node-process-manager.d.ts +7 -0
- package/dist/fleet/adapters/process/node-process-manager.js +29 -8
- package/dist/fleet/adapters/process/node-process-manager.js.map +1 -1
- package/dist/inbound/acp/handlers/session.d.ts +4 -1
- package/dist/inbound/acp/handlers/session.js +24 -10
- package/dist/inbound/acp/handlers/session.js.map +1 -1
- package/dist/inbound/cli/benchmark-command.d.ts +17 -0
- package/dist/inbound/cli/benchmark-command.js +158 -0
- package/dist/inbound/cli/benchmark-command.js.map +1 -0
- package/dist/inbound/cli/fleet-command.d.ts +12 -1
- package/dist/inbound/cli/fleet-command.js +38 -9
- package/dist/inbound/cli/fleet-command.js.map +1 -1
- package/dist/inbound/cli/main.d.ts +2 -6
- package/dist/inbound/cli/main.js +49 -33
- package/dist/inbound/cli/main.js.map +1 -1
- package/dist/inbound/cli/run-artifacts.d.ts +61 -0
- package/dist/inbound/cli/run-artifacts.js +247 -0
- package/dist/inbound/cli/run-artifacts.js.map +1 -0
- package/dist/inbound/cli/run-command.d.ts +23 -20
- package/dist/inbound/cli/run-command.js +157 -159
- package/dist/inbound/cli/run-command.js.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/plugins/http-debug/early-health.d.ts +11 -0
- package/dist/plugins/http-debug/early-health.js +51 -0
- package/dist/plugins/http-debug/early-health.js.map +1 -0
- package/dist/plugins/http-debug/index.js +2 -0
- package/dist/plugins/http-debug/index.js.map +1 -1
- package/dist/plugins/message-bus/inbound.js +7 -6
- package/dist/plugins/message-bus/inbound.js.map +1 -1
- package/dist/ports/agent-core.d.ts +13 -13
- package/dist/ports/agent-host.d.ts +4 -1
- package/package.json +4 -4
package/dist/inbound/cli/main.js
CHANGED
|
@@ -18,15 +18,39 @@ import * as url from "node:url";
|
|
|
18
18
|
import { bootstrap, BootstrapError } from "../../bootstrap.js";
|
|
19
19
|
import { getLogger } from "../../logger/index.js";
|
|
20
20
|
import { runCommand } from "./run-command.js";
|
|
21
|
+
import { benchmarkCommand } from "./benchmark-command.js";
|
|
21
22
|
import { fleetCommand } from "./fleet-command.js";
|
|
22
23
|
import { skillsCommand } from "./skills-command.js";
|
|
24
|
+
import { parseObservationMode } from "../../agent-runtime/observation-mode.js";
|
|
23
25
|
export async function main(argv = process.argv.slice(2)) {
|
|
24
26
|
// Subcommand dispatch — `device-agent run ...` runs a one-shot Plan-Act
|
|
25
27
|
// task without going through the ACP bootstrap. `device-agent fleet ...`
|
|
26
28
|
// drives the multi-device supervisor (start / status / devices / restart /
|
|
27
29
|
// reload). Everything else falls through to the daemon path.
|
|
28
30
|
if (argv[0] === "run") {
|
|
29
|
-
|
|
31
|
+
const controller = new AbortController();
|
|
32
|
+
let signalExitCode;
|
|
33
|
+
const onSigint = () => {
|
|
34
|
+
signalExitCode = 130;
|
|
35
|
+
controller.abort();
|
|
36
|
+
};
|
|
37
|
+
const onSigterm = () => {
|
|
38
|
+
signalExitCode = 143;
|
|
39
|
+
controller.abort();
|
|
40
|
+
};
|
|
41
|
+
process.once("SIGINT", onSigint);
|
|
42
|
+
process.once("SIGTERM", onSigterm);
|
|
43
|
+
try {
|
|
44
|
+
const code = await runCommand(argv.slice(1), {}, { signal: controller.signal });
|
|
45
|
+
return signalExitCode ?? code;
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
process.off("SIGINT", onSigint);
|
|
49
|
+
process.off("SIGTERM", onSigterm);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (argv[0] === "benchmark") {
|
|
53
|
+
return benchmarkCommand(argv.slice(1));
|
|
30
54
|
}
|
|
31
55
|
if (argv[0] === "fleet") {
|
|
32
56
|
return fleetCommand(argv.slice(1));
|
|
@@ -70,19 +94,14 @@ export async function main(argv = process.argv.slice(2)) {
|
|
|
70
94
|
/**
|
|
71
95
|
* Parse `argv` into the structured `CliFlags` consumed by `loadConfig`.
|
|
72
96
|
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* resolve against env vars and the JSON config file:
|
|
76
|
-
*
|
|
77
|
-
* --outer-* outer orchestrator (tool-calling driver LLM)
|
|
78
|
-
* --vlm-* inner VLM (screenshot→reason→act loop)
|
|
97
|
+
* The primary model can be configured through either the canonical
|
|
98
|
+
* `--model` family or the legacy `--vlm-*` aliases.
|
|
79
99
|
*/
|
|
80
100
|
export function parseArgs(argv) {
|
|
81
101
|
const out = {};
|
|
82
102
|
// Lazy-init helpers — only allocate when the user actually passes one
|
|
83
103
|
// of the three group's flags so empty objects don't end up populating
|
|
84
104
|
// `flagLayer` in the loader.
|
|
85
|
-
const outer = () => (out.outer ??= {});
|
|
86
105
|
const vlm = () => (out.vlm ??= {});
|
|
87
106
|
for (let i = 0; i < argv.length; i++) {
|
|
88
107
|
const a = argv[i];
|
|
@@ -113,6 +132,9 @@ export function parseArgs(argv) {
|
|
|
113
132
|
case "--key":
|
|
114
133
|
out.key = next();
|
|
115
134
|
break;
|
|
135
|
+
case "--identity-key-file":
|
|
136
|
+
out.key = next();
|
|
137
|
+
break;
|
|
116
138
|
case "--agent-gateway-url":
|
|
117
139
|
out.agentGatewayUrl = next();
|
|
118
140
|
break;
|
|
@@ -143,18 +165,15 @@ export function parseArgs(argv) {
|
|
|
143
165
|
case "--mcp-autospawn":
|
|
144
166
|
out.mcpAutospawn = true;
|
|
145
167
|
break;
|
|
146
|
-
//
|
|
147
|
-
case "--
|
|
148
|
-
|
|
149
|
-
break;
|
|
150
|
-
case "--outer-base-url":
|
|
151
|
-
outer().baseUrl = next();
|
|
168
|
+
// Canonical OpenAI-compatible primary model triple.
|
|
169
|
+
case "--api-key":
|
|
170
|
+
vlm().apiKey = next();
|
|
152
171
|
break;
|
|
153
|
-
case "--
|
|
154
|
-
|
|
172
|
+
case "--base-url":
|
|
173
|
+
vlm().baseUrl = next();
|
|
155
174
|
break;
|
|
156
|
-
case "--
|
|
157
|
-
|
|
175
|
+
case "--model":
|
|
176
|
+
vlm().model = next();
|
|
158
177
|
break;
|
|
159
178
|
// ── inner VLM ────────────────────────────────────────────────────
|
|
160
179
|
case "--vlm-api-key":
|
|
@@ -171,14 +190,11 @@ export function parseArgs(argv) {
|
|
|
171
190
|
break;
|
|
172
191
|
case "--observation-mode": {
|
|
173
192
|
const value = next();
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
193
|
+
const observationMode = parseObservationMode(value);
|
|
194
|
+
if (observationMode)
|
|
195
|
+
out.observationMode = observationMode;
|
|
177
196
|
break;
|
|
178
197
|
}
|
|
179
|
-
case "--orchestrator":
|
|
180
|
-
out.orchestrator = true;
|
|
181
|
-
break;
|
|
182
198
|
case "--no-acp":
|
|
183
199
|
out.noAcp = true;
|
|
184
200
|
break;
|
|
@@ -231,16 +247,17 @@ function printUsage() {
|
|
|
231
247
|
Usage:
|
|
232
248
|
device-agent [options]
|
|
233
249
|
device-agent run --task "..." [options] (one-shot Plan-Act runner; --help for details)
|
|
250
|
+
device-agent benchmark --tasks tasks.txt (repeatable task suite with trace artifacts)
|
|
234
251
|
device-agent fleet <subcommand> ... (multi-device supervisor; \`fleet --help\` for details)
|
|
235
252
|
device-agent skills <subcommand> ... (skill cache CLI; \`skills --help\` for details)
|
|
236
253
|
Recommended (sibling MCP server):
|
|
237
254
|
device-agent --mcp-url http://127.0.0.1:7900 --bridge wss://...
|
|
238
255
|
device-agent --mcp-autospawn --mode android --adb <serial>
|
|
239
256
|
|
|
240
|
-
One-shot
|
|
257
|
+
One-shot task:
|
|
241
258
|
device-agent run --task "打开微信,发一条朋友圈" \\
|
|
242
259
|
--mcp http://127.0.0.1:7900 --model autoglm-phone-9b \\
|
|
243
|
-
--base-url https://autoglm-mobile-9b.arouter.ai/v1 --
|
|
260
|
+
--base-url https://autoglm-mobile-9b.arouter.ai/v1 --execution-mode fast
|
|
244
261
|
|
|
245
262
|
Legacy single-process (deprecated after 0.2.0):
|
|
246
263
|
device-agent --standalone --http --mode desktop
|
|
@@ -250,7 +267,8 @@ Options:
|
|
|
250
267
|
--standalone Skip Bridge handshake; HTTP API only
|
|
251
268
|
--bridge <url> Bridge WebSocket URL (override; e.g. wss://bridge.beeos.ai:18443)
|
|
252
269
|
--service <name> Bridge service name (default: acp)
|
|
253
|
-
--key <path>
|
|
270
|
+
--identity-key-file <path> Ed25519 identity key file (default: ~/.beeos/device-agent.key)
|
|
271
|
+
--key <path> Deprecated alias for --identity-key-file
|
|
254
272
|
--agent-gateway-url <url> Agent Gateway base URL (default: https://agent-gw.beeos.ai)
|
|
255
273
|
--region <name> Preferred region for bridge allocation
|
|
256
274
|
--mcp-url <url> Sibling device-mcp-server URL (probe at boot; e.g. http://127.0.0.1:7900)
|
|
@@ -260,16 +278,14 @@ Options:
|
|
|
260
278
|
--device <id> Alias for --adb — logical device id passed on every MCP tool call
|
|
261
279
|
--adb-host <host> ADB server host (legacy in-process; default: 127.0.0.1)
|
|
262
280
|
--adb-port <port> ADB server port (legacy in-process; default: 5037)
|
|
263
|
-
--
|
|
264
|
-
--
|
|
265
|
-
--
|
|
266
|
-
--outer-provider <name> Outer adapter (openrouter / openai / anthropic / google)
|
|
281
|
+
--api-key <key> Primary model API key (or OPENAI_API_KEY)
|
|
282
|
+
--base-url <url> Primary OpenAI-compatible base URL (or OPENAI_BASE_URL)
|
|
283
|
+
--model <name> Primary model id (or OPENAI_MODEL)
|
|
267
284
|
--vlm-api-key <key> Inner VLM API key
|
|
268
285
|
--vlm-base-url <url> Inner VLM base URL
|
|
269
286
|
--vlm-model <name> Inner VLM model id
|
|
270
287
|
--vlm-provider <p> Inner VLM adapter (autoglm / qwen-vl / …)
|
|
271
|
-
--observation-mode <mode> auto |
|
|
272
|
-
--orchestrator Force the two-layer OrchestratorAgent (outer tool-calling LLM + inner VLM)
|
|
288
|
+
--observation-mode <mode> auto | structure | vision | hybrid (default: auto; xml/a11y compatible)
|
|
273
289
|
--no-acp Disable the ACP plugin (Bridge WS)
|
|
274
290
|
--no-http Disable the HTTP debug plugin
|
|
275
291
|
--http Enable HTTP debug REST API
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/inbound/cli/main.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/inbound/cli/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export interface ArtifactMcp {
|
|
2
|
+
screenshot?(): Promise<{
|
|
3
|
+
b64: string;
|
|
4
|
+
format?: string;
|
|
5
|
+
width?: number;
|
|
6
|
+
height?: number;
|
|
7
|
+
deviceWidth?: number;
|
|
8
|
+
deviceHeight?: number;
|
|
9
|
+
currentApp?: string;
|
|
10
|
+
}>;
|
|
11
|
+
uiDump?(opts?: {
|
|
12
|
+
format?: "raw";
|
|
13
|
+
}): Promise<{
|
|
14
|
+
supported?: boolean;
|
|
15
|
+
content?: string;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
export interface RunArtifactSummary {
|
|
19
|
+
exitCode: number;
|
|
20
|
+
configuration: Record<string, unknown>;
|
|
21
|
+
result?: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
export declare class RunArtifactRecorder {
|
|
24
|
+
readonly runDir: string;
|
|
25
|
+
readonly startedAt: Date;
|
|
26
|
+
private finished;
|
|
27
|
+
private stepSequence;
|
|
28
|
+
private readonly openSteps;
|
|
29
|
+
private readonly artifacts;
|
|
30
|
+
constructor(outputRoot: string, task: string);
|
|
31
|
+
record(event: Record<string, unknown>): void;
|
|
32
|
+
/** Persist the exact frame that will be sent to the model for this round. */
|
|
33
|
+
captureObservation(event: {
|
|
34
|
+
index: number;
|
|
35
|
+
observation: {
|
|
36
|
+
screenW: number;
|
|
37
|
+
screenH: number;
|
|
38
|
+
screenshotB64: string;
|
|
39
|
+
uiDump?: string;
|
|
40
|
+
extra?: Record<string, unknown>;
|
|
41
|
+
screenStateHash?: string;
|
|
42
|
+
};
|
|
43
|
+
}): void;
|
|
44
|
+
/** Complete the most recent observation record with the model decision. */
|
|
45
|
+
completeStep(step: {
|
|
46
|
+
index: number;
|
|
47
|
+
rationale: string;
|
|
48
|
+
action: unknown;
|
|
49
|
+
prediction?: {
|
|
50
|
+
modelInput?: unknown;
|
|
51
|
+
rawResponse?: string;
|
|
52
|
+
confidence?: number;
|
|
53
|
+
usage?: unknown;
|
|
54
|
+
};
|
|
55
|
+
finished: boolean;
|
|
56
|
+
}): void;
|
|
57
|
+
capture(mcp: ArtifactMcp, phase: "before" | "after"): Promise<void>;
|
|
58
|
+
finish(summary: RunArtifactSummary): void;
|
|
59
|
+
}
|
|
60
|
+
export declare function expandPath(path: string): string;
|
|
61
|
+
export declare function formatTimestamp(date: Date): string;
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { appendFileSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { isAbsolute, join, resolve } from "node:path";
|
|
4
|
+
export class RunArtifactRecorder {
|
|
5
|
+
runDir;
|
|
6
|
+
startedAt = new Date();
|
|
7
|
+
finished = false;
|
|
8
|
+
stepSequence = 0;
|
|
9
|
+
openSteps = [];
|
|
10
|
+
artifacts = new Set();
|
|
11
|
+
constructor(outputRoot, task) {
|
|
12
|
+
const root = expandPath(outputRoot);
|
|
13
|
+
this.runDir = join(root, `${formatTimestamp(this.startedAt)}-${slugify(task)}-${process.pid}`);
|
|
14
|
+
mkdirSync(this.runDir, { recursive: true });
|
|
15
|
+
writeFileSync(join(this.runDir, "events.jsonl"), "", "utf8");
|
|
16
|
+
this.artifacts.add("events.jsonl");
|
|
17
|
+
}
|
|
18
|
+
record(event) {
|
|
19
|
+
appendFileSync(join(this.runDir, "events.jsonl"), `${JSON.stringify({ recordedAt: new Date().toISOString(), ...event })}\n`, "utf8");
|
|
20
|
+
}
|
|
21
|
+
/** Persist the exact frame that will be sent to the model for this round. */
|
|
22
|
+
captureObservation(event) {
|
|
23
|
+
const sequence = ++this.stepSequence;
|
|
24
|
+
const stepsDir = join(this.runDir, "steps");
|
|
25
|
+
const prefix = `step-${String(sequence).padStart(3, "0")}`;
|
|
26
|
+
let screenshotFile = null;
|
|
27
|
+
let uiDumpFile = null;
|
|
28
|
+
mkdirSync(stepsDir, { recursive: true });
|
|
29
|
+
if (event.observation.screenshotB64) {
|
|
30
|
+
const image = Buffer.from(event.observation.screenshotB64, "base64");
|
|
31
|
+
const extension = detectImageExtension(image);
|
|
32
|
+
screenshotFile = `${prefix}-observation.${extension}`;
|
|
33
|
+
writeFileSync(join(stepsDir, screenshotFile), image);
|
|
34
|
+
this.artifacts.add(`steps/${screenshotFile}`);
|
|
35
|
+
}
|
|
36
|
+
if (event.observation.uiDump) {
|
|
37
|
+
uiDumpFile = `${prefix}-observation.xml`;
|
|
38
|
+
writeFileSync(join(stepsDir, uiDumpFile), event.observation.uiDump, "utf8");
|
|
39
|
+
this.artifacts.add(`steps/${uiDumpFile}`);
|
|
40
|
+
}
|
|
41
|
+
const metadataFile = `${prefix}.json`;
|
|
42
|
+
const metadataPath = join(stepsDir, metadataFile);
|
|
43
|
+
const document = {
|
|
44
|
+
sequence,
|
|
45
|
+
agentStepIndex: event.index,
|
|
46
|
+
observedAt: new Date().toISOString(),
|
|
47
|
+
phase: "before_action",
|
|
48
|
+
observation: {
|
|
49
|
+
screenW: event.observation.screenW,
|
|
50
|
+
screenH: event.observation.screenH,
|
|
51
|
+
currentApp: event.observation.extra?.currentApp ?? null,
|
|
52
|
+
screenStateHash: event.observation.screenStateHash ?? null,
|
|
53
|
+
},
|
|
54
|
+
screenshotFile,
|
|
55
|
+
uiDumpFile,
|
|
56
|
+
rationale: null,
|
|
57
|
+
action: null,
|
|
58
|
+
modelInput: null,
|
|
59
|
+
modelRawOutput: null,
|
|
60
|
+
confidence: null,
|
|
61
|
+
usage: null,
|
|
62
|
+
finished: null,
|
|
63
|
+
completedAt: null,
|
|
64
|
+
};
|
|
65
|
+
writeJson(metadataPath, document);
|
|
66
|
+
this.openSteps.push({ agentStepIndex: event.index, metadataPath, document });
|
|
67
|
+
this.artifacts.add(`steps/${metadataFile}`);
|
|
68
|
+
}
|
|
69
|
+
/** Complete the most recent observation record with the model decision. */
|
|
70
|
+
completeStep(step) {
|
|
71
|
+
const record = [...this.openSteps]
|
|
72
|
+
.reverse()
|
|
73
|
+
.find((candidate) => candidate.agentStepIndex === step.index && candidate.document.action === null);
|
|
74
|
+
if (!record)
|
|
75
|
+
return;
|
|
76
|
+
record.document.rationale = step.rationale;
|
|
77
|
+
record.document.action = step.action;
|
|
78
|
+
record.document.modelInput = externalizeImages(step.prediction?.modelInput ?? null, record.document.screenshotFile);
|
|
79
|
+
record.document.modelRawOutput = step.prediction?.rawResponse ?? null;
|
|
80
|
+
record.document.confidence = step.prediction?.confidence ?? null;
|
|
81
|
+
record.document.usage = step.prediction?.usage ?? null;
|
|
82
|
+
record.document.finished = step.finished;
|
|
83
|
+
record.document.completedAt = new Date().toISOString();
|
|
84
|
+
writeJson(record.metadataPath, record.document);
|
|
85
|
+
}
|
|
86
|
+
async capture(mcp, phase) {
|
|
87
|
+
const errors = [];
|
|
88
|
+
if (typeof mcp.screenshot === "function") {
|
|
89
|
+
try {
|
|
90
|
+
const screenshot = await withTimeout(mcp.screenshot(), 10_000, `${phase} screenshot`);
|
|
91
|
+
const format = screenshot.format === "jpeg" ? "jpg" : "png";
|
|
92
|
+
const imageName = `${phase}.${format}`;
|
|
93
|
+
const metadataName = `${phase}.screenshot.json`;
|
|
94
|
+
const { b64, ...metadata } = screenshot;
|
|
95
|
+
writeFileSync(join(this.runDir, imageName), Buffer.from(b64, "base64"));
|
|
96
|
+
writeFileSync(join(this.runDir, metadataName), `${JSON.stringify(metadata, null, 2)}\n`, "utf8");
|
|
97
|
+
this.artifacts.add(imageName);
|
|
98
|
+
this.artifacts.add(metadataName);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
errors.push(`screenshot: ${error.message}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (typeof mcp.uiDump === "function") {
|
|
105
|
+
try {
|
|
106
|
+
const dump = await withTimeout(mcp.uiDump({ format: "raw" }), 10_000, `${phase} UI dump`);
|
|
107
|
+
if (dump.supported !== false && typeof dump.content === "string") {
|
|
108
|
+
const xmlName = `${phase}.xml`;
|
|
109
|
+
writeFileSync(join(this.runDir, xmlName), dump.content, "utf8");
|
|
110
|
+
this.artifacts.add(xmlName);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
errors.push(`uiDump: ${error.message}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (errors.length > 0) {
|
|
118
|
+
const errorName = `${phase}.capture-errors.txt`;
|
|
119
|
+
writeFileSync(join(this.runDir, errorName), `${errors.join("\n")}\n`, "utf8");
|
|
120
|
+
this.artifacts.add(errorName);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
finish(summary) {
|
|
124
|
+
if (this.finished)
|
|
125
|
+
return;
|
|
126
|
+
this.finished = true;
|
|
127
|
+
this.artifacts.add("episode.json");
|
|
128
|
+
this.artifacts.add("summary.json");
|
|
129
|
+
const completedAt = new Date();
|
|
130
|
+
const coordinateSystems = [...new Set(this.openSteps
|
|
131
|
+
.map((step) => coordinateSystemOf(step.document.action))
|
|
132
|
+
.filter((value) => Boolean(value)))];
|
|
133
|
+
const firstObservation = this.openSteps[0]?.document.observation ?? {};
|
|
134
|
+
const episode = {
|
|
135
|
+
version: 1,
|
|
136
|
+
taskName: summary.configuration.task ?? null,
|
|
137
|
+
startedAt: this.startedAt.toISOString(),
|
|
138
|
+
completedAt: completedAt.toISOString(),
|
|
139
|
+
model: {
|
|
140
|
+
name: summary.configuration.modelName ?? null,
|
|
141
|
+
adapter: summary.configuration.adapter ?? null,
|
|
142
|
+
baseUrl: summary.configuration.baseUrl ?? null,
|
|
143
|
+
},
|
|
144
|
+
execution: {
|
|
145
|
+
mode: summary.configuration.executionMode ?? null,
|
|
146
|
+
plannerPolicy: summary.configuration.plannerPolicy ?? null,
|
|
147
|
+
observationMode: summary.configuration.observationMode ?? null,
|
|
148
|
+
},
|
|
149
|
+
deviceInfo: {
|
|
150
|
+
target: summary.configuration.device ?? null,
|
|
151
|
+
screenWidth: firstObservation.screenW ?? null,
|
|
152
|
+
screenHeight: firstObservation.screenH ?? null,
|
|
153
|
+
initialApp: firstObservation.currentApp ?? null,
|
|
154
|
+
},
|
|
155
|
+
coordinateSystems,
|
|
156
|
+
totalSteps: this.openSteps.length,
|
|
157
|
+
result: summary.result ?? null,
|
|
158
|
+
episode: this.openSteps.map((step) => step.document),
|
|
159
|
+
};
|
|
160
|
+
writeJson(join(this.runDir, "episode.json"), episode);
|
|
161
|
+
const document = {
|
|
162
|
+
version: 1,
|
|
163
|
+
runDir: this.runDir,
|
|
164
|
+
startedAt: this.startedAt.toISOString(),
|
|
165
|
+
completedAt: completedAt.toISOString(),
|
|
166
|
+
durationMs: completedAt.getTime() - this.startedAt.getTime(),
|
|
167
|
+
...summary,
|
|
168
|
+
artifacts: [...this.artifacts].sort(),
|
|
169
|
+
};
|
|
170
|
+
writeFileSync(join(this.runDir, "summary.json"), `${JSON.stringify(document, null, 2)}\n`, "utf8");
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function writeJson(path, value) {
|
|
174
|
+
writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
175
|
+
}
|
|
176
|
+
function detectImageExtension(image) {
|
|
177
|
+
const isPng = image.length >= 8 &&
|
|
178
|
+
image[0] === 0x89 &&
|
|
179
|
+
image[1] === 0x50 &&
|
|
180
|
+
image[2] === 0x4e &&
|
|
181
|
+
image[3] === 0x47;
|
|
182
|
+
return isPng ? "png" : "jpg";
|
|
183
|
+
}
|
|
184
|
+
function externalizeImages(value, screenshotFile) {
|
|
185
|
+
if (Array.isArray(value)) {
|
|
186
|
+
return value.map((item) => externalizeImages(item, screenshotFile));
|
|
187
|
+
}
|
|
188
|
+
if (!value || typeof value !== "object")
|
|
189
|
+
return value;
|
|
190
|
+
const output = {};
|
|
191
|
+
for (const [key, item] of Object.entries(value)) {
|
|
192
|
+
if (screenshotFile &&
|
|
193
|
+
key === "url" &&
|
|
194
|
+
typeof item === "string" &&
|
|
195
|
+
item.startsWith("data:image/")) {
|
|
196
|
+
output[key] = `steps/${screenshotFile}`;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
output[key] = externalizeImages(item, screenshotFile);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return output;
|
|
203
|
+
}
|
|
204
|
+
function coordinateSystemOf(action) {
|
|
205
|
+
if (!action || typeof action !== "object")
|
|
206
|
+
return undefined;
|
|
207
|
+
const payload = action.payload;
|
|
208
|
+
if (!payload || typeof payload !== "object")
|
|
209
|
+
return undefined;
|
|
210
|
+
const value = payload._coordSystem;
|
|
211
|
+
return typeof value === "string" ? value : undefined;
|
|
212
|
+
}
|
|
213
|
+
export function expandPath(path) {
|
|
214
|
+
if (path === "~")
|
|
215
|
+
return homedir();
|
|
216
|
+
if (path.startsWith("~/"))
|
|
217
|
+
return resolve(homedir(), path.slice(2));
|
|
218
|
+
return isAbsolute(path) ? path : resolve(path);
|
|
219
|
+
}
|
|
220
|
+
export function formatTimestamp(date) {
|
|
221
|
+
return date.toISOString().replace(/[-:]/g, "").replace("T", "-").replace(".", "-").replace("Z", "");
|
|
222
|
+
}
|
|
223
|
+
function slugify(task) {
|
|
224
|
+
const slug = task
|
|
225
|
+
.normalize("NFKD")
|
|
226
|
+
.replace(/[^a-zA-Z0-9]+/g, "-")
|
|
227
|
+
.replace(/^-+|-+$/g, "")
|
|
228
|
+
.slice(0, 48)
|
|
229
|
+
.toLowerCase();
|
|
230
|
+
return slug || "task";
|
|
231
|
+
}
|
|
232
|
+
async function withTimeout(promise, timeoutMs, label) {
|
|
233
|
+
let timer;
|
|
234
|
+
try {
|
|
235
|
+
return await Promise.race([
|
|
236
|
+
promise,
|
|
237
|
+
new Promise((_, reject) => {
|
|
238
|
+
timer = setTimeout(() => reject(new Error(`${label} timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
239
|
+
}),
|
|
240
|
+
]);
|
|
241
|
+
}
|
|
242
|
+
finally {
|
|
243
|
+
if (timer)
|
|
244
|
+
clearTimeout(timer);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=run-artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-artifacts.js","sourceRoot":"","sources":["../../../src/inbound/cli/run-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0CtD,MAAM,OAAO,mBAAmB;IACrB,MAAM,CAAS;IACf,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IACxB,QAAQ,GAAG,KAAK,CAAC;IACjB,YAAY,GAAG,CAAC,CAAC;IACR,SAAS,GAIrB,EAAE,CAAC;IACS,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/C,YAAY,UAAkB,EAAE,IAAY;QAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/F,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,KAA8B;QACnC,cAAc,CACZ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EACjC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,IAAI,EACzE,MAAM,CACP,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,kBAAkB,CAAC,KAUlB;QACC,MAAM,QAAQ,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,QAAQ,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAC3D,IAAI,cAAc,GAAkB,IAAI,CAAC;QACzC,IAAI,UAAU,GAAkB,IAAI,CAAC;QAErC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzC,IAAI,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YACrE,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAC9C,cAAc,GAAG,GAAG,MAAM,gBAAgB,SAAS,EAAE,CAAC;YACtD,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC;YACrD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YAC7B,UAAU,GAAG,GAAG,MAAM,kBAAkB,CAAC;YACzC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5E,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,UAAU,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,YAAY,GAAG,GAAG,MAAM,OAAO,CAAC;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAyB;YACrC,QAAQ;YACR,cAAc,EAAE,KAAK,CAAC,KAAK;YAC3B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,KAAK,EAAE,eAAe;YACtB,WAAW,EAAE;gBACX,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO;gBAClC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO;gBAClC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,IAAI,IAAI;gBACvD,eAAe,EAAE,KAAK,CAAC,WAAW,CAAC,eAAe,IAAI,IAAI;aAC3D;YACD,cAAc;YACd,UAAU;YACV,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,IAAI;YAChB,cAAc,EAAE,IAAI;YACpB,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,IAAI;SAClB,CAAC;QACF,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,YAAY,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,2EAA2E;IAC3E,YAAY,CAAC,IAWZ;QACC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;aAC/B,OAAO,EAAE;aACT,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,cAAc,KAAK,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;QACtG,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACrC,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,iBAAiB,CAC5C,IAAI,CAAC,UAAU,EAAE,UAAU,IAAI,IAAI,EACnC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAC/B,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,IAAI,IAAI,CAAC;QACtE,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,IAAI,IAAI,CAAC;QACjE,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC;QACvD,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzC,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACvD,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAgB,EAAE,KAAyB;QACvD,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,KAAK,aAAa,CAAC,CAAC;gBACtF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC5D,MAAM,SAAS,GAAG,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC;gBACvC,MAAM,YAAY,GAAG,GAAG,KAAK,kBAAkB,CAAC;gBAChD,MAAM,EAAE,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,UAAU,CAAC;gBACxC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACxE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACjG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,eAAgB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,UAAU,CAAC,CAAC;gBAC1F,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACjE,MAAM,OAAO,GAAG,GAAG,KAAK,MAAM,CAAC;oBAC/B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBAChE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,WAAY,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,GAAG,KAAK,qBAAqB,CAAC;YAChD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC9E,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,OAA2B;QAChC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnC,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;QAC/B,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS;iBACjD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;iBACvD,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC;QACvE,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,IAAI,IAAI,IAAI;YAC5C,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;YACvC,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE;YACtC,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS,IAAI,IAAI;gBAC7C,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,IAAI;gBAC9C,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,IAAI;aAC/C;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,aAAa,IAAI,IAAI;gBACjD,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,aAAa,IAAI,IAAI;gBAC1D,eAAe,EAAE,OAAO,CAAC,aAAa,CAAC,eAAe,IAAI,IAAI;aAC/D;YACD,UAAU,EAAE;gBACV,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,MAAM,IAAI,IAAI;gBAC5C,WAAW,EAAE,gBAAgB,CAAC,OAAO,IAAI,IAAI;gBAC7C,YAAY,EAAE,gBAAgB,CAAC,OAAO,IAAI,IAAI;gBAC9C,UAAU,EAAE,gBAAgB,CAAC,UAAU,IAAI,IAAI;aAChD;YACD,iBAAiB;YACjB,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;YACjC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SACrD,CAAC;QACF,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG;YACf,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;YACvC,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE;YACtC,UAAU,EAAE,WAAW,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;YAC5D,GAAG,OAAO;YACV,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE;SACtC,CAAC;QACF,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrG,CAAC;CACF;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,KAAc;IAC7C,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,KAAK,GACT,KAAK,CAAC,MAAM,IAAI,CAAC;QACjB,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;QACjB,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;QACjB,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;QACjB,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACpB,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/B,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,cAA6B;IACtE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEtD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QAC3E,IACE,cAAc;YACd,GAAG,KAAK,KAAK;YACb,OAAO,IAAI,KAAK,QAAQ;YACxB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAC9B,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,cAAc,EAAE,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAe;IACzC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,OAAO,GAAI,MAAgC,CAAC,OAAO,CAAC;IAC1D,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,KAAK,GAAI,OAAmC,CAAC,YAAY,CAAC;IAChE,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IACnC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAU;IACxC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,IAAI,GAAG,IAAI;SACd,SAAS,CAAC,MAAM,CAAC;SACjB,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,WAAW,EAAE,CAAC;IACjB,OAAO,IAAI,IAAI,MAAM,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,WAAW,CAAI,OAAmB,EAAE,SAAiB,EAAE,KAAa;IACjF,IAAI,KAAgD,CAAC;IACrD,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,OAAO;YACP,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC3B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,SAAS,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACpG,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
|
|
@@ -9,18 +9,13 @@
|
|
|
9
9
|
* This bypasses the ACP/Bridge bootstrap entirely — for that, use plain
|
|
10
10
|
* `device-agent` without the `run` sub-command.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* tasks start with pure `AgentLoop` and escalate to Plan-Act when
|
|
16
|
-
* they burn through `1/3 * maxSteps`.
|
|
17
|
-
* - `--plan always`: skip the heuristic, always plan.
|
|
18
|
-
* - `--plan never`: skip the planner entirely (pure ReAct).
|
|
19
|
-
* - `--planner-model` defaults to `glm-4-flash` (cheap chat-only model
|
|
20
|
-
* on ARouter).
|
|
12
|
+
* Execution is selected exclusively through `--execution-mode`:
|
|
13
|
+
* Fast uses ReAct, Reasoning uses Plan-Act, and Advanced adds extended
|
|
14
|
+
* budgets, reflection, knowledge, skills, and verification.
|
|
21
15
|
*/
|
|
22
|
-
import { AgentRunner, type
|
|
23
|
-
import type
|
|
16
|
+
import { AgentRunner, type AgentRunnerResult, type ExecutionMode } from "../../agent-runtime/index.js";
|
|
17
|
+
import { type ObservationMode } from "../../agent-runtime/observation-mode.js";
|
|
18
|
+
import { type ArtifactMcp } from "./run-artifacts.js";
|
|
24
19
|
export interface RunCommandFlags {
|
|
25
20
|
task?: string;
|
|
26
21
|
mcp?: string;
|
|
@@ -37,7 +32,8 @@ export interface RunCommandFlags {
|
|
|
37
32
|
model?: string;
|
|
38
33
|
baseUrl?: string;
|
|
39
34
|
apiKey?: string;
|
|
40
|
-
|
|
35
|
+
/** Product execution profile. Defaults to Fast. */
|
|
36
|
+
executionMode?: ExecutionMode;
|
|
41
37
|
plannerModel?: string;
|
|
42
38
|
plannerBaseUrl?: string;
|
|
43
39
|
plannerApiKey?: string;
|
|
@@ -46,17 +42,15 @@ export interface RunCommandFlags {
|
|
|
46
42
|
env?: "mobile" | "computer" | "browser";
|
|
47
43
|
lang?: "cn" | "en";
|
|
48
44
|
json?: boolean;
|
|
45
|
+
/** Save a timestamped trace bundle below this directory. Disabled by default. */
|
|
46
|
+
outputDir?: string;
|
|
49
47
|
help?: boolean;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
/** Legacy adapter name for the inner VLM (autoglm | general | qwenvl | …). */
|
|
55
|
-
provider?: string;
|
|
48
|
+
/** Prompt/action protocol adapter for the inner VLM. */
|
|
49
|
+
adapter?: string;
|
|
50
|
+
/** Internal marker used to warn callers of the deprecated CLI alias. */
|
|
51
|
+
deprecatedProviderUsed?: boolean;
|
|
56
52
|
/** Inputs collected per step; `auto` follows the selected model adapter. */
|
|
57
53
|
observationMode?: ObservationMode;
|
|
58
|
-
/** Enable OrchestratorAgent (OpenAI tool-calling outer + inner VLM). */
|
|
59
|
-
orchestrator?: boolean;
|
|
60
54
|
}
|
|
61
55
|
export declare function parseRunArgs(argv: string[]): RunCommandFlags;
|
|
62
56
|
/** Accepts: `30000`, `30s`, `5m`, `2h`, plain numbers (ms). */
|
|
@@ -73,6 +67,8 @@ export interface RunCommandIO {
|
|
|
73
67
|
};
|
|
74
68
|
}
|
|
75
69
|
export interface RunCommandDeps {
|
|
70
|
+
/** Optional owner cancellation propagated to model, planner, and MCP work. */
|
|
71
|
+
signal?: AbortSignal;
|
|
76
72
|
/** Override McpClient construction (tests use this to inject mocks). */
|
|
77
73
|
mcpFactory?: (baseUrl: string) => MinimalMcp;
|
|
78
74
|
/** Override OpenAIClient construction. */
|
|
@@ -80,6 +76,7 @@ export interface RunCommandDeps {
|
|
|
80
76
|
baseUrl: string;
|
|
81
77
|
apiKey: string;
|
|
82
78
|
modelName: string;
|
|
79
|
+
adapter?: string;
|
|
83
80
|
}) => MinimalModelClient;
|
|
84
81
|
/** Override planner construction (returns `undefined` to disable). */
|
|
85
82
|
plannerFactory?: (cfg: {
|
|
@@ -89,12 +86,18 @@ export interface RunCommandDeps {
|
|
|
89
86
|
}) => MinimalPlanner | undefined;
|
|
90
87
|
/** Override AgentRunner construction. */
|
|
91
88
|
runnerFactory?: (opts: ConstructorParameters<typeof AgentRunner>[0]) => RunnerLike;
|
|
89
|
+
/** Receives the created trace directory (used by the benchmark command). */
|
|
90
|
+
onRecordingCreated?: (runDir: string) => void;
|
|
91
|
+
/** Override Fleet MCP resolution (tests use this to avoid loopback I/O). */
|
|
92
|
+
deviceMcpResolver?: (target: string) => Promise<string>;
|
|
92
93
|
}
|
|
93
94
|
export interface MinimalMcp {
|
|
94
95
|
waitUntilReady?(opts?: {
|
|
95
96
|
attempts?: number;
|
|
96
97
|
attemptDelayMs?: number;
|
|
97
98
|
}): Promise<unknown>;
|
|
99
|
+
screenshot?: ArtifactMcp["screenshot"];
|
|
100
|
+
uiDump?: ArtifactMcp["uiDump"];
|
|
98
101
|
}
|
|
99
102
|
interface MinimalModelClient {
|
|
100
103
|
modelName: string;
|