@kr78/pi-coding-agent 17.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14861 -0
- package/README.md +35 -0
- package/dist/CHANGELOG-chtdxh1z.md +14861 -0
- package/dist/cli.js +20483 -0
- package/dist/template-c2hyaytt.js +1653 -0
- package/dist/template-f8wx9vfn.css +1355 -0
- package/dist/template-qat058wr.html +55 -0
- package/dist/tool-views.generated-jdfmzwmn.js +35 -0
- package/examples/README.md +21 -0
- package/examples/custom-tools/README.md +104 -0
- package/examples/custom-tools/hello/index.ts +20 -0
- package/examples/extensions/README.md +142 -0
- package/examples/extensions/api-demo.ts +78 -0
- package/examples/extensions/chalk-logger.ts +25 -0
- package/examples/extensions/hello.ts +31 -0
- package/examples/extensions/pirate.ts +43 -0
- package/examples/extensions/plan-mode.ts +549 -0
- package/examples/extensions/reload-runtime.ts +38 -0
- package/examples/extensions/thinking-note.ts +13 -0
- package/examples/extensions/tools.ts +145 -0
- package/examples/extensions/with-deps/index.ts +36 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +17 -0
- package/examples/hooks/README.md +56 -0
- package/examples/hooks/auto-commit-on-exit.ts +48 -0
- package/examples/hooks/confirm-destructive.ts +58 -0
- package/examples/hooks/custom-compaction.ts +115 -0
- package/examples/hooks/dirty-repo-guard.ts +51 -0
- package/examples/hooks/file-trigger.ts +40 -0
- package/examples/hooks/git-checkpoint.ts +52 -0
- package/examples/hooks/handoff.ts +149 -0
- package/examples/hooks/permission-gate.ts +33 -0
- package/examples/hooks/protected-paths.ts +29 -0
- package/examples/hooks/qna.ts +118 -0
- package/examples/hooks/status-line.ts +39 -0
- package/examples/sdk/01-minimal.ts +21 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +46 -0
- package/examples/sdk/04-skills.ts +43 -0
- package/examples/sdk/06-extensions.ts +82 -0
- package/examples/sdk/06-hooks.ts +61 -0
- package/examples/sdk/07-context-files.ts +35 -0
- package/examples/sdk/08-prompt-templates.ts +41 -0
- package/examples/sdk/08-slash-commands.ts +46 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
- package/examples/sdk/11-sessions.ts +47 -0
- package/examples/sdk/12-redis-sessions.ts +54 -0
- package/examples/sdk/13-sql-sessions.ts +61 -0
- package/examples/sdk/README.md +169 -0
- package/package.json +587 -0
- package/scripts/bench-guard.ts +71 -0
- package/scripts/bench-title-models.ts +332 -0
- package/scripts/build-binary.ts +117 -0
- package/scripts/bundle-dist.ts +123 -0
- package/scripts/compile-binary.ts +69 -0
- package/scripts/embed-mupdf-wasm.ts +67 -0
- package/scripts/format-prompts.ts +68 -0
- package/scripts/generate-aria-snapshot.ts +134 -0
- package/scripts/generate-docs-index.ts +58 -0
- package/scripts/generate-share-viewer.ts +34 -0
- package/scripts/legacy-pi-virtual-module.ts +205 -0
- package/scripts/measure-prompt-tokens.ts +63 -0
- package/scripts/omp +51 -0
- package/scripts/omp.ts +19 -0
- package/scripts/security-compare.ts +40 -0
- package/src/advisor/advise-tool.ts +234 -0
- package/src/advisor/config.ts +341 -0
- package/src/advisor/emission-guard.ts +172 -0
- package/src/advisor/index.ts +6 -0
- package/src/advisor/runtime.ts +1412 -0
- package/src/advisor/transcript-recorder.ts +215 -0
- package/src/advisor/watchdog.ts +135 -0
- package/src/async/index.ts +1 -0
- package/src/async/job-manager.ts +847 -0
- package/src/auto-thinking/classifier.ts +220 -0
- package/src/autolearn/controller.ts +152 -0
- package/src/autolearn/managed-skills.ts +255 -0
- package/src/autoresearch/command-resume.md +14 -0
- package/src/autoresearch/dashboard.ts +436 -0
- package/src/autoresearch/git.ts +331 -0
- package/src/autoresearch/helpers.ts +218 -0
- package/src/autoresearch/index.ts +541 -0
- package/src/autoresearch/prompt-setup.md +43 -0
- package/src/autoresearch/prompt.md +103 -0
- package/src/autoresearch/resume-message.md +10 -0
- package/src/autoresearch/state.ts +273 -0
- package/src/autoresearch/storage.ts +700 -0
- package/src/autoresearch/tools/init-experiment.ts +268 -0
- package/src/autoresearch/tools/log-experiment.ts +520 -0
- package/src/autoresearch/tools/run-experiment.ts +407 -0
- package/src/autoresearch/tools/update-notes.ts +109 -0
- package/src/autoresearch/types.ts +168 -0
- package/src/capability/context-file.ts +44 -0
- package/src/capability/extension-module.ts +34 -0
- package/src/capability/extension.ts +47 -0
- package/src/capability/fs.ts +117 -0
- package/src/capability/hook.ts +40 -0
- package/src/capability/index.ts +467 -0
- package/src/capability/instruction.ts +37 -0
- package/src/capability/mcp.ts +115 -0
- package/src/capability/prompt.ts +35 -0
- package/src/capability/rule-buckets.ts +66 -0
- package/src/capability/rule.ts +298 -0
- package/src/capability/settings.ts +34 -0
- package/src/capability/skill.ts +69 -0
- package/src/capability/slash-command.ts +40 -0
- package/src/capability/ssh.ts +41 -0
- package/src/capability/system-prompt.ts +34 -0
- package/src/capability/tool.ts +38 -0
- package/src/capability/types.ts +187 -0
- package/src/cleanse/agent.ts +226 -0
- package/src/cleanse/balance.ts +79 -0
- package/src/cleanse/checkers.ts +996 -0
- package/src/cleanse/index.ts +190 -0
- package/src/cleanse/loop.ts +51 -0
- package/src/cleanse/parsers.ts +726 -0
- package/src/cleanse/progress.ts +50 -0
- package/src/cleanse/prompts/assignment.md +47 -0
- package/src/cleanse/types.ts +72 -0
- package/src/cli/agents-cli.ts +138 -0
- package/src/cli/args.ts +368 -0
- package/src/cli/auth-broker-cli.ts +940 -0
- package/src/cli/auth-gateway-cli.ts +674 -0
- package/src/cli/bench-cli.ts +990 -0
- package/src/cli/browser-relay-cli.ts +119 -0
- package/src/cli/classify-install-target.ts +76 -0
- package/src/cli/claude-trace-cli.ts +795 -0
- package/src/cli/command-help.ts +107 -0
- package/src/cli/commands/init-xdg.ts +27 -0
- package/src/cli/completion-gen.ts +550 -0
- package/src/cli/config-cli.ts +459 -0
- package/src/cli/dry-balance-cli.ts +864 -0
- package/src/cli/extension-flags.ts +48 -0
- package/src/cli/file-processor.ts +132 -0
- package/src/cli/flag-tables.ts +367 -0
- package/src/cli/gallery-cli.ts +272 -0
- package/src/cli/gallery-fixtures/agentic.ts +420 -0
- package/src/cli/gallery-fixtures/codeintel.ts +187 -0
- package/src/cli/gallery-fixtures/edit.ts +254 -0
- package/src/cli/gallery-fixtures/fs.ts +245 -0
- package/src/cli/gallery-fixtures/index.ts +40 -0
- package/src/cli/gallery-fixtures/interaction.ts +46 -0
- package/src/cli/gallery-fixtures/memory.ts +81 -0
- package/src/cli/gallery-fixtures/misc.ts +177 -0
- package/src/cli/gallery-fixtures/search.ts +135 -0
- package/src/cli/gallery-fixtures/shell.ts +241 -0
- package/src/cli/gallery-fixtures/types.ts +57 -0
- package/src/cli/gallery-fixtures/web.ts +158 -0
- package/src/cli/gallery-screenshot.ts +279 -0
- package/src/cli/gc-cli.ts +1566 -0
- package/src/cli/grep-cli.ts +161 -0
- package/src/cli/grievances-cli.ts +256 -0
- package/src/cli/help-extra.ts +89 -0
- package/src/cli/initial-message.ts +58 -0
- package/src/cli/models-cli.ts +385 -0
- package/src/cli/plugin-cli.ts +996 -0
- package/src/cli/profile-alias.ts +369 -0
- package/src/cli/profile-bootstrap.ts +233 -0
- package/src/cli/read-cli.ts +99 -0
- package/src/cli/session-picker.ts +110 -0
- package/src/cli/setup-cli.ts +312 -0
- package/src/cli/setup-model-picker.ts +43 -0
- package/src/cli/shell-cli.ts +176 -0
- package/src/cli/ssh-cli.ts +179 -0
- package/src/cli/startup-cwd.ts +58 -0
- package/src/cli/stats-cli.ts +229 -0
- package/src/cli/thinking-levels.ts +7 -0
- package/src/cli/tiny-models-cli.ts +153 -0
- package/src/cli/ttsr-cli.ts +1013 -0
- package/src/cli/update-cli.ts +1184 -0
- package/src/cli/usage-cli.ts +1084 -0
- package/src/cli/usage-error.ts +7 -0
- package/src/cli/web-search-cli.ts +144 -0
- package/src/cli/worktree-cli.ts +311 -0
- package/src/cli-commands.ts +308 -0
- package/src/cli.ts +428 -0
- package/src/collab/crypto.ts +63 -0
- package/src/collab/display-name.ts +13 -0
- package/src/collab/guest.ts +764 -0
- package/src/collab/host.ts +692 -0
- package/src/collab/protocol.ts +296 -0
- package/src/collab/relay-client.ts +282 -0
- package/src/collab/replication-shrink.ts +111 -0
- package/src/commands/acp.ts +35 -0
- package/src/commands/agents.ts +58 -0
- package/src/commands/auth-broker.ts +100 -0
- package/src/commands/auth-gateway.ts +70 -0
- package/src/commands/bench.ts +64 -0
- package/src/commands/browser-relay.ts +53 -0
- package/src/commands/cleanse.ts +45 -0
- package/src/commands/commit.ts +47 -0
- package/src/commands/complete.ts +67 -0
- package/src/commands/completions.ts +61 -0
- package/src/commands/config.ts +52 -0
- package/src/commands/dry-balance.ts +43 -0
- package/src/commands/gallery.ts +61 -0
- package/src/commands/gc.ts +47 -0
- package/src/commands/grep.ts +49 -0
- package/src/commands/grievances.ts +52 -0
- package/src/commands/install.ts +107 -0
- package/src/commands/join.ts +40 -0
- package/src/commands/launch-help.ts +116 -0
- package/src/commands/launch.ts +34 -0
- package/src/commands/models.ts +61 -0
- package/src/commands/plugin.ts +79 -0
- package/src/commands/read.ts +39 -0
- package/src/commands/say.ts +146 -0
- package/src/commands/setup.ts +68 -0
- package/src/commands/share.ts +71 -0
- package/src/commands/shell.ts +30 -0
- package/src/commands/ssh.ts +61 -0
- package/src/commands/stats.ts +30 -0
- package/src/commands/tiny-models.ts +36 -0
- package/src/commands/token.ts +164 -0
- package/src/commands/ttsr.ts +125 -0
- package/src/commands/update.ts +34 -0
- package/src/commands/usage.ts +55 -0
- package/src/commands/web-search.ts +43 -0
- package/src/commands/worktree.ts +63 -0
- package/src/commit/agentic/agent.ts +322 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +383 -0
- package/src/commit/agentic/lock-files.ts +107 -0
- package/src/commit/agentic/prompts/analyze-file.md +22 -0
- package/src/commit/agentic/prompts/session-user.md +25 -0
- package/src/commit/agentic/prompts/split-confirm.md +1 -0
- package/src/commit/agentic/prompts/system.md +38 -0
- package/src/commit/agentic/state.ts +60 -0
- package/src/commit/agentic/tools/analyze-file.ts +148 -0
- package/src/commit/agentic/tools/git-file-diff.ts +191 -0
- package/src/commit/agentic/tools/git-hunk.ts +52 -0
- package/src/commit/agentic/tools/git-overview.ts +62 -0
- package/src/commit/agentic/tools/index.ts +54 -0
- package/src/commit/agentic/tools/propose-changelog.ts +147 -0
- package/src/commit/agentic/tools/propose-commit.ts +109 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/schemas.ts +11 -0
- package/src/commit/agentic/tools/split-commit.ts +241 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +183 -0
- package/src/commit/analysis/conventional.ts +64 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +107 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +40 -0
- package/src/commit/changelog/generate.ts +101 -0
- package/src/commit/changelog/index.ts +234 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +85 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +69 -0
- package/src/commit/map-reduce/map-phase.ts +193 -0
- package/src/commit/map-reduce/reduce-phase.ts +49 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +95 -0
- package/src/commit/pipeline.ts +244 -0
- package/src/commit/prompts/analysis-system.md +148 -0
- package/src/commit/prompts/analysis-user.md +38 -0
- package/src/commit/prompts/changelog-system.md +50 -0
- package/src/commit/prompts/changelog-user.md +18 -0
- package/src/commit/prompts/file-observer-system.md +24 -0
- package/src/commit/prompts/file-observer-user.md +8 -0
- package/src/commit/prompts/reduce-system.md +50 -0
- package/src/commit/prompts/reduce-user.md +17 -0
- package/src/commit/prompts/summary-retry.md +3 -0
- package/src/commit/prompts/summary-system.md +38 -0
- package/src/commit/prompts/summary-user.md +13 -0
- package/src/commit/prompts/types-description.md +2 -0
- package/src/commit/shared-llm.ts +70 -0
- package/src/commit/types.ts +118 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/commit/utils.ts +58 -0
- package/src/config/api-key-resolver.ts +81 -0
- package/src/config/append-only-context-mode.ts +76 -0
- package/src/config/config-file.ts +347 -0
- package/src/config/inline-tool-descriptors-mode.ts +26 -0
- package/src/config/keybindings.ts +703 -0
- package/src/config/mcp-schema.json +252 -0
- package/src/config/model-discovery.ts +1077 -0
- package/src/config/model-registry.ts +2822 -0
- package/src/config/model-resolver.ts +2115 -0
- package/src/config/model-roles.ts +113 -0
- package/src/config/models-config-schema-bundle.ts +315 -0
- package/src/config/models-config-schema.ts +14 -0
- package/src/config/models-config.ts +130 -0
- package/src/config/prompt-templates.ts +205 -0
- package/src/config/provider-globals.ts +25 -0
- package/src/config/resolve-config-value.ts +95 -0
- package/src/config/service-tier.ts +146 -0
- package/src/config/settings-schema.ts +5887 -0
- package/src/config/settings.ts +2394 -0
- package/src/config.ts +242 -0
- package/src/cursor-bridge-tools.ts +81 -0
- package/src/cursor.ts +960 -0
- package/src/dap/client.ts +1043 -0
- package/src/dap/config.ts +480 -0
- package/src/dap/defaults.json +212 -0
- package/src/dap/index.ts +4 -0
- package/src/dap/session.ts +1841 -0
- package/src/dap/types.ts +611 -0
- package/src/debug/index.ts +584 -0
- package/src/debug/log-formatting.ts +58 -0
- package/src/debug/log-viewer.ts +966 -0
- package/src/debug/profiler.ts +168 -0
- package/src/debug/protocol-probe.ts +267 -0
- package/src/debug/raw-sse-buffer.ts +421 -0
- package/src/debug/raw-sse.ts +312 -0
- package/src/debug/remote-debugger.ts +151 -0
- package/src/debug/report-bundle.ts +411 -0
- package/src/debug/system-info.ts +111 -0
- package/src/debug/terminal-info.ts +124 -0
- package/src/discovery/agent-plugin-format.ts +551 -0
- package/src/discovery/agent-plugins.ts +341 -0
- package/src/discovery/agents-md.ts +67 -0
- package/src/discovery/agents.ts +300 -0
- package/src/discovery/at-imports.ts +273 -0
- package/src/discovery/builtin-defaults.ts +39 -0
- package/src/discovery/builtin-rules/go-add-cleanup.md +33 -0
- package/src/discovery/builtin-rules/go-bench-loop.md +36 -0
- package/src/discovery/builtin-rules/go-exp-promoted.md +40 -0
- package/src/discovery/builtin-rules/go-ioutil.md +37 -0
- package/src/discovery/builtin-rules/go-join-hostport.md +30 -0
- package/src/discovery/builtin-rules/go-new-expr.md +44 -0
- package/src/discovery/builtin-rules/go-rand-v2.md +41 -0
- package/src/discovery/builtin-rules/go-range-int.md +45 -0
- package/src/discovery/builtin-rules/index.ts +74 -0
- package/src/discovery/builtin-rules/rs-box-leak.md +49 -0
- package/src/discovery/builtin-rules/rs-future-prelude.md +24 -0
- package/src/discovery/builtin-rules/rs-lazylock.md +52 -0
- package/src/discovery/builtin-rules/rs-match-ergonomics.md +68 -0
- package/src/discovery/builtin-rules/rs-parking-lot.md +45 -0
- package/src/discovery/builtin-rules/rs-result-type.md +20 -0
- package/src/discovery/builtin-rules/ts-bare-catch.md +39 -0
- package/src/discovery/builtin-rules/ts-import-type.md +43 -0
- package/src/discovery/builtin-rules/ts-no-any.md +66 -0
- package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +45 -0
- package/src/discovery/builtin-rules/ts-no-dynamic-import.md +40 -0
- package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +56 -0
- package/src/discovery/builtin-rules/ts-no-local-is-record.md +48 -0
- package/src/discovery/builtin-rules/ts-no-return-type.md +45 -0
- package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
- package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
- package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +66 -0
- package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
- package/src/discovery/builtin-rules/ts-set-map.md +28 -0
- package/src/discovery/builtin.ts +945 -0
- package/src/discovery/claude-plugins.ts +640 -0
- package/src/discovery/claude.ts +591 -0
- package/src/discovery/cline.ts +83 -0
- package/src/discovery/codex.ts +553 -0
- package/src/discovery/contained-path.ts +78 -0
- package/src/discovery/cursor.ts +223 -0
- package/src/discovery/gemini.ts +386 -0
- package/src/discovery/github.ts +337 -0
- package/src/discovery/helpers.ts +1183 -0
- package/src/discovery/index.ts +82 -0
- package/src/discovery/mcp-json.ts +182 -0
- package/src/discovery/omp-extension-roots.ts +272 -0
- package/src/discovery/omp-plugins.ts +409 -0
- package/src/discovery/opencode.ts +441 -0
- package/src/discovery/plugin-dir-roots.ts +28 -0
- package/src/discovery/ssh.ts +153 -0
- package/src/discovery/substitute-plugin-root.ts +77 -0
- package/src/discovery/vscode.ts +106 -0
- package/src/discovery/windsurf.ts +149 -0
- package/src/edit/apply-patch/index.ts +87 -0
- package/src/edit/apply-patch/parser.ts +174 -0
- package/src/edit/diff.ts +1008 -0
- package/src/edit/edit-clipboard.ts +23 -0
- package/src/edit/file-snapshot-store.ts +148 -0
- package/src/edit/hashline/block-resolver.ts +33 -0
- package/src/edit/hashline/diff.ts +402 -0
- package/src/edit/hashline/execute.ts +313 -0
- package/src/edit/hashline/filesystem.ts +247 -0
- package/src/edit/hashline/index.ts +5 -0
- package/src/edit/hashline/noop-loop-guard.ts +99 -0
- package/src/edit/hashline/params.ts +12 -0
- package/src/edit/index.ts +699 -0
- package/src/edit/modes/apply-patch.lark +19 -0
- package/src/edit/modes/apply-patch.ts +53 -0
- package/src/edit/modes/patch.ts +1958 -0
- package/src/edit/modes/replace.ts +1191 -0
- package/src/edit/normalize.ts +345 -0
- package/src/edit/notebook.ts +242 -0
- package/src/edit/read-file.ts +25 -0
- package/src/edit/renderer.ts +998 -0
- package/src/edit/snapshot-details.ts +77 -0
- package/src/edit/streaming.ts +710 -0
- package/src/eval/agent-bridge.ts +224 -0
- package/src/eval/backend-helpers.ts +48 -0
- package/src/eval/backend.ts +71 -0
- package/src/eval/bridge-timeout.ts +65 -0
- package/src/eval/budget-bridge.ts +48 -0
- package/src/eval/completion-bridge.ts +212 -0
- package/src/eval/concurrency-bridge.ts +34 -0
- package/src/eval/executor-base.ts +562 -0
- package/src/eval/idle-timeout.ts +91 -0
- package/src/eval/index.ts +6 -0
- package/src/eval/jl/executor.ts +551 -0
- package/src/eval/jl/index.ts +54 -0
- package/src/eval/jl/kernel.ts +236 -0
- package/src/eval/jl/prelude.jl +736 -0
- package/src/eval/jl/prelude.ts +3 -0
- package/src/eval/jl/runner.jl +666 -0
- package/src/eval/jl/runtime.ts +118 -0
- package/src/eval/js/context-manager.ts +872 -0
- package/src/eval/js/executor.ts +178 -0
- package/src/eval/js/index.ts +41 -0
- package/src/eval/js/process-entry.ts +31 -0
- package/src/eval/js/shared/helpers.ts +170 -0
- package/src/eval/js/shared/indirect-eval.ts +30 -0
- package/src/eval/js/shared/local-module-loader.ts +364 -0
- package/src/eval/js/shared/prelude.ts +2 -0
- package/src/eval/js/shared/prelude.txt +294 -0
- package/src/eval/js/shared/rewrite-imports.ts +550 -0
- package/src/eval/js/shared/runtime.ts +590 -0
- package/src/eval/js/shared/types.ts +18 -0
- package/src/eval/js/tool-bridge.ts +163 -0
- package/src/eval/js/worker-core.ts +380 -0
- package/src/eval/js/worker-entry.ts +37 -0
- package/src/eval/js/worker-protocol.ts +47 -0
- package/src/eval/kernel-base.ts +569 -0
- package/src/eval/py/display.ts +71 -0
- package/src/eval/py/executor.ts +643 -0
- package/src/eval/py/index.ts +57 -0
- package/src/eval/py/kernel.ts +235 -0
- package/src/eval/py/prelude.py +673 -0
- package/src/eval/py/prelude.ts +3 -0
- package/src/eval/py/runner.py +1425 -0
- package/src/eval/py/runtime.ts +276 -0
- package/src/eval/py/spawn-options.ts +134 -0
- package/src/eval/py/tool-bridge.ts +201 -0
- package/src/eval/rb/executor.ts +511 -0
- package/src/eval/rb/index.ts +54 -0
- package/src/eval/rb/kernel.ts +231 -0
- package/src/eval/rb/prelude.rb +551 -0
- package/src/eval/rb/prelude.ts +3 -0
- package/src/eval/rb/runner.rb +581 -0
- package/src/eval/rb/runtime.ts +132 -0
- package/src/eval/runtime-env.ts +104 -0
- package/src/eval/session-id.ts +8 -0
- package/src/eval/types.ts +48 -0
- package/src/exa/index.ts +2 -0
- package/src/exa/mcp-client.ts +370 -0
- package/src/exa/types.ts +69 -0
- package/src/exec/bash-executor.ts +627 -0
- package/src/exec/direnv.ts +145 -0
- package/src/exec/exec.ts +53 -0
- package/src/exec/non-interactive-env.ts +118 -0
- package/src/export/custom-share.ts +65 -0
- package/src/export/html/args.ts +20 -0
- package/src/export/html/index.ts +320 -0
- package/src/export/html/share-loader.js +102 -0
- package/src/export/html/template.css +1355 -0
- package/src/export/html/template.html +55 -0
- package/src/export/html/template.js +1653 -0
- package/src/export/html/tool-views.generated.js +35 -0
- package/src/export/html/vendor/highlight.min.js +1213 -0
- package/src/export/html/vendor/marked.min.js +6 -0
- package/src/export/html/web-palette.ts +126 -0
- package/src/export/share.ts +686 -0
- package/src/export/ttsr.ts +590 -0
- package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
- package/src/extensibility/custom-commands/bundled/review/index.ts +698 -0
- package/src/extensibility/custom-commands/index.ts +2 -0
- package/src/extensibility/custom-commands/loader.ts +242 -0
- package/src/extensibility/custom-commands/types.ts +119 -0
- package/src/extensibility/custom-tools/index.ts +7 -0
- package/src/extensibility/custom-tools/loader.ts +301 -0
- package/src/extensibility/custom-tools/types.ts +287 -0
- package/src/extensibility/custom-tools/wrapper.ts +50 -0
- package/src/extensibility/extensions/compact-handler.ts +40 -0
- package/src/extensibility/extensions/get-commands-handler.ts +78 -0
- package/src/extensibility/extensions/index.ts +16 -0
- package/src/extensibility/extensions/load-errors.ts +13 -0
- package/src/extensibility/extensions/loader.ts +663 -0
- package/src/extensibility/extensions/managed-timers.ts +83 -0
- package/src/extensibility/extensions/model-api.ts +39 -0
- package/src/extensibility/extensions/runner.ts +1396 -0
- package/src/extensibility/extensions/types.ts +1603 -0
- package/src/extensibility/extensions/wrapper.ts +395 -0
- package/src/extensibility/hooks/index.ts +6 -0
- package/src/extensibility/hooks/loader.ts +243 -0
- package/src/extensibility/hooks/runner.ts +425 -0
- package/src/extensibility/hooks/tool-wrapper.ts +124 -0
- package/src/extensibility/hooks/types.ts +612 -0
- package/src/extensibility/legacy-pi-ai-shim.ts +161 -0
- package/src/extensibility/legacy-pi-coding-agent-shim.ts +1460 -0
- package/src/extensibility/legacy-pi-tui-shim.ts +43 -0
- package/src/extensibility/legacy-typebox.ts +101 -0
- package/src/extensibility/plugins/bun-git-cache.ts +91 -0
- package/src/extensibility/plugins/doctor.ts +65 -0
- package/src/extensibility/plugins/git-url.ts +367 -0
- package/src/extensibility/plugins/index.ts +9 -0
- package/src/extensibility/plugins/installer.ts +201 -0
- package/src/extensibility/plugins/legacy-pi-compat.ts +2643 -0
- package/src/extensibility/plugins/legacy-pi-virtual-modules.d.ts +4 -0
- package/src/extensibility/plugins/loader.ts +535 -0
- package/src/extensibility/plugins/manager.ts +1142 -0
- package/src/extensibility/plugins/marketplace/cache.ts +136 -0
- package/src/extensibility/plugins/marketplace/fetcher.ts +316 -0
- package/src/extensibility/plugins/marketplace/index.ts +6 -0
- package/src/extensibility/plugins/marketplace/manager.ts +927 -0
- package/src/extensibility/plugins/marketplace/registry.ts +192 -0
- package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
- package/src/extensibility/plugins/marketplace/types.ts +192 -0
- package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
- package/src/extensibility/plugins/parser.ts +107 -0
- package/src/extensibility/plugins/runtime-config.ts +9 -0
- package/src/extensibility/plugins/types.ts +194 -0
- package/src/extensibility/session-handler-types.ts +21 -0
- package/src/extensibility/shared-events.ts +401 -0
- package/src/extensibility/skills.ts +531 -0
- package/src/extensibility/slash-commands.ts +131 -0
- package/src/extensibility/tool-event-input.ts +80 -0
- package/src/extensibility/tool-proxy.ts +28 -0
- package/src/extensibility/utils.ts +192 -0
- package/src/goals/index.ts +3 -0
- package/src/goals/runtime.ts +521 -0
- package/src/goals/state.ts +37 -0
- package/src/goals/tools/goal-tool.ts +251 -0
- package/src/hindsight/backend.ts +354 -0
- package/src/hindsight/bank.ts +156 -0
- package/src/hindsight/client.ts +680 -0
- package/src/hindsight/config.ts +193 -0
- package/src/hindsight/content.ts +266 -0
- package/src/hindsight/index.ts +8 -0
- package/src/hindsight/mental-models.ts +429 -0
- package/src/hindsight/seeds.json +32 -0
- package/src/hindsight/state.ts +530 -0
- package/src/hindsight/transcript.ts +71 -0
- package/src/index.ts +66 -0
- package/src/internal-urls/agent-protocol.ts +180 -0
- package/src/internal-urls/artifact-protocol.ts +151 -0
- package/src/internal-urls/docs-index.ts +102 -0
- package/src/internal-urls/filesystem-resource.ts +34 -0
- package/src/internal-urls/history-protocol.ts +198 -0
- package/src/internal-urls/index.ts +28 -0
- package/src/internal-urls/issue-pr-protocol.ts +594 -0
- package/src/internal-urls/json-query.ts +126 -0
- package/src/internal-urls/local-protocol.ts +471 -0
- package/src/internal-urls/mcp-protocol.ts +168 -0
- package/src/internal-urls/memory-protocol.ts +380 -0
- package/src/internal-urls/omp-protocol.ts +94 -0
- package/src/internal-urls/parse.ts +103 -0
- package/src/internal-urls/registry-helpers.ts +132 -0
- package/src/internal-urls/router.ts +153 -0
- package/src/internal-urls/rule-protocol.ts +45 -0
- package/src/internal-urls/security-protocol.ts +261 -0
- package/src/internal-urls/skill-protocol.ts +131 -0
- package/src/internal-urls/ssh-protocol.ts +368 -0
- package/src/internal-urls/types.ts +196 -0
- package/src/internal-urls/vault-protocol.ts +940 -0
- package/src/internal-urls/xd-protocol.ts +46 -0
- package/src/irc/bus.ts +380 -0
- package/src/jsonrpc/message-framing.ts +142 -0
- package/src/launch/broker.ts +1368 -0
- package/src/launch/client.ts +521 -0
- package/src/launch/ensure.ts +73 -0
- package/src/launch/paths.ts +14 -0
- package/src/launch/presence.ts +82 -0
- package/src/launch/protocol.ts +448 -0
- package/src/launch/spawn-options.ts +17 -0
- package/src/launch/terminal-output-worker-client.ts +53 -0
- package/src/launch/terminal-output-worker-protocol.ts +11 -0
- package/src/launch/terminal-output-worker.ts +23 -0
- package/src/launch/terminal-output.ts +46 -0
- package/src/lib/xai-http.ts +150 -0
- package/src/live/attestation.ts +91 -0
- package/src/live/controller.ts +517 -0
- package/src/live/prompts/agent-final-message.md +3 -0
- package/src/live/prompts/live-instructions.md +23 -0
- package/src/live/protocol.ts +233 -0
- package/src/live/transport.ts +422 -0
- package/src/live/visualizer.ts +221 -0
- package/src/live/voices.ts +18 -0
- package/src/lsp/client.ts +1465 -0
- package/src/lsp/clients/biome-client.ts +263 -0
- package/src/lsp/clients/index.ts +50 -0
- package/src/lsp/clients/lsp-linter-client.ts +85 -0
- package/src/lsp/clients/swiftlint-client.ts +120 -0
- package/src/lsp/config.ts +549 -0
- package/src/lsp/defaults.json +499 -0
- package/src/lsp/deferred-diagnostics.ts +66 -0
- package/src/lsp/diagnostics-ledger.ts +51 -0
- package/src/lsp/edits.ts +288 -0
- package/src/lsp/format-options.ts +119 -0
- package/src/lsp/index.ts +2821 -0
- package/src/lsp/lspmux.ts +233 -0
- package/src/lsp/mux/daemon.ts +348 -0
- package/src/lsp/mux/protocol.ts +96 -0
- package/src/lsp/mux/server.ts +797 -0
- package/src/lsp/render.ts +668 -0
- package/src/lsp/startup-events.ts +13 -0
- package/src/lsp/types.ts +479 -0
- package/src/lsp/utils.ts +747 -0
- package/src/main.ts +1799 -0
- package/src/markit/NOTICE +32 -0
- package/src/markit/converters/docx.ts +56 -0
- package/src/markit/converters/epub.ts +136 -0
- package/src/markit/converters/pdf/columns.ts +103 -0
- package/src/markit/converters/pdf/extract.ts +598 -0
- package/src/markit/converters/pdf/grid.ts +780 -0
- package/src/markit/converters/pdf/headers.ts +106 -0
- package/src/markit/converters/pdf/index.ts +146 -0
- package/src/markit/converters/pdf/render.ts +501 -0
- package/src/markit/converters/pdf/types.ts +84 -0
- package/src/markit/converters/pptx.ts +325 -0
- package/src/markit/converters/xlsx.ts +173 -0
- package/src/markit/index.ts +2 -0
- package/src/markit/registry.ts +59 -0
- package/src/markit/types.ts +35 -0
- package/src/mcp/client.ts +511 -0
- package/src/mcp/config-writer.ts +377 -0
- package/src/mcp/config.ts +385 -0
- package/src/mcp/index.ts +29 -0
- package/src/mcp/json-rpc.ts +122 -0
- package/src/mcp/loader.ts +125 -0
- package/src/mcp/manager.ts +1524 -0
- package/src/mcp/oauth-credentials.ts +104 -0
- package/src/mcp/oauth-discovery.ts +587 -0
- package/src/mcp/oauth-flow.ts +830 -0
- package/src/mcp/render.ts +214 -0
- package/src/mcp/request-id.ts +24 -0
- package/src/mcp/smithery-auth.ts +108 -0
- package/src/mcp/smithery-connect.ts +154 -0
- package/src/mcp/smithery-registry.ts +500 -0
- package/src/mcp/startup-events.ts +116 -0
- package/src/mcp/timeout.ts +59 -0
- package/src/mcp/tool-bridge.ts +691 -0
- package/src/mcp/tool-cache.ts +117 -0
- package/src/mcp/transports/header-policy.ts +95 -0
- package/src/mcp/transports/http.ts +508 -0
- package/src/mcp/transports/index.ts +7 -0
- package/src/mcp/transports/sse.ts +372 -0
- package/src/mcp/transports/stdio.ts +905 -0
- package/src/mcp/types.ts +467 -0
- package/src/memories/index.ts +1434 -0
- package/src/memories/storage.ts +578 -0
- package/src/memory-backend/index.ts +19 -0
- package/src/memory-backend/local-backend.ts +47 -0
- package/src/memory-backend/messages.ts +19 -0
- package/src/memory-backend/off-backend.ts +25 -0
- package/src/memory-backend/resolve.ts +25 -0
- package/src/memory-backend/runtime.ts +66 -0
- package/src/memory-backend/tool-names.ts +2 -0
- package/src/memory-backend/types.ts +166 -0
- package/src/mnemopi/backend.ts +629 -0
- package/src/mnemopi/config.ts +267 -0
- package/src/mnemopi/embed-client.ts +293 -0
- package/src/mnemopi/embed-protocol.ts +35 -0
- package/src/mnemopi/embed-worker.ts +114 -0
- package/src/mnemopi/index.ts +3 -0
- package/src/mnemopi/state.ts +940 -0
- package/src/modes/acp/acp-agent.ts +2595 -0
- package/src/modes/acp/acp-client-bridge.ts +154 -0
- package/src/modes/acp/acp-event-mapper.ts +1084 -0
- package/src/modes/acp/acp-mode.ts +48 -0
- package/src/modes/acp/index.ts +2 -0
- package/src/modes/acp/terminal-auth.ts +37 -0
- package/src/modes/components/advisor-config.ts +635 -0
- package/src/modes/components/advisor-message.ts +109 -0
- package/src/modes/components/agent-dashboard.ts +1252 -0
- package/src/modes/components/agent-hub-projection.ts +248 -0
- package/src/modes/components/agent-hub-renderer.ts +194 -0
- package/src/modes/components/agent-hub.ts +1126 -0
- package/src/modes/components/agent-transcript-viewer.ts +647 -0
- package/src/modes/components/ask-dialog.ts +1017 -0
- package/src/modes/components/assistant-message.ts +978 -0
- package/src/modes/components/background-tan-message.ts +36 -0
- package/src/modes/components/bash-execution.ts +233 -0
- package/src/modes/components/bordered-loader.ts +41 -0
- package/src/modes/components/btw-panel.ts +161 -0
- package/src/modes/components/cache-invalidation-marker.ts +110 -0
- package/src/modes/components/chat-block.ts +111 -0
- package/src/modes/components/chat-transcript-builder.ts +518 -0
- package/src/modes/components/codex-reset-fireworks.ts +369 -0
- package/src/modes/components/collab-prompt-message.ts +32 -0
- package/src/modes/components/compaction-summary-message.ts +221 -0
- package/src/modes/components/copy-selector.ts +218 -0
- package/src/modes/components/countdown-timer.ts +75 -0
- package/src/modes/components/custom-editor.ts +1036 -0
- package/src/modes/components/custom-message.ts +70 -0
- package/src/modes/components/diff.ts +254 -0
- package/src/modes/components/dynamic-border.ts +37 -0
- package/src/modes/components/error-banner.ts +33 -0
- package/src/modes/components/eval-execution.ts +169 -0
- package/src/modes/components/execution-shared.ts +101 -0
- package/src/modes/components/extensions/extension-dashboard.ts +492 -0
- package/src/modes/components/extensions/extension-list.ts +507 -0
- package/src/modes/components/extensions/index.ts +9 -0
- package/src/modes/components/extensions/inspector-panel.ts +326 -0
- package/src/modes/components/extensions/state-manager.ts +648 -0
- package/src/modes/components/extensions/types.ts +186 -0
- package/src/modes/components/footer.ts +274 -0
- package/src/modes/components/history-search.ts +268 -0
- package/src/modes/components/hook-editor.ts +213 -0
- package/src/modes/components/hook-input.ts +87 -0
- package/src/modes/components/hook-message.ts +67 -0
- package/src/modes/components/hook-selector.ts +691 -0
- package/src/modes/components/index.ts +42 -0
- package/src/modes/components/keybinding-hints.ts +56 -0
- package/src/modes/components/late-diagnostics-message.ts +60 -0
- package/src/modes/components/login-dialog.ts +197 -0
- package/src/modes/components/logout-account-selector.ts +130 -0
- package/src/modes/components/mcp-add-wizard.ts +1413 -0
- package/src/modes/components/message-frame.ts +98 -0
- package/src/modes/components/model-browser.ts +888 -0
- package/src/modes/components/model-hub.ts +2014 -0
- package/src/modes/components/model-picker.ts +237 -0
- package/src/modes/components/move-overlay.ts +293 -0
- package/src/modes/components/oauth-selector.ts +474 -0
- package/src/modes/components/omfg-panel.ts +141 -0
- package/src/modes/components/overlay-box.ts +109 -0
- package/src/modes/components/pause-screen.ts +208 -0
- package/src/modes/components/plan-review-overlay.ts +1226 -0
- package/src/modes/components/plan-toc.ts +138 -0
- package/src/modes/components/plugin-selector.ts +100 -0
- package/src/modes/components/plugin-settings.ts +745 -0
- package/src/modes/components/queue-mode-selector.ts +61 -0
- package/src/modes/components/read-tool-group.ts +856 -0
- package/src/modes/components/reset-usage-selector.ts +161 -0
- package/src/modes/components/segment-track.ts +89 -0
- package/src/modes/components/select-list-mouse-routing.ts +35 -0
- package/src/modes/components/selector-helpers.ts +129 -0
- package/src/modes/components/session-account-selector.ts +62 -0
- package/src/modes/components/session-selector.ts +1035 -0
- package/src/modes/components/settings-defs.ts +267 -0
- package/src/modes/components/settings-selector.ts +1445 -0
- package/src/modes/components/show-images-selector.ts +50 -0
- package/src/modes/components/skill-message.ts +110 -0
- package/src/modes/components/snapcompact-shape-preview-doc.md +14 -0
- package/src/modes/components/snapcompact-shape-preview.ts +192 -0
- package/src/modes/components/status-line/component.ts +1843 -0
- package/src/modes/components/status-line/context-thresholds.ts +86 -0
- package/src/modes/components/status-line/git-utils.ts +42 -0
- package/src/modes/components/status-line/index.ts +5 -0
- package/src/modes/components/status-line/presets.ts +106 -0
- package/src/modes/components/status-line/segments.ts +710 -0
- package/src/modes/components/status-line/separators.ts +55 -0
- package/src/modes/components/status-line/types.ts +159 -0
- package/src/modes/components/stripped-tool-calls-placeholder.ts +35 -0
- package/src/modes/components/theme-selector.ts +68 -0
- package/src/modes/components/thinking-selector.ts +57 -0
- package/src/modes/components/tiny-title-download-progress.ts +90 -0
- package/src/modes/components/tips.txt +26 -0
- package/src/modes/components/todo-reminder.ts +43 -0
- package/src/modes/components/tool-execution.ts +1467 -0
- package/src/modes/components/transcript-container.ts +527 -0
- package/src/modes/components/tree-selector.ts +1006 -0
- package/src/modes/components/ttsr-notification.ts +123 -0
- package/src/modes/components/usage-row.ts +52 -0
- package/src/modes/components/user-message-selector.ts +227 -0
- package/src/modes/components/user-message.ts +167 -0
- package/src/modes/components/visual-truncate.ts +63 -0
- package/src/modes/components/welcome.ts +578 -0
- package/src/modes/controllers/btw-controller.ts +246 -0
- package/src/modes/controllers/command-controller-shared.ts +109 -0
- package/src/modes/controllers/command-controller.ts +2024 -0
- package/src/modes/controllers/event-controller.ts +2173 -0
- package/src/modes/controllers/extension-ui-controller.ts +1243 -0
- package/src/modes/controllers/input-controller.ts +2037 -0
- package/src/modes/controllers/live-command-controller.ts +261 -0
- package/src/modes/controllers/mcp-command-controller.ts +2552 -0
- package/src/modes/controllers/omfg-controller.ts +287 -0
- package/src/modes/controllers/omfg-rule.ts +647 -0
- package/src/modes/controllers/selector-controller.ts +2058 -0
- package/src/modes/controllers/session-focus-controller.ts +117 -0
- package/src/modes/controllers/ssh-command-controller.ts +385 -0
- package/src/modes/controllers/streaming-reveal.ts +399 -0
- package/src/modes/controllers/tan-command-controller.ts +243 -0
- package/src/modes/controllers/todo-command-controller.ts +487 -0
- package/src/modes/controllers/tool-args-reveal.ts +591 -0
- package/src/modes/data/emojis.json +1 -0
- package/src/modes/emoji-autocomplete.ts +285 -0
- package/src/modes/github-ref-autocomplete.ts +75 -0
- package/src/modes/gradient-highlight.ts +99 -0
- package/src/modes/image-references.ts +137 -0
- package/src/modes/index.ts +10 -0
- package/src/modes/interactive-mode.ts +5055 -0
- package/src/modes/internal-url-autocomplete.ts +158 -0
- package/src/modes/loop-limit.ts +192 -0
- package/src/modes/magic-keyword-boundary.ts +23 -0
- package/src/modes/magic-keywords.ts +42 -0
- package/src/modes/markdown-prose.ts +247 -0
- package/src/modes/oauth-manual-input.ts +69 -0
- package/src/modes/orchestrate.ts +43 -0
- package/src/modes/print-mode.ts +282 -0
- package/src/modes/prompt-action-autocomplete.ts +322 -0
- package/src/modes/queue-input.ts +132 -0
- package/src/modes/rpc/host-tools.ts +204 -0
- package/src/modes/rpc/host-uris.ts +241 -0
- package/src/modes/rpc/rpc-client.ts +1213 -0
- package/src/modes/rpc/rpc-frame.ts +316 -0
- package/src/modes/rpc/rpc-input.ts +38 -0
- package/src/modes/rpc/rpc-messages.ts +127 -0
- package/src/modes/rpc/rpc-mode.ts +1519 -0
- package/src/modes/rpc/rpc-subagents.ts +265 -0
- package/src/modes/rpc/rpc-types.ts +544 -0
- package/src/modes/running-subagent-badge.ts +13 -0
- package/src/modes/runtime-init.ts +144 -0
- package/src/modes/session-observer-registry.ts +223 -0
- package/src/modes/session-teardown.ts +82 -0
- package/src/modes/setup-version.ts +11 -0
- package/src/modes/setup-wizard/index.ts +103 -0
- package/src/modes/setup-wizard/lazy.ts +16 -0
- package/src/modes/setup-wizard/scenes/glyph.ts +103 -0
- package/src/modes/setup-wizard/scenes/model.ts +132 -0
- package/src/modes/setup-wizard/scenes/outro.ts +35 -0
- package/src/modes/setup-wizard/scenes/providers.ts +105 -0
- package/src/modes/setup-wizard/scenes/sign-in.ts +312 -0
- package/src/modes/setup-wizard/scenes/splash.ts +201 -0
- package/src/modes/setup-wizard/scenes/theme.ts +330 -0
- package/src/modes/setup-wizard/scenes/types.ts +65 -0
- package/src/modes/setup-wizard/scenes/web-search.ts +153 -0
- package/src/modes/setup-wizard/startup-splash.ts +107 -0
- package/src/modes/setup-wizard/wizard-overlay.ts +335 -0
- package/src/modes/shared.ts +49 -0
- package/src/modes/skill-command.ts +91 -0
- package/src/modes/theme/dark.json +95 -0
- package/src/modes/theme/defaults/alabaster.json +93 -0
- package/src/modes/theme/defaults/amethyst.json +96 -0
- package/src/modes/theme/defaults/anthracite.json +93 -0
- package/src/modes/theme/defaults/basalt.json +91 -0
- package/src/modes/theme/defaults/birch.json +95 -0
- package/src/modes/theme/defaults/dark-abyss.json +91 -0
- package/src/modes/theme/defaults/dark-arctic.json +104 -0
- package/src/modes/theme/defaults/dark-aurora.json +95 -0
- package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
- package/src/modes/theme/defaults/dark-cavern.json +91 -0
- package/src/modes/theme/defaults/dark-copper.json +95 -0
- package/src/modes/theme/defaults/dark-cosmos.json +90 -0
- package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
- package/src/modes/theme/defaults/dark-dracula.json +98 -0
- package/src/modes/theme/defaults/dark-eclipse.json +91 -0
- package/src/modes/theme/defaults/dark-ember.json +95 -0
- package/src/modes/theme/defaults/dark-equinox.json +90 -0
- package/src/modes/theme/defaults/dark-forest.json +96 -0
- package/src/modes/theme/defaults/dark-github.json +105 -0
- package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
- package/src/modes/theme/defaults/dark-lavender.json +95 -0
- package/src/modes/theme/defaults/dark-lunar.json +89 -0
- package/src/modes/theme/defaults/dark-midnight.json +95 -0
- package/src/modes/theme/defaults/dark-monochrome.json +94 -0
- package/src/modes/theme/defaults/dark-monokai.json +98 -0
- package/src/modes/theme/defaults/dark-nebula.json +90 -0
- package/src/modes/theme/defaults/dark-nord.json +97 -0
- package/src/modes/theme/defaults/dark-ocean.json +101 -0
- package/src/modes/theme/defaults/dark-one.json +100 -0
- package/src/modes/theme/defaults/dark-poimandres.json +143 -0
- package/src/modes/theme/defaults/dark-rainforest.json +91 -0
- package/src/modes/theme/defaults/dark-reef.json +91 -0
- package/src/modes/theme/defaults/dark-retro.json +92 -0
- package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
- package/src/modes/theme/defaults/dark-sakura.json +95 -0
- package/src/modes/theme/defaults/dark-slate.json +95 -0
- package/src/modes/theme/defaults/dark-solarized.json +97 -0
- package/src/modes/theme/defaults/dark-solstice.json +90 -0
- package/src/modes/theme/defaults/dark-starfall.json +91 -0
- package/src/modes/theme/defaults/dark-sunset.json +99 -0
- package/src/modes/theme/defaults/dark-swamp.json +90 -0
- package/src/modes/theme/defaults/dark-synthwave.json +103 -0
- package/src/modes/theme/defaults/dark-taiga.json +91 -0
- package/src/modes/theme/defaults/dark-terminal.json +95 -0
- package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
- package/src/modes/theme/defaults/dark-tundra.json +91 -0
- package/src/modes/theme/defaults/dark-twilight.json +91 -0
- package/src/modes/theme/defaults/dark-volcanic.json +91 -0
- package/src/modes/theme/defaults/graphite.json +92 -0
- package/src/modes/theme/defaults/index.ts +199 -0
- package/src/modes/theme/defaults/light-arctic.json +107 -0
- package/src/modes/theme/defaults/light-aurora-day.json +91 -0
- package/src/modes/theme/defaults/light-canyon.json +91 -0
- package/src/modes/theme/defaults/light-catppuccin.json +106 -0
- package/src/modes/theme/defaults/light-cirrus.json +90 -0
- package/src/modes/theme/defaults/light-coral.json +95 -0
- package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
- package/src/modes/theme/defaults/light-dawn.json +90 -0
- package/src/modes/theme/defaults/light-dunes.json +91 -0
- package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
- package/src/modes/theme/defaults/light-forest.json +100 -0
- package/src/modes/theme/defaults/light-frost.json +95 -0
- package/src/modes/theme/defaults/light-github.json +115 -0
- package/src/modes/theme/defaults/light-glacier.json +91 -0
- package/src/modes/theme/defaults/light-gruvbox.json +108 -0
- package/src/modes/theme/defaults/light-haze.json +90 -0
- package/src/modes/theme/defaults/light-honeycomb.json +95 -0
- package/src/modes/theme/defaults/light-lagoon.json +91 -0
- package/src/modes/theme/defaults/light-lavender.json +95 -0
- package/src/modes/theme/defaults/light-meadow.json +91 -0
- package/src/modes/theme/defaults/light-mint.json +95 -0
- package/src/modes/theme/defaults/light-monochrome.json +101 -0
- package/src/modes/theme/defaults/light-ocean.json +99 -0
- package/src/modes/theme/defaults/light-one.json +99 -0
- package/src/modes/theme/defaults/light-opal.json +91 -0
- package/src/modes/theme/defaults/light-orchard.json +91 -0
- package/src/modes/theme/defaults/light-paper.json +95 -0
- package/src/modes/theme/defaults/light-poimandres.json +143 -0
- package/src/modes/theme/defaults/light-prism.json +90 -0
- package/src/modes/theme/defaults/light-retro.json +98 -0
- package/src/modes/theme/defaults/light-sand.json +95 -0
- package/src/modes/theme/defaults/light-savanna.json +91 -0
- package/src/modes/theme/defaults/light-solarized.json +102 -0
- package/src/modes/theme/defaults/light-soleil.json +90 -0
- package/src/modes/theme/defaults/light-sunset.json +99 -0
- package/src/modes/theme/defaults/light-synthwave.json +98 -0
- package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
- package/src/modes/theme/defaults/light-wetland.json +91 -0
- package/src/modes/theme/defaults/light-zenith.json +89 -0
- package/src/modes/theme/defaults/limestone.json +94 -0
- package/src/modes/theme/defaults/mahogany.json +97 -0
- package/src/modes/theme/defaults/marble.json +93 -0
- package/src/modes/theme/defaults/obsidian.json +91 -0
- package/src/modes/theme/defaults/onyx.json +91 -0
- package/src/modes/theme/defaults/pearl.json +93 -0
- package/src/modes/theme/defaults/porcelain.json +91 -0
- package/src/modes/theme/defaults/quartz.json +96 -0
- package/src/modes/theme/defaults/sandstone.json +95 -0
- package/src/modes/theme/defaults/titanium.json +90 -0
- package/src/modes/theme/light.json +93 -0
- package/src/modes/theme/mermaid-cache.ts +92 -0
- package/src/modes/theme/shimmer.ts +305 -0
- package/src/modes/theme/theme-schema.json +463 -0
- package/src/modes/theme/theme.ts +3171 -0
- package/src/modes/turn-budget.ts +31 -0
- package/src/modes/types.ts +494 -0
- package/src/modes/ultrathink.ts +42 -0
- package/src/modes/utils/context-usage.ts +518 -0
- package/src/modes/utils/copy-targets.ts +378 -0
- package/src/modes/utils/hotkeys-markdown.ts +65 -0
- package/src/modes/utils/interactive-context-helpers.ts +31 -0
- package/src/modes/utils/keybinding-matchers.ts +86 -0
- package/src/modes/utils/tools-markdown.ts +31 -0
- package/src/modes/utils/transcript-render-helpers.ts +253 -0
- package/src/modes/utils/ui-helpers.ts +976 -0
- package/src/modes/warp-events.ts +232 -0
- package/src/modes/workflow.ts +55 -0
- package/src/plan-mode/approved-plan.ts +194 -0
- package/src/plan-mode/model-transition.ts +51 -0
- package/src/plan-mode/plan-files.ts +40 -0
- package/src/plan-mode/plan-handoff.ts +37 -0
- package/src/plan-mode/plan-protection.ts +31 -0
- package/src/plan-mode/state.ts +6 -0
- package/src/priority.json +60 -0
- package/src/prompts/advisor/active-repo-watchdog.md +6 -0
- package/src/prompts/advisor/advise-tool.md +3 -0
- package/src/prompts/advisor/context-files.md +8 -0
- package/src/prompts/advisor/system.md +98 -0
- package/src/prompts/agents/designer.md +74 -0
- package/src/prompts/agents/frontmatter.md +12 -0
- package/src/prompts/agents/init.md +33 -0
- package/src/prompts/agents/librarian.md +119 -0
- package/src/prompts/agents/reviewer.md +139 -0
- package/src/prompts/agents/scout.md +58 -0
- package/src/prompts/agents/security-reviewer.md +75 -0
- package/src/prompts/agents/task.md +17 -0
- package/src/prompts/bench/cache-prefix-chunk.md +1 -0
- package/src/prompts/bench/cache-prefix.md +3 -0
- package/src/prompts/bench/cache-suffix.md +1 -0
- package/src/prompts/bench.md +6 -0
- package/src/prompts/ci-green-request.md +36 -0
- package/src/prompts/dry-balance-bench.md +8 -0
- package/src/prompts/goals/goal-budget-limit.md +16 -0
- package/src/prompts/goals/goal-continuation.md +28 -0
- package/src/prompts/goals/goal-mode-active.md +23 -0
- package/src/prompts/goals/goal-mode-context.md +4 -0
- package/src/prompts/goals/goal-todo-context.md +12 -0
- package/src/prompts/goals/guided-goal-interview.md +43 -0
- package/src/prompts/memories/consolidation.md +30 -0
- package/src/prompts/memories/consolidation_system.md +4 -0
- package/src/prompts/memories/read-path.md +17 -0
- package/src/prompts/memories/stage_one_input.md +6 -0
- package/src/prompts/memories/stage_one_system.md +21 -0
- package/src/prompts/review-custom-request.md +21 -0
- package/src/prompts/review-headless-request.md +16 -0
- package/src/prompts/review-request.md +68 -0
- package/src/prompts/security/scan-coordinator.md +7 -0
- package/src/prompts/security/scan-request.md +21 -0
- package/src/prompts/security/validate-request.md +8 -0
- package/src/prompts/session/launch-completion.md +1 -0
- package/src/prompts/skills/autoload.md +8 -0
- package/src/prompts/skills/user-invocation.md +11 -0
- package/src/prompts/steering/parent-irc.md +5 -0
- package/src/prompts/steering/user-interjection.md +6 -0
- package/src/prompts/system/active-repo-context.md +4 -0
- package/src/prompts/system/agent-creation-architect.md +50 -0
- package/src/prompts/system/agent-creation-user.md +6 -0
- package/src/prompts/system/auto-continue.md +1 -0
- package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
- package/src/prompts/system/auto-thinking-difficulty.md +14 -0
- package/src/prompts/system/autolearn-guidance-learn.md +1 -0
- package/src/prompts/system/autolearn-guidance.md +7 -0
- package/src/prompts/system/autolearn-nudge-autocontinue.md +5 -0
- package/src/prompts/system/background-tan-dispatch.md +8 -0
- package/src/prompts/system/btw-user.md +8 -0
- package/src/prompts/system/commit-message-system.md +14 -0
- package/src/prompts/system/computer-safety.md +14 -0
- package/src/prompts/system/custom-system-prompt.md +64 -0
- package/src/prompts/system/eager-task.md +7 -0
- package/src/prompts/system/eager-todo.md +18 -0
- package/src/prompts/system/empty-stop-retry.md +4 -0
- package/src/prompts/system/gemini-tool-call-reminder.md +9 -0
- package/src/prompts/system/interrupted-thinking.md +7 -0
- package/src/prompts/system/irc-autoreply.md +6 -0
- package/src/prompts/system/irc-incoming.md +9 -0
- package/src/prompts/system/manual-continue.md +7 -0
- package/src/prompts/system/mcp-xdev-guidance.md +11 -0
- package/src/prompts/system/memory-consolidation-system.md +8 -0
- package/src/prompts/system/memory-extraction-system.md +26 -0
- package/src/prompts/system/mid-run-todo-nudge.md +3 -0
- package/src/prompts/system/omfg-user.md +50 -0
- package/src/prompts/system/orchestrate-notice.md +40 -0
- package/src/prompts/system/personalities/default.md +18 -0
- package/src/prompts/system/personalities/friendly.md +17 -0
- package/src/prompts/system/personalities/pragmatic.md +15 -0
- package/src/prompts/system/plan-mode-active.md +125 -0
- package/src/prompts/system/plan-mode-approved.md +22 -0
- package/src/prompts/system/plan-mode-compact-instructions.md +17 -0
- package/src/prompts/system/plan-mode-reference.md +10 -0
- package/src/prompts/system/plan-mode-subagent.md +33 -0
- package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
- package/src/prompts/system/plan-yolo-handoff.md +5 -0
- package/src/prompts/system/prewalk-checklist.md +7 -0
- package/src/prompts/system/prewalk-continue.md +1 -0
- package/src/prompts/system/prewalk-plan.md +13 -0
- package/src/prompts/system/project-prompt.md +61 -0
- package/src/prompts/system/recap-user.md +9 -0
- package/src/prompts/system/resolve-device-reminder.md +3 -0
- package/src/prompts/system/rewind-report.md +6 -0
- package/src/prompts/system/side-channel-no-tools.md +3 -0
- package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
- package/src/prompts/system/snapcompact-context-stub.md +1 -0
- package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
- package/src/prompts/system/snapcompact-system-stub.md +1 -0
- package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
- package/src/prompts/system/speech-rewrite.md +15 -0
- package/src/prompts/system/subagent-async-pending.md +6 -0
- package/src/prompts/system/subagent-system-prompt.md +73 -0
- package/src/prompts/system/subagent-user-prompt.md +3 -0
- package/src/prompts/system/subagent-yield-reminder.md +23 -0
- package/src/prompts/system/system-prompt.md +263 -0
- package/src/prompts/system/tan-context-switch.md +17 -0
- package/src/prompts/system/task-label.md +23 -0
- package/src/prompts/system/thinking-loop-redirect.md +10 -0
- package/src/prompts/system/title-marker-instruction.md +1 -0
- package/src/prompts/system/title-system.md +16 -0
- package/src/prompts/system/tool-call-loop-redirect.md +8 -0
- package/src/prompts/system/ttsr-interrupt.md +7 -0
- package/src/prompts/system/ttsr-tool-reminder.md +5 -0
- package/src/prompts/system/ultrathink-notice.md +3 -0
- package/src/prompts/system/unexpected-stop-classifier.md +17 -0
- package/src/prompts/system/unexpected-stop-retry.md +4 -0
- package/src/prompts/system/vibe-mode-active.md +26 -0
- package/src/prompts/system/web-search.md +25 -0
- package/src/prompts/system/workflow-notice.md +112 -0
- package/src/prompts/system/xdev-mount-notice.md +20 -0
- package/src/prompts/tools/apply-patch.md +65 -0
- package/src/prompts/tools/ask.md +22 -0
- package/src/prompts/tools/ast-edit.md +11 -0
- package/src/prompts/tools/ast-grep.md +19 -0
- package/src/prompts/tools/async-result.md +8 -0
- package/src/prompts/tools/bash.md +23 -0
- package/src/prompts/tools/browser.md +29 -0
- package/src/prompts/tools/checkpoint.md +15 -0
- package/src/prompts/tools/computer.md +26 -0
- package/src/prompts/tools/debug.md +3 -0
- package/src/prompts/tools/eval.md +45 -0
- package/src/prompts/tools/github.md +22 -0
- package/src/prompts/tools/glob.md +16 -0
- package/src/prompts/tools/goal.md +11 -0
- package/src/prompts/tools/grep.md +13 -0
- package/src/prompts/tools/hub.md +34 -0
- package/src/prompts/tools/image-attachment-describe-system.md +8 -0
- package/src/prompts/tools/image-attachment-describe.md +10 -0
- package/src/prompts/tools/image-gen.md +7 -0
- package/src/prompts/tools/inspect-image-system.md +20 -0
- package/src/prompts/tools/inspect-image.md +22 -0
- package/src/prompts/tools/learn.md +7 -0
- package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
- package/src/prompts/tools/lsp.md +19 -0
- package/src/prompts/tools/manage-skill.md +9 -0
- package/src/prompts/tools/memory-edit.md +12 -0
- package/src/prompts/tools/patch.md +57 -0
- package/src/prompts/tools/read.md +27 -0
- package/src/prompts/tools/recall.md +7 -0
- package/src/prompts/tools/reflect.md +5 -0
- package/src/prompts/tools/replace.md +30 -0
- package/src/prompts/tools/retain.md +6 -0
- package/src/prompts/tools/rewind.md +14 -0
- package/src/prompts/tools/security-publish.md +1 -0
- package/src/prompts/tools/security-scan.md +1 -0
- package/src/prompts/tools/task-async-contract.md +1 -0
- package/src/prompts/tools/task-summary.md +20 -0
- package/src/prompts/tools/task.md +83 -0
- package/src/prompts/tools/todo.md +42 -0
- package/src/prompts/tools/vibe-kill.md +3 -0
- package/src/prompts/tools/vibe-list.md +3 -0
- package/src/prompts/tools/vibe-send.md +9 -0
- package/src/prompts/tools/vibe-spawn.md +10 -0
- package/src/prompts/tools/vibe-turn-result.md +19 -0
- package/src/prompts/tools/vibe-wait.md +8 -0
- package/src/prompts/tools/web-search.md +8 -0
- package/src/prompts/tools/write.md +14 -0
- package/src/registry/agent-lifecycle.ts +505 -0
- package/src/registry/agent-registry.ts +287 -0
- package/src/registry/persisted-agents.ts +423 -0
- package/src/sdk.ts +3820 -0
- package/src/secrets/index.ts +375 -0
- package/src/secrets/obfuscator.ts +2629 -0
- package/src/secrets/regex.ts +21 -0
- package/src/security/auth.ts +98 -0
- package/src/security/cloud.ts +686 -0
- package/src/security/comparison.ts +255 -0
- package/src/security/contracts/ids.ts +111 -0
- package/src/security/contracts/index.ts +4 -0
- package/src/security/contracts/schemas.ts +219 -0
- package/src/security/contracts/types.ts +254 -0
- package/src/security/contracts/validation.ts +69 -0
- package/src/security/coordinator.ts +708 -0
- package/src/security/importers/codex-security.ts +387 -0
- package/src/security/importers/index.ts +2 -0
- package/src/security/importers/sarif.ts +357 -0
- package/src/security/index.ts +13 -0
- package/src/security/preflight.ts +405 -0
- package/src/security/provenance.ts +106 -0
- package/src/security/publication.ts +326 -0
- package/src/security/remediation.ts +93 -0
- package/src/security/resource-output.ts +50 -0
- package/src/security/sarif.ts +78 -0
- package/src/security/store.ts +430 -0
- package/src/session/acp-permission-gate.ts +165 -0
- package/src/session/agent-session-events.ts +67 -0
- package/src/session/agent-session-types.ts +407 -0
- package/src/session/agent-session.ts +9000 -0
- package/src/session/agent-storage.ts +807 -0
- package/src/session/artifacts.ts +154 -0
- package/src/session/async-job-delivery.ts +82 -0
- package/src/session/auth-broker-config.ts +92 -0
- package/src/session/auth-storage.ts +25 -0
- package/src/session/bash-runner.ts +326 -0
- package/src/session/blob-store.ts +295 -0
- package/src/session/checkpoint-entries.ts +81 -0
- package/src/session/claude-session-store.ts +426 -0
- package/src/session/client-bridge.ts +85 -0
- package/src/session/codex-auto-reset.ts +673 -0
- package/src/session/codex-session-store.ts +673 -0
- package/src/session/compact-modes.ts +105 -0
- package/src/session/credential-pin.ts +93 -0
- package/src/session/eval-runner.ts +219 -0
- package/src/session/exit-diagnostics.ts +310 -0
- package/src/session/foreign-session-import.ts +52 -0
- package/src/session/foreign-session-jsonl.ts +29 -0
- package/src/session/foreign-session-store.ts +26 -0
- package/src/session/history-storage.ts +329 -0
- package/src/session/indexed-session-storage.ts +553 -0
- package/src/session/irc-bridge.ts +203 -0
- package/src/session/launch-completion.ts +37 -0
- package/src/session/messages.ts +1304 -0
- package/src/session/model-controls.ts +757 -0
- package/src/session/prewalk.ts +279 -0
- package/src/session/provider-image-budget.ts +86 -0
- package/src/session/queued-messages.ts +99 -0
- package/src/session/redis-session-storage.ts +257 -0
- package/src/session/retry-fallback-chains.ts +455 -0
- package/src/session/role-models.ts +85 -0
- package/src/session/session-advisors.ts +1896 -0
- package/src/session/session-context.ts +584 -0
- package/src/session/session-dump-format.ts +216 -0
- package/src/session/session-entries.ts +306 -0
- package/src/session/session-handoff.ts +325 -0
- package/src/session/session-history-format.ts +459 -0
- package/src/session/session-listing.ts +715 -0
- package/src/session/session-loader.ts +362 -0
- package/src/session/session-maintenance.ts +3115 -0
- package/src/session/session-manager.ts +2747 -0
- package/src/session/session-memory.ts +222 -0
- package/src/session/session-metadata.ts +53 -0
- package/src/session/session-migrations.ts +78 -0
- package/src/session/session-paths.ts +280 -0
- package/src/session/session-persistence.ts +293 -0
- package/src/session/session-provider-boundary.ts +306 -0
- package/src/session/session-stats.ts +349 -0
- package/src/session/session-storage.ts +774 -0
- package/src/session/session-title-slot.ts +141 -0
- package/src/session/session-tools.ts +1385 -0
- package/src/session/session-workspace.ts +53 -0
- package/src/session/settings-stream-fn.ts +79 -0
- package/src/session/shake-types.ts +43 -0
- package/src/session/snapcompact-inline.ts +545 -0
- package/src/session/snapcompact-savings-journal.ts +113 -0
- package/src/session/sql-session-storage.ts +374 -0
- package/src/session/stream-guards.ts +417 -0
- package/src/session/streaming-output.ts +1459 -0
- package/src/session/todo-tracker.ts +380 -0
- package/src/session/tool-choice-queue.ts +305 -0
- package/src/session/ttsr-coordinator.ts +496 -0
- package/src/session/turn-persistence.ts +142 -0
- package/src/session/turn-recovery.ts +2005 -0
- package/src/session/unexpected-stop-classifier.ts +141 -0
- package/src/session/yield-queue.ts +288 -0
- package/src/slash-commands/acp-builtins.ts +70 -0
- package/src/slash-commands/available-commands.ts +105 -0
- package/src/slash-commands/builtin-registry.ts +3149 -0
- package/src/slash-commands/helpers/active-oauth-account.ts +80 -0
- package/src/slash-commands/helpers/collab-qrcode.ts +28 -0
- package/src/slash-commands/helpers/context-report.ts +66 -0
- package/src/slash-commands/helpers/format.ts +46 -0
- package/src/slash-commands/helpers/logout.ts +108 -0
- package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
- package/src/slash-commands/helpers/mcp.ts +533 -0
- package/src/slash-commands/helpers/parse.ts +85 -0
- package/src/slash-commands/helpers/reset-usage.ts +68 -0
- package/src/slash-commands/helpers/security.ts +451 -0
- package/src/slash-commands/helpers/session-pin.ts +44 -0
- package/src/slash-commands/helpers/ssh.ts +196 -0
- package/src/slash-commands/helpers/stats-dashboard.ts +86 -0
- package/src/slash-commands/helpers/todo.ts +285 -0
- package/src/slash-commands/helpers/usage-report.ts +198 -0
- package/src/slash-commands/marketplace-install-parser.ts +99 -0
- package/src/slash-commands/types.ts +139 -0
- package/src/ssh/config-writer.ts +183 -0
- package/src/ssh/connection-manager.ts +667 -0
- package/src/ssh/file-transfer.ts +214 -0
- package/src/ssh/sshfs-mount.ts +163 -0
- package/src/ssh/utils.ts +51 -0
- package/src/startup-splash.ts +19 -0
- package/src/stt/asr-client.ts +401 -0
- package/src/stt/asr-protocol.ts +65 -0
- package/src/stt/asr-worker.ts +603 -0
- package/src/stt/downloader.ts +142 -0
- package/src/stt/endpointer.ts +259 -0
- package/src/stt/index.ts +6 -0
- package/src/stt/models.ts +150 -0
- package/src/stt/sherpa-runtime.ts +71 -0
- package/src/stt/stt-controller.ts +320 -0
- package/src/stt/submit-trigger.ts +74 -0
- package/src/subprocess/worker-client.ts +463 -0
- package/src/subprocess/worker-runtime.ts +494 -0
- package/src/system-prompt.ts +921 -0
- package/src/task/agents.ts +170 -0
- package/src/task/commands.ts +132 -0
- package/src/task/discovery.ts +145 -0
- package/src/task/executor.ts +3431 -0
- package/src/task/index.ts +1515 -0
- package/src/task/isolation-ownership.ts +106 -0
- package/src/task/isolation-runner.ts +444 -0
- package/src/task/label.ts +40 -0
- package/src/task/name-generator.ts +1577 -0
- package/src/task/omp-command.ts +26 -0
- package/src/task/output-manager.ts +115 -0
- package/src/task/parallel.ts +221 -0
- package/src/task/persisted-revive.ts +173 -0
- package/src/task/prewalk.ts +6 -0
- package/src/task/prompt-policy.ts +8 -0
- package/src/task/provider-concurrency.ts +100 -0
- package/src/task/read-only-policy.ts +27 -0
- package/src/task/render.ts +1830 -0
- package/src/task/renderer.ts +14 -0
- package/src/task/repair-args.ts +118 -0
- package/src/task/spawn-policy.ts +72 -0
- package/src/task/structured-subagent.ts +676 -0
- package/src/task/subprocess-tool-registry.ts +88 -0
- package/src/task/types.ts +555 -0
- package/src/task/worktree.ts +967 -0
- package/src/task/yield-assembly.ts +198 -0
- package/src/telemetry-export.ts +504 -0
- package/src/thinking.ts +377 -0
- package/src/tiny/device.ts +111 -0
- package/src/tiny/dtype.ts +101 -0
- package/src/tiny/message-preproc.ts +155 -0
- package/src/tiny/models.ts +268 -0
- package/src/tiny/text.ts +290 -0
- package/src/tiny/title-client.ts +460 -0
- package/src/tiny/title-protocol.ts +56 -0
- package/src/tiny/worker.ts +354 -0
- package/src/tools/acp-bridge.ts +125 -0
- package/src/tools/approval.ts +245 -0
- package/src/tools/ask.ts +1459 -0
- package/src/tools/ast-edit.ts +718 -0
- package/src/tools/ast-grep.ts +526 -0
- package/src/tools/auto-generated-guard.ts +335 -0
- package/src/tools/bash-interactive.ts +435 -0
- package/src/tools/bash-interceptor.ts +148 -0
- package/src/tools/bash-pty-selection.ts +14 -0
- package/src/tools/bash-skill-urls.ts +350 -0
- package/src/tools/bash.ts +1826 -0
- package/src/tools/browser/aria/aria-snapshot.bundle.txt +7 -0
- package/src/tools/browser/aria/aria-snapshot.ts +131 -0
- package/src/tools/browser/attach.ts +219 -0
- package/src/tools/browser/cmux/cmux-tab.ts +1531 -0
- package/src/tools/browser/cmux/rpc.ts +200 -0
- package/src/tools/browser/cmux/socket-client.ts +445 -0
- package/src/tools/browser/launch.ts +939 -0
- package/src/tools/browser/readable.ts +112 -0
- package/src/tools/browser/registry.ts +447 -0
- package/src/tools/browser/relay/bridge.ts +945 -0
- package/src/tools/browser/relay/daemon.ts +117 -0
- package/src/tools/browser/relay/extension-assets/background.js.txt +242 -0
- package/src/tools/browser/relay/extension-assets/manifest.json.txt +14 -0
- package/src/tools/browser/relay/extension-assets/options.html.txt +53 -0
- package/src/tools/browser/relay/extension-assets/options.js.txt +23 -0
- package/src/tools/browser/relay/kind.ts +41 -0
- package/src/tools/browser/relay/protocol.ts +54 -0
- package/src/tools/browser/relay/server.ts +141 -0
- package/src/tools/browser/render.ts +229 -0
- package/src/tools/browser/run-output.ts +76 -0
- package/src/tools/browser/shared-daemon.ts +139 -0
- package/src/tools/browser/tab-protocol.ts +123 -0
- package/src/tools/browser/tab-supervisor.ts +1077 -0
- package/src/tools/browser/tab-worker-entry.ts +29 -0
- package/src/tools/browser/tab-worker.ts +1982 -0
- package/src/tools/browser.ts +487 -0
- package/src/tools/builtin-names.ts +67 -0
- package/src/tools/checkpoint.ts +137 -0
- package/src/tools/computer/exposure.ts +14 -0
- package/src/tools/computer/protocol.ts +69 -0
- package/src/tools/computer/supervisor.ts +409 -0
- package/src/tools/computer/worker-entry.ts +39 -0
- package/src/tools/computer/worker.ts +745 -0
- package/src/tools/computer-renderer.ts +147 -0
- package/src/tools/computer.ts +222 -0
- package/src/tools/conflict-detect.ts +815 -0
- package/src/tools/context.ts +49 -0
- package/src/tools/debug.ts +1121 -0
- package/src/tools/default-renderer.ts +154 -0
- package/src/tools/essential-tools.ts +46 -0
- package/src/tools/eval-backends.ts +34 -0
- package/src/tools/eval-format/index.ts +24 -0
- package/src/tools/eval-format/javascript.ts +952 -0
- package/src/tools/eval-format/julia.ts +446 -0
- package/src/tools/eval-format/python.ts +544 -0
- package/src/tools/eval-format/ruby.ts +380 -0
- package/src/tools/eval-render.ts +784 -0
- package/src/tools/eval.ts +774 -0
- package/src/tools/fetch.ts +1889 -0
- package/src/tools/file-recorder.ts +35 -0
- package/src/tools/fs-cache-invalidation.ts +28 -0
- package/src/tools/gh-cache-invalidation.ts +175 -0
- package/src/tools/gh-format.ts +12 -0
- package/src/tools/gh-renderer.ts +484 -0
- package/src/tools/gh.ts +3958 -0
- package/src/tools/github-cache.ts +663 -0
- package/src/tools/glob.ts +691 -0
- package/src/tools/grep.ts +1920 -0
- package/src/tools/grouped-file-output.ts +210 -0
- package/src/tools/hub/index.ts +579 -0
- package/src/tools/hub/jobs.ts +714 -0
- package/src/tools/hub/launch.ts +690 -0
- package/src/tools/hub/messaging.ts +735 -0
- package/src/tools/hub/types.ts +117 -0
- package/src/tools/image-gen.ts +1689 -0
- package/src/tools/image-providers.ts +50 -0
- package/src/tools/index.ts +736 -0
- package/src/tools/inspect-image-renderer.ts +133 -0
- package/src/tools/inspect-image.ts +316 -0
- package/src/tools/json-tree.ts +260 -0
- package/src/tools/jtd-to-json-schema.ts +219 -0
- package/src/tools/jtd-to-typescript.ts +136 -0
- package/src/tools/jtd-utils.ts +102 -0
- package/src/tools/learn.ts +141 -0
- package/src/tools/list-limit.ts +40 -0
- package/src/tools/manage-skill.ts +102 -0
- package/src/tools/match-line-format.ts +20 -0
- package/src/tools/memory-edit.ts +61 -0
- package/src/tools/memory-recall.ts +102 -0
- package/src/tools/memory-reflect.ts +88 -0
- package/src/tools/memory-render.ts +211 -0
- package/src/tools/memory-retain.ts +89 -0
- package/src/tools/output-meta.ts +860 -0
- package/src/tools/output-schema-validator.ts +307 -0
- package/src/tools/path-utils.ts +1489 -0
- package/src/tools/plan-mode-guard.ts +155 -0
- package/src/tools/puppeteer/00_stealth_tampering.txt +44 -0
- package/src/tools/puppeteer/01_stealth_activity.txt +80 -0
- package/src/tools/puppeteer/02_stealth_hairline.txt +57 -0
- package/src/tools/puppeteer/03_stealth_botd.txt +380 -0
- package/src/tools/puppeteer/04_stealth_iframe.txt +174 -0
- package/src/tools/puppeteer/05_stealth_webgl.txt +233 -0
- package/src/tools/puppeteer/06_stealth_screen.txt +260 -0
- package/src/tools/puppeteer/07_stealth_fonts.txt +99 -0
- package/src/tools/puppeteer/08_stealth_audio.txt +63 -0
- package/src/tools/puppeteer/09_stealth_locale.txt +51 -0
- package/src/tools/puppeteer/10_stealth_plugins.txt +212 -0
- package/src/tools/puppeteer/11_stealth_hardware.txt +59 -0
- package/src/tools/puppeteer/12_stealth_codecs.txt +42 -0
- package/src/tools/puppeteer/13_stealth_worker.txt +235 -0
- package/src/tools/read.ts +3762 -0
- package/src/tools/render-utils.ts +926 -0
- package/src/tools/renderers.ts +133 -0
- package/src/tools/report-tool-issue.ts +568 -0
- package/src/tools/resolve.ts +423 -0
- package/src/tools/review.ts +103 -0
- package/src/tools/run-scope.ts +417 -0
- package/src/tools/security-scan.ts +287 -0
- package/src/tools/shell-tokenize.ts +213 -0
- package/src/tools/sqlite-reader.ts +884 -0
- package/src/tools/terminal-output.ts +141 -0
- package/src/tools/todo.ts +1226 -0
- package/src/tools/tool-errors.ts +62 -0
- package/src/tools/tool-result.ts +102 -0
- package/src/tools/tool-timeouts.ts +38 -0
- package/src/tools/tts.ts +266 -0
- package/src/tools/vibe.ts +608 -0
- package/src/tools/write.ts +1646 -0
- package/src/tools/xdev.ts +560 -0
- package/src/tools/yield.ts +486 -0
- package/src/tts/downloader.ts +64 -0
- package/src/tts/index.ts +10 -0
- package/src/tts/models.ts +137 -0
- package/src/tts/runtime.ts +21 -0
- package/src/tts/speakable.ts +392 -0
- package/src/tts/speech-enhancer.ts +206 -0
- package/src/tts/streaming-player.ts +120 -0
- package/src/tts/tts-client.ts +475 -0
- package/src/tts/tts-protocol.ts +69 -0
- package/src/tts/tts-worker.ts +434 -0
- package/src/tts/vocalizer.ts +419 -0
- package/src/tts/wav.ts +58 -0
- package/src/tui/code-cell.ts +268 -0
- package/src/tui/file-list.ts +55 -0
- package/src/tui/hyperlink.ts +178 -0
- package/src/tui/index.ts +13 -0
- package/src/tui/output-block.ts +268 -0
- package/src/tui/status-line.ts +54 -0
- package/src/tui/tree-list.ts +172 -0
- package/src/tui/types.ts +15 -0
- package/src/tui/utils.ts +103 -0
- package/src/tui/width-aware-text.ts +58 -0
- package/src/utils/active-repo-context.ts +143 -0
- package/src/utils/block-context.ts +312 -0
- package/src/utils/changelog.ts +373 -0
- package/src/utils/clipboard.ts +361 -0
- package/src/utils/command-args.ts +74 -0
- package/src/utils/commit-message-generator.ts +148 -0
- package/src/utils/cpuprofile.ts +235 -0
- package/src/utils/edit-mode.ts +61 -0
- package/src/utils/enhanced-paste.ts +230 -0
- package/src/utils/event-bus.ts +33 -0
- package/src/utils/external-editor.ts +80 -0
- package/src/utils/fetch-timeout.ts +10 -0
- package/src/utils/file-display-mode.ts +44 -0
- package/src/utils/file-mentions.ts +293 -0
- package/src/utils/git.ts +2472 -0
- package/src/utils/image-loading.ts +236 -0
- package/src/utils/image-resize.ts +420 -0
- package/src/utils/image-vision-fallback.ts +196 -0
- package/src/utils/inspect-image-mode.ts +39 -0
- package/src/utils/ipc.ts +38 -0
- package/src/utils/jj.ts +422 -0
- package/src/utils/lang-from-path.ts +251 -0
- package/src/utils/late-cleanup.ts +17 -0
- package/src/utils/local-date.ts +7 -0
- package/src/utils/mac-file-urls.applescript +37 -0
- package/src/utils/markit-cache.ts +166 -0
- package/src/utils/markit.ts +223 -0
- package/src/utils/mupdf-wasm-embed.ts +12 -0
- package/src/utils/open.ts +126 -0
- package/src/utils/profile-tree.ts +111 -0
- package/src/utils/prompt-path.ts +3 -0
- package/src/utils/qrcode.ts +535 -0
- package/src/utils/sample-profile.ts +437 -0
- package/src/utils/session-color.ts +142 -0
- package/src/utils/shell-snapshot-fn-env.sh +63 -0
- package/src/utils/shell-snapshot.ts +326 -0
- package/src/utils/sixel.ts +69 -0
- package/src/utils/thinking-display.ts +163 -0
- package/src/utils/title-generator.ts +597 -0
- package/src/utils/token-rate.ts +72 -0
- package/src/utils/tool-choice.ts +50 -0
- package/src/utils/tools-manager.ts +411 -0
- package/src/utils/turndown.ts +82 -0
- package/src/utils/zip.ts +1106 -0
- package/src/vibe/runtime.ts +1684 -0
- package/src/vibe/state.ts +4 -0
- package/src/web/kagi.ts +305 -0
- package/src/web/parallel.ts +354 -0
- package/src/web/scrapers/artifacthub.ts +207 -0
- package/src/web/scrapers/arxiv.ts +83 -0
- package/src/web/scrapers/aur.ts +162 -0
- package/src/web/scrapers/biorxiv.ts +133 -0
- package/src/web/scrapers/bluesky.ts +262 -0
- package/src/web/scrapers/brew.ts +172 -0
- package/src/web/scrapers/cheatsh.ts +68 -0
- package/src/web/scrapers/chocolatey.ts +196 -0
- package/src/web/scrapers/choosealicense.ts +95 -0
- package/src/web/scrapers/cisa-kev.ts +87 -0
- package/src/web/scrapers/clojars.ts +154 -0
- package/src/web/scrapers/coingecko.ts +177 -0
- package/src/web/scrapers/crates-io.ts +97 -0
- package/src/web/scrapers/crossref.ts +136 -0
- package/src/web/scrapers/devto.ts +147 -0
- package/src/web/scrapers/discogs.ts +306 -0
- package/src/web/scrapers/discourse.ts +197 -0
- package/src/web/scrapers/dockerhub.ts +138 -0
- package/src/web/scrapers/docs-rs.ts +663 -0
- package/src/web/scrapers/fdroid.ts +134 -0
- package/src/web/scrapers/firefox-addons.ts +191 -0
- package/src/web/scrapers/flathub.ts +223 -0
- package/src/web/scrapers/github-gist.ts +58 -0
- package/src/web/scrapers/github.ts +800 -0
- package/src/web/scrapers/gitlab.ts +401 -0
- package/src/web/scrapers/go-pkg.ts +266 -0
- package/src/web/scrapers/hackage.ts +129 -0
- package/src/web/scrapers/hackernews.ts +189 -0
- package/src/web/scrapers/hex.ts +105 -0
- package/src/web/scrapers/huggingface.ts +321 -0
- package/src/web/scrapers/iacr.ts +89 -0
- package/src/web/scrapers/index.ts +252 -0
- package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
- package/src/web/scrapers/lemmy.ts +203 -0
- package/src/web/scrapers/lobsters.ts +175 -0
- package/src/web/scrapers/mastodon.ts +292 -0
- package/src/web/scrapers/maven.ts +138 -0
- package/src/web/scrapers/mdn.ts +173 -0
- package/src/web/scrapers/metacpan.ts +222 -0
- package/src/web/scrapers/musicbrainz.ts +250 -0
- package/src/web/scrapers/npm.ts +98 -0
- package/src/web/scrapers/nuget.ts +183 -0
- package/src/web/scrapers/nvd.ts +222 -0
- package/src/web/scrapers/ollama.ts +239 -0
- package/src/web/scrapers/open-vsx.ts +106 -0
- package/src/web/scrapers/opencorporates.ts +292 -0
- package/src/web/scrapers/openlibrary.ts +336 -0
- package/src/web/scrapers/orcid.ts +286 -0
- package/src/web/scrapers/osv.ts +176 -0
- package/src/web/scrapers/packagist.ts +160 -0
- package/src/web/scrapers/pub-dev.ts +143 -0
- package/src/web/scrapers/pubmed.ts +211 -0
- package/src/web/scrapers/pypi.ts +112 -0
- package/src/web/scrapers/rawg.ts +110 -0
- package/src/web/scrapers/readthedocs.ts +121 -0
- package/src/web/scrapers/reddit.ts +95 -0
- package/src/web/scrapers/repology.ts +251 -0
- package/src/web/scrapers/rfc.ts +201 -0
- package/src/web/scrapers/rubygems.ts +103 -0
- package/src/web/scrapers/searchcode.ts +189 -0
- package/src/web/scrapers/sec-edgar.ts +261 -0
- package/src/web/scrapers/semantic-scholar.ts +171 -0
- package/src/web/scrapers/snapcraft.ts +187 -0
- package/src/web/scrapers/sourcegraph.ts +336 -0
- package/src/web/scrapers/spdx.ts +108 -0
- package/src/web/scrapers/spotify.ts +198 -0
- package/src/web/scrapers/stackoverflow.ts +120 -0
- package/src/web/scrapers/terraform.ts +277 -0
- package/src/web/scrapers/tldr.ts +47 -0
- package/src/web/scrapers/twitter.ts +94 -0
- package/src/web/scrapers/types.ts +354 -0
- package/src/web/scrapers/utils.ts +109 -0
- package/src/web/scrapers/vimeo.ts +133 -0
- package/src/web/scrapers/vscode-marketplace.ts +187 -0
- package/src/web/scrapers/w3c.ts +156 -0
- package/src/web/scrapers/wikidata.ts +344 -0
- package/src/web/scrapers/wikipedia.ts +84 -0
- package/src/web/scrapers/youtube.ts +325 -0
- package/src/web/search/index.ts +393 -0
- package/src/web/search/provider.ts +272 -0
- package/src/web/search/providers/anthropic.ts +406 -0
- package/src/web/search/providers/base.ts +112 -0
- package/src/web/search/providers/brave.ts +181 -0
- package/src/web/search/providers/browser-headers.ts +82 -0
- package/src/web/search/providers/browser-page.ts +125 -0
- package/src/web/search/providers/codex.ts +788 -0
- package/src/web/search/providers/duckduckgo.ts +382 -0
- package/src/web/search/providers/ecosia.ts +183 -0
- package/src/web/search/providers/exa.ts +513 -0
- package/src/web/search/providers/firecrawl.ts +213 -0
- package/src/web/search/providers/gemini.ts +634 -0
- package/src/web/search/providers/google.ts +195 -0
- package/src/web/search/providers/jina.ts +144 -0
- package/src/web/search/providers/kagi.ts +98 -0
- package/src/web/search/providers/kimi.ts +221 -0
- package/src/web/search/providers/mojeek.ts +220 -0
- package/src/web/search/providers/parallel.ts +186 -0
- package/src/web/search/providers/perplexity-auth.ts +142 -0
- package/src/web/search/providers/perplexity.ts +997 -0
- package/src/web/search/providers/public.ts +199 -0
- package/src/web/search/providers/searxng.ts +467 -0
- package/src/web/search/providers/startpage.ts +225 -0
- package/src/web/search/providers/synthetic.ts +126 -0
- package/src/web/search/providers/tavily.ts +244 -0
- package/src/web/search/providers/tinyfish.ts +166 -0
- package/src/web/search/providers/utils.ts +130 -0
- package/src/web/search/providers/xai.ts +372 -0
- package/src/web/search/providers/zai.ts +452 -0
- package/src/web/search/query.ts +850 -0
- package/src/web/search/render.ts +262 -0
- package/src/web/search/types.ts +518 -0
- package/src/web/search/utils.ts +17 -0
- package/src/workspace-tree.ts +326 -0
|
@@ -0,0 +1,1077 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP discovery protocols for configured and implicit providers — ollama,
|
|
3
|
+
* llama.cpp, lm-studio, openai-models-list, and new-api/one-api-style proxies.
|
|
4
|
+
* `ModelRegistry` owns the orchestration (status, state, caching) and calls
|
|
5
|
+
* `discoverModelsByProviderType` with a `DiscoveryContext`; built-in provider
|
|
6
|
+
* discovery lives in pi-catalog's provider-models.
|
|
7
|
+
*/
|
|
8
|
+
import { type ApiKey, type FetchImpl, withAuth } from "@oh-my-pi/pi-ai";
|
|
9
|
+
import type { Api, Model, RemoteCompactionConfig } from "@oh-my-pi/pi-ai/types";
|
|
10
|
+
import { buildModel } from "@oh-my-pi/pi-catalog/build";
|
|
11
|
+
import {
|
|
12
|
+
getBundledModelReferenceIndex,
|
|
13
|
+
inheritReferenceThinking,
|
|
14
|
+
isQwenModelId,
|
|
15
|
+
resolveModelReference,
|
|
16
|
+
stripBracketedModelIdAffixes,
|
|
17
|
+
} from "@oh-my-pi/pi-catalog/identity";
|
|
18
|
+
import {
|
|
19
|
+
fetchLiteLLMRichModels,
|
|
20
|
+
fetchLmStudioNativeModelMetadata,
|
|
21
|
+
OPENAI_COMPAT_DISCOVERY_DEFAULT_CONTEXT_WINDOW,
|
|
22
|
+
OPENAI_COMPAT_DISCOVERY_DEFAULT_MAX_TOKENS,
|
|
23
|
+
} from "@oh-my-pi/pi-catalog/provider-models/openai-compat";
|
|
24
|
+
import type { ModelSpec, OpenAICompat } from "@oh-my-pi/pi-catalog/types";
|
|
25
|
+
import { isRecord } from "@oh-my-pi/pi-utils";
|
|
26
|
+
import type { ProviderDiscovery } from "./models-config-schema";
|
|
27
|
+
|
|
28
|
+
// Default cap on `max_tokens` for auto-discovered models that do not advertise
|
|
29
|
+
// their own output limit (OpenAI-models-list, Ollama, llama.cpp, new-api/
|
|
30
|
+
// one-api proxies). 32K matches the upper end of what mainstream
|
|
31
|
+
// OpenAI-compatible providers (DeepSeek, MiMo, OpenRouter, etc.) actually
|
|
32
|
+
// accept and keeps `min(contextWindow, …)` honoring smaller local windows.
|
|
33
|
+
// Conservative caps below this caused providers to drop the connection
|
|
34
|
+
// mid-stream when models hit the cap on legitimate large tool calls (see
|
|
35
|
+
// issue #1528: `write` payloads >~5KB on deepseek-v4-pro surfaced as
|
|
36
|
+
// "socket connection was closed unexpectedly").
|
|
37
|
+
export const DISCOVERY_DEFAULT_CONTEXT_WINDOW = OPENAI_COMPAT_DISCOVERY_DEFAULT_CONTEXT_WINDOW;
|
|
38
|
+
export const DISCOVERY_DEFAULT_MAX_TOKENS = OPENAI_COMPAT_DISCOVERY_DEFAULT_MAX_TOKENS;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Run `fn` with a hard deadline while also signalling cooperative transports
|
|
42
|
+
* to abort. The independent rejection keeps discovery bounded when a runtime
|
|
43
|
+
* leaves its fetch promise pending after `AbortSignal.abort()` (observed with
|
|
44
|
+
* Windows localhost probes).
|
|
45
|
+
*
|
|
46
|
+
* The backing timer is cleared as soon as `fn` settles, unlike
|
|
47
|
+
* `AbortSignal.timeout()`, whose delayed reason previously crashed Bun's
|
|
48
|
+
* concurrent GC during an unrelated allocation.
|
|
49
|
+
*/
|
|
50
|
+
async function withTimeoutSignal<T>(timeoutMs: number, fn: (signal: AbortSignal) => Promise<T>): Promise<T> {
|
|
51
|
+
const controller = new AbortController();
|
|
52
|
+
const timeout = Promise.withResolvers<never>();
|
|
53
|
+
const timer = setTimeout(() => {
|
|
54
|
+
const error = new DOMException("The operation timed out.", "TimeoutError");
|
|
55
|
+
controller.abort(error);
|
|
56
|
+
timeout.reject(error);
|
|
57
|
+
}, timeoutMs);
|
|
58
|
+
try {
|
|
59
|
+
return await Promise.race([fn(controller.signal), timeout.promise]);
|
|
60
|
+
} finally {
|
|
61
|
+
clearTimeout(timer);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Generous discovery budget for a non-loopback (remote / LAN) inference host. */
|
|
66
|
+
const REMOTE_DISCOVERY_TIMEOUT_MS = 10_000;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Pick a discovery-probe timeout for a local-engine base URL.
|
|
70
|
+
*
|
|
71
|
+
* The implicit `127.0.0.1` default probe keeps a tight `loopbackMs` cap so a
|
|
72
|
+
* busy or foreign service on the default port never stalls startup. But that
|
|
73
|
+
* cap is far too short for a host reached over the network: a user who points
|
|
74
|
+
* `LLAMA_CPP_BASE_URL` / `OLLAMA_BASE_URL` / `OLLAMA_HOST` at a remote or LAN
|
|
75
|
+
* machine has real round-trip latency, and a 250ms cap made that server look
|
|
76
|
+
* empty (issue #7087). Anything that is not strictly loopback therefore gets
|
|
77
|
+
* {@link REMOTE_DISCOVERY_TIMEOUT_MS}.
|
|
78
|
+
*/
|
|
79
|
+
export function discoveryProbeTimeoutMs(baseUrl: string, loopbackMs: number, customTimeoutMs?: number): number {
|
|
80
|
+
if (typeof customTimeoutMs === "number" && customTimeoutMs > 0 && Number.isFinite(customTimeoutMs)) {
|
|
81
|
+
return customTimeoutMs;
|
|
82
|
+
}
|
|
83
|
+
let hostname: string;
|
|
84
|
+
try {
|
|
85
|
+
hostname = new URL(baseUrl).hostname;
|
|
86
|
+
} catch {
|
|
87
|
+
return loopbackMs;
|
|
88
|
+
}
|
|
89
|
+
hostname = hostname.replace(/^\[/, "").replace(/\]$/, "");
|
|
90
|
+
const isLoopback =
|
|
91
|
+
hostname === "localhost" || hostname === "0.0.0.0" || hostname === "::1" || /^127\./.test(hostname);
|
|
92
|
+
return isLoopback ? loopbackMs : REMOTE_DISCOVERY_TIMEOUT_MS;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const DEFAULT_OLLAMA_BASE_URL = "http://127.0.0.1:11434";
|
|
96
|
+
const OLLAMA_HOST_DEFAULT_PORT = "11434";
|
|
97
|
+
|
|
98
|
+
function normalizeOllamaHostEnv(value: string | undefined): string | undefined {
|
|
99
|
+
const trimmed = value?.trim();
|
|
100
|
+
if (!trimmed) return undefined;
|
|
101
|
+
const candidate = trimmed.includes("://")
|
|
102
|
+
? trimmed
|
|
103
|
+
: trimmed.startsWith("//")
|
|
104
|
+
? `http:${trimmed}`
|
|
105
|
+
: trimmed.startsWith(":")
|
|
106
|
+
? `http://127.0.0.1${trimmed}`
|
|
107
|
+
: `http://${trimmed}`;
|
|
108
|
+
try {
|
|
109
|
+
const parsed = new URL(candidate);
|
|
110
|
+
if (!parsed.hostname || (parsed.protocol !== "http:" && parsed.protocol !== "https:")) {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
if (!parsed.port && parsed.protocol === "http:") {
|
|
114
|
+
parsed.port = OLLAMA_HOST_DEFAULT_PORT;
|
|
115
|
+
}
|
|
116
|
+
return `${parsed.protocol}//${parsed.host}`;
|
|
117
|
+
} catch {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function getImplicitOllamaBaseUrl(): string {
|
|
123
|
+
const baseUrl = Bun.env.OLLAMA_BASE_URL?.trim();
|
|
124
|
+
return baseUrl || normalizeOllamaHostEnv(Bun.env.OLLAMA_HOST) || DEFAULT_OLLAMA_BASE_URL;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function getOllamaContextLengthOverride(): number | undefined {
|
|
128
|
+
const value = Bun.env.OLLAMA_CONTEXT_LENGTH?.trim();
|
|
129
|
+
if (!value) return undefined;
|
|
130
|
+
const parsed = Number(value);
|
|
131
|
+
return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Anthropic-safe variant of the discovery cap. The Anthropic stream converter
|
|
135
|
+
// in `packages/ai/src/providers/anthropic.ts` derives the request limit as
|
|
136
|
+
// `(model.maxTokens / 3) | 0`, so the 32K default would surface as 10,922
|
|
137
|
+
// requested output tokens — above the 8,192 hard cap on classic Claude 3.x
|
|
138
|
+
// Sonnet/Haiku/Opus endpoints. Discovered models routed through
|
|
139
|
+
// `anthropic-messages` (proxy `supported_endpoint_types: ["anthropic"]` or a
|
|
140
|
+
// custom provider with `api: anthropic-messages` + openai-models-list
|
|
141
|
+
// discovery) fall back to this conservative value.
|
|
142
|
+
const DISCOVERY_DEFAULT_MAX_TOKENS_ANTHROPIC = 8_192;
|
|
143
|
+
|
|
144
|
+
/** Routes discovered-model `maxTokens` defaults around Anthropic's 3× output divisor. */
|
|
145
|
+
export function discoveryDefaultMaxTokens(api: Api | undefined): number {
|
|
146
|
+
return api === "anthropic-messages" ? DISCOVERY_DEFAULT_MAX_TOKENS_ANTHROPIC : DISCOVERY_DEFAULT_MAX_TOKENS;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export interface DiscoveryProviderConfig {
|
|
150
|
+
provider: string;
|
|
151
|
+
api: Api;
|
|
152
|
+
baseUrl?: string;
|
|
153
|
+
headers?: Record<string, string>;
|
|
154
|
+
compat?: ModelSpec<Api>["compat"];
|
|
155
|
+
remoteCompaction?: RemoteCompactionConfig<Api>;
|
|
156
|
+
discovery: ProviderDiscovery;
|
|
157
|
+
optional?: boolean;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** Registry-provided capabilities the protocol probes need; never the registry itself. */
|
|
161
|
+
export interface DiscoveryContext {
|
|
162
|
+
/** Injected fetch implementation (tests stub this). */
|
|
163
|
+
fetch: FetchImpl;
|
|
164
|
+
/**
|
|
165
|
+
* Resolve a provider's bearer credential for `Authorization: Bearer …`.
|
|
166
|
+
* Returns undefined when no key is stored or it is a local/no-auth
|
|
167
|
+
* sentinel; otherwise an {@link ApiKey} whose resolver participates in the
|
|
168
|
+
* central force-refresh/rotate auth-retry policy on 401/usage-limit.
|
|
169
|
+
*/
|
|
170
|
+
getBearerApiKeyResolver(provider: string): Promise<ApiKey | undefined>;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
type OllamaDiscoveredModelMetadata = {
|
|
174
|
+
reasoning: boolean;
|
|
175
|
+
input: ("text" | "image")[];
|
|
176
|
+
contextWindow?: number;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
type LlamaCppDiscoveredServerMetadata = {
|
|
180
|
+
contextWindow?: number;
|
|
181
|
+
input?: ("text" | "image")[];
|
|
182
|
+
maxTokens?: "contextWindow";
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
type LlamaCppDiscoveredModelRuntimeMetadata = {
|
|
186
|
+
contextWindow?: number;
|
|
187
|
+
maxTokens?: number;
|
|
188
|
+
input?: ("text" | "image")[];
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
type LlamaCppModelListEntry = {
|
|
192
|
+
id: string;
|
|
193
|
+
input?: ("text" | "image")[];
|
|
194
|
+
runtimeContextWindow?: number;
|
|
195
|
+
/**
|
|
196
|
+
* `--ctx-size` extracted from the entry's `status.args` (rendered CLI arg
|
|
197
|
+
* vector) or `status.preset` INI. Populated for llama-server router-mode
|
|
198
|
+
* presets so unloaded models surface the user's configured window instead
|
|
199
|
+
* of falling through to the 128K default — the router-level `/props`
|
|
200
|
+
* reports a dummy `n_ctx: 0` and `meta.n_ctx` is only merged in after a
|
|
201
|
+
* child instance loads (issue #4190).
|
|
202
|
+
*/
|
|
203
|
+
configuredContextWindow?: number;
|
|
204
|
+
trainingContextWindow?: number;
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
function toPositiveNumberOrUndefined(value: unknown): number | undefined {
|
|
208
|
+
if (typeof value === "number" && Number.isFinite(value) && value > 0) {
|
|
209
|
+
return value;
|
|
210
|
+
}
|
|
211
|
+
if (typeof value === "string" && value.trim()) {
|
|
212
|
+
const parsed = Number(value);
|
|
213
|
+
if (Number.isFinite(parsed) && parsed > 0) {
|
|
214
|
+
return parsed;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return undefined;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function isLlamaCppUnlimitedSentinel(value: unknown): boolean {
|
|
221
|
+
if (typeof value === "number") {
|
|
222
|
+
return value === -1;
|
|
223
|
+
}
|
|
224
|
+
if (typeof value === "string" && value.trim()) {
|
|
225
|
+
return Number(value) === -1;
|
|
226
|
+
}
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* llama.cpp `/props.default_generation_settings.params.{max_tokens,n_predict}`
|
|
232
|
+
* are per-request defaults the server applies when a client omits the field —
|
|
233
|
+
* clients can still raise them per call. Positive values therefore are NOT
|
|
234
|
+
* hard model caps; only the `-1` unlimited sentinel reliably tells us the
|
|
235
|
+
* server bounds generation by the runtime context window. Anything else
|
|
236
|
+
* leaves the discovery default in place.
|
|
237
|
+
*/
|
|
238
|
+
function extractLlamaCppMaxTokens(payload: Record<string, unknown>): "contextWindow" | undefined {
|
|
239
|
+
const generationSettings = payload.default_generation_settings;
|
|
240
|
+
const params = isRecord(generationSettings) ? generationSettings.params : undefined;
|
|
241
|
+
const candidates = [
|
|
242
|
+
isRecord(params) ? params.max_tokens : undefined,
|
|
243
|
+
isRecord(params) ? params.n_predict : undefined,
|
|
244
|
+
isRecord(generationSettings) ? generationSettings.max_tokens : undefined,
|
|
245
|
+
isRecord(generationSettings) ? generationSettings.n_predict : undefined,
|
|
246
|
+
payload.max_tokens,
|
|
247
|
+
payload.n_predict,
|
|
248
|
+
];
|
|
249
|
+
return candidates.some(isLlamaCppUnlimitedSentinel) ? "contextWindow" : undefined;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function resolveLlamaCppMaxTokens(contextWindow: number, maxTokens: "contextWindow" | undefined): number {
|
|
253
|
+
return maxTokens === "contextWindow"
|
|
254
|
+
? contextWindow
|
|
255
|
+
: Math.min(contextWindow, maxTokens ?? DISCOVERY_DEFAULT_MAX_TOKENS);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function extractOllamaRuntimeContextWindow(payload: Record<string, unknown>): number | undefined {
|
|
259
|
+
const parameters = payload.parameters;
|
|
260
|
+
if (typeof parameters !== "string") {
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
const match = parameters.match(/(?:^|\n)\s*num_ctx\s+(\d+)\s*(?:$|\n)/m);
|
|
264
|
+
return match ? toPositiveNumberOrUndefined(match[1]) : undefined;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function extractOllamaContextWindow(payload: Record<string, unknown>): number | undefined {
|
|
268
|
+
const runtimeContextWindow = extractOllamaRuntimeContextWindow(payload);
|
|
269
|
+
if (runtimeContextWindow !== undefined) {
|
|
270
|
+
return runtimeContextWindow;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const modelInfo = payload.model_info;
|
|
274
|
+
if (isRecord(modelInfo)) {
|
|
275
|
+
for (const [key, value] of Object.entries(modelInfo)) {
|
|
276
|
+
if (key === "context_length" || key.endsWith(".context_length")) {
|
|
277
|
+
const contextWindow = toPositiveNumberOrUndefined(value);
|
|
278
|
+
if (contextWindow !== undefined) {
|
|
279
|
+
return contextWindow;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return undefined;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function extractLlamaCppContextWindow(payload: Record<string, unknown>): number | undefined {
|
|
289
|
+
const generationSettings = payload.default_generation_settings;
|
|
290
|
+
if (isRecord(generationSettings)) {
|
|
291
|
+
const contextWindow = toPositiveNumberOrUndefined(generationSettings.n_ctx);
|
|
292
|
+
if (contextWindow !== undefined) {
|
|
293
|
+
return contextWindow;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return toPositiveNumberOrUndefined(payload.n_ctx);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
function extractLlamaCppModelContextWindows(
|
|
300
|
+
item: Record<string, unknown>,
|
|
301
|
+
): Pick<LlamaCppModelListEntry, "runtimeContextWindow" | "trainingContextWindow"> {
|
|
302
|
+
const meta = item.meta;
|
|
303
|
+
if (!isRecord(meta)) {
|
|
304
|
+
return {};
|
|
305
|
+
}
|
|
306
|
+
return {
|
|
307
|
+
runtimeContextWindow: toPositiveNumberOrUndefined(meta.n_ctx),
|
|
308
|
+
trainingContextWindow: toPositiveNumberOrUndefined(meta.n_ctx_train),
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
function extractLlamaCppModelInputCapabilities(item: Record<string, unknown>): ("text" | "image")[] | undefined {
|
|
313
|
+
const architecture = item.architecture;
|
|
314
|
+
if (!isRecord(architecture) || !Array.isArray(architecture.input_modalities)) {
|
|
315
|
+
return undefined;
|
|
316
|
+
}
|
|
317
|
+
const modalities = new Set<string>();
|
|
318
|
+
for (const modality of architecture.input_modalities) {
|
|
319
|
+
if (typeof modality === "string") {
|
|
320
|
+
modalities.add(modality.toLowerCase());
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return modalities.has("image") ? ["text", "image"] : ["text"];
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
function parseLlamaCppModelList(payload: unknown): LlamaCppModelListEntry[] {
|
|
327
|
+
if (!isRecord(payload) || !Array.isArray(payload.data)) {
|
|
328
|
+
return [];
|
|
329
|
+
}
|
|
330
|
+
return payload.data.flatMap(item => {
|
|
331
|
+
if (!isRecord(item) || typeof item.id !== "string" || !item.id) {
|
|
332
|
+
return [];
|
|
333
|
+
}
|
|
334
|
+
return [
|
|
335
|
+
{
|
|
336
|
+
id: item.id,
|
|
337
|
+
input: extractLlamaCppModelInputCapabilities(item),
|
|
338
|
+
...extractLlamaCppModelContextWindows(item),
|
|
339
|
+
configuredContextWindow: extractLlamaCppConfiguredContextWindow(item),
|
|
340
|
+
},
|
|
341
|
+
];
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// llama-server's `to_args()` renders the long form `--ctx-size` (never `-c`),
|
|
346
|
+
// but tolerate the short form and the embedded `--flag=value` shape so a
|
|
347
|
+
// hand-rolled forwarder cannot silently downgrade the discovered window.
|
|
348
|
+
const LLAMA_CPP_CTX_SIZE_FLAGS = new Set(["--ctx-size", "-c"]);
|
|
349
|
+
|
|
350
|
+
function extractLlamaCppCtxSizeFromArgs(value: unknown): number | undefined {
|
|
351
|
+
if (!Array.isArray(value)) {
|
|
352
|
+
return undefined;
|
|
353
|
+
}
|
|
354
|
+
for (let i = 0; i < value.length; i++) {
|
|
355
|
+
const raw = value[i];
|
|
356
|
+
if (typeof raw !== "string") continue;
|
|
357
|
+
const eq = raw.indexOf("=");
|
|
358
|
+
const flag = eq >= 0 ? raw.slice(0, eq) : raw;
|
|
359
|
+
if (!LLAMA_CPP_CTX_SIZE_FLAGS.has(flag)) continue;
|
|
360
|
+
const rawValue = eq >= 0 ? raw.slice(eq + 1) : value[i + 1];
|
|
361
|
+
const parsed = toPositiveNumberOrUndefined(rawValue);
|
|
362
|
+
if (parsed !== undefined) return parsed;
|
|
363
|
+
}
|
|
364
|
+
return undefined;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// `common_preset::to_ini()` emits one option per line as `<long-arg-without-dashes> = <value>`,
|
|
368
|
+
// so `ctx-size = 8192` is the exact wire form (issue #4190).
|
|
369
|
+
function extractLlamaCppCtxSizeFromIni(value: unknown): number | undefined {
|
|
370
|
+
if (typeof value !== "string") {
|
|
371
|
+
return undefined;
|
|
372
|
+
}
|
|
373
|
+
const match = value.match(/(?:^|\n)\s*ctx-size\s*=\s*(-?\d+)\s*(?:$|\n)/);
|
|
374
|
+
return match ? toPositiveNumberOrUndefined(match[1]) : undefined;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function extractLlamaCppConfiguredContextWindow(item: Record<string, unknown>): number | undefined {
|
|
378
|
+
const status = item.status;
|
|
379
|
+
if (!isRecord(status)) {
|
|
380
|
+
return undefined;
|
|
381
|
+
}
|
|
382
|
+
const fromArgs = extractLlamaCppCtxSizeFromArgs(status.args);
|
|
383
|
+
if (fromArgs !== undefined) {
|
|
384
|
+
return fromArgs;
|
|
385
|
+
}
|
|
386
|
+
return extractLlamaCppCtxSizeFromIni(status.preset);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
function extractLlamaCppInputCapabilities(payload: Record<string, unknown>): ("text" | "image")[] | undefined {
|
|
390
|
+
const modalities = payload.modalities;
|
|
391
|
+
if (!isRecord(modalities)) {
|
|
392
|
+
return undefined;
|
|
393
|
+
}
|
|
394
|
+
return modalities.vision === true ? ["text", "image"] : ["text"];
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
export function discoverModelsByProviderType(
|
|
398
|
+
providerConfig: DiscoveryProviderConfig,
|
|
399
|
+
ctx: DiscoveryContext,
|
|
400
|
+
): Promise<Model<Api>[]> {
|
|
401
|
+
switch (providerConfig.discovery.type) {
|
|
402
|
+
case "ollama":
|
|
403
|
+
return discoverOllamaModels(providerConfig, ctx);
|
|
404
|
+
case "llama.cpp":
|
|
405
|
+
return discoverLlamaCppModels(providerConfig, ctx);
|
|
406
|
+
case "lm-studio":
|
|
407
|
+
case "openai-models-list":
|
|
408
|
+
return discoverOpenAIModelsList(providerConfig, ctx);
|
|
409
|
+
case "proxy":
|
|
410
|
+
return discoverProxyModels(providerConfig, ctx);
|
|
411
|
+
case "litellm":
|
|
412
|
+
return discoverLiteLLMModels(providerConfig, ctx);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
async function discoverOllamaModelMetadata(
|
|
417
|
+
ctx: DiscoveryContext,
|
|
418
|
+
endpoint: string,
|
|
419
|
+
modelId: string,
|
|
420
|
+
headers: Record<string, string> | undefined,
|
|
421
|
+
customTimeoutMs?: number,
|
|
422
|
+
): Promise<OllamaDiscoveredModelMetadata | null> {
|
|
423
|
+
const showUrl = `${endpoint}/api/show`;
|
|
424
|
+
try {
|
|
425
|
+
const payload = await withTimeoutSignal(discoveryProbeTimeoutMs(endpoint, 150, customTimeoutMs), async signal => {
|
|
426
|
+
const response = await ctx.fetch(showUrl, {
|
|
427
|
+
method: "POST",
|
|
428
|
+
headers: { ...(headers ?? {}), "Content-Type": "application/json" },
|
|
429
|
+
body: JSON.stringify({ model: modelId }),
|
|
430
|
+
signal,
|
|
431
|
+
});
|
|
432
|
+
if (!response.ok) {
|
|
433
|
+
return null;
|
|
434
|
+
}
|
|
435
|
+
return (await response.json()) as unknown;
|
|
436
|
+
});
|
|
437
|
+
if (!isRecord(payload)) {
|
|
438
|
+
return null;
|
|
439
|
+
}
|
|
440
|
+
const contextWindow = extractOllamaContextWindow(payload);
|
|
441
|
+
const capabilities = payload.capabilities;
|
|
442
|
+
if (Array.isArray(capabilities)) {
|
|
443
|
+
const normalized = new Set(
|
|
444
|
+
capabilities.flatMap(capability => (typeof capability === "string" ? [capability.toLowerCase()] : [])),
|
|
445
|
+
);
|
|
446
|
+
const supportsVision = normalized.has("vision") || normalized.has("image");
|
|
447
|
+
return {
|
|
448
|
+
reasoning: normalized.has("thinking"),
|
|
449
|
+
input: supportsVision ? ["text", "image"] : ["text"],
|
|
450
|
+
contextWindow,
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
if (!isRecord(capabilities)) {
|
|
454
|
+
return {
|
|
455
|
+
reasoning: false,
|
|
456
|
+
input: ["text"],
|
|
457
|
+
contextWindow,
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
const supportsVision = capabilities.vision === true || capabilities.image === true;
|
|
461
|
+
return {
|
|
462
|
+
reasoning: capabilities.thinking === true,
|
|
463
|
+
input: supportsVision ? ["text", "image"] : ["text"],
|
|
464
|
+
contextWindow,
|
|
465
|
+
};
|
|
466
|
+
} catch {
|
|
467
|
+
return null;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
export async function discoverOllamaModels(
|
|
472
|
+
providerConfig: DiscoveryProviderConfig,
|
|
473
|
+
ctx: DiscoveryContext,
|
|
474
|
+
): Promise<Model<Api>[]> {
|
|
475
|
+
const endpoint = normalizeOllamaBaseUrl(providerConfig.baseUrl);
|
|
476
|
+
const tagsUrl = `${endpoint}/api/tags`;
|
|
477
|
+
const headers = { ...(providerConfig.headers ?? {}) };
|
|
478
|
+
const customTimeoutMs = providerConfig.discovery.timeoutMs;
|
|
479
|
+
const payload = await withTimeoutSignal(discoveryProbeTimeoutMs(endpoint, 250, customTimeoutMs), async signal => {
|
|
480
|
+
const response = await ctx.fetch(tagsUrl, {
|
|
481
|
+
headers,
|
|
482
|
+
signal,
|
|
483
|
+
});
|
|
484
|
+
if (!response.ok) {
|
|
485
|
+
throw new Error(`HTTP ${response.status} from ${tagsUrl}`);
|
|
486
|
+
}
|
|
487
|
+
return (await response.json()) as { models?: Array<{ name?: string; model?: string }> };
|
|
488
|
+
});
|
|
489
|
+
const entries = (payload.models ?? []).flatMap(item => {
|
|
490
|
+
const id = item.model || item.name;
|
|
491
|
+
return id ? [{ id, name: item.name || id }] : [];
|
|
492
|
+
});
|
|
493
|
+
const metadataById = new Map(
|
|
494
|
+
await Promise.all(
|
|
495
|
+
entries.map(
|
|
496
|
+
async entry =>
|
|
497
|
+
[
|
|
498
|
+
entry.id,
|
|
499
|
+
await discoverOllamaModelMetadata(ctx, endpoint, entry.id, headers, customTimeoutMs),
|
|
500
|
+
] as const,
|
|
501
|
+
),
|
|
502
|
+
),
|
|
503
|
+
);
|
|
504
|
+
return entries.map(entry => {
|
|
505
|
+
const metadata = metadataById.get(entry.id);
|
|
506
|
+
return buildModel({
|
|
507
|
+
id: entry.id,
|
|
508
|
+
name: entry.name,
|
|
509
|
+
api: providerConfig.api,
|
|
510
|
+
provider: providerConfig.provider,
|
|
511
|
+
baseUrl: `${endpoint}/v1`,
|
|
512
|
+
reasoning: metadata?.reasoning ?? false,
|
|
513
|
+
input: metadata?.input ?? ["text"],
|
|
514
|
+
imageInputDecoder: "stb",
|
|
515
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
516
|
+
contextWindow: metadata?.contextWindow ?? DISCOVERY_DEFAULT_CONTEXT_WINDOW,
|
|
517
|
+
maxTokens: Math.min(metadata?.contextWindow ?? Number.POSITIVE_INFINITY, DISCOVERY_DEFAULT_MAX_TOKENS),
|
|
518
|
+
headers: providerConfig.headers,
|
|
519
|
+
} as ModelSpec<Api>);
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
async function discoverLlamaCppServerMetadata(
|
|
524
|
+
ctx: DiscoveryContext,
|
|
525
|
+
baseUrl: string,
|
|
526
|
+
headers: Record<string, string> | undefined,
|
|
527
|
+
customTimeoutMs?: number,
|
|
528
|
+
): Promise<LlamaCppDiscoveredServerMetadata | null> {
|
|
529
|
+
const propsUrl = `${toLlamaCppNativeBaseUrl(baseUrl)}/props`;
|
|
530
|
+
try {
|
|
531
|
+
const payload = await withTimeoutSignal(discoveryProbeTimeoutMs(baseUrl, 150, customTimeoutMs), async signal => {
|
|
532
|
+
const response = await ctx.fetch(propsUrl, {
|
|
533
|
+
headers,
|
|
534
|
+
signal,
|
|
535
|
+
});
|
|
536
|
+
if (!response.ok) {
|
|
537
|
+
return null;
|
|
538
|
+
}
|
|
539
|
+
return (await response.json()) as unknown;
|
|
540
|
+
});
|
|
541
|
+
if (!isRecord(payload)) {
|
|
542
|
+
return null;
|
|
543
|
+
}
|
|
544
|
+
return {
|
|
545
|
+
contextWindow: extractLlamaCppContextWindow(payload),
|
|
546
|
+
maxTokens: extractLlamaCppMaxTokens(payload),
|
|
547
|
+
input: extractLlamaCppInputCapabilities(payload),
|
|
548
|
+
};
|
|
549
|
+
} catch {
|
|
550
|
+
return null;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
/**
|
|
555
|
+
* PrismLM Ternary/1-bit Bonsai GGUFs are Qwen3.6-27B derivatives served locally
|
|
556
|
+
* via llama.cpp; their ids do not contain "qwen", so match them explicitly here
|
|
557
|
+
* rather than broadening the global `isQwenModelId` predicate.
|
|
558
|
+
*/
|
|
559
|
+
function isBonsaiQwenGguf(id: string): boolean {
|
|
560
|
+
return /(?:ternary-)?bonsai-27b/i.test(id);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
* applyLlamaCppQwenThinking rewrites a discovered or cached llama.cpp model so a
|
|
565
|
+
* Qwen-family chat template (which defaults `enable_thinking: true`) can be
|
|
566
|
+
* turned off. Qwen ids and the Qwen3.6-based PrismLM Ternary Bonsai GGUFs are
|
|
567
|
+
* routed through chat-completions (the implicit llama.cpp provider defaults to
|
|
568
|
+
* `openai-responses`, whose disable path has no Qwen encoding) with the
|
|
569
|
+
* `qwen-template-false` dialect; omp emits `preserve_thinking` inside
|
|
570
|
+
* `chat_template_kwargs` for Qwen, so the toggle rides there too and history
|
|
571
|
+
* `<think>` blocks survive (`qwenPreserveThinking`). The runtime base URL gets a
|
|
572
|
+
* `/v1` suffix because the chat-completions request would otherwise POST to the
|
|
573
|
+
* native root, which does not serve it. A model with a custom transport (e.g.
|
|
574
|
+
* `pi-native`, whose client appends `/v1/pi/stream`) keeps its base URL so the
|
|
575
|
+
* suffix is not doubled. Non-Qwen models pass through unchanged. Applied on both
|
|
576
|
+
* fresh discovery and cache load, so an upgraded cache is corrected without
|
|
577
|
+
* waiting for re-discovery.
|
|
578
|
+
*/
|
|
579
|
+
export function applyLlamaCppQwenThinking(model: Model<Api>): Model<Api> {
|
|
580
|
+
if (!isQwenModelId(model.id) && !isBonsaiQwenGguf(model.id)) return model;
|
|
581
|
+
return buildModel({
|
|
582
|
+
...model,
|
|
583
|
+
api: "openai-completions",
|
|
584
|
+
baseUrl: model.transport ? model.baseUrl : ensureLlamaCppV1BaseUrl(normalizeLlamaCppBaseUrl(model.baseUrl)),
|
|
585
|
+
reasoning: true,
|
|
586
|
+
compat: {
|
|
587
|
+
...model.compatConfig,
|
|
588
|
+
supportsReasoningParams: true,
|
|
589
|
+
thinkingFormat: "qwen-chat-template",
|
|
590
|
+
reasoningDisableMode: "qwen-template-false",
|
|
591
|
+
qwenPreserveThinking: true,
|
|
592
|
+
},
|
|
593
|
+
} as unknown as ModelSpec<Api>);
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
export async function discoverLlamaCppModels(
|
|
597
|
+
providerConfig: DiscoveryProviderConfig,
|
|
598
|
+
ctx: DiscoveryContext,
|
|
599
|
+
): Promise<Model<Api>[]> {
|
|
600
|
+
const baseUrl = normalizeLlamaCppBaseUrl(providerConfig.baseUrl);
|
|
601
|
+
const modelsUrl = `${baseUrl}/models`;
|
|
602
|
+
|
|
603
|
+
const baseHeaders: Record<string, string> = { ...(providerConfig.headers ?? {}) };
|
|
604
|
+
let headers = baseHeaders;
|
|
605
|
+
const customTimeoutMs = providerConfig.discovery.timeoutMs;
|
|
606
|
+
const attempt = async (h: Record<string, string>) => {
|
|
607
|
+
const [payload, metadata] = await Promise.all([
|
|
608
|
+
withTimeoutSignal(discoveryProbeTimeoutMs(baseUrl, 250, customTimeoutMs), async signal => {
|
|
609
|
+
const response = await ctx.fetch(modelsUrl, {
|
|
610
|
+
headers: h,
|
|
611
|
+
signal,
|
|
612
|
+
});
|
|
613
|
+
if (!response.ok) {
|
|
614
|
+
throw new Error(`HTTP ${response.status} from ${modelsUrl}`);
|
|
615
|
+
}
|
|
616
|
+
headers = h;
|
|
617
|
+
return (await response.json()) as unknown;
|
|
618
|
+
}),
|
|
619
|
+
discoverLlamaCppServerMetadata(ctx, baseUrl, h, customTimeoutMs),
|
|
620
|
+
]);
|
|
621
|
+
return [payload, metadata] as const;
|
|
622
|
+
};
|
|
623
|
+
const apiKey = await ctx.getBearerApiKeyResolver(providerConfig.provider);
|
|
624
|
+
const [payload, serverMetadata] = apiKey
|
|
625
|
+
? await withAuth(apiKey, key => attempt({ ...baseHeaders, Authorization: `Bearer ${key}` }))
|
|
626
|
+
: await attempt(baseHeaders);
|
|
627
|
+
const models = parseLlamaCppModelList(payload);
|
|
628
|
+
const discovered: Model<Api>[] = [];
|
|
629
|
+
for (const item of models) {
|
|
630
|
+
const { id } = item;
|
|
631
|
+
if (!id) continue;
|
|
632
|
+
const contextWindow =
|
|
633
|
+
item.runtimeContextWindow ??
|
|
634
|
+
item.configuredContextWindow ??
|
|
635
|
+
serverMetadata?.contextWindow ??
|
|
636
|
+
item.trainingContextWindow ??
|
|
637
|
+
DISCOVERY_DEFAULT_CONTEXT_WINDOW;
|
|
638
|
+
// Local llama.cpp models stamp `reasoning: false` with a minimal compat;
|
|
639
|
+
// applyLlamaCppQwenThinking upgrades Qwen-family ids (which cannot disable
|
|
640
|
+
// their default-on thinking otherwise) after the base model is built.
|
|
641
|
+
discovered.push(
|
|
642
|
+
applyLlamaCppQwenThinking(
|
|
643
|
+
buildModel({
|
|
644
|
+
id,
|
|
645
|
+
name: id,
|
|
646
|
+
api: providerConfig.api,
|
|
647
|
+
provider: providerConfig.provider,
|
|
648
|
+
baseUrl,
|
|
649
|
+
reasoning: false,
|
|
650
|
+
input: item.input ?? serverMetadata?.input ?? ["text"],
|
|
651
|
+
imageInputDecoder: "stb",
|
|
652
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
653
|
+
contextWindow,
|
|
654
|
+
maxTokens: resolveLlamaCppMaxTokens(contextWindow, serverMetadata?.maxTokens),
|
|
655
|
+
headers,
|
|
656
|
+
compat: {
|
|
657
|
+
supportsStore: false,
|
|
658
|
+
supportsDeveloperRole: false,
|
|
659
|
+
supportsReasoningEffort: false,
|
|
660
|
+
},
|
|
661
|
+
} as ModelSpec<Api>),
|
|
662
|
+
),
|
|
663
|
+
);
|
|
664
|
+
}
|
|
665
|
+
return discovered;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
export async function discoverLlamaCppModelRuntimeMetadata(
|
|
669
|
+
model: Pick<Model<Api>, "provider" | "id" | "baseUrl" | "headers">,
|
|
670
|
+
ctx: DiscoveryContext,
|
|
671
|
+
customTimeoutMs?: number,
|
|
672
|
+
): Promise<LlamaCppDiscoveredModelRuntimeMetadata | undefined> {
|
|
673
|
+
const baseUrl = normalizeLlamaCppBaseUrl(model.baseUrl);
|
|
674
|
+
// Probe the native `/models` endpoint (not the OpenAI-compatible `/v1/models`)
|
|
675
|
+
// so the runtime `meta`, `status.args`, and `architecture.input_modalities`
|
|
676
|
+
// fields survive; a Qwen model routed to chat-completions carries a `/v1`
|
|
677
|
+
// base URL, which would otherwise send this to `/v1/models`.
|
|
678
|
+
const nativeBaseUrl = toLlamaCppNativeBaseUrl(baseUrl);
|
|
679
|
+
const modelsUrl = `${nativeBaseUrl}/models`;
|
|
680
|
+
const baseHeaders: Record<string, string> = { ...(model.headers ?? {}) };
|
|
681
|
+
const attempt = async (headers: Record<string, string>) => {
|
|
682
|
+
const [entries, serverMetadata] = await Promise.all([
|
|
683
|
+
withTimeoutSignal(discoveryProbeTimeoutMs(nativeBaseUrl, 250, customTimeoutMs), async signal => {
|
|
684
|
+
const response = await ctx.fetch(modelsUrl, {
|
|
685
|
+
headers,
|
|
686
|
+
signal,
|
|
687
|
+
});
|
|
688
|
+
if (!response.ok) {
|
|
689
|
+
return undefined;
|
|
690
|
+
}
|
|
691
|
+
return parseLlamaCppModelList(await response.json());
|
|
692
|
+
}),
|
|
693
|
+
discoverLlamaCppServerMetadata(ctx, nativeBaseUrl, headers, customTimeoutMs),
|
|
694
|
+
]);
|
|
695
|
+
if (!entries) {
|
|
696
|
+
return undefined;
|
|
697
|
+
}
|
|
698
|
+
const entry = entries.find(entry => entry.id === model.id);
|
|
699
|
+
if (!entry) {
|
|
700
|
+
return undefined;
|
|
701
|
+
}
|
|
702
|
+
const contextWindow =
|
|
703
|
+
entry.runtimeContextWindow ??
|
|
704
|
+
entry.configuredContextWindow ??
|
|
705
|
+
serverMetadata?.contextWindow ??
|
|
706
|
+
entry.trainingContextWindow;
|
|
707
|
+
const input = entry.input ?? serverMetadata?.input;
|
|
708
|
+
if (contextWindow === undefined) {
|
|
709
|
+
return input === undefined ? undefined : { input };
|
|
710
|
+
}
|
|
711
|
+
return {
|
|
712
|
+
contextWindow,
|
|
713
|
+
maxTokens: resolveLlamaCppMaxTokens(contextWindow, serverMetadata?.maxTokens),
|
|
714
|
+
...(input !== undefined ? { input } : {}),
|
|
715
|
+
};
|
|
716
|
+
};
|
|
717
|
+
try {
|
|
718
|
+
const apiKey = await ctx.getBearerApiKeyResolver(model.provider);
|
|
719
|
+
return apiKey
|
|
720
|
+
? await withAuth(apiKey, key => attempt({ ...baseHeaders, Authorization: `Bearer ${key}` }))
|
|
721
|
+
: await attempt(baseHeaders);
|
|
722
|
+
} catch {
|
|
723
|
+
return undefined;
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
/**
|
|
728
|
+
* Read image-input support from an OpenAI-compatible `/v1/models` row. Handles
|
|
729
|
+
* direct `input` arrays, Synthetic-style top-level `input_modalities`, and
|
|
730
|
+
* OpenRouter-style `architecture.input_modalities`; returns undefined when none
|
|
731
|
+
* is present so the bundled reference (or the `["text"]` default) can take over.
|
|
732
|
+
*/
|
|
733
|
+
function extractOpenAIModelsListInputCapabilities(item: {
|
|
734
|
+
input?: unknown;
|
|
735
|
+
input_modalities?: unknown;
|
|
736
|
+
architecture?: unknown;
|
|
737
|
+
}): ("text" | "image")[] | undefined {
|
|
738
|
+
const modalities = new Set<string>();
|
|
739
|
+
const collect = (value: unknown): void => {
|
|
740
|
+
if (!Array.isArray(value)) return;
|
|
741
|
+
for (const entry of value) {
|
|
742
|
+
if (typeof entry === "string") modalities.add(entry.toLowerCase());
|
|
743
|
+
}
|
|
744
|
+
};
|
|
745
|
+
collect(item.input);
|
|
746
|
+
collect(item.input_modalities);
|
|
747
|
+
if (isRecord(item.architecture)) collect(item.architecture.input_modalities);
|
|
748
|
+
if (modalities.size === 0) return undefined;
|
|
749
|
+
return modalities.has("image") ? ["text", "image"] : ["text"];
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
export async function discoverOpenAIModelsList(
|
|
753
|
+
providerConfig: DiscoveryProviderConfig,
|
|
754
|
+
ctx: DiscoveryContext,
|
|
755
|
+
): Promise<Model<Api>[]> {
|
|
756
|
+
const baseUrl = normalizeOpenAIModelsListBaseUrl(providerConfig.baseUrl);
|
|
757
|
+
const modelsUrl = `${baseUrl}/models`;
|
|
758
|
+
|
|
759
|
+
const baseHeaders: Record<string, string> = { ...(providerConfig.headers ?? {}) };
|
|
760
|
+
let headers = baseHeaders;
|
|
761
|
+
const timeoutMs = providerConfig.discovery.timeoutMs ?? 10_000;
|
|
762
|
+
const attempt = async (h: Record<string, string>) => {
|
|
763
|
+
const nativeMetadataPromise =
|
|
764
|
+
providerConfig.discovery.type === "lm-studio"
|
|
765
|
+
? withTimeoutSignal(timeoutMs, signal =>
|
|
766
|
+
fetchLmStudioNativeModelMetadata(baseUrl, ctx.fetch, { headers: h, signal }),
|
|
767
|
+
)
|
|
768
|
+
: Promise.resolve(null);
|
|
769
|
+
const [payload, nativeMetadata] = await Promise.all([
|
|
770
|
+
withTimeoutSignal(timeoutMs, async signal => {
|
|
771
|
+
const res = await ctx.fetch(modelsUrl, {
|
|
772
|
+
headers: h,
|
|
773
|
+
signal,
|
|
774
|
+
});
|
|
775
|
+
if (!res.ok) {
|
|
776
|
+
throw new Error(`HTTP ${res.status} from ${modelsUrl}`);
|
|
777
|
+
}
|
|
778
|
+
headers = h;
|
|
779
|
+
return (await res.json()) as {
|
|
780
|
+
data?: Array<{
|
|
781
|
+
id?: string;
|
|
782
|
+
max_model_len?: unknown;
|
|
783
|
+
context_length?: unknown;
|
|
784
|
+
input?: unknown;
|
|
785
|
+
input_modalities?: unknown;
|
|
786
|
+
architecture?: unknown;
|
|
787
|
+
}>;
|
|
788
|
+
};
|
|
789
|
+
}),
|
|
790
|
+
nativeMetadataPromise,
|
|
791
|
+
]);
|
|
792
|
+
return [payload, nativeMetadata] as const;
|
|
793
|
+
};
|
|
794
|
+
const apiKey = await ctx.getBearerApiKeyResolver(providerConfig.provider);
|
|
795
|
+
const [payload, nativeMetadata] = apiKey
|
|
796
|
+
? await withAuth(apiKey, key => attempt({ ...baseHeaders, Authorization: `Bearer ${key}` }))
|
|
797
|
+
: await attempt(baseHeaders);
|
|
798
|
+
const models = payload.data ?? [];
|
|
799
|
+
const references = getBundledModelReferenceIndex();
|
|
800
|
+
const discovered: Model<Api>[] = [];
|
|
801
|
+
for (const item of models) {
|
|
802
|
+
const id = item.id;
|
|
803
|
+
if (!id) continue;
|
|
804
|
+
const nativeMetadataForModel = nativeMetadata?.get(id);
|
|
805
|
+
// Thin OpenAI-compatible proxies frequently omit `context_length`/
|
|
806
|
+
// `max_model_len` on `/v1/models`, leaving discovered models pinned at
|
|
807
|
+
// the 128K default even when the underlying model is e.g. a proxied
|
|
808
|
+
// Claude with a 1M window. Resolve the id against the bundled catalog
|
|
809
|
+
// (same pattern as `discoverProxyModels` and `discoverLiteLLMModels`) so
|
|
810
|
+
// intrinsic metadata — context/output limits, display name, modality,
|
|
811
|
+
// reasoning support — flows through when the provider is silent. Local
|
|
812
|
+
// runtime state and provider-reported values still win; proxy-specific
|
|
813
|
+
// headers/baseUrl/cost stay local.
|
|
814
|
+
const reference = resolveModelReference(id, references) as ModelSpec<Api> | undefined;
|
|
815
|
+
const referenceCompat = reference?.compat as OpenAICompat | undefined;
|
|
816
|
+
const contextWindow =
|
|
817
|
+
toPositiveNumberOrUndefined(item.max_model_len) ??
|
|
818
|
+
toPositiveNumberOrUndefined(item.context_length) ??
|
|
819
|
+
nativeMetadataForModel?.contextWindow ??
|
|
820
|
+
reference?.contextWindow ??
|
|
821
|
+
DISCOVERY_DEFAULT_CONTEXT_WINDOW;
|
|
822
|
+
discovered.push(
|
|
823
|
+
buildModel({
|
|
824
|
+
id,
|
|
825
|
+
name: reference?.name ?? id,
|
|
826
|
+
api: providerConfig.api,
|
|
827
|
+
provider: providerConfig.provider,
|
|
828
|
+
baseUrl,
|
|
829
|
+
reasoning: reference?.reasoning ?? false,
|
|
830
|
+
thinking: inheritReferenceThinking(undefined, reference, providerConfig.provider),
|
|
831
|
+
input: nativeMetadataForModel?.input ??
|
|
832
|
+
extractOpenAIModelsListInputCapabilities(item) ??
|
|
833
|
+
reference?.input ?? ["text"],
|
|
834
|
+
...(providerConfig.discovery.type === "lm-studio" ? { imageInputDecoder: "stb" as const } : {}),
|
|
835
|
+
// Proxy/gateway pricing is provider-specific and rarely matches
|
|
836
|
+
// upstream bundled catalogs, so keep costs local-unknown even
|
|
837
|
+
// when we successfully recover the upstream model identity.
|
|
838
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
839
|
+
contextWindow,
|
|
840
|
+
// Cap the reference's output limit at the discovered context
|
|
841
|
+
// window so an ID collision with a larger bundled model can
|
|
842
|
+
// never request more tokens than the local runtime advertises.
|
|
843
|
+
maxTokens: Math.min(reference?.maxTokens ?? discoveryDefaultMaxTokens(providerConfig.api), contextWindow),
|
|
844
|
+
headers,
|
|
845
|
+
compat: {
|
|
846
|
+
supportsStore: false,
|
|
847
|
+
supportsDeveloperRole: false,
|
|
848
|
+
supportsReasoningEffort: referenceCompat?.supportsReasoningEffort ?? false,
|
|
849
|
+
...(referenceCompat?.reasoningEffortMap
|
|
850
|
+
? { reasoningEffortMap: referenceCompat.reasoningEffortMap }
|
|
851
|
+
: {}),
|
|
852
|
+
...(referenceCompat?.omitReasoningEffort !== undefined
|
|
853
|
+
? { omitReasoningEffort: referenceCompat.omitReasoningEffort }
|
|
854
|
+
: {}),
|
|
855
|
+
},
|
|
856
|
+
} as ModelSpec<Api>),
|
|
857
|
+
);
|
|
858
|
+
}
|
|
859
|
+
return discovered;
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
export async function discoverLiteLLMModels(
|
|
863
|
+
providerConfig: DiscoveryProviderConfig,
|
|
864
|
+
ctx: DiscoveryContext,
|
|
865
|
+
): Promise<Model<Api>[]> {
|
|
866
|
+
const baseUrl = normalizeLiteLLMDiscoveryBaseUrl(providerConfig.baseUrl);
|
|
867
|
+
const references = getBundledModelReferenceIndex();
|
|
868
|
+
const resolveReference = (id: string) => resolveModelReference(id, references) as ModelSpec<Api> | undefined;
|
|
869
|
+
const baseHeaders: Record<string, string> = { ...(providerConfig.headers ?? {}) };
|
|
870
|
+
let headers = baseHeaders;
|
|
871
|
+
const timeoutMs = providerConfig.discovery.timeoutMs ?? 10_000;
|
|
872
|
+
const attempt = async (h: Record<string, string>) => {
|
|
873
|
+
headers = h;
|
|
874
|
+
let authError: (Error & { status: number }) | undefined;
|
|
875
|
+
const authAwareFetch: FetchImpl = async (input, init) => {
|
|
876
|
+
const response = await ctx.fetch(input, init);
|
|
877
|
+
if (response.status === 401) {
|
|
878
|
+
authError = new Error(`HTTP ${response.status} from ${String(input)}`) as Error & { status: number };
|
|
879
|
+
authError.status = response.status;
|
|
880
|
+
}
|
|
881
|
+
return response;
|
|
882
|
+
};
|
|
883
|
+
const models = await withTimeoutSignal(timeoutMs, signal =>
|
|
884
|
+
fetchLiteLLMRichModels({
|
|
885
|
+
api: providerConfig.api,
|
|
886
|
+
provider: providerConfig.provider,
|
|
887
|
+
baseUrl,
|
|
888
|
+
headers: h,
|
|
889
|
+
fetch: authAwareFetch,
|
|
890
|
+
referenceResolver: resolveReference,
|
|
891
|
+
signal,
|
|
892
|
+
}),
|
|
893
|
+
);
|
|
894
|
+
if (authError && models === null) {
|
|
895
|
+
throw authError;
|
|
896
|
+
}
|
|
897
|
+
return models;
|
|
898
|
+
};
|
|
899
|
+
const apiKey = await ctx.getBearerApiKeyResolver(providerConfig.provider);
|
|
900
|
+
let richModels: ModelSpec<Api>[] | null;
|
|
901
|
+
try {
|
|
902
|
+
richModels = apiKey
|
|
903
|
+
? await withAuth(apiKey, key => attempt({ ...baseHeaders, Authorization: `Bearer ${key}` }))
|
|
904
|
+
: await attempt(baseHeaders);
|
|
905
|
+
} catch (error) {
|
|
906
|
+
const status = typeof error === "object" && error !== null && "status" in error ? error.status : undefined;
|
|
907
|
+
if (status !== 401) {
|
|
908
|
+
throw error;
|
|
909
|
+
}
|
|
910
|
+
richModels = null;
|
|
911
|
+
}
|
|
912
|
+
if (!richModels || richModels.length === 0) {
|
|
913
|
+
return discoverOpenAIModelsList({ ...providerConfig, baseUrl }, ctx);
|
|
914
|
+
}
|
|
915
|
+
return richModels.map(spec => buildModel({ ...spec, headers }));
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
/**
|
|
919
|
+
* Discover models from an Anthropic+OpenAI-compatible reseller proxy that
|
|
920
|
+
* exposes both `/v1/messages` and `/v1/chat/completions`, advertising each
|
|
921
|
+
* model's wire capabilities through `supported_endpoint_types` on
|
|
922
|
+
* `GET /v1/models` (new-api / one-api-style proxies).
|
|
923
|
+
*
|
|
924
|
+
* Routing per model:
|
|
925
|
+
* supported_endpoint_types: ["anthropic", ...] -> api: "anthropic-messages"
|
|
926
|
+
* supported_endpoint_types: ["openai"] -> api: "openai-completions"
|
|
927
|
+
* missing / neither -> provider-level api fallback
|
|
928
|
+
*
|
|
929
|
+
* Anthropic models share the same baseUrl; the Anthropic SDK strips a
|
|
930
|
+
* trailing `/v1` itself before appending `/v1/messages`, so the discovery
|
|
931
|
+
* URL (which ends in `/v1`) round-trips correctly.
|
|
932
|
+
*/
|
|
933
|
+
export async function discoverProxyModels(
|
|
934
|
+
providerConfig: DiscoveryProviderConfig,
|
|
935
|
+
ctx: DiscoveryContext,
|
|
936
|
+
): Promise<Model<Api>[]> {
|
|
937
|
+
const baseUrl = normalizeOpenAIModelsListBaseUrl(providerConfig.baseUrl);
|
|
938
|
+
const modelsUrl = `${baseUrl}/models`;
|
|
939
|
+
|
|
940
|
+
const baseHeaders: Record<string, string> = { ...(providerConfig.headers ?? {}) };
|
|
941
|
+
let headers = baseHeaders;
|
|
942
|
+
const timeoutMs = providerConfig.discovery.timeoutMs ?? 10_000;
|
|
943
|
+
const attempt = async (h: Record<string, string>) =>
|
|
944
|
+
withTimeoutSignal(timeoutMs, async signal => {
|
|
945
|
+
const res = await ctx.fetch(modelsUrl, {
|
|
946
|
+
headers: h,
|
|
947
|
+
signal,
|
|
948
|
+
});
|
|
949
|
+
if (!res.ok) {
|
|
950
|
+
throw new Error(`HTTP ${res.status} from ${modelsUrl}`);
|
|
951
|
+
}
|
|
952
|
+
headers = h;
|
|
953
|
+
return (await res.json()) as {
|
|
954
|
+
data?: Array<{ id?: string; name?: string; supported_endpoint_types?: string[]; context_length?: number }>;
|
|
955
|
+
};
|
|
956
|
+
});
|
|
957
|
+
const apiKey = await ctx.getBearerApiKeyResolver(providerConfig.provider);
|
|
958
|
+
const payload = apiKey
|
|
959
|
+
? await withAuth(apiKey, key => attempt({ ...baseHeaders, Authorization: `Bearer ${key}` }))
|
|
960
|
+
: await attempt(baseHeaders);
|
|
961
|
+
const items = payload.data ?? [];
|
|
962
|
+
const discovered: Model<Api>[] = [];
|
|
963
|
+
for (const item of items) {
|
|
964
|
+
const id = item.id;
|
|
965
|
+
if (!id) continue;
|
|
966
|
+
const endpoints = item.supported_endpoint_types ?? [];
|
|
967
|
+
const api: Api | undefined = endpoints.includes("anthropic")
|
|
968
|
+
? "anthropic-messages"
|
|
969
|
+
: endpoints.includes("openai")
|
|
970
|
+
? "openai-completions"
|
|
971
|
+
: providerConfig.api;
|
|
972
|
+
if (!api) continue;
|
|
973
|
+
const isAnthropic = api === "anthropic-messages";
|
|
974
|
+
const reference = resolveModelReference(id, getBundledModelReferenceIndex());
|
|
975
|
+
const discoveryName = typeof item.name === "string" ? item.name.trim() : "";
|
|
976
|
+
const displayName =
|
|
977
|
+
reference?.name ??
|
|
978
|
+
(discoveryName && discoveryName !== id ? discoveryName : undefined) ??
|
|
979
|
+
stripBracketedModelIdAffixes(id) ??
|
|
980
|
+
id;
|
|
981
|
+
discovered.push(
|
|
982
|
+
buildModel({
|
|
983
|
+
id,
|
|
984
|
+
name: displayName,
|
|
985
|
+
api,
|
|
986
|
+
provider: providerConfig.provider,
|
|
987
|
+
baseUrl,
|
|
988
|
+
reasoning: reference?.reasoning ?? false,
|
|
989
|
+
thinking: inheritReferenceThinking(undefined, reference, providerConfig.provider),
|
|
990
|
+
input: reference?.input ?? ["text"],
|
|
991
|
+
// Proxy pricing is provider-specific and usually does not match
|
|
992
|
+
// upstream bundled catalogs, so keep costs local-unknown even when
|
|
993
|
+
// we successfully recover the upstream model identity.
|
|
994
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
995
|
+
// Prefer the context_length the API reports for this model; fall
|
|
996
|
+
// back to the bundled reference, then a sane default.
|
|
997
|
+
contextWindow:
|
|
998
|
+
toPositiveNumberOrUndefined(item.context_length) ??
|
|
999
|
+
reference?.contextWindow ??
|
|
1000
|
+
DISCOVERY_DEFAULT_CONTEXT_WINDOW,
|
|
1001
|
+
maxTokens: reference?.maxTokens ?? discoveryDefaultMaxTokens(api),
|
|
1002
|
+
headers,
|
|
1003
|
+
// OpenAI-compat fields are no-ops on anthropic models; the
|
|
1004
|
+
// Anthropic SDK ignores them. Provider-level disableStrictTools
|
|
1005
|
+
// flows in via #applyProviderCompat for the third-party-Anthropic
|
|
1006
|
+
// path. Cross-wire bundled compat is intentionally not copied:
|
|
1007
|
+
// request-shaping fields are provider-wire specific.
|
|
1008
|
+
compat: isAnthropic
|
|
1009
|
+
? undefined
|
|
1010
|
+
: {
|
|
1011
|
+
supportsStore: false,
|
|
1012
|
+
supportsDeveloperRole: false,
|
|
1013
|
+
supportsReasoningEffort: false,
|
|
1014
|
+
},
|
|
1015
|
+
} as ModelSpec<Api>),
|
|
1016
|
+
);
|
|
1017
|
+
}
|
|
1018
|
+
return discovered;
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
function normalizeLlamaCppBaseUrl(baseUrl?: string): string {
|
|
1022
|
+
const defaultBaseUrl = "http://127.0.0.1:8080";
|
|
1023
|
+
const raw = baseUrl || defaultBaseUrl;
|
|
1024
|
+
try {
|
|
1025
|
+
const parsed = new URL(raw);
|
|
1026
|
+
const trimmedPath = parsed.pathname.replace(/\/+$/g, "");
|
|
1027
|
+
return `${parsed.protocol}//${parsed.host}${trimmedPath}`;
|
|
1028
|
+
} catch {
|
|
1029
|
+
return raw;
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
// ensureLlamaCppV1BaseUrl appends the OpenAI-compatible `/v1` prefix a
|
|
1034
|
+
// chat-completions request needs; native discovery keeps the bare root, which
|
|
1035
|
+
// serves `/models` and `/props` but not `/chat/completions`.
|
|
1036
|
+
function ensureLlamaCppV1BaseUrl(baseUrl: string): string {
|
|
1037
|
+
return baseUrl.endsWith("/v1") ? baseUrl : `${baseUrl}/v1`;
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
function toLlamaCppNativeBaseUrl(baseUrl: string): string {
|
|
1041
|
+
try {
|
|
1042
|
+
const parsed = new URL(baseUrl);
|
|
1043
|
+
const trimmedPath = parsed.pathname.replace(/\/+$/g, "");
|
|
1044
|
+
parsed.pathname = trimmedPath.endsWith("/v1") ? trimmedPath.slice(0, -3) || "/" : trimmedPath || "/";
|
|
1045
|
+
const normalized = `${parsed.protocol}//${parsed.host}${parsed.pathname}`;
|
|
1046
|
+
return normalized.endsWith("/") ? normalized.slice(0, -1) : normalized;
|
|
1047
|
+
} catch {
|
|
1048
|
+
return baseUrl.endsWith("/v1") ? baseUrl.slice(0, -3) : baseUrl;
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
export function normalizeLiteLLMDiscoveryBaseUrl(baseUrl?: string): string {
|
|
1053
|
+
return normalizeOpenAIModelsListBaseUrl(baseUrl ?? "http://localhost:4000/v1");
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1056
|
+
export function normalizeOpenAIModelsListBaseUrl(baseUrl?: string): string {
|
|
1057
|
+
const defaultBaseUrl = "http://127.0.0.1:1234/v1";
|
|
1058
|
+
const raw = baseUrl || defaultBaseUrl;
|
|
1059
|
+
try {
|
|
1060
|
+
const parsed = new URL(raw);
|
|
1061
|
+
const trimmedPath = parsed.pathname.replace(/\/+$/g, "");
|
|
1062
|
+
parsed.pathname = trimmedPath.endsWith("/v1") ? trimmedPath || "/v1" : `${trimmedPath}/v1`;
|
|
1063
|
+
return `${parsed.protocol}//${parsed.host}${parsed.pathname}`;
|
|
1064
|
+
} catch {
|
|
1065
|
+
return raw;
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
function normalizeOllamaBaseUrl(baseUrl?: string): string {
|
|
1070
|
+
const raw = baseUrl || DEFAULT_OLLAMA_BASE_URL;
|
|
1071
|
+
try {
|
|
1072
|
+
const parsed = new URL(raw);
|
|
1073
|
+
return `${parsed.protocol}//${parsed.host}`;
|
|
1074
|
+
} catch {
|
|
1075
|
+
return DEFAULT_OLLAMA_BASE_URL;
|
|
1076
|
+
}
|
|
1077
|
+
}
|