@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,611 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `omp auth-gateway` command handlers.
|
|
3
|
+
*
|
|
4
|
+
* Boots a forward-proxy server that lets less-trusted clients (the macOS
|
|
5
|
+
* usage widget, robomp containers, …) make provider API calls without ever
|
|
6
|
+
* seeing the access token. The gateway is itself a broker client and
|
|
7
|
+
* resolves credentials through the configured broker (via the same
|
|
8
|
+
* `OMP_AUTH_BROKER_URL` / `auth.broker.url` precedence used elsewhere).
|
|
9
|
+
*
|
|
10
|
+
* Sub-verbs:
|
|
11
|
+
* - `serve [--bind=…]` — boots the gateway against the configured broker.
|
|
12
|
+
* - `token` / `token --regenerate` — manages the gateway bearer token file.
|
|
13
|
+
* - `status` — prints the locally-stored gateway token and bind hint.
|
|
14
|
+
*/
|
|
15
|
+
import * as crypto from "node:crypto";
|
|
16
|
+
import * as fs from "node:fs/promises";
|
|
17
|
+
import * as path from "node:path";
|
|
18
|
+
import {
|
|
19
|
+
type Api,
|
|
20
|
+
AuthBrokerClient,
|
|
21
|
+
AuthStorage,
|
|
22
|
+
type CompletionProbe,
|
|
23
|
+
type CompletionProbeInput,
|
|
24
|
+
type CredentialCompletionResult,
|
|
25
|
+
completeSimple,
|
|
26
|
+
DEFAULT_AUTH_GATEWAY_BIND,
|
|
27
|
+
type Model,
|
|
28
|
+
RemoteAuthCredentialStore,
|
|
29
|
+
type SnapshotResponse,
|
|
30
|
+
startAuthGateway,
|
|
31
|
+
} from "@oh-my-pi/pi-ai";
|
|
32
|
+
import { type GeneratedProvider, getBundledModels, getBundledProviders } from "@oh-my-pi/pi-catalog/models";
|
|
33
|
+
import { getConfigRootDir, isEnoent, VERSION } from "@oh-my-pi/pi-utils";
|
|
34
|
+
import chalk from "chalk";
|
|
35
|
+
import { type AuthBrokerClientConfig, resolveAuthBrokerConfig } from "../session/auth-broker-config";
|
|
36
|
+
|
|
37
|
+
export type AuthGatewayAction = "serve" | "token" | "status" | "check";
|
|
38
|
+
|
|
39
|
+
export interface AuthGatewayCommandArgs {
|
|
40
|
+
action: AuthGatewayAction;
|
|
41
|
+
flags: {
|
|
42
|
+
json?: boolean;
|
|
43
|
+
bind?: string;
|
|
44
|
+
regenerate?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Disable bearer-token auth on inbound requests. Useful when the gateway
|
|
47
|
+
* is bound to loopback (the default `127.0.0.1:4000`) and you don't want
|
|
48
|
+
* to wire token-paste plumbing into every local client.
|
|
49
|
+
*/
|
|
50
|
+
noAuth?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Strict mode for `check` — additionally exercise every credential
|
|
53
|
+
* against its provider's chat-completion endpoint. The usage probe (run
|
|
54
|
+
* unconditionally) can pass while the chat endpoint still 401s the same
|
|
55
|
+
* bearer, so strict mode is the definitive "is this credential
|
|
56
|
+
* actually usable" signal. Slower and consumes a tiny amount of quota.
|
|
57
|
+
*/
|
|
58
|
+
strict?: boolean;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const ACTIONS: readonly AuthGatewayAction[] = ["serve", "token", "status", "check"];
|
|
63
|
+
|
|
64
|
+
function getTokenFilePath(): string {
|
|
65
|
+
return path.join(getConfigRootDir(), "auth-gateway.token");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function readToken(): Promise<string | null> {
|
|
69
|
+
try {
|
|
70
|
+
const raw = await Bun.file(getTokenFilePath()).text();
|
|
71
|
+
const trimmed = raw.trim();
|
|
72
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
73
|
+
} catch (err) {
|
|
74
|
+
if (isEnoent(err)) return null;
|
|
75
|
+
throw err;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async function writeToken(token: string): Promise<void> {
|
|
80
|
+
const file = getTokenFilePath();
|
|
81
|
+
await fs.mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
82
|
+
await fs.writeFile(file, token, { mode: 0o600 });
|
|
83
|
+
try {
|
|
84
|
+
await fs.chmod(file, 0o600);
|
|
85
|
+
} catch {
|
|
86
|
+
// Best-effort (e.g. Windows).
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Atomically create the token file, refusing to clobber an existing one.
|
|
92
|
+
* Returns `true` on success, `false` when the file already existed (so the
|
|
93
|
+
* caller re-reads it instead of racing another concurrent `ensureToken`).
|
|
94
|
+
*/
|
|
95
|
+
async function createTokenExclusive(token: string): Promise<boolean> {
|
|
96
|
+
const file = getTokenFilePath();
|
|
97
|
+
await fs.mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
98
|
+
try {
|
|
99
|
+
// `wx` = O_CREAT | O_EXCL — fails with EEXIST if the file is already there.
|
|
100
|
+
await fs.writeFile(file, token, { flag: "wx", mode: 0o600 });
|
|
101
|
+
} catch (err) {
|
|
102
|
+
if ((err as NodeJS.ErrnoException).code === "EEXIST") return false;
|
|
103
|
+
throw err;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
await fs.chmod(file, 0o600);
|
|
107
|
+
} catch {
|
|
108
|
+
// Best-effort (e.g. Windows).
|
|
109
|
+
}
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function generateToken(): string {
|
|
114
|
+
return crypto.randomBytes(32).toString("base64url");
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async function ensureToken(): Promise<string> {
|
|
118
|
+
const existing = await readToken();
|
|
119
|
+
if (existing) return existing;
|
|
120
|
+
const token = generateToken();
|
|
121
|
+
if (await createTokenExclusive(token)) return token;
|
|
122
|
+
// Another concurrent invocation won the create race; read what they wrote.
|
|
123
|
+
const fromRace = await readToken();
|
|
124
|
+
if (fromRace) return fromRace;
|
|
125
|
+
// File existed-then-disappeared between EEXIST and read; last resort, write
|
|
126
|
+
// our generated token unconditionally so callers don't see an empty string.
|
|
127
|
+
await writeToken(token);
|
|
128
|
+
return token;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function createBrokerClient(brokerConfig: AuthBrokerClientConfig): AuthBrokerClient {
|
|
132
|
+
return new AuthBrokerClient({ url: brokerConfig.url, token: brokerConfig.token });
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function fetchBrokerSnapshot(client: AuthBrokerClient): Promise<SnapshotResponse> {
|
|
136
|
+
const result = await client.fetchSnapshot();
|
|
137
|
+
if (result.status !== 200) throw new Error("Auth broker returned no initial snapshot");
|
|
138
|
+
return result.snapshot;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async function runServe(flags: AuthGatewayCommandArgs["flags"]): Promise<void> {
|
|
142
|
+
const brokerConfig = await resolveAuthBrokerConfig();
|
|
143
|
+
if (!brokerConfig) {
|
|
144
|
+
throw new Error(
|
|
145
|
+
"`omp auth-gateway serve` requires OMP_AUTH_BROKER_URL (or `auth.broker.url`/`auth.broker.token` in config.yml). The gateway is itself a broker client.",
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
const bind = flags.bind ?? DEFAULT_AUTH_GATEWAY_BIND;
|
|
149
|
+
const gatewayToken = flags.noAuth ? null : await ensureToken();
|
|
150
|
+
|
|
151
|
+
// Build a broker-backed AuthStorage — same pattern as discoverAuthStorage()
|
|
152
|
+
// in sdk.ts. The gateway never touches local SQLite.
|
|
153
|
+
const client = createBrokerClient(brokerConfig);
|
|
154
|
+
const initialSnapshot = await fetchBrokerSnapshot(client);
|
|
155
|
+
const store = new RemoteAuthCredentialStore({ client, initialSnapshot });
|
|
156
|
+
// Refresh + usage both flow through the store's broker hooks automatically —
|
|
157
|
+
// `RemoteAuthCredentialStore.refreshOAuthCredential` and `.fetchUsageReports`.
|
|
158
|
+
// AuthStorage discovers them when no explicit option overrides them, so the
|
|
159
|
+
// gateway only needs to construct the store and pass it in.
|
|
160
|
+
const storage = new AuthStorage(store, {
|
|
161
|
+
sourceLabel: `broker ${brokerConfig.url}`,
|
|
162
|
+
});
|
|
163
|
+
await storage.reload();
|
|
164
|
+
|
|
165
|
+
// Build the model resolver + catalog from pi-ai's bundled metadata, scoped
|
|
166
|
+
// to providers we hold credentials for. Format handlers ask `resolveModel`
|
|
167
|
+
// to translate a client-requested `model` field into a pi-ai `Model<Api>`
|
|
168
|
+
// before dispatch; `listModels` powers `/v1/models`.
|
|
169
|
+
const snapshot = storage.exportSnapshot();
|
|
170
|
+
const providersWithCreds = new Set<string>();
|
|
171
|
+
for (const entry of snapshot.credentials) providersWithCreds.add(entry.provider);
|
|
172
|
+
const modelById = new Map<string, Model<Api>>();
|
|
173
|
+
for (const provider of getBundledProviders()) {
|
|
174
|
+
if (!providersWithCreds.has(provider)) continue;
|
|
175
|
+
for (const model of getBundledModels(provider as GeneratedProvider)) {
|
|
176
|
+
// Always set the qualified key (no collision possible)
|
|
177
|
+
modelById.set(`${model.provider}/${model.id}`, model);
|
|
178
|
+
// Bare id as fallback for legacy clients (first-write-wins)
|
|
179
|
+
if (!modelById.has(model.id)) modelById.set(model.id, model);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const handle = startAuthGateway({
|
|
184
|
+
storage,
|
|
185
|
+
bind,
|
|
186
|
+
bearerTokens: gatewayToken ? [gatewayToken] : [],
|
|
187
|
+
version: VERSION,
|
|
188
|
+
resolveModel: (id: string) => modelById.get(id),
|
|
189
|
+
listModels: () => modelById.values(),
|
|
190
|
+
});
|
|
191
|
+
process.stdout.write(`auth-gateway listening on ${handle.url}\n`);
|
|
192
|
+
if (gatewayToken) {
|
|
193
|
+
process.stdout.write(`bearer token: ${getTokenFilePath()} (chmod 0600)\n`);
|
|
194
|
+
} else {
|
|
195
|
+
process.stdout.write(`auth: disabled (--no-auth) — any client can call this gateway\n`);
|
|
196
|
+
}
|
|
197
|
+
process.stdout.write(`upstream broker: ${brokerConfig.url}\n`);
|
|
198
|
+
|
|
199
|
+
const stopped = Promise.withResolvers<void>();
|
|
200
|
+
let shutdownStarted = false;
|
|
201
|
+
const stop = async (signal: NodeJS.Signals): Promise<void> => {
|
|
202
|
+
if (shutdownStarted) return;
|
|
203
|
+
shutdownStarted = true;
|
|
204
|
+
process.stdout.write(`\nReceived ${signal}, shutting down...\n`);
|
|
205
|
+
let closeError: unknown;
|
|
206
|
+
try {
|
|
207
|
+
await handle.close();
|
|
208
|
+
} catch (error) {
|
|
209
|
+
closeError = error;
|
|
210
|
+
} finally {
|
|
211
|
+
storage.close();
|
|
212
|
+
}
|
|
213
|
+
if (closeError) {
|
|
214
|
+
stopped.reject(closeError);
|
|
215
|
+
} else {
|
|
216
|
+
stopped.resolve();
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
const onSigint = (): void => {
|
|
220
|
+
void stop("SIGINT");
|
|
221
|
+
};
|
|
222
|
+
const onSigterm = (): void => {
|
|
223
|
+
void stop("SIGTERM");
|
|
224
|
+
};
|
|
225
|
+
process.once("SIGINT", onSigint);
|
|
226
|
+
process.once("SIGTERM", onSigterm);
|
|
227
|
+
|
|
228
|
+
try {
|
|
229
|
+
await stopped.promise;
|
|
230
|
+
} finally {
|
|
231
|
+
process.off("SIGINT", onSigint);
|
|
232
|
+
process.off("SIGTERM", onSigterm);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
async function runToken(flags: AuthGatewayCommandArgs["flags"]): Promise<void> {
|
|
237
|
+
if (flags.regenerate) {
|
|
238
|
+
const next = generateToken();
|
|
239
|
+
await writeToken(next);
|
|
240
|
+
if (flags.json) {
|
|
241
|
+
process.stdout.write(`${JSON.stringify({ token: next, path: getTokenFilePath() })}\n`);
|
|
242
|
+
} else {
|
|
243
|
+
process.stdout.write(`${next}\n`);
|
|
244
|
+
}
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
const token = await ensureToken();
|
|
248
|
+
if (flags.json) {
|
|
249
|
+
process.stdout.write(`${JSON.stringify({ token, path: getTokenFilePath() })}\n`);
|
|
250
|
+
} else {
|
|
251
|
+
process.stdout.write(`${token}\n`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
async function runStatus(flags: AuthGatewayCommandArgs["flags"]): Promise<void> {
|
|
256
|
+
const token = await readToken();
|
|
257
|
+
const brokerConfig = await resolveAuthBrokerConfig();
|
|
258
|
+
const tokenFile = getTokenFilePath();
|
|
259
|
+
if (!brokerConfig) {
|
|
260
|
+
const status = {
|
|
261
|
+
ready: false,
|
|
262
|
+
reason: "not_configured",
|
|
263
|
+
tokenFile,
|
|
264
|
+
tokenPresent: token !== null,
|
|
265
|
+
broker: null,
|
|
266
|
+
brokerConfigured: false,
|
|
267
|
+
brokerAuthenticated: false,
|
|
268
|
+
};
|
|
269
|
+
if (flags.json) {
|
|
270
|
+
process.stdout.write(`${JSON.stringify(status)}\n`);
|
|
271
|
+
} else {
|
|
272
|
+
process.stdout.write(`${chalk.yellow("No broker configured.")} Set OMP_AUTH_BROKER_URL.\n`);
|
|
273
|
+
process.stdout.write(
|
|
274
|
+
`token: ${status.tokenPresent ? chalk.green("present") : chalk.red("missing")} at ${status.tokenFile}\n`,
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
process.exitCode = 1;
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
try {
|
|
282
|
+
const snapshot = await fetchBrokerSnapshot(createBrokerClient(brokerConfig));
|
|
283
|
+
const tokenPresent = token !== null;
|
|
284
|
+
const status = {
|
|
285
|
+
ready: tokenPresent,
|
|
286
|
+
reason: tokenPresent ? null : "token_missing",
|
|
287
|
+
tokenFile,
|
|
288
|
+
tokenPresent,
|
|
289
|
+
broker: brokerConfig.url,
|
|
290
|
+
brokerConfigured: true,
|
|
291
|
+
brokerAuthenticated: true,
|
|
292
|
+
credentialCount: snapshot.credentials.length,
|
|
293
|
+
};
|
|
294
|
+
if (flags.json) {
|
|
295
|
+
process.stdout.write(`${JSON.stringify(status)}\n`);
|
|
296
|
+
} else {
|
|
297
|
+
const brokerLine = `upstream broker: ${brokerConfig.url} (${snapshot.credentials.length} credential${
|
|
298
|
+
snapshot.credentials.length === 1 ? "" : "s"
|
|
299
|
+
})`;
|
|
300
|
+
process.stdout.write(`${tokenPresent ? chalk.green("ready") : chalk.yellow("not ready")} ${brokerLine}\n`);
|
|
301
|
+
process.stdout.write(
|
|
302
|
+
`token: ${tokenPresent ? chalk.green("present") : chalk.red("missing")} at ${status.tokenFile}\n`,
|
|
303
|
+
);
|
|
304
|
+
if (!tokenPresent) {
|
|
305
|
+
process.stdout.write(
|
|
306
|
+
"Run `omp auth-gateway token` or `omp auth-gateway serve` to create a bearer token.\n",
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (!tokenPresent) process.exitCode = 1;
|
|
311
|
+
} catch (error) {
|
|
312
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
313
|
+
const status = {
|
|
314
|
+
ready: false,
|
|
315
|
+
reason: "broker_unavailable",
|
|
316
|
+
tokenFile,
|
|
317
|
+
tokenPresent: token !== null,
|
|
318
|
+
broker: brokerConfig.url,
|
|
319
|
+
brokerConfigured: true,
|
|
320
|
+
brokerAuthenticated: false,
|
|
321
|
+
error: message,
|
|
322
|
+
};
|
|
323
|
+
if (flags.json) {
|
|
324
|
+
process.stdout.write(`${JSON.stringify(status)}\n`);
|
|
325
|
+
} else {
|
|
326
|
+
process.stdout.write(`${chalk.red("FAILED")} upstream broker: ${brokerConfig.url}: ${message}\n`);
|
|
327
|
+
process.stdout.write(
|
|
328
|
+
`token: ${status.tokenPresent ? chalk.green("present") : chalk.red("missing")} at ${status.tokenFile}\n`,
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
process.exitCode = 1;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
export async function runAuthGatewayCommand(cmd: AuthGatewayCommandArgs): Promise<void> {
|
|
336
|
+
switch (cmd.action) {
|
|
337
|
+
case "serve":
|
|
338
|
+
await runServe(cmd.flags);
|
|
339
|
+
return;
|
|
340
|
+
case "token":
|
|
341
|
+
await runToken(cmd.flags);
|
|
342
|
+
return;
|
|
343
|
+
case "status":
|
|
344
|
+
await runStatus(cmd.flags);
|
|
345
|
+
return;
|
|
346
|
+
case "check":
|
|
347
|
+
await runCheck(cmd.flags);
|
|
348
|
+
return;
|
|
349
|
+
default: {
|
|
350
|
+
const _exhaustive: never = cmd.action;
|
|
351
|
+
throw new Error(`Unknown auth-gateway action: ${String(_exhaustive)}`);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Providers whose chat endpoint expects a JSON-serialized credential blob
|
|
358
|
+
* (`{ token, projectId, refreshToken, expiresAt, … }`) rather than the raw
|
|
359
|
+
* access token. Mirrors `getOAuthApiKey` in `packages/ai/src/registry/oauth`.
|
|
360
|
+
*/
|
|
361
|
+
const STRUCTURED_API_KEY_PROVIDERS: ReadonlySet<string> = new Set([
|
|
362
|
+
"github-copilot",
|
|
363
|
+
"google-gemini-cli",
|
|
364
|
+
"google-antigravity",
|
|
365
|
+
]);
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Provider API types that strict-mode chat probes intentionally skip:
|
|
369
|
+
* - `bedrock-converse-stream` resolves credentials from the AWS env/profile, not the broker bearer.
|
|
370
|
+
* - `google-vertex` uses Application Default Credentials; the broker bearer is not the right key.
|
|
371
|
+
* - `cursor-agent` and `pi-native` (gateway forwarding) have transport quirks
|
|
372
|
+
* that make a bearer-only "ping" a poor signal.
|
|
373
|
+
*/
|
|
374
|
+
const STRICT_PROBE_SKIPPED_APIS: ReadonlySet<Api> = new Set<Api>([
|
|
375
|
+
"bedrock-converse-stream",
|
|
376
|
+
"google-vertex",
|
|
377
|
+
"cursor-agent",
|
|
378
|
+
]);
|
|
379
|
+
|
|
380
|
+
/** Max chat models to try per credential before reporting failure. */
|
|
381
|
+
const STRICT_PROBE_MAX_CANDIDATES = 4;
|
|
382
|
+
|
|
383
|
+
/** Per-attempt deadline. Each candidate gets its own slice instead of sharing one budget. */
|
|
384
|
+
const STRICT_PROBE_PER_ATTEMPT_TIMEOUT_MS = 15_000;
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Overall per-credential budget passed to {@link AuthStorage.checkCredentials}.
|
|
388
|
+
* Big enough to walk every candidate at the per-attempt cap with a small
|
|
389
|
+
* margin for refresh/network overhead.
|
|
390
|
+
*/
|
|
391
|
+
const STRICT_PROBE_OVERALL_TIMEOUT_MS = STRICT_PROBE_PER_ATTEMPT_TIMEOUT_MS * (STRICT_PROBE_MAX_CANDIDATES + 1);
|
|
392
|
+
|
|
393
|
+
/** Match upstream errors that mean "this model is gone, try a different one" so we walk the catalog instead of declaring the credential bad. */
|
|
394
|
+
const RETRYABLE_MODEL_ERROR_RE =
|
|
395
|
+
/not[_ -]found|invalid[_ -]model|model[_ -]is[_ -]not[_ -]valid|no longer supported|deprecated|404|decommissioned/i;
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Rank bundled models for a provider in probe order: cheapest first, then by
|
|
399
|
+
* id for determinism. Filters out non-bearer-auth APIs (Vertex/Bedrock),
|
|
400
|
+
* pi-native transport (would loop through the gateway), and placeholder /
|
|
401
|
+
* router entries with negative/missing cost.
|
|
402
|
+
*/
|
|
403
|
+
function pickProbeCandidates(provider: string): Model<Api>[] {
|
|
404
|
+
const bundled = getBundledModels(provider as GeneratedProvider);
|
|
405
|
+
if (bundled.length === 0) return [];
|
|
406
|
+
const candidates = bundled.filter(model => {
|
|
407
|
+
if (model.transport === "pi-native") return false;
|
|
408
|
+
if (STRICT_PROBE_SKIPPED_APIS.has(model.api)) return false;
|
|
409
|
+
if (!model.input.includes("text")) return false;
|
|
410
|
+
const totalCost = (model.cost?.input ?? 0) + (model.cost?.output ?? 0);
|
|
411
|
+
if (!Number.isFinite(totalCost) || totalCost < 0) return false;
|
|
412
|
+
if (model.maxTokens <= 0) return false;
|
|
413
|
+
return true;
|
|
414
|
+
});
|
|
415
|
+
candidates.sort((a, b) => a.cost.input + a.cost.output - (b.cost.input + b.cost.output) || a.id.localeCompare(b.id));
|
|
416
|
+
return candidates;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Compose the apiKey bytes a provider's chat endpoint expects, given a
|
|
421
|
+
* post-refresh probe credential. Mirrors `getOAuthApiKey` for the providers
|
|
422
|
+
* that require a structured blob; otherwise returns the raw access token /
|
|
423
|
+
* API key.
|
|
424
|
+
*/
|
|
425
|
+
function composeProbeApiKey(provider: string, credential: CompletionProbeInput["credential"]): string {
|
|
426
|
+
if (credential.type === "api_key") return credential.apiKey;
|
|
427
|
+
if (!STRUCTURED_API_KEY_PROVIDERS.has(provider)) return credential.accessToken;
|
|
428
|
+
return JSON.stringify({
|
|
429
|
+
token: credential.accessToken,
|
|
430
|
+
enterpriseUrl: credential.enterpriseUrl,
|
|
431
|
+
projectId: credential.projectId,
|
|
432
|
+
refreshToken: credential.refreshToken,
|
|
433
|
+
expiresAt: credential.expiresAt,
|
|
434
|
+
email: credential.email,
|
|
435
|
+
accountId: credential.accountId,
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
async function probeOneModel(
|
|
440
|
+
model: Model<Api>,
|
|
441
|
+
apiKey: string,
|
|
442
|
+
outerSignal: AbortSignal,
|
|
443
|
+
): Promise<CredentialCompletionResult> {
|
|
444
|
+
const start = Date.now();
|
|
445
|
+
const attemptTimeoutSignal = AbortSignal.timeout(STRICT_PROBE_PER_ATTEMPT_TIMEOUT_MS);
|
|
446
|
+
const attemptSignal = AbortSignal.any([outerSignal, attemptTimeoutSignal]);
|
|
447
|
+
// `systemPrompt` is mandatory for some providers (Codex 400s "Instructions
|
|
448
|
+
// are required" without it). `disableReasoning` is intentionally NOT set:
|
|
449
|
+
// providers like Fireworks reject the "none" effort it maps to, and we'd
|
|
450
|
+
// rather burn 16 reasoning tokens than misdiagnose a healthy credential.
|
|
451
|
+
const response = await completeSimple(
|
|
452
|
+
model,
|
|
453
|
+
{
|
|
454
|
+
systemPrompt: ["Connectivity check. Reply with the single word 'pong'."],
|
|
455
|
+
messages: [{ role: "user", content: "ping", timestamp: start }],
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
apiKey,
|
|
459
|
+
maxTokens: 32,
|
|
460
|
+
signal: attemptSignal,
|
|
461
|
+
},
|
|
462
|
+
);
|
|
463
|
+
const latencyMs = Date.now() - start;
|
|
464
|
+
if (response.stopReason === "error" || response.stopReason === "aborted") {
|
|
465
|
+
return {
|
|
466
|
+
ok: false,
|
|
467
|
+
reason: response.errorMessage ?? `chat probe ended with stopReason=${response.stopReason}`,
|
|
468
|
+
modelId: model.id,
|
|
469
|
+
latencyMs,
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
return { ok: true, modelId: model.id, latencyMs };
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* Build the {@link CompletionProbe} consumed by
|
|
477
|
+
* {@link AuthStorage.checkCredentials} in `--strict` mode. Walks the cheapest
|
|
478
|
+
* candidates per provider, retrying on "model not found / invalid model"
|
|
479
|
+
* errors so a stale catalog entry doesn't masquerade as a bad credential.
|
|
480
|
+
* Stops as soon as one model returns a successful response (the credential
|
|
481
|
+
* authenticated against at least one model in the catalog).
|
|
482
|
+
*/
|
|
483
|
+
function createStrictCompletionProbe(): CompletionProbe {
|
|
484
|
+
return async (input: CompletionProbeInput): Promise<CredentialCompletionResult> => {
|
|
485
|
+
const candidates = pickProbeCandidates(input.provider).slice(0, STRICT_PROBE_MAX_CANDIDATES);
|
|
486
|
+
if (candidates.length === 0) {
|
|
487
|
+
return { ok: null, reason: `no bearer-compatible probe model bundled for provider ${input.provider}` };
|
|
488
|
+
}
|
|
489
|
+
const apiKey = composeProbeApiKey(input.provider, input.credential);
|
|
490
|
+
let lastFailure: CredentialCompletionResult | undefined;
|
|
491
|
+
for (const model of candidates) {
|
|
492
|
+
if (input.signal.aborted) {
|
|
493
|
+
return {
|
|
494
|
+
ok: false,
|
|
495
|
+
reason: "aborted",
|
|
496
|
+
modelId: model.id,
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
const result = await probeOneModel(model, apiKey, input.signal);
|
|
500
|
+
if (result.ok === true) return result;
|
|
501
|
+
lastFailure = result;
|
|
502
|
+
if (!RETRYABLE_MODEL_ERROR_RE.test(result.reason ?? "")) {
|
|
503
|
+
// Non-model error (401, 403, 5xx, network) — the credential is the
|
|
504
|
+
// issue, not the catalog. Stop walking.
|
|
505
|
+
return result;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return (
|
|
509
|
+
lastFailure ?? {
|
|
510
|
+
ok: false,
|
|
511
|
+
reason: `all ${candidates.length} probe models failed for provider ${input.provider}`,
|
|
512
|
+
}
|
|
513
|
+
);
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
function formatCompletionStatus(completion: CredentialCompletionResult | undefined): string {
|
|
518
|
+
if (!completion) return "";
|
|
519
|
+
if (completion.ok === true) return chalk.green(" [chat: ok]");
|
|
520
|
+
if (completion.ok === false) return chalk.red(" [chat: FAIL]");
|
|
521
|
+
return chalk.yellow(" [chat: skip]");
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
/**
|
|
525
|
+
* `omp auth-gateway check` — probe each broker-supplied credential and print
|
|
526
|
+
* per-credential auth health. Use this when the gateway is returning 401s and
|
|
527
|
+
* you need to find which row in a multi-account pool is the bad one. The
|
|
528
|
+
* aggregate `/v1/usage` endpoint silently drops failed credentials, so a
|
|
529
|
+
* dedicated diagnostic is the only way to see which credentials failed.
|
|
530
|
+
*
|
|
531
|
+
* Strict mode (`--strict`) additionally exercises each credential against a
|
|
532
|
+
* cheap chat model from its provider's bundled catalog. This catches the case
|
|
533
|
+
* where the usage endpoint reports 200 but the chat endpoint 401s the same
|
|
534
|
+
* bearer (revoked OAuth scope, mislabeled provider row, etc).
|
|
535
|
+
*/
|
|
536
|
+
async function runCheck(flags: AuthGatewayCommandArgs["flags"]): Promise<void> {
|
|
537
|
+
const brokerConfig = await resolveAuthBrokerConfig();
|
|
538
|
+
if (!brokerConfig) {
|
|
539
|
+
throw new Error(
|
|
540
|
+
"`omp auth-gateway check` requires OMP_AUTH_BROKER_URL (or `auth.broker.url`/`auth.broker.token` in config.yml). It probes the same credentials the gateway would serve.",
|
|
541
|
+
);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
const client = createBrokerClient(brokerConfig);
|
|
545
|
+
const initialSnapshot = await fetchBrokerSnapshot(client);
|
|
546
|
+
const store = new RemoteAuthCredentialStore({ client, initialSnapshot });
|
|
547
|
+
const storage = new AuthStorage(store, { sourceLabel: `broker ${brokerConfig.url}` });
|
|
548
|
+
try {
|
|
549
|
+
await storage.reload();
|
|
550
|
+
const results = await storage.checkCredentials(
|
|
551
|
+
flags.strict
|
|
552
|
+
? { completionProbe: createStrictCompletionProbe(), completionTimeoutMs: STRICT_PROBE_OVERALL_TIMEOUT_MS }
|
|
553
|
+
: undefined,
|
|
554
|
+
);
|
|
555
|
+
|
|
556
|
+
if (flags.json) {
|
|
557
|
+
process.stdout.write(
|
|
558
|
+
`${JSON.stringify({ broker: brokerConfig.url, strict: flags.strict === true, credentials: results }, null, 2)}\n`,
|
|
559
|
+
);
|
|
560
|
+
} else {
|
|
561
|
+
const grouped = new Map<string, typeof results>();
|
|
562
|
+
for (const row of results) {
|
|
563
|
+
const list = grouped.get(row.provider) ?? [];
|
|
564
|
+
list.push(row);
|
|
565
|
+
grouped.set(row.provider, list);
|
|
566
|
+
}
|
|
567
|
+
const providers = [...grouped.keys()].sort();
|
|
568
|
+
process.stdout.write(`broker: ${brokerConfig.url}${flags.strict ? chalk.dim(" [strict]") : ""}\n`);
|
|
569
|
+
for (const provider of providers) {
|
|
570
|
+
const rows = grouped.get(provider) ?? [];
|
|
571
|
+
process.stdout.write(`\n${chalk.bold(provider)} (${rows.length})\n`);
|
|
572
|
+
for (const row of rows) {
|
|
573
|
+
const status =
|
|
574
|
+
row.ok === true
|
|
575
|
+
? chalk.green("ok ")
|
|
576
|
+
: row.ok === false
|
|
577
|
+
? chalk.red("FAIL ")
|
|
578
|
+
: chalk.yellow("unknown ");
|
|
579
|
+
const identity =
|
|
580
|
+
row.email ?? row.accountId ?? (row.type === "api_key" ? "(api key)" : "(no identity on credential)");
|
|
581
|
+
const remote = row.remoteRefresh ? chalk.dim(" [remote-refresh]") : "";
|
|
582
|
+
const reasonParts: string[] = [];
|
|
583
|
+
if (row.reason) reasonParts.push(row.reason);
|
|
584
|
+
if (row.completion?.reason) reasonParts.push(`chat: ${row.completion.reason}`);
|
|
585
|
+
const reason = reasonParts.length > 0 ? chalk.dim(` — ${reasonParts.join("; ")}`) : "";
|
|
586
|
+
const chat = formatCompletionStatus(row.completion);
|
|
587
|
+
process.stdout.write(
|
|
588
|
+
` ${status}${chat} id=${row.id.toString().padStart(3)} ${row.type.padEnd(7)} ${identity}${remote}${reason}\n`,
|
|
589
|
+
);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
const failed = results.filter(row => row.ok === false).length;
|
|
593
|
+
const unverifiable = results.filter(row => row.ok === null).length;
|
|
594
|
+
const passing = results.filter(row => row.ok === true).length;
|
|
595
|
+
const chatFailed = flags.strict ? results.filter(row => row.completion?.ok === false).length : 0;
|
|
596
|
+
const summaryParts = [
|
|
597
|
+
chalk.green(`${passing} ok`),
|
|
598
|
+
chalk.red(`${failed} failed`),
|
|
599
|
+
chalk.yellow(`${unverifiable} unverifiable`),
|
|
600
|
+
];
|
|
601
|
+
if (flags.strict) summaryParts.push(chalk.red(`${chatFailed} chat-failed`));
|
|
602
|
+
summaryParts.push(`${results.length} total`);
|
|
603
|
+
process.stdout.write(`\n${summaryParts.join(", ")}\n`);
|
|
604
|
+
if (failed > 0 || chatFailed > 0) process.exitCode = 1;
|
|
605
|
+
}
|
|
606
|
+
} finally {
|
|
607
|
+
storage.close();
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
export { ACTIONS as AUTH_GATEWAY_ACTIONS };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classify an install spec as a local path, marketplace plugin reference, or
|
|
3
|
+
* plain npm package.
|
|
4
|
+
*
|
|
5
|
+
* Rules (applied in order):
|
|
6
|
+
* 0. Looks like a filesystem path (`.`, `..`, `./…`, `..\…`, `/…`, `~/…`,
|
|
7
|
+
* `C:\…`, `\\unc`) -> local. Routed through `PluginManager.link()` so the
|
|
8
|
+
* `omp plugin install <path>` and `omp plugin link <path>` flows agree.
|
|
9
|
+
* 1. Starts with `@` (scoped npm) -> always npm.
|
|
10
|
+
* 2. Contains `@` after the first character -> split on the LAST `@`.
|
|
11
|
+
* If the right-hand side is a known marketplace name, it's a marketplace ref.
|
|
12
|
+
* Otherwise it's an npm spec (e.g. `pkg@1.2.3`).
|
|
13
|
+
* 3. No `@` -> npm.
|
|
14
|
+
*/
|
|
15
|
+
// Common npm dist-tags that should never be interpreted as marketplace names
|
|
16
|
+
const NPM_DIST_TAGS = new Set([
|
|
17
|
+
"latest",
|
|
18
|
+
"next",
|
|
19
|
+
"beta",
|
|
20
|
+
"alpha",
|
|
21
|
+
"canary",
|
|
22
|
+
"rc",
|
|
23
|
+
"dev",
|
|
24
|
+
"stable",
|
|
25
|
+
"nightly",
|
|
26
|
+
"experimental",
|
|
27
|
+
]);
|
|
28
|
+
|
|
29
|
+
// Semver-like: starts with digit, or contains version range prefixes
|
|
30
|
+
const LOOKS_LIKE_VERSION = /^[\d~^>=<]/;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Detect specs that name a filesystem path rather than a package: bare `.` /
|
|
34
|
+
* `..`, cwd-relative (`./`, `../`, `.\`, `..\`), absolute (`/`, `C:\`, `C:/`,
|
|
35
|
+
* UNC `\\`), and tilde-prefixed (`~`, `~/`, `~\`). Tilde paths still rely on
|
|
36
|
+
* the shell or the caller for expansion — we only classify them so they reach
|
|
37
|
+
* the link path instead of npm-name validation.
|
|
38
|
+
*/
|
|
39
|
+
function isLocalPathSpec(spec: string): boolean {
|
|
40
|
+
if (spec === "." || spec === ".." || spec === "~") return true;
|
|
41
|
+
if (spec.startsWith("./") || spec.startsWith("../")) return true;
|
|
42
|
+
if (spec.startsWith(".\\") || spec.startsWith("..\\")) return true;
|
|
43
|
+
if (spec.startsWith("~/") || spec.startsWith("~\\")) return true;
|
|
44
|
+
if (spec.startsWith("/")) return true;
|
|
45
|
+
if (spec.startsWith("\\\\")) return true;
|
|
46
|
+
if (/^[A-Za-z]:[\\/]/.test(spec)) return true;
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export type ClassifiedInstallTarget =
|
|
51
|
+
| { type: "local"; path: string }
|
|
52
|
+
| { type: "marketplace"; name: string; marketplace: string }
|
|
53
|
+
| { type: "npm"; spec: string };
|
|
54
|
+
|
|
55
|
+
export function classifyInstallTarget(spec: string, knownMarketplaces: Set<string>): ClassifiedInstallTarget {
|
|
56
|
+
// Rule 0: filesystem path — bypass npm/marketplace validation entirely.
|
|
57
|
+
if (isLocalPathSpec(spec)) return { type: "local", path: spec };
|
|
58
|
+
// Rule 1: scoped npm package — @ at position 0 is never a marketplace separator.
|
|
59
|
+
if (spec.startsWith("@")) return { type: "npm", spec };
|
|
60
|
+
// Rule 2: @ somewhere after the first character.
|
|
61
|
+
const atIdx = spec.lastIndexOf("@");
|
|
62
|
+
if (atIdx > 0) {
|
|
63
|
+
const rhs = spec.slice(atIdx + 1);
|
|
64
|
+
// Dist-tags and version specifiers are never marketplace names.
|
|
65
|
+
if (NPM_DIST_TAGS.has(rhs) || LOOKS_LIKE_VERSION.test(rhs)) {
|
|
66
|
+
return { type: "npm", spec };
|
|
67
|
+
}
|
|
68
|
+
if (knownMarketplaces.has(rhs)) {
|
|
69
|
+
return { type: "marketplace", name: spec.slice(0, atIdx), marketplace: rhs };
|
|
70
|
+
}
|
|
71
|
+
// Not a known marketplace — treat as npm version specifier.
|
|
72
|
+
return { type: "npm", spec };
|
|
73
|
+
}
|
|
74
|
+
// Rule 3: no @ at all.
|
|
75
|
+
return { type: "npm", spec };
|
|
76
|
+
}
|