@cydm/pie 2.7.11 → 2.7.13
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/README.md +13 -14
- package/dist/builtin/extensions/ask-user/index.js +3 -3
- package/dist/builtin/extensions/plan-mode/index.js +37 -12
- package/dist/builtin/extensions/subagent/index.js +10 -4
- package/dist/builtin/extensions/todo/index.js +3 -3
- package/dist/builtin/skills/computer-use-axi/computer-use-axi-broker.js +13 -11
- package/dist/builtin/skills/computer-use-axi/computer-use-axi-runtime.js +1 -1
- package/dist/chunks/{chunk-XIRBNP2S.js → chunk-CIFC6QVB.js} +718 -277
- package/dist/chunks/{chunk-3NFKVBGY.js → chunk-D7RMNFVM.js} +156 -2
- package/dist/chunks/{chunk-XVF6V6Q5.js → chunk-HGUYS5SF.js} +71 -2
- package/dist/chunks/{chunk-3VEIP2VY.js → chunk-R46YPPTU.js} +57 -32
- package/dist/chunks/{src-2RCV3I3P.js → src-5JJZZ5H7.js} +6 -2
- package/dist/chunks/{test-stream-Y2S3H7DK.js → test-stream-ZBTSPU7J.js} +1 -1
- package/dist/cli.js +1404 -517
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -211,11 +211,14 @@ Main key bindings:
|
|
|
211
211
|
- `Enter` submit message
|
|
212
212
|
- `Shift+Enter` insert a new line
|
|
213
213
|
- `\` + `Enter` insert a new line in terminals without modified-enter support
|
|
214
|
-
- `Ctrl+C` exit
|
|
215
|
-
- `Ctrl+D` exit
|
|
214
|
+
- `Ctrl+C` clear the editor; press twice within 500 ms to exit
|
|
215
|
+
- `Ctrl+D` exit when the editor is empty; forward-delete otherwise
|
|
216
|
+
- `Ctrl+V` / `Alt+V` / `Cmd+V` paste an image from the clipboard when the main chat editor owns focus (terminal clipboard first, OS helper fallback). Plan refinement, extension input/editor/custom UI, visible overlays, and the mention picker retain their own paste keys.
|
|
216
217
|
- `Ctrl+O` expand or collapse tool output
|
|
217
218
|
- `/` open the slash command menu
|
|
218
219
|
|
|
220
|
+
OS clipboard images are staged in per-read private temporary directories (0700 directories and exclusively reserved 0600 files on POSIX), including subprocess output, and removed after staging or on failure. Windows uses the user's temporary directory and inherited OS access controls. Terminal OSC 5522 frames and CSI 5522 support replies are incrementally framed, size-bounded, and never flushed as keyboard input while recognized: the default inter-chunk deadline is 1s, with a 10s absolute frame deadline. Failed frames discard their tails through the terminator or until 1s of idle recovery. An ambiguous lone Escape keeps its normal keyboard timeout unless a clipboard request is active; even then it is eventually delivered as Escape. After idle recovery, arbitrarily late bare payload bytes cannot be distinguished from new typing.
|
|
221
|
+
|
|
219
222
|
Direct shell mode:
|
|
220
223
|
|
|
221
224
|
```text
|
|
@@ -333,17 +336,13 @@ Run `pie doctor` to check whether chrome-devtools-axi and a Chrome browser are d
|
|
|
333
336
|
|
|
334
337
|
## Terminal UI Automation
|
|
335
338
|
|
|
336
|
-
The built-in `tui-use` skill drives interactive terminal programs - REPLs, pdb/gdb debugger sessions, and full-screen TUI apps - through Pie's packaged PTY runtime. Run `node <skill-baseDir>/tui-use-cli.js --help`; no first-use dependency download or global CLI is required. Windows uses native PowerShell and ConPTY. State lives in `~/.pie/tui-use`, or a dedicated `PIE_TUI_USE_STATE_DIR`. Always target sessions with `--session <id>`, confirm termination with `wait --exit`, and clean up only sessions and daemons you own. Use
|
|
339
|
+
The built-in `tui-use` skill drives interactive terminal programs - REPLs, pdb/gdb debugger sessions, and full-screen TUI apps - through Pie's packaged PTY runtime. Run `node <skill-baseDir>/tui-use-cli.js --help`; no first-use dependency download or global CLI is required. Windows uses native PowerShell and ConPTY. State lives in `~/.pie/tui-use`, or a dedicated `PIE_TUI_USE_STATE_DIR`. Always target sessions with `--session <id>`, confirm termination with `wait --exit`, and clean up only sessions and daemons you own. Use the `shell` tool for non-interactive commands.
|
|
337
340
|
|
|
338
341
|
## Desktop Control (computer-use)
|
|
339
342
|
|
|
340
|
-
The built-in `computer-use`
|
|
341
|
-
|
|
342
|
-
Tools are tiered:
|
|
343
|
+
The built-in `computer-use-axi` skill controls real desktop applications on macOS, Windows, and Linux through a native accessibility helper. Desktop control is a last resort - prefer API, CLI, or web tools whenever they can accomplish the task. Invoke the skill's CLI through the `shell` tool (`node <skill-baseDir>/computer-use-axi-cli.js <command>`); observation commands read UI state, while `act` synthesizes real input. These are CLI operations, not a separate model-visible extension tool tier, so normal shell confirmation policy applies.
|
|
343
344
|
|
|
344
|
-
-
|
|
345
|
-
- **Browser tier (default)** - `launch_browser`, `navigate_browser`, `evaluate_browser` control a managed CDP context. Navigation and JavaScript evaluation can have side effects; these are not read-only tools.
|
|
346
|
-
- **Act tier (first-use confirmation)** - `act_ui` synthesizes real input (click, type, scroll, keypress, drag). The first `act_ui` call in each session asks for confirmation (class `computer_use_act`); YOLO mode bypasses it, and non-interactive hosts block it deterministically.
|
|
345
|
+
Read `builtin/skills/computer-use-axi/SKILL.md` for `roots`, bounded observation, checked actions and browser workflows. On macOS, run the CLI's `permissions setup` and then `permissions recheck` after granting Accessibility and Screen Recording; starting Pie interactively is not a substitute for that setup flow.
|
|
347
346
|
|
|
348
347
|
Platform notes:
|
|
349
348
|
|
|
@@ -351,7 +350,7 @@ Platform notes:
|
|
|
351
350
|
- **Windows**: the helper installs to `~/.pie/helpers/computer-use/windows-bridge.exe` and needs an interactive desktop session.
|
|
352
351
|
- **Linux**: the helper installs to `~/.pie/helpers/computer-use/linux-bridge` and needs an AT-SPI2 bus (a running desktop session; headless servers are not supported).
|
|
353
352
|
|
|
354
|
-
Config: `~/.pie/extensions/computer-use.json` (user) or `.pie/computer-use.json` (project) with `browser_use`, `headless`, `cursor_overlay`, `managed_browser`; env overrides `PIE_COMPUTER_USE_BROWSER_USE` / `PIE_COMPUTER_USE_HEADLESS` / `PIE_COMPUTER_USE_CURSOR_OVERLAY` / `PIE_COMPUTER_USE_MANAGED_BROWSER`.
|
|
353
|
+
Config: `~/.pie/extensions/computer-use.json` (user) or `.pie/computer-use.json` (project) with `browser_use`, `headless`, `cursor_overlay`, `managed_browser`; env overrides `PIE_COMPUTER_USE_BROWSER_USE` / `PIE_COMPUTER_USE_HEADLESS` / `PIE_COMPUTER_USE_CURSOR_OVERLAY` / `PIE_COMPUTER_USE_MANAGED_BROWSER`. Run `pie doctor` for helper install status.
|
|
355
354
|
|
|
356
355
|
## Web Research
|
|
357
356
|
|
|
@@ -363,13 +362,13 @@ Pie exposes one default model-visible web tool: `web_research`. Use it for publi
|
|
|
363
362
|
|
|
364
363
|
## Permissions
|
|
365
364
|
|
|
366
|
-
Pie's default tools operate from the current workspace. File tools are workspace-scoped, `~/.pie` is allowlisted for Pie configuration/session support, and shell commands return structured timeout/truncation/error details. The canonical
|
|
365
|
+
Pie's default tools operate from the current workspace. File tools are workspace-scoped, `~/.pie` is allowlisted for Pie configuration/session support, and shell commands return structured timeout/truncation/error details. The canonical executable tool is named `shell`; `bash` remains only a historical replay/rendering and policy identifier, not a second executable alias. On Windows `shell:auto` uses PowerShell, and callers can explicitly request the `bash`, `powershell`, or `cmd` dialect. High-risk shell commands require confirmation outside YOLO mode; the confirmation dialog also offers a time-boxed `Yolo (5 min)` option that suppresses further high-risk prompts for five minutes without enabling full YOLO mode. Explicitly turning `/settings/yolo off` revokes both persistent YOLO and any live temporary grant; status reports a remaining grant separately. `/settings/yolo` relaxes filesystem sandbox directory restrictions and should only be used in trusted workspaces. `pie permissions` prints the current policy-derived safety summary.
|
|
367
366
|
|
|
368
|
-
In interactive Plan mode (`/tools/plan`), workspace editing tools are unavailable. The `
|
|
367
|
+
In interactive Plan mode (`/tools/plan`), workspace editing tools are unavailable. The Plan-mode `shell` guard accepts simple read commands and read-only pipelines such as `rg 'TODO' . | head -20`; it blocks redirects, command substitution, and write-capable subcommands. Use `plan_scratch` to write, read, or list temporary text drafts in a directory dedicated to the current session. Shell redirection to `/tmp` remains blocked in Plan mode. When the plan is ready, the agent submits the ordered steps with `plan_submit` and you choose to execute immediately (progress is tracked through `[DONE:n]` markers in responses), keep planning, or refine the plan in a prefilled editor; a plan written as plain text under a `Plan:`/`计划:` heading is still detected as a fallback. Leave Plan mode before changing workspace files.
|
|
369
368
|
|
|
370
369
|
## Code Intelligence
|
|
371
370
|
|
|
372
|
-
`code_intel`
|
|
371
|
+
The CLI's former TypeScript-service `code_intel` tool has been retired. Unity currently exposes a lightweight provider for read-only JS/TS diagnostics, definition, references, symbols, and hover; do not infer a CLI TypeScript worker or a Unity Node sidecar from the old documentation.
|
|
373
372
|
|
|
374
373
|
## Diagnostics
|
|
375
374
|
|
|
@@ -405,7 +404,7 @@ Every management command (`sessions`, `doctor`, `models`, `extensions`, `permiss
|
|
|
405
404
|
- Errors are structured on stdout: `{"v":1,"ok":false,"kind":"...","error":{"code":"session_not_found","message":"...","hint":"..."}}`.
|
|
406
405
|
- Exit codes: `0` success, `1` business failure, `2` usage error. Unknown flags fail loudly; every subcommand supports `--help`.
|
|
407
406
|
- `sessions list --json` defaults to the current project (`--all` lists every project). Rows are minimal (`id`, `name`, `updatedAt`, `count`) with `--fields` and `--full` opt-ins; `sessions read` truncates content by default with the same opt-ins.
|
|
408
|
-
- JSONL protocol mode (`--json-events`) identifies entries by `entryId` only (the legacy `checkpointId` alias is gone) and caps large tool results and turn summaries by default; pass `--event-detail full` for
|
|
407
|
+
- JSONL protocol mode (`--json-events`) identifies entries by `entryId` only (the legacy `checkpointId` alias is gone) and caps large tool results and turn summaries by default; pass `--event-detail full` for larger but still bounded payloads (including a 4,000-character string cap, depth/item/key limits). Affected tool-result strings carry `truncated`/`fullLength`; other bounded structures may use only `truncated`.
|
|
409
408
|
|
|
410
409
|
Run `pie capabilities --json` to discover the full command surface, flags, and exit-code contract programmatically.
|
|
411
410
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { createRequire as __createRequire } from "node:module"; const require = __createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
createAskUserCapability
|
|
4
|
-
} from "../../../chunks/chunk-
|
|
5
|
-
import "../../../chunks/chunk-
|
|
6
|
-
import "../../../chunks/chunk-
|
|
4
|
+
} from "../../../chunks/chunk-CIFC6QVB.js";
|
|
5
|
+
import "../../../chunks/chunk-HGUYS5SF.js";
|
|
6
|
+
import "../../../chunks/chunk-R46YPPTU.js";
|
|
7
7
|
import "../../../chunks/chunk-XXGYUYXI.js";
|
|
8
8
|
import "../../../chunks/chunk-LZQXQOPJ.js";
|
|
9
9
|
|
|
@@ -6,9 +6,9 @@ import {
|
|
|
6
6
|
extractPlanTodoItems,
|
|
7
7
|
markCompletedPlanSteps,
|
|
8
8
|
restoreExecutionState
|
|
9
|
-
} from "../../../chunks/chunk-
|
|
10
|
-
import "../../../chunks/chunk-
|
|
11
|
-
import "../../../chunks/chunk-
|
|
9
|
+
} from "../../../chunks/chunk-CIFC6QVB.js";
|
|
10
|
+
import "../../../chunks/chunk-HGUYS5SF.js";
|
|
11
|
+
import "../../../chunks/chunk-R46YPPTU.js";
|
|
12
12
|
import {
|
|
13
13
|
Type
|
|
14
14
|
} from "../../../chunks/chunk-XXGYUYXI.js";
|
|
@@ -121,6 +121,30 @@ function planModeExtension(ctx) {
|
|
|
121
121
|
return items.map((item, index) => `${index + 1}. ${item.text}${item.detail ? `
|
|
122
122
|
${item.detail}` : ""}`).join("\n");
|
|
123
123
|
}
|
|
124
|
+
async function planSelect(prompt, options, leftShortcut) {
|
|
125
|
+
const response = await ctx.interactions.request({
|
|
126
|
+
type: "select_one",
|
|
127
|
+
id: `plan-mode:${Date.now()}`,
|
|
128
|
+
prompt,
|
|
129
|
+
options,
|
|
130
|
+
// No timeoutMs: plan approval must wait for the user indefinitely,
|
|
131
|
+
// matching the pre-protocol ctx.ui.select behavior.
|
|
132
|
+
...leftShortcut ? { leftShortcut } : {}
|
|
133
|
+
});
|
|
134
|
+
return response.type === "select_one" ? response.selection : void 0;
|
|
135
|
+
}
|
|
136
|
+
function planNotify(message, level = "info") {
|
|
137
|
+
void ctx.interactions.request({ type: "notify", message, level, markdown: true }).catch(() => void 0);
|
|
138
|
+
}
|
|
139
|
+
async function planRefine(items) {
|
|
140
|
+
const response = await ctx.interactions.request({
|
|
141
|
+
type: "multiline_input",
|
|
142
|
+
id: `plan-mode:refine:${Date.now()}`,
|
|
143
|
+
prompt: "Refine the plan (edit the plan or add feedback):",
|
|
144
|
+
prefill: formatPlanText(items)
|
|
145
|
+
});
|
|
146
|
+
return response.type === "multiline_input" ? response.value : void 0;
|
|
147
|
+
}
|
|
124
148
|
function renderPlanMarkdown(goal, items) {
|
|
125
149
|
const heading = goal ? `## \u{1F4CB} ${goal} \u2014 ${items.length} steps` : `## \u{1F4CB} Plan \u2014 ${items.length} steps`;
|
|
126
150
|
const steps = items.map((item, index) => {
|
|
@@ -208,15 +232,15 @@ Execute the steps in order, starting with step 1. After completing a step, inclu
|
|
|
208
232
|
lastOfferedPlanKey = JSON.stringify(items);
|
|
209
233
|
const rendered = items.map((item) => `${item.step}. \u2610 ${item.text}${item.detail ? `
|
|
210
234
|
${item.detail}` : ""}`).join("\n");
|
|
211
|
-
if (!ctx.
|
|
235
|
+
if (!ctx.interactions.isAvailable()) {
|
|
212
236
|
return reply(`Plan submitted (${items.length} steps) in headless mode; interactive approval is unavailable, so nothing will be executed:
|
|
213
237
|
|
|
214
238
|
${rendered}`);
|
|
215
239
|
}
|
|
216
240
|
const goal = typeof args.goal === "string" && args.goal.trim() ? args.goal.trim() : void 0;
|
|
217
|
-
|
|
241
|
+
planNotify(renderPlanMarkdown(goal, items));
|
|
218
242
|
const yoloOption = typeof ctx.setYoloMode === "function" && !ctx.yoloMode ? ["Execute in YOLO mode (auto-approve everything)"] : [];
|
|
219
|
-
const choice = await
|
|
243
|
+
const choice = await planSelect(`\u{1F4CB} Plan (${items.length} steps) \u2014 what next?`, [
|
|
220
244
|
"Execute the plan (track progress)",
|
|
221
245
|
...yoloOption,
|
|
222
246
|
"Stay in plan mode",
|
|
@@ -230,7 +254,7 @@ ${rendered}`);
|
|
|
230
254
|
return reply(startPlanExecution(items));
|
|
231
255
|
}
|
|
232
256
|
if (choice === "Refine the plan") {
|
|
233
|
-
const refinement = await
|
|
257
|
+
const refinement = await planRefine(items);
|
|
234
258
|
if (refinement?.trim()) {
|
|
235
259
|
return reply(`The user refined the plan:
|
|
236
260
|
|
|
@@ -298,7 +322,8 @@ ${completedList}`, "info", { markdown: true });
|
|
|
298
322
|
}
|
|
299
323
|
return;
|
|
300
324
|
}
|
|
301
|
-
if (!planModeEnabled
|
|
325
|
+
if (!planModeEnabled) return;
|
|
326
|
+
if (!ctx.interactions.isAvailable()) return;
|
|
302
327
|
if (approvalOfferedThisTurn) return;
|
|
303
328
|
const messages = event.messages || [];
|
|
304
329
|
const lastAssistant = [...messages].reverse().find(
|
|
@@ -316,10 +341,10 @@ ${completedList}`, "info", { markdown: true });
|
|
|
316
341
|
approvalOfferedThisTurn = true;
|
|
317
342
|
const todoListText = extracted.map((item, index) => `${index + 1}. \u2610 ${item.text}${item.detail ? `
|
|
318
343
|
- \u21B3 ${item.detail}` : ""}`).join("\n");
|
|
319
|
-
|
|
344
|
+
planNotify(`## \u{1F4CB} Plan \u2014 ${extracted.length} steps
|
|
320
345
|
|
|
321
|
-
${todoListText}
|
|
322
|
-
const choice = await
|
|
346
|
+
${todoListText}`);
|
|
347
|
+
const choice = await planSelect(`\u{1F4CB} Plan (${extracted.length} steps) \u2014 what next?`, [
|
|
323
348
|
"Execute the plan (track progress)",
|
|
324
349
|
"Stay in plan mode",
|
|
325
350
|
"Refine the plan"
|
|
@@ -329,7 +354,7 @@ ${todoListText}`, "info", { markdown: true });
|
|
|
329
354
|
return;
|
|
330
355
|
}
|
|
331
356
|
if (choice === "Refine the plan") {
|
|
332
|
-
const refinement = await
|
|
357
|
+
const refinement = await planRefine(extracted);
|
|
333
358
|
if (refinement?.trim()) {
|
|
334
359
|
ctx.sendUserMessage(refinement.trim());
|
|
335
360
|
}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import { createRequire as __createRequire } from "node:module"; const require = __createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
|
+
classifyCliFailure,
|
|
3
4
|
createCliHostCapabilities,
|
|
5
|
+
createCliRetryPolicy,
|
|
4
6
|
formatTransportLifecycle,
|
|
5
7
|
getConfigDir,
|
|
6
8
|
logTransportLifecycle
|
|
7
|
-
} from "../../../chunks/chunk-
|
|
9
|
+
} from "../../../chunks/chunk-D7RMNFVM.js";
|
|
8
10
|
import {
|
|
9
11
|
SUBAGENT_SESSION_RECORD_VERSION,
|
|
10
12
|
createPolicyEnforcedTools,
|
|
11
13
|
createSharedFileSystemTools,
|
|
12
14
|
createSubagentCapability
|
|
13
|
-
} from "../../../chunks/chunk-
|
|
14
|
-
import "../../../chunks/chunk-
|
|
15
|
-
import "../../../chunks/chunk-
|
|
15
|
+
} from "../../../chunks/chunk-CIFC6QVB.js";
|
|
16
|
+
import "../../../chunks/chunk-HGUYS5SF.js";
|
|
17
|
+
import "../../../chunks/chunk-R46YPPTU.js";
|
|
16
18
|
import "../../../chunks/chunk-XXGYUYXI.js";
|
|
17
19
|
import "../../../chunks/chunk-LZQXQOPJ.js";
|
|
18
20
|
|
|
@@ -398,6 +400,10 @@ function subagentExtension(ctx) {
|
|
|
398
400
|
},
|
|
399
401
|
skills,
|
|
400
402
|
yoloMode: ctx.yoloMode,
|
|
403
|
+
recovery: {
|
|
404
|
+
policy: createCliRetryPolicy(),
|
|
405
|
+
classifyFailure: (context) => classifyCliFailure(context)
|
|
406
|
+
},
|
|
401
407
|
getParentTools: () => ctx.getAllTools(),
|
|
402
408
|
log: (message) => ctx.log(message),
|
|
403
409
|
notify: ctx.hasUI ? (message, type) => ctx.ui.notify(message, type === "success" ? "info" : type) : void 0,
|
|
@@ -8,9 +8,9 @@ import {
|
|
|
8
8
|
executeManageTodoList,
|
|
9
9
|
executionStateToTodos,
|
|
10
10
|
restoreExecutionState
|
|
11
|
-
} from "../../../chunks/chunk-
|
|
12
|
-
import "../../../chunks/chunk-
|
|
13
|
-
import "../../../chunks/chunk-
|
|
11
|
+
} from "../../../chunks/chunk-CIFC6QVB.js";
|
|
12
|
+
import "../../../chunks/chunk-HGUYS5SF.js";
|
|
13
|
+
import "../../../chunks/chunk-R46YPPTU.js";
|
|
14
14
|
import "../../../chunks/chunk-XXGYUYXI.js";
|
|
15
15
|
import "../../../chunks/chunk-LZQXQOPJ.js";
|
|
16
16
|
|
|
@@ -5022,17 +5022,19 @@ function validateRequest(value) {
|
|
|
5022
5022
|
const params = validateCommandParams(command, value.params);
|
|
5023
5023
|
const cwd = value.cwd === void 0 ? process.cwd() : boundedString(value.cwd, "cwd", 4096);
|
|
5024
5024
|
if (!path3.isAbsolute(cwd)) throw new BrokerProtocolError("invalid_request", "cwd must be absolute.");
|
|
5025
|
-
|
|
5026
|
-
|
|
5027
|
-
|
|
5028
|
-
|
|
5029
|
-
|
|
5030
|
-
|
|
5031
|
-
|
|
5032
|
-
|
|
5033
|
-
|
|
5034
|
-
|
|
5035
|
-
|
|
5025
|
+
let environment = {};
|
|
5026
|
+
if (command !== "stop") {
|
|
5027
|
+
const rawEnvironment = value.environment ?? {};
|
|
5028
|
+
assertPlainRecord(rawEnvironment, "environment");
|
|
5029
|
+
assertKeys(rawEnvironment, "environment", REQUEST_ENV_KEYS);
|
|
5030
|
+
for (const entry of Object.values(rawEnvironment)) {
|
|
5031
|
+
if (typeof entry !== "string") throw new BrokerProtocolError("invalid_request", "environment values must be strings.");
|
|
5032
|
+
}
|
|
5033
|
+
try {
|
|
5034
|
+
environment = captureComputerUseEnvironment(rawEnvironment);
|
|
5035
|
+
} catch (error) {
|
|
5036
|
+
throw new BrokerProtocolError("invalid_request", String(error));
|
|
5037
|
+
}
|
|
5036
5038
|
}
|
|
5037
5039
|
const budgetMs = value.budgetMs === void 0 ? BROKER_DEFAULT_REQUEST_BUDGET_MS : Math.trunc(boundedNumber(value.budgetMs, "budgetMs", BROKER_MIN_REQUEST_BUDGET_MS, BROKER_MAX_REQUEST_BUDGET_MS));
|
|
5038
5040
|
return {
|
|
@@ -378,7 +378,7 @@ function isBrokerResponse(value) {
|
|
|
378
378
|
}
|
|
379
379
|
async function callBroker(options) {
|
|
380
380
|
if (options.command !== "stop") resolveTestOnlyBackend();
|
|
381
|
-
const environment = captureComputerUseEnvironment();
|
|
381
|
+
const environment = options.command === "stop" ? {} : captureComputerUseEnvironment();
|
|
382
382
|
const endpoint = resolveBrokerEndpoint();
|
|
383
383
|
const budgetMs = Math.min(Math.max(options.budgetMs ?? BROKER_DEFAULT_REQUEST_BUDGET_MS, 100), 15 * 6e4);
|
|
384
384
|
const spawnState = { spawned: false };
|