@wahack/pi-coding-agent 15.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10031 -0
- package/README.md +36 -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 +79 -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 +172 -0
- package/package.json +554 -0
- package/scripts/build-binary.ts +100 -0
- package/scripts/bundle-dist.ts +90 -0
- package/scripts/format-prompts.ts +68 -0
- package/scripts/generate-docs-index.ts +40 -0
- package/scripts/generate-template.ts +33 -0
- package/scripts/omp +42 -0
- package/scripts/omp.ts +19 -0
- package/src/async/index.ts +1 -0
- package/src/async/job-manager.ts +625 -0
- package/src/auto-thinking/classifier.ts +185 -0
- package/src/autoresearch/command-resume.md +14 -0
- package/src/autoresearch/dashboard.ts +436 -0
- package/src/autoresearch/git.ts +319 -0
- package/src/autoresearch/helpers.ts +218 -0
- package/src/autoresearch/index.ts +536 -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 +699 -0
- package/src/autoresearch/tools/init-experiment.ts +272 -0
- package/src/autoresearch/tools/log-experiment.ts +524 -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/bun-imports.d.ts +28 -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 +436 -0
- package/src/capability/instruction.ts +37 -0
- package/src/capability/mcp.ts +74 -0
- package/src/capability/prompt.ts +35 -0
- package/src/capability/rule-buckets.ts +66 -0
- package/src/capability/rule.ts +261 -0
- package/src/capability/settings.ts +34 -0
- package/src/capability/skill.ts +63 -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 +168 -0
- package/src/cli/agents-cli.ts +138 -0
- package/src/cli/args.ts +340 -0
- package/src/cli/auth-broker-cli.ts +895 -0
- package/src/cli/auth-gateway-cli.ts +611 -0
- package/src/cli/classify-install-target.ts +76 -0
- package/src/cli/claude-trace-cli.ts +795 -0
- package/src/cli/commands/init-xdg.ts +27 -0
- package/src/cli/completion-gen.ts +550 -0
- package/src/cli/config-cli.ts +418 -0
- package/src/cli/dry-balance-cli.ts +856 -0
- package/src/cli/extension-flags.ts +48 -0
- package/src/cli/file-processor.ts +133 -0
- package/src/cli/gallery-cli.ts +230 -0
- package/src/cli/gallery-fixtures/agentic.ts +407 -0
- package/src/cli/gallery-fixtures/codeintel.ts +187 -0
- package/src/cli/gallery-fixtures/edit.ts +194 -0
- package/src/cli/gallery-fixtures/fs.ts +220 -0
- package/src/cli/gallery-fixtures/index.ts +40 -0
- package/src/cli/gallery-fixtures/interaction.ts +49 -0
- package/src/cli/gallery-fixtures/memory.ts +81 -0
- package/src/cli/gallery-fixtures/misc.ts +250 -0
- package/src/cli/gallery-fixtures/search.ts +213 -0
- package/src/cli/gallery-fixtures/shell.ts +167 -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/grep-cli.ts +160 -0
- package/src/cli/grievances-cli.ts +256 -0
- package/src/cli/initial-message.ts +58 -0
- package/src/cli/list-models.ts +194 -0
- package/src/cli/plugin-cli.ts +996 -0
- package/src/cli/read-cli.ts +57 -0
- package/src/cli/session-picker.ts +79 -0
- package/src/cli/setup-cli.ts +231 -0
- package/src/cli/shell-cli.ts +176 -0
- package/src/cli/ssh-cli.ts +179 -0
- package/src/cli/startup-cwd.ts +68 -0
- package/src/cli/stats-cli.ts +238 -0
- package/src/cli/tiny-models-cli.ts +127 -0
- package/src/cli/update-cli.ts +611 -0
- package/src/cli/usage-cli.ts +603 -0
- package/src/cli/web-search-cli.ts +132 -0
- package/src/cli/worktree-cli.ts +291 -0
- package/src/cli-commands.ts +79 -0
- package/src/cli.ts +200 -0
- package/src/commands/acp.ts +24 -0
- package/src/commands/agents.ts +57 -0
- package/src/commands/auth-broker.ts +99 -0
- package/src/commands/auth-gateway.ts +69 -0
- package/src/commands/commit.ts +46 -0
- package/src/commands/complete.ts +66 -0
- package/src/commands/completions.ts +60 -0
- package/src/commands/config.ts +51 -0
- package/src/commands/dry-balance.ts +43 -0
- package/src/commands/gallery.ts +52 -0
- package/src/commands/grep.ts +48 -0
- package/src/commands/grievances.ts +51 -0
- package/src/commands/install.ts +107 -0
- package/src/commands/launch.ts +169 -0
- package/src/commands/plugin.ts +78 -0
- package/src/commands/read.ts +38 -0
- package/src/commands/setup.ts +67 -0
- package/src/commands/shell.ts +29 -0
- package/src/commands/ssh.ts +60 -0
- package/src/commands/stats.ts +29 -0
- package/src/commands/tiny-models.ts +36 -0
- package/src/commands/update.ts +21 -0
- package/src/commands/usage.ts +35 -0
- package/src/commands/web-search.ts +42 -0
- package/src/commands/worktree.ts +56 -0
- package/src/commit/agentic/agent.ts +317 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +355 -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 +146 -0
- package/src/commit/agentic/tools/git-file-diff.ts +191 -0
- package/src/commit/agentic/tools/git-hunk.ts +50 -0
- package/src/commit/agentic/tools/git-overview.ts +81 -0
- package/src/commit/agentic/tools/index.ts +54 -0
- package/src/commit/agentic/tools/propose-changelog.ts +144 -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 +23 -0
- package/src/commit/agentic/tools/split-commit.ts +245 -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 +105 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +40 -0
- package/src/commit/changelog/generate.ts +97 -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 +92 -0
- package/src/commit/pipeline.ts +243 -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 +77 -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 +60 -0
- package/src/config/append-only-context-mode.ts +31 -0
- package/src/config/config-file.ts +317 -0
- package/src/config/file-lock.ts +164 -0
- package/src/config/keybindings.ts +628 -0
- package/src/config/mcp-schema.json +230 -0
- package/src/config/model-discovery.ts +554 -0
- package/src/config/model-registry.ts +2090 -0
- package/src/config/model-resolver.ts +1502 -0
- package/src/config/model-roles.ts +74 -0
- package/src/config/models-config-schema.ts +226 -0
- package/src/config/models-config.ts +129 -0
- package/src/config/prompt-templates.ts +185 -0
- package/src/config/resolve-config-value.ts +94 -0
- package/src/config/settings-schema.ts +3530 -0
- package/src/config/settings.ts +1178 -0
- package/src/config.ts +242 -0
- package/src/cursor.ts +340 -0
- package/src/dap/client.ts +760 -0
- package/src/dap/config.ts +189 -0
- package/src/dap/defaults.json +212 -0
- package/src/dap/index.ts +4 -0
- package/src/dap/session.ts +1441 -0
- package/src/dap/types.ts +610 -0
- package/src/debug/index.ts +515 -0
- package/src/debug/log-formatting.ts +58 -0
- package/src/debug/log-viewer.ts +908 -0
- package/src/debug/profiler.ts +162 -0
- package/src/debug/protocol-probe.ts +267 -0
- package/src/debug/raw-sse-buffer.ts +273 -0
- package/src/debug/raw-sse.ts +292 -0
- package/src/debug/report-bundle.ts +374 -0
- package/src/debug/system-info.ts +111 -0
- package/src/debug/terminal-info.ts +124 -0
- package/src/discovery/agents-md.ts +67 -0
- package/src/discovery/agents.ts +230 -0
- package/src/discovery/at-imports.ts +273 -0
- package/src/discovery/builtin-defaults.ts +39 -0
- package/src/discovery/builtin-rules/index.ts +54 -0
- package/src/discovery/builtin-rules/rs-box-leak.md +48 -0
- package/src/discovery/builtin-rules/rs-future-prelude.md +23 -0
- package/src/discovery/builtin-rules/rs-lazylock.md +51 -0
- package/src/discovery/builtin-rules/rs-match-ergonomics.md +67 -0
- package/src/discovery/builtin-rules/rs-parking-lot.md +44 -0
- package/src/discovery/builtin-rules/rs-result-type.md +19 -0
- package/src/discovery/builtin-rules/ts-bare-catch.md +38 -0
- package/src/discovery/builtin-rules/ts-import-type.md +42 -0
- package/src/discovery/builtin-rules/ts-no-any.md +56 -0
- package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +44 -0
- package/src/discovery/builtin-rules/ts-no-dynamic-import.md +39 -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 +65 -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 +906 -0
- package/src/discovery/claude-plugins.ts +386 -0
- package/src/discovery/claude.ts +584 -0
- package/src/discovery/cline.ts +83 -0
- package/src/discovery/codex.ts +522 -0
- package/src/discovery/cursor.ts +220 -0
- package/src/discovery/gemini.ts +383 -0
- package/src/discovery/github.ts +154 -0
- package/src/discovery/helpers.ts +1016 -0
- package/src/discovery/index.ts +81 -0
- package/src/discovery/mcp-json.ts +171 -0
- package/src/discovery/omp-extension-roots.ts +190 -0
- package/src/discovery/omp-plugins.ts +383 -0
- package/src/discovery/opencode.ts +398 -0
- package/src/discovery/plugin-dir-roots.ts +28 -0
- package/src/discovery/ssh.ts +153 -0
- package/src/discovery/substitute-plugin-root.ts +29 -0
- package/src/discovery/vscode.ts +105 -0
- package/src/discovery/windsurf.ts +147 -0
- package/src/edit/apply-patch/index.ts +87 -0
- package/src/edit/apply-patch/parser.ts +174 -0
- package/src/edit/diff.ts +999 -0
- package/src/edit/file-snapshot-store.ts +91 -0
- package/src/edit/hashline/block-resolver.ts +33 -0
- package/src/edit/hashline/diff.ts +290 -0
- package/src/edit/hashline/execute.ts +242 -0
- package/src/edit/hashline/filesystem.ts +130 -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 +18 -0
- package/src/edit/index.ts +571 -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 +1891 -0
- package/src/edit/modes/replace.ts +1137 -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 +769 -0
- package/src/edit/streaming.ts +517 -0
- package/src/eval/__tests__/agent-bridge.test.ts +708 -0
- package/src/eval/__tests__/bridge-timeout.test.ts +64 -0
- package/src/eval/__tests__/budget-bridge.test.ts +69 -0
- package/src/eval/__tests__/completion-bridge.test.ts +412 -0
- package/src/eval/__tests__/helpers-local-roots.test.ts +58 -0
- package/src/eval/__tests__/idle-timeout.test.ts +80 -0
- package/src/eval/__tests__/js-context-manager.test.ts +241 -0
- package/src/eval/__tests__/kernel-spawn.test.ts +103 -0
- package/src/eval/agent-bridge.ts +319 -0
- package/src/eval/backend.ts +71 -0
- package/src/eval/bridge-timeout.ts +44 -0
- package/src/eval/budget-bridge.ts +48 -0
- package/src/eval/completion-bridge.ts +207 -0
- package/src/eval/concurrency-bridge.ts +34 -0
- package/src/eval/idle-timeout.ts +91 -0
- package/src/eval/index.ts +4 -0
- package/src/eval/js/context-manager.ts +502 -0
- package/src/eval/js/executor.ts +173 -0
- package/src/eval/js/index.ts +51 -0
- package/src/eval/js/shared/helpers.ts +283 -0
- package/src/eval/js/shared/indirect-eval.ts +30 -0
- package/src/eval/js/shared/local-module-loader.ts +342 -0
- package/src/eval/js/shared/prelude.ts +2 -0
- package/src/eval/js/shared/prelude.txt +246 -0
- package/src/eval/js/shared/rewrite-imports.ts +532 -0
- package/src/eval/js/shared/runtime.ts +352 -0
- package/src/eval/js/shared/types.ts +18 -0
- package/src/eval/js/tool-bridge.ts +162 -0
- package/src/eval/js/worker-core.ts +132 -0
- package/src/eval/js/worker-entry.ts +30 -0
- package/src/eval/js/worker-protocol.ts +47 -0
- package/src/eval/py/__tests__/prelude.test.ts +19 -0
- package/src/eval/py/display.ts +71 -0
- package/src/eval/py/executor.ts +742 -0
- package/src/eval/py/index.ts +68 -0
- package/src/eval/py/kernel.ts +748 -0
- package/src/eval/py/prelude.py +658 -0
- package/src/eval/py/prelude.ts +3 -0
- package/src/eval/py/runner.py +1133 -0
- package/src/eval/py/runtime.ts +276 -0
- package/src/eval/py/spawn-options.ts +126 -0
- package/src/eval/py/tool-bridge.ts +182 -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 +419 -0
- package/src/exec/exec.ts +53 -0
- package/src/exec/non-interactive-env.ts +48 -0
- package/src/export/custom-share.ts +65 -0
- package/src/export/html/index.ts +164 -0
- package/src/export/html/template.css +1051 -0
- package/src/export/html/template.generated.ts +2 -0
- package/src/export/html/template.html +46 -0
- package/src/export/html/template.js +2271 -0
- package/src/export/html/template.macro.ts +25 -0
- package/src/export/html/vendor/highlight.min.js +1213 -0
- package/src/export/html/vendor/marked.min.js +6 -0
- package/src/export/ttsr.ts +583 -0
- package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
- package/src/extensibility/custom-commands/bundled/review/index.ts +489 -0
- package/src/extensibility/custom-commands/index.ts +2 -0
- package/src/extensibility/custom-commands/loader.ts +238 -0
- package/src/extensibility/custom-commands/types.ts +113 -0
- package/src/extensibility/custom-tools/index.ts +7 -0
- package/src/extensibility/custom-tools/loader.ts +269 -0
- package/src/extensibility/custom-tools/types.ts +270 -0
- package/src/extensibility/custom-tools/wrapper.ts +47 -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/loader.ts +572 -0
- package/src/extensibility/extensions/runner.ts +922 -0
- package/src/extensibility/extensions/types.ts +1322 -0
- package/src/extensibility/extensions/wrapper.ts +223 -0
- package/src/extensibility/hooks/index.ts +5 -0
- package/src/extensibility/hooks/loader.ts +257 -0
- package/src/extensibility/hooks/runner.ts +425 -0
- package/src/extensibility/hooks/tool-wrapper.ts +107 -0
- package/src/extensibility/hooks/types.ts +606 -0
- package/src/extensibility/legacy-pi-ai-shim.ts +24 -0
- package/src/extensibility/legacy-pi-coding-agent-shim.ts +15 -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 +192 -0
- package/src/extensibility/plugins/legacy-pi-compat.ts +682 -0
- package/src/extensibility/plugins/loader.ts +313 -0
- package/src/extensibility/plugins/manager.ts +827 -0
- package/src/extensibility/plugins/marketplace/cache.ts +136 -0
- package/src/extensibility/plugins/marketplace/fetcher.ts +317 -0
- package/src/extensibility/plugins/marketplace/index.ts +6 -0
- package/src/extensibility/plugins/marketplace/manager.ts +770 -0
- package/src/extensibility/plugins/marketplace/registry.ts +196 -0
- package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
- package/src/extensibility/plugins/marketplace/types.ts +191 -0
- package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
- package/src/extensibility/plugins/parser.ts +105 -0
- package/src/extensibility/plugins/types.ts +194 -0
- package/src/extensibility/shared-events.ts +343 -0
- package/src/extensibility/skills.ts +312 -0
- package/src/extensibility/slash-commands.ts +227 -0
- package/src/extensibility/tool-proxy.ts +25 -0
- package/src/extensibility/typebox.ts +418 -0
- package/src/extensibility/utils.ts +44 -0
- package/src/goals/index.ts +3 -0
- package/src/goals/runtime.ts +528 -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 +598 -0
- package/src/hindsight/config.ts +175 -0
- package/src/hindsight/content.ts +210 -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 +488 -0
- package/src/hindsight/transcript.ts +71 -0
- package/src/index.ts +59 -0
- package/src/internal-urls/agent-protocol.ts +146 -0
- package/src/internal-urls/artifact-protocol.ts +107 -0
- package/src/internal-urls/docs-index.generated.ts +106 -0
- package/src/internal-urls/history-protocol.ts +113 -0
- package/src/internal-urls/index.ts +25 -0
- package/src/internal-urls/issue-pr-protocol.ts +584 -0
- package/src/internal-urls/json-query.ts +126 -0
- package/src/internal-urls/local-protocol.ts +287 -0
- package/src/internal-urls/mcp-protocol.ts +151 -0
- package/src/internal-urls/memory-protocol.ts +169 -0
- package/src/internal-urls/omp-protocol.ts +93 -0
- package/src/internal-urls/parse.ts +72 -0
- package/src/internal-urls/registry-helpers.ts +25 -0
- package/src/internal-urls/router.ts +105 -0
- package/src/internal-urls/rule-protocol.ts +45 -0
- package/src/internal-urls/skill-protocol.ts +96 -0
- package/src/internal-urls/types.ts +152 -0
- package/src/internal-urls/vault-protocol.ts +936 -0
- package/src/irc/bus.ts +292 -0
- package/src/lib/xai-http.ts +124 -0
- package/src/lsp/client.ts +1193 -0
- package/src/lsp/clients/biome-client.ts +264 -0
- package/src/lsp/clients/index.ts +50 -0
- package/src/lsp/clients/lsp-linter-client.ts +93 -0
- package/src/lsp/clients/swiftlint-client.ts +120 -0
- package/src/lsp/config.ts +502 -0
- package/src/lsp/defaults.json +493 -0
- package/src/lsp/diagnostics-ledger.ts +51 -0
- package/src/lsp/edits.ts +267 -0
- package/src/lsp/index.ts +2477 -0
- package/src/lsp/lspmux.ts +233 -0
- package/src/lsp/render.ts +694 -0
- package/src/lsp/startup-events.ts +13 -0
- package/src/lsp/types.ts +455 -0
- package/src/lsp/utils.ts +718 -0
- package/src/main.ts +1325 -0
- package/src/mcp/client.ts +484 -0
- package/src/mcp/config-writer.ts +225 -0
- package/src/mcp/config.ts +365 -0
- package/src/mcp/index.ts +29 -0
- package/src/mcp/json-rpc.ts +122 -0
- package/src/mcp/loader.ts +124 -0
- package/src/mcp/manager.ts +1275 -0
- package/src/mcp/oauth-discovery.ts +442 -0
- package/src/mcp/oauth-flow.ts +442 -0
- package/src/mcp/render.ts +132 -0
- package/src/mcp/smithery-auth.ts +104 -0
- package/src/mcp/smithery-connect.ts +145 -0
- package/src/mcp/smithery-registry.ts +477 -0
- package/src/mcp/timeout.ts +59 -0
- package/src/mcp/tool-bridge.ts +426 -0
- package/src/mcp/tool-cache.ts +117 -0
- package/src/mcp/transports/http.ts +519 -0
- package/src/mcp/transports/index.ts +6 -0
- package/src/mcp/transports/stdio.ts +528 -0
- package/src/mcp/types.ts +423 -0
- package/src/memories/index.ts +1150 -0
- package/src/memories/storage.ts +577 -0
- package/src/memory-backend/index.ts +18 -0
- package/src/memory-backend/local-backend.ts +39 -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/types.ts +166 -0
- package/src/mnemopi/backend.ts +547 -0
- package/src/mnemopi/config.ts +160 -0
- package/src/mnemopi/index.ts +3 -0
- package/src/mnemopi/state.ts +584 -0
- package/src/modes/acp/acp-agent.ts +2407 -0
- package/src/modes/acp/acp-client-bridge.ts +154 -0
- package/src/modes/acp/acp-event-mapper.ts +929 -0
- package/src/modes/acp/acp-mode.ts +23 -0
- package/src/modes/acp/index.ts +2 -0
- package/src/modes/acp/terminal-auth.ts +37 -0
- package/src/modes/components/agent-dashboard.ts +1206 -0
- package/src/modes/components/agent-hub.ts +1071 -0
- package/src/modes/components/assistant-message.ts +307 -0
- package/src/modes/components/bash-execution.ts +220 -0
- package/src/modes/components/bordered-loader.ts +41 -0
- package/src/modes/components/branch-summary-message.ts +45 -0
- package/src/modes/components/btw-panel.ts +104 -0
- package/src/modes/components/chat-block.ts +111 -0
- package/src/modes/components/compaction-summary-message.ts +87 -0
- package/src/modes/components/copy-selector.ts +206 -0
- package/src/modes/components/countdown-timer.ts +75 -0
- package/src/modes/components/custom-editor.ts +398 -0
- package/src/modes/components/custom-message.ts +63 -0
- package/src/modes/components/diff.ts +277 -0
- package/src/modes/components/dynamic-border.ts +34 -0
- package/src/modes/components/error-banner.ts +33 -0
- package/src/modes/components/eval-execution.ts +158 -0
- package/src/modes/components/execution-shared.ts +101 -0
- package/src/modes/components/extensions/extension-dashboard.ts +399 -0
- package/src/modes/components/extensions/extension-list.ts +502 -0
- package/src/modes/components/extensions/index.ts +9 -0
- package/src/modes/components/extensions/inspector-panel.ts +317 -0
- package/src/modes/components/extensions/state-manager.ts +627 -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 +280 -0
- package/src/modes/components/hook-editor.ts +167 -0
- package/src/modes/components/hook-input.ts +87 -0
- package/src/modes/components/hook-message.ts +66 -0
- package/src/modes/components/hook-selector.ts +660 -0
- package/src/modes/components/index.ts +38 -0
- package/src/modes/components/keybinding-hints.ts +65 -0
- package/src/modes/components/late-diagnostics-message.ts +60 -0
- package/src/modes/components/login-dialog.ts +164 -0
- package/src/modes/components/mcp-add-wizard.ts +1340 -0
- package/src/modes/components/message-frame.ts +88 -0
- package/src/modes/components/model-selector.ts +1271 -0
- package/src/modes/components/oauth-selector.ts +368 -0
- package/src/modes/components/omfg-panel.ts +141 -0
- package/src/modes/components/overlay-box.ts +108 -0
- package/src/modes/components/plan-review-overlay.ts +820 -0
- package/src/modes/components/plan-toc.ts +138 -0
- package/src/modes/components/plugin-selector.ts +95 -0
- package/src/modes/components/plugin-settings.ts +722 -0
- package/src/modes/components/queue-mode-selector.ts +56 -0
- package/src/modes/components/read-tool-group.ts +670 -0
- package/src/modes/components/segment-track.ts +52 -0
- package/src/modes/components/session-selector.ts +625 -0
- package/src/modes/components/settings-defs.ts +189 -0
- package/src/modes/components/settings-selector.ts +651 -0
- package/src/modes/components/show-images-selector.ts +45 -0
- package/src/modes/components/skill-message.ts +89 -0
- package/src/modes/components/status-line/component.ts +869 -0
- package/src/modes/components/status-line/context-thresholds.ts +79 -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 +584 -0
- package/src/modes/components/status-line/separators.ts +55 -0
- package/src/modes/components/status-line/token-rate.ts +66 -0
- package/src/modes/components/status-line/types.ts +108 -0
- package/src/modes/components/theme-selector.ts +63 -0
- package/src/modes/components/thinking-selector.ts +52 -0
- package/src/modes/components/tiny-title-download-progress.ts +90 -0
- package/src/modes/components/tips.txt +19 -0
- package/src/modes/components/todo-reminder.ts +38 -0
- package/src/modes/components/tool-execution.ts +1024 -0
- package/src/modes/components/transcript-container.ts +608 -0
- package/src/modes/components/tree-selector.ts +978 -0
- package/src/modes/components/ttsr-notification.ts +122 -0
- package/src/modes/components/user-message-selector.ts +227 -0
- package/src/modes/components/user-message.ts +66 -0
- package/src/modes/components/visual-truncate.ts +63 -0
- package/src/modes/components/welcome.ts +493 -0
- package/src/modes/controllers/btw-controller.ts +105 -0
- package/src/modes/controllers/command-controller-shared.ts +109 -0
- package/src/modes/controllers/command-controller.ts +1566 -0
- package/src/modes/controllers/event-controller.ts +1054 -0
- package/src/modes/controllers/extension-ui-controller.ts +886 -0
- package/src/modes/controllers/input-controller.ts +1073 -0
- package/src/modes/controllers/mcp-command-controller.ts +2017 -0
- package/src/modes/controllers/omfg-controller.ts +283 -0
- package/src/modes/controllers/omfg-rule.ts +647 -0
- package/src/modes/controllers/selector-controller.ts +1108 -0
- package/src/modes/controllers/ssh-command-controller.ts +384 -0
- package/src/modes/controllers/streaming-reveal.ts +279 -0
- package/src/modes/controllers/tan-command-controller.ts +173 -0
- package/src/modes/controllers/todo-command-controller.ts +485 -0
- package/src/modes/data/emojis.json +1 -0
- package/src/modes/emoji-autocomplete.ts +285 -0
- package/src/modes/gradient-highlight.ts +87 -0
- package/src/modes/image-references.ts +117 -0
- package/src/modes/index.ts +17 -0
- package/src/modes/interactive-mode.ts +3370 -0
- package/src/modes/internal-url-autocomplete.ts +143 -0
- package/src/modes/loop-limit.ts +140 -0
- package/src/modes/magic-keywords.ts +20 -0
- package/src/modes/markdown-prose.ts +247 -0
- package/src/modes/oauth-manual-input.ts +69 -0
- package/src/modes/orchestrate.ts +42 -0
- package/src/modes/print-mode.ts +126 -0
- package/src/modes/prompt-action-autocomplete.ts +260 -0
- package/src/modes/rpc/host-tools.ts +186 -0
- package/src/modes/rpc/host-uris.ts +235 -0
- package/src/modes/rpc/rpc-client.ts +963 -0
- package/src/modes/rpc/rpc-mode.ts +947 -0
- package/src/modes/rpc/rpc-subagents.ts +265 -0
- package/src/modes/rpc/rpc-types.ts +458 -0
- package/src/modes/runtime-init.ts +116 -0
- package/src/modes/session-observer-registry.ts +146 -0
- package/src/modes/setup-version.ts +11 -0
- package/src/modes/setup-wizard/index.ts +99 -0
- package/src/modes/setup-wizard/lazy.ts +16 -0
- package/src/modes/setup-wizard/scenes/glyph.ts +96 -0
- package/src/modes/setup-wizard/scenes/outro.ts +35 -0
- package/src/modes/setup-wizard/scenes/providers.ts +69 -0
- package/src/modes/setup-wizard/scenes/sign-in.ts +205 -0
- package/src/modes/setup-wizard/scenes/splash.ts +201 -0
- package/src/modes/setup-wizard/scenes/theme.ts +299 -0
- package/src/modes/setup-wizard/scenes/types.ts +48 -0
- package/src/modes/setup-wizard/scenes/web-search.ts +129 -0
- package/src/modes/setup-wizard/wizard-overlay.ts +275 -0
- package/src/modes/shared.ts +47 -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 +142 -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 +142 -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 +29 -0
- package/src/modes/theme/shimmer.ts +235 -0
- package/src/modes/theme/theme-schema.json +459 -0
- package/src/modes/theme/theme.ts +2676 -0
- package/src/modes/turn-budget.ts +31 -0
- package/src/modes/types.ts +359 -0
- package/src/modes/ultrathink.ts +41 -0
- package/src/modes/utils/context-usage.ts +339 -0
- package/src/modes/utils/copy-targets.ts +360 -0
- package/src/modes/utils/hotkeys-markdown.ts +61 -0
- package/src/modes/utils/keybinding-matchers.ts +51 -0
- package/src/modes/utils/tools-markdown.ts +27 -0
- package/src/modes/utils/ui-helpers.ts +801 -0
- package/src/modes/workflow.ts +42 -0
- package/src/plan-mode/approved-plan.ts +186 -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 +41 -0
- package/src/prompts/agents/designer.md +66 -0
- package/src/prompts/agents/explore.md +58 -0
- package/src/prompts/agents/frontmatter.md +11 -0
- package/src/prompts/agents/init.md +33 -0
- package/src/prompts/agents/librarian.md +119 -0
- package/src/prompts/agents/oracle.md +55 -0
- package/src/prompts/agents/plan.md +48 -0
- package/src/prompts/agents/reviewer.md +140 -0
- package/src/prompts/agents/task.md +16 -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/memories/consolidation.md +30 -0
- package/src/prompts/memories/read-path.md +11 -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 +22 -0
- package/src/prompts/review-headless-request.md +16 -0
- package/src/prompts/review-request.md +69 -0
- package/src/prompts/steering/user-interjection.md +10 -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 +12 -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/custom-system-prompt.md +64 -0
- package/src/prompts/system/eager-todo.md +13 -0
- package/src/prompts/system/empty-stop-retry.md +6 -0
- package/src/prompts/system/irc-incoming.md +7 -0
- package/src/prompts/system/manual-continue.md +7 -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/omfg-user.md +50 -0
- package/src/prompts/system/orchestrate-notice.md +40 -0
- package/src/prompts/system/plan-mode-active.md +109 -0
- package/src/prompts/system/plan-mode-approved.md +25 -0
- package/src/prompts/system/plan-mode-compact-instructions.md +16 -0
- package/src/prompts/system/plan-mode-reference.md +11 -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/project-prompt.md +52 -0
- package/src/prompts/system/subagent-system-prompt.md +64 -0
- package/src/prompts/system/subagent-user-prompt.md +3 -0
- package/src/prompts/system/subagent-yield-reminder.md +12 -0
- package/src/prompts/system/system-prompt.md +258 -0
- package/src/prompts/system/tiny-title-system.md +8 -0
- package/src/prompts/system/title-system.md +16 -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/web-search.md +25 -0
- package/src/prompts/system/workflow-notice.md +70 -0
- package/src/prompts/tools/apply-patch.md +65 -0
- package/src/prompts/tools/ask.md +30 -0
- package/src/prompts/tools/ast-edit.md +39 -0
- package/src/prompts/tools/ast-grep.md +42 -0
- package/src/prompts/tools/async-result.md +8 -0
- package/src/prompts/tools/bash.md +46 -0
- package/src/prompts/tools/browser.md +73 -0
- package/src/prompts/tools/checkpoint.md +16 -0
- package/src/prompts/tools/debug.md +34 -0
- package/src/prompts/tools/eval.md +92 -0
- package/src/prompts/tools/find.md +36 -0
- package/src/prompts/tools/github.md +21 -0
- package/src/prompts/tools/goal.md +18 -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 +32 -0
- package/src/prompts/tools/irc.md +59 -0
- package/src/prompts/tools/job.md +19 -0
- package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
- package/src/prompts/tools/lsp.md +42 -0
- package/src/prompts/tools/memory-edit.md +8 -0
- package/src/prompts/tools/patch.md +70 -0
- package/src/prompts/tools/read.md +84 -0
- package/src/prompts/tools/recall.md +5 -0
- package/src/prompts/tools/reflect.md +5 -0
- package/src/prompts/tools/render-mermaid.md +9 -0
- package/src/prompts/tools/replace.md +30 -0
- package/src/prompts/tools/resolve.md +9 -0
- package/src/prompts/tools/retain.md +6 -0
- package/src/prompts/tools/rewind.md +13 -0
- package/src/prompts/tools/search-tool-bm25.md +32 -0
- package/src/prompts/tools/search.md +24 -0
- package/src/prompts/tools/ssh.md +31 -0
- package/src/prompts/tools/task-summary.md +17 -0
- package/src/prompts/tools/task.md +88 -0
- package/src/prompts/tools/todo.md +62 -0
- package/src/prompts/tools/web-search.md +10 -0
- package/src/prompts/tools/write.md +14 -0
- package/src/registry/agent-lifecycle.ts +218 -0
- package/src/registry/agent-registry.ts +151 -0
- package/src/sdk.ts +2558 -0
- package/src/secrets/index.ts +123 -0
- package/src/secrets/obfuscator.ts +298 -0
- package/src/secrets/regex.ts +21 -0
- package/src/session/agent-session.ts +10121 -0
- package/src/session/agent-storage.ts +455 -0
- package/src/session/artifacts.ts +135 -0
- package/src/session/auth-broker-config.ts +131 -0
- package/src/session/auth-storage.ts +29 -0
- package/src/session/blob-store.ts +255 -0
- package/src/session/client-bridge.ts +85 -0
- package/src/session/history-storage.ts +348 -0
- package/src/session/indexed-session-storage.ts +430 -0
- package/src/session/messages.ts +541 -0
- package/src/session/redis-session-storage.ts +170 -0
- package/src/session/session-dump-format.ts +209 -0
- package/src/session/session-history-format.ts +246 -0
- package/src/session/session-manager.ts +3676 -0
- package/src/session/session-storage.ts +529 -0
- package/src/session/shake-types.ts +43 -0
- package/src/session/sql-session-storage.ts +314 -0
- package/src/session/streaming-output.ts +1330 -0
- package/src/session/tool-choice-queue.ts +213 -0
- package/src/session/yield-queue.ts +173 -0
- package/src/slash-commands/acp-builtins.ts +70 -0
- package/src/slash-commands/builtin-registry.ts +1798 -0
- package/src/slash-commands/helpers/context-report.ts +39 -0
- package/src/slash-commands/helpers/format.ts +46 -0
- package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
- package/src/slash-commands/helpers/mcp.ts +532 -0
- package/src/slash-commands/helpers/parse.ts +85 -0
- package/src/slash-commands/helpers/ssh.ts +195 -0
- package/src/slash-commands/helpers/stats-dashboard.ts +85 -0
- package/src/slash-commands/helpers/todo.ts +279 -0
- package/src/slash-commands/helpers/usage-report.ts +95 -0
- package/src/slash-commands/marketplace-install-parser.ts +99 -0
- package/src/slash-commands/types.ts +135 -0
- package/src/ssh/config-writer.ts +183 -0
- package/src/ssh/connection-manager.ts +509 -0
- package/src/ssh/ssh-executor.ts +189 -0
- package/src/ssh/sshfs-mount.ts +140 -0
- package/src/ssh/utils.ts +8 -0
- package/src/stt/downloader.ts +71 -0
- package/src/stt/index.ts +3 -0
- package/src/stt/recorder.ts +351 -0
- package/src/stt/setup.ts +52 -0
- package/src/stt/stt-controller.ts +160 -0
- package/src/stt/transcribe.py +70 -0
- package/src/stt/transcriber.ts +91 -0
- package/src/stubs/natives/index.ts +814 -0
- package/src/stubs/natives/package.json +7 -0
- package/src/stubs/tui/index.ts +282 -0
- package/src/stubs/tui/package.json +7 -0
- package/src/system-prompt.ts +611 -0
- package/src/task/agents.ts +167 -0
- package/src/task/commands.ts +132 -0
- package/src/task/discovery.ts +122 -0
- package/src/task/executor.ts +2133 -0
- package/src/task/index.ts +1419 -0
- package/src/task/name-generator.ts +1577 -0
- package/src/task/omp-command.ts +26 -0
- package/src/task/output-manager.ts +88 -0
- package/src/task/parallel.ts +116 -0
- package/src/task/render.ts +1381 -0
- package/src/task/repair-args.ts +129 -0
- package/src/task/subprocess-tool-registry.ts +88 -0
- package/src/task/types.ts +336 -0
- package/src/task/worktree.ts +514 -0
- package/src/telemetry-export.ts +144 -0
- package/src/thinking.ts +167 -0
- package/src/tiny/compiled-runtime.ts +179 -0
- package/src/tiny/device.ts +111 -0
- package/src/tiny/dtype.ts +101 -0
- package/src/tiny/models.ts +242 -0
- package/src/tiny/text.ts +165 -0
- package/src/tiny/title-client.ts +543 -0
- package/src/tiny/title-protocol.ts +56 -0
- package/src/tiny/worker.ts +568 -0
- package/src/tool-discovery/mode.ts +24 -0
- package/src/tool-discovery/tool-index.ts +256 -0
- package/src/tools/approval.ts +189 -0
- package/src/tools/archive-reader.ts +721 -0
- package/src/tools/ask.ts +928 -0
- package/src/tools/ast-edit.ts +642 -0
- package/src/tools/ast-grep.ts +452 -0
- package/src/tools/auto-generated-guard.ts +322 -0
- package/src/tools/bash-command-fixup.ts +37 -0
- package/src/tools/bash-interactive.ts +408 -0
- package/src/tools/bash-interceptor.ts +67 -0
- package/src/tools/bash-pty-selection.ts +14 -0
- package/src/tools/bash-skill-urls.ts +248 -0
- package/src/tools/bash.ts +1386 -0
- package/src/tools/browser/attach.ts +175 -0
- package/src/tools/browser/launch.ts +660 -0
- package/src/tools/browser/readable.ts +112 -0
- package/src/tools/browser/registry.ts +197 -0
- package/src/tools/browser/render.ts +216 -0
- package/src/tools/browser/tab-protocol.ts +105 -0
- package/src/tools/browser/tab-supervisor.ts +628 -0
- package/src/tools/browser/tab-worker-entry.ts +21 -0
- package/src/tools/browser/tab-worker.ts +1226 -0
- package/src/tools/browser.ts +343 -0
- package/src/tools/checkpoint.ts +136 -0
- package/src/tools/conflict-detect.ts +718 -0
- package/src/tools/context.ts +39 -0
- package/src/tools/debug.ts +1067 -0
- package/src/tools/eval-backends.ts +27 -0
- package/src/tools/eval-render.ts +752 -0
- package/src/tools/eval.ts +577 -0
- package/src/tools/fetch.ts +1926 -0
- package/src/tools/file-recorder.ts +35 -0
- package/src/tools/find.ts +609 -0
- package/src/tools/fs-cache-invalidation.ts +28 -0
- package/src/tools/gh-cache-invalidation.ts +255 -0
- package/src/tools/gh-format.ts +12 -0
- package/src/tools/gh-renderer.ts +481 -0
- package/src/tools/gh.ts +3720 -0
- package/src/tools/github-cache.ts +637 -0
- package/src/tools/grouped-file-output.ts +210 -0
- package/src/tools/image-gen.ts +1517 -0
- package/src/tools/index.ts +599 -0
- package/src/tools/inspect-image-renderer.ts +132 -0
- package/src/tools/inspect-image.ts +174 -0
- package/src/tools/irc.ts +723 -0
- package/src/tools/job.ts +557 -0
- package/src/tools/json-tree.ts +243 -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/list-limit.ts +40 -0
- package/src/tools/match-line-format.ts +20 -0
- package/src/tools/memory-edit.ts +59 -0
- package/src/tools/memory-recall.ts +100 -0
- package/src/tools/memory-reflect.ts +88 -0
- package/src/tools/memory-render.ts +202 -0
- package/src/tools/memory-retain.ts +91 -0
- package/src/tools/output-meta.ts +754 -0
- package/src/tools/output-schema-validator.ts +132 -0
- package/src/tools/path-utils.ts +1054 -0
- package/src/tools/plan-mode-guard.ts +108 -0
- package/src/tools/puppeteer/00_stealth_tampering.txt +63 -0
- package/src/tools/puppeteer/01_stealth_activity.txt +20 -0
- package/src/tools/puppeteer/02_stealth_hairline.txt +11 -0
- package/src/tools/puppeteer/03_stealth_botd.txt +384 -0
- package/src/tools/puppeteer/04_stealth_iframe.txt +81 -0
- package/src/tools/puppeteer/05_stealth_webgl.txt +75 -0
- package/src/tools/puppeteer/06_stealth_screen.txt +72 -0
- package/src/tools/puppeteer/07_stealth_fonts.txt +97 -0
- package/src/tools/puppeteer/08_stealth_audio.txt +51 -0
- package/src/tools/puppeteer/09_stealth_locale.txt +46 -0
- package/src/tools/puppeteer/10_stealth_plugins.txt +206 -0
- package/src/tools/puppeteer/11_stealth_hardware.txt +8 -0
- package/src/tools/puppeteer/12_stealth_codecs.txt +40 -0
- package/src/tools/puppeteer/13_stealth_worker.txt +74 -0
- package/src/tools/read.ts +2929 -0
- package/src/tools/render-mermaid.ts +69 -0
- package/src/tools/render-utils.ts +838 -0
- package/src/tools/renderers.ts +77 -0
- package/src/tools/report-tool-issue.ts +534 -0
- package/src/tools/resolve.ts +276 -0
- package/src/tools/review.ts +253 -0
- package/src/tools/search-tool-bm25.ts +351 -0
- package/src/tools/search.ts +1580 -0
- package/src/tools/sqlite-reader.ts +828 -0
- package/src/tools/ssh.ts +349 -0
- package/src/tools/todo.ts +982 -0
- package/src/tools/tool-errors.ts +62 -0
- package/src/tools/tool-result.ts +94 -0
- package/src/tools/tool-timeouts.ts +30 -0
- package/src/tools/tts.ts +133 -0
- package/src/tools/write.ts +1217 -0
- package/src/tools/yield.ts +269 -0
- package/src/tui/code-cell.ts +216 -0
- package/src/tui/file-list.ts +55 -0
- package/src/tui/hyperlink.ts +175 -0
- package/src/tui/index.ts +12 -0
- package/src/tui/output-block.ts +240 -0
- package/src/tui/status-line.ts +54 -0
- package/src/tui/tree-list.ts +84 -0
- package/src/tui/types.ts +15 -0
- package/src/tui/utils.ts +103 -0
- package/src/utils/block-context.ts +312 -0
- package/src/utils/changelog.ts +132 -0
- package/src/utils/clipboard.ts +193 -0
- package/src/utils/command-args.ts +76 -0
- package/src/utils/commit-message-generator.ts +151 -0
- package/src/utils/edit-mode.ts +41 -0
- package/src/utils/enhanced-paste.ts +230 -0
- package/src/utils/event-bus.ts +33 -0
- package/src/utils/external-editor.ts +65 -0
- package/src/utils/file-display-mode.ts +45 -0
- package/src/utils/file-mentions.ts +281 -0
- package/src/utils/git.ts +1833 -0
- package/src/utils/image-loading.ts +132 -0
- package/src/utils/image-resize.ts +309 -0
- package/src/utils/jj.ts +248 -0
- package/src/utils/lang-from-path.ts +239 -0
- package/src/utils/markit.ts +89 -0
- package/src/utils/open.ts +55 -0
- package/src/utils/session-color.ts +68 -0
- package/src/utils/shell-snapshot.ts +187 -0
- package/src/utils/sixel.ts +69 -0
- package/src/utils/title-generator.ts +373 -0
- package/src/utils/tool-choice.ts +33 -0
- package/src/utils/tools-manager.ts +363 -0
- package/src/web/kagi.ts +305 -0
- package/src/web/parallel.ts +353 -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 +653 -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 +704 -0
- package/src/web/scrapers/gitlab.ts +401 -0
- package/src/web/scrapers/go-pkg.ts +266 -0
- package/src/web/scrapers/hackage.ts +140 -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 +120 -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 +397 -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 +292 -0
- package/src/web/search/provider.ts +157 -0
- package/src/web/search/providers/anthropic.ts +318 -0
- package/src/web/search/providers/base.ts +89 -0
- package/src/web/search/providers/brave.ts +152 -0
- package/src/web/search/providers/codex.ts +591 -0
- package/src/web/search/providers/exa.ts +400 -0
- package/src/web/search/providers/gemini.ts +460 -0
- package/src/web/search/providers/jina.ts +111 -0
- package/src/web/search/providers/kagi.ts +86 -0
- package/src/web/search/providers/kimi.ts +196 -0
- package/src/web/search/providers/parallel.ts +225 -0
- package/src/web/search/providers/perplexity.ts +730 -0
- package/src/web/search/providers/searxng.ts +313 -0
- package/src/web/search/providers/synthetic.ts +114 -0
- package/src/web/search/providers/tavily.ts +176 -0
- package/src/web/search/providers/utils.ts +128 -0
- package/src/web/search/providers/zai.ts +333 -0
- package/src/web/search/render.ts +262 -0
- package/src/web/search/types.ts +482 -0
- package/src/web/search/utils.ts +17 -0
- package/src/workspace-tree.ts +286 -0
|
@@ -0,0 +1,682 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import * as url from "node:url";
|
|
4
|
+
import { isCompiledBinary } from "@oh-my-pi/pi-utils";
|
|
5
|
+
|
|
6
|
+
const IS_COMPILED_BINARY = isCompiledBinary();
|
|
7
|
+
|
|
8
|
+
// Canonical scope for in-process pi packages. Plugins published against any of
|
|
9
|
+
// the aliased scopes below (mariozechner's original publish, earendil-works'
|
|
10
|
+
// fork, or the canonical @oh-my-pi scope itself) are remapped to this scope and
|
|
11
|
+
// resolved against the bundled copy that ships inside the omp binary. This
|
|
12
|
+
// keeps plugins running against the exact runtime state of the host (single
|
|
13
|
+
// module registry, single tool registry, etc.) regardless of which historical
|
|
14
|
+
// scope name they happened to declare in their peerDependencies.
|
|
15
|
+
const CANONICAL_PI_SCOPE = "@oh-my-pi";
|
|
16
|
+
|
|
17
|
+
// Scopes that have historically been used to publish (or alias) the same set
|
|
18
|
+
// of internal pi-* packages. `@oh-my-pi` is intentionally included so direct
|
|
19
|
+
// canonical imports still pass through the same host-bundled package resolution
|
|
20
|
+
// path instead of pulling a duplicate copy from plugin node_modules.
|
|
21
|
+
const PI_SCOPE_ALIASES = ["oh-my-pi", "mariozechner", "earendil-works"] as const;
|
|
22
|
+
|
|
23
|
+
// Internal pi-* package basenames bundled inside the omp binary.
|
|
24
|
+
const PI_PACKAGE_NAMES = ["pi-agent-core", "pi-ai", "pi-coding-agent", "pi-natives", "pi-tui", "pi-utils"] as const;
|
|
25
|
+
|
|
26
|
+
const PI_SCOPE_ALTERNATION = PI_SCOPE_ALIASES.join("|");
|
|
27
|
+
const PI_PACKAGE_ALTERNATION = PI_PACKAGE_NAMES.join("|");
|
|
28
|
+
|
|
29
|
+
// Upstream `@mariozechner/*` packages exposed a few subpaths at the package
|
|
30
|
+
// root that we relocated under a different folder. Each entry rewrites
|
|
31
|
+
// `<pkg>/<from>` → `<pkg>/<to>` after the scope has been canonicalised, so
|
|
32
|
+
// plugins importing the upstream layout still resolve to a real file in our
|
|
33
|
+
// bundled copy. Add new entries as `pkg/from -> pkg/to` whenever a plugin
|
|
34
|
+
// surfaces another upstream-only subpath that breaks resolution.
|
|
35
|
+
const PI_SUBPATH_REMAPS: ReadonlyMap<string, string> = new Map<string, string>([
|
|
36
|
+
// (currently empty) Upstream `@mariozechner/pi-ai/oauth` re-exported
|
|
37
|
+
// `./utils/oauth/index.js`. Our pi-ai now exposes the same surface at the
|
|
38
|
+
// real `@oh-my-pi/pi-ai/oauth` export, so the legacy subpath canonicalizes
|
|
39
|
+
// straight to it with no rewrite. Add `from -> to` entries here whenever a
|
|
40
|
+
// future upstream-only subpath surfaces that breaks resolution.
|
|
41
|
+
]);
|
|
42
|
+
|
|
43
|
+
const LEGACY_PI_SPECIFIER_FILTER = new RegExp(`^@(?:${PI_SCOPE_ALTERNATION})/(?:${PI_PACKAGE_ALTERNATION})(?:/.*)?$`);
|
|
44
|
+
const LEGACY_PI_IMPORT_SPECIFIER_REGEX = new RegExp(
|
|
45
|
+
`((?:from\\s+|import\\s+|import\\s*\\(\\s*)["'])(@(?:${PI_SCOPE_ALTERNATION})/(?:${PI_PACKAGE_ALTERNATION})(?:/[^"'()\\s]+)?)(["'])`,
|
|
46
|
+
"g",
|
|
47
|
+
);
|
|
48
|
+
const resolvedSpecifierFallbacks = new Map<string, string>();
|
|
49
|
+
const SOURCE_MODULE_EXTENSIONS = [".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs"] as const;
|
|
50
|
+
const SUPPORTED_PACKAGE_IMPORT_CONDITIONS = new Set(["bun", "node", "import", "default"]);
|
|
51
|
+
const packageRootCache = new Map<string, string | null>();
|
|
52
|
+
const packageImportsCache = new Map<string, Record<string, unknown> | null>();
|
|
53
|
+
const PACKAGE_IMPORT_EXCLUDED = Symbol("packageImportExcluded");
|
|
54
|
+
|
|
55
|
+
// Extensions that imported `@sinclair/typebox` directly used to resolve against a
|
|
56
|
+
// real `@sinclair/typebox` install. The runtime dep was replaced with the Zod-backed
|
|
57
|
+
// shim under `extensibility/typebox.ts`; plugins still importing the public name
|
|
58
|
+
// are redirected to that shim so existing extensions keep working without code
|
|
59
|
+
// changes. Submodules like `@sinclair/typebox/compiler` are intentionally not
|
|
60
|
+
// remapped — those expose TypeBox-only APIs the shim does not provide and plugins
|
|
61
|
+
// relying on them must vendor `@sinclair/typebox` directly.
|
|
62
|
+
const TYPEBOX_SPECIFIER_FILTER = /^@sinclair\/typebox$/;
|
|
63
|
+
|
|
64
|
+
// Compat shim and bundled-package paths used in compiled-binary mode. The shim
|
|
65
|
+
// paths must point at files that ship inside the bunfs root; in dev /
|
|
66
|
+
// source-link / installed-package mode the canonical specifier resolves via
|
|
67
|
+
// `Bun.resolveSync` so only the shim files need explicit paths there.
|
|
68
|
+
//
|
|
69
|
+
// `BUNFS_PACKAGE_ROOT` is derived from `import.meta.dir` rather than hardcoded
|
|
70
|
+
// as `/$bunfs/root/packages` so the prefix stays platform-native: on Windows
|
|
71
|
+
// the bunfs mount appears as `<drive>:\~BUN\root\…` (see oven-sh/bun#15766),
|
|
72
|
+
// and a hardcoded POSIX literal would normalize to `\$bunfs\root\…` and fail
|
|
73
|
+
// to resolve. Compiled Bun modules currently report the bunfs root itself from
|
|
74
|
+
// `import.meta.dir`, so appending `packages` lands on the `--root ../..`
|
|
75
|
+
// package directory used by `scripts/build-binary.ts`.
|
|
76
|
+
//
|
|
77
|
+
// Every shim listed below must also be registered as an explicit `--compile`
|
|
78
|
+
// entrypoint in `scripts/build-binary.ts` or release builds fail with
|
|
79
|
+
// missing-module errors. Non-shim bundled packages are resolved via
|
|
80
|
+
// `Bun.resolveSync` (see `resolveCanonicalPiSpecifier`) outside compiled mode,
|
|
81
|
+
// so they keep working when on-disk layout differs from the monorepo tree.
|
|
82
|
+
/**
|
|
83
|
+
* Compute the bunfs package root from the compiled binary's `import.meta.dir`
|
|
84
|
+
* (or any stand-in supplied by tests). Bun 1.3 reports the bunfs mount root
|
|
85
|
+
* (`/$bunfs/root` or `<drive>:\~BUN\root`) for imported modules as well as the
|
|
86
|
+
* entrypoint, so the normal path is `<root>/packages`.
|
|
87
|
+
*
|
|
88
|
+
* The suffix branch preserves correctness if a future Bun release switches to
|
|
89
|
+
* module-specific `import.meta.dir` values inside compiled binaries, matching
|
|
90
|
+
* the source layout:
|
|
91
|
+
* `<bunfs>/packages/coding-agent/src/extensibility/plugins`.
|
|
92
|
+
*
|
|
93
|
+
* Exported for tests; production callers use `BUNFS_PACKAGE_ROOT` below.
|
|
94
|
+
*/
|
|
95
|
+
export function __computeBunfsPackageRoot(metaDir: string, pathImpl: typeof path = path): string {
|
|
96
|
+
const pluginsDirSuffix = pathImpl.join("packages", "coding-agent", "src", "extensibility", "plugins");
|
|
97
|
+
const normalizedMetaDir = pathImpl.normalize(metaDir);
|
|
98
|
+
if (normalizedMetaDir.endsWith(pluginsDirSuffix)) {
|
|
99
|
+
return pathImpl.resolve(metaDir, "..", "..", "..", "..");
|
|
100
|
+
}
|
|
101
|
+
return pathImpl.join(metaDir, "packages");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const BUNFS_PACKAGE_ROOT = IS_COMPILED_BINARY ? __computeBunfsPackageRoot(import.meta.dir) : null;
|
|
105
|
+
|
|
106
|
+
function bunfsPath(...segments: string[]): string {
|
|
107
|
+
if (!BUNFS_PACKAGE_ROOT) {
|
|
108
|
+
throw new Error("bunfsPath is only valid in compiled-binary mode");
|
|
109
|
+
}
|
|
110
|
+
return path.join(BUNFS_PACKAGE_ROOT, ...segments);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function resolveBundledSelfPackageRoot(): string | undefined {
|
|
114
|
+
if (!process.env.PI_BUNDLED) return undefined;
|
|
115
|
+
try {
|
|
116
|
+
return path.dirname(Bun.resolveSync("@oh-my-pi/pi-coding-agent/package.json", import.meta.dir));
|
|
117
|
+
} catch {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const BUNDLED_SELF_PACKAGE_ROOT = resolveBundledSelfPackageRoot();
|
|
123
|
+
|
|
124
|
+
function sourceShimPath(file: string): string {
|
|
125
|
+
return BUNDLED_SELF_PACKAGE_ROOT
|
|
126
|
+
? path.join(BUNDLED_SELF_PACKAGE_ROOT, "src", "extensibility", file)
|
|
127
|
+
: path.resolve(import.meta.dir, "..", file);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const TYPEBOX_SHIM_PATH = BUNFS_PACKAGE_ROOT
|
|
131
|
+
? bunfsPath("coding-agent", "src", "extensibility", "typebox.js")
|
|
132
|
+
: sourceShimPath("typebox.ts");
|
|
133
|
+
|
|
134
|
+
// Legacy extensions historically imported `Type` (and `Static`/`TSchema`) from
|
|
135
|
+
// the package root of `@(scope)/pi-ai`. pi-ai 15.1.0 removed the runtime `Type`
|
|
136
|
+
// export (see `packages/ai/CHANGELOG.md`), so the bare canonical specifier no
|
|
137
|
+
// longer satisfies those imports. The override below redirects only the bare
|
|
138
|
+
// pi-ai package root onto a sibling shim that re-exports the canonical surface
|
|
139
|
+
// plus the borrowed `Type` runtime from the Zod-backed TypeBox shim. Subpath
|
|
140
|
+
// imports such as `@oh-my-pi/pi-ai/oauth` continue to resolve directly
|
|
141
|
+
// against the bundled pi-ai package.
|
|
142
|
+
const LEGACY_PI_AI_SHIM_PATH = BUNFS_PACKAGE_ROOT
|
|
143
|
+
? bunfsPath("coding-agent", "src", "extensibility", "legacy-pi-ai-shim.js")
|
|
144
|
+
: sourceShimPath("legacy-pi-ai-shim.ts");
|
|
145
|
+
|
|
146
|
+
// The coding-agent's own `./src/index.ts` cannot be listed as an extra
|
|
147
|
+
// `bun --compile` entrypoint alongside the CLI entry without breaking binary
|
|
148
|
+
// startup (issue #1474 follow-up). Legacy `@(scope)/pi-coding-agent` root
|
|
149
|
+
// imports therefore resolve through a sibling shim whose distinct file path
|
|
150
|
+
// avoids that collision while re-exporting the canonical package surface.
|
|
151
|
+
const LEGACY_PI_CODING_AGENT_SHIM_PATH = BUNFS_PACKAGE_ROOT
|
|
152
|
+
? bunfsPath("coding-agent", "src", "extensibility", "legacy-pi-coding-agent-shim.js")
|
|
153
|
+
: sourceShimPath("legacy-pi-coding-agent-shim.ts");
|
|
154
|
+
|
|
155
|
+
// Package-root overrides. Shim entries are always applied because they replace
|
|
156
|
+
// (or augment) the canonical surface even in non-compiled installs. The bunfs
|
|
157
|
+
// entries are added only in compiled-binary mode — in dev / source-link /
|
|
158
|
+
// installed-package mode the canonical specifier resolves cleanly through
|
|
159
|
+
// `Bun.resolveSync`, and hardcoding a relative source-tree path would break
|
|
160
|
+
// installs where the bundled packages live at `node_modules/@oh-my-pi/pi-*`
|
|
161
|
+
// rather than `packages/*`.
|
|
162
|
+
//
|
|
163
|
+
// Every override target is validated against the on-disk filesystem at module
|
|
164
|
+
// init: any entry whose file is missing (e.g. a compiled binary where Bun's
|
|
165
|
+
// `--compile` quietly dropped an additional entrypoint — issue #2168) is left
|
|
166
|
+
// out so `resolveCanonicalPiSpecifier` falls through to `getResolvedSpecifier`,
|
|
167
|
+
// which throws under bunfs and triggers the catch in `rewriteLegacyPiImports`.
|
|
168
|
+
// That catch leaves the specifier untouched so Bun resolves the canonical
|
|
169
|
+
// `@oh-my-pi/pi-*` import from the extension's own `node_modules` instead of
|
|
170
|
+
// emitting a bunfs `file://` URL to a module that isn't actually present.
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Drop overrides whose targets are missing on disk so they can fall through to
|
|
174
|
+
* the canonical-resolution path. Exported for the test seam in #2168.
|
|
175
|
+
*
|
|
176
|
+
* `pathExistsSync` defaults to `fs.existsSync`; the tests inject a stub to
|
|
177
|
+
* simulate the missing-entrypoint failure mode without touching the real FS.
|
|
178
|
+
*/
|
|
179
|
+
export function __validateLegacyPiPackageRootOverrides(
|
|
180
|
+
candidates: Record<string, string>,
|
|
181
|
+
pathExistsSync: (p: string) => boolean = fs.existsSync,
|
|
182
|
+
): Record<string, string> {
|
|
183
|
+
return Object.fromEntries(Object.entries(candidates).filter(([, candidate]) => pathExistsSync(candidate)));
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const LEGACY_PI_PACKAGE_ROOT_OVERRIDES = __validateLegacyPiPackageRootOverrides({
|
|
187
|
+
[`${CANONICAL_PI_SCOPE}/pi-ai`]: LEGACY_PI_AI_SHIM_PATH,
|
|
188
|
+
[`${CANONICAL_PI_SCOPE}/pi-coding-agent`]: LEGACY_PI_CODING_AGENT_SHIM_PATH,
|
|
189
|
+
...(BUNFS_PACKAGE_ROOT
|
|
190
|
+
? {
|
|
191
|
+
[`${CANONICAL_PI_SCOPE}/pi-agent-core`]: bunfsPath("agent", "src", "index.js"),
|
|
192
|
+
[`${CANONICAL_PI_SCOPE}/pi-natives`]: bunfsPath("natives", "native", "index.js"),
|
|
193
|
+
[`${CANONICAL_PI_SCOPE}/pi-tui`]: bunfsPath("tui", "src", "index.js"),
|
|
194
|
+
[`${CANONICAL_PI_SCOPE}/pi-utils`]: bunfsPath("utils", "src", "index.js"),
|
|
195
|
+
}
|
|
196
|
+
: {}),
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
let isLegacyPiSpecifierShimInstalled = false;
|
|
200
|
+
|
|
201
|
+
function remapLegacyPiSpecifier(specifier: string): string | null {
|
|
202
|
+
if (!LEGACY_PI_SPECIFIER_FILTER.test(specifier)) {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
const slashIdx = specifier.indexOf("/", 1);
|
|
206
|
+
// Filter guarantees a slash exists, but guard anyway to keep the type narrow.
|
|
207
|
+
if (slashIdx === -1) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
const rest = specifier.slice(slashIdx + 1);
|
|
211
|
+
const remappedSubpath = PI_SUBPATH_REMAPS.get(rest) ?? rest;
|
|
212
|
+
return `${CANONICAL_PI_SCOPE}/${remappedSubpath}`;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function getResolvedSpecifier(specifier: string): string {
|
|
216
|
+
const cached = resolvedSpecifierFallbacks.get(specifier);
|
|
217
|
+
if (cached) {
|
|
218
|
+
return cached;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const resolved = Bun.resolveSync(specifier, import.meta.dir);
|
|
222
|
+
resolvedSpecifierFallbacks.set(specifier, resolved);
|
|
223
|
+
return resolved;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Resolve a canonical `@oh-my-pi/*` specifier to a filesystem path, preferring
|
|
228
|
+
* a bundled compat shim when one is registered for the package root.
|
|
229
|
+
*
|
|
230
|
+
* Falls back to `getResolvedSpecifier` (which may throw under compiled binary
|
|
231
|
+
* mode); callers handle that the same way they would for non-overridden
|
|
232
|
+
* specifiers.
|
|
233
|
+
*/
|
|
234
|
+
function resolveCanonicalPiSpecifier(remappedSpecifier: string): string {
|
|
235
|
+
const override = LEGACY_PI_PACKAGE_ROOT_OVERRIDES[remappedSpecifier];
|
|
236
|
+
if (override) {
|
|
237
|
+
return override;
|
|
238
|
+
}
|
|
239
|
+
return getResolvedSpecifier(remappedSpecifier);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function toImportSpecifier(resolvedPath: string): string {
|
|
243
|
+
return url.pathToFileURL(resolvedPath).href;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function rewriteLegacyPiImports(source: string): string {
|
|
247
|
+
return source.replace(
|
|
248
|
+
LEGACY_PI_IMPORT_SPECIFIER_REGEX,
|
|
249
|
+
(match, prefix: string, specifier: string, suffix: string) => {
|
|
250
|
+
const remappedSpecifier = remapLegacyPiSpecifier(specifier);
|
|
251
|
+
if (!remappedSpecifier) {
|
|
252
|
+
return match;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
try {
|
|
256
|
+
return `${prefix}${toImportSpecifier(resolveCanonicalPiSpecifier(remappedSpecifier))}${suffix}`;
|
|
257
|
+
} catch {
|
|
258
|
+
// Resolution failed — typically in compiled binary mode where
|
|
259
|
+
// Bun.resolveSync cannot walk up from /$bunfs/root to find the
|
|
260
|
+
// bundled node_modules. Leave the specifier unchanged so Bun
|
|
261
|
+
// resolves it natively against the extension's own peer deps.
|
|
262
|
+
return match;
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Match the bare `@sinclair/typebox` import specifier (static + dynamic).
|
|
269
|
+
// Subpath imports like `@sinclair/typebox/compiler` are intentionally excluded —
|
|
270
|
+
// they expose TypeBox-only APIs the Zod-backed shim does not provide.
|
|
271
|
+
const TYPEBOX_IMPORT_SPECIFIER_REGEX = /((?:from\s+|import\s+|import\s*\(\s*)["'])(@sinclair\/typebox)(["'])/g;
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Rewrite the extension-owned specifiers OMP must host-resolve — legacy
|
|
275
|
+
* `@(scope)/pi-*`, bare `@sinclair/typebox`, and package `imports` aliases like
|
|
276
|
+
* `#src/*` — to absolute `file://` URLs. Every other specifier (relative
|
|
277
|
+
* siblings and third-party dependencies) is left untouched so Bun resolves it
|
|
278
|
+
* natively from the extension's real on-disk location.
|
|
279
|
+
*/
|
|
280
|
+
async function rewriteLegacyExtensionSource(source: string, importerPath: string): Promise<string> {
|
|
281
|
+
const withPi = rewriteLegacyPiImports(source);
|
|
282
|
+
const withTypeBox = withPi.replace(
|
|
283
|
+
TYPEBOX_IMPORT_SPECIFIER_REGEX,
|
|
284
|
+
(_match, prefix: string, _specifier: string, suffix: string) => {
|
|
285
|
+
return `${prefix}${toImportSpecifier(TYPEBOX_SHIM_PATH)}${suffix}`;
|
|
286
|
+
},
|
|
287
|
+
);
|
|
288
|
+
return rewriteExtensionPackageImports(withTypeBox, importerPath);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
292
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
async function pathExists(p: string): Promise<boolean> {
|
|
296
|
+
try {
|
|
297
|
+
await fs.promises.stat(p);
|
|
298
|
+
return true;
|
|
299
|
+
} catch {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
function hasSourceModuleExtension(p: string): boolean {
|
|
305
|
+
const ext = path.extname(p).toLowerCase();
|
|
306
|
+
return (SOURCE_MODULE_EXTENSIONS as readonly string[]).includes(ext);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
async function resolveSourceModuleFile(basePath: string): Promise<string | null> {
|
|
310
|
+
try {
|
|
311
|
+
const stats = await fs.promises.stat(basePath);
|
|
312
|
+
if (stats.isFile()) {
|
|
313
|
+
// Non-source files (JSON, WASM, text assets, etc.) bypass the on-load
|
|
314
|
+
// rewrite hook so Bun's native loaders handle them; our hook would
|
|
315
|
+
// otherwise pass them through `getLoader()` which falls back to `js`.
|
|
316
|
+
return hasSourceModuleExtension(basePath) ? realpathOrSelf(basePath) : null;
|
|
317
|
+
}
|
|
318
|
+
if (stats.isDirectory()) {
|
|
319
|
+
for (const extension of SOURCE_MODULE_EXTENSIONS) {
|
|
320
|
+
const resolved = await resolveSourceModuleFile(path.join(basePath, `index${extension}`));
|
|
321
|
+
if (resolved) return resolved;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
} catch {
|
|
325
|
+
// Fall through to extension candidates below.
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (path.extname(basePath)) {
|
|
329
|
+
return null;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
for (const extension of SOURCE_MODULE_EXTENSIONS) {
|
|
333
|
+
const resolved = await resolveSourceModuleFile(`${basePath}${extension}`);
|
|
334
|
+
if (resolved) return resolved;
|
|
335
|
+
}
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
async function findPackageRoot(importerPath: string): Promise<string | null> {
|
|
340
|
+
let dir = path.dirname(importerPath);
|
|
341
|
+
while (true) {
|
|
342
|
+
const cached = packageRootCache.get(dir);
|
|
343
|
+
if (cached !== undefined) {
|
|
344
|
+
return cached;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
if (await pathExists(path.join(dir, "package.json"))) {
|
|
348
|
+
packageRootCache.set(path.dirname(importerPath), dir);
|
|
349
|
+
return dir;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
const parent = path.dirname(dir);
|
|
353
|
+
if (parent === dir) {
|
|
354
|
+
packageRootCache.set(path.dirname(importerPath), null);
|
|
355
|
+
return null;
|
|
356
|
+
}
|
|
357
|
+
dir = parent;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
async function readPackageImports(packageRoot: string): Promise<Record<string, unknown> | null> {
|
|
362
|
+
const cached = packageImportsCache.get(packageRoot);
|
|
363
|
+
if (cached !== undefined) {
|
|
364
|
+
return cached;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
let imports: Record<string, unknown> | null = null;
|
|
368
|
+
try {
|
|
369
|
+
const pkg = await Bun.file(path.join(packageRoot, "package.json")).json();
|
|
370
|
+
if (isRecord(pkg) && isRecord(pkg.imports)) {
|
|
371
|
+
imports = pkg.imports;
|
|
372
|
+
}
|
|
373
|
+
} catch {
|
|
374
|
+
imports = null;
|
|
375
|
+
}
|
|
376
|
+
packageImportsCache.set(packageRoot, imports);
|
|
377
|
+
return imports;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
type PackageImportTargetSelection = string | typeof PACKAGE_IMPORT_EXCLUDED | null;
|
|
381
|
+
type ResolvedPackageImportTargetSelection = string | typeof PACKAGE_IMPORT_EXCLUDED;
|
|
382
|
+
|
|
383
|
+
function selectPackageImportTarget(entry: unknown): PackageImportTargetSelection {
|
|
384
|
+
if (entry === null) {
|
|
385
|
+
return PACKAGE_IMPORT_EXCLUDED;
|
|
386
|
+
}
|
|
387
|
+
if (typeof entry === "string") {
|
|
388
|
+
return entry;
|
|
389
|
+
}
|
|
390
|
+
if (Array.isArray(entry)) {
|
|
391
|
+
for (const item of entry) {
|
|
392
|
+
const target = selectPackageImportTarget(item);
|
|
393
|
+
if (target !== null) return target;
|
|
394
|
+
}
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
if (!isRecord(entry)) {
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
for (const [condition, value] of Object.entries(entry)) {
|
|
401
|
+
if (!SUPPORTED_PACKAGE_IMPORT_CONDITIONS.has(condition)) {
|
|
402
|
+
continue;
|
|
403
|
+
}
|
|
404
|
+
const target = selectPackageImportTarget(value);
|
|
405
|
+
if (target !== null) return target;
|
|
406
|
+
}
|
|
407
|
+
return null;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
async function resolvePackageImportTarget(
|
|
411
|
+
packageRoot: string,
|
|
412
|
+
target: string,
|
|
413
|
+
wildcard: string | null,
|
|
414
|
+
): Promise<string | null> {
|
|
415
|
+
if (!target.startsWith("./")) {
|
|
416
|
+
return null;
|
|
417
|
+
}
|
|
418
|
+
const substituted = wildcard === null ? target : target.replaceAll("*", wildcard);
|
|
419
|
+
return resolveSourceModuleFile(path.resolve(packageRoot, substituted));
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
async function resolvePackageImportSpecifier(specifier: string, importerPath: string): Promise<string | null> {
|
|
423
|
+
if (!specifier.startsWith("#")) {
|
|
424
|
+
return null;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
const packageRoot = await findPackageRoot(importerPath);
|
|
428
|
+
if (!packageRoot) {
|
|
429
|
+
return null;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
const imports = await readPackageImports(packageRoot);
|
|
433
|
+
if (!imports) {
|
|
434
|
+
return null;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
const exactTarget = selectPackageImportTarget(imports[specifier]);
|
|
438
|
+
if (exactTarget === PACKAGE_IMPORT_EXCLUDED) {
|
|
439
|
+
return null;
|
|
440
|
+
}
|
|
441
|
+
if (exactTarget !== null) {
|
|
442
|
+
return resolvePackageImportTarget(packageRoot, exactTarget, null);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
let bestMatch: { keyLength: number; target: ResolvedPackageImportTargetSelection; wildcard: string } | null = null;
|
|
446
|
+
for (const [key, entry] of Object.entries(imports)) {
|
|
447
|
+
const starIndex = key.indexOf("*");
|
|
448
|
+
if (starIndex === -1) continue;
|
|
449
|
+
|
|
450
|
+
const prefix = key.slice(0, starIndex);
|
|
451
|
+
const suffix = key.slice(starIndex + 1);
|
|
452
|
+
if (!specifier.startsWith(prefix) || !specifier.endsWith(suffix)) {
|
|
453
|
+
continue;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
const target = selectPackageImportTarget(entry);
|
|
457
|
+
if (target === null) {
|
|
458
|
+
continue;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
if (!bestMatch || key.length > bestMatch.keyLength) {
|
|
462
|
+
bestMatch = {
|
|
463
|
+
keyLength: key.length,
|
|
464
|
+
target,
|
|
465
|
+
wildcard: specifier.slice(prefix.length, specifier.length - suffix.length),
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
if (!bestMatch || bestMatch.target === PACKAGE_IMPORT_EXCLUDED) {
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
return resolvePackageImportTarget(packageRoot, bestMatch.target, bestMatch.wildcard);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
const PACKAGE_IMPORT_SPECIFIER_REGEX = /((?:from\s+|import\s+|import\s*\(\s*)["'])(#[^"'()\s]+)(["'])/g;
|
|
477
|
+
|
|
478
|
+
async function rewriteExtensionPackageImports(source: string, importerPath: string): Promise<string> {
|
|
479
|
+
let rewritten = "";
|
|
480
|
+
let lastIndex = 0;
|
|
481
|
+
for (const match of source.matchAll(PACKAGE_IMPORT_SPECIFIER_REGEX)) {
|
|
482
|
+
const matchIndex = match.index;
|
|
483
|
+
if (matchIndex === undefined) continue;
|
|
484
|
+
|
|
485
|
+
const [fullMatch, prefix, specifier, suffix] = match;
|
|
486
|
+
if (!prefix || !specifier || !suffix) continue;
|
|
487
|
+
|
|
488
|
+
const resolved = await resolvePackageImportSpecifier(specifier, importerPath);
|
|
489
|
+
if (!resolved) continue;
|
|
490
|
+
|
|
491
|
+
rewritten += source.slice(lastIndex, matchIndex);
|
|
492
|
+
rewritten += `${prefix}${toImportSpecifier(resolved)}${suffix}`;
|
|
493
|
+
lastIndex = matchIndex + fullMatch.length;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
if (lastIndex === 0) {
|
|
497
|
+
return source;
|
|
498
|
+
}
|
|
499
|
+
return `${rewritten}${source.slice(lastIndex)}`;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
function escapeRegExp(value: string): string {
|
|
503
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
// Match source modules in an extension graph (relative imports and package
|
|
507
|
+
// `imports` aliases such as `#src/*`). Bare third-party dependencies remain
|
|
508
|
+
// native Bun resolutions.
|
|
509
|
+
const EXTENSION_GRAPH_SPECIFIER_REGEX = /(?:from\s+|import\s+|import\s*\(\s*)["']((?:\.\.?\/|#)[^"']+)["']/g;
|
|
510
|
+
|
|
511
|
+
// Extension entry realpaths that already have a load-time rewrite hook
|
|
512
|
+
// installed. Each `Bun.plugin()` registration is process-global and permanent,
|
|
513
|
+
// so we register at most one hook per entry.
|
|
514
|
+
const hookedExtensionEntries = new Set<string>();
|
|
515
|
+
|
|
516
|
+
/** Resolve symlinks in a path, falling back to the input if realpath fails. */
|
|
517
|
+
async function realpathOrSelf(p: string): Promise<string> {
|
|
518
|
+
try {
|
|
519
|
+
return await fs.promises.realpath(p);
|
|
520
|
+
} catch {
|
|
521
|
+
return p;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
/**
|
|
526
|
+
* Walk the extension's relative-import graph starting at `entryRealPath`,
|
|
527
|
+
* returning the realpath of every reachable source module. Only relative
|
|
528
|
+
* specifiers (`./`, `../`) are followed — bare and absolute imports are left to
|
|
529
|
+
* Bun's native resolver — so the set is exactly the extension's own source,
|
|
530
|
+
* wherever it physically lives (a `../src` sibling, a symlinked sub-tree, …).
|
|
531
|
+
* This mirrors the module set the old temp-dir mirror tracked, minus the copy.
|
|
532
|
+
*/
|
|
533
|
+
async function collectExtensionModules(entryRealPath: string): Promise<Set<string>> {
|
|
534
|
+
const modules = new Set<string>();
|
|
535
|
+
const queue = [entryRealPath];
|
|
536
|
+
while (queue.length > 0) {
|
|
537
|
+
const file = queue.pop();
|
|
538
|
+
if (!file || modules.has(file)) {
|
|
539
|
+
continue;
|
|
540
|
+
}
|
|
541
|
+
let source: string;
|
|
542
|
+
try {
|
|
543
|
+
source = await Bun.file(file).text();
|
|
544
|
+
} catch {
|
|
545
|
+
continue;
|
|
546
|
+
}
|
|
547
|
+
modules.add(file);
|
|
548
|
+
const dir = path.dirname(file);
|
|
549
|
+
for (const match of source.matchAll(EXTENSION_GRAPH_SPECIFIER_REGEX)) {
|
|
550
|
+
const specifier = match[1];
|
|
551
|
+
if (!specifier) continue;
|
|
552
|
+
try {
|
|
553
|
+
const resolved = specifier.startsWith("#")
|
|
554
|
+
? await resolvePackageImportSpecifier(specifier, file)
|
|
555
|
+
: await realpathOrSelf(Bun.resolveSync(specifier, dir));
|
|
556
|
+
if (resolved && !modules.has(resolved)) {
|
|
557
|
+
queue.push(resolved);
|
|
558
|
+
}
|
|
559
|
+
} catch {
|
|
560
|
+
// Unresolvable relative import (e.g. a type-only path); skip it.
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
return modules;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Install a `Bun.plugin()` `onLoad` hook scoped to exactly the modules in an
|
|
569
|
+
* extension's source graph, so their legacy `@(scope)/pi-*`, bare
|
|
570
|
+
* `@sinclair/typebox`, and local package-import aliases are rewritten at load
|
|
571
|
+
* time. A runtime `onLoad` cannot fall through (Bun requires a result object),
|
|
572
|
+
* so the filter is an exact-path alternation of the graph's realpaths — it
|
|
573
|
+
* never matches the host, other extensions, `node_modules` deps, or unrelated
|
|
574
|
+
* project source.
|
|
575
|
+
*/
|
|
576
|
+
async function ensureExtensionGraphHook(entryRealPath: string): Promise<void> {
|
|
577
|
+
if (hookedExtensionEntries.has(entryRealPath)) {
|
|
578
|
+
return;
|
|
579
|
+
}
|
|
580
|
+
hookedExtensionEntries.add(entryRealPath);
|
|
581
|
+
|
|
582
|
+
const modules = await collectExtensionModules(entryRealPath);
|
|
583
|
+
const alternation = [...modules].map(escapeRegExp).join("|");
|
|
584
|
+
const filter = new RegExp(`^(?:${alternation})$`);
|
|
585
|
+
Bun.plugin({
|
|
586
|
+
name: `omp:legacy-pi-ext:${Bun.hash(entryRealPath).toString(36)}`,
|
|
587
|
+
setup(build) {
|
|
588
|
+
build.onLoad({ filter, namespace: "file" }, async args => {
|
|
589
|
+
const raw = await Bun.file(args.path).text();
|
|
590
|
+
return { contents: await rewriteLegacyExtensionSource(raw, args.path), loader: getLoader(args.path) };
|
|
591
|
+
});
|
|
592
|
+
},
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* Load a legacy Pi extension module from its real on-disk location.
|
|
598
|
+
*
|
|
599
|
+
* The extension runs in place, so its `import.meta.url` is the real source file
|
|
600
|
+
* and `__dirname`-relative `readFileSync` asset loads (HTML/CSS bundled next to
|
|
601
|
+
* the entry) resolve exactly as they do under the original Pi runtime — no
|
|
602
|
+
* temp-directory mirroring and no asset copying. An `onLoad` hook scoped to the
|
|
603
|
+
* entry's source graph rewrites only host-resolved compatibility imports in the
|
|
604
|
+
* extension's own source; everything else resolves natively.
|
|
605
|
+
*/
|
|
606
|
+
export async function loadLegacyPiModule(resolvedPath: string): Promise<unknown> {
|
|
607
|
+
// Bun reports the realpath of a loaded module to `onLoad` and exposes it as
|
|
608
|
+
// `import.meta.url`. Resolve symlinks here too (macOS `/var`→`/private/var`,
|
|
609
|
+
// `bun link`/pnpm installs) so the rewrite filter matches the path Bun
|
|
610
|
+
// actually hands the hook.
|
|
611
|
+
const entryRealPath = await realpathOrSelf(path.resolve(resolvedPath));
|
|
612
|
+
await ensureExtensionGraphHook(entryRealPath);
|
|
613
|
+
// `?mtime` busts Bun's module cache so repeat loads pick up edited source.
|
|
614
|
+
return import(`${toImportSpecifier(entryRealPath)}?mtime=${Date.now()}`);
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
function getLoader(path: string): "js" | "jsx" | "ts" | "tsx" {
|
|
618
|
+
if (path.endsWith(".tsx")) {
|
|
619
|
+
return "tsx";
|
|
620
|
+
}
|
|
621
|
+
if (path.endsWith(".jsx")) {
|
|
622
|
+
return "jsx";
|
|
623
|
+
}
|
|
624
|
+
if (path.endsWith(".ts") || path.endsWith(".mts") || path.endsWith(".cts")) {
|
|
625
|
+
return "ts";
|
|
626
|
+
}
|
|
627
|
+
return "js";
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
function resolveLegacyPiSpecifier(args: { path: string; importer: string }): { path: string } | undefined {
|
|
631
|
+
const remappedSpecifier = remapLegacyPiSpecifier(args.path);
|
|
632
|
+
if (!remappedSpecifier) {
|
|
633
|
+
return undefined;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
// Primary: resolve the canonical @oh-my-pi/* specifier from the host binary
|
|
637
|
+
// location. Works in dev mode and in source-link installs.
|
|
638
|
+
try {
|
|
639
|
+
return { path: resolveCanonicalPiSpecifier(remappedSpecifier) };
|
|
640
|
+
} catch {
|
|
641
|
+
// Fallback for compiled binary mode: the bundled packages live inside
|
|
642
|
+
// /$bunfs/root and aren't reachable by filesystem resolution. Prefer the
|
|
643
|
+
// canonical specifier against the importing file's directory when the
|
|
644
|
+
// plugin installed @oh-my-pi peer deps, then try the original legacy
|
|
645
|
+
// specifier for plugins that still vendor only @mariozechner or
|
|
646
|
+
// @earendil-works peer deps.
|
|
647
|
+
const importerDir = path.dirname(args.importer);
|
|
648
|
+
try {
|
|
649
|
+
return { path: Bun.resolveSync(remappedSpecifier, importerDir) };
|
|
650
|
+
} catch {
|
|
651
|
+
try {
|
|
652
|
+
return { path: Bun.resolveSync(args.path, importerDir) };
|
|
653
|
+
} catch {
|
|
654
|
+
return undefined;
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
function resolveTypeBoxSpecifier(): { path: string } {
|
|
661
|
+
return { path: TYPEBOX_SHIM_PATH };
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
export function installLegacyPiSpecifierShim(): void {
|
|
665
|
+
if (isLegacyPiSpecifierShimInstalled) {
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
isLegacyPiSpecifierShimInstalled = true;
|
|
669
|
+
|
|
670
|
+
Bun.plugin({
|
|
671
|
+
name: "omp:legacy-pi-shim",
|
|
672
|
+
setup(build) {
|
|
673
|
+
build.onResolve({ filter: LEGACY_PI_SPECIFIER_FILTER, namespace: "file" }, resolveLegacyPiSpecifier);
|
|
674
|
+
build.onResolve({ filter: TYPEBOX_SPECIFIER_FILTER, namespace: "file" }, resolveTypeBoxSpecifier);
|
|
675
|
+
},
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
/** Test seam: clears the memoized canonical specifier resolutions. */
|
|
680
|
+
export function __resetLegacyPiResolutionCache(): void {
|
|
681
|
+
resolvedSpecifierFallbacks.clear();
|
|
682
|
+
}
|