@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,514 @@
|
|
|
1
|
+
import type { Dirent } from "node:fs";
|
|
2
|
+
import * as fs from "node:fs/promises";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import * as natives from './stubs/natives/index.ts';
|
|
6
|
+
import { getWorktreeDir, hashPath, logger, Snowflake } from "@oh-my-pi/pi-utils";
|
|
7
|
+
import * as git from "../utils/git";
|
|
8
|
+
import { mapWithConcurrencyLimit } from "./parallel";
|
|
9
|
+
|
|
10
|
+
const { IsoBackendKind } = natives;
|
|
11
|
+
type IsoBackendKind = natives.IsoBackendKind;
|
|
12
|
+
|
|
13
|
+
/** Baseline state for a single git repository. */
|
|
14
|
+
export interface RepoBaseline {
|
|
15
|
+
repoRoot: string;
|
|
16
|
+
headCommit: string;
|
|
17
|
+
staged: string;
|
|
18
|
+
unstaged: string;
|
|
19
|
+
untracked: string[];
|
|
20
|
+
untrackedPatch: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Baseline state for the project, including any nested git repos. */
|
|
24
|
+
export interface WorktreeBaseline {
|
|
25
|
+
root: RepoBaseline;
|
|
26
|
+
/** Nested git repos (path relative to root.repoRoot). */
|
|
27
|
+
nested: Array<{ relativePath: string; baseline: RepoBaseline }>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export async function getRepoRoot(cwd: string): Promise<string> {
|
|
31
|
+
const repoRoot = await git.repo.root(cwd);
|
|
32
|
+
if (!repoRoot) {
|
|
33
|
+
throw new Error("Git repository not found for isolated task execution.");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return repoRoot;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const GIT_NO_INDEX_NULL_PATH = process.platform === "win32" ? "NUL" : "/dev/null";
|
|
40
|
+
|
|
41
|
+
export function getGitNoIndexNullPath(): string {
|
|
42
|
+
return GIT_NO_INDEX_NULL_PATH;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Find nested git repositories (non-submodule) under the given root. */
|
|
46
|
+
async function discoverNestedRepos(repoRoot: string): Promise<string[]> {
|
|
47
|
+
// Get submodule paths so we can exclude them
|
|
48
|
+
const submodulePaths = new Set(await git.ls.submodules(repoRoot));
|
|
49
|
+
|
|
50
|
+
// Find all .git dirs/files that aren't the root or known submodules
|
|
51
|
+
const result: string[] = [];
|
|
52
|
+
async function walk(dir: string): Promise<void> {
|
|
53
|
+
let entries: Dirent[];
|
|
54
|
+
try {
|
|
55
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
56
|
+
} catch {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const entry of entries) {
|
|
60
|
+
if (entry.name === "node_modules" || entry.name === ".git") continue;
|
|
61
|
+
if (!entry.isDirectory()) continue;
|
|
62
|
+
const full = path.join(dir, entry.name);
|
|
63
|
+
const rel = path.relative(repoRoot, full);
|
|
64
|
+
// Check if this directory is itself a git repo
|
|
65
|
+
const gitDir = path.join(full, ".git");
|
|
66
|
+
let hasGit = false;
|
|
67
|
+
try {
|
|
68
|
+
await fs.access(gitDir);
|
|
69
|
+
hasGit = true;
|
|
70
|
+
} catch {}
|
|
71
|
+
if (hasGit && !submodulePaths.has(rel)) {
|
|
72
|
+
result.push(rel);
|
|
73
|
+
// Don't recurse into nested repos — they manage their own tree
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
await walk(full);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
await walk(repoRoot);
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function captureUntrackedPatch(repoRoot: string, untracked: readonly string[]): Promise<string> {
|
|
84
|
+
if (untracked.length === 0) return "";
|
|
85
|
+
const nullPath = getGitNoIndexNullPath();
|
|
86
|
+
// Bound concurrent git spawns; large untracked sets would otherwise fork one
|
|
87
|
+
// process per file at once.
|
|
88
|
+
const { results: untrackedDiffs } = await mapWithConcurrencyLimit([...untracked], 8, entry =>
|
|
89
|
+
git.diff(repoRoot, {
|
|
90
|
+
allowFailure: true,
|
|
91
|
+
binary: true,
|
|
92
|
+
noIndex: { left: nullPath, right: entry },
|
|
93
|
+
}),
|
|
94
|
+
);
|
|
95
|
+
return untrackedDiffs.filter((diff): diff is string => !!diff?.trim()).join("\n");
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async function captureRepoBaseline(repoRoot: string): Promise<RepoBaseline> {
|
|
99
|
+
const headCommit = (await git.head.sha(repoRoot)) ?? "";
|
|
100
|
+
const staged = await git.diff(repoRoot, { binary: true, cached: true });
|
|
101
|
+
const unstaged = await git.diff(repoRoot, { binary: true });
|
|
102
|
+
const untracked = await git.ls.untracked(repoRoot);
|
|
103
|
+
const untrackedPatch = await captureUntrackedPatch(repoRoot, untracked);
|
|
104
|
+
return { repoRoot, headCommit, staged, unstaged, untracked, untrackedPatch };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function writeSyntheticTree(repoDir: string, baseTreeish: string, patches: readonly string[]): Promise<string> {
|
|
108
|
+
const tempIndex = path.join(os.tmpdir(), `omp-task-index-${Snowflake.next()}`);
|
|
109
|
+
try {
|
|
110
|
+
await git.readTree(repoDir, baseTreeish, {
|
|
111
|
+
env: { GIT_INDEX_FILE: tempIndex },
|
|
112
|
+
});
|
|
113
|
+
for (const patch of patches) {
|
|
114
|
+
if (!patch.trim()) continue;
|
|
115
|
+
await git.patch.applyText(repoDir, patch, {
|
|
116
|
+
cached: true,
|
|
117
|
+
env: { GIT_INDEX_FILE: tempIndex },
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return await git.writeTree(repoDir, {
|
|
121
|
+
env: { GIT_INDEX_FILE: tempIndex },
|
|
122
|
+
});
|
|
123
|
+
} finally {
|
|
124
|
+
await fs.rm(tempIndex, { force: true });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export async function captureBaseline(repoRoot: string): Promise<WorktreeBaseline> {
|
|
129
|
+
const [root, nestedPaths] = await Promise.all([captureRepoBaseline(repoRoot), discoverNestedRepos(repoRoot)]);
|
|
130
|
+
const nested = await Promise.all(
|
|
131
|
+
nestedPaths.map(async relativePath => ({
|
|
132
|
+
relativePath,
|
|
133
|
+
baseline: await captureRepoBaseline(path.join(repoRoot, relativePath)),
|
|
134
|
+
})),
|
|
135
|
+
);
|
|
136
|
+
return { root, nested };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async function captureRepoDeltaPatch(repoDir: string, rb: RepoBaseline): Promise<string> {
|
|
140
|
+
const currentHead = (await git.head.sha(repoDir)) ?? "";
|
|
141
|
+
const currentStaged = await git.diff(repoDir, { binary: true, cached: true });
|
|
142
|
+
const currentUnstaged = await git.diff(repoDir, { binary: true });
|
|
143
|
+
const currentUntracked = await git.ls.untracked(repoDir);
|
|
144
|
+
const currentUntrackedPatch = await captureUntrackedPatch(repoDir, currentUntracked);
|
|
145
|
+
|
|
146
|
+
const baselineTree = await writeSyntheticTree(repoDir, rb.headCommit, [rb.staged, rb.unstaged, rb.untrackedPatch]);
|
|
147
|
+
const currentTree = await writeSyntheticTree(repoDir, currentHead, [
|
|
148
|
+
currentStaged,
|
|
149
|
+
currentUnstaged,
|
|
150
|
+
currentUntrackedPatch,
|
|
151
|
+
]);
|
|
152
|
+
|
|
153
|
+
return git.diff.tree(repoDir, baselineTree, currentTree, {
|
|
154
|
+
allowFailure: true,
|
|
155
|
+
binary: true,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export interface NestedRepoPatch {
|
|
160
|
+
relativePath: string;
|
|
161
|
+
patch: string;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export interface DeltaPatchResult {
|
|
165
|
+
rootPatch: string;
|
|
166
|
+
nestedPatches: NestedRepoPatch[];
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export async function captureDeltaPatch(isolationDir: string, baseline: WorktreeBaseline): Promise<DeltaPatchResult> {
|
|
170
|
+
const rootPatch = await captureRepoDeltaPatch(isolationDir, baseline.root);
|
|
171
|
+
const nestedPatches: NestedRepoPatch[] = [];
|
|
172
|
+
|
|
173
|
+
for (const { relativePath, baseline: nb } of baseline.nested) {
|
|
174
|
+
const nestedDir = path.join(isolationDir, relativePath);
|
|
175
|
+
try {
|
|
176
|
+
await fs.access(path.join(nestedDir, ".git"));
|
|
177
|
+
} catch {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
const patch = await captureRepoDeltaPatch(nestedDir, nb);
|
|
181
|
+
if (patch.trim()) nestedPatches.push({ relativePath, patch });
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return { rootPatch, nestedPatches };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Apply nested repo patches directly to their working directories after parent merge.
|
|
189
|
+
* @param commitMessage Optional async function to generate a commit message from the combined diff.
|
|
190
|
+
* If omitted or returns null, falls back to a generic message.
|
|
191
|
+
*/
|
|
192
|
+
export async function applyNestedPatches(
|
|
193
|
+
repoRoot: string,
|
|
194
|
+
patches: NestedRepoPatch[],
|
|
195
|
+
commitMessage?: (diff: string) => Promise<string | null>,
|
|
196
|
+
): Promise<void> {
|
|
197
|
+
// Group patches by target repo to apply all at once and commit
|
|
198
|
+
const byRepo = new Map<string, NestedRepoPatch[]>();
|
|
199
|
+
for (const p of patches) {
|
|
200
|
+
if (!p.patch.trim()) continue;
|
|
201
|
+
const group = byRepo.get(p.relativePath) ?? [];
|
|
202
|
+
group.push(p);
|
|
203
|
+
byRepo.set(p.relativePath, group);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
for (const [relativePath, repoPatches] of byRepo) {
|
|
207
|
+
const nestedDir = path.join(repoRoot, relativePath);
|
|
208
|
+
try {
|
|
209
|
+
await fs.access(path.join(nestedDir, ".git"));
|
|
210
|
+
} catch {
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const combinedDiff = repoPatches.map(p => p.patch).join("\n");
|
|
215
|
+
for (const { patch } of repoPatches) {
|
|
216
|
+
await git.patch.applyText(nestedDir, patch);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Commit so nested repo history reflects the task changes
|
|
220
|
+
if ((await git.status(nestedDir)).trim().length > 0) {
|
|
221
|
+
const msg = (await commitMessage?.(combinedDiff)) ?? "changes from isolated task(s)";
|
|
222
|
+
await git.stage.files(nestedDir);
|
|
223
|
+
await git.commit(nestedDir, msg);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
229
|
+
// Unified isolation lifecycle — picks the best backend via the PAL and
|
|
230
|
+
// returns the merged-view path together with the resolved kind.
|
|
231
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* User-facing isolation mode names exposed by the `task.isolation.mode`
|
|
235
|
+
* setting. Mapped to a backend-kind hint via {@link parseIsolationMode};
|
|
236
|
+
* the PAL's `iso_resolve` then falls back through the kind order
|
|
237
|
+
* whenever the hint isn't available on the current host.
|
|
238
|
+
*/
|
|
239
|
+
export type TaskIsolationMode =
|
|
240
|
+
| "none"
|
|
241
|
+
| "auto"
|
|
242
|
+
| "apfs"
|
|
243
|
+
| "btrfs"
|
|
244
|
+
| "zfs"
|
|
245
|
+
| "reflink"
|
|
246
|
+
| "overlayfs"
|
|
247
|
+
| "projfs"
|
|
248
|
+
| "block-clone"
|
|
249
|
+
| "rcopy"
|
|
250
|
+
// Legacy values, accepted for back-compat with pre-PAL settings files.
|
|
251
|
+
| "worktree"
|
|
252
|
+
| "fuse-overlay"
|
|
253
|
+
| "fuse-projfs";
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Translate a {@link TaskIsolationMode} string to an [`IsoBackendKind`]
|
|
257
|
+
* the PAL can act on. `"none"` returns `null` (caller skips isolation
|
|
258
|
+
* entirely); `"auto"` returns `undefined` (no hint — let the resolver
|
|
259
|
+
* pick). Anything else returns the matching kind.
|
|
260
|
+
*/
|
|
261
|
+
export function parseIsolationMode(mode: TaskIsolationMode): IsoBackendKind | undefined {
|
|
262
|
+
switch (mode) {
|
|
263
|
+
case "none":
|
|
264
|
+
case "auto":
|
|
265
|
+
return undefined;
|
|
266
|
+
case "apfs":
|
|
267
|
+
return IsoBackendKind.Apfs;
|
|
268
|
+
case "btrfs":
|
|
269
|
+
return IsoBackendKind.Btrfs;
|
|
270
|
+
case "zfs":
|
|
271
|
+
return IsoBackendKind.Zfs;
|
|
272
|
+
case "reflink":
|
|
273
|
+
return IsoBackendKind.LinuxReflink;
|
|
274
|
+
case "overlayfs":
|
|
275
|
+
case "fuse-overlay":
|
|
276
|
+
return IsoBackendKind.Overlayfs;
|
|
277
|
+
case "projfs":
|
|
278
|
+
case "fuse-projfs":
|
|
279
|
+
return IsoBackendKind.Projfs;
|
|
280
|
+
case "block-clone":
|
|
281
|
+
return IsoBackendKind.WindowsBlockClone;
|
|
282
|
+
case "rcopy":
|
|
283
|
+
case "worktree":
|
|
284
|
+
return IsoBackendKind.Rcopy;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export interface IsolationHandle {
|
|
289
|
+
/** Merged view materialised by the backend; pass this to the task. */
|
|
290
|
+
mergedDir: string;
|
|
291
|
+
/** Backend the PAL actually used. */
|
|
292
|
+
backend: IsoBackendKind;
|
|
293
|
+
/** True when the resolver downgraded from `preferred` to `backend`. */
|
|
294
|
+
fellBack: boolean;
|
|
295
|
+
/** Optional reason associated with `fellBack`. */
|
|
296
|
+
fallbackReason: string | null;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Materialise `merged` for a single task. `preferred` is a hint — when
|
|
301
|
+
* its prerequisites are missing the PAL silently falls back, and the
|
|
302
|
+
* caller learns about that through `IsolationHandle.fellBack` +
|
|
303
|
+
* `fallbackReason`.
|
|
304
|
+
*/
|
|
305
|
+
|
|
306
|
+
function errorMessage(err: unknown): string {
|
|
307
|
+
return err instanceof Error ? err.message : String(err);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
export async function ensureIsolation(
|
|
311
|
+
baseCwd: string,
|
|
312
|
+
id: string,
|
|
313
|
+
preferred?: IsoBackendKind,
|
|
314
|
+
): Promise<IsolationHandle> {
|
|
315
|
+
const repoRoot = await getRepoRoot(baseCwd);
|
|
316
|
+
const baseDir = getWorktreeDir(`${id}-${hashPath(repoRoot)}`);
|
|
317
|
+
const mergedDir = path.join(baseDir, "merged");
|
|
318
|
+
|
|
319
|
+
const resolution = natives.isoResolve(preferred ?? null);
|
|
320
|
+
const candidates = resolution.candidates.length > 0 ? resolution.candidates : [resolution.kind];
|
|
321
|
+
let fallbackReason = resolution.reason ?? null;
|
|
322
|
+
|
|
323
|
+
for (const candidate of candidates) {
|
|
324
|
+
await fs.rm(baseDir, { recursive: true, force: true });
|
|
325
|
+
try {
|
|
326
|
+
await natives.isoStart(candidate, repoRoot, mergedDir);
|
|
327
|
+
return {
|
|
328
|
+
mergedDir,
|
|
329
|
+
backend: candidate,
|
|
330
|
+
fellBack: candidate !== resolution.kind || resolution.fellBack,
|
|
331
|
+
fallbackReason,
|
|
332
|
+
};
|
|
333
|
+
} catch (err) {
|
|
334
|
+
await fs.rm(baseDir, { recursive: true, force: true });
|
|
335
|
+
const message = errorMessage(err);
|
|
336
|
+
if (!natives.isoIsUnavailableError(message)) {
|
|
337
|
+
throw err;
|
|
338
|
+
}
|
|
339
|
+
fallbackReason ??= message;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
throw new Error(fallbackReason ?? "No isolation backend is available.");
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/** Tear down a handle returned by {@link ensureIsolation}. */
|
|
347
|
+
export async function cleanupIsolation(handle: IsolationHandle): Promise<void> {
|
|
348
|
+
try {
|
|
349
|
+
try {
|
|
350
|
+
await natives.isoStop(handle.backend, handle.mergedDir);
|
|
351
|
+
} catch (err) {
|
|
352
|
+
logger.warn("isolation backend stop failed during cleanup", {
|
|
353
|
+
backend: handle.backend,
|
|
354
|
+
mergedDir: handle.mergedDir,
|
|
355
|
+
error: err instanceof Error ? err.message : String(err),
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
} finally {
|
|
359
|
+
// baseDir is the parent of the merged directory
|
|
360
|
+
const baseDir = path.dirname(handle.mergedDir);
|
|
361
|
+
await fs.rm(baseDir, { recursive: true, force: true });
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
366
|
+
// Branch-mode isolation
|
|
367
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
368
|
+
|
|
369
|
+
export interface CommitToBranchResult {
|
|
370
|
+
branchName?: string;
|
|
371
|
+
nestedPatches: NestedRepoPatch[];
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Commit task-only changes to a new branch.
|
|
376
|
+
* Only root repo changes go on the branch. Nested repo patches are returned
|
|
377
|
+
* separately since the parent git can't track files inside gitlinks.
|
|
378
|
+
*/
|
|
379
|
+
export async function commitToBranch(
|
|
380
|
+
isolationDir: string,
|
|
381
|
+
baseline: WorktreeBaseline,
|
|
382
|
+
taskId: string,
|
|
383
|
+
description: string | undefined,
|
|
384
|
+
commitMessage?: (diff: string) => Promise<string | null>,
|
|
385
|
+
): Promise<CommitToBranchResult | null> {
|
|
386
|
+
const { rootPatch, nestedPatches } = await captureDeltaPatch(isolationDir, baseline);
|
|
387
|
+
if (!rootPatch.trim() && nestedPatches.length === 0) return null;
|
|
388
|
+
|
|
389
|
+
const repoRoot = baseline.root.repoRoot;
|
|
390
|
+
const branchName = `omp/task/${taskId}`;
|
|
391
|
+
const fallbackMessage = description || taskId;
|
|
392
|
+
|
|
393
|
+
// Only create a branch if the root repo has changes
|
|
394
|
+
if (rootPatch.trim()) {
|
|
395
|
+
await git.branch.create(repoRoot, branchName);
|
|
396
|
+
const tmpDir = path.join(os.tmpdir(), `omp-branch-${Snowflake.next()}`);
|
|
397
|
+
try {
|
|
398
|
+
await git.worktree.add(repoRoot, tmpDir, branchName);
|
|
399
|
+
try {
|
|
400
|
+
await git.patch.applyText(tmpDir, rootPatch);
|
|
401
|
+
} catch (err) {
|
|
402
|
+
if (err instanceof git.GitCommandError) {
|
|
403
|
+
const stderr = err.result.stderr.slice(0, 2000);
|
|
404
|
+
logger.error("commitToBranch: git apply failed", {
|
|
405
|
+
taskId,
|
|
406
|
+
exitCode: err.result.exitCode,
|
|
407
|
+
stderr,
|
|
408
|
+
patchSize: rootPatch.length,
|
|
409
|
+
patchHead: rootPatch.slice(0, 500),
|
|
410
|
+
});
|
|
411
|
+
throw new Error(`git apply failed for task ${taskId}: ${stderr}`);
|
|
412
|
+
}
|
|
413
|
+
throw err;
|
|
414
|
+
}
|
|
415
|
+
await git.stage.files(tmpDir);
|
|
416
|
+
const msg = (commitMessage && (await commitMessage(rootPatch))) || fallbackMessage;
|
|
417
|
+
await git.commit(tmpDir, msg);
|
|
418
|
+
} finally {
|
|
419
|
+
await git.worktree.tryRemove(repoRoot, tmpDir);
|
|
420
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
return { branchName: rootPatch.trim() ? branchName : undefined, nestedPatches };
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
export interface MergeBranchResult {
|
|
428
|
+
merged: string[];
|
|
429
|
+
failed: string[];
|
|
430
|
+
conflict?: string;
|
|
431
|
+
/** Set when cherry-picks landed on HEAD but restoring the stashed working tree failed. */
|
|
432
|
+
stashConflict?: string;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* Cherry-pick task branch commits sequentially onto HEAD.
|
|
437
|
+
* Each branch has a single commit that gets replayed cleanly.
|
|
438
|
+
* Stops on first conflict and reports which branches succeeded.
|
|
439
|
+
*/
|
|
440
|
+
export async function mergeTaskBranches(
|
|
441
|
+
repoRoot: string,
|
|
442
|
+
branches: Array<{ branchName: string; taskId: string; description?: string }>,
|
|
443
|
+
): Promise<MergeBranchResult> {
|
|
444
|
+
// Serialize against other in-process git mutations on this repo: concurrent
|
|
445
|
+
// background merges interleaving stash push/pop + cherry-pick would corrupt
|
|
446
|
+
// the working tree (lost uncommitted changes, mixed-up stash entries).
|
|
447
|
+
return git.withRepoLock(repoRoot, async () => {
|
|
448
|
+
const merged: string[] = [];
|
|
449
|
+
const failed: string[] = [];
|
|
450
|
+
|
|
451
|
+
// Stash dirty working tree so cherry-pick can operate on a clean HEAD.
|
|
452
|
+
// Without this, cherry-pick refuses to run when uncommitted changes exist.
|
|
453
|
+
const didStash = await git.stash.push(repoRoot, "omp-task-merge");
|
|
454
|
+
|
|
455
|
+
let conflictResult: MergeBranchResult | undefined;
|
|
456
|
+
|
|
457
|
+
try {
|
|
458
|
+
for (const { branchName } of branches) {
|
|
459
|
+
try {
|
|
460
|
+
await git.cherryPick(repoRoot, branchName);
|
|
461
|
+
} catch (err) {
|
|
462
|
+
try {
|
|
463
|
+
await git.cherryPick.abort(repoRoot);
|
|
464
|
+
} catch {
|
|
465
|
+
/* no state to abort */
|
|
466
|
+
}
|
|
467
|
+
const stderr =
|
|
468
|
+
err instanceof git.GitCommandError
|
|
469
|
+
? err.result.stderr.trim()
|
|
470
|
+
: err instanceof Error
|
|
471
|
+
? err.message
|
|
472
|
+
: String(err);
|
|
473
|
+
failed.push(branchName);
|
|
474
|
+
conflictResult = {
|
|
475
|
+
merged,
|
|
476
|
+
failed: [...failed, ...branches.slice(merged.length + failed.length).map(b => b.branchName)],
|
|
477
|
+
conflict: `${branchName}: ${stderr}`,
|
|
478
|
+
};
|
|
479
|
+
break;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
merged.push(branchName);
|
|
483
|
+
}
|
|
484
|
+
} finally {
|
|
485
|
+
if (didStash) {
|
|
486
|
+
try {
|
|
487
|
+
await git.stash.pop(repoRoot, { index: true });
|
|
488
|
+
} catch {
|
|
489
|
+
// Stash-pop conflicts mean the replayed changes clash with the user's
|
|
490
|
+
// uncommitted edits. The cherry-picked commits are already on HEAD, so
|
|
491
|
+
// the merged branches DID land — report them as merged and surface the
|
|
492
|
+
// stash conflict separately instead of claiming they are unmerged.
|
|
493
|
+
logger.warn("Failed to restore stashed changes after task merge; stash entry preserved");
|
|
494
|
+
const stashConflict =
|
|
495
|
+
"stash pop: cherry-picked changes conflict with uncommitted edits. The merged commits are on HEAD; run `git stash pop` and resolve manually.";
|
|
496
|
+
if (conflictResult) {
|
|
497
|
+
conflictResult.stashConflict = stashConflict;
|
|
498
|
+
} else {
|
|
499
|
+
conflictResult = { merged, failed: [], stashConflict };
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
return conflictResult ?? { merged, failed };
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/** Clean up temporary task branches. */
|
|
510
|
+
export async function cleanupTaskBranches(repoRoot: string, branches: string[]): Promise<void> {
|
|
511
|
+
for (const branch of branches) {
|
|
512
|
+
await git.branch.tryDelete(repoRoot, branch);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OTLP trace export bootstrap.
|
|
3
|
+
*
|
|
4
|
+
* oh-my-pi's agent core (`@oh-my-pi/pi-agent-core`) emits OpenTelemetry GenAI
|
|
5
|
+
* spans through the global `@opentelemetry/api` tracer, but only when a
|
|
6
|
+
* TracerProvider is registered in the process — otherwise the API returns a
|
|
7
|
+
* no-op tracer and the spans are silently dropped. The shipped CLI never
|
|
8
|
+
* registered one, so headless / embedded hosts (e.g. an ACP harness that
|
|
9
|
+
* spawns `omp` as a child process) had no way to collect omp's internal traces.
|
|
10
|
+
*
|
|
11
|
+
* This module registers a NodeTracerProvider with an OTLP/proto exporter when
|
|
12
|
+
* the standard `OTEL_EXPORTER_OTLP_ENDPOINT` (or `..._TRACES_ENDPOINT`) env var
|
|
13
|
+
* is set, following the zero-code OTEL env contract: the exporter reads its
|
|
14
|
+
* endpoint, headers, and timeout from `OTEL_EXPORTER_OTLP_*` itself. The
|
|
15
|
+
* consuming process configures the destination entirely through env; omp stays
|
|
16
|
+
* provider-agnostic and ships no vendor coupling. Only the `http/protobuf`
|
|
17
|
+
* transport is supported — an `OTEL_EXPORTER_OTLP*_PROTOCOL` of `grpc` or
|
|
18
|
+
* `http/json` declines rather than misrouting spans.
|
|
19
|
+
*
|
|
20
|
+
* The OTLP/proto exporter on the 2.x line is used deliberately: the 1.x line
|
|
21
|
+
* deadlocks under Bun — its `req.on('close')` handler fires a spurious failure
|
|
22
|
+
* after the success path. `exporter-trace-otlp-proto@0.218` paired with
|
|
23
|
+
* `sdk-trace-base@2.7` exports cleanly on Bun.
|
|
24
|
+
*/
|
|
25
|
+
import { logger, postmortem } from "@oh-my-pi/pi-utils";
|
|
26
|
+
import type * as TraceNode from "@opentelemetry/sdk-trace-node";
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Periodic flush interval. A long-lived `omp` process (the ACP server is
|
|
30
|
+
* spawned once and reused across many turns) would otherwise hold finished
|
|
31
|
+
* spans until the batch window elapses or the process exits.
|
|
32
|
+
*/
|
|
33
|
+
const FLUSH_INTERVAL_MS = 30_000;
|
|
34
|
+
|
|
35
|
+
let provider: TraceNode.NodeTracerProvider | undefined;
|
|
36
|
+
let initPromise: Promise<void> | undefined;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Whether {@link initTelemetryExport} registered a real provider. The CLI uses
|
|
40
|
+
* this to decide whether to switch on the agent loop's telemetry config — there
|
|
41
|
+
* is no point emitting spans into a no-op tracer.
|
|
42
|
+
*/
|
|
43
|
+
export function isTelemetryExportEnabled(): boolean {
|
|
44
|
+
return provider !== undefined;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Register the global TracerProvider + OTLP exporter when an OTLP endpoint is
|
|
49
|
+
* configured via env. Idempotent, and a no-op when no endpoint is set (or when
|
|
50
|
+
* the OTEL kill-switches are engaged), so it is safe to call unconditionally at
|
|
51
|
+
* startup.
|
|
52
|
+
*/
|
|
53
|
+
export async function initTelemetryExport(): Promise<void> {
|
|
54
|
+
if (provider) return;
|
|
55
|
+
if (initPromise) return initPromise;
|
|
56
|
+
|
|
57
|
+
// The OTEL env contract parses booleans and enum lists case-insensitively, so
|
|
58
|
+
// OTEL_SDK_DISABLED=TRUE and OTEL_TRACES_EXPORTER=None must also disable export.
|
|
59
|
+
if (process.env.OTEL_SDK_DISABLED?.trim().toLowerCase() === "true") return;
|
|
60
|
+
if (tracesExporterDisabled(process.env.OTEL_TRACES_EXPORTER)) return;
|
|
61
|
+
|
|
62
|
+
const endpoint = process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ?? process.env.OTEL_EXPORTER_OTLP_ENDPOINT;
|
|
63
|
+
if (!endpoint) return;
|
|
64
|
+
|
|
65
|
+
// We only ship the http/protobuf transport (the line validated on Bun). The
|
|
66
|
+
// OTEL contract lets OTEL_EXPORTER_OTLP*_PROTOCOL select grpc / http/json;
|
|
67
|
+
// rather than silently send protobuf-over-HTTP to a grpc :4317 port and lose
|
|
68
|
+
// every span, decline when an unsupported protocol is requested.
|
|
69
|
+
const protocol = (process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL ?? process.env.OTEL_EXPORTER_OTLP_PROTOCOL)
|
|
70
|
+
?.trim()
|
|
71
|
+
.toLowerCase();
|
|
72
|
+
if (protocol && protocol !== "http/protobuf") {
|
|
73
|
+
logger.warn(
|
|
74
|
+
`OTEL trace export disabled: OTEL_EXPORTER_OTLP_PROTOCOL=${protocol} is unsupported (only http/protobuf)`,
|
|
75
|
+
);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
initPromise = registerProvider();
|
|
80
|
+
return initPromise;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function registerProvider(): Promise<void> {
|
|
84
|
+
const [
|
|
85
|
+
{ AsyncLocalStorageContextManager },
|
|
86
|
+
{ OTLPTraceExporter },
|
|
87
|
+
{ resourceFromAttributes },
|
|
88
|
+
{ BatchSpanProcessor },
|
|
89
|
+
{ NodeTracerProvider },
|
|
90
|
+
] = await Promise.all([
|
|
91
|
+
import("@opentelemetry/context-async-hooks"),
|
|
92
|
+
import("@opentelemetry/exporter-trace-otlp-proto"),
|
|
93
|
+
import("@opentelemetry/resources"),
|
|
94
|
+
import("@opentelemetry/sdk-trace-base"),
|
|
95
|
+
import("@opentelemetry/sdk-trace-node"),
|
|
96
|
+
]);
|
|
97
|
+
|
|
98
|
+
// The exporter reads endpoint/headers/timeout from OTEL_EXPORTER_OTLP_* itself,
|
|
99
|
+
// so there is nothing to thread through here.
|
|
100
|
+
const exporter = new OTLPTraceExporter();
|
|
101
|
+
const tracerProvider = new NodeTracerProvider({
|
|
102
|
+
resource: resourceFromAttributes({
|
|
103
|
+
"service.name": process.env.OTEL_SERVICE_NAME ?? "oh-my-pi",
|
|
104
|
+
}),
|
|
105
|
+
spanProcessors: [new BatchSpanProcessor(exporter)],
|
|
106
|
+
});
|
|
107
|
+
// register() installs the global tracer provider and the W3C trace-context +
|
|
108
|
+
// baggage propagators; the explicit AsyncLocalStorage context manager keeps
|
|
109
|
+
// parent/child span linkage working under Bun.
|
|
110
|
+
tracerProvider.register({ contextManager: new AsyncLocalStorageContextManager().enable() });
|
|
111
|
+
provider = tracerProvider;
|
|
112
|
+
|
|
113
|
+
const flushTimer = setInterval(() => {
|
|
114
|
+
provider?.forceFlush().catch(() => {});
|
|
115
|
+
}, FLUSH_INTERVAL_MS);
|
|
116
|
+
flushTimer.unref();
|
|
117
|
+
|
|
118
|
+
// Shut down through postmortem rather than a bare signal listener. postmortem
|
|
119
|
+
// owns SIGINT/SIGTERM/SIGHUP/exit and quit(), and awaits registered cleanups
|
|
120
|
+
// before calling process.exit — so the batch processor's final OTLP export
|
|
121
|
+
// completes instead of being cut off mid-flight on the shutdown path.
|
|
122
|
+
postmortem.register("otel-trace-export", async () => {
|
|
123
|
+
clearInterval(flushTimer);
|
|
124
|
+
await provider?.shutdown();
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Parse the `OTEL_TRACES_EXPORTER` selection. The value is a case-insensitive,
|
|
130
|
+
* comma-separated list; the literal `none` disables span export entirely.
|
|
131
|
+
*/
|
|
132
|
+
function tracesExporterDisabled(raw: string | undefined): boolean {
|
|
133
|
+
if (!raw) return false;
|
|
134
|
+
return raw.split(",").some(entry => entry.trim().toLowerCase() === "none");
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Flush any buffered spans to the exporter. No-op when export is disabled.
|
|
139
|
+
* Hosts embedding the agent can call this at natural boundaries (e.g. the end
|
|
140
|
+
* of a turn) so traces surface promptly rather than on the batch interval.
|
|
141
|
+
*/
|
|
142
|
+
export async function flushTelemetryExport(): Promise<void> {
|
|
143
|
+
await provider?.forceFlush();
|
|
144
|
+
}
|