@ashx-j/lunr 0.2.26 → 0.2.27
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 +16 -1
- package/LICENSE +22 -0
- package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -1
- package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.d.ts +11 -1
- package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.js +6 -10
- package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts +4 -5
- package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-cron.js +94 -108
- package/dist/builtin-extensions/lunr-cron.js.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.js +3 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
- package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.js +2 -2
- package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js +14 -7
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
- package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
- package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
- package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js +4 -4
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
- package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.js +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
- package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
- package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/index.js +5 -3
- package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +21 -12
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +7 -24
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +39 -77
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +15 -31
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +10 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +8 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +106 -24
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +25 -5
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +15 -5
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +17 -8
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
- package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-tps.js +20 -17
- package/dist/builtin-extensions/pi-tps.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
- package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
- package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
- package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
- package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
- package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
- package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
- package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
- package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
- package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
- package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
- package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.js +48 -73
- package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
- package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
- package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
- package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
- package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
- package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.js +1 -1
- package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
- package/dist/cli/install-cli.d.ts.map +1 -1
- package/dist/cli/install-cli.js +38 -30
- package/dist/cli/install-cli.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +13 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +75 -11
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -0
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +40 -6
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +309 -76
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/browser/runtime.d.ts +2 -0
- package/dist/core/browser/runtime.d.ts.map +1 -1
- package/dist/core/browser/runtime.js +80 -45
- package/dist/core/browser/runtime.js.map +1 -1
- package/dist/core/browser/setup.d.ts.map +1 -1
- package/dist/core/browser/setup.js +12 -1
- package/dist/core/browser/setup.js.map +1 -1
- package/dist/core/computer-use/adapter.d.ts.map +1 -1
- package/dist/core/computer-use/adapter.js +7 -2
- package/dist/core/computer-use/adapter.js.map +1 -1
- package/dist/core/computer-use/image.d.ts.map +1 -1
- package/dist/core/computer-use/image.js +17 -5
- package/dist/core/computer-use/image.js.map +1 -1
- package/dist/core/computer-use/schemas.d.ts.map +1 -1
- package/dist/core/computer-use/schemas.js +23 -6
- package/dist/core/computer-use/schemas.js.map +1 -1
- package/dist/core/computer-use/workflow.d.ts.map +1 -1
- package/dist/core/computer-use/workflow.js +459 -119
- package/dist/core/computer-use/workflow.js.map +1 -1
- package/dist/core/cron/jobs.d.ts +26 -8
- package/dist/core/cron/jobs.d.ts.map +1 -1
- package/dist/core/cron/jobs.js +357 -232
- package/dist/core/cron/jobs.js.map +1 -1
- package/dist/core/cron/origin-context.d.ts +1 -0
- package/dist/core/cron/origin-context.d.ts.map +1 -1
- package/dist/core/cron/origin-context.js.map +1 -1
- package/dist/core/cron/scheduler.d.ts +22 -17
- package/dist/core/cron/scheduler.d.ts.map +1 -1
- package/dist/core/cron/scheduler.js +153 -73
- package/dist/core/cron/scheduler.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +8 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +8 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +4 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +22 -1
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/large-subagent-launch.d.ts +1 -1
- package/dist/core/large-subagent-launch.d.ts.map +1 -1
- package/dist/core/large-subagent-launch.js +7 -7
- package/dist/core/large-subagent-launch.js.map +1 -1
- package/dist/core/model-registry.d.ts +2 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +5 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-runtime.d.ts +4 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +40 -4
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/permissions.d.ts +3 -3
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +11 -35
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts +5 -13
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +126 -116
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js +1 -1
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/prompt-resource-bridge.d.ts +12 -0
- package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
- package/dist/core/prompt-resource-bridge.js +9 -0
- package/dist/core/prompt-resource-bridge.js.map +1 -0
- package/dist/core/protected-targets.d.ts +6 -0
- package/dist/core/protected-targets.d.ts.map +1 -0
- package/dist/core/protected-targets.js +45 -0
- package/dist/core/protected-targets.js.map +1 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +7 -0
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/rollback.d.ts +19 -3
- package/dist/core/rollback.d.ts.map +1 -1
- package/dist/core/rollback.js +172 -56
- package/dist/core/rollback.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts +3 -0
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/runtime-credentials.js +14 -1
- package/dist/core/runtime-credentials.js.map +1 -1
- package/dist/core/sdk.d.ts +3 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +6 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +95 -32
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-ownership.d.ts.map +1 -1
- package/dist/core/session-ownership.js +8 -3
- package/dist/core/session-ownership.js.map +1 -1
- package/dist/core/session-retention.d.ts.map +1 -1
- package/dist/core/session-retention.js +18 -7
- package/dist/core/session-retention.js.map +1 -1
- package/dist/core/session-startup-settings.d.ts +10 -0
- package/dist/core/session-startup-settings.d.ts.map +1 -0
- package/dist/core/session-startup-settings.js +70 -0
- package/dist/core/session-startup-settings.js.map +1 -0
- package/dist/core/subscriptions.d.ts +16 -7
- package/dist/core/subscriptions.d.ts.map +1 -1
- package/dist/core/subscriptions.js +96 -55
- package/dist/core/subscriptions.js.map +1 -1
- package/dist/core/trust-manager.d.ts +2 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +6 -1
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/core/update-check.d.ts.map +1 -1
- package/dist/core/update-check.js.map +1 -1
- package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
- package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
- package/dist/core/usage-adapters/kimi-coding.js +2 -2
- package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
- package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
- package/dist/core/usage-adapters/openai-codex.js +3 -3
- package/dist/core/usage-adapters/openai-codex.js.map +1 -1
- package/dist/core/usage-adapters/xai.d.ts +2 -2
- package/dist/core/usage-adapters/xai.d.ts.map +1 -1
- package/dist/core/usage-adapters/xai.js +3 -3
- package/dist/core/usage-adapters/xai.js.map +1 -1
- package/dist/core/usage-adapters/zai.d.ts +2 -2
- package/dist/core/usage-adapters/zai.d.ts.map +1 -1
- package/dist/core/usage-adapters/zai.js +2 -2
- package/dist/core/usage-adapters/zai.js.map +1 -1
- package/dist/core/usage-service.d.ts +9 -2
- package/dist/core/usage-service.d.ts.map +1 -1
- package/dist/core/usage-service.js +95 -50
- package/dist/core/usage-service.js.map +1 -1
- package/dist/gateway/agent-bridge.d.ts +9 -1
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +91 -37
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/buttons.d.ts +8 -1
- package/dist/gateway/buttons.d.ts.map +1 -1
- package/dist/gateway/buttons.js +76 -18
- package/dist/gateway/buttons.js.map +1 -1
- package/dist/gateway/commands.d.ts +1 -0
- package/dist/gateway/commands.d.ts.map +1 -1
- package/dist/gateway/commands.js +10 -4
- package/dist/gateway/commands.js.map +1 -1
- package/dist/gateway/cron.d.ts +12 -11
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js +65 -56
- package/dist/gateway/cron.js.map +1 -1
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +2 -1
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/mobile-commands.d.ts +1 -0
- package/dist/gateway/mobile-commands.d.ts.map +1 -1
- package/dist/gateway/mobile-commands.js +56 -14
- package/dist/gateway/mobile-commands.js.map +1 -1
- package/dist/gateway/presenter.d.ts +12 -2
- package/dist/gateway/presenter.d.ts.map +1 -1
- package/dist/gateway/presenter.js +73 -38
- package/dist/gateway/presenter.js.map +1 -1
- package/dist/gateway/router.d.ts +2 -2
- package/dist/gateway/router.d.ts.map +1 -1
- package/dist/gateway/router.js +17 -2
- package/dist/gateway/router.js.map +1 -1
- package/dist/gateway/service.d.ts +2 -0
- package/dist/gateway/service.d.ts.map +1 -1
- package/dist/gateway/service.js +153 -0
- package/dist/gateway/service.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +86 -33
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +6 -4
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
- package/dist/modes/interactive/components/copyable-text.js +3 -2
- package/dist/modes/interactive/components/copyable-text.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +1 -1
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +2 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +96 -109
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
- package/dist/modes/interactive/smooth-streaming.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +2 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/node-runtime/{adapter-VFG7WNPX.js → adapter-247RTYLS.js} +4 -5
- package/dist/node-runtime/agent-session-services-KDMSPQDY.js +53 -0
- package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
- package/dist/node-runtime/{builtin-extensions-I2HIFEMY.js → builtin-extensions-OX6KELNX.js} +8 -7
- package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
- package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
- package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
- package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
- package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
- package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
- package/dist/node-runtime/{chunk-SPVDBUOS.js → chunk-6O3IW3IA.js} +2 -2
- package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
- package/dist/node-runtime/chunk-A2WO6WIN.js +1197 -0
- package/dist/node-runtime/{chunk-WIF24I7G.js → chunk-APVM5NEU.js} +149 -144
- package/dist/node-runtime/{chunk-RCR3XAQY.js → chunk-AYHH7YSD.js} +177 -144
- package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
- package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
- package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
- package/dist/node-runtime/{chunk-UVWCDQYF.js → chunk-C3P6Q3B2.js} +455 -278
- package/dist/node-runtime/{chunk-SN2KSMPQ.js → chunk-DQSCFU7R.js} +13 -7
- package/dist/node-runtime/{chunk-4SBQAI4T.js → chunk-EBLAZVSA.js} +2058 -73
- package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-EPR2F3GU.js} +68 -20
- package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
- package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
- package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
- package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
- package/dist/node-runtime/{chunk-IKU6Y7DL.js → chunk-FE3WZI7F.js} +9 -6
- package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-FIRA54AC.js} +2 -5
- package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
- package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
- package/dist/node-runtime/{chunk-RGQAEOM5.js → chunk-FYIFPFXE.js} +23 -6
- package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
- package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
- package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
- package/dist/node-runtime/{chunk-I74LN5JG.js → chunk-HUD2RFJW.js} +2 -2
- package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-I2H5QMWW.js} +3 -3
- package/dist/node-runtime/{chunk-XHIRAZ26.js → chunk-IAZSK7KK.js} +1 -1
- package/dist/node-runtime/{chunk-X3PGBLQ7.js → chunk-IHHTWSXN.js} +9 -9
- package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
- package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
- package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
- package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-JQYNHAKX.js} +1 -1
- package/dist/node-runtime/{chunk-L24TPBS4.js → chunk-JWEVT363.js} +37 -29
- package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
- package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
- package/dist/node-runtime/{chunk-T4DA4XE7.js → chunk-MQPKUHRN.js} +162 -82
- package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
- package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
- package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
- package/dist/node-runtime/{chunk-P7XBVXGT.js → chunk-QNVMKNNN.js} +18 -14
- package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
- package/dist/node-runtime/{chunk-DVQSHCVP.js → chunk-R4WSB2MQ.js} +5 -5
- package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
- package/dist/node-runtime/{chunk-2CFDTH5B.js → chunk-RLGY2QIL.js} +45 -59
- package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
- package/dist/node-runtime/{chunk-5Q4A37RB.js → chunk-TCT6PCUR.js} +32 -11
- package/dist/node-runtime/{chunk-D5UCKPBQ.js → chunk-UBWW2PID.js} +1 -1
- package/dist/node-runtime/{chunk-E75WFZ33.js → chunk-UNUZICC4.js} +3 -3
- package/dist/node-runtime/{chunk-RAK2QA2B.js → chunk-UYRKUKFE.js} +4 -4
- package/dist/node-runtime/{chunk-LWJXTA6Z.js → chunk-VSUEAI7O.js} +1377 -45
- package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
- package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
- package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
- package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
- package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
- package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
- package/dist/node-runtime/{chunk-LJTIVM7I.js → chunk-ZDJUR45D.js} +427 -126
- package/dist/node-runtime/{chunk-YWOJIGFY.js → chunk-ZEVFBFNF.js} +95 -142
- package/dist/node-runtime/{chunk-5B6VKFEV.js → chunk-ZIQUS5QO.js} +1 -1
- package/dist/node-runtime/cli-runtime.js +4 -4
- package/dist/node-runtime/{command-FSBU2EVZ.js → command-3HMSY6W2.js} +5 -5
- package/dist/node-runtime/{commands-EMBQQVVT.js → commands-D6A6H4TS.js} +11 -18
- package/dist/node-runtime/{commands-NAAL7KNT.js → commands-OCSSEEWJ.js} +16 -16
- package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
- package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
- package/dist/node-runtime/{direct-tool-executor-4D7UXYU4.js → direct-tool-executor-2QJXVQD2.js} +6 -11
- package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
- package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-BRWF5AHI.js} +4 -4
- package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
- package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
- package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
- package/dist/node-runtime/{gateway-DQM333YV.js → gateway-6623C2U3.js} +51 -42
- package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
- package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
- package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
- package/dist/node-runtime/{goal-NJEE5CTU.js → goal-AIHEDUYA.js} +5 -5
- package/dist/node-runtime/index.js +50 -48
- package/dist/node-runtime/{init-P5AUV77I.js → init-JBQJIPYI.js} +3 -6
- package/dist/node-runtime/{install-cli-NN4YAU44.js → install-cli-INGHIVBY.js} +30 -25
- package/dist/node-runtime/interactive-mode-FM5DNUSW.js +74 -0
- package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
- package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
- package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
- package/dist/node-runtime/{lunr-computer-use-Y23CCDIJ.js → lunr-computer-use-VDP2QNRQ.js} +9 -9
- package/dist/node-runtime/{lunr-cron-USHC4LXH.js → lunr-cron-LKVA5CZZ.js} +93 -80
- package/dist/node-runtime/main.js +42 -41
- package/dist/node-runtime/{mobile-commands-O5LCHL32.js → mobile-commands-XT3NQXLD.js} +12 -12
- package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
- package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
- package/dist/node-runtime/{package-manager-cli-Q7BL6KZO.js → package-manager-cli-CYM262SI.js} +20 -20
- package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
- package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
- package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
- package/dist/node-runtime/{pi-mcp-adapter-3PHF4KZ4.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
- package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
- package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
- package/dist/node-runtime/{pi-subagents-7IBSSGEW.js → pi-subagents-LT3CTO4E.js} +98 -106
- package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
- package/dist/node-runtime/{print-mode-XQ76CYMT.js → print-mode-2XHN5SUA.js} +3 -3
- package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
- package/dist/node-runtime/{proxy-modes-5FAPSZEZ.js → proxy-modes-VEGC6QG5.js} +8 -15
- package/dist/node-runtime/rpc-entry.js +42 -41
- package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
- package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
- package/dist/node-runtime/{runtime-EFPPD2UW.js → runtime-UGXM4NPQ.js} +2 -2
- package/dist/node-runtime/{runtime-bridges-7WVCLI76.js → runtime-bridges-DNKMNJCF.js} +7 -7
- package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
- package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LNSPDTKY.js} +4 -4
- package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-YIFIAVGC.js} +3 -3
- package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
- package/dist/node-runtime/{settings-manager-DJDM5AHM.js → settings-manager-P2TKGYTR.js} +5 -5
- package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
- package/dist/node-runtime/{setup-PFBWRNUI.js → setup-OLQ4GXWS.js} +17 -17
- package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
- package/dist/node-runtime/{subagent-executor-LPZ4BHWE.js → subagent-executor-Q5F7DBVM.js} +119 -58
- package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
- package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
- package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
- package/dist/node-runtime/{update-cli-HNMOTNGX.js → update-cli-F3XXJANQ.js} +6 -6
- package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
- package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
- package/dist/node-runtime/{workflow-OHPBEFO4.js → workflow-ICDI4N3J.js} +208 -78
- package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js +25 -10
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js +2 -0
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/paths.d.ts +4 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +33 -2
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/sanitize-terminal-text.d.ts +7 -0
- package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
- package/dist/utils/sanitize-terminal-text.js +67 -0
- package/dist/utils/sanitize-terminal-text.js.map +1 -0
- package/docs/browser.md +1 -1
- package/docs/custom-provider.md +3 -3
- package/docs/extensions.md +8 -4
- package/docs/features.md +15 -7
- package/docs/keybindings.md +1 -1
- package/docs/models.md +5 -5
- package/docs/packages.md +1 -1
- package/docs/providers.md +2 -2
- package/docs/rpc.md +7 -7
- package/docs/security.md +10 -5
- package/docs/sessions.md +2 -2
- package/docs/skills.md +1 -1
- package/docs/terminal-setup.md +7 -7
- package/docs/themes.md +1 -1
- package/docs/usage.md +1 -1
- package/examples/extensions/auto-commit-on-exit.ts +1 -1
- package/examples/extensions/bash-spawn-hook.ts +1 -1
- package/examples/extensions/built-in-tool-renderer.ts +1 -1
- package/examples/extensions/claude-rules.ts +1 -1
- package/examples/extensions/commands.ts +1 -1
- package/examples/extensions/custom-compaction.ts +1 -1
- package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/doom-overlay/index.ts +1 -1
- package/examples/extensions/git-merge-and-resolve.ts +2 -2
- package/examples/extensions/gondolin/index.ts +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/hidden-thinking-label.ts +1 -1
- package/examples/extensions/inline-bash.ts +2 -2
- package/examples/extensions/input-transform-streaming.ts +2 -2
- package/examples/extensions/input-transform.ts +2 -2
- package/examples/extensions/interactive-shell.ts +1 -1
- package/examples/extensions/kimi-deferred-tools.ts +1 -1
- package/examples/extensions/mac-system-theme.ts +1 -1
- package/examples/extensions/minimal-mode.ts +1 -1
- package/examples/extensions/modal-editor.ts +1 -1
- package/examples/extensions/model-status.ts +1 -1
- package/examples/extensions/notify.ts +3 -3
- package/examples/extensions/overlay-qa-tests.ts +1 -1
- package/examples/extensions/overlay-test.ts +1 -1
- package/examples/extensions/pirate.ts +1 -1
- package/examples/extensions/preset.ts +3 -3
- package/examples/extensions/project-trust.ts +4 -4
- package/examples/extensions/prompt-customizer.ts +1 -1
- package/examples/extensions/rainbow-editor.ts +1 -1
- package/examples/extensions/rpc-demo.ts +1 -1
- package/examples/extensions/sandbox/index.ts +7 -7
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/shutdown-command.ts +5 -5
- package/examples/extensions/ssh.ts +2 -2
- package/examples/extensions/subagent/README.md +3 -3
- package/examples/extensions/subagent/index.ts +2 -2
- package/examples/extensions/titlebar-spinner.ts +1 -1
- package/examples/extensions/tool-override.ts +1 -1
- package/examples/extensions/tools.ts +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/extensions/working-indicator.ts +1 -1
- package/examples/extensions/working-message-test.ts +1 -1
- package/examples/sdk/01-minimal.ts +1 -1
- package/examples/sdk/03-custom-prompt.ts +1 -1
- package/examples/sdk/04-skills.ts +1 -1
- package/examples/sdk/06-extensions.ts +2 -2
- package/examples/sdk/08-prompt-templates.ts +1 -1
- package/install-lock/package-lock.json +24 -24
- package/install-lock/package.json +2 -2
- package/npm-shrinkwrap.json +60 -24
- package/package.json +9 -9
- package/dist/modes/interactive/components/exit-card.d.ts +0 -22
- package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
- package/dist/modes/interactive/components/exit-card.js +0 -69
- package/dist/modes/interactive/components/exit-card.js.map +0 -1
- package/dist/node-runtime/agent-session-services-5YXS2PLF.js +0 -51
- package/dist/node-runtime/chunk-2IDTZAG5.js +0 -1415
- package/dist/node-runtime/chunk-3MISGG4S.js +0 -769
- package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
- package/dist/node-runtime/chunk-5B5QN3ZQ.js +0 -356
- package/dist/node-runtime/chunk-7IQGBKBJ.js +0 -2033
- package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
- package/dist/node-runtime/chunk-PTFBPO3C.js +0 -50
- package/dist/node-runtime/interactive-mode-YOHZVMKX.js +0 -74
- package/dist/node-runtime/mcp-auth-flow-QVLFVLEO.js +0 -33
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-manager.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/server-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { UnauthorizedError } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport type { RequestOptions } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport {\n ElicitationCompleteNotificationSchema,\n type ReadResourceResult,\n type UrlElicitationRequiredError,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n McpTool,\n McpResource,\n ServerDefinition,\n ServerStreamResultPatchNotification,\n Transport,\n} from \"./types.ts\";\nimport { serverStreamResultPatchNotificationSchema } from \"./types.ts\";\nimport { resolveNpxBinary } from \"./npx-resolver.ts\";\nimport { logger } from \"./logger.ts\";\nimport { McpOAuthProvider } from \"./mcp-oauth-provider.ts\";\nimport { extractOAuthConfig, supportsOAuth } from \"./mcp-auth-flow.ts\";\nimport { registerSamplingHandler, type ServerSamplingConfig } from \"./sampling-handler.ts\";\nimport {\n handleUrlElicitation,\n registerElicitationHandler,\n type ServerElicitationConfig,\n} from \"./elicitation-handler.ts\";\nimport { interpolateEnvRecord, resolveBearerToken, resolveConfigPath } from \"./utils.ts\";\nimport { abortable, throwIfAborted } from \"./abort.ts\";\n\ninterface PendingConnection {\n client: Client;\n transport: Transport;\n}\n\ninterface ServerConnection extends PendingConnection {\n definition: ServerDefinition;\n tools: McpTool[];\n resources: McpResource[];\n lastUsedAt: number;\n inFlight: number;\n status: \"connected\" | \"closed\" | \"needs-auth\";\n}\n\ntype UiStreamListener = (serverName: string, notification: ServerStreamResultPatchNotification[\"params\"]) => void;\n\nexport class McpServerManager {\n private connections = new Map<string, ServerConnection>();\n private connectPromises = new Map<string, Promise<ServerConnection>>();\n private pendingConnections = new Map<string, PendingConnection>();\n private closing = false;\n private uiStreamListeners = new Map<string, UiStreamListener>();\n private samplingConfig: ServerSamplingConfig | undefined;\n private elicitationConfig: ServerElicitationConfig | undefined;\n private acceptedUrlElicitations = new Map<string, Set<string>>();\n private defaultRequestTimeoutMs: number | undefined;\n\n /** Default cwd for stdio servers without an explicit config `cwd`. */\n constructor(private readonly defaultCwd?: string) {}\n\n setSamplingConfig(config: ServerSamplingConfig | undefined): void {\n this.samplingConfig = config;\n }\n\n setElicitationConfig(config: ServerElicitationConfig | undefined): void {\n this.elicitationConfig = config;\n }\n\n setDefaultRequestTimeoutMs(timeoutMs: number | undefined): void {\n this.defaultRequestTimeoutMs = normalizeRequestTimeoutMs(timeoutMs);\n }\n\n getRequestOptions(name: string, signal?: AbortSignal): RequestOptions | undefined {\n const connection = this.connections.get(name);\n return this.buildRequestOptions(connection?.definition, signal);\n }\n\n private getResolvedRequestTimeoutMs(definition?: ServerDefinition): number | undefined {\n if (definition?.requestTimeoutMs !== undefined) {\n return normalizeRequestTimeoutMs(definition.requestTimeoutMs);\n }\n return this.defaultRequestTimeoutMs;\n }\n\n private buildRequestOptions(\n definition?: ServerDefinition,\n signal?: AbortSignal,\n ): RequestOptions | undefined {\n const timeout = this.getResolvedRequestTimeoutMs(definition);\n\n if (!signal && timeout === undefined) {\n return undefined;\n }\n\n return {\n ...(signal ? { signal } : {}),\n ...(timeout !== undefined ? { timeout } : {}),\n };\n }\n\n async connect(name: string, definition: ServerDefinition, signal?: AbortSignal): Promise<ServerConnection> {\n throwIfAborted(signal);\n if (this.closing) throw new Error(\"MCP server manager is closed\");\n // Dedupe concurrent connection attempts\n if (this.connectPromises.has(name)) {\n return abortable(this.connectPromises.get(name)!, signal);\n }\n\n // Reuse existing connection if healthy\n const existing = this.connections.get(name);\n if (existing?.status === \"connected\") {\n existing.lastUsedAt = Date.now();\n return existing;\n }\n\n const promise = this.createConnection(name, definition, signal).then(async connection => {\n if (this.closing || signal?.aborted) {\n await this.disposeConnection(connection);\n throwIfAborted(signal);\n throw new Error(\"MCP server manager closed during connection\");\n }\n this.connections.set(name, connection);\n return connection;\n });\n this.connectPromises.set(name, promise);\n\n try {\n return await promise;\n } finally {\n if (this.connectPromises.get(name) === promise) this.connectPromises.delete(name);\n }\n }\n\n private async createConnection(\n name: string,\n definition: ServerDefinition,\n signal?: AbortSignal,\n ): Promise<ServerConnection> {\n throwIfAborted(signal);\n const client = this.createClient(name);\n\n let transport: Transport;\n\n if (definition.command) {\n let command = definition.command;\n let args = definition.args ?? [];\n\n if (command === \"npx\" || command === \"npm\") {\n const resolved = await resolveNpxBinary(command, args);\n if (resolved) {\n command = resolved.isJs ? \"node\" : resolved.binPath;\n args = resolved.isJs ? [resolved.binPath, ...resolved.extraArgs] : resolved.extraArgs;\n logger.debug(`${name} resolved to ${resolved.binPath} (skipping npm parent)`);\n }\n }\n\n transport = new StdioClientTransport({\n command,\n args,\n env: resolveEnv(definition.env),\n cwd: resolveConfigPath(definition.cwd) ?? this.defaultCwd,\n stderr: definition.debug ? \"inherit\" : \"ignore\",\n });\n } else if (definition.url) {\n // HTTP transport with fallback\n transport = await this.createHttpTransport(definition, name, signal);\n } else {\n throw new Error(`Server ${name} has no command or url`);\n }\n\n const requestOptions = this.buildRequestOptions(definition, signal);\n const pending = { client, transport };\n this.pendingConnections.set(name, pending);\n\n try {\n await client.connect(transport, requestOptions);\n this.attachAdapterNotificationHandlers(name, client);\n\n // Discover tools and resources\n const [tools, resources] = await Promise.all([\n this.fetchAllTools(client, requestOptions),\n this.fetchAllResources(client, requestOptions),\n ]);\n\n return {\n client,\n transport,\n definition,\n tools,\n resources,\n lastUsedAt: Date.now(),\n inFlight: 0,\n status: \"connected\",\n };\n } catch (error) {\n // Check for UnauthorizedError - server requires OAuth\n if (error instanceof UnauthorizedError && supportsOAuth(definition)) {\n // Clean up both client and transport before reporting needs-auth.\n await client.close().catch(() => {});\n await transport.close().catch(() => {});\n\n return {\n client,\n transport,\n definition,\n tools: [],\n resources: [],\n lastUsedAt: Date.now(),\n inFlight: 0,\n status: \"needs-auth\",\n };\n }\n\n // Clean up both client and transport on any error\n await client.close().catch(() => {});\n await transport.close().catch(() => {});\n throw error;\n } finally {\n if (this.pendingConnections.get(name) === pending) this.pendingConnections.delete(name);\n }\n }\n\n private buildClientCapabilities() {\n return {\n ...(this.samplingConfig ? { sampling: {} } : {}),\n ...(this.elicitationConfig\n ? {\n elicitation: {\n form: {},\n ...(this.elicitationConfig.allowUrl ? { url: {} } : {}),\n },\n }\n : {}),\n };\n }\n\n private createClient(serverName: string): Client {\n const capabilities = this.buildClientCapabilities();\n const client = new Client(\n { name: `pi-mcp-${serverName}`, version: \"1.0.0\" },\n Object.keys(capabilities).length > 0 ? { capabilities } : undefined,\n );\n if (this.samplingConfig) {\n registerSamplingHandler(client, { ...this.samplingConfig, serverName });\n }\n if (this.elicitationConfig) {\n registerElicitationHandler(client, {\n ...this.elicitationConfig,\n serverName,\n onUrlAccepted: elicitationId => this.rememberUrlElicitation(serverName, elicitationId),\n });\n if (this.elicitationConfig.allowUrl) {\n client.setNotificationHandler(ElicitationCompleteNotificationSchema, notification => {\n const accepted = this.acceptedUrlElicitations.get(serverName);\n if (!accepted?.delete(notification.params.elicitationId)) return;\n this.elicitationConfig?.ui.notify(\n `MCP browser interaction for ${serverName} completed. You can retry the tool now.`,\n \"info\",\n );\n });\n }\n }\n return client;\n }\n\n async handleUrlElicitationRequired(\n serverName: string,\n error: UrlElicitationRequiredError,\n ): Promise<\"accept\" | \"decline\" | \"cancel\"> {\n if (!this.elicitationConfig?.allowUrl) return \"cancel\";\n for (const params of error.elicitations) {\n const result = await handleUrlElicitation({\n ...this.elicitationConfig,\n serverName,\n onUrlAccepted: elicitationId => this.rememberUrlElicitation(serverName, elicitationId),\n }, params);\n if (result.action !== \"accept\") return result.action;\n }\n return \"accept\";\n }\n\n private rememberUrlElicitation(serverName: string, elicitationId: string): void {\n let accepted = this.acceptedUrlElicitations.get(serverName);\n if (!accepted) {\n accepted = new Set();\n this.acceptedUrlElicitations.set(serverName, accepted);\n }\n accepted.add(elicitationId);\n }\n\n private async createHttpTransport(\n definition: ServerDefinition,\n serverName: string,\n signal?: AbortSignal,\n ): Promise<Transport> {\n throwIfAborted(signal);\n const url = new URL(definition.url!);\n\n // Build headers first (including any bearer token)\n const headers = resolveHeaders(definition.headers) ?? {};\n\n // For bearer auth, add the token to headers BEFORE creating requestInit\n if (definition.auth === \"bearer\") {\n const token = resolveBearerToken(definition);\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n }\n\n // Create request init with headers (Authorization now included for bearer auth)\n const requestInit = Object.keys(headers).length > 0 ? { headers } : undefined;\n\n // For OAuth servers, create an auth provider\n let authProvider: McpOAuthProvider | undefined;\n if (supportsOAuth(definition)) {\n const oauthConfig = extractOAuthConfig(definition);\n authProvider = new McpOAuthProvider(\n serverName,\n definition.url!,\n oauthConfig,\n {\n onRedirect: async (_authUrl) => {\n // URL is captured by startAuth, no need to log\n },\n }\n );\n }\n\n // Try StreamableHTTP first (modern MCP servers)\n const streamableTransport = new StreamableHTTPClientTransport(url, {\n requestInit,\n authProvider,\n });\n\n try {\n // Create a test client to verify the transport works\n const testClient = new Client({ name: \"pi-mcp-probe\", version: \"2.1.2\" });\n await testClient.connect(streamableTransport, this.buildRequestOptions(definition, signal));\n await testClient.close().catch(() => {});\n // Close probe transport before creating fresh one\n await streamableTransport.close().catch(() => {});\n\n // StreamableHTTP works - create fresh transport for actual use\n return new StreamableHTTPClientTransport(url, { requestInit, authProvider });\n } catch (error) {\n // StreamableHTTP failed, close and try SSE fallback\n await streamableTransport.close().catch(() => {});\n\n // Host cancellation is not transport capability evidence; do not fall\n // through to SSE when the caller is trying to cancel the connect.\n if (signal?.aborted) {\n throwIfAborted(signal);\n }\n\n // If this was an UnauthorizedError, don't try SSE - the server needs auth\n if (error instanceof UnauthorizedError) {\n throw error;\n }\n\n // SSE is the legacy transport\n return new SSEClientTransport(url, { requestInit, authProvider });\n }\n }\n\n private async fetchAllTools(client: Client, requestOptions?: RequestOptions): Promise<McpTool[]> {\n const allTools: McpTool[] = [];\n let cursor: string | undefined;\n\n do {\n const result = await client.listTools(cursor ? { cursor } : undefined, requestOptions);\n allTools.push(...(result.tools ?? []));\n cursor = result.nextCursor;\n } while (cursor);\n\n return allTools;\n }\n\n private async fetchAllResources(client: Client, requestOptions?: RequestOptions): Promise<McpResource[]> {\n try {\n const allResources: McpResource[] = [];\n let cursor: string | undefined;\n\n do {\n const result = await client.listResources(cursor ? { cursor } : undefined, requestOptions);\n allResources.push(...(result.resources ?? []));\n cursor = result.nextCursor;\n } while (cursor);\n\n return allResources;\n } catch {\n if (requestOptions?.signal?.aborted) {\n throwIfAborted(requestOptions.signal);\n }\n // Server may not support resources\n return [];\n }\n }\n\n private attachAdapterNotificationHandlers(serverName: string, client: Client): void {\n client.setNotificationHandler(serverStreamResultPatchNotificationSchema, (notification) => {\n const listener = this.uiStreamListeners.get(notification.params.streamToken);\n if (!listener) return;\n listener(serverName, notification.params);\n });\n }\n\n registerUiStreamListener(streamToken: string, listener: UiStreamListener): void {\n this.uiStreamListeners.set(streamToken, listener);\n }\n\n removeUiStreamListener(streamToken: string): void {\n this.uiStreamListeners.delete(streamToken);\n }\n\n async readResource(name: string, uri: string, signal?: AbortSignal): Promise<ReadResourceResult> {\n const connection = this.connections.get(name);\n if (!connection || connection.status !== \"connected\") {\n throw new Error(`Server \"${name}\" is not connected`);\n }\n\n try {\n this.touch(name);\n this.incrementInFlight(name);\n return await connection.client.readResource({ uri }, this.getRequestOptions(name, signal));\n } finally {\n this.decrementInFlight(name);\n this.touch(name);\n }\n }\n\n private async disposeConnection(connection: PendingConnection): Promise<void> {\n await connection.client.close().catch(() => {});\n await connection.transport.close().catch(() => {});\n }\n\n async close(name: string): Promise<void> {\n const connection = this.connections.get(name);\n if (!connection) return;\n\n // Delete from map BEFORE async cleanup to prevent a race where a\n // concurrent connect() creates a new connection that our deferred\n // delete() would then remove, orphaning the new server process.\n connection.status = \"closed\";\n this.connections.delete(name);\n this.acceptedUrlElicitations.delete(name);\n await this.disposeConnection(connection);\n }\n\n async closeAll(): Promise<void> {\n this.closing = true;\n const names = [...this.connections.keys()];\n const pending = [...this.pendingConnections.values()];\n await Promise.all([\n ...names.map(name => this.close(name)),\n ...pending.map(connection => this.disposeConnection(connection)),\n ]);\n }\n\n getConnection(name: string): ServerConnection | undefined {\n return this.connections.get(name);\n }\n\n getAllConnections(): Map<string, ServerConnection> {\n return new Map(this.connections);\n }\n\n touch(name: string): void {\n const connection = this.connections.get(name);\n if (connection) {\n connection.lastUsedAt = Date.now();\n }\n }\n\n incrementInFlight(name: string): void {\n const connection = this.connections.get(name);\n if (connection) {\n connection.inFlight = (connection.inFlight ?? 0) + 1;\n }\n }\n\n decrementInFlight(name: string): void {\n const connection = this.connections.get(name);\n if (connection && connection.inFlight) {\n connection.inFlight--;\n }\n }\n\n isIdle(name: string, timeoutMs: number): boolean {\n const connection = this.connections.get(name);\n if (!connection || connection.status !== \"connected\") return false;\n if (connection.inFlight > 0) return false;\n return (Date.now() - connection.lastUsedAt) > timeoutMs;\n }\n}\n\n/**\n * Resolve environment variables with interpolation.\n */\nfunction resolveEnv(env?: Record<string, string>): Record<string, string> {\n // Copy process.env, filtering out undefined values\n const resolved: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined) {\n resolved[key] = value;\n }\n }\n\n if (!env) return resolved;\n\n const overrides = interpolateEnvRecord(env);\n return overrides ? { ...resolved, ...overrides } : resolved;\n}\n\n/**\n * Resolve headers with environment variable interpolation.\n */\nfunction resolveHeaders(headers?: Record<string, string>): Record<string, string> | undefined {\n return interpolateEnvRecord(headers);\n}\n\nfunction normalizeRequestTimeoutMs(timeoutMs: number | undefined): number | undefined {\n return typeof timeoutMs === \"number\" && Number.isFinite(timeoutMs) && timeoutMs > 0\n ? timeoutMs\n : undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"server-manager.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/server-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { UnauthorizedError } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport type { RequestOptions } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport {\n ElicitationCompleteNotificationSchema,\n type ReadResourceResult,\n type UrlElicitationRequiredError,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n McpTool,\n McpResource,\n ServerDefinition,\n ServerStreamResultPatchNotification,\n Transport,\n} from \"./types.ts\";\nimport { serverStreamResultPatchNotificationSchema } from \"./types.ts\";\nimport { resolveNpxBinary } from \"./npx-resolver.ts\";\nimport { logger } from \"./logger.ts\";\nimport { McpOAuthProvider } from \"./mcp-oauth-provider.ts\";\nimport { extractOAuthConfig, supportsOAuth } from \"./mcp-auth-flow.ts\";\nimport { registerSamplingHandler, type ServerSamplingConfig } from \"./sampling-handler.ts\";\nimport {\n handleUrlElicitation,\n registerElicitationHandler,\n type ServerElicitationConfig,\n} from \"./elicitation-handler.ts\";\nimport { interpolateEnvRecord, resolveBearerToken, resolveConfigPath } from \"./utils.ts\";\nimport { abortable, throwIfAborted } from \"./abort.ts\";\n\ninterface PendingConnection {\n client: Client;\n transport: Transport;\n}\n\ninterface ServerConnection extends PendingConnection {\n definition: ServerDefinition;\n tools: McpTool[];\n resources: McpResource[];\n lastUsedAt: number;\n inFlight: number;\n status: \"connected\" | \"closed\" | \"needs-auth\";\n}\n\ntype UiStreamListener = (serverName: string, notification: ServerStreamResultPatchNotification[\"params\"]) => void;\n\nexport class McpServerManager {\n private connections = new Map<string, ServerConnection>();\n private connectPromises = new Map<string, Promise<ServerConnection>>();\n private pendingConnections = new Map<string, PendingConnection>();\n private closing = false;\n private uiStreamListeners = new Map<string, UiStreamListener>();\n private samplingConfig: ServerSamplingConfig | undefined;\n private elicitationConfig: ServerElicitationConfig | undefined;\n private acceptedUrlElicitations = new Map<string, Set<string>>();\n private defaultRequestTimeoutMs: number | undefined;\n\n /** Default cwd for stdio servers without an explicit config `cwd`. */\n constructor(private readonly defaultCwd?: string) {}\n\n setSamplingConfig(config: ServerSamplingConfig | undefined): void {\n this.samplingConfig = config;\n }\n\n setElicitationConfig(config: ServerElicitationConfig | undefined): void {\n this.elicitationConfig = config;\n }\n\n setDefaultRequestTimeoutMs(timeoutMs: number | undefined): void {\n this.defaultRequestTimeoutMs = normalizeRequestTimeoutMs(timeoutMs);\n }\n\n getRequestOptions(name: string, signal?: AbortSignal): RequestOptions | undefined {\n const connection = this.connections.get(name);\n return this.buildRequestOptions(connection?.definition, signal);\n }\n\n private getResolvedRequestTimeoutMs(definition?: ServerDefinition): number | undefined {\n if (definition?.requestTimeoutMs !== undefined) {\n return normalizeRequestTimeoutMs(definition.requestTimeoutMs);\n }\n return this.defaultRequestTimeoutMs;\n }\n\n private buildRequestOptions(\n definition?: ServerDefinition,\n signal?: AbortSignal,\n ): RequestOptions | undefined {\n const timeout = this.getResolvedRequestTimeoutMs(definition);\n\n if (!signal && timeout === undefined) {\n return undefined;\n }\n\n return {\n ...(signal ? { signal } : {}),\n ...(timeout !== undefined ? { timeout } : {}),\n };\n }\n\n async connect(name: string, definition: ServerDefinition, signal?: AbortSignal): Promise<ServerConnection> {\n throwIfAborted(signal);\n if (this.closing) throw new Error(\"MCP server manager is closed\");\n // Dedupe concurrent connection attempts\n if (this.connectPromises.has(name)) {\n return abortable(this.connectPromises.get(name)!, signal);\n }\n\n // Reuse existing connection if healthy\n const existing = this.connections.get(name);\n if (existing?.status === \"connected\") {\n existing.lastUsedAt = Date.now();\n return existing;\n }\n\n const promise = this.createConnection(name, definition, signal).then(async connection => {\n if (this.closing || signal?.aborted) {\n await this.disposeConnection(connection);\n throwIfAborted(signal);\n throw new Error(\"MCP server manager closed during connection\");\n }\n this.connections.set(name, connection);\n return connection;\n });\n this.connectPromises.set(name, promise);\n\n try {\n return await promise;\n } finally {\n if (this.connectPromises.get(name) === promise) this.connectPromises.delete(name);\n }\n }\n\n private async createConnection(\n name: string,\n definition: ServerDefinition,\n signal?: AbortSignal,\n ): Promise<ServerConnection> {\n throwIfAborted(signal);\n const client = this.createClient(name);\n\n let transport: Transport;\n\n if (definition.command) {\n let command = definition.command;\n let args = definition.args ?? [];\n\n if (command === \"npx\" || command === \"npm\") {\n const resolved = await resolveNpxBinary(command, args);\n if (resolved) {\n command = resolved.isJs ? \"node\" : resolved.binPath;\n args = resolved.isJs ? [resolved.binPath, ...resolved.extraArgs] : resolved.extraArgs;\n logger.debug(`${name} resolved to ${resolved.binPath} (skipping npm parent)`);\n }\n }\n\n transport = new StdioClientTransport({\n command,\n args,\n env: resolveEnv(definition.env),\n cwd: resolveConfigPath(definition.cwd) ?? this.defaultCwd,\n stderr: definition.debug ? \"inherit\" : \"ignore\",\n });\n } else if (definition.url) {\n // HTTP transport with fallback\n transport = await this.createHttpTransport(definition, name, signal);\n } else {\n throw new Error(`Server ${name} has no command or url`);\n }\n\n const requestOptions = this.buildRequestOptions(definition, signal);\n const pending = { client, transport };\n this.pendingConnections.set(name, pending);\n\n try {\n await client.connect(transport, requestOptions);\n this.attachAdapterNotificationHandlers(name, client);\n\n // Discover tools and resources\n const [tools, resources] = await Promise.all([\n this.fetchAllTools(client, requestOptions),\n this.fetchAllResources(client, requestOptions),\n ]);\n\n return {\n client,\n transport,\n definition,\n tools,\n resources,\n lastUsedAt: Date.now(),\n inFlight: 0,\n status: \"connected\",\n };\n } catch (error) {\n // Check for UnauthorizedError - server requires OAuth\n if (error instanceof UnauthorizedError && supportsOAuth(definition)) {\n // Clean up both client and transport before reporting needs-auth.\n await client.close().catch(() => {});\n await transport.close().catch(() => {});\n\n return {\n client,\n transport,\n definition,\n tools: [],\n resources: [],\n lastUsedAt: Date.now(),\n inFlight: 0,\n status: \"needs-auth\",\n };\n }\n\n // Clean up both client and transport on any error\n await client.close().catch(() => {});\n await transport.close().catch(() => {});\n throw error;\n } finally {\n if (this.pendingConnections.get(name) === pending) this.pendingConnections.delete(name);\n }\n }\n\n private buildClientCapabilities() {\n return {\n ...(this.samplingConfig ? { sampling: {} } : {}),\n ...(this.elicitationConfig\n ? {\n elicitation: {\n form: {},\n ...(this.elicitationConfig.allowUrl ? { url: {} } : {}),\n },\n }\n : {}),\n };\n }\n\n private createClient(serverName: string): Client {\n const capabilities = this.buildClientCapabilities();\n const client = new Client(\n { name: `lunR-mcp-${serverName}`, version: \"1.0.0\" },\n Object.keys(capabilities).length > 0 ? { capabilities } : undefined,\n );\n if (this.samplingConfig) {\n registerSamplingHandler(client, { ...this.samplingConfig, serverName });\n }\n if (this.elicitationConfig) {\n registerElicitationHandler(client, {\n ...this.elicitationConfig,\n serverName,\n onUrlAccepted: elicitationId => this.rememberUrlElicitation(serverName, elicitationId),\n });\n if (this.elicitationConfig.allowUrl) {\n client.setNotificationHandler(ElicitationCompleteNotificationSchema, notification => {\n const accepted = this.acceptedUrlElicitations.get(serverName);\n if (!accepted?.delete(notification.params.elicitationId)) return;\n this.elicitationConfig?.ui.notify(\n `MCP browser interaction for ${serverName} completed. You can retry the tool now.`,\n \"info\",\n );\n });\n }\n }\n return client;\n }\n\n async handleUrlElicitationRequired(\n serverName: string,\n error: UrlElicitationRequiredError,\n ): Promise<\"accept\" | \"decline\" | \"cancel\"> {\n if (!this.elicitationConfig?.allowUrl) return \"cancel\";\n for (const params of error.elicitations) {\n const result = await handleUrlElicitation({\n ...this.elicitationConfig,\n serverName,\n onUrlAccepted: elicitationId => this.rememberUrlElicitation(serverName, elicitationId),\n }, params);\n if (result.action !== \"accept\") return result.action;\n }\n return \"accept\";\n }\n\n private rememberUrlElicitation(serverName: string, elicitationId: string): void {\n let accepted = this.acceptedUrlElicitations.get(serverName);\n if (!accepted) {\n accepted = new Set();\n this.acceptedUrlElicitations.set(serverName, accepted);\n }\n accepted.add(elicitationId);\n }\n\n private async createHttpTransport(\n definition: ServerDefinition,\n serverName: string,\n signal?: AbortSignal,\n ): Promise<Transport> {\n throwIfAborted(signal);\n const url = new URL(definition.url!);\n\n // Build headers first (including any bearer token)\n const headers = resolveHeaders(definition.headers) ?? {};\n\n // For bearer auth, add the token to headers BEFORE creating requestInit\n if (definition.auth === \"bearer\") {\n const token = resolveBearerToken(definition);\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n }\n\n // Create request init with headers (Authorization now included for bearer auth)\n const requestInit = Object.keys(headers).length > 0 ? { headers } : undefined;\n\n // For OAuth servers, create an auth provider\n let authProvider: McpOAuthProvider | undefined;\n if (supportsOAuth(definition)) {\n const oauthConfig = extractOAuthConfig(definition);\n authProvider = new McpOAuthProvider(\n serverName,\n definition.url!,\n oauthConfig,\n {\n onRedirect: async (_authUrl) => {\n // URL is captured by startAuth, no need to log\n },\n }\n );\n }\n\n // Try StreamableHTTP first (modern MCP servers)\n const streamableTransport = new StreamableHTTPClientTransport(url, {\n requestInit,\n authProvider,\n });\n\n try {\n // Create a test client to verify the transport works\n const testClient = new Client({ name: \"lunR-mcp-probe\", version: \"2.1.2\" });\n await testClient.connect(streamableTransport, this.buildRequestOptions(definition, signal));\n await testClient.close().catch(() => {});\n // Close probe transport before creating fresh one\n await streamableTransport.close().catch(() => {});\n\n // StreamableHTTP works - create fresh transport for actual use\n return new StreamableHTTPClientTransport(url, { requestInit, authProvider });\n } catch (error) {\n // StreamableHTTP failed, close and try SSE fallback\n await streamableTransport.close().catch(() => {});\n\n // Host cancellation is not transport capability evidence; do not fall\n // through to SSE when the caller is trying to cancel the connect.\n if (signal?.aborted) {\n throwIfAborted(signal);\n }\n\n // If this was an UnauthorizedError, don't try SSE - the server needs auth\n if (error instanceof UnauthorizedError) {\n throw error;\n }\n\n // SSE is the legacy transport\n return new SSEClientTransport(url, { requestInit, authProvider });\n }\n }\n\n private async fetchAllTools(client: Client, requestOptions?: RequestOptions): Promise<McpTool[]> {\n const allTools: McpTool[] = [];\n let cursor: string | undefined;\n\n do {\n const result = await client.listTools(cursor ? { cursor } : undefined, requestOptions);\n allTools.push(...(result.tools ?? []));\n cursor = result.nextCursor;\n } while (cursor);\n\n return allTools;\n }\n\n private async fetchAllResources(client: Client, requestOptions?: RequestOptions): Promise<McpResource[]> {\n try {\n const allResources: McpResource[] = [];\n let cursor: string | undefined;\n\n do {\n const result = await client.listResources(cursor ? { cursor } : undefined, requestOptions);\n allResources.push(...(result.resources ?? []));\n cursor = result.nextCursor;\n } while (cursor);\n\n return allResources;\n } catch {\n if (requestOptions?.signal?.aborted) {\n throwIfAborted(requestOptions.signal);\n }\n // Server may not support resources\n return [];\n }\n }\n\n private attachAdapterNotificationHandlers(serverName: string, client: Client): void {\n client.setNotificationHandler(serverStreamResultPatchNotificationSchema, (notification) => {\n const listener = this.uiStreamListeners.get(notification.params.streamToken);\n if (!listener) return;\n listener(serverName, notification.params);\n });\n }\n\n registerUiStreamListener(streamToken: string, listener: UiStreamListener): void {\n this.uiStreamListeners.set(streamToken, listener);\n }\n\n removeUiStreamListener(streamToken: string): void {\n this.uiStreamListeners.delete(streamToken);\n }\n\n async readResource(name: string, uri: string, signal?: AbortSignal): Promise<ReadResourceResult> {\n const connection = this.connections.get(name);\n if (!connection || connection.status !== \"connected\") {\n throw new Error(`Server \"${name}\" is not connected`);\n }\n\n try {\n this.touch(name);\n this.incrementInFlight(name);\n return await connection.client.readResource({ uri }, this.getRequestOptions(name, signal));\n } finally {\n this.decrementInFlight(name);\n this.touch(name);\n }\n }\n\n private async disposeConnection(connection: PendingConnection): Promise<void> {\n await connection.client.close().catch(() => {});\n await connection.transport.close().catch(() => {});\n }\n\n async close(name: string): Promise<void> {\n const connection = this.connections.get(name);\n if (!connection) return;\n\n // Delete from map BEFORE async cleanup to prevent a race where a\n // concurrent connect() creates a new connection that our deferred\n // delete() would then remove, orphaning the new server process.\n connection.status = \"closed\";\n this.connections.delete(name);\n this.acceptedUrlElicitations.delete(name);\n await this.disposeConnection(connection);\n }\n\n async closeAll(): Promise<void> {\n this.closing = true;\n const names = [...this.connections.keys()];\n const pending = [...this.pendingConnections.values()];\n await Promise.all([\n ...names.map(name => this.close(name)),\n ...pending.map(connection => this.disposeConnection(connection)),\n ]);\n }\n\n getConnection(name: string): ServerConnection | undefined {\n return this.connections.get(name);\n }\n\n getAllConnections(): Map<string, ServerConnection> {\n return new Map(this.connections);\n }\n\n touch(name: string): void {\n const connection = this.connections.get(name);\n if (connection) {\n connection.lastUsedAt = Date.now();\n }\n }\n\n incrementInFlight(name: string): void {\n const connection = this.connections.get(name);\n if (connection) {\n connection.inFlight = (connection.inFlight ?? 0) + 1;\n }\n }\n\n decrementInFlight(name: string): void {\n const connection = this.connections.get(name);\n if (connection && connection.inFlight) {\n connection.inFlight--;\n }\n }\n\n isIdle(name: string, timeoutMs: number): boolean {\n const connection = this.connections.get(name);\n if (!connection || connection.status !== \"connected\") return false;\n if (connection.inFlight > 0) return false;\n return (Date.now() - connection.lastUsedAt) > timeoutMs;\n }\n}\n\n/**\n * Resolve environment variables with interpolation.\n */\nfunction resolveEnv(env?: Record<string, string>): Record<string, string> {\n // Copy process.env, filtering out undefined values\n const resolved: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined) {\n resolved[key] = value;\n }\n }\n\n if (!env) return resolved;\n\n const overrides = interpolateEnvRecord(env);\n return overrides ? { ...resolved, ...overrides } : resolved;\n}\n\n/**\n * Resolve headers with environment variable interpolation.\n */\nfunction resolveHeaders(headers?: Record<string, string>): Record<string, string> | undefined {\n return interpolateEnvRecord(headers);\n}\n\nfunction normalizeRequestTimeoutMs(timeoutMs: number | undefined): number | undefined {\n return typeof timeoutMs === \"number\" && Number.isFinite(timeoutMs) && timeoutMs > 0\n ? timeoutMs\n : undefined;\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ExtensionContext } from "@ashx-j/lunr";
|
|
2
|
+
import type { McpAuthFlow } from "./mcp-auth-flow.ts";
|
|
2
3
|
import type { ConsentManager } from "./consent-manager.ts";
|
|
3
4
|
import type { McpLifecycleManager } from "./lifecycle.ts";
|
|
4
5
|
import type { McpServerManager } from "./server-manager.ts";
|
|
@@ -25,6 +26,7 @@ export type SendMessageFn = (message: {
|
|
|
25
26
|
triggerTurn?: boolean;
|
|
26
27
|
}) => void;
|
|
27
28
|
export interface McpExtensionState {
|
|
29
|
+
authFlow: McpAuthFlow;
|
|
28
30
|
manager: McpServerManager;
|
|
29
31
|
lifecycle: McpLifecycleManager;
|
|
30
32
|
toolMetadata: Map<string, ToolMetadata[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE;IACP,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,EACD,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,KAChC,IAAI,CAAC;AAEV,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,EAAE,mBAAmB,CAAC;IAC/B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAC1C,MAAM,EAAE,SAAS,CAAC;IAClB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,EAAE,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,CAAC,EAAE,aAAa,CAAC;CAC7B","sourcesContent":["// @ts-nocheck\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport type { ConsentManager } from \"./consent-manager.ts\";\nimport type { McpLifecycleManager } from \"./lifecycle.ts\";\nimport type { McpServerManager } from \"./server-manager.ts\";\nimport type { ToolMetadata, McpConfig, UiSessionMessages, UiStreamSummary } from \"./types.ts\";\nimport type { UiResourceHandler } from \"./ui-resource-handler.ts\";\nimport type { UiServerHandle } from \"./ui-server.ts\";\n\nexport interface CompletedUiSession {\n serverName: string;\n toolName: string;\n completedAt: Date;\n reason: string;\n messages: UiSessionMessages;\n stream?: UiStreamSummary;\n}\n\nexport type SendMessageFn = (\n message: {\n customType: string;\n content: Array<{ type: \"text\"; text: string }>;\n display?: string;\n details?: unknown;\n },\n options?: { triggerTurn?: boolean }\n) => void;\n\nexport interface McpExtensionState {\n manager: McpServerManager;\n lifecycle: McpLifecycleManager;\n toolMetadata: Map<string, ToolMetadata[]>;\n config: McpConfig;\n failureTracker: Map<string, number>;\n uiResourceHandler: UiResourceHandler;\n consentManager: ConsentManager;\n uiServer: UiServerHandle | null;\n completedUiSessions: CompletedUiSession[];\n openBrowser: (url: string) => Promise<void>;\n ui?: ExtensionContext[\"ui\"];\n sendMessage?: SendMessageFn;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE;IACP,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,EACD,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,KAChC,IAAI,CAAC;AAEV,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,WAAW,CAAC;IACtB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,EAAE,mBAAmB,CAAC;IAC/B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAC1C,MAAM,EAAE,SAAS,CAAC;IAClB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,EAAE,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,CAAC,EAAE,aAAa,CAAC;CAC7B","sourcesContent":["// @ts-nocheck\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport type { McpAuthFlow } from \"./mcp-auth-flow.ts\";\nimport type { ConsentManager } from \"./consent-manager.ts\";\nimport type { McpLifecycleManager } from \"./lifecycle.ts\";\nimport type { McpServerManager } from \"./server-manager.ts\";\nimport type { ToolMetadata, McpConfig, UiSessionMessages, UiStreamSummary } from \"./types.ts\";\nimport type { UiResourceHandler } from \"./ui-resource-handler.ts\";\nimport type { UiServerHandle } from \"./ui-server.ts\";\n\nexport interface CompletedUiSession {\n serverName: string;\n toolName: string;\n completedAt: Date;\n reason: string;\n messages: UiSessionMessages;\n stream?: UiStreamSummary;\n}\n\nexport type SendMessageFn = (\n message: {\n customType: string;\n content: Array<{ type: \"text\"; text: string }>;\n display?: string;\n details?: unknown;\n },\n options?: { triggerTurn?: boolean }\n) => void;\n\nexport interface McpExtensionState {\n authFlow: McpAuthFlow;\n manager: McpServerManager;\n lifecycle: McpLifecycleManager;\n toolMetadata: Map<string, ToolMetadata[]>;\n config: McpConfig;\n failureTracker: Map<string, number>;\n uiResourceHandler: UiResourceHandler;\n consentManager: ConsentManager;\n uiServer: UiServerHandle | null;\n completedUiSessions: CompletedUiSession[];\n openBrowser: (url: string) => Promise<void>;\n ui?: ExtensionContext[\"ui\"];\n sendMessage?: SendMessageFn;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/state.ts"],"names":[],"mappings":"","sourcesContent":["// @ts-nocheck\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport type { ConsentManager } from \"./consent-manager.ts\";\nimport type { McpLifecycleManager } from \"./lifecycle.ts\";\nimport type { McpServerManager } from \"./server-manager.ts\";\nimport type { ToolMetadata, McpConfig, UiSessionMessages, UiStreamSummary } from \"./types.ts\";\nimport type { UiResourceHandler } from \"./ui-resource-handler.ts\";\nimport type { UiServerHandle } from \"./ui-server.ts\";\n\nexport interface CompletedUiSession {\n serverName: string;\n toolName: string;\n completedAt: Date;\n reason: string;\n messages: UiSessionMessages;\n stream?: UiStreamSummary;\n}\n\nexport type SendMessageFn = (\n message: {\n customType: string;\n content: Array<{ type: \"text\"; text: string }>;\n display?: string;\n details?: unknown;\n },\n options?: { triggerTurn?: boolean }\n) => void;\n\nexport interface McpExtensionState {\n manager: McpServerManager;\n lifecycle: McpLifecycleManager;\n toolMetadata: Map<string, ToolMetadata[]>;\n config: McpConfig;\n failureTracker: Map<string, number>;\n uiResourceHandler: UiResourceHandler;\n consentManager: ConsentManager;\n uiServer: UiServerHandle | null;\n completedUiSessions: CompletedUiSession[];\n openBrowser: (url: string) => Promise<void>;\n ui?: ExtensionContext[\"ui\"];\n sendMessage?: SendMessageFn;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/state.ts"],"names":[],"mappings":"","sourcesContent":["// @ts-nocheck\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport type { McpAuthFlow } from \"./mcp-auth-flow.ts\";\nimport type { ConsentManager } from \"./consent-manager.ts\";\nimport type { McpLifecycleManager } from \"./lifecycle.ts\";\nimport type { McpServerManager } from \"./server-manager.ts\";\nimport type { ToolMetadata, McpConfig, UiSessionMessages, UiStreamSummary } from \"./types.ts\";\nimport type { UiResourceHandler } from \"./ui-resource-handler.ts\";\nimport type { UiServerHandle } from \"./ui-server.ts\";\n\nexport interface CompletedUiSession {\n serverName: string;\n toolName: string;\n completedAt: Date;\n reason: string;\n messages: UiSessionMessages;\n stream?: UiStreamSummary;\n}\n\nexport type SendMessageFn = (\n message: {\n customType: string;\n content: Array<{ type: \"text\"; text: string }>;\n display?: string;\n details?: unknown;\n },\n options?: { triggerTurn?: boolean }\n) => void;\n\nexport interface McpExtensionState {\n authFlow: McpAuthFlow;\n manager: McpServerManager;\n lifecycle: McpLifecycleManager;\n toolMetadata: Map<string, ToolMetadata[]>;\n config: McpConfig;\n failureTracker: Map<string, number>;\n uiResourceHandler: UiResourceHandler;\n consentManager: ConsentManager;\n uiServer: UiServerHandle | null;\n completedUiSessions: CompletedUiSession[];\n openBrowser: (url: string) => Promise<void>;\n ui?: ExtensionContext[\"ui\"];\n sendMessage?: SendMessageFn;\n}\n"]}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Setup:
|
|
7
7
|
* 1. Get an API key from https://ollama.com
|
|
8
|
-
* 2. Add to auth.json in the agent config dir (~/.
|
|
8
|
+
* 2. Add to auth.json in the agent config dir (~/.lunr/agent/auth.json, or set PI_CODING_AGENT_DIR):
|
|
9
9
|
* { "ollama-cloud": { "type": "api_key", "key": "your-key" } }
|
|
10
10
|
* 3. Run /refresh to fetch model metadata
|
|
11
11
|
* 4. Use /model or ctrl+l to select an Ollama Cloud model
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-ollama-cloud/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAgD,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-ollama-cloud/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAgD,MAAM,iCAAiC,CAAC;AAwElH,yBAA+B,EAAE,EAAE,YAAY,iBAiB9C","sourcesContent":["/**\n * Ollama Cloud Provider Extension\n *\n * Registers Ollama Cloud as a model provider with dynamically fetched models.\n *\n * Setup:\n * 1. Get an API key from https://ollama.com\n * 2. Add to auth.json in the agent config dir (~/.lunr/agent/auth.json, or set PI_CODING_AGENT_DIR):\n * { \"ollama-cloud\": { \"type\": \"api_key\", \"key\": \"your-key\" } }\n * 3. Run /refresh to fetch model metadata\n * 4. Use /model or ctrl+l to select an Ollama Cloud model\n *\n * Two endpoints are used to build the model list:\n * - GET https://ollama.com/v1/models -> list of model IDs\n * - POST https://ollama.com/api/show -> per-model details (capabilities, context length)\n *\n * Raw /api/show responses are cached at <agentDir>/cache/ollama-cloud-models.json\n * so the provider assembly can be debugged and re-derived without re-fetching.\n *\n * Startup behavior:\n * - Missing cache: uses baked-in GENERATED_MODELS (manually generated via\n * `npm run generate-models` and committed to the repo).\n * - Stale or fresh cache: uses the cached data immediately. Cloud fetch only\n * from /refresh when network is allowed (session_start stays cache-only).\n *\n * Only models with \"tools\" capability are registered.\n */\n\nimport type { ExtensionAPI, ExtensionCommandContext, ProviderModelConfig } from \"@ashx-j/lunr\";\nimport { GENERATED_MODELS } from \"./models.generated.ts\";\nimport {\n assembleModels,\n fetchModels,\n type OllamaDiscoveryAuth,\n OLLAMA_BASE,\n type RefreshProgress,\n readCacheState,\n writeCache,\n} from \"./models.ts\";\n// Web tools (ollama_web_search, ollama_web_fetch) excluded — API type mismatches with current pi-coding-agent version. TODO: re-include after updating web-tools.ts to match current AgentToolResult/AuthStorage APIs.\n// lunr 2026-08-02: the no-op /settings \"Ollama web tools\" row, the @lunr/ollama-webtools bridge, and config.ts (webTools key, PI_OLLAMA_WEB_TOOLS) were removed — they toggled state nothing consumed. A leftover \"webTools\" key in ollama-cloud.json is harmless.\n\n// --- Registrations ---\n\nfunction registerProvider(pi: ExtensionAPI, models: ProviderModelConfig[]) {\n pi.registerProvider(\"ollama-cloud\", {\n name: \"Ollama Cloud\",\n baseUrl: `${OLLAMA_BASE}/v1`,\n apiKey: \"$OLLAMA_API_KEY\",\n api: \"openai-completions\",\n models,\n });\n}\n\nfunction renderProgressBar(current: number, total: number, width = 15): string {\n if (total <= 0) return `[${\"░\".repeat(width)}]`;\n const ratio = Math.max(0, Math.min(1, current / total));\n const filled = Math.round(ratio * width);\n return `[${\"█\".repeat(filled)}${\"░\".repeat(width - filled)}]`;\n}\n\nfunction createRefreshProgressUi(ctx: Pick<ExtensionCommandContext, \"ui\">) {\n const key = \"ollama-cloud-refresh\";\n return {\n update(progress: RefreshProgress) {\n const current = progress.current ?? 0;\n const total = progress.total ?? 0;\n ctx.ui.setWidget(key, [renderProgressBar(current, total)], { placement: \"belowEditor\" });\n },\n clear() {\n ctx.ui.setWidget(key, undefined);\n ctx.ui.setStatus(key, undefined);\n ctx.ui.setWorkingMessage();\n },\n };\n}\n\nasync function runRefresh(pi: ExtensionAPI, ctx: Pick<ExtensionCommandContext, \"ui\"> & { auth?: OllamaDiscoveryAuth }) {\n const progressUi = createRefreshProgressUi(ctx);\n try {\n progressUi.update({ stage: \"list\", message: \"Starting refresh...\" });\n\n const raw = await fetchModels(ctx, (progress) => progressUi.update(progress));\n if (!raw) return false;\n if (Object.keys(raw).length === 0) return false;\n\n writeCache(raw);\n const newModels = assembleModels(raw);\n\n registerProvider(pi, newModels);\n\n ctx.ui.notify(`Registered ${newModels.length} Ollama Cloud models`, \"info\");\n return true;\n } finally {\n progressUi.clear();\n }\n}\n\n// --- Main ---\n\nexport default async function (pi: ExtensionAPI) {\n const cacheState = readCacheState();\n // When cache is missing, GENERATED_MODELS serves as the cache —\n // it is manually generated via `npm run generate-models` and committed to the repo.\n // Stale cache is used immediately; Cloud fetch only from /refresh (when network is allowed).\n // GENERATED_MODELS ships with the package (36 tool-capable models from\n // the build script). Used when no local cache exists. A fresh user cache\n // from /refresh takes precedence over the generated list.\n const models = cacheState.status === \"missing\" ? GENERATED_MODELS : assembleModels(cacheState.models);\n\n registerProvider(pi, models);\n // lunr: no user-visible command here — /refresh is the single refresh entry\n // point. Core triggers this extension's refresh through the bridge because\n // it bypasses the refreshModels hook and re-registers the provider wholesale.\n (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/ollama-cloud-refresh\")] = (\n ctx: Pick<ExtensionCommandContext, \"ui\"> & { auth?: OllamaDiscoveryAuth },\n ) => runRefresh(pi, ctx);\n}\n"]}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Setup:
|
|
7
7
|
* 1. Get an API key from https://ollama.com
|
|
8
|
-
* 2. Add to auth.json in the agent config dir (~/.
|
|
8
|
+
* 2. Add to auth.json in the agent config dir (~/.lunr/agent/auth.json, or set PI_CODING_AGENT_DIR):
|
|
9
9
|
* { "ollama-cloud": { "type": "api_key", "key": "your-key" } }
|
|
10
10
|
* 3. Run /refresh to fetch model metadata
|
|
11
11
|
* 4. Use /model or ctrl+l to select an Ollama Cloud model
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-ollama-cloud/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACL,cAAc,EACd,WAAW,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-ollama-cloud/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Ollama Cloud Provider Extension\n *\n * Registers Ollama Cloud as a model provider with dynamically fetched models.\n *\n * Setup:\n * 1. Get an API key from https://ollama.com\n * 2. Add to auth.json in the agent config dir (~/.lunr/agent/auth.json, or set PI_CODING_AGENT_DIR):\n * { \"ollama-cloud\": { \"type\": \"api_key\", \"key\": \"your-key\" } }\n * 3. Run /refresh to fetch model metadata\n * 4. Use /model or ctrl+l to select an Ollama Cloud model\n *\n * Two endpoints are used to build the model list:\n * - GET https://ollama.com/v1/models -> list of model IDs\n * - POST https://ollama.com/api/show -> per-model details (capabilities, context length)\n *\n * Raw /api/show responses are cached at <agentDir>/cache/ollama-cloud-models.json\n * so the provider assembly can be debugged and re-derived without re-fetching.\n *\n * Startup behavior:\n * - Missing cache: uses baked-in GENERATED_MODELS (manually generated via\n * `npm run generate-models` and committed to the repo).\n * - Stale or fresh cache: uses the cached data immediately. Cloud fetch only\n * from /refresh when network is allowed (session_start stays cache-only).\n *\n * Only models with \"tools\" capability are registered.\n */\n\nimport type { ExtensionAPI, ExtensionCommandContext, ProviderModelConfig } from \"@ashx-j/lunr\";\nimport { GENERATED_MODELS } from \"./models.generated.ts\";\nimport {\n assembleModels,\n fetchModels,\n type OllamaDiscoveryAuth,\n OLLAMA_BASE,\n type RefreshProgress,\n readCacheState,\n writeCache,\n} from \"./models.ts\";\n// Web tools (ollama_web_search, ollama_web_fetch) excluded — API type mismatches with current pi-coding-agent version. TODO: re-include after updating web-tools.ts to match current AgentToolResult/AuthStorage APIs.\n// lunr 2026-08-02: the no-op /settings \"Ollama web tools\" row, the @lunr/ollama-webtools bridge, and config.ts (webTools key, PI_OLLAMA_WEB_TOOLS) were removed — they toggled state nothing consumed. A leftover \"webTools\" key in ollama-cloud.json is harmless.\n\n// --- Registrations ---\n\nfunction registerProvider(pi: ExtensionAPI, models: ProviderModelConfig[]) {\n pi.registerProvider(\"ollama-cloud\", {\n name: \"Ollama Cloud\",\n baseUrl: `${OLLAMA_BASE}/v1`,\n apiKey: \"$OLLAMA_API_KEY\",\n api: \"openai-completions\",\n models,\n });\n}\n\nfunction renderProgressBar(current: number, total: number, width = 15): string {\n if (total <= 0) return `[${\"░\".repeat(width)}]`;\n const ratio = Math.max(0, Math.min(1, current / total));\n const filled = Math.round(ratio * width);\n return `[${\"█\".repeat(filled)}${\"░\".repeat(width - filled)}]`;\n}\n\nfunction createRefreshProgressUi(ctx: Pick<ExtensionCommandContext, \"ui\">) {\n const key = \"ollama-cloud-refresh\";\n return {\n update(progress: RefreshProgress) {\n const current = progress.current ?? 0;\n const total = progress.total ?? 0;\n ctx.ui.setWidget(key, [renderProgressBar(current, total)], { placement: \"belowEditor\" });\n },\n clear() {\n ctx.ui.setWidget(key, undefined);\n ctx.ui.setStatus(key, undefined);\n ctx.ui.setWorkingMessage();\n },\n };\n}\n\nasync function runRefresh(pi: ExtensionAPI, ctx: Pick<ExtensionCommandContext, \"ui\"> & { auth?: OllamaDiscoveryAuth }) {\n const progressUi = createRefreshProgressUi(ctx);\n try {\n progressUi.update({ stage: \"list\", message: \"Starting refresh...\" });\n\n const raw = await fetchModels(ctx, (progress) => progressUi.update(progress));\n if (!raw) return false;\n if (Object.keys(raw).length === 0) return false;\n\n writeCache(raw);\n const newModels = assembleModels(raw);\n\n registerProvider(pi, newModels);\n\n ctx.ui.notify(`Registered ${newModels.length} Ollama Cloud models`, \"info\");\n return true;\n } finally {\n progressUi.clear();\n }\n}\n\n// --- Main ---\n\nexport default async function (pi: ExtensionAPI) {\n const cacheState = readCacheState();\n // When cache is missing, GENERATED_MODELS serves as the cache —\n // it is manually generated via `npm run generate-models` and committed to the repo.\n // Stale cache is used immediately; Cloud fetch only from /refresh (when network is allowed).\n // GENERATED_MODELS ships with the package (36 tool-capable models from\n // the build script). Used when no local cache exists. A fresh user cache\n // from /refresh takes precedence over the generated list.\n const models = cacheState.status === \"missing\" ? GENERATED_MODELS : assembleModels(cacheState.models);\n\n registerProvider(pi, models);\n // lunr: no user-visible command here — /refresh is the single refresh entry\n // point. Core triggers this extension's refresh through the bridge because\n // it bypasses the refreshModels hook and re-registers the provider wholesale.\n (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/ollama-cloud-refresh\")] = (\n ctx: Pick<ExtensionCommandContext, \"ui\"> & { auth?: OllamaDiscoveryAuth },\n ) => runRefresh(pi, ctx);\n}\n"]}
|
|
@@ -35,15 +35,21 @@ type CacheState = {
|
|
|
35
35
|
};
|
|
36
36
|
export declare function readCacheState(): CacheState;
|
|
37
37
|
export declare function writeCache(models: Record<string, CachedOllamaModel>): void;
|
|
38
|
-
/**
|
|
39
|
-
export
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
/** Canonical request auth is supplied by the owning runtime, never reread from global storage. */
|
|
39
|
+
export interface OllamaDiscoveryAuth {
|
|
40
|
+
apiKey?: string;
|
|
41
|
+
headers?: Record<string, string>;
|
|
42
|
+
}
|
|
43
|
+
export declare function fetchModelIds(auth: OllamaDiscoveryAuth, timeoutMs?: number): Promise<string[]>;
|
|
44
|
+
export declare function fetchModelDetails(id: string, auth: OllamaDiscoveryAuth, timeoutMs?: number): Promise<CachedOllamaModel>;
|
|
42
45
|
export declare function refreshOllamaCloudModels(params: {
|
|
46
|
+
auth?: OllamaDiscoveryAuth;
|
|
43
47
|
notify?: (message: string, level?: "info" | "error") => void;
|
|
44
48
|
onProgress?: (progress: RefreshProgress) => void;
|
|
45
49
|
workers?: number;
|
|
46
50
|
}): Promise<Record<string, CachedOllamaModel>>;
|
|
47
|
-
export declare function fetchModels(ctx: Pick<ExtensionCommandContext, "ui"
|
|
51
|
+
export declare function fetchModels(ctx: Pick<ExtensionCommandContext, "ui"> & {
|
|
52
|
+
auth?: OllamaDiscoveryAuth;
|
|
53
|
+
}, onProgress?: (progress: RefreshProgress) => void): Promise<Record<string, CachedOllamaModel> | null>;
|
|
48
54
|
export {};
|
|
49
55
|
//# sourceMappingURL=models.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-ollama-cloud/models.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAWpG,eAAO,MAAM,WAAW,QAA4E,CAAC;AAGrG,mCAAmC;AACnC,UAAU,kBAAkB;IAC1B,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAC1B,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,iBAAiB,GAAG,kBAAkB,CAAC;AAS5C,KAAK,oBAAoB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,oBAAoB,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAmDD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,mBAAmB,EAAE,CAgB5F;AAGD,KAAK,UAAU,GACX;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;CAAE,GAC9D;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;CAAE,GAC9D;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAqB1B,wBAAgB,cAAc,IAAI,UAAU,CAgB3C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAO1E;AAGD,oDAAoD;AACpD,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAexD;AAED,wBAAsB,aAAa,CAAC,SAAS,SAAmB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBnF;AAED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,SAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyB5G;AAED,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;IAC7D,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAkD7C;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,EACxC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,GAC/C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAAC,CAUnD","sourcesContent":["import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ExtensionCommandContext, ProviderModelConfig } from \"@ashx-j/lunr\";\nimport { getAgentDir } from \"../../config.ts\";\nimport { resolve as resolveThinkingLevelMap } from \"./thinking-levels.ts\";\nimport { concurrentMap, fetchJsonWithTimeout, getContextLength } from \"./utils.ts\";\n\n// --- Constants ---\nconst CACHE_DIR = join(getAgentDir(), \"cache\");\nconst CACHE_FILE = join(CACHE_DIR, \"ollama-cloud-models.json\");\nconst CACHE_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;\nconst FETCH_TIMEOUT_MS = 10000;\n\nexport const OLLAMA_BASE = (process.env.OLLAMA_API_BASE || \"https://ollama.com\").replace(/\\/+$/, \"\");\n\n// --- Raw API types ---\n/** Response from POST /api/show */\ninterface OllamaShowResponse {\n details: {\n parent_model: string;\n format: string;\n family: string;\n families: string[] | null;\n parameter_size: string;\n quantization_level: string;\n };\n model_info: Record<string, unknown>;\n capabilities: string[];\n modified_at: string;\n}\n\ntype CachedOllamaModel = OllamaShowResponse;\n\n/** On-disk cache: raw /api/show responses keyed by model ID. */\ninterface CachedData {\n /** Unix epoch milliseconds used to decide when the generated metadata is stale. */\n timestamp?: number;\n models: Record<string, CachedOllamaModel>;\n}\n\ntype RefreshProgressStage = \"list\" | \"details\" | \"done\";\n\nexport interface RefreshProgress {\n stage: RefreshProgressStage;\n current?: number;\n total?: number;\n failed?: number;\n message: string;\n}\n\n// --- Assembly: raw API data -> ProviderModelConfig[] ---\n\n/**\n * Build an explicit OpenAICompletionsCompat for an Ollama Cloud model.\n * Every flag is set explicitly so the contract is visible to maintainers.\n *\n * Ollama API reference: https://docs.ollama.com/api/openai-compatibility\n * pi type definition: https://github.com/earendil-works/pi/blob/b94482762321ed0b9f8f245be57c84d786a7105d/packages/ai/src/types.ts#L361-L400\n * pi compat resolution: https://docs.ollama.com/api/openai-compatibility https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/types.ts#L365-L425\n */\nfunction buildCompat(): ProviderModelConfig[\"compat\"] {\n return {\n // Ollama uses \"system\" role, not \"developer\" (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsDeveloperRole).\n supportsDeveloperRole: false,\n // reasoning_effort works (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsReasoningEffort, tested in think-experiment.md).\n supportsReasoningEffort: true,\n // \"store\" is not a supported field (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsStore).\n supportsStore: false,\n // Ollama lists \"max_tokens\", not \"max_completion_tokens\" (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#maxTokensField).\n maxTokensField: \"max_tokens\",\n // stream_options.include_usage is supported (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsUsageInStreaming).\n supportsUsageInStreaming: true,\n // Default: tool results don't need a name field (pi: types.ts#requiresToolResultName).\n requiresToolResultName: false,\n // Default: no assistant message required between tool result and user (pi: types.ts#requiresAssistantAfterToolResult).\n requiresAssistantAfterToolResult: false,\n // Ollama supports native thinking blocks (pi: types.ts#requiresThinkingAsText).\n requiresThinkingAsText: false,\n // DeepSeek-specific, not needed for Ollama (pi: types.ts#requiresReasoningContentOnAssistantMessages).\n requiresReasoningContentOnAssistantMessages: false,\n // reasoning_effort format works (pi: types.ts#thinkingFormat, tested in think-experiment.md).\n thinkingFormat: \"openai\",\n // Ollama does not support tool_choice, so strict mode is unavailable (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsStrictMode).\n supportsStrictMode: false,\n // Anthropic cache_control not relevant; Ollama has implicit KV cache only (pi: types.ts#cacheControlFormat).\n // Explicitly undefined: JSON.stringify drops undefined values, keeping\n // models.generated.ts structurally consistent with assembleModels() runtime output.\n // Session affinity headers not relevant for Ollama (pi: types.ts#sendSessionAffinityHeaders).\n sendSessionAffinityHeaders: false,\n // No explicit cache-retention API (pi: types.ts#supportsLongCacheRetention).\n supportsLongCacheRetention: false,\n // Not z.ai (pi: types.ts#zaiToolStream).\n zaiToolStream: false,\n cacheControlFormat: undefined,\n openRouterRouting: {},\n vercelGatewayRouting: {},\n };\n}\n\nexport function assembleModels(raw: Record<string, CachedOllamaModel>): ProviderModelConfig[] {\n return Object.entries(raw)\n .filter(([, data]) => data.capabilities?.includes(\"tools\"))\n .map(([id, data]) => ({\n id,\n name: id,\n reasoning: data.capabilities?.includes(\"thinking\") ?? false,\n thinkingLevelMap: resolveThinkingLevelMap(id, data.capabilities ?? []),\n input: (data.capabilities?.includes(\"vision\") ? [\"text\", \"image\"] : [\"text\"]) as (\"text\" | \"image\")[],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: getContextLength(data.model_info ?? {}),\n // No per-model limit exposed by the API (https://docs.ollama.com/api-reference/show-model-details,\n // https://github.com/ollama/ollama/issues/7222). 32768 matches most Ollama Cloud context windows.\n maxTokens: 32768,\n compat: buildCompat(),\n }));\n}\n\n// --- Cache I/O ---\ntype CacheState =\n | { status: \"fresh\"; models: Record<string, CachedOllamaModel> }\n | { status: \"stale\"; models: Record<string, CachedOllamaModel> }\n | { status: \"missing\" };\n\nfunction createCacheData(models: Record<string, CachedOllamaModel>, now = new Date()): CachedData {\n return { timestamp: now.getTime(), models };\n}\n\nfunction readCacheData(path: string): CachedData | null {\n try {\n const data: CachedData = JSON.parse(readFileSync(path, \"utf-8\"));\n if (!data.models || Object.keys(data.models).length === 0) return null;\n return data;\n } catch {\n return null;\n }\n}\n\nfunction isFreshGeneratedCache(data: CachedData): boolean {\n if (typeof data.timestamp !== \"number\" || !Number.isFinite(data.timestamp)) return false;\n return Date.now() - data.timestamp <= CACHE_MAX_AGE_MS;\n}\n\nexport function readCacheState(): CacheState {\n if (!existsSync(CACHE_FILE)) return { status: \"missing\" };\n\n const data = readCacheData(CACHE_FILE);\n if (!data) {\n try {\n rmSync(CACHE_FILE, { force: true });\n } catch {\n // Ignore cache delete errors.\n }\n return { status: \"missing\" };\n }\n\n return isFreshGeneratedCache(data)\n ? { status: \"fresh\", models: data.models }\n : { status: \"stale\", models: data.models };\n}\n\nexport function writeCache(models: Record<string, CachedOllamaModel>): void {\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify(createCacheData(models), null, 2));\n } catch {\n // Ignore cache write errors\n }\n}\n\n// --- Fetch Models ---\n/** Env key first, then stored auth.json api_key. */\nexport function resolveOllamaApiKey(): string | undefined {\n const envKey = process.env.OLLAMA_API_KEY?.trim();\n if (envKey) return envKey;\n try {\n const raw = readFileSync(join(getAgentDir(), \"auth.json\"), \"utf-8\");\n const data = JSON.parse(raw) as Record<string, { type?: string; key?: string }>;\n const cred = data[\"ollama-cloud\"];\n if (cred?.type === \"api_key\" && typeof cred.key === \"string\") {\n const key = cred.key.trim();\n if (key) return key;\n }\n } catch {\n // Missing or unreadable auth.json — treat as no key.\n }\n return undefined;\n}\n\nexport async function fetchModelIds(timeoutMs = FETCH_TIMEOUT_MS): Promise<string[]> {\n const headers: Record<string, string> = {};\n const apiKey = resolveOllamaApiKey();\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n const res = await fetchJsonWithTimeout<{ data: { id: string }[] }>(\n `${OLLAMA_BASE}/v1/models`,\n { headers },\n timeoutMs,\n );\n\n if (res.status === 429) {\n throw new Error(\"Ollama Cloud rate limited. Try again shortly.\");\n }\n if (!res.ok || !res.data) {\n throw new Error(`Failed to fetch model list: ${res.status}${res.error ? ` - ${res.error}` : \"\"}`);\n }\n\n return res.data.data.map((m) => m.id);\n}\n\nexport async function fetchModelDetails(id: string, timeoutMs = FETCH_TIMEOUT_MS): Promise<CachedOllamaModel> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n const apiKey = resolveOllamaApiKey();\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n const res = await fetchJsonWithTimeout<OllamaShowResponse>(\n `${OLLAMA_BASE}/api/show`,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify({ model: id }),\n },\n timeoutMs,\n );\n\n if (res.status === 429) {\n throw new Error(\"Ollama Cloud rate limited. Try again shortly.\");\n }\n if (!res.ok || !res.data) {\n throw new Error(`Failed to fetch /api/show for ${id}: ${res.status}${res.error ? ` - ${res.error}` : \"\"}`);\n }\n\n return res.data;\n}\n\nexport async function refreshOllamaCloudModels(params: {\n notify?: (message: string, level?: \"info\" | \"error\") => void;\n onProgress?: (progress: RefreshProgress) => void;\n workers?: number;\n}): Promise<Record<string, CachedOllamaModel>> {\n const notify = params.notify ?? (() => undefined);\n const onProgress = params.onProgress ?? (() => undefined);\n if (!resolveOllamaApiKey()) {\n notify(\"Ollama Cloud skipped (no API key)\");\n return {};\n }\n onProgress({ stage: \"list\", message: \"Fetching model list...\" });\n const modelIds = await fetchModelIds();\n notify(`Found ${modelIds.length} models, fetching details...`);\n onProgress({ stage: \"details\", current: 0, total: modelIds.length, failed: 0, message: \"Fetching model details\" });\n\n let detailsDone = 0;\n let detailsFailed = 0;\n const detailResults = await concurrentMap(modelIds, params.workers ?? 8, async (id) => {\n try {\n return [id, await fetchModelDetails(id)] as const;\n } catch (error) {\n detailsFailed++;\n throw error;\n } finally {\n detailsDone++;\n onProgress({\n stage: \"details\",\n current: detailsDone,\n total: modelIds.length,\n failed: detailsFailed,\n message: \"Fetching model details\",\n });\n }\n });\n const models: Record<string, CachedOllamaModel> = {};\n for (const result of detailResults) {\n if (result.status === \"fulfilled\") {\n const [id, data] = result.value;\n models[id] = data;\n }\n }\n const succeeded = Object.keys(models).length;\n if (succeeded === 0)\n throw new Error(`Failed to fetch model details${detailsFailed ? ` (${detailsFailed} failed)` : \"\"}`);\n notify(`Fetched ${succeeded} model details${detailsFailed ? ` (${detailsFailed} failed)` : \"\"}`, \"info\");\n\n onProgress({\n stage: \"done\",\n current: Object.keys(models).length,\n total: Object.keys(models).length,\n message: \"Done\",\n });\n return models;\n}\n\nexport async function fetchModels(\n ctx: Pick<ExtensionCommandContext, \"ui\">,\n onProgress?: (progress: RefreshProgress) => void,\n): Promise<Record<string, CachedOllamaModel> | null> {\n try {\n return await refreshOllamaCloudModels({\n notify: (message, level) => ctx.ui.notify(message, level),\n onProgress,\n });\n } catch (error) {\n ctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n return null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-ollama-cloud/models.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAWpG,eAAO,MAAM,WAAW,QAA4E,CAAC;AAGrG,mCAAmC;AACnC,UAAU,kBAAkB;IAC1B,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAC1B,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,iBAAiB,GAAG,kBAAkB,CAAC;AAS5C,KAAK,oBAAoB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,oBAAoB,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAmDD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,mBAAmB,EAAE,CAgB5F;AAGD,KAAK,UAAU,GACX;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;CAAE,GAC9D;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;CAAE,GAC9D;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAqB1B,wBAAgB,cAAc,IAAI,UAAU,CAgB3C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAO1E;AAGD,kGAAkG;AAClG,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,mBAAmB,EAAE,SAAS,SAAmB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqB9G;AAED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,SAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyBvI;AAED,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;IAC7D,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAkD7C;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,mBAAmB,CAAA;CAAE,EACzE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,GAC/C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAAC,CAWnD","sourcesContent":["import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ExtensionCommandContext, ProviderModelConfig } from \"@ashx-j/lunr\";\nimport { getAgentDir } from \"../../config.ts\";\nimport { resolve as resolveThinkingLevelMap } from \"./thinking-levels.ts\";\nimport { concurrentMap, fetchJsonWithTimeout, getContextLength } from \"./utils.ts\";\n\n// --- Constants ---\nconst CACHE_DIR = join(getAgentDir(), \"cache\");\nconst CACHE_FILE = join(CACHE_DIR, \"ollama-cloud-models.json\");\nconst CACHE_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;\nconst FETCH_TIMEOUT_MS = 10000;\n\nexport const OLLAMA_BASE = (process.env.OLLAMA_API_BASE || \"https://ollama.com\").replace(/\\/+$/, \"\");\n\n// --- Raw API types ---\n/** Response from POST /api/show */\ninterface OllamaShowResponse {\n details: {\n parent_model: string;\n format: string;\n family: string;\n families: string[] | null;\n parameter_size: string;\n quantization_level: string;\n };\n model_info: Record<string, unknown>;\n capabilities: string[];\n modified_at: string;\n}\n\ntype CachedOllamaModel = OllamaShowResponse;\n\n/** On-disk cache: raw /api/show responses keyed by model ID. */\ninterface CachedData {\n /** Unix epoch milliseconds used to decide when the generated metadata is stale. */\n timestamp?: number;\n models: Record<string, CachedOllamaModel>;\n}\n\ntype RefreshProgressStage = \"list\" | \"details\" | \"done\";\n\nexport interface RefreshProgress {\n stage: RefreshProgressStage;\n current?: number;\n total?: number;\n failed?: number;\n message: string;\n}\n\n// --- Assembly: raw API data -> ProviderModelConfig[] ---\n\n/**\n * Build an explicit OpenAICompletionsCompat for an Ollama Cloud model.\n * Every flag is set explicitly so the contract is visible to maintainers.\n *\n * Ollama API reference: https://docs.ollama.com/api/openai-compatibility\n * pi type definition: https://github.com/earendil-works/pi/blob/b94482762321ed0b9f8f245be57c84d786a7105d/packages/ai/src/types.ts#L361-L400\n * pi compat resolution: https://docs.ollama.com/api/openai-compatibility https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/types.ts#L365-L425\n */\nfunction buildCompat(): ProviderModelConfig[\"compat\"] {\n return {\n // Ollama uses \"system\" role, not \"developer\" (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsDeveloperRole).\n supportsDeveloperRole: false,\n // reasoning_effort works (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsReasoningEffort, tested in think-experiment.md).\n supportsReasoningEffort: true,\n // \"store\" is not a supported field (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsStore).\n supportsStore: false,\n // Ollama lists \"max_tokens\", not \"max_completion_tokens\" (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#maxTokensField).\n maxTokensField: \"max_tokens\",\n // stream_options.include_usage is supported (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsUsageInStreaming).\n supportsUsageInStreaming: true,\n // Default: tool results don't need a name field (pi: types.ts#requiresToolResultName).\n requiresToolResultName: false,\n // Default: no assistant message required between tool result and user (pi: types.ts#requiresAssistantAfterToolResult).\n requiresAssistantAfterToolResult: false,\n // Ollama supports native thinking blocks (pi: types.ts#requiresThinkingAsText).\n requiresThinkingAsText: false,\n // DeepSeek-specific, not needed for Ollama (pi: types.ts#requiresReasoningContentOnAssistantMessages).\n requiresReasoningContentOnAssistantMessages: false,\n // reasoning_effort format works (pi: types.ts#thinkingFormat, tested in think-experiment.md).\n thinkingFormat: \"openai\",\n // Ollama does not support tool_choice, so strict mode is unavailable (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsStrictMode).\n supportsStrictMode: false,\n // Anthropic cache_control not relevant; Ollama has implicit KV cache only (pi: types.ts#cacheControlFormat).\n // Explicitly undefined: JSON.stringify drops undefined values, keeping\n // models.generated.ts structurally consistent with assembleModels() runtime output.\n // Session affinity headers not relevant for Ollama (pi: types.ts#sendSessionAffinityHeaders).\n sendSessionAffinityHeaders: false,\n // No explicit cache-retention API (pi: types.ts#supportsLongCacheRetention).\n supportsLongCacheRetention: false,\n // Not z.ai (pi: types.ts#zaiToolStream).\n zaiToolStream: false,\n cacheControlFormat: undefined,\n openRouterRouting: {},\n vercelGatewayRouting: {},\n };\n}\n\nexport function assembleModels(raw: Record<string, CachedOllamaModel>): ProviderModelConfig[] {\n return Object.entries(raw)\n .filter(([, data]) => data.capabilities?.includes(\"tools\"))\n .map(([id, data]) => ({\n id,\n name: id,\n reasoning: data.capabilities?.includes(\"thinking\") ?? false,\n thinkingLevelMap: resolveThinkingLevelMap(id, data.capabilities ?? []),\n input: (data.capabilities?.includes(\"vision\") ? [\"text\", \"image\"] : [\"text\"]) as (\"text\" | \"image\")[],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: getContextLength(data.model_info ?? {}),\n // No per-model limit exposed by the API (https://docs.ollama.com/api-reference/show-model-details,\n // https://github.com/ollama/ollama/issues/7222). 32768 matches most Ollama Cloud context windows.\n maxTokens: 32768,\n compat: buildCompat(),\n }));\n}\n\n// --- Cache I/O ---\ntype CacheState =\n | { status: \"fresh\"; models: Record<string, CachedOllamaModel> }\n | { status: \"stale\"; models: Record<string, CachedOllamaModel> }\n | { status: \"missing\" };\n\nfunction createCacheData(models: Record<string, CachedOllamaModel>, now = new Date()): CachedData {\n return { timestamp: now.getTime(), models };\n}\n\nfunction readCacheData(path: string): CachedData | null {\n try {\n const data: CachedData = JSON.parse(readFileSync(path, \"utf-8\"));\n if (!data.models || Object.keys(data.models).length === 0) return null;\n return data;\n } catch {\n return null;\n }\n}\n\nfunction isFreshGeneratedCache(data: CachedData): boolean {\n if (typeof data.timestamp !== \"number\" || !Number.isFinite(data.timestamp)) return false;\n return Date.now() - data.timestamp <= CACHE_MAX_AGE_MS;\n}\n\nexport function readCacheState(): CacheState {\n if (!existsSync(CACHE_FILE)) return { status: \"missing\" };\n\n const data = readCacheData(CACHE_FILE);\n if (!data) {\n try {\n rmSync(CACHE_FILE, { force: true });\n } catch {\n // Ignore cache delete errors.\n }\n return { status: \"missing\" };\n }\n\n return isFreshGeneratedCache(data)\n ? { status: \"fresh\", models: data.models }\n : { status: \"stale\", models: data.models };\n}\n\nexport function writeCache(models: Record<string, CachedOllamaModel>): void {\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify(createCacheData(models), null, 2));\n } catch {\n // Ignore cache write errors\n }\n}\n\n// --- Fetch Models ---\n/** Canonical request auth is supplied by the owning runtime, never reread from global storage. */\nexport interface OllamaDiscoveryAuth {\n apiKey?: string;\n headers?: Record<string, string>;\n}\n\nexport async function fetchModelIds(auth: OllamaDiscoveryAuth, timeoutMs = FETCH_TIMEOUT_MS): Promise<string[]> {\n const headers: Record<string, string> = { ...auth.headers };\n const apiKey = auth.apiKey;\n if (apiKey && !Object.keys(headers).some((name) => name.toLowerCase() === \"authorization\")) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n const res = await fetchJsonWithTimeout<{ data: { id: string }[] }>(\n `${OLLAMA_BASE}/v1/models`,\n { headers },\n timeoutMs,\n );\n\n if (res.status === 429) {\n throw new Error(\"Ollama Cloud rate limited. Try again shortly.\");\n }\n if (!res.ok || !res.data) {\n throw new Error(`Failed to fetch model list: ${res.status}${res.error ? ` - ${res.error}` : \"\"}`);\n }\n\n return res.data.data.map((m) => m.id);\n}\n\nexport async function fetchModelDetails(id: string, auth: OllamaDiscoveryAuth, timeoutMs = FETCH_TIMEOUT_MS): Promise<CachedOllamaModel> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\", ...auth.headers };\n const apiKey = auth.apiKey;\n if (apiKey && !Object.keys(headers).some((name) => name.toLowerCase() === \"authorization\")) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n const res = await fetchJsonWithTimeout<OllamaShowResponse>(\n `${OLLAMA_BASE}/api/show`,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify({ model: id }),\n },\n timeoutMs,\n );\n\n if (res.status === 429) {\n throw new Error(\"Ollama Cloud rate limited. Try again shortly.\");\n }\n if (!res.ok || !res.data) {\n throw new Error(`Failed to fetch /api/show for ${id}: ${res.status}${res.error ? ` - ${res.error}` : \"\"}`);\n }\n\n return res.data;\n}\n\nexport async function refreshOllamaCloudModels(params: {\n auth?: OllamaDiscoveryAuth;\n notify?: (message: string, level?: \"info\" | \"error\") => void;\n onProgress?: (progress: RefreshProgress) => void;\n workers?: number;\n}): Promise<Record<string, CachedOllamaModel>> {\n const notify = params.notify ?? (() => undefined);\n const onProgress = params.onProgress ?? (() => undefined);\n if (!params.auth?.apiKey && !Object.entries(params.auth?.headers ?? {}).some(([name, value]) => name.toLowerCase() === \"authorization\" && value)) {\n notify(\"Ollama Cloud skipped (no API key)\");\n return {};\n }\n onProgress({ stage: \"list\", message: \"Fetching model list...\" });\n const modelIds = await fetchModelIds(params.auth ?? {});\n notify(`Found ${modelIds.length} models, fetching details...`);\n onProgress({ stage: \"details\", current: 0, total: modelIds.length, failed: 0, message: \"Fetching model details\" });\n\n let detailsDone = 0;\n let detailsFailed = 0;\n const detailResults = await concurrentMap(modelIds, params.workers ?? 8, async (id) => {\n try {\n return [id, await fetchModelDetails(id, params.auth ?? {})] as const;\n } catch (error) {\n detailsFailed++;\n throw error;\n } finally {\n detailsDone++;\n onProgress({\n stage: \"details\",\n current: detailsDone,\n total: modelIds.length,\n failed: detailsFailed,\n message: \"Fetching model details\",\n });\n }\n });\n const models: Record<string, CachedOllamaModel> = {};\n for (const result of detailResults) {\n if (result.status === \"fulfilled\") {\n const [id, data] = result.value;\n models[id] = data;\n }\n }\n const succeeded = Object.keys(models).length;\n if (succeeded === 0)\n throw new Error(`Failed to fetch model details${detailsFailed ? ` (${detailsFailed} failed)` : \"\"}`);\n notify(`Fetched ${succeeded} model details${detailsFailed ? ` (${detailsFailed} failed)` : \"\"}`, \"info\");\n\n onProgress({\n stage: \"done\",\n current: Object.keys(models).length,\n total: Object.keys(models).length,\n message: \"Done\",\n });\n return models;\n}\n\nexport async function fetchModels(\n ctx: Pick<ExtensionCommandContext, \"ui\"> & { auth?: OllamaDiscoveryAuth },\n onProgress?: (progress: RefreshProgress) => void,\n): Promise<Record<string, CachedOllamaModel> | null> {\n try {\n return await refreshOllamaCloudModels({\n auth: ctx.auth,\n notify: (message, level) => ctx.ui.notify(message, level),\n onProgress,\n });\n } catch (error) {\n ctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n return null;\n }\n}\n"]}
|
|
@@ -118,31 +118,10 @@ export function writeCache(models) {
|
|
|
118
118
|
// Ignore cache write errors
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
if (envKey)
|
|
126
|
-
return envKey;
|
|
127
|
-
try {
|
|
128
|
-
const raw = readFileSync(join(getAgentDir(), "auth.json"), "utf-8");
|
|
129
|
-
const data = JSON.parse(raw);
|
|
130
|
-
const cred = data["ollama-cloud"];
|
|
131
|
-
if (cred?.type === "api_key" && typeof cred.key === "string") {
|
|
132
|
-
const key = cred.key.trim();
|
|
133
|
-
if (key)
|
|
134
|
-
return key;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
catch {
|
|
138
|
-
// Missing or unreadable auth.json — treat as no key.
|
|
139
|
-
}
|
|
140
|
-
return undefined;
|
|
141
|
-
}
|
|
142
|
-
export async function fetchModelIds(timeoutMs = FETCH_TIMEOUT_MS) {
|
|
143
|
-
const headers = {};
|
|
144
|
-
const apiKey = resolveOllamaApiKey();
|
|
145
|
-
if (apiKey) {
|
|
121
|
+
export async function fetchModelIds(auth, timeoutMs = FETCH_TIMEOUT_MS) {
|
|
122
|
+
const headers = { ...auth.headers };
|
|
123
|
+
const apiKey = auth.apiKey;
|
|
124
|
+
if (apiKey && !Object.keys(headers).some((name) => name.toLowerCase() === "authorization")) {
|
|
146
125
|
headers.Authorization = `Bearer ${apiKey}`;
|
|
147
126
|
}
|
|
148
127
|
const res = await fetchJsonWithTimeout(`${OLLAMA_BASE}/v1/models`, { headers }, timeoutMs);
|
|
@@ -154,10 +133,10 @@ export async function fetchModelIds(timeoutMs = FETCH_TIMEOUT_MS) {
|
|
|
154
133
|
}
|
|
155
134
|
return res.data.data.map((m) => m.id);
|
|
156
135
|
}
|
|
157
|
-
export async function fetchModelDetails(id, timeoutMs = FETCH_TIMEOUT_MS) {
|
|
158
|
-
const headers = { "Content-Type": "application/json" };
|
|
159
|
-
const apiKey =
|
|
160
|
-
if (apiKey) {
|
|
136
|
+
export async function fetchModelDetails(id, auth, timeoutMs = FETCH_TIMEOUT_MS) {
|
|
137
|
+
const headers = { "Content-Type": "application/json", ...auth.headers };
|
|
138
|
+
const apiKey = auth.apiKey;
|
|
139
|
+
if (apiKey && !Object.keys(headers).some((name) => name.toLowerCase() === "authorization")) {
|
|
161
140
|
headers.Authorization = `Bearer ${apiKey}`;
|
|
162
141
|
}
|
|
163
142
|
const res = await fetchJsonWithTimeout(`${OLLAMA_BASE}/api/show`, {
|
|
@@ -176,19 +155,19 @@ export async function fetchModelDetails(id, timeoutMs = FETCH_TIMEOUT_MS) {
|
|
|
176
155
|
export async function refreshOllamaCloudModels(params) {
|
|
177
156
|
const notify = params.notify ?? (() => undefined);
|
|
178
157
|
const onProgress = params.onProgress ?? (() => undefined);
|
|
179
|
-
if (!
|
|
158
|
+
if (!params.auth?.apiKey && !Object.entries(params.auth?.headers ?? {}).some(([name, value]) => name.toLowerCase() === "authorization" && value)) {
|
|
180
159
|
notify("Ollama Cloud skipped (no API key)");
|
|
181
160
|
return {};
|
|
182
161
|
}
|
|
183
162
|
onProgress({ stage: "list", message: "Fetching model list..." });
|
|
184
|
-
const modelIds = await fetchModelIds();
|
|
163
|
+
const modelIds = await fetchModelIds(params.auth ?? {});
|
|
185
164
|
notify(`Found ${modelIds.length} models, fetching details...`);
|
|
186
165
|
onProgress({ stage: "details", current: 0, total: modelIds.length, failed: 0, message: "Fetching model details" });
|
|
187
166
|
let detailsDone = 0;
|
|
188
167
|
let detailsFailed = 0;
|
|
189
168
|
const detailResults = await concurrentMap(modelIds, params.workers ?? 8, async (id) => {
|
|
190
169
|
try {
|
|
191
|
-
return [id, await fetchModelDetails(id)];
|
|
170
|
+
return [id, await fetchModelDetails(id, params.auth ?? {})];
|
|
192
171
|
}
|
|
193
172
|
catch (error) {
|
|
194
173
|
detailsFailed++;
|
|
@@ -227,6 +206,7 @@ export async function refreshOllamaCloudModels(params) {
|
|
|
227
206
|
export async function fetchModels(ctx, onProgress) {
|
|
228
207
|
try {
|
|
229
208
|
return await refreshOllamaCloudModels({
|
|
209
|
+
auth: ctx.auth,
|
|
230
210
|
notify: (message, level) => ctx.ui.notify(message, level),
|
|
231
211
|
onProgress,
|
|
232
212
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-ollama-cloud/models.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ExtensionCommandContext, ProviderModelConfig } from \"@ashx-j/lunr\";\nimport { getAgentDir } from \"../../config.ts\";\nimport { resolve as resolveThinkingLevelMap } from \"./thinking-levels.ts\";\nimport { concurrentMap, fetchJsonWithTimeout, getContextLength } from \"./utils.ts\";\n\n// --- Constants ---\nconst CACHE_DIR = join(getAgentDir(), \"cache\");\nconst CACHE_FILE = join(CACHE_DIR, \"ollama-cloud-models.json\");\nconst CACHE_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;\nconst FETCH_TIMEOUT_MS = 10000;\n\nexport const OLLAMA_BASE = (process.env.OLLAMA_API_BASE || \"https://ollama.com\").replace(/\\/+$/, \"\");\n\n// --- Raw API types ---\n/** Response from POST /api/show */\ninterface OllamaShowResponse {\n details: {\n parent_model: string;\n format: string;\n family: string;\n families: string[] | null;\n parameter_size: string;\n quantization_level: string;\n };\n model_info: Record<string, unknown>;\n capabilities: string[];\n modified_at: string;\n}\n\ntype CachedOllamaModel = OllamaShowResponse;\n\n/** On-disk cache: raw /api/show responses keyed by model ID. */\ninterface CachedData {\n /** Unix epoch milliseconds used to decide when the generated metadata is stale. */\n timestamp?: number;\n models: Record<string, CachedOllamaModel>;\n}\n\ntype RefreshProgressStage = \"list\" | \"details\" | \"done\";\n\nexport interface RefreshProgress {\n stage: RefreshProgressStage;\n current?: number;\n total?: number;\n failed?: number;\n message: string;\n}\n\n// --- Assembly: raw API data -> ProviderModelConfig[] ---\n\n/**\n * Build an explicit OpenAICompletionsCompat for an Ollama Cloud model.\n * Every flag is set explicitly so the contract is visible to maintainers.\n *\n * Ollama API reference: https://docs.ollama.com/api/openai-compatibility\n * pi type definition: https://github.com/earendil-works/pi/blob/b94482762321ed0b9f8f245be57c84d786a7105d/packages/ai/src/types.ts#L361-L400\n * pi compat resolution: https://docs.ollama.com/api/openai-compatibility https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/types.ts#L365-L425\n */\nfunction buildCompat(): ProviderModelConfig[\"compat\"] {\n return {\n // Ollama uses \"system\" role, not \"developer\" (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsDeveloperRole).\n supportsDeveloperRole: false,\n // reasoning_effort works (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsReasoningEffort, tested in think-experiment.md).\n supportsReasoningEffort: true,\n // \"store\" is not a supported field (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsStore).\n supportsStore: false,\n // Ollama lists \"max_tokens\", not \"max_completion_tokens\" (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#maxTokensField).\n maxTokensField: \"max_tokens\",\n // stream_options.include_usage is supported (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsUsageInStreaming).\n supportsUsageInStreaming: true,\n // Default: tool results don't need a name field (pi: types.ts#requiresToolResultName).\n requiresToolResultName: false,\n // Default: no assistant message required between tool result and user (pi: types.ts#requiresAssistantAfterToolResult).\n requiresAssistantAfterToolResult: false,\n // Ollama supports native thinking blocks (pi: types.ts#requiresThinkingAsText).\n requiresThinkingAsText: false,\n // DeepSeek-specific, not needed for Ollama (pi: types.ts#requiresReasoningContentOnAssistantMessages).\n requiresReasoningContentOnAssistantMessages: false,\n // reasoning_effort format works (pi: types.ts#thinkingFormat, tested in think-experiment.md).\n thinkingFormat: \"openai\",\n // Ollama does not support tool_choice, so strict mode is unavailable (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsStrictMode).\n supportsStrictMode: false,\n // Anthropic cache_control not relevant; Ollama has implicit KV cache only (pi: types.ts#cacheControlFormat).\n // Explicitly undefined: JSON.stringify drops undefined values, keeping\n // models.generated.ts structurally consistent with assembleModels() runtime output.\n // Session affinity headers not relevant for Ollama (pi: types.ts#sendSessionAffinityHeaders).\n sendSessionAffinityHeaders: false,\n // No explicit cache-retention API (pi: types.ts#supportsLongCacheRetention).\n supportsLongCacheRetention: false,\n // Not z.ai (pi: types.ts#zaiToolStream).\n zaiToolStream: false,\n cacheControlFormat: undefined,\n openRouterRouting: {},\n vercelGatewayRouting: {},\n };\n}\n\nexport function assembleModels(raw: Record<string, CachedOllamaModel>): ProviderModelConfig[] {\n return Object.entries(raw)\n .filter(([, data]) => data.capabilities?.includes(\"tools\"))\n .map(([id, data]) => ({\n id,\n name: id,\n reasoning: data.capabilities?.includes(\"thinking\") ?? false,\n thinkingLevelMap: resolveThinkingLevelMap(id, data.capabilities ?? []),\n input: (data.capabilities?.includes(\"vision\") ? [\"text\", \"image\"] : [\"text\"]) as (\"text\" | \"image\")[],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: getContextLength(data.model_info ?? {}),\n // No per-model limit exposed by the API (https://docs.ollama.com/api-reference/show-model-details,\n // https://github.com/ollama/ollama/issues/7222). 32768 matches most Ollama Cloud context windows.\n maxTokens: 32768,\n compat: buildCompat(),\n }));\n}\n\n// --- Cache I/O ---\ntype CacheState =\n | { status: \"fresh\"; models: Record<string, CachedOllamaModel> }\n | { status: \"stale\"; models: Record<string, CachedOllamaModel> }\n | { status: \"missing\" };\n\nfunction createCacheData(models: Record<string, CachedOllamaModel>, now = new Date()): CachedData {\n return { timestamp: now.getTime(), models };\n}\n\nfunction readCacheData(path: string): CachedData | null {\n try {\n const data: CachedData = JSON.parse(readFileSync(path, \"utf-8\"));\n if (!data.models || Object.keys(data.models).length === 0) return null;\n return data;\n } catch {\n return null;\n }\n}\n\nfunction isFreshGeneratedCache(data: CachedData): boolean {\n if (typeof data.timestamp !== \"number\" || !Number.isFinite(data.timestamp)) return false;\n return Date.now() - data.timestamp <= CACHE_MAX_AGE_MS;\n}\n\nexport function readCacheState(): CacheState {\n if (!existsSync(CACHE_FILE)) return { status: \"missing\" };\n\n const data = readCacheData(CACHE_FILE);\n if (!data) {\n try {\n rmSync(CACHE_FILE, { force: true });\n } catch {\n // Ignore cache delete errors.\n }\n return { status: \"missing\" };\n }\n\n return isFreshGeneratedCache(data)\n ? { status: \"fresh\", models: data.models }\n : { status: \"stale\", models: data.models };\n}\n\nexport function writeCache(models: Record<string, CachedOllamaModel>): void {\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify(createCacheData(models), null, 2));\n } catch {\n // Ignore cache write errors\n }\n}\n\n// --- Fetch Models ---\n/** Env key first, then stored auth.json api_key. */\nexport function resolveOllamaApiKey(): string | undefined {\n const envKey = process.env.OLLAMA_API_KEY?.trim();\n if (envKey) return envKey;\n try {\n const raw = readFileSync(join(getAgentDir(), \"auth.json\"), \"utf-8\");\n const data = JSON.parse(raw) as Record<string, { type?: string; key?: string }>;\n const cred = data[\"ollama-cloud\"];\n if (cred?.type === \"api_key\" && typeof cred.key === \"string\") {\n const key = cred.key.trim();\n if (key) return key;\n }\n } catch {\n // Missing or unreadable auth.json — treat as no key.\n }\n return undefined;\n}\n\nexport async function fetchModelIds(timeoutMs = FETCH_TIMEOUT_MS): Promise<string[]> {\n const headers: Record<string, string> = {};\n const apiKey = resolveOllamaApiKey();\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n const res = await fetchJsonWithTimeout<{ data: { id: string }[] }>(\n `${OLLAMA_BASE}/v1/models`,\n { headers },\n timeoutMs,\n );\n\n if (res.status === 429) {\n throw new Error(\"Ollama Cloud rate limited. Try again shortly.\");\n }\n if (!res.ok || !res.data) {\n throw new Error(`Failed to fetch model list: ${res.status}${res.error ? ` - ${res.error}` : \"\"}`);\n }\n\n return res.data.data.map((m) => m.id);\n}\n\nexport async function fetchModelDetails(id: string, timeoutMs = FETCH_TIMEOUT_MS): Promise<CachedOllamaModel> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n const apiKey = resolveOllamaApiKey();\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n const res = await fetchJsonWithTimeout<OllamaShowResponse>(\n `${OLLAMA_BASE}/api/show`,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify({ model: id }),\n },\n timeoutMs,\n );\n\n if (res.status === 429) {\n throw new Error(\"Ollama Cloud rate limited. Try again shortly.\");\n }\n if (!res.ok || !res.data) {\n throw new Error(`Failed to fetch /api/show for ${id}: ${res.status}${res.error ? ` - ${res.error}` : \"\"}`);\n }\n\n return res.data;\n}\n\nexport async function refreshOllamaCloudModels(params: {\n notify?: (message: string, level?: \"info\" | \"error\") => void;\n onProgress?: (progress: RefreshProgress) => void;\n workers?: number;\n}): Promise<Record<string, CachedOllamaModel>> {\n const notify = params.notify ?? (() => undefined);\n const onProgress = params.onProgress ?? (() => undefined);\n if (!resolveOllamaApiKey()) {\n notify(\"Ollama Cloud skipped (no API key)\");\n return {};\n }\n onProgress({ stage: \"list\", message: \"Fetching model list...\" });\n const modelIds = await fetchModelIds();\n notify(`Found ${modelIds.length} models, fetching details...`);\n onProgress({ stage: \"details\", current: 0, total: modelIds.length, failed: 0, message: \"Fetching model details\" });\n\n let detailsDone = 0;\n let detailsFailed = 0;\n const detailResults = await concurrentMap(modelIds, params.workers ?? 8, async (id) => {\n try {\n return [id, await fetchModelDetails(id)] as const;\n } catch (error) {\n detailsFailed++;\n throw error;\n } finally {\n detailsDone++;\n onProgress({\n stage: \"details\",\n current: detailsDone,\n total: modelIds.length,\n failed: detailsFailed,\n message: \"Fetching model details\",\n });\n }\n });\n const models: Record<string, CachedOllamaModel> = {};\n for (const result of detailResults) {\n if (result.status === \"fulfilled\") {\n const [id, data] = result.value;\n models[id] = data;\n }\n }\n const succeeded = Object.keys(models).length;\n if (succeeded === 0)\n throw new Error(`Failed to fetch model details${detailsFailed ? ` (${detailsFailed} failed)` : \"\"}`);\n notify(`Fetched ${succeeded} model details${detailsFailed ? ` (${detailsFailed} failed)` : \"\"}`, \"info\");\n\n onProgress({\n stage: \"done\",\n current: Object.keys(models).length,\n total: Object.keys(models).length,\n message: \"Done\",\n });\n return models;\n}\n\nexport async function fetchModels(\n ctx: Pick<ExtensionCommandContext, \"ui\">,\n onProgress?: (progress: RefreshProgress) => void,\n): Promise<Record<string, CachedOllamaModel> | null> {\n try {\n return await refreshOllamaCloudModels({\n notify: (message, level) => ctx.ui.notify(message, level),\n onProgress,\n });\n } catch (error) {\n ctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n return null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-ollama-cloud/models.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ExtensionCommandContext, ProviderModelConfig } from \"@ashx-j/lunr\";\nimport { getAgentDir } from \"../../config.ts\";\nimport { resolve as resolveThinkingLevelMap } from \"./thinking-levels.ts\";\nimport { concurrentMap, fetchJsonWithTimeout, getContextLength } from \"./utils.ts\";\n\n// --- Constants ---\nconst CACHE_DIR = join(getAgentDir(), \"cache\");\nconst CACHE_FILE = join(CACHE_DIR, \"ollama-cloud-models.json\");\nconst CACHE_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;\nconst FETCH_TIMEOUT_MS = 10000;\n\nexport const OLLAMA_BASE = (process.env.OLLAMA_API_BASE || \"https://ollama.com\").replace(/\\/+$/, \"\");\n\n// --- Raw API types ---\n/** Response from POST /api/show */\ninterface OllamaShowResponse {\n details: {\n parent_model: string;\n format: string;\n family: string;\n families: string[] | null;\n parameter_size: string;\n quantization_level: string;\n };\n model_info: Record<string, unknown>;\n capabilities: string[];\n modified_at: string;\n}\n\ntype CachedOllamaModel = OllamaShowResponse;\n\n/** On-disk cache: raw /api/show responses keyed by model ID. */\ninterface CachedData {\n /** Unix epoch milliseconds used to decide when the generated metadata is stale. */\n timestamp?: number;\n models: Record<string, CachedOllamaModel>;\n}\n\ntype RefreshProgressStage = \"list\" | \"details\" | \"done\";\n\nexport interface RefreshProgress {\n stage: RefreshProgressStage;\n current?: number;\n total?: number;\n failed?: number;\n message: string;\n}\n\n// --- Assembly: raw API data -> ProviderModelConfig[] ---\n\n/**\n * Build an explicit OpenAICompletionsCompat for an Ollama Cloud model.\n * Every flag is set explicitly so the contract is visible to maintainers.\n *\n * Ollama API reference: https://docs.ollama.com/api/openai-compatibility\n * pi type definition: https://github.com/earendil-works/pi/blob/b94482762321ed0b9f8f245be57c84d786a7105d/packages/ai/src/types.ts#L361-L400\n * pi compat resolution: https://docs.ollama.com/api/openai-compatibility https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/types.ts#L365-L425\n */\nfunction buildCompat(): ProviderModelConfig[\"compat\"] {\n return {\n // Ollama uses \"system\" role, not \"developer\" (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsDeveloperRole).\n supportsDeveloperRole: false,\n // reasoning_effort works (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsReasoningEffort, tested in think-experiment.md).\n supportsReasoningEffort: true,\n // \"store\" is not a supported field (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsStore).\n supportsStore: false,\n // Ollama lists \"max_tokens\", not \"max_completion_tokens\" (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#maxTokensField).\n maxTokensField: \"max_tokens\",\n // stream_options.include_usage is supported (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsUsageInStreaming).\n supportsUsageInStreaming: true,\n // Default: tool results don't need a name field (pi: types.ts#requiresToolResultName).\n requiresToolResultName: false,\n // Default: no assistant message required between tool result and user (pi: types.ts#requiresAssistantAfterToolResult).\n requiresAssistantAfterToolResult: false,\n // Ollama supports native thinking blocks (pi: types.ts#requiresThinkingAsText).\n requiresThinkingAsText: false,\n // DeepSeek-specific, not needed for Ollama (pi: types.ts#requiresReasoningContentOnAssistantMessages).\n requiresReasoningContentOnAssistantMessages: false,\n // reasoning_effort format works (pi: types.ts#thinkingFormat, tested in think-experiment.md).\n thinkingFormat: \"openai\",\n // Ollama does not support tool_choice, so strict mode is unavailable (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsStrictMode).\n supportsStrictMode: false,\n // Anthropic cache_control not relevant; Ollama has implicit KV cache only (pi: types.ts#cacheControlFormat).\n // Explicitly undefined: JSON.stringify drops undefined values, keeping\n // models.generated.ts structurally consistent with assembleModels() runtime output.\n // Session affinity headers not relevant for Ollama (pi: types.ts#sendSessionAffinityHeaders).\n sendSessionAffinityHeaders: false,\n // No explicit cache-retention API (pi: types.ts#supportsLongCacheRetention).\n supportsLongCacheRetention: false,\n // Not z.ai (pi: types.ts#zaiToolStream).\n zaiToolStream: false,\n cacheControlFormat: undefined,\n openRouterRouting: {},\n vercelGatewayRouting: {},\n };\n}\n\nexport function assembleModels(raw: Record<string, CachedOllamaModel>): ProviderModelConfig[] {\n return Object.entries(raw)\n .filter(([, data]) => data.capabilities?.includes(\"tools\"))\n .map(([id, data]) => ({\n id,\n name: id,\n reasoning: data.capabilities?.includes(\"thinking\") ?? false,\n thinkingLevelMap: resolveThinkingLevelMap(id, data.capabilities ?? []),\n input: (data.capabilities?.includes(\"vision\") ? [\"text\", \"image\"] : [\"text\"]) as (\"text\" | \"image\")[],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: getContextLength(data.model_info ?? {}),\n // No per-model limit exposed by the API (https://docs.ollama.com/api-reference/show-model-details,\n // https://github.com/ollama/ollama/issues/7222). 32768 matches most Ollama Cloud context windows.\n maxTokens: 32768,\n compat: buildCompat(),\n }));\n}\n\n// --- Cache I/O ---\ntype CacheState =\n | { status: \"fresh\"; models: Record<string, CachedOllamaModel> }\n | { status: \"stale\"; models: Record<string, CachedOllamaModel> }\n | { status: \"missing\" };\n\nfunction createCacheData(models: Record<string, CachedOllamaModel>, now = new Date()): CachedData {\n return { timestamp: now.getTime(), models };\n}\n\nfunction readCacheData(path: string): CachedData | null {\n try {\n const data: CachedData = JSON.parse(readFileSync(path, \"utf-8\"));\n if (!data.models || Object.keys(data.models).length === 0) return null;\n return data;\n } catch {\n return null;\n }\n}\n\nfunction isFreshGeneratedCache(data: CachedData): boolean {\n if (typeof data.timestamp !== \"number\" || !Number.isFinite(data.timestamp)) return false;\n return Date.now() - data.timestamp <= CACHE_MAX_AGE_MS;\n}\n\nexport function readCacheState(): CacheState {\n if (!existsSync(CACHE_FILE)) return { status: \"missing\" };\n\n const data = readCacheData(CACHE_FILE);\n if (!data) {\n try {\n rmSync(CACHE_FILE, { force: true });\n } catch {\n // Ignore cache delete errors.\n }\n return { status: \"missing\" };\n }\n\n return isFreshGeneratedCache(data)\n ? { status: \"fresh\", models: data.models }\n : { status: \"stale\", models: data.models };\n}\n\nexport function writeCache(models: Record<string, CachedOllamaModel>): void {\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify(createCacheData(models), null, 2));\n } catch {\n // Ignore cache write errors\n }\n}\n\n// --- Fetch Models ---\n/** Canonical request auth is supplied by the owning runtime, never reread from global storage. */\nexport interface OllamaDiscoveryAuth {\n apiKey?: string;\n headers?: Record<string, string>;\n}\n\nexport async function fetchModelIds(auth: OllamaDiscoveryAuth, timeoutMs = FETCH_TIMEOUT_MS): Promise<string[]> {\n const headers: Record<string, string> = { ...auth.headers };\n const apiKey = auth.apiKey;\n if (apiKey && !Object.keys(headers).some((name) => name.toLowerCase() === \"authorization\")) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n const res = await fetchJsonWithTimeout<{ data: { id: string }[] }>(\n `${OLLAMA_BASE}/v1/models`,\n { headers },\n timeoutMs,\n );\n\n if (res.status === 429) {\n throw new Error(\"Ollama Cloud rate limited. Try again shortly.\");\n }\n if (!res.ok || !res.data) {\n throw new Error(`Failed to fetch model list: ${res.status}${res.error ? ` - ${res.error}` : \"\"}`);\n }\n\n return res.data.data.map((m) => m.id);\n}\n\nexport async function fetchModelDetails(id: string, auth: OllamaDiscoveryAuth, timeoutMs = FETCH_TIMEOUT_MS): Promise<CachedOllamaModel> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\", ...auth.headers };\n const apiKey = auth.apiKey;\n if (apiKey && !Object.keys(headers).some((name) => name.toLowerCase() === \"authorization\")) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n const res = await fetchJsonWithTimeout<OllamaShowResponse>(\n `${OLLAMA_BASE}/api/show`,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify({ model: id }),\n },\n timeoutMs,\n );\n\n if (res.status === 429) {\n throw new Error(\"Ollama Cloud rate limited. Try again shortly.\");\n }\n if (!res.ok || !res.data) {\n throw new Error(`Failed to fetch /api/show for ${id}: ${res.status}${res.error ? ` - ${res.error}` : \"\"}`);\n }\n\n return res.data;\n}\n\nexport async function refreshOllamaCloudModels(params: {\n auth?: OllamaDiscoveryAuth;\n notify?: (message: string, level?: \"info\" | \"error\") => void;\n onProgress?: (progress: RefreshProgress) => void;\n workers?: number;\n}): Promise<Record<string, CachedOllamaModel>> {\n const notify = params.notify ?? (() => undefined);\n const onProgress = params.onProgress ?? (() => undefined);\n if (!params.auth?.apiKey && !Object.entries(params.auth?.headers ?? {}).some(([name, value]) => name.toLowerCase() === \"authorization\" && value)) {\n notify(\"Ollama Cloud skipped (no API key)\");\n return {};\n }\n onProgress({ stage: \"list\", message: \"Fetching model list...\" });\n const modelIds = await fetchModelIds(params.auth ?? {});\n notify(`Found ${modelIds.length} models, fetching details...`);\n onProgress({ stage: \"details\", current: 0, total: modelIds.length, failed: 0, message: \"Fetching model details\" });\n\n let detailsDone = 0;\n let detailsFailed = 0;\n const detailResults = await concurrentMap(modelIds, params.workers ?? 8, async (id) => {\n try {\n return [id, await fetchModelDetails(id, params.auth ?? {})] as const;\n } catch (error) {\n detailsFailed++;\n throw error;\n } finally {\n detailsDone++;\n onProgress({\n stage: \"details\",\n current: detailsDone,\n total: modelIds.length,\n failed: detailsFailed,\n message: \"Fetching model details\",\n });\n }\n });\n const models: Record<string, CachedOllamaModel> = {};\n for (const result of detailResults) {\n if (result.status === \"fulfilled\") {\n const [id, data] = result.value;\n models[id] = data;\n }\n }\n const succeeded = Object.keys(models).length;\n if (succeeded === 0)\n throw new Error(`Failed to fetch model details${detailsFailed ? ` (${detailsFailed} failed)` : \"\"}`);\n notify(`Fetched ${succeeded} model details${detailsFailed ? ` (${detailsFailed} failed)` : \"\"}`, \"info\");\n\n onProgress({\n stage: \"done\",\n current: Object.keys(models).length,\n total: Object.keys(models).length,\n message: \"Done\",\n });\n return models;\n}\n\nexport async function fetchModels(\n ctx: Pick<ExtensionCommandContext, \"ui\"> & { auth?: OllamaDiscoveryAuth },\n onProgress?: (progress: RefreshProgress) => void,\n): Promise<Record<string, CachedOllamaModel> | null> {\n try {\n return await refreshOllamaCloudModels({\n auth: ctx.auth,\n notify: (message, level) => ctx.ui.notify(message, level),\n onProgress,\n });\n } catch (error) {\n ctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n return null;\n }\n}\n"]}
|