@oh-my-pi/pi-coding-agent 17.2.4 → 17.2.5
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/CHANGELOG.md +51 -0
- package/dist/{CHANGELOG-bpmhv26t.md → CHANGELOG-q2w43aw3.md} +51 -0
- package/dist/cli.js +4148 -3717
- package/dist/{template-8vdv6xb4.js → template-c2hyaytt.js} +8 -26
- package/dist/types/cli/args.d.ts +4 -1
- package/dist/types/cli/browser-relay-cli.d.ts +15 -0
- package/dist/types/cli/command-help.d.ts +99 -0
- package/dist/types/cli/help-extra.d.ts +2 -0
- package/dist/types/cli/thinking-levels.d.ts +5 -0
- package/dist/types/cli/update-cli.d.ts +13 -0
- package/dist/types/commands/browser-relay.d.ts +38 -0
- package/dist/types/commands/commit.d.ts +3 -0
- package/dist/types/commands/complete.d.ts +1 -1
- package/dist/types/commands/completions.d.ts +6 -0
- package/dist/types/commands/grep.d.ts +3 -0
- package/dist/types/commands/join.d.ts +4 -0
- package/dist/types/commands/launch-help.d.ts +171 -0
- package/dist/types/commands/launch.d.ts +5 -1
- package/dist/types/commands/models.d.ts +3 -0
- package/dist/types/commands/say.d.ts +10 -0
- package/dist/types/commands/worktree.d.ts +3 -0
- package/dist/types/config/keybindings.d.ts +5 -0
- package/dist/types/config/model-discovery.d.ts +2 -2
- package/dist/types/config/models-config-schema-bundle.d.ts +3 -0
- package/dist/types/config/models-config-schema.d.ts +2 -0
- package/dist/types/config/models-config.d.ts +1 -0
- package/dist/types/config/service-tier.d.ts +2 -0
- package/dist/types/config/settings-schema.d.ts +69 -21
- package/dist/types/cursor-bridge-tools.d.ts +1 -1
- package/dist/types/cursor.d.ts +7 -4
- package/dist/types/edit/index.d.ts +3 -3
- package/dist/types/edit/modes/replace.d.ts +22 -15
- package/dist/types/edit/renderer.d.ts +1 -1
- package/dist/types/eval/py/kernel.d.ts +3 -1
- package/dist/types/eval/py/spawn-options.d.ts +12 -16
- package/dist/types/extensibility/legacy-pi-ai-shim.d.ts +8 -1
- package/dist/types/extensibility/legacy-pi-coding-agent-shim.d.ts +1 -1
- package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +2 -0
- package/dist/types/launch/broker.d.ts +1 -1
- package/dist/types/launch/client.d.ts +6 -3
- package/dist/types/launch/ensure.d.ts +8 -0
- package/dist/types/launch/paths.d.ts +1 -1
- package/dist/types/launch/protocol.d.ts +2 -2
- package/dist/types/lsp/client.d.ts +2 -0
- package/dist/types/lsp/mux/daemon.d.ts +15 -0
- package/dist/types/lsp/mux/protocol.d.ts +57 -0
- package/dist/types/lsp/mux/server.d.ts +18 -0
- package/dist/types/lsp/types.d.ts +22 -2
- package/dist/types/main.d.ts +2 -0
- package/dist/types/mnemopi/embed-client.d.ts +1 -1
- package/dist/types/mnemopi/state.d.ts +0 -23
- package/dist/types/modes/components/assistant-message.d.ts +2 -0
- package/dist/types/modes/components/custom-editor.d.ts +2 -1
- package/dist/types/modes/components/read-tool-group.d.ts +2 -0
- package/dist/types/modes/components/stripped-tool-calls-placeholder.d.ts +12 -0
- package/dist/types/modes/components/tool-execution.d.ts +2 -0
- package/dist/types/modes/controllers/input-controller.d.ts +1 -0
- package/dist/types/modes/interactive-mode.d.ts +1 -0
- package/dist/types/modes/types.d.ts +1 -0
- package/dist/types/modes/workflow.d.ts +2 -1
- package/dist/types/sdk.d.ts +3 -1
- package/dist/types/secrets/index.d.ts +1 -1
- package/dist/types/session/agent-session-types.d.ts +3 -1
- package/dist/types/session/indexed-session-storage.d.ts +1 -0
- package/dist/types/session/session-advisors.d.ts +1 -1
- package/dist/types/session/session-context.d.ts +2 -1
- package/dist/types/session/session-maintenance.d.ts +1 -0
- package/dist/types/session/session-manager.d.ts +16 -11
- package/dist/types/session/session-stats.d.ts +10 -0
- package/dist/types/session/session-storage.d.ts +15 -3
- package/dist/types/system-prompt.d.ts +4 -1
- package/dist/types/task/index.d.ts +2 -1
- package/dist/types/task/spawn-policy.d.ts +5 -0
- package/dist/types/thinking.d.ts +1 -7
- package/dist/types/tools/ast-grep.d.ts +1 -1
- package/dist/types/tools/browser/registry.d.ts +2 -1
- package/dist/types/tools/browser/relay/bridge.d.ts +35 -0
- package/dist/types/tools/browser/relay/daemon.d.ts +16 -0
- package/dist/types/tools/browser/relay/kind.d.ts +19 -0
- package/dist/types/tools/browser/relay/protocol.d.ts +97 -0
- package/dist/types/tools/browser/relay/server.d.ts +35 -0
- package/dist/types/tools/browser/render.d.ts +1 -0
- package/dist/types/tools/browser.d.ts +3 -0
- package/dist/types/tools/computer/exposure.d.ts +9 -7
- package/dist/types/tools/computer/protocol.d.ts +70 -17
- package/dist/types/tools/computer/supervisor.d.ts +23 -10
- package/dist/types/tools/computer/worker-entry.d.ts +1 -0
- package/dist/types/tools/computer/worker.d.ts +42 -7
- package/dist/types/tools/computer-renderer.d.ts +7 -5
- package/dist/types/tools/computer.d.ts +25 -44
- package/dist/types/tools/context.d.ts +3 -0
- package/dist/types/tools/glob.d.ts +1 -1
- package/dist/types/tools/grep.d.ts +1 -1
- package/dist/types/tools/render-utils.d.ts +2 -0
- package/dist/types/tools/{browser/run-cancellation.d.ts → run-scope.d.ts} +8 -8
- package/dist/types/tools/tool-timeouts.d.ts +5 -0
- package/dist/types/tools/xdev.d.ts +8 -0
- package/dist/types/utils/clipboard.d.ts +2 -2
- package/dist/types/web/kagi.d.ts +1 -0
- package/dist/types/web/search/index.d.ts +1 -1
- package/dist/types/web/search/providers/anthropic.d.ts +1 -0
- package/dist/types/web/search/providers/base.d.ts +2 -0
- package/dist/types/web/search/providers/brave.d.ts +1 -0
- package/dist/types/web/search/providers/browser-page.d.ts +1 -0
- package/dist/types/web/search/providers/codex.d.ts +1 -0
- package/dist/types/web/search/providers/exa.d.ts +1 -0
- package/dist/types/web/search/providers/firecrawl.d.ts +1 -0
- package/dist/types/web/search/providers/gemini.d.ts +1 -0
- package/dist/types/web/search/providers/jina.d.ts +1 -0
- package/dist/types/web/search/providers/kagi.d.ts +1 -0
- package/dist/types/web/search/providers/kimi.d.ts +1 -0
- package/dist/types/web/search/providers/parallel.d.ts +1 -0
- package/dist/types/web/search/providers/perplexity.d.ts +1 -0
- package/dist/types/web/search/providers/searxng.d.ts +1 -0
- package/dist/types/web/search/providers/tavily.d.ts +1 -0
- package/dist/types/web/search/providers/tinyfish.d.ts +1 -0
- package/dist/types/web/search/providers/utils.d.ts +6 -9
- package/dist/types/web/search/providers/zai.d.ts +1 -0
- package/dist/types/web/search/types.d.ts +4 -0
- package/package.json +12 -12
- package/src/cli/args.ts +7 -87
- package/src/cli/browser-relay-cli.ts +119 -0
- package/src/cli/command-help.ts +103 -0
- package/src/cli/completion-gen.ts +5 -5
- package/src/cli/flag-tables.ts +9 -0
- package/src/cli/help-extra.ts +89 -0
- package/src/cli/setup-cli.ts +13 -21
- package/src/cli/thinking-levels.ts +7 -0
- package/src/cli/update-cli.ts +26 -7
- package/src/cli-commands.ts +170 -33
- package/src/cli.ts +17 -5
- package/src/commands/acp.ts +3 -1
- package/src/commands/agents.ts +3 -2
- package/src/commands/auth-broker.ts +3 -2
- package/src/commands/auth-gateway.ts +3 -2
- package/src/commands/bench.ts +2 -3
- package/src/commands/browser-relay.ts +53 -0
- package/src/commands/cleanse.ts +2 -2
- package/src/commands/commit.ts +3 -2
- package/src/commands/complete.ts +2 -1
- package/src/commands/completions.ts +3 -2
- package/src/commands/config.ts +3 -2
- package/src/commands/dry-balance.ts +2 -2
- package/src/commands/gallery.ts +3 -2
- package/src/commands/gc.ts +3 -2
- package/src/commands/grep.ts +3 -2
- package/src/commands/grievances.ts +3 -2
- package/src/commands/install.ts +2 -2
- package/src/commands/join.ts +3 -2
- package/src/commands/launch-help.ts +116 -0
- package/src/commands/launch.ts +7 -191
- package/src/commands/models.ts +3 -2
- package/src/commands/plugin.ts +3 -2
- package/src/commands/read.ts +3 -2
- package/src/commands/say.ts +3 -2
- package/src/commands/setup.ts +3 -2
- package/src/commands/shell.ts +3 -2
- package/src/commands/ssh.ts +3 -2
- package/src/commands/stats.ts +3 -2
- package/src/commands/tiny-models.ts +2 -2
- package/src/commands/token.ts +2 -2
- package/src/commands/ttsr.ts +2 -2
- package/src/commands/update.ts +3 -2
- package/src/commands/usage.ts +3 -2
- package/src/commands/web-search.ts +3 -2
- package/src/commands/worktree.ts +3 -2
- package/src/config/keybindings.ts +5 -0
- package/src/config/model-discovery.ts +30 -13
- package/src/config/model-registry.ts +9 -5
- package/src/config/models-config-schema-bundle.ts +9 -0
- package/src/config/resolve-config-value.ts +2 -1
- package/src/config/service-tier.ts +5 -0
- package/src/config/settings-schema.ts +72 -20
- package/src/cursor-bridge-tools.ts +1 -1
- package/src/cursor.ts +10 -14
- package/src/edit/diff.ts +17 -8
- package/src/edit/index.ts +20 -7
- package/src/edit/modes/replace.ts +93 -40
- package/src/edit/renderer.ts +1 -1
- package/src/edit/streaming.ts +14 -17
- package/src/eval/py/kernel.ts +2 -1
- package/src/eval/py/spawn-options.ts +24 -29
- package/src/export/html/template.js +8 -26
- package/src/extensibility/extensions/wrapper.ts +1 -0
- package/src/extensibility/legacy-pi-ai-shim.ts +22 -1
- package/src/extensibility/legacy-pi-coding-agent-shim.ts +7 -6
- package/src/extensibility/plugins/legacy-pi-compat.ts +124 -57
- package/src/extensibility/skills.ts +11 -0
- package/src/extensibility/utils.ts +10 -2
- package/src/launch/broker.ts +1 -1
- package/src/launch/client.ts +32 -13
- package/src/launch/ensure.ts +73 -0
- package/src/launch/paths.ts +1 -1
- package/src/launch/protocol.ts +2 -2
- package/src/lsp/client.ts +23 -2
- package/src/lsp/index.ts +8 -0
- package/src/lsp/mux/daemon.ts +348 -0
- package/src/lsp/mux/protocol.ts +96 -0
- package/src/lsp/mux/server.ts +797 -0
- package/src/lsp/types.ts +28 -2
- package/src/main.ts +7 -2
- package/src/mcp/oauth-flow.ts +11 -1
- package/src/mnemopi/embed-client.ts +49 -2
- package/src/mnemopi/state.ts +57 -23
- package/src/modes/components/assistant-message.ts +11 -0
- package/src/modes/components/chat-transcript-builder.ts +4 -0
- package/src/modes/components/custom-editor.ts +9 -0
- package/src/modes/components/read-tool-group.ts +10 -0
- package/src/modes/components/status-line/component.ts +1 -1
- package/src/modes/components/stripped-tool-calls-placeholder.ts +35 -0
- package/src/modes/components/tool-execution.ts +8 -0
- package/src/modes/components/tree-selector.ts +46 -48
- package/src/modes/controllers/event-controller.ts +17 -0
- package/src/modes/controllers/input-controller.ts +39 -1
- package/src/modes/controllers/mcp-command-controller.ts +11 -5
- package/src/modes/controllers/selector-controller.ts +20 -0
- package/src/modes/interactive-mode.ts +2 -0
- package/src/modes/types.ts +1 -0
- package/src/modes/utils/hotkeys-markdown.ts +1 -0
- package/src/modes/utils/interactive-context-helpers.ts +1 -0
- package/src/modes/utils/ui-helpers.ts +6 -10
- package/src/modes/workflow.ts +8 -2
- package/src/prompts/agents/init.md +1 -1
- package/src/prompts/system/plan-mode-active.md +2 -2
- package/src/prompts/system/system-prompt.md +26 -52
- package/src/prompts/system/workflow-notice.md +3 -3
- package/src/prompts/tools/ast-grep.md +1 -1
- package/src/prompts/tools/bash.md +1 -1
- package/src/prompts/tools/browser.md +1 -0
- package/src/prompts/tools/computer.md +21 -21
- package/src/prompts/tools/glob.md +1 -1
- package/src/prompts/tools/grep.md +1 -1
- package/src/prompts/tools/replace.md +5 -4
- package/src/prompts/tools/task.md +4 -4
- package/src/sdk.ts +34 -6
- package/src/secrets/index.ts +1 -1
- package/src/session/agent-session-types.ts +3 -1
- package/src/session/agent-session.ts +13 -1
- package/src/session/indexed-session-storage.ts +9 -0
- package/src/session/prewalk.ts +24 -2
- package/src/session/session-advisors.ts +2 -2
- package/src/session/session-context.ts +16 -12
- package/src/session/session-dump-format.ts +1 -1
- package/src/session/session-maintenance.ts +38 -4
- package/src/session/session-manager.ts +102 -67
- package/src/session/session-paths.ts +118 -55
- package/src/session/session-stats.ts +48 -3
- package/src/session/session-storage.ts +30 -22
- package/src/session/stream-guards.ts +1 -1
- package/src/slash-commands/builtin-registry.ts +27 -24
- package/src/system-prompt.ts +8 -3
- package/src/task/index.ts +23 -8
- package/src/task/spawn-policy.ts +14 -0
- package/src/thinking.ts +2 -8
- package/src/tools/ast-grep.ts +10 -4
- package/src/tools/browser/cmux/cmux-tab.ts +5 -10
- package/src/tools/browser/cmux/rpc.ts +2 -8
- package/src/tools/browser/registry.ts +53 -2
- package/src/tools/browser/relay/bridge.ts +945 -0
- package/src/tools/browser/relay/daemon.ts +117 -0
- package/src/tools/browser/relay/extension-assets/background.js.txt +242 -0
- package/src/tools/browser/relay/extension-assets/manifest.json.txt +14 -0
- package/src/tools/browser/relay/extension-assets/options.html.txt +53 -0
- package/src/tools/browser/relay/extension-assets/options.js.txt +23 -0
- package/src/tools/browser/relay/kind.ts +41 -0
- package/src/tools/browser/relay/protocol.ts +54 -0
- package/src/tools/browser/relay/server.ts +141 -0
- package/src/tools/browser/render.ts +4 -1
- package/src/tools/browser/shared-daemon.ts +7 -58
- package/src/tools/browser/tab-supervisor.ts +5 -4
- package/src/tools/browser/tab-worker.ts +33 -12
- package/src/tools/browser.ts +26 -1
- package/src/tools/computer/exposure.ts +11 -35
- package/src/tools/computer/protocol.ts +51 -10
- package/src/tools/computer/supervisor.ts +227 -124
- package/src/tools/computer/worker-entry.ts +11 -6
- package/src/tools/computer/worker.ts +695 -81
- package/src/tools/computer-renderer.ts +104 -65
- package/src/tools/computer.ts +134 -428
- package/src/tools/context.ts +3 -0
- package/src/tools/glob.ts +9 -2
- package/src/tools/grep.ts +12 -6
- package/src/tools/inspect-image.ts +32 -6
- package/src/tools/render-utils.ts +2 -0
- package/src/tools/{browser/run-cancellation.ts → run-scope.ts} +11 -11
- package/src/tools/tool-timeouts.ts +1 -0
- package/src/tools/xdev.ts +29 -2
- package/src/utils/clipboard.ts +40 -14
- package/src/utils/command-args.ts +26 -28
- package/src/utils/tool-choice.ts +0 -13
- package/src/web/kagi.ts +2 -1
- package/src/web/search/index.ts +18 -2
- package/src/web/search/providers/anthropic.ts +4 -1
- package/src/web/search/providers/base.ts +2 -0
- package/src/web/search/providers/brave.ts +3 -1
- package/src/web/search/providers/browser-page.ts +6 -4
- package/src/web/search/providers/codex.ts +4 -1
- package/src/web/search/providers/duckduckgo.ts +2 -1
- package/src/web/search/providers/ecosia.ts +2 -1
- package/src/web/search/providers/exa.ts +4 -2
- package/src/web/search/providers/firecrawl.ts +3 -1
- package/src/web/search/providers/gemini.ts +8 -2
- package/src/web/search/providers/google.ts +2 -1
- package/src/web/search/providers/jina.ts +12 -2
- package/src/web/search/providers/kagi.ts +3 -0
- package/src/web/search/providers/kimi.ts +5 -1
- package/src/web/search/providers/mojeek.ts +2 -1
- package/src/web/search/providers/parallel.ts +5 -1
- package/src/web/search/providers/perplexity.ts +6 -3
- package/src/web/search/providers/public.ts +1 -1
- package/src/web/search/providers/searxng.ts +11 -5
- package/src/web/search/providers/startpage.ts +10 -4
- package/src/web/search/providers/synthetic.ts +11 -5
- package/src/web/search/providers/tavily.ts +3 -1
- package/src/web/search/providers/tinyfish.ts +3 -1
- package/src/web/search/providers/utils.ts +12 -10
- package/src/web/search/providers/xai.ts +2 -2
- package/src/web/search/providers/zai.ts +18 -3
- package/src/web/search/types.ts +6 -0
package/src/thinking.ts
CHANGED
|
@@ -3,6 +3,8 @@ import { Effort, type Model, THINKING_EFFORTS } from "@oh-my-pi/pi-ai";
|
|
|
3
3
|
import { clampThinkingLevelForModel, getSupportedEfforts } from "@oh-my-pi/pi-catalog/model-thinking";
|
|
4
4
|
import { modelsAreEqual } from "@oh-my-pi/pi-catalog/models";
|
|
5
5
|
|
|
6
|
+
export { CLI_THINKING_LEVELS } from "./cli/thinking-levels";
|
|
7
|
+
|
|
6
8
|
/**
|
|
7
9
|
* Metadata used to render thinking selector values in the coding-agent UI.
|
|
8
10
|
*/
|
|
@@ -209,14 +211,6 @@ export function getConfiguredThinkingLevelMetadata(level: ConfiguredThinkingLeve
|
|
|
209
211
|
return level === AUTO_THINKING ? AUTO_THINKING_METADATA : getThinkingLevelMetadata(level);
|
|
210
212
|
}
|
|
211
213
|
|
|
212
|
-
/**
|
|
213
|
-
* Thinking selectors accepted by the `--thinking` CLI flag, in display order:
|
|
214
|
-
* `off`, every concrete effort (`minimal`..`max`), then `auto`. Single source
|
|
215
|
-
* for the flag's `options` list, shell completions, and the "invalid level"
|
|
216
|
-
* warning so all three stay in sync.
|
|
217
|
-
*/
|
|
218
|
-
export const CLI_THINKING_LEVELS: readonly string[] = [ThinkingLevel.Off, ...THINKING_EFFORTS, AUTO_THINKING];
|
|
219
|
-
|
|
220
214
|
/**
|
|
221
215
|
* Parses a `--thinking` CLI value. Accepts every {@link parseConfiguredThinkingLevel}
|
|
222
216
|
* selector (`off`, `auto`, `minimal`..`max`) but rejects
|
package/src/tools/ast-grep.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { recordFileSnapshot, recordSeenLinesFromBody } from "../edit/file-snapsh
|
|
|
11
11
|
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
|
|
12
12
|
import type { Theme } from "../modes/theme/theme";
|
|
13
13
|
import astGrepDescription from "../prompts/tools/ast-grep.md" with { type: "text" };
|
|
14
|
+
import { isScoutSpawnable } from "../task/spawn-policy";
|
|
14
15
|
import { Ellipsis, fileHyperlink, renderStatusLine, renderTreeList, truncateToWidth } from "../tui";
|
|
15
16
|
import { resolveFileDisplayMode } from "../utils/file-display-mode";
|
|
16
17
|
import type { ToolSession } from ".";
|
|
@@ -150,7 +151,14 @@ export class AstGrepTool implements AgentTool<typeof astGrepSchema, AstGrepToolD
|
|
|
150
151
|
readonly approval = "read" as const;
|
|
151
152
|
readonly label = "AST Grep";
|
|
152
153
|
readonly summary = "Search code with AST patterns (structural grep)";
|
|
153
|
-
|
|
154
|
+
get description(): string {
|
|
155
|
+
return prompt.render(astGrepDescription, {
|
|
156
|
+
scoutAvailable: isScoutSpawnable(
|
|
157
|
+
this.session.settings.get("task.disabledAgents") as string[] | undefined,
|
|
158
|
+
this.session.getSessionSpawns?.() ?? "*",
|
|
159
|
+
),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
154
162
|
readonly parameters = astGrepSchema;
|
|
155
163
|
readonly strict = true;
|
|
156
164
|
|
|
@@ -178,9 +186,7 @@ export class AstGrepTool implements AgentTool<typeof astGrepSchema, AstGrepToolD
|
|
|
178
186
|
];
|
|
179
187
|
readonly loadMode = "discoverable";
|
|
180
188
|
|
|
181
|
-
constructor(private readonly session: ToolSession) {
|
|
182
|
-
this.description = prompt.render(astGrepDescription);
|
|
183
|
-
}
|
|
189
|
+
constructor(private readonly session: ToolSession) {}
|
|
184
190
|
|
|
185
191
|
async execute(
|
|
186
192
|
_toolCallId: string,
|
|
@@ -8,16 +8,11 @@ import { resizeImage } from "../../../utils/image-resize";
|
|
|
8
8
|
import type { ToolSession } from "../../index";
|
|
9
9
|
import { resolveToCwd } from "../../path-utils";
|
|
10
10
|
import { formatScreenshot } from "../../render-utils";
|
|
11
|
+
import { bindRunFacade, resolvePredicateTimeout, type WaitPredicateOptions, waitForRun } from "../../run-scope";
|
|
11
12
|
import { ToolAbortError, ToolError, throwIfAborted } from "../../tool-errors";
|
|
12
13
|
import { type AriaSnapshotOptions, assertSelectorString, buildAriaSnapshotScript } from "../aria/aria-snapshot";
|
|
13
14
|
import { DEFAULT_VIEWPORT } from "../launch";
|
|
14
15
|
import { extractReadableFromHtml, type ReadableFormat } from "../readable";
|
|
15
|
-
import {
|
|
16
|
-
bindBrowserRunFacade,
|
|
17
|
-
resolvePredicateTimeout,
|
|
18
|
-
type WaitPredicateOptions,
|
|
19
|
-
waitForBrowserRun,
|
|
20
|
-
} from "../run-cancellation";
|
|
21
16
|
import { cloneSafe, RunOutput } from "../run-output";
|
|
22
17
|
import type { Observation, ReadyInfo, RunResultOk, ScreenshotResult, SessionSnapshot } from "../tab-protocol";
|
|
23
18
|
import {
|
|
@@ -1345,16 +1340,16 @@ export async function runCmuxCode(tab: CmuxTab, opts: RunCmuxCodeOptions): Promi
|
|
|
1345
1340
|
// Keep both inside try so a concurrent in-process eval/browser run surfaces as
|
|
1346
1341
|
// a rejected promise the supervisor can report, never an unhandled rejection.
|
|
1347
1342
|
runtime.setCwd(opts.snapshot.cwd);
|
|
1348
|
-
const runTab =
|
|
1343
|
+
const runTab = bindRunFacade(tab, signal);
|
|
1349
1344
|
runtime.setRunScope({
|
|
1350
|
-
page:
|
|
1351
|
-
browser:
|
|
1345
|
+
page: bindRunFacade(tab.page, signal),
|
|
1346
|
+
browser: bindRunFacade(tab.browser, signal),
|
|
1352
1347
|
tab: runTab,
|
|
1353
1348
|
assert: (cond: unknown, text?: string): void => {
|
|
1354
1349
|
if (!cond) throw new ToolError(text ?? "Assertion failed");
|
|
1355
1350
|
},
|
|
1356
1351
|
wait: (msOrPredicate: number | (() => unknown), waitOpts?: WaitPredicateOptions): Promise<unknown> =>
|
|
1357
|
-
|
|
1352
|
+
waitForRun(
|
|
1358
1353
|
msOrPredicate,
|
|
1359
1354
|
signal,
|
|
1360
1355
|
typeof msOrPredicate === "number"
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseFlag } from "@oh-my-pi/pi-utils";
|
|
1
2
|
import { ToolError } from "../../tool-errors";
|
|
2
3
|
import type { Observation, ObservationEntry } from "../tab-protocol";
|
|
3
4
|
|
|
@@ -174,13 +175,6 @@ export function mapWaitUntil(waitUntil: string | undefined): "interactive" | "co
|
|
|
174
175
|
return waitUntil === "domcontentloaded" ? "interactive" : "complete";
|
|
175
176
|
}
|
|
176
177
|
|
|
177
|
-
const TRUTHY_ENV_VALUES = new Set(["1", "Y", "y", "TRUE", "true", "YES", "yes", "ON", "on"]);
|
|
178
|
-
|
|
179
|
-
function resolveCmuxEnabled(envValue: string | undefined, settingEnabled: boolean): boolean {
|
|
180
|
-
if (!envValue) return settingEnabled;
|
|
181
|
-
return TRUTHY_ENV_VALUES.has(envValue);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
178
|
export interface ResolveCmuxKindOptions {
|
|
185
179
|
surface?: string;
|
|
186
180
|
settingEnabled?: boolean;
|
|
@@ -190,7 +184,7 @@ export function resolveCmuxKind(
|
|
|
190
184
|
options?: ResolveCmuxKindOptions | null,
|
|
191
185
|
env: Record<string, string | undefined> = process.env,
|
|
192
186
|
): CmuxKind | null {
|
|
193
|
-
if (!
|
|
187
|
+
if (!parseFlag(env.PI_BROWSER_CMUX, options?.settingEnabled ?? true)) {
|
|
194
188
|
return null;
|
|
195
189
|
}
|
|
196
190
|
const socketPath = env.CMUX_SOCKET_PATH;
|
|
@@ -14,12 +14,15 @@ import {
|
|
|
14
14
|
removeUserDataDir,
|
|
15
15
|
type UserAgentOverride,
|
|
16
16
|
} from "./launch";
|
|
17
|
+
import { ensureRelayDaemon, isLoopbackRelayUrl } from "./relay/daemon";
|
|
18
|
+
import type { RelayKind } from "./relay/kind";
|
|
17
19
|
import { ensureSharedBrowser } from "./shared-daemon";
|
|
18
20
|
|
|
19
21
|
export type PuppeteerBrowserKind =
|
|
20
22
|
| { kind: "headless"; headless: boolean }
|
|
21
23
|
| { kind: "spawned"; path: string }
|
|
22
|
-
| { kind: "connected"; cdpUrl: string }
|
|
24
|
+
| { kind: "connected"; cdpUrl: string }
|
|
25
|
+
| RelayKind;
|
|
23
26
|
|
|
24
27
|
export type BrowserKind = PuppeteerBrowserKind | CmuxKind;
|
|
25
28
|
|
|
@@ -31,6 +34,12 @@ export type BrowserKindTag = BrowserKind["kind"];
|
|
|
31
34
|
* forever (issue #5260), so we cap the wait and force-kill on timeout.
|
|
32
35
|
*/
|
|
33
36
|
const HEADLESS_CLOSE_TIMEOUT_MS = 5_000;
|
|
37
|
+
/**
|
|
38
|
+
* How long a relay open waits for the extension handshake (503 → 200). A
|
|
39
|
+
* reaped extension service worker is revived by its 30s keepalive alarm, so
|
|
40
|
+
* the wait must cover one full alarm period plus the dial.
|
|
41
|
+
*/
|
|
42
|
+
const RELAY_EXTENSION_WAIT_MS = 35_000;
|
|
34
43
|
|
|
35
44
|
interface BrowserHandleCommon {
|
|
36
45
|
key: string;
|
|
@@ -78,6 +87,8 @@ function browserKey(kind: BrowserKind): string {
|
|
|
78
87
|
return `spawned:${kind.path}`;
|
|
79
88
|
case "connected":
|
|
80
89
|
return `connected:${kind.cdpUrl}`;
|
|
90
|
+
case "relay":
|
|
91
|
+
return `relay:${kind.cdpUrl}`;
|
|
81
92
|
case "cmux":
|
|
82
93
|
return `cmux:${kind.socketPath}`;
|
|
83
94
|
}
|
|
@@ -201,6 +212,45 @@ async function openBrowserHandle(kind: BrowserKind, opts: AcquireBrowserOptions)
|
|
|
201
212
|
stealth: { browserSession: null, override: null },
|
|
202
213
|
};
|
|
203
214
|
}
|
|
215
|
+
if (kind.kind === "relay") {
|
|
216
|
+
const cdpUrl = normalizeConnectedCdpUrl(kind.cdpUrl);
|
|
217
|
+
// Loopback relays are owned by a machine-global broker and auto-started
|
|
218
|
+
// on demand (the extension dials in on its own). Hosts without a CLI
|
|
219
|
+
// worker entry (bun test, SDK embedding) never spawn brokers. Remote
|
|
220
|
+
// relay URLs must already be serving.
|
|
221
|
+
let autoStarted = false;
|
|
222
|
+
if (isLoopbackRelayUrl(cdpUrl) && (isCompiledBinary() || workerHostEntry() !== null)) {
|
|
223
|
+
autoStarted = await ensureRelayDaemon({ cdpUrl, signal: opts.signal });
|
|
224
|
+
}
|
|
225
|
+
// The relay answers /json/version with 503 until its extension dials in.
|
|
226
|
+
// A freshly revived extension service worker can take up to ~30s (its
|
|
227
|
+
// keepalive alarm) to reconnect, so give the handshake that long.
|
|
228
|
+
try {
|
|
229
|
+
await waitForCdp(cdpUrl, RELAY_EXTENSION_WAIT_MS, opts.signal);
|
|
230
|
+
} catch (err) {
|
|
231
|
+
if (err instanceof ToolAbortError) throw err;
|
|
232
|
+
if (err instanceof Error && err.name === "AbortError") throw err;
|
|
233
|
+
throw new ToolError(
|
|
234
|
+
autoStarted
|
|
235
|
+
? `omp browser relay is serving at ${cdpUrl} but its extension never connected. Install it with \`omp browser-relay install\` and check the toolbar badge shows "on".`
|
|
236
|
+
: `omp browser relay is not reachable at ${cdpUrl}. Start it with \`omp browser-relay\` (or check the endpoint), and make sure the OMP Browser Relay extension is loaded in Chrome.`,
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
const puppeteer = await loadPuppeteer();
|
|
240
|
+
const browser = await puppeteer.connect({
|
|
241
|
+
browserURL: cdpUrl,
|
|
242
|
+
defaultViewport: null,
|
|
243
|
+
protocolTimeout: BROWSER_PROTOCOL_TIMEOUT_MS,
|
|
244
|
+
});
|
|
245
|
+
return {
|
|
246
|
+
key: browserKey(kind),
|
|
247
|
+
kind,
|
|
248
|
+
browser,
|
|
249
|
+
cdpUrl,
|
|
250
|
+
refCount: 0,
|
|
251
|
+
stealth: { browserSession: null, override: null },
|
|
252
|
+
};
|
|
253
|
+
}
|
|
204
254
|
|
|
205
255
|
const exe = kind.path;
|
|
206
256
|
if (!path.isAbsolute(exe)) {
|
|
@@ -320,7 +370,8 @@ async function disposeBrowserHandle(handle: BrowserHandle, opts: ReleaseBrowserO
|
|
|
320
370
|
if (handle.userDataDir) await removeUserDataDir(handle.userDataDir);
|
|
321
371
|
return;
|
|
322
372
|
}
|
|
323
|
-
|
|
373
|
+
// Connected and relay browsers belong to the user: drop our CDP link, never kill.
|
|
374
|
+
if (handle.kind.kind === "connected" || handle.kind.kind === "relay") {
|
|
324
375
|
if (handle.browser.connected) {
|
|
325
376
|
try {
|
|
326
377
|
handle.browser.disconnect();
|