@kr78/pi-coding-agent 17.2.10
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 +14861 -0
- package/README.md +35 -0
- package/dist/CHANGELOG-chtdxh1z.md +14861 -0
- package/dist/cli.js +20483 -0
- package/dist/template-c2hyaytt.js +1653 -0
- package/dist/template-f8wx9vfn.css +1355 -0
- package/dist/template-qat058wr.html +55 -0
- package/dist/tool-views.generated-jdfmzwmn.js +35 -0
- package/examples/README.md +21 -0
- package/examples/custom-tools/README.md +104 -0
- package/examples/custom-tools/hello/index.ts +20 -0
- package/examples/extensions/README.md +142 -0
- package/examples/extensions/api-demo.ts +78 -0
- package/examples/extensions/chalk-logger.ts +25 -0
- package/examples/extensions/hello.ts +31 -0
- package/examples/extensions/pirate.ts +43 -0
- package/examples/extensions/plan-mode.ts +549 -0
- package/examples/extensions/reload-runtime.ts +38 -0
- package/examples/extensions/thinking-note.ts +13 -0
- package/examples/extensions/tools.ts +145 -0
- package/examples/extensions/with-deps/index.ts +36 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +17 -0
- package/examples/hooks/README.md +56 -0
- package/examples/hooks/auto-commit-on-exit.ts +48 -0
- package/examples/hooks/confirm-destructive.ts +58 -0
- package/examples/hooks/custom-compaction.ts +115 -0
- package/examples/hooks/dirty-repo-guard.ts +51 -0
- package/examples/hooks/file-trigger.ts +40 -0
- package/examples/hooks/git-checkpoint.ts +52 -0
- package/examples/hooks/handoff.ts +149 -0
- package/examples/hooks/permission-gate.ts +33 -0
- package/examples/hooks/protected-paths.ts +29 -0
- package/examples/hooks/qna.ts +118 -0
- package/examples/hooks/status-line.ts +39 -0
- package/examples/sdk/01-minimal.ts +21 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +46 -0
- package/examples/sdk/04-skills.ts +43 -0
- package/examples/sdk/06-extensions.ts +82 -0
- package/examples/sdk/06-hooks.ts +61 -0
- package/examples/sdk/07-context-files.ts +35 -0
- package/examples/sdk/08-prompt-templates.ts +41 -0
- package/examples/sdk/08-slash-commands.ts +46 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
- package/examples/sdk/11-sessions.ts +47 -0
- package/examples/sdk/12-redis-sessions.ts +54 -0
- package/examples/sdk/13-sql-sessions.ts +61 -0
- package/examples/sdk/README.md +169 -0
- package/package.json +587 -0
- package/scripts/bench-guard.ts +71 -0
- package/scripts/bench-title-models.ts +332 -0
- package/scripts/build-binary.ts +117 -0
- package/scripts/bundle-dist.ts +123 -0
- package/scripts/compile-binary.ts +69 -0
- package/scripts/embed-mupdf-wasm.ts +67 -0
- package/scripts/format-prompts.ts +68 -0
- package/scripts/generate-aria-snapshot.ts +134 -0
- package/scripts/generate-docs-index.ts +58 -0
- package/scripts/generate-share-viewer.ts +34 -0
- package/scripts/legacy-pi-virtual-module.ts +205 -0
- package/scripts/measure-prompt-tokens.ts +63 -0
- package/scripts/omp +51 -0
- package/scripts/omp.ts +19 -0
- package/scripts/security-compare.ts +40 -0
- package/src/advisor/advise-tool.ts +234 -0
- package/src/advisor/config.ts +341 -0
- package/src/advisor/emission-guard.ts +172 -0
- package/src/advisor/index.ts +6 -0
- package/src/advisor/runtime.ts +1412 -0
- package/src/advisor/transcript-recorder.ts +215 -0
- package/src/advisor/watchdog.ts +135 -0
- package/src/async/index.ts +1 -0
- package/src/async/job-manager.ts +847 -0
- package/src/auto-thinking/classifier.ts +220 -0
- package/src/autolearn/controller.ts +152 -0
- package/src/autolearn/managed-skills.ts +255 -0
- package/src/autoresearch/command-resume.md +14 -0
- package/src/autoresearch/dashboard.ts +436 -0
- package/src/autoresearch/git.ts +331 -0
- package/src/autoresearch/helpers.ts +218 -0
- package/src/autoresearch/index.ts +541 -0
- package/src/autoresearch/prompt-setup.md +43 -0
- package/src/autoresearch/prompt.md +103 -0
- package/src/autoresearch/resume-message.md +10 -0
- package/src/autoresearch/state.ts +273 -0
- package/src/autoresearch/storage.ts +700 -0
- package/src/autoresearch/tools/init-experiment.ts +268 -0
- package/src/autoresearch/tools/log-experiment.ts +520 -0
- package/src/autoresearch/tools/run-experiment.ts +407 -0
- package/src/autoresearch/tools/update-notes.ts +109 -0
- package/src/autoresearch/types.ts +168 -0
- package/src/capability/context-file.ts +44 -0
- package/src/capability/extension-module.ts +34 -0
- package/src/capability/extension.ts +47 -0
- package/src/capability/fs.ts +117 -0
- package/src/capability/hook.ts +40 -0
- package/src/capability/index.ts +467 -0
- package/src/capability/instruction.ts +37 -0
- package/src/capability/mcp.ts +115 -0
- package/src/capability/prompt.ts +35 -0
- package/src/capability/rule-buckets.ts +66 -0
- package/src/capability/rule.ts +298 -0
- package/src/capability/settings.ts +34 -0
- package/src/capability/skill.ts +69 -0
- package/src/capability/slash-command.ts +40 -0
- package/src/capability/ssh.ts +41 -0
- package/src/capability/system-prompt.ts +34 -0
- package/src/capability/tool.ts +38 -0
- package/src/capability/types.ts +187 -0
- package/src/cleanse/agent.ts +226 -0
- package/src/cleanse/balance.ts +79 -0
- package/src/cleanse/checkers.ts +996 -0
- package/src/cleanse/index.ts +190 -0
- package/src/cleanse/loop.ts +51 -0
- package/src/cleanse/parsers.ts +726 -0
- package/src/cleanse/progress.ts +50 -0
- package/src/cleanse/prompts/assignment.md +47 -0
- package/src/cleanse/types.ts +72 -0
- package/src/cli/agents-cli.ts +138 -0
- package/src/cli/args.ts +368 -0
- package/src/cli/auth-broker-cli.ts +940 -0
- package/src/cli/auth-gateway-cli.ts +674 -0
- package/src/cli/bench-cli.ts +990 -0
- package/src/cli/browser-relay-cli.ts +119 -0
- package/src/cli/classify-install-target.ts +76 -0
- package/src/cli/claude-trace-cli.ts +795 -0
- package/src/cli/command-help.ts +107 -0
- package/src/cli/commands/init-xdg.ts +27 -0
- package/src/cli/completion-gen.ts +550 -0
- package/src/cli/config-cli.ts +459 -0
- package/src/cli/dry-balance-cli.ts +864 -0
- package/src/cli/extension-flags.ts +48 -0
- package/src/cli/file-processor.ts +132 -0
- package/src/cli/flag-tables.ts +367 -0
- package/src/cli/gallery-cli.ts +272 -0
- package/src/cli/gallery-fixtures/agentic.ts +420 -0
- package/src/cli/gallery-fixtures/codeintel.ts +187 -0
- package/src/cli/gallery-fixtures/edit.ts +254 -0
- package/src/cli/gallery-fixtures/fs.ts +245 -0
- package/src/cli/gallery-fixtures/index.ts +40 -0
- package/src/cli/gallery-fixtures/interaction.ts +46 -0
- package/src/cli/gallery-fixtures/memory.ts +81 -0
- package/src/cli/gallery-fixtures/misc.ts +177 -0
- package/src/cli/gallery-fixtures/search.ts +135 -0
- package/src/cli/gallery-fixtures/shell.ts +241 -0
- package/src/cli/gallery-fixtures/types.ts +57 -0
- package/src/cli/gallery-fixtures/web.ts +158 -0
- package/src/cli/gallery-screenshot.ts +279 -0
- package/src/cli/gc-cli.ts +1566 -0
- package/src/cli/grep-cli.ts +161 -0
- package/src/cli/grievances-cli.ts +256 -0
- package/src/cli/help-extra.ts +89 -0
- package/src/cli/initial-message.ts +58 -0
- package/src/cli/models-cli.ts +385 -0
- package/src/cli/plugin-cli.ts +996 -0
- package/src/cli/profile-alias.ts +369 -0
- package/src/cli/profile-bootstrap.ts +233 -0
- package/src/cli/read-cli.ts +99 -0
- package/src/cli/session-picker.ts +110 -0
- package/src/cli/setup-cli.ts +312 -0
- package/src/cli/setup-model-picker.ts +43 -0
- package/src/cli/shell-cli.ts +176 -0
- package/src/cli/ssh-cli.ts +179 -0
- package/src/cli/startup-cwd.ts +58 -0
- package/src/cli/stats-cli.ts +229 -0
- package/src/cli/thinking-levels.ts +7 -0
- package/src/cli/tiny-models-cli.ts +153 -0
- package/src/cli/ttsr-cli.ts +1013 -0
- package/src/cli/update-cli.ts +1184 -0
- package/src/cli/usage-cli.ts +1084 -0
- package/src/cli/usage-error.ts +7 -0
- package/src/cli/web-search-cli.ts +144 -0
- package/src/cli/worktree-cli.ts +311 -0
- package/src/cli-commands.ts +308 -0
- package/src/cli.ts +428 -0
- package/src/collab/crypto.ts +63 -0
- package/src/collab/display-name.ts +13 -0
- package/src/collab/guest.ts +764 -0
- package/src/collab/host.ts +692 -0
- package/src/collab/protocol.ts +296 -0
- package/src/collab/relay-client.ts +282 -0
- package/src/collab/replication-shrink.ts +111 -0
- package/src/commands/acp.ts +35 -0
- package/src/commands/agents.ts +58 -0
- package/src/commands/auth-broker.ts +100 -0
- package/src/commands/auth-gateway.ts +70 -0
- package/src/commands/bench.ts +64 -0
- package/src/commands/browser-relay.ts +53 -0
- package/src/commands/cleanse.ts +45 -0
- package/src/commands/commit.ts +47 -0
- package/src/commands/complete.ts +67 -0
- package/src/commands/completions.ts +61 -0
- package/src/commands/config.ts +52 -0
- package/src/commands/dry-balance.ts +43 -0
- package/src/commands/gallery.ts +61 -0
- package/src/commands/gc.ts +47 -0
- package/src/commands/grep.ts +49 -0
- package/src/commands/grievances.ts +52 -0
- package/src/commands/install.ts +107 -0
- package/src/commands/join.ts +40 -0
- package/src/commands/launch-help.ts +116 -0
- package/src/commands/launch.ts +34 -0
- package/src/commands/models.ts +61 -0
- package/src/commands/plugin.ts +79 -0
- package/src/commands/read.ts +39 -0
- package/src/commands/say.ts +146 -0
- package/src/commands/setup.ts +68 -0
- package/src/commands/share.ts +71 -0
- package/src/commands/shell.ts +30 -0
- package/src/commands/ssh.ts +61 -0
- package/src/commands/stats.ts +30 -0
- package/src/commands/tiny-models.ts +36 -0
- package/src/commands/token.ts +164 -0
- package/src/commands/ttsr.ts +125 -0
- package/src/commands/update.ts +34 -0
- package/src/commands/usage.ts +55 -0
- package/src/commands/web-search.ts +43 -0
- package/src/commands/worktree.ts +63 -0
- package/src/commit/agentic/agent.ts +322 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +383 -0
- package/src/commit/agentic/lock-files.ts +107 -0
- package/src/commit/agentic/prompts/analyze-file.md +22 -0
- package/src/commit/agentic/prompts/session-user.md +25 -0
- package/src/commit/agentic/prompts/split-confirm.md +1 -0
- package/src/commit/agentic/prompts/system.md +38 -0
- package/src/commit/agentic/state.ts +60 -0
- package/src/commit/agentic/tools/analyze-file.ts +148 -0
- package/src/commit/agentic/tools/git-file-diff.ts +191 -0
- package/src/commit/agentic/tools/git-hunk.ts +52 -0
- package/src/commit/agentic/tools/git-overview.ts +62 -0
- package/src/commit/agentic/tools/index.ts +54 -0
- package/src/commit/agentic/tools/propose-changelog.ts +147 -0
- package/src/commit/agentic/tools/propose-commit.ts +109 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/schemas.ts +11 -0
- package/src/commit/agentic/tools/split-commit.ts +241 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +183 -0
- package/src/commit/analysis/conventional.ts +64 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +107 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +40 -0
- package/src/commit/changelog/generate.ts +101 -0
- package/src/commit/changelog/index.ts +234 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +85 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +69 -0
- package/src/commit/map-reduce/map-phase.ts +193 -0
- package/src/commit/map-reduce/reduce-phase.ts +49 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +95 -0
- package/src/commit/pipeline.ts +244 -0
- package/src/commit/prompts/analysis-system.md +148 -0
- package/src/commit/prompts/analysis-user.md +38 -0
- package/src/commit/prompts/changelog-system.md +50 -0
- package/src/commit/prompts/changelog-user.md +18 -0
- package/src/commit/prompts/file-observer-system.md +24 -0
- package/src/commit/prompts/file-observer-user.md +8 -0
- package/src/commit/prompts/reduce-system.md +50 -0
- package/src/commit/prompts/reduce-user.md +17 -0
- package/src/commit/prompts/summary-retry.md +3 -0
- package/src/commit/prompts/summary-system.md +38 -0
- package/src/commit/prompts/summary-user.md +13 -0
- package/src/commit/prompts/types-description.md +2 -0
- package/src/commit/shared-llm.ts +70 -0
- package/src/commit/types.ts +118 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/commit/utils.ts +58 -0
- package/src/config/api-key-resolver.ts +81 -0
- package/src/config/append-only-context-mode.ts +76 -0
- package/src/config/config-file.ts +347 -0
- package/src/config/inline-tool-descriptors-mode.ts +26 -0
- package/src/config/keybindings.ts +703 -0
- package/src/config/mcp-schema.json +252 -0
- package/src/config/model-discovery.ts +1077 -0
- package/src/config/model-registry.ts +2822 -0
- package/src/config/model-resolver.ts +2115 -0
- package/src/config/model-roles.ts +113 -0
- package/src/config/models-config-schema-bundle.ts +315 -0
- package/src/config/models-config-schema.ts +14 -0
- package/src/config/models-config.ts +130 -0
- package/src/config/prompt-templates.ts +205 -0
- package/src/config/provider-globals.ts +25 -0
- package/src/config/resolve-config-value.ts +95 -0
- package/src/config/service-tier.ts +146 -0
- package/src/config/settings-schema.ts +5887 -0
- package/src/config/settings.ts +2394 -0
- package/src/config.ts +242 -0
- package/src/cursor-bridge-tools.ts +81 -0
- package/src/cursor.ts +960 -0
- package/src/dap/client.ts +1043 -0
- package/src/dap/config.ts +480 -0
- package/src/dap/defaults.json +212 -0
- package/src/dap/index.ts +4 -0
- package/src/dap/session.ts +1841 -0
- package/src/dap/types.ts +611 -0
- package/src/debug/index.ts +584 -0
- package/src/debug/log-formatting.ts +58 -0
- package/src/debug/log-viewer.ts +966 -0
- package/src/debug/profiler.ts +168 -0
- package/src/debug/protocol-probe.ts +267 -0
- package/src/debug/raw-sse-buffer.ts +421 -0
- package/src/debug/raw-sse.ts +312 -0
- package/src/debug/remote-debugger.ts +151 -0
- package/src/debug/report-bundle.ts +411 -0
- package/src/debug/system-info.ts +111 -0
- package/src/debug/terminal-info.ts +124 -0
- package/src/discovery/agent-plugin-format.ts +551 -0
- package/src/discovery/agent-plugins.ts +341 -0
- package/src/discovery/agents-md.ts +67 -0
- package/src/discovery/agents.ts +300 -0
- package/src/discovery/at-imports.ts +273 -0
- package/src/discovery/builtin-defaults.ts +39 -0
- package/src/discovery/builtin-rules/go-add-cleanup.md +33 -0
- package/src/discovery/builtin-rules/go-bench-loop.md +36 -0
- package/src/discovery/builtin-rules/go-exp-promoted.md +40 -0
- package/src/discovery/builtin-rules/go-ioutil.md +37 -0
- package/src/discovery/builtin-rules/go-join-hostport.md +30 -0
- package/src/discovery/builtin-rules/go-new-expr.md +44 -0
- package/src/discovery/builtin-rules/go-rand-v2.md +41 -0
- package/src/discovery/builtin-rules/go-range-int.md +45 -0
- package/src/discovery/builtin-rules/index.ts +74 -0
- package/src/discovery/builtin-rules/rs-box-leak.md +49 -0
- package/src/discovery/builtin-rules/rs-future-prelude.md +24 -0
- package/src/discovery/builtin-rules/rs-lazylock.md +52 -0
- package/src/discovery/builtin-rules/rs-match-ergonomics.md +68 -0
- package/src/discovery/builtin-rules/rs-parking-lot.md +45 -0
- package/src/discovery/builtin-rules/rs-result-type.md +20 -0
- package/src/discovery/builtin-rules/ts-bare-catch.md +39 -0
- package/src/discovery/builtin-rules/ts-import-type.md +43 -0
- package/src/discovery/builtin-rules/ts-no-any.md +66 -0
- package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +45 -0
- package/src/discovery/builtin-rules/ts-no-dynamic-import.md +40 -0
- package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +56 -0
- package/src/discovery/builtin-rules/ts-no-local-is-record.md +48 -0
- package/src/discovery/builtin-rules/ts-no-return-type.md +45 -0
- package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
- package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
- package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +66 -0
- package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
- package/src/discovery/builtin-rules/ts-set-map.md +28 -0
- package/src/discovery/builtin.ts +945 -0
- package/src/discovery/claude-plugins.ts +640 -0
- package/src/discovery/claude.ts +591 -0
- package/src/discovery/cline.ts +83 -0
- package/src/discovery/codex.ts +553 -0
- package/src/discovery/contained-path.ts +78 -0
- package/src/discovery/cursor.ts +223 -0
- package/src/discovery/gemini.ts +386 -0
- package/src/discovery/github.ts +337 -0
- package/src/discovery/helpers.ts +1183 -0
- package/src/discovery/index.ts +82 -0
- package/src/discovery/mcp-json.ts +182 -0
- package/src/discovery/omp-extension-roots.ts +272 -0
- package/src/discovery/omp-plugins.ts +409 -0
- package/src/discovery/opencode.ts +441 -0
- package/src/discovery/plugin-dir-roots.ts +28 -0
- package/src/discovery/ssh.ts +153 -0
- package/src/discovery/substitute-plugin-root.ts +77 -0
- package/src/discovery/vscode.ts +106 -0
- package/src/discovery/windsurf.ts +149 -0
- package/src/edit/apply-patch/index.ts +87 -0
- package/src/edit/apply-patch/parser.ts +174 -0
- package/src/edit/diff.ts +1008 -0
- package/src/edit/edit-clipboard.ts +23 -0
- package/src/edit/file-snapshot-store.ts +148 -0
- package/src/edit/hashline/block-resolver.ts +33 -0
- package/src/edit/hashline/diff.ts +402 -0
- package/src/edit/hashline/execute.ts +313 -0
- package/src/edit/hashline/filesystem.ts +247 -0
- package/src/edit/hashline/index.ts +5 -0
- package/src/edit/hashline/noop-loop-guard.ts +99 -0
- package/src/edit/hashline/params.ts +12 -0
- package/src/edit/index.ts +699 -0
- package/src/edit/modes/apply-patch.lark +19 -0
- package/src/edit/modes/apply-patch.ts +53 -0
- package/src/edit/modes/patch.ts +1958 -0
- package/src/edit/modes/replace.ts +1191 -0
- package/src/edit/normalize.ts +345 -0
- package/src/edit/notebook.ts +242 -0
- package/src/edit/read-file.ts +25 -0
- package/src/edit/renderer.ts +998 -0
- package/src/edit/snapshot-details.ts +77 -0
- package/src/edit/streaming.ts +710 -0
- package/src/eval/agent-bridge.ts +224 -0
- package/src/eval/backend-helpers.ts +48 -0
- package/src/eval/backend.ts +71 -0
- package/src/eval/bridge-timeout.ts +65 -0
- package/src/eval/budget-bridge.ts +48 -0
- package/src/eval/completion-bridge.ts +212 -0
- package/src/eval/concurrency-bridge.ts +34 -0
- package/src/eval/executor-base.ts +562 -0
- package/src/eval/idle-timeout.ts +91 -0
- package/src/eval/index.ts +6 -0
- package/src/eval/jl/executor.ts +551 -0
- package/src/eval/jl/index.ts +54 -0
- package/src/eval/jl/kernel.ts +236 -0
- package/src/eval/jl/prelude.jl +736 -0
- package/src/eval/jl/prelude.ts +3 -0
- package/src/eval/jl/runner.jl +666 -0
- package/src/eval/jl/runtime.ts +118 -0
- package/src/eval/js/context-manager.ts +872 -0
- package/src/eval/js/executor.ts +178 -0
- package/src/eval/js/index.ts +41 -0
- package/src/eval/js/process-entry.ts +31 -0
- package/src/eval/js/shared/helpers.ts +170 -0
- package/src/eval/js/shared/indirect-eval.ts +30 -0
- package/src/eval/js/shared/local-module-loader.ts +364 -0
- package/src/eval/js/shared/prelude.ts +2 -0
- package/src/eval/js/shared/prelude.txt +294 -0
- package/src/eval/js/shared/rewrite-imports.ts +550 -0
- package/src/eval/js/shared/runtime.ts +590 -0
- package/src/eval/js/shared/types.ts +18 -0
- package/src/eval/js/tool-bridge.ts +163 -0
- package/src/eval/js/worker-core.ts +380 -0
- package/src/eval/js/worker-entry.ts +37 -0
- package/src/eval/js/worker-protocol.ts +47 -0
- package/src/eval/kernel-base.ts +569 -0
- package/src/eval/py/display.ts +71 -0
- package/src/eval/py/executor.ts +643 -0
- package/src/eval/py/index.ts +57 -0
- package/src/eval/py/kernel.ts +235 -0
- package/src/eval/py/prelude.py +673 -0
- package/src/eval/py/prelude.ts +3 -0
- package/src/eval/py/runner.py +1425 -0
- package/src/eval/py/runtime.ts +276 -0
- package/src/eval/py/spawn-options.ts +134 -0
- package/src/eval/py/tool-bridge.ts +201 -0
- package/src/eval/rb/executor.ts +511 -0
- package/src/eval/rb/index.ts +54 -0
- package/src/eval/rb/kernel.ts +231 -0
- package/src/eval/rb/prelude.rb +551 -0
- package/src/eval/rb/prelude.ts +3 -0
- package/src/eval/rb/runner.rb +581 -0
- package/src/eval/rb/runtime.ts +132 -0
- package/src/eval/runtime-env.ts +104 -0
- package/src/eval/session-id.ts +8 -0
- package/src/eval/types.ts +48 -0
- package/src/exa/index.ts +2 -0
- package/src/exa/mcp-client.ts +370 -0
- package/src/exa/types.ts +69 -0
- package/src/exec/bash-executor.ts +627 -0
- package/src/exec/direnv.ts +145 -0
- package/src/exec/exec.ts +53 -0
- package/src/exec/non-interactive-env.ts +118 -0
- package/src/export/custom-share.ts +65 -0
- package/src/export/html/args.ts +20 -0
- package/src/export/html/index.ts +320 -0
- package/src/export/html/share-loader.js +102 -0
- package/src/export/html/template.css +1355 -0
- package/src/export/html/template.html +55 -0
- package/src/export/html/template.js +1653 -0
- package/src/export/html/tool-views.generated.js +35 -0
- package/src/export/html/vendor/highlight.min.js +1213 -0
- package/src/export/html/vendor/marked.min.js +6 -0
- package/src/export/html/web-palette.ts +126 -0
- package/src/export/share.ts +686 -0
- package/src/export/ttsr.ts +590 -0
- package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
- package/src/extensibility/custom-commands/bundled/review/index.ts +698 -0
- package/src/extensibility/custom-commands/index.ts +2 -0
- package/src/extensibility/custom-commands/loader.ts +242 -0
- package/src/extensibility/custom-commands/types.ts +119 -0
- package/src/extensibility/custom-tools/index.ts +7 -0
- package/src/extensibility/custom-tools/loader.ts +301 -0
- package/src/extensibility/custom-tools/types.ts +287 -0
- package/src/extensibility/custom-tools/wrapper.ts +50 -0
- package/src/extensibility/extensions/compact-handler.ts +40 -0
- package/src/extensibility/extensions/get-commands-handler.ts +78 -0
- package/src/extensibility/extensions/index.ts +16 -0
- package/src/extensibility/extensions/load-errors.ts +13 -0
- package/src/extensibility/extensions/loader.ts +663 -0
- package/src/extensibility/extensions/managed-timers.ts +83 -0
- package/src/extensibility/extensions/model-api.ts +39 -0
- package/src/extensibility/extensions/runner.ts +1396 -0
- package/src/extensibility/extensions/types.ts +1603 -0
- package/src/extensibility/extensions/wrapper.ts +395 -0
- package/src/extensibility/hooks/index.ts +6 -0
- package/src/extensibility/hooks/loader.ts +243 -0
- package/src/extensibility/hooks/runner.ts +425 -0
- package/src/extensibility/hooks/tool-wrapper.ts +124 -0
- package/src/extensibility/hooks/types.ts +612 -0
- package/src/extensibility/legacy-pi-ai-shim.ts +161 -0
- package/src/extensibility/legacy-pi-coding-agent-shim.ts +1460 -0
- package/src/extensibility/legacy-pi-tui-shim.ts +43 -0
- package/src/extensibility/legacy-typebox.ts +101 -0
- package/src/extensibility/plugins/bun-git-cache.ts +91 -0
- package/src/extensibility/plugins/doctor.ts +65 -0
- package/src/extensibility/plugins/git-url.ts +367 -0
- package/src/extensibility/plugins/index.ts +9 -0
- package/src/extensibility/plugins/installer.ts +201 -0
- package/src/extensibility/plugins/legacy-pi-compat.ts +2643 -0
- package/src/extensibility/plugins/legacy-pi-virtual-modules.d.ts +4 -0
- package/src/extensibility/plugins/loader.ts +535 -0
- package/src/extensibility/plugins/manager.ts +1142 -0
- package/src/extensibility/plugins/marketplace/cache.ts +136 -0
- package/src/extensibility/plugins/marketplace/fetcher.ts +316 -0
- package/src/extensibility/plugins/marketplace/index.ts +6 -0
- package/src/extensibility/plugins/marketplace/manager.ts +927 -0
- package/src/extensibility/plugins/marketplace/registry.ts +192 -0
- package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
- package/src/extensibility/plugins/marketplace/types.ts +192 -0
- package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
- package/src/extensibility/plugins/parser.ts +107 -0
- package/src/extensibility/plugins/runtime-config.ts +9 -0
- package/src/extensibility/plugins/types.ts +194 -0
- package/src/extensibility/session-handler-types.ts +21 -0
- package/src/extensibility/shared-events.ts +401 -0
- package/src/extensibility/skills.ts +531 -0
- package/src/extensibility/slash-commands.ts +131 -0
- package/src/extensibility/tool-event-input.ts +80 -0
- package/src/extensibility/tool-proxy.ts +28 -0
- package/src/extensibility/utils.ts +192 -0
- package/src/goals/index.ts +3 -0
- package/src/goals/runtime.ts +521 -0
- package/src/goals/state.ts +37 -0
- package/src/goals/tools/goal-tool.ts +251 -0
- package/src/hindsight/backend.ts +354 -0
- package/src/hindsight/bank.ts +156 -0
- package/src/hindsight/client.ts +680 -0
- package/src/hindsight/config.ts +193 -0
- package/src/hindsight/content.ts +266 -0
- package/src/hindsight/index.ts +8 -0
- package/src/hindsight/mental-models.ts +429 -0
- package/src/hindsight/seeds.json +32 -0
- package/src/hindsight/state.ts +530 -0
- package/src/hindsight/transcript.ts +71 -0
- package/src/index.ts +66 -0
- package/src/internal-urls/agent-protocol.ts +180 -0
- package/src/internal-urls/artifact-protocol.ts +151 -0
- package/src/internal-urls/docs-index.ts +102 -0
- package/src/internal-urls/filesystem-resource.ts +34 -0
- package/src/internal-urls/history-protocol.ts +198 -0
- package/src/internal-urls/index.ts +28 -0
- package/src/internal-urls/issue-pr-protocol.ts +594 -0
- package/src/internal-urls/json-query.ts +126 -0
- package/src/internal-urls/local-protocol.ts +471 -0
- package/src/internal-urls/mcp-protocol.ts +168 -0
- package/src/internal-urls/memory-protocol.ts +380 -0
- package/src/internal-urls/omp-protocol.ts +94 -0
- package/src/internal-urls/parse.ts +103 -0
- package/src/internal-urls/registry-helpers.ts +132 -0
- package/src/internal-urls/router.ts +153 -0
- package/src/internal-urls/rule-protocol.ts +45 -0
- package/src/internal-urls/security-protocol.ts +261 -0
- package/src/internal-urls/skill-protocol.ts +131 -0
- package/src/internal-urls/ssh-protocol.ts +368 -0
- package/src/internal-urls/types.ts +196 -0
- package/src/internal-urls/vault-protocol.ts +940 -0
- package/src/internal-urls/xd-protocol.ts +46 -0
- package/src/irc/bus.ts +380 -0
- package/src/jsonrpc/message-framing.ts +142 -0
- package/src/launch/broker.ts +1368 -0
- package/src/launch/client.ts +521 -0
- package/src/launch/ensure.ts +73 -0
- package/src/launch/paths.ts +14 -0
- package/src/launch/presence.ts +82 -0
- package/src/launch/protocol.ts +448 -0
- package/src/launch/spawn-options.ts +17 -0
- package/src/launch/terminal-output-worker-client.ts +53 -0
- package/src/launch/terminal-output-worker-protocol.ts +11 -0
- package/src/launch/terminal-output-worker.ts +23 -0
- package/src/launch/terminal-output.ts +46 -0
- package/src/lib/xai-http.ts +150 -0
- package/src/live/attestation.ts +91 -0
- package/src/live/controller.ts +517 -0
- package/src/live/prompts/agent-final-message.md +3 -0
- package/src/live/prompts/live-instructions.md +23 -0
- package/src/live/protocol.ts +233 -0
- package/src/live/transport.ts +422 -0
- package/src/live/visualizer.ts +221 -0
- package/src/live/voices.ts +18 -0
- package/src/lsp/client.ts +1465 -0
- package/src/lsp/clients/biome-client.ts +263 -0
- package/src/lsp/clients/index.ts +50 -0
- package/src/lsp/clients/lsp-linter-client.ts +85 -0
- package/src/lsp/clients/swiftlint-client.ts +120 -0
- package/src/lsp/config.ts +549 -0
- package/src/lsp/defaults.json +499 -0
- package/src/lsp/deferred-diagnostics.ts +66 -0
- package/src/lsp/diagnostics-ledger.ts +51 -0
- package/src/lsp/edits.ts +288 -0
- package/src/lsp/format-options.ts +119 -0
- package/src/lsp/index.ts +2821 -0
- package/src/lsp/lspmux.ts +233 -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/render.ts +668 -0
- package/src/lsp/startup-events.ts +13 -0
- package/src/lsp/types.ts +479 -0
- package/src/lsp/utils.ts +747 -0
- package/src/main.ts +1799 -0
- package/src/markit/NOTICE +32 -0
- package/src/markit/converters/docx.ts +56 -0
- package/src/markit/converters/epub.ts +136 -0
- package/src/markit/converters/pdf/columns.ts +103 -0
- package/src/markit/converters/pdf/extract.ts +598 -0
- package/src/markit/converters/pdf/grid.ts +780 -0
- package/src/markit/converters/pdf/headers.ts +106 -0
- package/src/markit/converters/pdf/index.ts +146 -0
- package/src/markit/converters/pdf/render.ts +501 -0
- package/src/markit/converters/pdf/types.ts +84 -0
- package/src/markit/converters/pptx.ts +325 -0
- package/src/markit/converters/xlsx.ts +173 -0
- package/src/markit/index.ts +2 -0
- package/src/markit/registry.ts +59 -0
- package/src/markit/types.ts +35 -0
- package/src/mcp/client.ts +511 -0
- package/src/mcp/config-writer.ts +377 -0
- package/src/mcp/config.ts +385 -0
- package/src/mcp/index.ts +29 -0
- package/src/mcp/json-rpc.ts +122 -0
- package/src/mcp/loader.ts +125 -0
- package/src/mcp/manager.ts +1524 -0
- package/src/mcp/oauth-credentials.ts +104 -0
- package/src/mcp/oauth-discovery.ts +587 -0
- package/src/mcp/oauth-flow.ts +830 -0
- package/src/mcp/render.ts +214 -0
- package/src/mcp/request-id.ts +24 -0
- package/src/mcp/smithery-auth.ts +108 -0
- package/src/mcp/smithery-connect.ts +154 -0
- package/src/mcp/smithery-registry.ts +500 -0
- package/src/mcp/startup-events.ts +116 -0
- package/src/mcp/timeout.ts +59 -0
- package/src/mcp/tool-bridge.ts +691 -0
- package/src/mcp/tool-cache.ts +117 -0
- package/src/mcp/transports/header-policy.ts +95 -0
- package/src/mcp/transports/http.ts +508 -0
- package/src/mcp/transports/index.ts +7 -0
- package/src/mcp/transports/sse.ts +372 -0
- package/src/mcp/transports/stdio.ts +905 -0
- package/src/mcp/types.ts +467 -0
- package/src/memories/index.ts +1434 -0
- package/src/memories/storage.ts +578 -0
- package/src/memory-backend/index.ts +19 -0
- package/src/memory-backend/local-backend.ts +47 -0
- package/src/memory-backend/messages.ts +19 -0
- package/src/memory-backend/off-backend.ts +25 -0
- package/src/memory-backend/resolve.ts +25 -0
- package/src/memory-backend/runtime.ts +66 -0
- package/src/memory-backend/tool-names.ts +2 -0
- package/src/memory-backend/types.ts +166 -0
- package/src/mnemopi/backend.ts +629 -0
- package/src/mnemopi/config.ts +267 -0
- package/src/mnemopi/embed-client.ts +293 -0
- package/src/mnemopi/embed-protocol.ts +35 -0
- package/src/mnemopi/embed-worker.ts +114 -0
- package/src/mnemopi/index.ts +3 -0
- package/src/mnemopi/state.ts +940 -0
- package/src/modes/acp/acp-agent.ts +2595 -0
- package/src/modes/acp/acp-client-bridge.ts +154 -0
- package/src/modes/acp/acp-event-mapper.ts +1084 -0
- package/src/modes/acp/acp-mode.ts +48 -0
- package/src/modes/acp/index.ts +2 -0
- package/src/modes/acp/terminal-auth.ts +37 -0
- package/src/modes/components/advisor-config.ts +635 -0
- package/src/modes/components/advisor-message.ts +109 -0
- package/src/modes/components/agent-dashboard.ts +1252 -0
- package/src/modes/components/agent-hub-projection.ts +248 -0
- package/src/modes/components/agent-hub-renderer.ts +194 -0
- package/src/modes/components/agent-hub.ts +1126 -0
- package/src/modes/components/agent-transcript-viewer.ts +647 -0
- package/src/modes/components/ask-dialog.ts +1017 -0
- package/src/modes/components/assistant-message.ts +978 -0
- package/src/modes/components/background-tan-message.ts +36 -0
- package/src/modes/components/bash-execution.ts +233 -0
- package/src/modes/components/bordered-loader.ts +41 -0
- package/src/modes/components/btw-panel.ts +161 -0
- package/src/modes/components/cache-invalidation-marker.ts +110 -0
- package/src/modes/components/chat-block.ts +111 -0
- package/src/modes/components/chat-transcript-builder.ts +518 -0
- package/src/modes/components/codex-reset-fireworks.ts +369 -0
- package/src/modes/components/collab-prompt-message.ts +32 -0
- package/src/modes/components/compaction-summary-message.ts +221 -0
- package/src/modes/components/copy-selector.ts +218 -0
- package/src/modes/components/countdown-timer.ts +75 -0
- package/src/modes/components/custom-editor.ts +1036 -0
- package/src/modes/components/custom-message.ts +70 -0
- package/src/modes/components/diff.ts +254 -0
- package/src/modes/components/dynamic-border.ts +37 -0
- package/src/modes/components/error-banner.ts +33 -0
- package/src/modes/components/eval-execution.ts +169 -0
- package/src/modes/components/execution-shared.ts +101 -0
- package/src/modes/components/extensions/extension-dashboard.ts +492 -0
- package/src/modes/components/extensions/extension-list.ts +507 -0
- package/src/modes/components/extensions/index.ts +9 -0
- package/src/modes/components/extensions/inspector-panel.ts +326 -0
- package/src/modes/components/extensions/state-manager.ts +648 -0
- package/src/modes/components/extensions/types.ts +186 -0
- package/src/modes/components/footer.ts +274 -0
- package/src/modes/components/history-search.ts +268 -0
- package/src/modes/components/hook-editor.ts +213 -0
- package/src/modes/components/hook-input.ts +87 -0
- package/src/modes/components/hook-message.ts +67 -0
- package/src/modes/components/hook-selector.ts +691 -0
- package/src/modes/components/index.ts +42 -0
- package/src/modes/components/keybinding-hints.ts +56 -0
- package/src/modes/components/late-diagnostics-message.ts +60 -0
- package/src/modes/components/login-dialog.ts +197 -0
- package/src/modes/components/logout-account-selector.ts +130 -0
- package/src/modes/components/mcp-add-wizard.ts +1413 -0
- package/src/modes/components/message-frame.ts +98 -0
- package/src/modes/components/model-browser.ts +888 -0
- package/src/modes/components/model-hub.ts +2014 -0
- package/src/modes/components/model-picker.ts +237 -0
- package/src/modes/components/move-overlay.ts +293 -0
- package/src/modes/components/oauth-selector.ts +474 -0
- package/src/modes/components/omfg-panel.ts +141 -0
- package/src/modes/components/overlay-box.ts +109 -0
- package/src/modes/components/pause-screen.ts +208 -0
- package/src/modes/components/plan-review-overlay.ts +1226 -0
- package/src/modes/components/plan-toc.ts +138 -0
- package/src/modes/components/plugin-selector.ts +100 -0
- package/src/modes/components/plugin-settings.ts +745 -0
- package/src/modes/components/queue-mode-selector.ts +61 -0
- package/src/modes/components/read-tool-group.ts +856 -0
- package/src/modes/components/reset-usage-selector.ts +161 -0
- package/src/modes/components/segment-track.ts +89 -0
- package/src/modes/components/select-list-mouse-routing.ts +35 -0
- package/src/modes/components/selector-helpers.ts +129 -0
- package/src/modes/components/session-account-selector.ts +62 -0
- package/src/modes/components/session-selector.ts +1035 -0
- package/src/modes/components/settings-defs.ts +267 -0
- package/src/modes/components/settings-selector.ts +1445 -0
- package/src/modes/components/show-images-selector.ts +50 -0
- package/src/modes/components/skill-message.ts +110 -0
- package/src/modes/components/snapcompact-shape-preview-doc.md +14 -0
- package/src/modes/components/snapcompact-shape-preview.ts +192 -0
- package/src/modes/components/status-line/component.ts +1843 -0
- package/src/modes/components/status-line/context-thresholds.ts +86 -0
- package/src/modes/components/status-line/git-utils.ts +42 -0
- package/src/modes/components/status-line/index.ts +5 -0
- package/src/modes/components/status-line/presets.ts +106 -0
- package/src/modes/components/status-line/segments.ts +710 -0
- package/src/modes/components/status-line/separators.ts +55 -0
- package/src/modes/components/status-line/types.ts +159 -0
- package/src/modes/components/stripped-tool-calls-placeholder.ts +35 -0
- package/src/modes/components/theme-selector.ts +68 -0
- package/src/modes/components/thinking-selector.ts +57 -0
- package/src/modes/components/tiny-title-download-progress.ts +90 -0
- package/src/modes/components/tips.txt +26 -0
- package/src/modes/components/todo-reminder.ts +43 -0
- package/src/modes/components/tool-execution.ts +1467 -0
- package/src/modes/components/transcript-container.ts +527 -0
- package/src/modes/components/tree-selector.ts +1006 -0
- package/src/modes/components/ttsr-notification.ts +123 -0
- package/src/modes/components/usage-row.ts +52 -0
- package/src/modes/components/user-message-selector.ts +227 -0
- package/src/modes/components/user-message.ts +167 -0
- package/src/modes/components/visual-truncate.ts +63 -0
- package/src/modes/components/welcome.ts +578 -0
- package/src/modes/controllers/btw-controller.ts +246 -0
- package/src/modes/controllers/command-controller-shared.ts +109 -0
- package/src/modes/controllers/command-controller.ts +2024 -0
- package/src/modes/controllers/event-controller.ts +2173 -0
- package/src/modes/controllers/extension-ui-controller.ts +1243 -0
- package/src/modes/controllers/input-controller.ts +2037 -0
- package/src/modes/controllers/live-command-controller.ts +261 -0
- package/src/modes/controllers/mcp-command-controller.ts +2552 -0
- package/src/modes/controllers/omfg-controller.ts +287 -0
- package/src/modes/controllers/omfg-rule.ts +647 -0
- package/src/modes/controllers/selector-controller.ts +2058 -0
- package/src/modes/controllers/session-focus-controller.ts +117 -0
- package/src/modes/controllers/ssh-command-controller.ts +385 -0
- package/src/modes/controllers/streaming-reveal.ts +399 -0
- package/src/modes/controllers/tan-command-controller.ts +243 -0
- package/src/modes/controllers/todo-command-controller.ts +487 -0
- package/src/modes/controllers/tool-args-reveal.ts +591 -0
- package/src/modes/data/emojis.json +1 -0
- package/src/modes/emoji-autocomplete.ts +285 -0
- package/src/modes/github-ref-autocomplete.ts +75 -0
- package/src/modes/gradient-highlight.ts +99 -0
- package/src/modes/image-references.ts +137 -0
- package/src/modes/index.ts +10 -0
- package/src/modes/interactive-mode.ts +5055 -0
- package/src/modes/internal-url-autocomplete.ts +158 -0
- package/src/modes/loop-limit.ts +192 -0
- package/src/modes/magic-keyword-boundary.ts +23 -0
- package/src/modes/magic-keywords.ts +42 -0
- package/src/modes/markdown-prose.ts +247 -0
- package/src/modes/oauth-manual-input.ts +69 -0
- package/src/modes/orchestrate.ts +43 -0
- package/src/modes/print-mode.ts +282 -0
- package/src/modes/prompt-action-autocomplete.ts +322 -0
- package/src/modes/queue-input.ts +132 -0
- package/src/modes/rpc/host-tools.ts +204 -0
- package/src/modes/rpc/host-uris.ts +241 -0
- package/src/modes/rpc/rpc-client.ts +1213 -0
- package/src/modes/rpc/rpc-frame.ts +316 -0
- package/src/modes/rpc/rpc-input.ts +38 -0
- package/src/modes/rpc/rpc-messages.ts +127 -0
- package/src/modes/rpc/rpc-mode.ts +1519 -0
- package/src/modes/rpc/rpc-subagents.ts +265 -0
- package/src/modes/rpc/rpc-types.ts +544 -0
- package/src/modes/running-subagent-badge.ts +13 -0
- package/src/modes/runtime-init.ts +144 -0
- package/src/modes/session-observer-registry.ts +223 -0
- package/src/modes/session-teardown.ts +82 -0
- package/src/modes/setup-version.ts +11 -0
- package/src/modes/setup-wizard/index.ts +103 -0
- package/src/modes/setup-wizard/lazy.ts +16 -0
- package/src/modes/setup-wizard/scenes/glyph.ts +103 -0
- package/src/modes/setup-wizard/scenes/model.ts +132 -0
- package/src/modes/setup-wizard/scenes/outro.ts +35 -0
- package/src/modes/setup-wizard/scenes/providers.ts +105 -0
- package/src/modes/setup-wizard/scenes/sign-in.ts +312 -0
- package/src/modes/setup-wizard/scenes/splash.ts +201 -0
- package/src/modes/setup-wizard/scenes/theme.ts +330 -0
- package/src/modes/setup-wizard/scenes/types.ts +65 -0
- package/src/modes/setup-wizard/scenes/web-search.ts +153 -0
- package/src/modes/setup-wizard/startup-splash.ts +107 -0
- package/src/modes/setup-wizard/wizard-overlay.ts +335 -0
- package/src/modes/shared.ts +49 -0
- package/src/modes/skill-command.ts +91 -0
- package/src/modes/theme/dark.json +95 -0
- package/src/modes/theme/defaults/alabaster.json +93 -0
- package/src/modes/theme/defaults/amethyst.json +96 -0
- package/src/modes/theme/defaults/anthracite.json +93 -0
- package/src/modes/theme/defaults/basalt.json +91 -0
- package/src/modes/theme/defaults/birch.json +95 -0
- package/src/modes/theme/defaults/dark-abyss.json +91 -0
- package/src/modes/theme/defaults/dark-arctic.json +104 -0
- package/src/modes/theme/defaults/dark-aurora.json +95 -0
- package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
- package/src/modes/theme/defaults/dark-cavern.json +91 -0
- package/src/modes/theme/defaults/dark-copper.json +95 -0
- package/src/modes/theme/defaults/dark-cosmos.json +90 -0
- package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
- package/src/modes/theme/defaults/dark-dracula.json +98 -0
- package/src/modes/theme/defaults/dark-eclipse.json +91 -0
- package/src/modes/theme/defaults/dark-ember.json +95 -0
- package/src/modes/theme/defaults/dark-equinox.json +90 -0
- package/src/modes/theme/defaults/dark-forest.json +96 -0
- package/src/modes/theme/defaults/dark-github.json +105 -0
- package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
- package/src/modes/theme/defaults/dark-lavender.json +95 -0
- package/src/modes/theme/defaults/dark-lunar.json +89 -0
- package/src/modes/theme/defaults/dark-midnight.json +95 -0
- package/src/modes/theme/defaults/dark-monochrome.json +94 -0
- package/src/modes/theme/defaults/dark-monokai.json +98 -0
- package/src/modes/theme/defaults/dark-nebula.json +90 -0
- package/src/modes/theme/defaults/dark-nord.json +97 -0
- package/src/modes/theme/defaults/dark-ocean.json +101 -0
- package/src/modes/theme/defaults/dark-one.json +100 -0
- package/src/modes/theme/defaults/dark-poimandres.json +143 -0
- package/src/modes/theme/defaults/dark-rainforest.json +91 -0
- package/src/modes/theme/defaults/dark-reef.json +91 -0
- package/src/modes/theme/defaults/dark-retro.json +92 -0
- package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
- package/src/modes/theme/defaults/dark-sakura.json +95 -0
- package/src/modes/theme/defaults/dark-slate.json +95 -0
- package/src/modes/theme/defaults/dark-solarized.json +97 -0
- package/src/modes/theme/defaults/dark-solstice.json +90 -0
- package/src/modes/theme/defaults/dark-starfall.json +91 -0
- package/src/modes/theme/defaults/dark-sunset.json +99 -0
- package/src/modes/theme/defaults/dark-swamp.json +90 -0
- package/src/modes/theme/defaults/dark-synthwave.json +103 -0
- package/src/modes/theme/defaults/dark-taiga.json +91 -0
- package/src/modes/theme/defaults/dark-terminal.json +95 -0
- package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
- package/src/modes/theme/defaults/dark-tundra.json +91 -0
- package/src/modes/theme/defaults/dark-twilight.json +91 -0
- package/src/modes/theme/defaults/dark-volcanic.json +91 -0
- package/src/modes/theme/defaults/graphite.json +92 -0
- package/src/modes/theme/defaults/index.ts +199 -0
- package/src/modes/theme/defaults/light-arctic.json +107 -0
- package/src/modes/theme/defaults/light-aurora-day.json +91 -0
- package/src/modes/theme/defaults/light-canyon.json +91 -0
- package/src/modes/theme/defaults/light-catppuccin.json +106 -0
- package/src/modes/theme/defaults/light-cirrus.json +90 -0
- package/src/modes/theme/defaults/light-coral.json +95 -0
- package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
- package/src/modes/theme/defaults/light-dawn.json +90 -0
- package/src/modes/theme/defaults/light-dunes.json +91 -0
- package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
- package/src/modes/theme/defaults/light-forest.json +100 -0
- package/src/modes/theme/defaults/light-frost.json +95 -0
- package/src/modes/theme/defaults/light-github.json +115 -0
- package/src/modes/theme/defaults/light-glacier.json +91 -0
- package/src/modes/theme/defaults/light-gruvbox.json +108 -0
- package/src/modes/theme/defaults/light-haze.json +90 -0
- package/src/modes/theme/defaults/light-honeycomb.json +95 -0
- package/src/modes/theme/defaults/light-lagoon.json +91 -0
- package/src/modes/theme/defaults/light-lavender.json +95 -0
- package/src/modes/theme/defaults/light-meadow.json +91 -0
- package/src/modes/theme/defaults/light-mint.json +95 -0
- package/src/modes/theme/defaults/light-monochrome.json +101 -0
- package/src/modes/theme/defaults/light-ocean.json +99 -0
- package/src/modes/theme/defaults/light-one.json +99 -0
- package/src/modes/theme/defaults/light-opal.json +91 -0
- package/src/modes/theme/defaults/light-orchard.json +91 -0
- package/src/modes/theme/defaults/light-paper.json +95 -0
- package/src/modes/theme/defaults/light-poimandres.json +143 -0
- package/src/modes/theme/defaults/light-prism.json +90 -0
- package/src/modes/theme/defaults/light-retro.json +98 -0
- package/src/modes/theme/defaults/light-sand.json +95 -0
- package/src/modes/theme/defaults/light-savanna.json +91 -0
- package/src/modes/theme/defaults/light-solarized.json +102 -0
- package/src/modes/theme/defaults/light-soleil.json +90 -0
- package/src/modes/theme/defaults/light-sunset.json +99 -0
- package/src/modes/theme/defaults/light-synthwave.json +98 -0
- package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
- package/src/modes/theme/defaults/light-wetland.json +91 -0
- package/src/modes/theme/defaults/light-zenith.json +89 -0
- package/src/modes/theme/defaults/limestone.json +94 -0
- package/src/modes/theme/defaults/mahogany.json +97 -0
- package/src/modes/theme/defaults/marble.json +93 -0
- package/src/modes/theme/defaults/obsidian.json +91 -0
- package/src/modes/theme/defaults/onyx.json +91 -0
- package/src/modes/theme/defaults/pearl.json +93 -0
- package/src/modes/theme/defaults/porcelain.json +91 -0
- package/src/modes/theme/defaults/quartz.json +96 -0
- package/src/modes/theme/defaults/sandstone.json +95 -0
- package/src/modes/theme/defaults/titanium.json +90 -0
- package/src/modes/theme/light.json +93 -0
- package/src/modes/theme/mermaid-cache.ts +92 -0
- package/src/modes/theme/shimmer.ts +305 -0
- package/src/modes/theme/theme-schema.json +463 -0
- package/src/modes/theme/theme.ts +3171 -0
- package/src/modes/turn-budget.ts +31 -0
- package/src/modes/types.ts +494 -0
- package/src/modes/ultrathink.ts +42 -0
- package/src/modes/utils/context-usage.ts +518 -0
- package/src/modes/utils/copy-targets.ts +378 -0
- package/src/modes/utils/hotkeys-markdown.ts +65 -0
- package/src/modes/utils/interactive-context-helpers.ts +31 -0
- package/src/modes/utils/keybinding-matchers.ts +86 -0
- package/src/modes/utils/tools-markdown.ts +31 -0
- package/src/modes/utils/transcript-render-helpers.ts +253 -0
- package/src/modes/utils/ui-helpers.ts +976 -0
- package/src/modes/warp-events.ts +232 -0
- package/src/modes/workflow.ts +55 -0
- package/src/plan-mode/approved-plan.ts +194 -0
- package/src/plan-mode/model-transition.ts +51 -0
- package/src/plan-mode/plan-files.ts +40 -0
- package/src/plan-mode/plan-handoff.ts +37 -0
- package/src/plan-mode/plan-protection.ts +31 -0
- package/src/plan-mode/state.ts +6 -0
- package/src/priority.json +60 -0
- package/src/prompts/advisor/active-repo-watchdog.md +6 -0
- package/src/prompts/advisor/advise-tool.md +3 -0
- package/src/prompts/advisor/context-files.md +8 -0
- package/src/prompts/advisor/system.md +98 -0
- package/src/prompts/agents/designer.md +74 -0
- package/src/prompts/agents/frontmatter.md +12 -0
- package/src/prompts/agents/init.md +33 -0
- package/src/prompts/agents/librarian.md +119 -0
- package/src/prompts/agents/reviewer.md +139 -0
- package/src/prompts/agents/scout.md +58 -0
- package/src/prompts/agents/security-reviewer.md +75 -0
- package/src/prompts/agents/task.md +17 -0
- package/src/prompts/bench/cache-prefix-chunk.md +1 -0
- package/src/prompts/bench/cache-prefix.md +3 -0
- package/src/prompts/bench/cache-suffix.md +1 -0
- package/src/prompts/bench.md +6 -0
- package/src/prompts/ci-green-request.md +36 -0
- package/src/prompts/dry-balance-bench.md +8 -0
- package/src/prompts/goals/goal-budget-limit.md +16 -0
- package/src/prompts/goals/goal-continuation.md +28 -0
- package/src/prompts/goals/goal-mode-active.md +23 -0
- package/src/prompts/goals/goal-mode-context.md +4 -0
- package/src/prompts/goals/goal-todo-context.md +12 -0
- package/src/prompts/goals/guided-goal-interview.md +43 -0
- package/src/prompts/memories/consolidation.md +30 -0
- package/src/prompts/memories/consolidation_system.md +4 -0
- package/src/prompts/memories/read-path.md +17 -0
- package/src/prompts/memories/stage_one_input.md +6 -0
- package/src/prompts/memories/stage_one_system.md +21 -0
- package/src/prompts/review-custom-request.md +21 -0
- package/src/prompts/review-headless-request.md +16 -0
- package/src/prompts/review-request.md +68 -0
- package/src/prompts/security/scan-coordinator.md +7 -0
- package/src/prompts/security/scan-request.md +21 -0
- package/src/prompts/security/validate-request.md +8 -0
- package/src/prompts/session/launch-completion.md +1 -0
- package/src/prompts/skills/autoload.md +8 -0
- package/src/prompts/skills/user-invocation.md +11 -0
- package/src/prompts/steering/parent-irc.md +5 -0
- package/src/prompts/steering/user-interjection.md +6 -0
- package/src/prompts/system/active-repo-context.md +4 -0
- package/src/prompts/system/agent-creation-architect.md +50 -0
- package/src/prompts/system/agent-creation-user.md +6 -0
- package/src/prompts/system/auto-continue.md +1 -0
- package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
- package/src/prompts/system/auto-thinking-difficulty.md +14 -0
- package/src/prompts/system/autolearn-guidance-learn.md +1 -0
- package/src/prompts/system/autolearn-guidance.md +7 -0
- package/src/prompts/system/autolearn-nudge-autocontinue.md +5 -0
- package/src/prompts/system/background-tan-dispatch.md +8 -0
- package/src/prompts/system/btw-user.md +8 -0
- package/src/prompts/system/commit-message-system.md +14 -0
- package/src/prompts/system/computer-safety.md +14 -0
- package/src/prompts/system/custom-system-prompt.md +64 -0
- package/src/prompts/system/eager-task.md +7 -0
- package/src/prompts/system/eager-todo.md +18 -0
- package/src/prompts/system/empty-stop-retry.md +4 -0
- package/src/prompts/system/gemini-tool-call-reminder.md +9 -0
- package/src/prompts/system/interrupted-thinking.md +7 -0
- package/src/prompts/system/irc-autoreply.md +6 -0
- package/src/prompts/system/irc-incoming.md +9 -0
- package/src/prompts/system/manual-continue.md +7 -0
- package/src/prompts/system/mcp-xdev-guidance.md +11 -0
- package/src/prompts/system/memory-consolidation-system.md +8 -0
- package/src/prompts/system/memory-extraction-system.md +26 -0
- package/src/prompts/system/mid-run-todo-nudge.md +3 -0
- package/src/prompts/system/omfg-user.md +50 -0
- package/src/prompts/system/orchestrate-notice.md +40 -0
- package/src/prompts/system/personalities/default.md +18 -0
- package/src/prompts/system/personalities/friendly.md +17 -0
- package/src/prompts/system/personalities/pragmatic.md +15 -0
- package/src/prompts/system/plan-mode-active.md +125 -0
- package/src/prompts/system/plan-mode-approved.md +22 -0
- package/src/prompts/system/plan-mode-compact-instructions.md +17 -0
- package/src/prompts/system/plan-mode-reference.md +10 -0
- package/src/prompts/system/plan-mode-subagent.md +33 -0
- package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
- package/src/prompts/system/plan-yolo-handoff.md +5 -0
- package/src/prompts/system/prewalk-checklist.md +7 -0
- package/src/prompts/system/prewalk-continue.md +1 -0
- package/src/prompts/system/prewalk-plan.md +13 -0
- package/src/prompts/system/project-prompt.md +61 -0
- package/src/prompts/system/recap-user.md +9 -0
- package/src/prompts/system/resolve-device-reminder.md +3 -0
- package/src/prompts/system/rewind-report.md +6 -0
- package/src/prompts/system/side-channel-no-tools.md +3 -0
- package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
- package/src/prompts/system/snapcompact-context-stub.md +1 -0
- package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
- package/src/prompts/system/snapcompact-system-stub.md +1 -0
- package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
- package/src/prompts/system/speech-rewrite.md +15 -0
- package/src/prompts/system/subagent-async-pending.md +6 -0
- package/src/prompts/system/subagent-system-prompt.md +73 -0
- package/src/prompts/system/subagent-user-prompt.md +3 -0
- package/src/prompts/system/subagent-yield-reminder.md +23 -0
- package/src/prompts/system/system-prompt.md +263 -0
- package/src/prompts/system/tan-context-switch.md +17 -0
- package/src/prompts/system/task-label.md +23 -0
- package/src/prompts/system/thinking-loop-redirect.md +10 -0
- package/src/prompts/system/title-marker-instruction.md +1 -0
- package/src/prompts/system/title-system.md +16 -0
- package/src/prompts/system/tool-call-loop-redirect.md +8 -0
- package/src/prompts/system/ttsr-interrupt.md +7 -0
- package/src/prompts/system/ttsr-tool-reminder.md +5 -0
- package/src/prompts/system/ultrathink-notice.md +3 -0
- package/src/prompts/system/unexpected-stop-classifier.md +17 -0
- package/src/prompts/system/unexpected-stop-retry.md +4 -0
- package/src/prompts/system/vibe-mode-active.md +26 -0
- package/src/prompts/system/web-search.md +25 -0
- package/src/prompts/system/workflow-notice.md +112 -0
- package/src/prompts/system/xdev-mount-notice.md +20 -0
- package/src/prompts/tools/apply-patch.md +65 -0
- package/src/prompts/tools/ask.md +22 -0
- package/src/prompts/tools/ast-edit.md +11 -0
- package/src/prompts/tools/ast-grep.md +19 -0
- package/src/prompts/tools/async-result.md +8 -0
- package/src/prompts/tools/bash.md +23 -0
- package/src/prompts/tools/browser.md +29 -0
- package/src/prompts/tools/checkpoint.md +15 -0
- package/src/prompts/tools/computer.md +26 -0
- package/src/prompts/tools/debug.md +3 -0
- package/src/prompts/tools/eval.md +45 -0
- package/src/prompts/tools/github.md +22 -0
- package/src/prompts/tools/glob.md +16 -0
- package/src/prompts/tools/goal.md +11 -0
- package/src/prompts/tools/grep.md +13 -0
- package/src/prompts/tools/hub.md +34 -0
- package/src/prompts/tools/image-attachment-describe-system.md +8 -0
- package/src/prompts/tools/image-attachment-describe.md +10 -0
- package/src/prompts/tools/image-gen.md +7 -0
- package/src/prompts/tools/inspect-image-system.md +20 -0
- package/src/prompts/tools/inspect-image.md +22 -0
- package/src/prompts/tools/learn.md +7 -0
- package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
- package/src/prompts/tools/lsp.md +19 -0
- package/src/prompts/tools/manage-skill.md +9 -0
- package/src/prompts/tools/memory-edit.md +12 -0
- package/src/prompts/tools/patch.md +57 -0
- package/src/prompts/tools/read.md +27 -0
- package/src/prompts/tools/recall.md +7 -0
- package/src/prompts/tools/reflect.md +5 -0
- package/src/prompts/tools/replace.md +30 -0
- package/src/prompts/tools/retain.md +6 -0
- package/src/prompts/tools/rewind.md +14 -0
- package/src/prompts/tools/security-publish.md +1 -0
- package/src/prompts/tools/security-scan.md +1 -0
- package/src/prompts/tools/task-async-contract.md +1 -0
- package/src/prompts/tools/task-summary.md +20 -0
- package/src/prompts/tools/task.md +83 -0
- package/src/prompts/tools/todo.md +42 -0
- package/src/prompts/tools/vibe-kill.md +3 -0
- package/src/prompts/tools/vibe-list.md +3 -0
- package/src/prompts/tools/vibe-send.md +9 -0
- package/src/prompts/tools/vibe-spawn.md +10 -0
- package/src/prompts/tools/vibe-turn-result.md +19 -0
- package/src/prompts/tools/vibe-wait.md +8 -0
- package/src/prompts/tools/web-search.md +8 -0
- package/src/prompts/tools/write.md +14 -0
- package/src/registry/agent-lifecycle.ts +505 -0
- package/src/registry/agent-registry.ts +287 -0
- package/src/registry/persisted-agents.ts +423 -0
- package/src/sdk.ts +3820 -0
- package/src/secrets/index.ts +375 -0
- package/src/secrets/obfuscator.ts +2629 -0
- package/src/secrets/regex.ts +21 -0
- package/src/security/auth.ts +98 -0
- package/src/security/cloud.ts +686 -0
- package/src/security/comparison.ts +255 -0
- package/src/security/contracts/ids.ts +111 -0
- package/src/security/contracts/index.ts +4 -0
- package/src/security/contracts/schemas.ts +219 -0
- package/src/security/contracts/types.ts +254 -0
- package/src/security/contracts/validation.ts +69 -0
- package/src/security/coordinator.ts +708 -0
- package/src/security/importers/codex-security.ts +387 -0
- package/src/security/importers/index.ts +2 -0
- package/src/security/importers/sarif.ts +357 -0
- package/src/security/index.ts +13 -0
- package/src/security/preflight.ts +405 -0
- package/src/security/provenance.ts +106 -0
- package/src/security/publication.ts +326 -0
- package/src/security/remediation.ts +93 -0
- package/src/security/resource-output.ts +50 -0
- package/src/security/sarif.ts +78 -0
- package/src/security/store.ts +430 -0
- package/src/session/acp-permission-gate.ts +165 -0
- package/src/session/agent-session-events.ts +67 -0
- package/src/session/agent-session-types.ts +407 -0
- package/src/session/agent-session.ts +9000 -0
- package/src/session/agent-storage.ts +807 -0
- package/src/session/artifacts.ts +154 -0
- package/src/session/async-job-delivery.ts +82 -0
- package/src/session/auth-broker-config.ts +92 -0
- package/src/session/auth-storage.ts +25 -0
- package/src/session/bash-runner.ts +326 -0
- package/src/session/blob-store.ts +295 -0
- package/src/session/checkpoint-entries.ts +81 -0
- package/src/session/claude-session-store.ts +426 -0
- package/src/session/client-bridge.ts +85 -0
- package/src/session/codex-auto-reset.ts +673 -0
- package/src/session/codex-session-store.ts +673 -0
- package/src/session/compact-modes.ts +105 -0
- package/src/session/credential-pin.ts +93 -0
- package/src/session/eval-runner.ts +219 -0
- package/src/session/exit-diagnostics.ts +310 -0
- package/src/session/foreign-session-import.ts +52 -0
- package/src/session/foreign-session-jsonl.ts +29 -0
- package/src/session/foreign-session-store.ts +26 -0
- package/src/session/history-storage.ts +329 -0
- package/src/session/indexed-session-storage.ts +553 -0
- package/src/session/irc-bridge.ts +203 -0
- package/src/session/launch-completion.ts +37 -0
- package/src/session/messages.ts +1304 -0
- package/src/session/model-controls.ts +757 -0
- package/src/session/prewalk.ts +279 -0
- package/src/session/provider-image-budget.ts +86 -0
- package/src/session/queued-messages.ts +99 -0
- package/src/session/redis-session-storage.ts +257 -0
- package/src/session/retry-fallback-chains.ts +455 -0
- package/src/session/role-models.ts +85 -0
- package/src/session/session-advisors.ts +1896 -0
- package/src/session/session-context.ts +584 -0
- package/src/session/session-dump-format.ts +216 -0
- package/src/session/session-entries.ts +306 -0
- package/src/session/session-handoff.ts +325 -0
- package/src/session/session-history-format.ts +459 -0
- package/src/session/session-listing.ts +715 -0
- package/src/session/session-loader.ts +362 -0
- package/src/session/session-maintenance.ts +3115 -0
- package/src/session/session-manager.ts +2747 -0
- package/src/session/session-memory.ts +222 -0
- package/src/session/session-metadata.ts +53 -0
- package/src/session/session-migrations.ts +78 -0
- package/src/session/session-paths.ts +280 -0
- package/src/session/session-persistence.ts +293 -0
- package/src/session/session-provider-boundary.ts +306 -0
- package/src/session/session-stats.ts +349 -0
- package/src/session/session-storage.ts +774 -0
- package/src/session/session-title-slot.ts +141 -0
- package/src/session/session-tools.ts +1385 -0
- package/src/session/session-workspace.ts +53 -0
- package/src/session/settings-stream-fn.ts +79 -0
- package/src/session/shake-types.ts +43 -0
- package/src/session/snapcompact-inline.ts +545 -0
- package/src/session/snapcompact-savings-journal.ts +113 -0
- package/src/session/sql-session-storage.ts +374 -0
- package/src/session/stream-guards.ts +417 -0
- package/src/session/streaming-output.ts +1459 -0
- package/src/session/todo-tracker.ts +380 -0
- package/src/session/tool-choice-queue.ts +305 -0
- package/src/session/ttsr-coordinator.ts +496 -0
- package/src/session/turn-persistence.ts +142 -0
- package/src/session/turn-recovery.ts +2005 -0
- package/src/session/unexpected-stop-classifier.ts +141 -0
- package/src/session/yield-queue.ts +288 -0
- package/src/slash-commands/acp-builtins.ts +70 -0
- package/src/slash-commands/available-commands.ts +105 -0
- package/src/slash-commands/builtin-registry.ts +3149 -0
- package/src/slash-commands/helpers/active-oauth-account.ts +80 -0
- package/src/slash-commands/helpers/collab-qrcode.ts +28 -0
- package/src/slash-commands/helpers/context-report.ts +66 -0
- package/src/slash-commands/helpers/format.ts +46 -0
- package/src/slash-commands/helpers/logout.ts +108 -0
- package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
- package/src/slash-commands/helpers/mcp.ts +533 -0
- package/src/slash-commands/helpers/parse.ts +85 -0
- package/src/slash-commands/helpers/reset-usage.ts +68 -0
- package/src/slash-commands/helpers/security.ts +451 -0
- package/src/slash-commands/helpers/session-pin.ts +44 -0
- package/src/slash-commands/helpers/ssh.ts +196 -0
- package/src/slash-commands/helpers/stats-dashboard.ts +86 -0
- package/src/slash-commands/helpers/todo.ts +285 -0
- package/src/slash-commands/helpers/usage-report.ts +198 -0
- package/src/slash-commands/marketplace-install-parser.ts +99 -0
- package/src/slash-commands/types.ts +139 -0
- package/src/ssh/config-writer.ts +183 -0
- package/src/ssh/connection-manager.ts +667 -0
- package/src/ssh/file-transfer.ts +214 -0
- package/src/ssh/sshfs-mount.ts +163 -0
- package/src/ssh/utils.ts +51 -0
- package/src/startup-splash.ts +19 -0
- package/src/stt/asr-client.ts +401 -0
- package/src/stt/asr-protocol.ts +65 -0
- package/src/stt/asr-worker.ts +603 -0
- package/src/stt/downloader.ts +142 -0
- package/src/stt/endpointer.ts +259 -0
- package/src/stt/index.ts +6 -0
- package/src/stt/models.ts +150 -0
- package/src/stt/sherpa-runtime.ts +71 -0
- package/src/stt/stt-controller.ts +320 -0
- package/src/stt/submit-trigger.ts +74 -0
- package/src/subprocess/worker-client.ts +463 -0
- package/src/subprocess/worker-runtime.ts +494 -0
- package/src/system-prompt.ts +921 -0
- package/src/task/agents.ts +170 -0
- package/src/task/commands.ts +132 -0
- package/src/task/discovery.ts +145 -0
- package/src/task/executor.ts +3431 -0
- package/src/task/index.ts +1515 -0
- package/src/task/isolation-ownership.ts +106 -0
- package/src/task/isolation-runner.ts +444 -0
- package/src/task/label.ts +40 -0
- package/src/task/name-generator.ts +1577 -0
- package/src/task/omp-command.ts +26 -0
- package/src/task/output-manager.ts +115 -0
- package/src/task/parallel.ts +221 -0
- package/src/task/persisted-revive.ts +173 -0
- package/src/task/prewalk.ts +6 -0
- package/src/task/prompt-policy.ts +8 -0
- package/src/task/provider-concurrency.ts +100 -0
- package/src/task/read-only-policy.ts +27 -0
- package/src/task/render.ts +1830 -0
- package/src/task/renderer.ts +14 -0
- package/src/task/repair-args.ts +118 -0
- package/src/task/spawn-policy.ts +72 -0
- package/src/task/structured-subagent.ts +676 -0
- package/src/task/subprocess-tool-registry.ts +88 -0
- package/src/task/types.ts +555 -0
- package/src/task/worktree.ts +967 -0
- package/src/task/yield-assembly.ts +198 -0
- package/src/telemetry-export.ts +504 -0
- package/src/thinking.ts +377 -0
- package/src/tiny/device.ts +111 -0
- package/src/tiny/dtype.ts +101 -0
- package/src/tiny/message-preproc.ts +155 -0
- package/src/tiny/models.ts +268 -0
- package/src/tiny/text.ts +290 -0
- package/src/tiny/title-client.ts +460 -0
- package/src/tiny/title-protocol.ts +56 -0
- package/src/tiny/worker.ts +354 -0
- package/src/tools/acp-bridge.ts +125 -0
- package/src/tools/approval.ts +245 -0
- package/src/tools/ask.ts +1459 -0
- package/src/tools/ast-edit.ts +718 -0
- package/src/tools/ast-grep.ts +526 -0
- package/src/tools/auto-generated-guard.ts +335 -0
- package/src/tools/bash-interactive.ts +435 -0
- package/src/tools/bash-interceptor.ts +148 -0
- package/src/tools/bash-pty-selection.ts +14 -0
- package/src/tools/bash-skill-urls.ts +350 -0
- package/src/tools/bash.ts +1826 -0
- package/src/tools/browser/aria/aria-snapshot.bundle.txt +7 -0
- package/src/tools/browser/aria/aria-snapshot.ts +131 -0
- package/src/tools/browser/attach.ts +219 -0
- package/src/tools/browser/cmux/cmux-tab.ts +1531 -0
- package/src/tools/browser/cmux/rpc.ts +200 -0
- package/src/tools/browser/cmux/socket-client.ts +445 -0
- package/src/tools/browser/launch.ts +939 -0
- package/src/tools/browser/readable.ts +112 -0
- package/src/tools/browser/registry.ts +447 -0
- 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 +229 -0
- package/src/tools/browser/run-output.ts +76 -0
- package/src/tools/browser/shared-daemon.ts +139 -0
- package/src/tools/browser/tab-protocol.ts +123 -0
- package/src/tools/browser/tab-supervisor.ts +1077 -0
- package/src/tools/browser/tab-worker-entry.ts +29 -0
- package/src/tools/browser/tab-worker.ts +1982 -0
- package/src/tools/browser.ts +487 -0
- package/src/tools/builtin-names.ts +67 -0
- package/src/tools/checkpoint.ts +137 -0
- package/src/tools/computer/exposure.ts +14 -0
- package/src/tools/computer/protocol.ts +69 -0
- package/src/tools/computer/supervisor.ts +409 -0
- package/src/tools/computer/worker-entry.ts +39 -0
- package/src/tools/computer/worker.ts +745 -0
- package/src/tools/computer-renderer.ts +147 -0
- package/src/tools/computer.ts +222 -0
- package/src/tools/conflict-detect.ts +815 -0
- package/src/tools/context.ts +49 -0
- package/src/tools/debug.ts +1121 -0
- package/src/tools/default-renderer.ts +154 -0
- package/src/tools/essential-tools.ts +46 -0
- package/src/tools/eval-backends.ts +34 -0
- package/src/tools/eval-format/index.ts +24 -0
- package/src/tools/eval-format/javascript.ts +952 -0
- package/src/tools/eval-format/julia.ts +446 -0
- package/src/tools/eval-format/python.ts +544 -0
- package/src/tools/eval-format/ruby.ts +380 -0
- package/src/tools/eval-render.ts +784 -0
- package/src/tools/eval.ts +774 -0
- package/src/tools/fetch.ts +1889 -0
- package/src/tools/file-recorder.ts +35 -0
- package/src/tools/fs-cache-invalidation.ts +28 -0
- package/src/tools/gh-cache-invalidation.ts +175 -0
- package/src/tools/gh-format.ts +12 -0
- package/src/tools/gh-renderer.ts +484 -0
- package/src/tools/gh.ts +3958 -0
- package/src/tools/github-cache.ts +663 -0
- package/src/tools/glob.ts +691 -0
- package/src/tools/grep.ts +1920 -0
- package/src/tools/grouped-file-output.ts +210 -0
- package/src/tools/hub/index.ts +579 -0
- package/src/tools/hub/jobs.ts +714 -0
- package/src/tools/hub/launch.ts +690 -0
- package/src/tools/hub/messaging.ts +735 -0
- package/src/tools/hub/types.ts +117 -0
- package/src/tools/image-gen.ts +1689 -0
- package/src/tools/image-providers.ts +50 -0
- package/src/tools/index.ts +736 -0
- package/src/tools/inspect-image-renderer.ts +133 -0
- package/src/tools/inspect-image.ts +316 -0
- package/src/tools/json-tree.ts +260 -0
- package/src/tools/jtd-to-json-schema.ts +219 -0
- package/src/tools/jtd-to-typescript.ts +136 -0
- package/src/tools/jtd-utils.ts +102 -0
- package/src/tools/learn.ts +141 -0
- package/src/tools/list-limit.ts +40 -0
- package/src/tools/manage-skill.ts +102 -0
- package/src/tools/match-line-format.ts +20 -0
- package/src/tools/memory-edit.ts +61 -0
- package/src/tools/memory-recall.ts +102 -0
- package/src/tools/memory-reflect.ts +88 -0
- package/src/tools/memory-render.ts +211 -0
- package/src/tools/memory-retain.ts +89 -0
- package/src/tools/output-meta.ts +860 -0
- package/src/tools/output-schema-validator.ts +307 -0
- package/src/tools/path-utils.ts +1489 -0
- package/src/tools/plan-mode-guard.ts +155 -0
- package/src/tools/puppeteer/00_stealth_tampering.txt +44 -0
- package/src/tools/puppeteer/01_stealth_activity.txt +80 -0
- package/src/tools/puppeteer/02_stealth_hairline.txt +57 -0
- package/src/tools/puppeteer/03_stealth_botd.txt +380 -0
- package/src/tools/puppeteer/04_stealth_iframe.txt +174 -0
- package/src/tools/puppeteer/05_stealth_webgl.txt +233 -0
- package/src/tools/puppeteer/06_stealth_screen.txt +260 -0
- package/src/tools/puppeteer/07_stealth_fonts.txt +99 -0
- package/src/tools/puppeteer/08_stealth_audio.txt +63 -0
- package/src/tools/puppeteer/09_stealth_locale.txt +51 -0
- package/src/tools/puppeteer/10_stealth_plugins.txt +212 -0
- package/src/tools/puppeteer/11_stealth_hardware.txt +59 -0
- package/src/tools/puppeteer/12_stealth_codecs.txt +42 -0
- package/src/tools/puppeteer/13_stealth_worker.txt +235 -0
- package/src/tools/read.ts +3762 -0
- package/src/tools/render-utils.ts +926 -0
- package/src/tools/renderers.ts +133 -0
- package/src/tools/report-tool-issue.ts +568 -0
- package/src/tools/resolve.ts +423 -0
- package/src/tools/review.ts +103 -0
- package/src/tools/run-scope.ts +417 -0
- package/src/tools/security-scan.ts +287 -0
- package/src/tools/shell-tokenize.ts +213 -0
- package/src/tools/sqlite-reader.ts +884 -0
- package/src/tools/terminal-output.ts +141 -0
- package/src/tools/todo.ts +1226 -0
- package/src/tools/tool-errors.ts +62 -0
- package/src/tools/tool-result.ts +102 -0
- package/src/tools/tool-timeouts.ts +38 -0
- package/src/tools/tts.ts +266 -0
- package/src/tools/vibe.ts +608 -0
- package/src/tools/write.ts +1646 -0
- package/src/tools/xdev.ts +560 -0
- package/src/tools/yield.ts +486 -0
- package/src/tts/downloader.ts +64 -0
- package/src/tts/index.ts +10 -0
- package/src/tts/models.ts +137 -0
- package/src/tts/runtime.ts +21 -0
- package/src/tts/speakable.ts +392 -0
- package/src/tts/speech-enhancer.ts +206 -0
- package/src/tts/streaming-player.ts +120 -0
- package/src/tts/tts-client.ts +475 -0
- package/src/tts/tts-protocol.ts +69 -0
- package/src/tts/tts-worker.ts +434 -0
- package/src/tts/vocalizer.ts +419 -0
- package/src/tts/wav.ts +58 -0
- package/src/tui/code-cell.ts +268 -0
- package/src/tui/file-list.ts +55 -0
- package/src/tui/hyperlink.ts +178 -0
- package/src/tui/index.ts +13 -0
- package/src/tui/output-block.ts +268 -0
- package/src/tui/status-line.ts +54 -0
- package/src/tui/tree-list.ts +172 -0
- package/src/tui/types.ts +15 -0
- package/src/tui/utils.ts +103 -0
- package/src/tui/width-aware-text.ts +58 -0
- package/src/utils/active-repo-context.ts +143 -0
- package/src/utils/block-context.ts +312 -0
- package/src/utils/changelog.ts +373 -0
- package/src/utils/clipboard.ts +361 -0
- package/src/utils/command-args.ts +74 -0
- package/src/utils/commit-message-generator.ts +148 -0
- package/src/utils/cpuprofile.ts +235 -0
- package/src/utils/edit-mode.ts +61 -0
- package/src/utils/enhanced-paste.ts +230 -0
- package/src/utils/event-bus.ts +33 -0
- package/src/utils/external-editor.ts +80 -0
- package/src/utils/fetch-timeout.ts +10 -0
- package/src/utils/file-display-mode.ts +44 -0
- package/src/utils/file-mentions.ts +293 -0
- package/src/utils/git.ts +2472 -0
- package/src/utils/image-loading.ts +236 -0
- package/src/utils/image-resize.ts +420 -0
- package/src/utils/image-vision-fallback.ts +196 -0
- package/src/utils/inspect-image-mode.ts +39 -0
- package/src/utils/ipc.ts +38 -0
- package/src/utils/jj.ts +422 -0
- package/src/utils/lang-from-path.ts +251 -0
- package/src/utils/late-cleanup.ts +17 -0
- package/src/utils/local-date.ts +7 -0
- package/src/utils/mac-file-urls.applescript +37 -0
- package/src/utils/markit-cache.ts +166 -0
- package/src/utils/markit.ts +223 -0
- package/src/utils/mupdf-wasm-embed.ts +12 -0
- package/src/utils/open.ts +126 -0
- package/src/utils/profile-tree.ts +111 -0
- package/src/utils/prompt-path.ts +3 -0
- package/src/utils/qrcode.ts +535 -0
- package/src/utils/sample-profile.ts +437 -0
- package/src/utils/session-color.ts +142 -0
- package/src/utils/shell-snapshot-fn-env.sh +63 -0
- package/src/utils/shell-snapshot.ts +326 -0
- package/src/utils/sixel.ts +69 -0
- package/src/utils/thinking-display.ts +163 -0
- package/src/utils/title-generator.ts +597 -0
- package/src/utils/token-rate.ts +72 -0
- package/src/utils/tool-choice.ts +50 -0
- package/src/utils/tools-manager.ts +411 -0
- package/src/utils/turndown.ts +82 -0
- package/src/utils/zip.ts +1106 -0
- package/src/vibe/runtime.ts +1684 -0
- package/src/vibe/state.ts +4 -0
- package/src/web/kagi.ts +305 -0
- package/src/web/parallel.ts +354 -0
- package/src/web/scrapers/artifacthub.ts +207 -0
- package/src/web/scrapers/arxiv.ts +83 -0
- package/src/web/scrapers/aur.ts +162 -0
- package/src/web/scrapers/biorxiv.ts +133 -0
- package/src/web/scrapers/bluesky.ts +262 -0
- package/src/web/scrapers/brew.ts +172 -0
- package/src/web/scrapers/cheatsh.ts +68 -0
- package/src/web/scrapers/chocolatey.ts +196 -0
- package/src/web/scrapers/choosealicense.ts +95 -0
- package/src/web/scrapers/cisa-kev.ts +87 -0
- package/src/web/scrapers/clojars.ts +154 -0
- package/src/web/scrapers/coingecko.ts +177 -0
- package/src/web/scrapers/crates-io.ts +97 -0
- package/src/web/scrapers/crossref.ts +136 -0
- package/src/web/scrapers/devto.ts +147 -0
- package/src/web/scrapers/discogs.ts +306 -0
- package/src/web/scrapers/discourse.ts +197 -0
- package/src/web/scrapers/dockerhub.ts +138 -0
- package/src/web/scrapers/docs-rs.ts +663 -0
- package/src/web/scrapers/fdroid.ts +134 -0
- package/src/web/scrapers/firefox-addons.ts +191 -0
- package/src/web/scrapers/flathub.ts +223 -0
- package/src/web/scrapers/github-gist.ts +58 -0
- package/src/web/scrapers/github.ts +800 -0
- package/src/web/scrapers/gitlab.ts +401 -0
- package/src/web/scrapers/go-pkg.ts +266 -0
- package/src/web/scrapers/hackage.ts +129 -0
- package/src/web/scrapers/hackernews.ts +189 -0
- package/src/web/scrapers/hex.ts +105 -0
- package/src/web/scrapers/huggingface.ts +321 -0
- package/src/web/scrapers/iacr.ts +89 -0
- package/src/web/scrapers/index.ts +252 -0
- package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
- package/src/web/scrapers/lemmy.ts +203 -0
- package/src/web/scrapers/lobsters.ts +175 -0
- package/src/web/scrapers/mastodon.ts +292 -0
- package/src/web/scrapers/maven.ts +138 -0
- package/src/web/scrapers/mdn.ts +173 -0
- package/src/web/scrapers/metacpan.ts +222 -0
- package/src/web/scrapers/musicbrainz.ts +250 -0
- package/src/web/scrapers/npm.ts +98 -0
- package/src/web/scrapers/nuget.ts +183 -0
- package/src/web/scrapers/nvd.ts +222 -0
- package/src/web/scrapers/ollama.ts +239 -0
- package/src/web/scrapers/open-vsx.ts +106 -0
- package/src/web/scrapers/opencorporates.ts +292 -0
- package/src/web/scrapers/openlibrary.ts +336 -0
- package/src/web/scrapers/orcid.ts +286 -0
- package/src/web/scrapers/osv.ts +176 -0
- package/src/web/scrapers/packagist.ts +160 -0
- package/src/web/scrapers/pub-dev.ts +143 -0
- package/src/web/scrapers/pubmed.ts +211 -0
- package/src/web/scrapers/pypi.ts +112 -0
- package/src/web/scrapers/rawg.ts +110 -0
- package/src/web/scrapers/readthedocs.ts +121 -0
- package/src/web/scrapers/reddit.ts +95 -0
- package/src/web/scrapers/repology.ts +251 -0
- package/src/web/scrapers/rfc.ts +201 -0
- package/src/web/scrapers/rubygems.ts +103 -0
- package/src/web/scrapers/searchcode.ts +189 -0
- package/src/web/scrapers/sec-edgar.ts +261 -0
- package/src/web/scrapers/semantic-scholar.ts +171 -0
- package/src/web/scrapers/snapcraft.ts +187 -0
- package/src/web/scrapers/sourcegraph.ts +336 -0
- package/src/web/scrapers/spdx.ts +108 -0
- package/src/web/scrapers/spotify.ts +198 -0
- package/src/web/scrapers/stackoverflow.ts +120 -0
- package/src/web/scrapers/terraform.ts +277 -0
- package/src/web/scrapers/tldr.ts +47 -0
- package/src/web/scrapers/twitter.ts +94 -0
- package/src/web/scrapers/types.ts +354 -0
- package/src/web/scrapers/utils.ts +109 -0
- package/src/web/scrapers/vimeo.ts +133 -0
- package/src/web/scrapers/vscode-marketplace.ts +187 -0
- package/src/web/scrapers/w3c.ts +156 -0
- package/src/web/scrapers/wikidata.ts +344 -0
- package/src/web/scrapers/wikipedia.ts +84 -0
- package/src/web/scrapers/youtube.ts +325 -0
- package/src/web/search/index.ts +393 -0
- package/src/web/search/provider.ts +272 -0
- package/src/web/search/providers/anthropic.ts +406 -0
- package/src/web/search/providers/base.ts +112 -0
- package/src/web/search/providers/brave.ts +181 -0
- package/src/web/search/providers/browser-headers.ts +82 -0
- package/src/web/search/providers/browser-page.ts +125 -0
- package/src/web/search/providers/codex.ts +788 -0
- package/src/web/search/providers/duckduckgo.ts +382 -0
- package/src/web/search/providers/ecosia.ts +183 -0
- package/src/web/search/providers/exa.ts +513 -0
- package/src/web/search/providers/firecrawl.ts +213 -0
- package/src/web/search/providers/gemini.ts +634 -0
- package/src/web/search/providers/google.ts +195 -0
- package/src/web/search/providers/jina.ts +144 -0
- package/src/web/search/providers/kagi.ts +98 -0
- package/src/web/search/providers/kimi.ts +221 -0
- package/src/web/search/providers/mojeek.ts +220 -0
- package/src/web/search/providers/parallel.ts +186 -0
- package/src/web/search/providers/perplexity-auth.ts +142 -0
- package/src/web/search/providers/perplexity.ts +997 -0
- package/src/web/search/providers/public.ts +199 -0
- package/src/web/search/providers/searxng.ts +467 -0
- package/src/web/search/providers/startpage.ts +225 -0
- package/src/web/search/providers/synthetic.ts +126 -0
- package/src/web/search/providers/tavily.ts +244 -0
- package/src/web/search/providers/tinyfish.ts +166 -0
- package/src/web/search/providers/utils.ts +130 -0
- package/src/web/search/providers/xai.ts +372 -0
- package/src/web/search/providers/zai.ts +452 -0
- package/src/web/search/query.ts +850 -0
- package/src/web/search/render.ts +262 -0
- package/src/web/search/types.ts +518 -0
- package/src/web/search/utils.ts +17 -0
- package/src/workspace-tree.ts +326 -0
|
@@ -0,0 +1,939 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as os from "node:os";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { $which, getPuppeteerDir, logger, removeWithRetries } from "@oh-my-pi/pi-utils";
|
|
5
|
+
import type * as BrowsersNs from "@oh-my-pi/pi-utils/browsers";
|
|
6
|
+
import type { Browser, CDPSession, Page, default as Puppeteer, Target } from "puppeteer-core";
|
|
7
|
+
import stealthTamperingScript from "../puppeteer/00_stealth_tampering.txt" with { type: "text" };
|
|
8
|
+
import stealthActivityScript from "../puppeteer/01_stealth_activity.txt" with { type: "text" };
|
|
9
|
+
import stealthHairlineScript from "../puppeteer/02_stealth_hairline.txt" with { type: "text" };
|
|
10
|
+
import stealthBotdScript from "../puppeteer/03_stealth_botd.txt" with { type: "text" };
|
|
11
|
+
import stealthIframeScript from "../puppeteer/04_stealth_iframe.txt" with { type: "text" };
|
|
12
|
+
import stealthWebglScript from "../puppeteer/05_stealth_webgl.txt" with { type: "text" };
|
|
13
|
+
import stealthScreenScript from "../puppeteer/06_stealth_screen.txt" with { type: "text" };
|
|
14
|
+
import stealthFontsScript from "../puppeteer/07_stealth_fonts.txt" with { type: "text" };
|
|
15
|
+
import stealthAudioScript from "../puppeteer/08_stealth_audio.txt" with { type: "text" };
|
|
16
|
+
import stealthLocaleScript from "../puppeteer/09_stealth_locale.txt" with { type: "text" };
|
|
17
|
+
import stealthPluginsScript from "../puppeteer/10_stealth_plugins.txt" with { type: "text" };
|
|
18
|
+
import stealthHardwareScript from "../puppeteer/11_stealth_hardware.txt" with { type: "text" };
|
|
19
|
+
import stealthCodecsScript from "../puppeteer/12_stealth_codecs.txt" with { type: "text" };
|
|
20
|
+
import stealthWorkerScript from "../puppeteer/13_stealth_worker.txt" with { type: "text" };
|
|
21
|
+
import { ToolError } from "../tool-errors";
|
|
22
|
+
|
|
23
|
+
export const DEFAULT_VIEWPORT = { width: 1365, height: 768, deviceScaleFactor: 1.25 };
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Per-CDP-message timeout applied to every puppeteer launch/connect. Set above
|
|
27
|
+
* `TOOL_TIMEOUTS.browser.max` (30s) so the agent-side wall-clock is the canonical
|
|
28
|
+
* limit; this constant only catches genuinely stuck CDP sockets (renderer wedged,
|
|
29
|
+
* connection dropped, etc.).
|
|
30
|
+
*/
|
|
31
|
+
export const BROWSER_PROTOCOL_TIMEOUT_MS = 60_000;
|
|
32
|
+
const ENABLE_AUTOMATION_FLAG = "--enable-automation";
|
|
33
|
+
// Automation-tell launch flags that puppeteer-core adds by default. We suppress
|
|
34
|
+
// them via `ignoreDefaultArgs` (the supported escape hatch) to mirror xxxx's
|
|
35
|
+
// chromiumSwitches patch. `--enable-automation` is the loudest: it normally sets
|
|
36
|
+
// navigator.webdriver=true and shows the "controlled by automated software" infobar.
|
|
37
|
+
// Edge is the launch-stability exception: it can exit before CDP opens when this
|
|
38
|
+
// default flag is stripped, so Edge keeps Puppeteer's flag while our explicit
|
|
39
|
+
// `--disable-blink-features=AutomationControlled` launch arg still handles
|
|
40
|
+
// navigator.webdriver.
|
|
41
|
+
// `ignoreDefaultArgs` does exact-string matching, so each entry must be a flag that
|
|
42
|
+
// puppeteer emits verbatim. The default `--disable-features=...` string can't be
|
|
43
|
+
// matched this way; it is neutralized in the puppeteer-core patch (ChromeLauncher).
|
|
44
|
+
const STEALTH_IGNORE_DEFAULT_ARGS = [
|
|
45
|
+
ENABLE_AUTOMATION_FLAG,
|
|
46
|
+
"--disable-extensions",
|
|
47
|
+
"--disable-default-apps",
|
|
48
|
+
"--disable-component-extensions-with-background-pages",
|
|
49
|
+
"--disable-popup-blocking",
|
|
50
|
+
"--disable-client-side-phishing-detection",
|
|
51
|
+
"--allow-pre-commit-input",
|
|
52
|
+
"--disable-ipc-flooding-protection",
|
|
53
|
+
"--metrics-recording-only",
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
function isMicrosoftEdgeExecutable(executablePath: string | undefined): boolean {
|
|
57
|
+
if (!executablePath) return false;
|
|
58
|
+
const normalizedPath = executablePath.replaceAll("\\", "/").toLowerCase();
|
|
59
|
+
const executableName = normalizedPath.slice(normalizedPath.lastIndexOf("/") + 1);
|
|
60
|
+
return (
|
|
61
|
+
executableName === "msedge.exe" ||
|
|
62
|
+
executableName === "microsoft edge" ||
|
|
63
|
+
executableName.startsWith("microsoft-edge")
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function stealthIgnoreDefaultArgs(executablePath: string | undefined): string[] {
|
|
68
|
+
if (!isMicrosoftEdgeExecutable(executablePath)) return [...STEALTH_IGNORE_DEFAULT_ARGS];
|
|
69
|
+
return STEALTH_IGNORE_DEFAULT_ARGS.filter(arg => arg !== ENABLE_AUTOMATION_FLAG);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const STEALTH_ACCEPT_LANGUAGE = "en-US,en";
|
|
73
|
+
|
|
74
|
+
const USER_AGENT_TARGET_TIMEOUT_MS = 5_000;
|
|
75
|
+
const USER_AGENT_TARGET_TYPES = new Set(["page", "webview", "background_page"]);
|
|
76
|
+
const PUPPETEER_SOURCE_URL_SUFFIX = "//# sourceURL=__puppeteer_evaluation_script__";
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Lazy-import puppeteer from a safe CWD so cosmiconfig doesn't choke
|
|
80
|
+
* on malformed package.json files in the user's project tree.
|
|
81
|
+
*
|
|
82
|
+
* Dynamic import is required because puppeteer-core probes the cwd at module
|
|
83
|
+
* load time; we must `process.chdir` to a safe scratch dir before loading and
|
|
84
|
+
* restore cwd afterwards. A static import would run at module-init time before
|
|
85
|
+
* cwd is safe.
|
|
86
|
+
*/
|
|
87
|
+
let puppeteerModule: typeof Puppeteer | undefined;
|
|
88
|
+
export async function loadPuppeteer(): Promise<typeof Puppeteer> {
|
|
89
|
+
if (puppeteerModule) return puppeteerModule;
|
|
90
|
+
const prev = process.cwd();
|
|
91
|
+
const safeDir = getPuppeteerDir();
|
|
92
|
+
await Bun.write(path.join(safeDir, "package.json"), "{}");
|
|
93
|
+
try {
|
|
94
|
+
process.chdir(safeDir);
|
|
95
|
+
puppeteerModule = (await import("puppeteer-core")).default;
|
|
96
|
+
return puppeteerModule;
|
|
97
|
+
} finally {
|
|
98
|
+
process.chdir(prev);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
let puppeteerModuleWorker: typeof Puppeteer | undefined;
|
|
103
|
+
export async function loadPuppeteerInWorker(safeDir: string): Promise<typeof Puppeteer> {
|
|
104
|
+
if (puppeteerModuleWorker) return puppeteerModuleWorker;
|
|
105
|
+
const orig = process.cwd;
|
|
106
|
+
Object.defineProperty(process, "cwd", { value: () => safeDir, configurable: true });
|
|
107
|
+
try {
|
|
108
|
+
puppeteerModuleWorker = (await import("puppeteer-core")).default;
|
|
109
|
+
return puppeteerModuleWorker;
|
|
110
|
+
} finally {
|
|
111
|
+
Object.defineProperty(process, "cwd", { value: orig, configurable: true });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
let browsersModule: typeof BrowsersNs | undefined;
|
|
116
|
+
async function loadBrowsers(): Promise<typeof BrowsersNs> {
|
|
117
|
+
if (!browsersModule) {
|
|
118
|
+
browsersModule = await import("@oh-my-pi/pi-utils/browsers");
|
|
119
|
+
}
|
|
120
|
+
return browsersModule;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Resolve the Chromium executable puppeteer will launch, honoring
|
|
125
|
+
* PUPPETEER_EXECUTABLE_PATH before system browser detection and lazily
|
|
126
|
+
* downloading Chromium otherwise. The browser is cached under
|
|
127
|
+
* ~/.omp/puppeteer (getPuppeteerDir). Returns undefined when platform
|
|
128
|
+
* detection fails (puppeteer default resolution takes over). Exported so
|
|
129
|
+
* real-browser tests can probe launchability and skip on hosts missing
|
|
130
|
+
* Chrome's system libraries.
|
|
131
|
+
*/
|
|
132
|
+
let chromiumExecutablePromise: Promise<string | undefined> | undefined;
|
|
133
|
+
export async function ensureChromiumExecutable(): Promise<string | undefined> {
|
|
134
|
+
const envPath = process.env.PUPPETEER_EXECUTABLE_PATH;
|
|
135
|
+
if (envPath) return envPath;
|
|
136
|
+
const sysChrome = await resolveSystemChromium();
|
|
137
|
+
if (sysChrome) return sysChrome;
|
|
138
|
+
if (chromiumExecutablePromise) return chromiumExecutablePromise;
|
|
139
|
+
|
|
140
|
+
chromiumExecutablePromise = (async () => {
|
|
141
|
+
const browsers = await loadBrowsers();
|
|
142
|
+
const platform = browsers.detectBrowserPlatform();
|
|
143
|
+
if (!platform) {
|
|
144
|
+
logger.warn("Could not detect browser platform; relying on puppeteer default resolution");
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
const cacheDir = getPuppeteerDir();
|
|
148
|
+
const { PUPPETEER_REVISIONS } = await import("puppeteer-core/internal/revisions.js");
|
|
149
|
+
const buildId = await browsers.resolveBuildId(browsers.Browser.CHROME, platform, PUPPETEER_REVISIONS.chrome);
|
|
150
|
+
const executablePath = browsers.computeExecutablePath({
|
|
151
|
+
browser: browsers.Browser.CHROME,
|
|
152
|
+
buildId,
|
|
153
|
+
cacheDir,
|
|
154
|
+
platform,
|
|
155
|
+
});
|
|
156
|
+
if (fs.existsSync(executablePath)) return executablePath;
|
|
157
|
+
|
|
158
|
+
logger.warn("Downloading Chromium for puppeteer (first browser use)", {
|
|
159
|
+
buildId,
|
|
160
|
+
platform,
|
|
161
|
+
cacheDir,
|
|
162
|
+
});
|
|
163
|
+
let lastReportedPercent = -1;
|
|
164
|
+
await browsers.install({
|
|
165
|
+
browser: browsers.Browser.CHROME,
|
|
166
|
+
buildId,
|
|
167
|
+
cacheDir,
|
|
168
|
+
platform,
|
|
169
|
+
downloadProgressCallback: ({ downloadedBytes, totalBytes }) => {
|
|
170
|
+
if (totalBytes <= 0) return;
|
|
171
|
+
const pct = Math.floor((downloadedBytes / totalBytes) * 100);
|
|
172
|
+
if (pct >= lastReportedPercent + 10 || downloadedBytes === totalBytes) {
|
|
173
|
+
lastReportedPercent = pct;
|
|
174
|
+
logger.debug(
|
|
175
|
+
`Chromium download: ${pct}% (${Math.round(downloadedBytes / 1_000_000)} / ${Math.round(totalBytes / 1_000_000)} MB)`,
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
return executablePath;
|
|
181
|
+
})().catch(err => {
|
|
182
|
+
chromiumExecutablePromise = undefined;
|
|
183
|
+
throw new ToolError(
|
|
184
|
+
`Failed to install Chromium for puppeteer: ${(err as Error).message}. ` +
|
|
185
|
+
"Set PUPPETEER_EXECUTABLE_PATH to use an existing Chrome/Chromium binary, or install one manually.",
|
|
186
|
+
);
|
|
187
|
+
});
|
|
188
|
+
return chromiumExecutablePromise;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
let resolvedChromium: string | null | undefined; // undefined = unchecked; null = not found
|
|
192
|
+
|
|
193
|
+
function isExecutableFile(p: string): boolean {
|
|
194
|
+
try {
|
|
195
|
+
const st = fs.statSync(p);
|
|
196
|
+
if (!st.isFile()) return false;
|
|
197
|
+
if (process.platform === "win32") return true;
|
|
198
|
+
fs.accessSync(p, fs.constants.X_OK);
|
|
199
|
+
return true;
|
|
200
|
+
} catch {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
async function isChromiumExecutable(p: string): Promise<boolean> {
|
|
206
|
+
if (!isExecutableFile(p)) return false;
|
|
207
|
+
try {
|
|
208
|
+
const probeTimeoutMs = 3000;
|
|
209
|
+
const proc = Bun.spawn([p, "--version"], {
|
|
210
|
+
stdout: "pipe",
|
|
211
|
+
stderr: "ignore",
|
|
212
|
+
signal: AbortSignal.timeout(probeTimeoutMs),
|
|
213
|
+
killSignal: "SIGKILL",
|
|
214
|
+
});
|
|
215
|
+
const stdout = await Promise.race([
|
|
216
|
+
new Response(proc.stdout).text(),
|
|
217
|
+
Bun.sleep(probeTimeoutMs + 500).then(() => null),
|
|
218
|
+
]);
|
|
219
|
+
if (stdout === null) return false;
|
|
220
|
+
await proc.exited;
|
|
221
|
+
return proc.exitCode === 0 && /Chrom|Edg/i.test(stdout);
|
|
222
|
+
} catch {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** Flatpak application id published by the Ungoogled Chromium project. */
|
|
228
|
+
const UNGOOGLED_CHROMIUM_FLATPAK_ID = "io.github.ungoogled_software.ungoogled_chromium";
|
|
229
|
+
|
|
230
|
+
function systemChromiumCandidates(
|
|
231
|
+
platform: NodeJS.Platform = process.platform,
|
|
232
|
+
home = os.homedir(),
|
|
233
|
+
which: (name: string) => string | null | undefined = $which,
|
|
234
|
+
): string[] {
|
|
235
|
+
const candidates: string[] = [];
|
|
236
|
+
switch (platform) {
|
|
237
|
+
case "darwin": {
|
|
238
|
+
for (const root of ["/Applications", path.join(home, "Applications")]) {
|
|
239
|
+
candidates.push(
|
|
240
|
+
path.join(root, "Google Chrome.app/Contents/MacOS/Google Chrome"),
|
|
241
|
+
path.join(root, "Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta"),
|
|
242
|
+
path.join(root, "Google Chrome Dev.app/Contents/MacOS/Google Chrome Dev"),
|
|
243
|
+
path.join(root, "Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary"),
|
|
244
|
+
path.join(root, "Chromium.app/Contents/MacOS/Chromium"),
|
|
245
|
+
path.join(root, "Microsoft Edge.app/Contents/MacOS/Microsoft Edge"),
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
case "linux": {
|
|
251
|
+
const names = ["google-chrome-stable", "google-chrome", "chromium", "chromium-browser", "chrome"];
|
|
252
|
+
for (const name of names) {
|
|
253
|
+
const found = which(name);
|
|
254
|
+
if (found) candidates.push(found);
|
|
255
|
+
}
|
|
256
|
+
candidates.push(
|
|
257
|
+
"/usr/bin/google-chrome-stable",
|
|
258
|
+
"/usr/bin/google-chrome",
|
|
259
|
+
"/usr/bin/chromium",
|
|
260
|
+
"/usr/bin/chromium-browser",
|
|
261
|
+
"/snap/bin/chromium",
|
|
262
|
+
"/var/lib/flatpak/exports/bin/com.google.Chrome",
|
|
263
|
+
"/var/lib/flatpak/exports/bin/org.chromium.Chromium",
|
|
264
|
+
);
|
|
265
|
+
let onNixos = false;
|
|
266
|
+
try {
|
|
267
|
+
onNixos = fs.existsSync("/etc/NIXOS");
|
|
268
|
+
} catch {}
|
|
269
|
+
if (onNixos) {
|
|
270
|
+
candidates.push(path.join(home, ".nix-profile/bin/chromium"), "/run/current-system/sw/bin/chromium");
|
|
271
|
+
}
|
|
272
|
+
for (const name of ["ungoogled-chromium", "ungoogled-chromium-browser"]) {
|
|
273
|
+
const found = which(name);
|
|
274
|
+
if (found) candidates.push(found);
|
|
275
|
+
}
|
|
276
|
+
candidates.push(
|
|
277
|
+
// Ungoogled Chromium. Distro and AUR packages that keep the plain
|
|
278
|
+
// `chromium` name are already covered above; these are the paths
|
|
279
|
+
// unique to it, including the system and per-user Flatpak shims.
|
|
280
|
+
"/usr/bin/ungoogled-chromium",
|
|
281
|
+
"/usr/bin/ungoogled-chromium-browser",
|
|
282
|
+
`/var/lib/flatpak/exports/bin/${UNGOOGLED_CHROMIUM_FLATPAK_ID}`,
|
|
283
|
+
path.join(home, ".local/share/flatpak/exports/bin", UNGOOGLED_CHROMIUM_FLATPAK_ID),
|
|
284
|
+
);
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
case "win32": {
|
|
288
|
+
const programFiles = process.env.ProgramFiles ?? "C:\\Program Files";
|
|
289
|
+
const programFilesX86 = process.env["ProgramFiles(x86)"] ?? "C:\\Program Files (x86)";
|
|
290
|
+
const localAppData = process.env.LOCALAPPDATA ?? path.join(home, "AppData\\Local");
|
|
291
|
+
candidates.push(
|
|
292
|
+
path.join(programFiles, "Google\\Chrome\\Application\\chrome.exe"),
|
|
293
|
+
path.join(programFilesX86, "Google\\Chrome\\Application\\chrome.exe"),
|
|
294
|
+
path.join(localAppData, "Google\\Chrome\\Application\\chrome.exe"),
|
|
295
|
+
path.join(programFiles, "Chromium\\Application\\chrome.exe"),
|
|
296
|
+
path.join(localAppData, "Chromium\\Application\\chrome.exe"),
|
|
297
|
+
path.join(programFiles, "Microsoft\\Edge\\Application\\msedge.exe"),
|
|
298
|
+
path.join(programFilesX86, "Microsoft\\Edge\\Application\\msedge.exe"),
|
|
299
|
+
);
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return candidates;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
async function resolveSystemChromium(): Promise<string | undefined> {
|
|
307
|
+
if (resolvedChromium !== undefined) return resolvedChromium ?? undefined;
|
|
308
|
+
const seen = new Set<string>();
|
|
309
|
+
for (const candidate of systemChromiumCandidates()) {
|
|
310
|
+
if (!candidate || seen.has(candidate)) continue;
|
|
311
|
+
seen.add(candidate);
|
|
312
|
+
if (await isChromiumExecutable(candidate)) {
|
|
313
|
+
resolvedChromium = candidate;
|
|
314
|
+
logger.debug("Using system Chrome/Chromium", { path: candidate });
|
|
315
|
+
return candidate;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
resolvedChromium = null;
|
|
319
|
+
return undefined;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/** Options shared by headless Chromium consumers. */
|
|
323
|
+
export interface LaunchHeadlessOptions {
|
|
324
|
+
headless: boolean;
|
|
325
|
+
viewport?: { width: number; height: number; deviceScaleFactor?: number };
|
|
326
|
+
/** Additional Chromium arguments merged with the centralized launch defaults. */
|
|
327
|
+
args?: readonly string[];
|
|
328
|
+
/** Additional exact Puppeteer default arguments to suppress. */
|
|
329
|
+
ignoreDefaultArgs?: readonly string[];
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/** Result of a headless Chromium launch. */
|
|
333
|
+
export interface LaunchHeadlessResult {
|
|
334
|
+
browser: Browser;
|
|
335
|
+
/**
|
|
336
|
+
* OMP-owned temporary Chromium profile directory to remove after the browser
|
|
337
|
+
* process tree exits, or `undefined` when the caller supplied its own
|
|
338
|
+
* `--user-data-dir` (which OMP must not delete).
|
|
339
|
+
*/
|
|
340
|
+
userDataDir?: string;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Base Chromium argv shared by process-local puppeteer launches and the
|
|
345
|
+
* broker-owned shared browser: sandbox/stealth flags, window size, and
|
|
346
|
+
* PUPPETEER_PROXY* env-derived proxy flags.
|
|
347
|
+
*/
|
|
348
|
+
export function buildHeadlessLaunchArgs(viewport: { width: number; height: number }): string[] {
|
|
349
|
+
const launchArgs = [
|
|
350
|
+
"--no-sandbox",
|
|
351
|
+
"--disable-setuid-sandbox",
|
|
352
|
+
"--disable-blink-features=AutomationControlled",
|
|
353
|
+
`--window-size=${viewport.width},${viewport.height}`,
|
|
354
|
+
];
|
|
355
|
+
const proxy = process.env.PUPPETEER_PROXY;
|
|
356
|
+
if (proxy) {
|
|
357
|
+
launchArgs.push(`--proxy-server=${proxy}`);
|
|
358
|
+
// Chrome (since v72) bypasses proxies for localhost by default. When PUPPETEER_PROXY_BYPASS_LOOPBACK
|
|
359
|
+
// is true, add <-loopback> so traffic to localhost reaches the proxy (e.g. for mitmdump/auth capture).
|
|
360
|
+
const bypassLoopback = process.env.PUPPETEER_PROXY_BYPASS_LOOPBACK?.toLowerCase();
|
|
361
|
+
if (bypassLoopback === "true" || bypassLoopback === "1" || bypassLoopback === "yes" || bypassLoopback === "on") {
|
|
362
|
+
launchArgs.push("--proxy-bypass-list=<-loopback>");
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
const ignoreCert = process.env.PUPPETEER_PROXY_IGNORE_CERT_ERRORS?.toLowerCase();
|
|
366
|
+
if (ignoreCert === "true" || ignoreCert === "1" || ignoreCert === "yes" || ignoreCert === "on") {
|
|
367
|
+
launchArgs.push("--ignore-certificate-errors");
|
|
368
|
+
}
|
|
369
|
+
return launchArgs;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
export async function launchHeadlessBrowser(opts: LaunchHeadlessOptions): Promise<LaunchHeadlessResult> {
|
|
373
|
+
const vp = opts.viewport ?? DEFAULT_VIEWPORT;
|
|
374
|
+
const initialViewport = {
|
|
375
|
+
width: vp.width,
|
|
376
|
+
height: vp.height,
|
|
377
|
+
deviceScaleFactor: vp.deviceScaleFactor ?? DEFAULT_VIEWPORT.deviceScaleFactor,
|
|
378
|
+
};
|
|
379
|
+
const puppeteer = await loadPuppeteer();
|
|
380
|
+
const launchArgs = buildHeadlessLaunchArgs(initialViewport);
|
|
381
|
+
for (const arg of opts.args ?? []) {
|
|
382
|
+
if (!launchArgs.includes(arg)) launchArgs.push(arg);
|
|
383
|
+
}
|
|
384
|
+
// Own the Chromium profile directory instead of letting puppeteer-core create
|
|
385
|
+
// (and delete) a temporary one. Passing `--user-data-dir` makes puppeteer
|
|
386
|
+
// treat the profile as non-temporary, so `ChromeLauncher.cleanUserDataDir`
|
|
387
|
+
// becomes a no-op and can no longer reject its eager process-exit hook with an
|
|
388
|
+
// unhandled EBUSY when Chromium still holds the profile lock on Windows
|
|
389
|
+
// (issue #7058). `removeUserDataDir` cleans it up on our terms instead.
|
|
390
|
+
let userDataDir: string | undefined;
|
|
391
|
+
if (!launchArgs.some(arg => arg.startsWith("--user-data-dir"))) {
|
|
392
|
+
userDataDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "omp-chrome-profile-"));
|
|
393
|
+
launchArgs.push(`--user-data-dir=${userDataDir}`);
|
|
394
|
+
}
|
|
395
|
+
try {
|
|
396
|
+
const executablePath = await ensureChromiumExecutable();
|
|
397
|
+
const browser = await puppeteer.launch({
|
|
398
|
+
headless: opts.headless,
|
|
399
|
+
defaultViewport: opts.headless ? initialViewport : null,
|
|
400
|
+
executablePath,
|
|
401
|
+
args: launchArgs,
|
|
402
|
+
ignoreDefaultArgs: [
|
|
403
|
+
...new Set([...stealthIgnoreDefaultArgs(executablePath), ...(opts.ignoreDefaultArgs ?? [])]),
|
|
404
|
+
],
|
|
405
|
+
protocolTimeout: BROWSER_PROTOCOL_TIMEOUT_MS,
|
|
406
|
+
});
|
|
407
|
+
return { browser, userDataDir };
|
|
408
|
+
} catch (error) {
|
|
409
|
+
if (userDataDir) await removeUserDataDir(userDataDir);
|
|
410
|
+
throw error;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/** Fully resolved executable and argv for a broker-spawned shared Chromium. */
|
|
415
|
+
export interface SharedBrowserLaunchSpec {
|
|
416
|
+
executablePath: string;
|
|
417
|
+
args: string[];
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Resolve the executable and complete argv for a shared Chromium the daemon
|
|
422
|
+
* broker spawns directly (no puppeteer inside the broker). Mirrors
|
|
423
|
+
* `launchHeadlessBrowser` flag assembly — puppeteer's default args minus the
|
|
424
|
+
* stealth-suppressed set — plus `--remote-debugging-port=0` so every client
|
|
425
|
+
* attaches over CDP. Returns null when no Chromium executable resolves;
|
|
426
|
+
* callers fall back to a process-local launch.
|
|
427
|
+
*/
|
|
428
|
+
export async function resolveSharedBrowserLaunchSpec(opts: {
|
|
429
|
+
headless: boolean;
|
|
430
|
+
userDataDir: string;
|
|
431
|
+
viewport?: { width: number; height: number };
|
|
432
|
+
}): Promise<SharedBrowserLaunchSpec | null> {
|
|
433
|
+
const executablePath = await ensureChromiumExecutable();
|
|
434
|
+
if (!executablePath) return null;
|
|
435
|
+
const puppeteer = await loadPuppeteer();
|
|
436
|
+
const vp = opts.viewport ?? DEFAULT_VIEWPORT;
|
|
437
|
+
const ignored = new Set(stealthIgnoreDefaultArgs(executablePath));
|
|
438
|
+
const defaults = await puppeteer.defaultArgs({
|
|
439
|
+
headless: opts.headless,
|
|
440
|
+
args: buildHeadlessLaunchArgs(vp),
|
|
441
|
+
userDataDir: opts.userDataDir,
|
|
442
|
+
});
|
|
443
|
+
return {
|
|
444
|
+
executablePath,
|
|
445
|
+
args: [...defaults.filter(arg => !ignored.has(arg)), "--remote-debugging-port=0"],
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/**
|
|
450
|
+
* Remove an OMP-owned headless Chromium profile directory, tolerating the brief
|
|
451
|
+
* window on Windows in which Chromium (or an orphaned browser subprocess) still
|
|
452
|
+
* holds the profile lock. The shared temp remover centralizes retry handling
|
|
453
|
+
* for EBUSY/EPERM/ENOTEMPTY; if the directory is still busy afterwards we warn
|
|
454
|
+
* and leave it for a later cleanup pass rather than throwing — a shutdown cleanup
|
|
455
|
+
* failure must never crash the process (issue #7058).
|
|
456
|
+
*/
|
|
457
|
+
export async function removeUserDataDir(dir: string): Promise<void> {
|
|
458
|
+
try {
|
|
459
|
+
await removeWithRetries(dir);
|
|
460
|
+
} catch (error) {
|
|
461
|
+
logger.warn("Left Chromium profile directory in place after cleanup failure", {
|
|
462
|
+
dir,
|
|
463
|
+
error: error instanceof Error ? error.message : String(error),
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
export async function applyViewport(
|
|
469
|
+
page: Page,
|
|
470
|
+
viewport?: { width: number; height: number; deviceScaleFactor?: number },
|
|
471
|
+
): Promise<void> {
|
|
472
|
+
if (!viewport) {
|
|
473
|
+
await page.setViewport(DEFAULT_VIEWPORT);
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
await page.setViewport({
|
|
477
|
+
width: viewport.width,
|
|
478
|
+
height: viewport.height,
|
|
479
|
+
deviceScaleFactor: viewport.deviceScaleFactor ?? DEFAULT_VIEWPORT.deviceScaleFactor,
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// =====================================================================
|
|
484
|
+
// Stealth patches
|
|
485
|
+
// =====================================================================
|
|
486
|
+
|
|
487
|
+
interface PuppeteerCdpClient {
|
|
488
|
+
send: (method: string, params?: Record<string, unknown>) => Promise<unknown>;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
export interface UserAgentOverride {
|
|
492
|
+
userAgent: string;
|
|
493
|
+
platform: string;
|
|
494
|
+
acceptLanguage: string;
|
|
495
|
+
userAgentMetadata: {
|
|
496
|
+
brands: Array<{ brand: string; version: string }>;
|
|
497
|
+
fullVersion: string;
|
|
498
|
+
fullVersionList: Array<{ brand: string; version: string }>;
|
|
499
|
+
platform: string;
|
|
500
|
+
platformVersion: string;
|
|
501
|
+
architecture: string;
|
|
502
|
+
bitness: string;
|
|
503
|
+
model: string;
|
|
504
|
+
mobile: boolean;
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
function resolvePageClient(page: Page): PuppeteerCdpClient | null {
|
|
509
|
+
const pageWithClient = page as Page & {
|
|
510
|
+
_client?: (() => PuppeteerCdpClient) | PuppeteerCdpClient;
|
|
511
|
+
};
|
|
512
|
+
if (!pageWithClient._client) return null;
|
|
513
|
+
return typeof pageWithClient._client === "function" ? pageWithClient._client() : pageWithClient._client;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
const patchedClients = new WeakSet<object>();
|
|
517
|
+
|
|
518
|
+
function patchSourceUrl(page: Page): void {
|
|
519
|
+
const client = resolvePageClient(page);
|
|
520
|
+
if (!client) return;
|
|
521
|
+
const clientKey = client as object;
|
|
522
|
+
if (patchedClients.has(clientKey)) return;
|
|
523
|
+
patchedClients.add(clientKey);
|
|
524
|
+
const originalSend = client.send.bind(client);
|
|
525
|
+
client.send = async (method: string, params?: Record<string, unknown>) => {
|
|
526
|
+
const next = async (payload?: Record<string, unknown>) => {
|
|
527
|
+
try {
|
|
528
|
+
return await originalSend(method, payload);
|
|
529
|
+
} catch (error) {
|
|
530
|
+
if (
|
|
531
|
+
error instanceof Error &&
|
|
532
|
+
error.message.includes(
|
|
533
|
+
"Protocol error (Network.getResponseBody): No resource with given identifier found",
|
|
534
|
+
)
|
|
535
|
+
) {
|
|
536
|
+
return undefined;
|
|
537
|
+
}
|
|
538
|
+
throw error;
|
|
539
|
+
}
|
|
540
|
+
};
|
|
541
|
+
if (!method || !params) {
|
|
542
|
+
return next(params);
|
|
543
|
+
}
|
|
544
|
+
const key =
|
|
545
|
+
method === "Runtime.evaluate"
|
|
546
|
+
? "expression"
|
|
547
|
+
: method === "Runtime.callFunctionOn"
|
|
548
|
+
? "functionDeclaration"
|
|
549
|
+
: null;
|
|
550
|
+
if (!key) {
|
|
551
|
+
return next(params);
|
|
552
|
+
}
|
|
553
|
+
const value = params[key];
|
|
554
|
+
if (typeof value !== "string" || !value.includes(PUPPETEER_SOURCE_URL_SUFFIX)) {
|
|
555
|
+
return next(params);
|
|
556
|
+
}
|
|
557
|
+
const patchedParams = { ...params, [key]: value.replace(PUPPETEER_SOURCE_URL_SUFFIX, "") };
|
|
558
|
+
return next(patchedParams);
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
async function resolveMacOsProductVersion(): Promise<string> {
|
|
563
|
+
if (os.platform() !== "darwin") return "";
|
|
564
|
+
try {
|
|
565
|
+
const plist = await Bun.file("/System/Library/CoreServices/SystemVersion.plist").text();
|
|
566
|
+
return plist.match(/<key>ProductVersion<\/key>\s*<string>([^<]+)<\/string>/)?.[1] ?? "";
|
|
567
|
+
} catch {
|
|
568
|
+
return "";
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
function resolveHostArchitecture(): string {
|
|
573
|
+
if (os.arch() === "arm64") return "arm";
|
|
574
|
+
if (os.arch().includes("64")) return "x86";
|
|
575
|
+
return "";
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
function resolveHostBitness(): string {
|
|
579
|
+
return os.arch().includes("64") ? "64" : "";
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
async function resolveUserAgentOverride(page: Page): Promise<UserAgentOverride> {
|
|
583
|
+
const rawUserAgent = await page.browser().userAgent();
|
|
584
|
+
let userAgent = rawUserAgent.replace("HeadlessChrome/", "Chrome/");
|
|
585
|
+
if (userAgent.includes("Linux") && !userAgent.includes("Android")) {
|
|
586
|
+
userAgent = userAgent.replace(/\(([^)]+)\)/, "(Windows NT 10.0; Win64; x64)");
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
const uaVersionMatch = userAgent.match(/Chrome\/([\d|.]+)/);
|
|
590
|
+
const browserVersionMatch = (await page.browser().version()).match(/\/([\d|.]+)/);
|
|
591
|
+
const legacyVersion = uaVersionMatch?.[1] ?? browserVersionMatch?.[1] ?? "0";
|
|
592
|
+
const fullVersion = browserVersionMatch?.[1] ?? legacyVersion;
|
|
593
|
+
const majorVersion = Number.parseInt(legacyVersion.split(".")[0] ?? "0", 10) || 0;
|
|
594
|
+
const isAndroid = userAgent.includes("Android");
|
|
595
|
+
const isMac = userAgent.includes("Mac OS X");
|
|
596
|
+
const isWindows = userAgent.includes("Windows");
|
|
597
|
+
const platform = isMac ? "MacIntel" : isAndroid ? "Android" : userAgent.includes("Linux") ? "Linux" : "Win32";
|
|
598
|
+
const platformFull = isMac ? "macOS" : isAndroid ? "Android" : userAgent.includes("Linux") ? "Linux" : "Windows";
|
|
599
|
+
const platformVersion = isMac
|
|
600
|
+
? await resolveMacOsProductVersion()
|
|
601
|
+
: userAgent.includes("Android ")
|
|
602
|
+
? (userAgent.match(/Android ([^;]+)/)?.[1] ?? "")
|
|
603
|
+
: isWindows
|
|
604
|
+
? (userAgent.match(/Windows NT ([\d.]+)/)?.[1] ?? "")
|
|
605
|
+
: "";
|
|
606
|
+
const architecture = isAndroid ? "" : resolveHostArchitecture();
|
|
607
|
+
const bitness = isAndroid ? "" : resolveHostBitness();
|
|
608
|
+
const model = isAndroid ? (userAgent.match(/Android.*?;\s([^)]+)/)?.[1] ?? "") : "";
|
|
609
|
+
|
|
610
|
+
const brandOrders = [
|
|
611
|
+
[0, 1, 2],
|
|
612
|
+
[0, 2, 1],
|
|
613
|
+
[1, 0, 2],
|
|
614
|
+
[1, 2, 0],
|
|
615
|
+
[2, 0, 1],
|
|
616
|
+
[2, 1, 0],
|
|
617
|
+
];
|
|
618
|
+
const order = brandOrders[majorVersion % brandOrders.length] ?? brandOrders[0]!;
|
|
619
|
+
const escapedChars = [" ", " ", ";"];
|
|
620
|
+
const greaseyBrand = `${escapedChars[order[0]!]}Not${escapedChars[order[1]!]}A${escapedChars[order[2]!]}Brand`;
|
|
621
|
+
const brands: { brand: string; version: string }[] = [];
|
|
622
|
+
brands[order[0]!] = { brand: greaseyBrand, version: "99" };
|
|
623
|
+
brands[order[1]!] = { brand: "Chromium", version: String(majorVersion) };
|
|
624
|
+
brands[order[2]!] = { brand: "Google Chrome", version: String(majorVersion) };
|
|
625
|
+
const fullVersionList = brands.map(({ brand }) => ({
|
|
626
|
+
brand,
|
|
627
|
+
version: brand === greaseyBrand ? "99.0.0.0" : fullVersion,
|
|
628
|
+
}));
|
|
629
|
+
|
|
630
|
+
return {
|
|
631
|
+
userAgent,
|
|
632
|
+
platform,
|
|
633
|
+
acceptLanguage: STEALTH_ACCEPT_LANGUAGE,
|
|
634
|
+
userAgentMetadata: {
|
|
635
|
+
brands,
|
|
636
|
+
fullVersion,
|
|
637
|
+
fullVersionList,
|
|
638
|
+
platform: platformFull,
|
|
639
|
+
platformVersion,
|
|
640
|
+
architecture,
|
|
641
|
+
bitness,
|
|
642
|
+
model,
|
|
643
|
+
mobile: isAndroid,
|
|
644
|
+
},
|
|
645
|
+
};
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
function wrapSession(session: CDPSession): PuppeteerCdpClient {
|
|
649
|
+
return {
|
|
650
|
+
send: async (method, params) => session.send(method as never, params as never),
|
|
651
|
+
};
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
async function sendUserAgentOverride(client: PuppeteerCdpClient, override: UserAgentOverride): Promise<void> {
|
|
655
|
+
try {
|
|
656
|
+
await client.send("Network.enable");
|
|
657
|
+
} catch {}
|
|
658
|
+
try {
|
|
659
|
+
await client.send("Network.setUserAgentOverride", override as unknown as Record<string, unknown>);
|
|
660
|
+
} catch (error) {
|
|
661
|
+
logger.debug("Failed to apply Network user agent override", {
|
|
662
|
+
error: error instanceof Error ? error.message : String(error),
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
try {
|
|
666
|
+
await client.send("Emulation.setUserAgentOverride", override as unknown as Record<string, unknown>);
|
|
667
|
+
} catch (error) {
|
|
668
|
+
logger.debug("Failed to apply Emulation user agent override", {
|
|
669
|
+
error: error instanceof Error ? error.message : String(error),
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
export interface UserAgentSession {
|
|
675
|
+
override: UserAgentOverride;
|
|
676
|
+
browserSession: CDPSession | null;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
/** Configure UA override on the browser + auto-attach to new targets. */
|
|
680
|
+
async function configureUserAgentTargets(
|
|
681
|
+
browser: Browser,
|
|
682
|
+
state: { browserSession: CDPSession | null; override: UserAgentOverride },
|
|
683
|
+
targetTimeoutMs = USER_AGENT_TARGET_TIMEOUT_MS,
|
|
684
|
+
): Promise<void> {
|
|
685
|
+
if (!state.browserSession) {
|
|
686
|
+
state.browserSession = await browser.target().createCDPSession();
|
|
687
|
+
await state.browserSession.send("Target.setAutoAttach", {
|
|
688
|
+
autoAttach: true,
|
|
689
|
+
waitForDebuggerOnStart: false,
|
|
690
|
+
flatten: true,
|
|
691
|
+
});
|
|
692
|
+
state.browserSession.on(
|
|
693
|
+
"Target.attachedToTarget",
|
|
694
|
+
async (event: { sessionId: string; targetInfo?: { type?: string } }) => {
|
|
695
|
+
if (!targetInfoSupportsUserAgentOverride(event.targetInfo)) return;
|
|
696
|
+
const connection = state.browserSession?.connection();
|
|
697
|
+
const session = connection?.session(event.sessionId);
|
|
698
|
+
if (!session) return;
|
|
699
|
+
await withSoftTimeout(
|
|
700
|
+
sendUserAgentOverride(wrapSession(session), state.override),
|
|
701
|
+
targetTimeoutMs,
|
|
702
|
+
"new target user-agent override",
|
|
703
|
+
);
|
|
704
|
+
},
|
|
705
|
+
);
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
const targets = browser.targets().filter(targetSupportsUserAgentOverride);
|
|
709
|
+
await Promise.all(
|
|
710
|
+
targets.map(async target => {
|
|
711
|
+
await withSoftTimeout(
|
|
712
|
+
applyTargetUserAgentOverride(target, state.override),
|
|
713
|
+
targetTimeoutMs,
|
|
714
|
+
"target user-agent override",
|
|
715
|
+
);
|
|
716
|
+
}),
|
|
717
|
+
);
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
function targetSupportsUserAgentOverride(target: Target): boolean {
|
|
721
|
+
return targetInfoSupportsUserAgentOverride({ type: target.type() });
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
function targetInfoSupportsUserAgentOverride(targetInfo: { type?: string } | undefined): boolean {
|
|
725
|
+
return Boolean(targetInfo?.type && USER_AGENT_TARGET_TYPES.has(targetInfo.type));
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
async function applyTargetUserAgentOverride(target: Target, override: UserAgentOverride): Promise<void> {
|
|
729
|
+
const session = await target.createCDPSession();
|
|
730
|
+
try {
|
|
731
|
+
await sendUserAgentOverride(wrapSession(session), override);
|
|
732
|
+
} finally {
|
|
733
|
+
await session.detach().catch(() => undefined);
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
async function withSoftTimeout<T>(promise: Promise<T>, timeoutMs: number, label: string): Promise<T | undefined> {
|
|
738
|
+
let timeout: NodeJS.Timeout | undefined;
|
|
739
|
+
const timeoutPromise = new Promise<undefined>(resolve => {
|
|
740
|
+
timeout = setTimeout(() => {
|
|
741
|
+
logger.debug(`Timed out applying ${label}`);
|
|
742
|
+
resolve(undefined);
|
|
743
|
+
}, timeoutMs);
|
|
744
|
+
});
|
|
745
|
+
try {
|
|
746
|
+
return await Promise.race([
|
|
747
|
+
promise.catch(error => {
|
|
748
|
+
logger.debug(`Failed to apply ${label}`, { error: error instanceof Error ? error.message : String(error) });
|
|
749
|
+
return undefined;
|
|
750
|
+
}),
|
|
751
|
+
timeoutPromise,
|
|
752
|
+
]);
|
|
753
|
+
} finally {
|
|
754
|
+
if (timeout) clearTimeout(timeout);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
const STEALTH_PATCH_SCRIPTS = [
|
|
759
|
+
stealthTamperingScript,
|
|
760
|
+
stealthActivityScript,
|
|
761
|
+
stealthHairlineScript,
|
|
762
|
+
stealthBotdScript,
|
|
763
|
+
stealthIframeScript,
|
|
764
|
+
stealthWebglScript,
|
|
765
|
+
stealthScreenScript,
|
|
766
|
+
stealthFontsScript,
|
|
767
|
+
stealthAudioScript,
|
|
768
|
+
stealthLocaleScript,
|
|
769
|
+
stealthPluginsScript,
|
|
770
|
+
stealthHardwareScript,
|
|
771
|
+
stealthCodecsScript,
|
|
772
|
+
stealthWorkerScript,
|
|
773
|
+
];
|
|
774
|
+
|
|
775
|
+
function buildStealthInjectionScript(scripts: readonly string[] = STEALTH_PATCH_SCRIPTS): string {
|
|
776
|
+
const joint = scripts
|
|
777
|
+
.map(
|
|
778
|
+
script => `
|
|
779
|
+
try {
|
|
780
|
+
${script};
|
|
781
|
+
} catch (e) {}
|
|
782
|
+
`,
|
|
783
|
+
)
|
|
784
|
+
.join(";\n");
|
|
785
|
+
|
|
786
|
+
return `(() => {
|
|
787
|
+
const Page_Function_toString = Function.prototype.toString;
|
|
788
|
+
const Page_FunctionToStringDescriptor = Object.getOwnPropertyDescriptor(Function.prototype, "toString");
|
|
789
|
+
const Page_Proxy = Proxy;
|
|
790
|
+
const Page_WeakMap = WeakMap;
|
|
791
|
+
const Page_WeakMap_get = Page_WeakMap.prototype.get;
|
|
792
|
+
const Page_WeakMap_set = Page_WeakMap.prototype.set;
|
|
793
|
+
// Native function cache - captured before any tampering.
|
|
794
|
+
// A same-origin iframe yields natives uncontaminated by page-level
|
|
795
|
+
// tampering, but at document-start (when this preload runs) there is
|
|
796
|
+
// no documentElement to attach it to. In that case the page itself
|
|
797
|
+
// hasn't executed yet, so window's own natives are still pristine —
|
|
798
|
+
// fall back to window instead of bailing, otherwise none of the
|
|
799
|
+
// fingerprint patches below would ever run.
|
|
800
|
+
let iframe = null;
|
|
801
|
+
const container = document.head ?? document.documentElement;
|
|
802
|
+
if (container) {
|
|
803
|
+
iframe = document.createElement("iframe");
|
|
804
|
+
iframe.style.display = "none";
|
|
805
|
+
container.appendChild(iframe);
|
|
806
|
+
if (!iframe.contentWindow) iframe = null;
|
|
807
|
+
}
|
|
808
|
+
try {
|
|
809
|
+
const nativeWindow = iframe ? iframe.contentWindow : window;
|
|
810
|
+
|
|
811
|
+
// Cache pristine native functions
|
|
812
|
+
const Function_toString = nativeWindow.Function.prototype.toString;
|
|
813
|
+
const Object_getOwnPropertyDescriptor = nativeWindow.Object.getOwnPropertyDescriptor;
|
|
814
|
+
const Object_getOwnPropertyDescriptors = nativeWindow.Object.getOwnPropertyDescriptors;
|
|
815
|
+
const Object_getPrototypeOf = nativeWindow.Object.getPrototypeOf;
|
|
816
|
+
const Object_defineProperty = nativeWindow.Object.defineProperty;
|
|
817
|
+
const Object_getOwnPropertyDescriptorOriginal = nativeWindow.Object.getOwnPropertyDescriptor;
|
|
818
|
+
const Object_create = nativeWindow.Object.create;
|
|
819
|
+
const Object_keys = nativeWindow.Object.keys;
|
|
820
|
+
const Object_getOwnPropertyNames = nativeWindow.Object.getOwnPropertyNames;
|
|
821
|
+
const Object_entries = nativeWindow.Object.entries;
|
|
822
|
+
const Object_setPrototypeOf = nativeWindow.Object.setPrototypeOf;
|
|
823
|
+
const Object_assign = nativeWindow.Object.assign;
|
|
824
|
+
const Window_setTimeout = nativeWindow.setTimeout;
|
|
825
|
+
const Math_random = nativeWindow.Math.random;
|
|
826
|
+
const Math_floor = nativeWindow.Math.floor;
|
|
827
|
+
const Math_max = nativeWindow.Math.max;
|
|
828
|
+
const Math_min = nativeWindow.Math.min;
|
|
829
|
+
const Window_Event = nativeWindow.Event;
|
|
830
|
+
const Promise_resolve = nativeWindow.Promise.resolve.bind(nativeWindow.Promise);
|
|
831
|
+
const Window_Blob = nativeWindow.Blob;
|
|
832
|
+
const Window_Proxy = nativeWindow.Proxy;
|
|
833
|
+
const Reflect_get = nativeWindow.Reflect.get;
|
|
834
|
+
const Reflect_set = nativeWindow.Reflect.set;
|
|
835
|
+
const Reflect_apply = nativeWindow.Reflect.apply;
|
|
836
|
+
const Reflect_construct = nativeWindow.Reflect.construct;
|
|
837
|
+
const Reflect_defineProperty = nativeWindow.Reflect.defineProperty;
|
|
838
|
+
const Reflect_deleteProperty = nativeWindow.Reflect.deleteProperty;
|
|
839
|
+
const Reflect_getOwnPropertyDescriptor = nativeWindow.Reflect.getOwnPropertyDescriptor;
|
|
840
|
+
const Reflect_getPrototypeOf = nativeWindow.Reflect.getPrototypeOf;
|
|
841
|
+
const Reflect_has = nativeWindow.Reflect.has;
|
|
842
|
+
const Reflect_isExtensible = nativeWindow.Reflect.isExtensible;
|
|
843
|
+
const Reflect_ownKeys = nativeWindow.Reflect.ownKeys;
|
|
844
|
+
const Reflect_preventExtensions = nativeWindow.Reflect.preventExtensions;
|
|
845
|
+
const Reflect_setPrototypeOf = nativeWindow.Reflect.setPrototypeOf;
|
|
846
|
+
const Intl_DateTimeFormat = nativeWindow.Intl.DateTimeFormat;
|
|
847
|
+
const Date_constructor = nativeWindow.Date;
|
|
848
|
+
|
|
849
|
+
const nativeFunctionSources = new Page_WeakMap();
|
|
850
|
+
const makeNativeString = (name) => "function " + (name || "") + "() { [native code] }";
|
|
851
|
+
const registerNativeSource = (fn, source) => {
|
|
852
|
+
if (typeof fn === "function") Reflect_apply(Page_WeakMap_set, nativeFunctionSources, [fn, source]);
|
|
853
|
+
return fn;
|
|
854
|
+
};
|
|
855
|
+
const patchToString = (fn, name) => registerNativeSource(fn, makeNativeString(name));
|
|
856
|
+
if (${scripts.length > 0 ? "true" : "false"}) {
|
|
857
|
+
const functionToStringProxy = new Page_Proxy(Page_Function_toString, {
|
|
858
|
+
apply(target, thisArg, args) {
|
|
859
|
+
const source = Reflect_apply(Page_WeakMap_get, nativeFunctionSources, [thisArg]);
|
|
860
|
+
if (source) return source;
|
|
861
|
+
return Reflect_apply(target, thisArg, args || []);
|
|
862
|
+
},
|
|
863
|
+
get(target, key, receiver) {
|
|
864
|
+
return Reflect_get(target, key, receiver);
|
|
865
|
+
},
|
|
866
|
+
});
|
|
867
|
+
registerNativeSource(functionToStringProxy, makeNativeString("toString"));
|
|
868
|
+
Object_defineProperty(Function.prototype, "toString", {
|
|
869
|
+
...(Page_FunctionToStringDescriptor || {
|
|
870
|
+
writable: true,
|
|
871
|
+
configurable: true,
|
|
872
|
+
enumerable: false,
|
|
873
|
+
}),
|
|
874
|
+
value: functionToStringProxy,
|
|
875
|
+
});
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
${joint}
|
|
879
|
+
} finally {
|
|
880
|
+
if (iframe && iframe.parentNode) iframe.parentNode.removeChild(iframe);
|
|
881
|
+
}})();`;
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
async function injectStealthScripts(page: Page): Promise<void> {
|
|
885
|
+
await page.evaluateOnNewDocument(buildStealthInjectionScript());
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
/** Builds the browser-page stealth bootstrap source for regression tests. */
|
|
889
|
+
export function buildStealthInjectionScriptForTest(scripts: readonly string[] = STEALTH_PATCH_SCRIPTS): string {
|
|
890
|
+
return buildStealthInjectionScript(scripts);
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
/** Apply stealth patches + UA override to a headless page. Idempotent within a tab. */
|
|
894
|
+
export async function applyStealthPatches(
|
|
895
|
+
browser: Browser,
|
|
896
|
+
page: Page,
|
|
897
|
+
state: { browserSession: CDPSession | null; override: UserAgentOverride | null },
|
|
898
|
+
): Promise<void> {
|
|
899
|
+
patchSourceUrl(page);
|
|
900
|
+
if (!state.override) {
|
|
901
|
+
state.override = await resolveUserAgentOverride(page);
|
|
902
|
+
}
|
|
903
|
+
const client = resolvePageClient(page);
|
|
904
|
+
if (client) {
|
|
905
|
+
await sendUserAgentOverride(client, state.override);
|
|
906
|
+
}
|
|
907
|
+
const targetState = { browserSession: state.browserSession, override: state.override };
|
|
908
|
+
await configureUserAgentTargets(browser, targetState);
|
|
909
|
+
state.browserSession = targetState.browserSession;
|
|
910
|
+
await injectStealthScripts(page);
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
/** Exposes executable candidates for detection tests. */
|
|
914
|
+
export function systemChromiumCandidatesForTest(
|
|
915
|
+
platform: NodeJS.Platform = process.platform,
|
|
916
|
+
home?: string,
|
|
917
|
+
which?: (name: string) => string | null | undefined,
|
|
918
|
+
): string[] {
|
|
919
|
+
return systemChromiumCandidates(platform, home, which);
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
export async function chromiumExecutableProbeForTest(executablePath: string): Promise<boolean> {
|
|
923
|
+
return isChromiumExecutable(executablePath);
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
export function stealthIgnoreDefaultArgsForTest(executablePath: string | undefined): string[] {
|
|
927
|
+
return stealthIgnoreDefaultArgs(executablePath);
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
export function targetSupportsUserAgentOverrideForTest(target: Target): boolean {
|
|
931
|
+
return targetSupportsUserAgentOverride(target);
|
|
932
|
+
}
|
|
933
|
+
export async function configureUserAgentTargetsForTest(
|
|
934
|
+
browser: Browser,
|
|
935
|
+
state: { browserSession: CDPSession | null; override: UserAgentOverride },
|
|
936
|
+
targetTimeoutMs?: number,
|
|
937
|
+
): Promise<void> {
|
|
938
|
+
await configureUserAgentTargets(browser, state, targetTimeoutMs);
|
|
939
|
+
}
|