@ashx-j/lunr 0.2.25 → 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 +31 -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/index.d.ts.map +1 -1
- package/dist/builtin-extensions/index.js +1 -0
- package/dist/builtin-extensions/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-computer-use.d.ts +3 -0
- package/dist/builtin-extensions/lunr-computer-use.d.ts.map +1 -0
- package/dist/builtin-extensions/lunr-computer-use.js +179 -0
- package/dist/builtin-extensions/lunr-computer-use.js.map +1 -0
- 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/extension/schemas.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +4 -4
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +8 -5
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.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 +1 -0
- 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 +21 -4
- 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 +11 -4
- 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 +121 -25
- 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/chain-outputs.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.js +5 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.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/communication.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/communication.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/communication.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -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 +22 -11
- 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 +28 -0
- package/dist/core/computer-use/adapter.d.ts.map +1 -0
- package/dist/core/computer-use/adapter.js +138 -0
- package/dist/core/computer-use/adapter.js.map +1 -0
- package/dist/core/computer-use/image.d.ts +27 -0
- package/dist/core/computer-use/image.d.ts.map +1 -0
- package/dist/core/computer-use/image.js +84 -0
- package/dist/core/computer-use/image.js.map +1 -0
- package/dist/core/computer-use/lease.d.ts +18 -0
- package/dist/core/computer-use/lease.d.ts.map +1 -0
- package/dist/core/computer-use/lease.js +129 -0
- package/dist/core/computer-use/lease.js.map +1 -0
- package/dist/core/computer-use/macos-runtime.d.ts +14 -0
- package/dist/core/computer-use/macos-runtime.d.ts.map +1 -0
- package/dist/core/computer-use/macos-runtime.js +148 -0
- package/dist/core/computer-use/macos-runtime.js.map +1 -0
- package/dist/core/computer-use/policy.d.ts +19 -0
- package/dist/core/computer-use/policy.d.ts.map +1 -0
- package/dist/core/computer-use/policy.js +67 -0
- package/dist/core/computer-use/policy.js.map +1 -0
- package/dist/core/computer-use/release.generated.d.ts +31 -0
- package/dist/core/computer-use/release.generated.d.ts.map +1 -0
- package/dist/core/computer-use/release.generated.js +36 -0
- package/dist/core/computer-use/release.generated.js.map +1 -0
- package/dist/core/computer-use/runtime.d.ts +13 -0
- package/dist/core/computer-use/runtime.d.ts.map +1 -0
- package/dist/core/computer-use/runtime.js +158 -0
- package/dist/core/computer-use/runtime.js.map +1 -0
- package/dist/core/computer-use/schemas.d.ts +100 -0
- package/dist/core/computer-use/schemas.d.ts.map +1 -0
- package/dist/core/computer-use/schemas.js +96 -0
- package/dist/core/computer-use/schemas.js.map +1 -0
- package/dist/core/computer-use/windows-desktop.d.ts +3 -0
- package/dist/core/computer-use/windows-desktop.d.ts.map +1 -0
- package/dist/core/computer-use/windows-desktop.js +48 -0
- package/dist/core/computer-use/windows-desktop.js.map +1 -0
- package/dist/core/computer-use/workflow.d.ts +38 -0
- package/dist/core/computer-use/workflow.d.ts.map +1 -0
- package/dist/core/computer-use/workflow.js +900 -0
- package/dist/core/computer-use/workflow.js.map +1 -0
- 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/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +4 -0
- package/dist/core/extensions/loader.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 +4 -4
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +25 -38
- 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 +135 -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/settings-manager.d.ts +6 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +19 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/subagent-event-transport.d.ts +3 -0
- package/dist/core/subagent-event-transport.d.ts.map +1 -0
- package/dist/core/subagent-event-transport.js +61 -0
- package/dist/core/subagent-event-transport.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/adapters/discord.d.ts.map +1 -1
- package/dist/gateway/adapters/discord.js +2 -2
- package/dist/gateway/adapters/discord.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/approval.d.ts.map +1 -1
- package/dist/gateway/approval.js +3 -3
- package/dist/gateway/approval.js.map +1 -1
- package/dist/gateway/authz.d.ts +4 -4
- package/dist/gateway/authz.d.ts.map +1 -1
- package/dist/gateway/authz.js +8 -12
- package/dist/gateway/authz.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 +12 -10
- 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 +85 -62
- package/dist/gateway/cron.js.map +1 -1
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +5 -4
- 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 +64 -22
- 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 +74 -39
- 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 +22 -9
- 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/gateway/setup.d.ts.map +1 -1
- package/dist/gateway/setup.js +6 -4
- package/dist/gateway/setup.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/components/settings-selector.d.ts +4 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +20 -0
- package/dist/modes/interactive/components/settings-selector.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 +104 -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/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +9 -1
- package/dist/modes/print-mode.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-247RTYLS.js +16 -0
- 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-ZLAX7TUH.js → builtin-extensions-OX6KELNX.js} +9 -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-NRKGMJYU.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-ZXSGTGJ6.js → chunk-APVM5NEU.js} +169 -148
- package/dist/node-runtime/{chunk-RC7DMV45.js → chunk-AYHH7YSD.js} +205 -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-KWIYUUZK.js → chunk-C3P6Q3B2.js} +469 -283
- package/dist/node-runtime/{chunk-YCUZEGJG.js → chunk-DQSCFU7R.js} +17 -8
- package/dist/node-runtime/chunk-EBLAZVSA.js +4170 -0
- 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-FE3WZI7F.js +290 -0
- 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-FY4A63RK.js +73 -0
- package/dist/node-runtime/chunk-FYIFPFXE.js +98 -0
- 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-6XL67VVY.js → chunk-HUD2RFJW.js} +17 -2
- package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-I2H5QMWW.js} +3 -3
- package/dist/node-runtime/chunk-IAZSK7KK.js +108 -0
- package/dist/node-runtime/{chunk-2HHLJWGD.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-WF7PGWRZ.js → chunk-JWEVT363.js} +37 -28
- 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-IJIFHRTB.js → chunk-MQPKUHRN.js} +165 -85
- 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-E4D3IGP2.js → chunk-QNVMKNNN.js} +20 -17
- package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
- package/dist/node-runtime/{chunk-7S3T6YEA.js → chunk-R4WSB2MQ.js} +5 -5
- package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
- package/dist/node-runtime/{chunk-3XPLBUEM.js → chunk-RLGY2QIL.js} +49 -59
- package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
- package/dist/node-runtime/{chunk-AD6VXAO7.js → chunk-TCT6PCUR.js} +47 -115
- package/dist/node-runtime/chunk-U5F4IC7R.js +53 -0
- package/dist/node-runtime/{chunk-OCVIXVTZ.js → chunk-UBWW2PID.js} +13 -2
- package/dist/node-runtime/{chunk-HFVZUPFJ.js → chunk-UNUZICC4.js} +3 -3
- package/dist/node-runtime/{chunk-LQP3RB67.js → chunk-UYRKUKFE.js} +1 -1
- package/dist/node-runtime/{chunk-DSIKTUPW.js → chunk-VSUEAI7O.js} +2993 -3820
- 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-VQFSUJJG.js → chunk-ZDJUR45D.js} +430 -129
- package/dist/node-runtime/{chunk-YDO2F2IA.js → chunk-ZEVFBFNF.js} +95 -142
- package/dist/node-runtime/chunk-ZIQUS5QO.js +180 -0
- package/dist/node-runtime/cli-runtime.js +4 -4
- package/dist/node-runtime/{command-6WDOYKS6.js → command-3HMSY6W2.js} +5 -5
- package/dist/node-runtime/{commands-NZLSOHPE.js → commands-D6A6H4TS.js} +11 -16
- package/dist/node-runtime/commands-OCSSEEWJ.js +37 -0
- 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-77GW4F5P.js → direct-tool-executor-2QJXVQD2.js} +8 -10
- 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-INAYBF4Q.js → gateway-6623C2U3.js} +61 -53
- 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 +54 -48
- package/dist/node-runtime/{init-HS6NQXSK.js → init-JBQJIPYI.js} +3 -4
- package/dist/node-runtime/{install-cli-KL4UDDAD.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-VDP2QNRQ.js +158 -0
- package/dist/node-runtime/{lunr-cron-LWIZJM2N.js → lunr-cron-LKVA5CZZ.js} +94 -79
- package/dist/node-runtime/main.js +42 -39
- package/dist/node-runtime/{mobile-commands-J7OJEKFO.js → mobile-commands-XT3NQXLD.js} +13 -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-VYZM5WHN.js → package-manager-cli-CYM262SI.js} +20 -19
- 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-5UKBZP44.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-DNY7EAIG.js → pi-subagents-LT3CTO4E.js} +114 -116
- package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
- package/dist/node-runtime/{print-mode-XSFM26EL.js → print-mode-2XHN5SUA.js} +4 -3
- package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
- package/dist/node-runtime/{proxy-modes-LGEUYD7R.js → proxy-modes-VEGC6QG5.js} +9 -13
- package/dist/node-runtime/rpc-entry.js +42 -39
- 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-UGXM4NPQ.js +21 -0
- package/dist/node-runtime/{runtime-bridges-VRDDR73P.js → runtime-bridges-DNKMNJCF.js} +8 -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-J4SPQPDJ.js → settings-manager-P2TKGYTR.js} +6 -5
- package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
- package/dist/node-runtime/{setup-CQ2NLVK5.js → setup-OLQ4GXWS.js} +22 -21
- package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
- package/dist/node-runtime/{subagent-executor-KZZQGAKV.js → subagent-executor-Q5F7DBVM.js} +141 -62
- 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-GTFJC7XK.js → update-cli-F3XXJANQ.js} +7 -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-ICDI4N3J.js +767 -0
- 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 +2 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js +12 -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/computer-use.md +362 -0
- package/docs/custom-provider.md +3 -3
- package/docs/extensions.md +8 -4
- package/docs/features.md +22 -12
- 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 +3841 -0
- package/install-lock/package.json +18 -0
- package/native/computer-use/LICENSE.md +21 -0
- package/npm-shrinkwrap.json +3858 -0
- package/package.json +15 -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-YXXFCP5J.js +0 -49
- package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
- package/dist/node-runtime/chunk-4TLO4PO2.js +0 -3427
- package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
- package/dist/node-runtime/chunk-OVX6X377.js +0 -50
- package/dist/node-runtime/chunk-QTU6AKNJ.js +0 -773
- package/dist/node-runtime/chunk-TORR5XBV.js +0 -356
- package/dist/node-runtime/commands-QC6VUZJQ.js +0 -36
- package/dist/node-runtime/interactive-mode-Z5M7WYYZ.js +0 -72
- package/dist/node-runtime/mcp-auth-flow-QIXHW6QN.js +0 -32
|
@@ -15,35 +15,23 @@ export interface AuthenticateOptions {
|
|
|
15
15
|
* Extract OAuth configuration from a ServerEntry.
|
|
16
16
|
*/
|
|
17
17
|
export declare function extractOAuthConfig(definition: ServerEntry): McpOAuthConfig;
|
|
18
|
-
/**
|
|
19
|
-
* Start OAuth authentication flow for a server.
|
|
20
|
-
* Returns the authorization URL when browser authorization is required.
|
|
21
|
-
*/
|
|
22
|
-
export declare function startAuth(serverName: string, serverUrl: string, definition?: ServerEntry): Promise<{
|
|
23
|
-
authorizationUrl: string;
|
|
24
|
-
}>;
|
|
25
18
|
/**
|
|
26
19
|
* Extract an OAuth authorization code from either a raw code, a query string,
|
|
27
20
|
* or the full localhost redirect URL copied from the browser address bar.
|
|
28
21
|
*/
|
|
29
22
|
export declare function parseAuthorizationCodeInput(input: string, expectedState?: string): string;
|
|
30
|
-
/**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
* @param serverUrl - The URL of the MCP server
|
|
43
|
-
* @param definition - The server definition (optional)
|
|
44
|
-
* @returns The final auth status
|
|
45
|
-
*/
|
|
46
|
-
export declare function authenticate(serverName: string, serverUrl: string, definition?: ServerEntry, options?: AuthenticateOptions): Promise<AuthStatus>;
|
|
23
|
+
/** Each session owns its flows; only the callback listener is shared. */
|
|
24
|
+
export declare function createMcpAuthFlow(): {
|
|
25
|
+
startAuth: (serverName: string, serverUrl: string, definition?: ServerEntry | undefined) => Promise<{
|
|
26
|
+
authorizationUrl: string;
|
|
27
|
+
}>;
|
|
28
|
+
completeAuth: (serverName: string, code: string) => Promise<AuthStatus>;
|
|
29
|
+
completeAuthFromInput: (serverName: string, input: string) => Promise<AuthStatus>;
|
|
30
|
+
authenticate: (serverName: string, serverUrl: string, definition?: ServerEntry | undefined, options?: AuthenticateOptions) => Promise<AuthStatus>;
|
|
31
|
+
removeAuth: (serverName: string) => Promise<void>;
|
|
32
|
+
shutdown: () => Promise<void>;
|
|
33
|
+
};
|
|
34
|
+
export type McpAuthFlow = ReturnType<typeof createMcpAuthFlow>;
|
|
47
35
|
/**
|
|
48
36
|
* Get a valid access token for a server, refreshing if necessary.
|
|
49
37
|
*
|
|
@@ -59,12 +47,6 @@ export declare function getValidToken(serverName: string, serverUrl: string): Pr
|
|
|
59
47
|
* @returns The current auth status
|
|
60
48
|
*/
|
|
61
49
|
export declare function getAuthStatus(serverName: string): Promise<AuthStatus>;
|
|
62
|
-
/**
|
|
63
|
-
* Remove all OAuth credentials for a server.
|
|
64
|
-
*
|
|
65
|
-
* @param serverName - The name of the MCP server
|
|
66
|
-
*/
|
|
67
|
-
export declare function removeAuth(serverName: string): Promise<void>;
|
|
68
50
|
/**
|
|
69
51
|
* Check if OAuth is supported for a server configuration.
|
|
70
52
|
* OAuth is supported for HTTP servers unless explicitly disabled.
|
|
@@ -73,14 +55,4 @@ export declare function removeAuth(serverName: string): Promise<void>;
|
|
|
73
55
|
* @returns True if OAuth is supported
|
|
74
56
|
*/
|
|
75
57
|
export declare function supportsOAuth(definition: ServerEntry): boolean;
|
|
76
|
-
/**
|
|
77
|
-
* Initialize the OAuth system on startup.
|
|
78
|
-
* OAuth callback binding is lazy and starts from startAuth() only.
|
|
79
|
-
*/
|
|
80
|
-
export declare function initializeOAuth(): Promise<void>;
|
|
81
|
-
/**
|
|
82
|
-
* Shutdown the OAuth system.
|
|
83
|
-
* Stops the callback server and cancels pending auths.
|
|
84
|
-
*/
|
|
85
|
-
export declare function shutdownOAuth(): Promise<void>;
|
|
86
58
|
//# sourceMappingURL=mcp-auth-flow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-auth-flow.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAQH,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAQ/E,OAAO,EAWL,KAAK,YAAY,EAClB,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,+BAA+B;AAC/B,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,SAAS,GAAG,mBAAmB,CAAA;AAE1E,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACxE;AAsBD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,WAAW,GAAG,cAAc,CAyC1E;AAqCD;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,WAAW,GACvB,OAAO,CAAC;IAAE,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CAiFvC;AA8DD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CA+BzF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,CAAC,CAIrB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,UAAU,CAAC,CAerB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,WAAW,EACxB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,UAAU,CAAC,CAmErB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA2C9B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAM3E;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASlE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,WAAW,GAAG,OAAO,CAc9D;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;AAEzD;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAKnD","sourcesContent":["// @ts-nocheck\n/**\n * MCP Auth Flow\n * \n * High-level OAuth flow management using the MCP SDK's built-in auth functions.\n */\n\nimport {\n auth as runSdkAuth,\n UnauthorizedError,\n} from \"@modelcontextprotocol/sdk/client/auth.js\"\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\nimport open from \"open\"\nimport { McpOAuthProvider, type McpOAuthConfig } from \"./mcp-oauth-provider.ts\"\nimport {\n ensureCallbackServer,\n waitForCallback,\n cancelPendingCallback,\n stopCallbackServer,\n releaseCallbackServer,\n} from \"./mcp-callback-server.ts\"\nimport {\n getAuthForUrl,\n isTokenExpired,\n hasStoredTokens,\n clearAllCredentials,\n clearClientInfo,\n clearTokens,\n clearCodeVerifier,\n updateOAuthState,\n getOAuthState,\n clearOAuthState,\n type StoredTokens,\n} from \"./mcp-auth.ts\"\nimport type { ServerEntry } from \"./types.ts\"\n\n/** Auth status for a server */\nexport type AuthStatus = \"authenticated\" | \"expired\" | \"not_authenticated\"\n\nexport interface AuthenticateOptions {\n onAuthorizationUrl?: (authorizationUrl: string) => void | Promise<void>\n}\n\n// Track pending transports for auth completion\nconst pendingTransports = new Map<string, StreamableHTTPClientTransport>()\nconst pendingAuthStates = new Map<string, string>()\nconst pendingAuthCleanupTimers = new Map<string, ReturnType<typeof setTimeout>>()\n\n// Deduplicate concurrent authenticate() calls per server.\nconst pendingAuthentications = new Map<string, Promise<AuthStatus>>()\n\n/** Timeout for manual auth completion (5 minutes) */\nconst MANUAL_AUTH_TIMEOUT_MS = 5 * 60 * 1000\n\n/**\n * Generate a cryptographically secure random state parameter.\n */\nfunction generateState(): string {\n return Array.from(crypto.getRandomValues(new Uint8Array(32)))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")\n}\n\n/**\n * Extract OAuth configuration from a ServerEntry.\n */\nexport function extractOAuthConfig(definition: ServerEntry): McpOAuthConfig {\n if (definition.oauth === false) {\n return {}\n }\n\n const config: McpOAuthConfig = {}\n if (definition.oauth?.grantType !== undefined) config.grantType = definition.oauth.grantType\n if (definition.oauth?.clientId !== undefined) config.clientId = definition.oauth.clientId\n if (definition.oauth?.clientSecret !== undefined) config.clientSecret = definition.oauth.clientSecret\n if (definition.oauth?.scope !== undefined) config.scope = definition.oauth.scope\n if (definition.oauth?.redirectUri !== undefined) {\n if (typeof definition.oauth.redirectUri !== \"string\") {\n throw new Error(\"OAuth redirectUri must be a string\")\n }\n const redirectUri = definition.oauth.redirectUri.trim()\n if (!redirectUri) {\n throw new Error(\"OAuth redirectUri must not be empty\")\n }\n config.redirectUri = redirectUri\n }\n if (definition.oauth?.clientName !== undefined) {\n if (typeof definition.oauth.clientName !== \"string\") {\n throw new Error(\"OAuth clientName must be a string\")\n }\n const clientName = definition.oauth.clientName.trim()\n if (!clientName) {\n throw new Error(\"OAuth clientName must not be empty\")\n }\n config.clientName = clientName\n }\n if (definition.oauth?.clientUri !== undefined) {\n if (typeof definition.oauth.clientUri !== \"string\") {\n throw new Error(\"OAuth clientUri must be a string\")\n }\n const clientUri = definition.oauth.clientUri.trim()\n if (!clientUri) {\n throw new Error(\"OAuth clientUri must not be empty\")\n }\n config.clientUri = clientUri\n }\n return config\n}\n\nfunction parseOAuthRedirectUri(redirectUri: string): { port: number; callbackHost: string; callbackPath: string } {\n let url: URL\n try {\n url = new URL(redirectUri)\n } catch (error) {\n throw new Error(`Invalid OAuth redirectUri: ${redirectUri}`, { cause: error })\n }\n\n const hostname = url.hostname.toLowerCase()\n const isLocalhost = hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"[::1]\" || hostname === \"::1\"\n if (url.protocol !== \"http:\" || !isLocalhost) {\n throw new Error(\"OAuth redirectUri must be an http:// localhost or loopback URI\")\n }\n\n if (url.username || url.password) {\n throw new Error(\"OAuth redirectUri must not include username or password\")\n }\n\n if (url.hash) {\n throw new Error(\"OAuth redirectUri must not include a fragment\")\n }\n\n if (!url.port) {\n throw new Error(\"OAuth redirectUri must include an explicit numeric port\")\n }\n\n const port = Number.parseInt(url.port, 10)\n if (!Number.isInteger(port) || port <= 0 || port > 65535) {\n throw new Error(\"OAuth redirectUri must include an explicit numeric port\")\n }\n\n const callbackHost = hostname === \"[::1]\" ? \"::1\" : hostname\n return { port, callbackHost, callbackPath: url.pathname }\n}\n\n/**\n * Start OAuth authentication flow for a server.\n * Returns the authorization URL when browser authorization is required.\n */\nexport async function startAuth(\n serverName: string,\n serverUrl: string,\n definition?: ServerEntry\n): Promise<{ authorizationUrl: string }> {\n const config = definition ? extractOAuthConfig(definition) : {}\n\n if (config.grantType === \"client_credentials\") {\n const storedAuth = await getAuthForUrl(serverName, serverUrl)\n if (storedAuth?.clientInfo && !storedAuth.tokens && !config.clientId) {\n clearClientInfo(serverName)\n clearCodeVerifier(serverName)\n await clearOAuthState(serverName)\n }\n\n const authProvider = new McpOAuthProvider(serverName, serverUrl, config, {\n onRedirect: async () => {\n throw new Error(\"Browser redirect is not used for client_credentials flow\")\n },\n })\n const result = await runSdkAuth(authProvider, { serverUrl })\n if (result !== \"AUTHORIZED\") {\n throw new UnauthorizedError(\"Failed to authorize\")\n }\n return { authorizationUrl: \"\" }\n }\n\n const redirectCallback = config.redirectUri !== undefined ? parseOAuthRedirectUri(config.redirectUri) : undefined\n const oauthState = generateState()\n\n try {\n await ensureCallbackServer({\n strictPort: Boolean(config.clientId) || config.redirectUri !== undefined,\n oauthState,\n reserveState: true,\n ...(redirectCallback ? { port: redirectCallback.port, callbackHost: redirectCallback.callbackHost, callbackPath: redirectCallback.callbackPath } : {}),\n })\n } catch (error) {\n await clearOAuthState(serverName)\n throw error\n }\n\n let capturedUrl: URL | undefined\n const authProvider = new McpOAuthProvider(serverName, serverUrl, config, {\n onRedirect: async (url) => {\n capturedUrl = url\n },\n })\n\n try {\n const storedAuth = await getAuthForUrl(serverName, serverUrl)\n if (storedAuth?.clientInfo && !config.clientId) {\n if (!storedAuth.tokens) {\n clearClientInfo(serverName)\n clearCodeVerifier(serverName)\n await clearOAuthState(serverName)\n } else {\n const redirectUris = storedAuth.clientInfo.redirectUris\n if (!Array.isArray(redirectUris) || !redirectUris.includes(authProvider.redirectUrl ?? \"\")) {\n clearClientInfo(serverName)\n clearTokens(serverName)\n clearCodeVerifier(serverName)\n await clearOAuthState(serverName)\n }\n }\n }\n\n await updateOAuthState(serverName, oauthState, serverUrl)\n\n const result = await runSdkAuth(authProvider, { serverUrl })\n if (result === \"AUTHORIZED\") {\n releaseCallbackServer(oauthState)\n await clearOAuthState(serverName)\n return { authorizationUrl: \"\" }\n }\n if (!capturedUrl) {\n throw new UnauthorizedError(\"OAuth authorization URL was not provided\")\n }\n const pendingTransport = new StreamableHTTPClientTransport(new URL(serverUrl), { authProvider })\n await setPendingTransport(serverName, pendingTransport, oauthState)\n return { authorizationUrl: capturedUrl.toString() }\n } catch (error) {\n await clearPendingAuth(serverName, oauthState)\n throw error\n }\n}\n\nasync function setPendingTransport(\n serverName: string,\n transport: StreamableHTTPClientTransport,\n oauthState: string,\n): Promise<void> {\n await clearPendingAuth(serverName)\n pendingTransports.set(serverName, transport)\n pendingAuthStates.set(serverName, oauthState)\n const cleanupTimer = setTimeout(() => {\n void clearPendingAuth(serverName, oauthState)\n }, MANUAL_AUTH_TIMEOUT_MS)\n cleanupTimer.unref?.()\n pendingAuthCleanupTimers.set(serverName, cleanupTimer)\n}\n\nasync function clearPendingAuth(serverName: string, oauthState?: string): Promise<void> {\n const pendingState = pendingAuthStates.get(serverName)\n if (oauthState && pendingState && pendingState !== oauthState) return\n\n const timer = pendingAuthCleanupTimers.get(serverName)\n if (timer) {\n clearTimeout(timer)\n pendingAuthCleanupTimers.delete(serverName)\n }\n\n const transport = pendingTransports.get(serverName)\n pendingTransports.delete(serverName)\n pendingAuthStates.delete(serverName)\n const stateToRelease = pendingState ?? oauthState\n if (stateToRelease) {\n releaseCallbackServer(stateToRelease)\n const storedState = await getOAuthState(serverName)\n if (storedState === stateToRelease) {\n await clearOAuthState(serverName)\n }\n }\n if (transport) {\n await transport.close().catch(() => {})\n }\n}\n\nfunction getSearchParamsFromInput(input: string): URLSearchParams | undefined {\n try {\n const url = new URL(input)\n const params = new URLSearchParams(url.search)\n if (url.hash) {\n const hash = url.hash.startsWith(\"#\") ? url.hash.slice(1) : url.hash\n const hashParams = new URLSearchParams(hash)\n for (const [key, value] of hashParams) {\n if (!params.has(key)) params.set(key, value)\n }\n }\n return params\n } catch {\n const query = input.includes(\"?\") ? input.slice(input.indexOf(\"?\") + 1) : input\n const params = new URLSearchParams(query.startsWith(\"#\") ? query.slice(1) : query)\n return params.has(\"code\") || params.has(\"state\") || params.has(\"error\") ? params : undefined\n }\n}\n\n/**\n * Extract an OAuth authorization code from either a raw code, a query string,\n * or the full localhost redirect URL copied from the browser address bar.\n */\nexport function parseAuthorizationCodeInput(input: string, expectedState?: string): string {\n const trimmed = input.trim()\n if (!trimmed) {\n throw new Error(\"Authorization code or redirect URL is required\")\n }\n\n const params = getSearchParamsFromInput(trimmed)\n if (params) {\n const error = params.get(\"error\")\n if (error) {\n const description = params.get(\"error_description\")\n throw new Error(description ? `${error}: ${description}` : error)\n }\n\n const state = params.get(\"state\")\n if (expectedState && !state) {\n throw new Error(\"OAuth state missing from redirect URL\")\n }\n if (expectedState && state !== expectedState) {\n throw new Error(\"OAuth state mismatch - potential CSRF attack\")\n }\n\n const code = params.get(\"code\")\n if (code) return code\n }\n\n if (/^[A-Za-z0-9._~+/=-]+$/.test(trimmed)) {\n return trimmed\n }\n\n throw new Error(\"Could not find an OAuth authorization code in the provided input\")\n}\n\n/**\n * Complete OAuth authentication from manual user input.\n */\nexport async function completeAuthFromInput(\n serverName: string,\n input: string,\n): Promise<AuthStatus> {\n const oauthState = await getOAuthState(serverName)\n const code = parseAuthorizationCodeInput(input, oauthState)\n return completeAuth(serverName, code)\n}\n\n/**\n * Complete OAuth authentication with the authorization code.\n */\nexport async function completeAuth(\n serverName: string,\n authorizationCode: string\n): Promise<AuthStatus> {\n const transport = pendingTransports.get(serverName)\n if (!transport) {\n throw new Error(`No pending OAuth flow for server: ${serverName}`)\n }\n\n const oauthState = await getOAuthState(serverName)\n\n try {\n // Complete the auth using the transport's finishAuth method\n await transport.finishAuth(authorizationCode)\n return \"authenticated\"\n } finally {\n await clearPendingAuth(serverName, oauthState)\n }\n}\n\n/**\n * Perform the complete OAuth authentication flow for a server.\n * \n * @param serverName - The name of the MCP server\n * @param serverUrl - The URL of the MCP server \n * @param definition - The server definition (optional)\n * @returns The final auth status\n */\nexport async function authenticate(\n serverName: string,\n serverUrl: string,\n definition?: ServerEntry,\n options: AuthenticateOptions = {},\n): Promise<AuthStatus> {\n const inFlight = pendingAuthentications.get(serverName)\n if (inFlight) {\n return inFlight\n }\n\n const operation = (async (): Promise<AuthStatus> => {\n // Start auth flow\n const { authorizationUrl } = await startAuth(serverName, serverUrl, definition)\n\n // If no auth URL needed, already authenticated\n if (!authorizationUrl) {\n return \"authenticated\"\n }\n\n // Get the state that was already generated and stored in startAuth()\n const oauthState = await getOAuthState(serverName)\n if (!oauthState) {\n throw new Error(\"OAuth state not found - this should not happen\")\n }\n\n // Register the callback BEFORE opening the browser\n const callbackPromise = waitForCallback(oauthState)\n\n try {\n // Open browser. Always surface the URL first so remote/headless users can copy it\n // even when the OS browser handoff is unavailable or invisible.\n if (options.onAuthorizationUrl) {\n await options.onAuthorizationUrl(authorizationUrl)\n } else {\n console.log(`MCP Auth: Open this URL to authenticate ${serverName}:\\n${authorizationUrl}`)\n }\n try {\n await open(authorizationUrl)\n } catch (error) {\n console.warn(`MCP Auth: Failed to open browser for ${serverName}; waiting for manual callback`, { error })\n }\n\n // Wait for callback\n const code = await callbackPromise\n\n // Validate state\n const storedState = await getOAuthState(serverName)\n if (storedState !== oauthState) {\n await clearOAuthState(serverName)\n throw new Error(\"OAuth state mismatch - potential CSRF attack\")\n }\n await clearOAuthState(serverName)\n\n // Complete the auth\n return await completeAuth(serverName, code)\n } catch (error) {\n cancelPendingCallback(oauthState)\n await clearPendingAuth(serverName, oauthState)\n throw error\n }\n })()\n\n pendingAuthentications.set(serverName, operation)\n\n try {\n return await operation\n } finally {\n if (pendingAuthentications.get(serverName) === operation) {\n pendingAuthentications.delete(serverName)\n }\n }\n}\n\n/**\n * Get a valid access token for a server, refreshing if necessary.\n * \n * @param serverName - The name of the MCP server\n * @param serverUrl - The URL of the MCP server\n * @returns The valid tokens or null if not authenticated\n */\nexport async function getValidToken(\n serverName: string,\n serverUrl: string,\n): Promise<StoredTokens | null> {\n // Check if we have valid tokens\n const entry = await getAuthForUrl(serverName, serverUrl)\n if (!entry?.tokens) {\n return null\n }\n\n // Check expiration\n const expired = await isTokenExpired(serverName)\n if (expired === false) {\n return entry.tokens\n }\n\n if (expired === true && entry.tokens.refreshToken) {\n // Token is expired, try to refresh\n console.log(`MCP Auth: Token expired for ${serverName}, attempting refresh`)\n\n try {\n // Create auth provider for token refresh\n const authProvider = new McpOAuthProvider(serverName, serverUrl, {}, {\n onRedirect: async () => {},\n })\n\n const clientInfo = await authProvider.clientInformation()\n if (!clientInfo) {\n console.log(`MCP Auth: No client info for refresh for ${serverName}`)\n return null\n }\n\n const result = await runSdkAuth(authProvider, { serverUrl })\n if (result !== \"AUTHORIZED\") {\n return null\n }\n const refreshed = await getAuthForUrl(serverName, serverUrl)\n return refreshed?.tokens ?? null\n } catch (error) {\n console.error(`MCP Auth: Token refresh failed for ${serverName}`, { error })\n return null\n }\n }\n\n // No expiration info or no refresh token, assume valid\n return entry.tokens\n}\n\n/**\n * Check the authentication status for a server.\n * \n * @param serverName - The name of the MCP server\n * @returns The current auth status\n */\nexport async function getAuthStatus(serverName: string): Promise<AuthStatus> {\n const hasTokens = await hasStoredTokens(serverName)\n if (!hasTokens) return \"not_authenticated\"\n\n const expired = await isTokenExpired(serverName)\n return expired ? \"expired\" : \"authenticated\"\n}\n\n/**\n * Remove all OAuth credentials for a server.\n * \n * @param serverName - The name of the MCP server\n */\nexport async function removeAuth(serverName: string): Promise<void> {\n const oauthState = await getOAuthState(serverName)\n if (oauthState) {\n cancelPendingCallback(oauthState)\n }\n await clearPendingAuth(serverName, oauthState)\n clearAllCredentials(serverName)\n await clearOAuthState(serverName)\n console.log(`MCP Auth: Removed credentials for ${serverName}`)\n}\n\n/**\n * Check if OAuth is supported for a server configuration.\n * OAuth is supported for HTTP servers unless explicitly disabled.\n * \n * @param definition - The server definition\n * @returns True if OAuth is supported\n */\nexport function supportsOAuth(definition: ServerEntry): boolean {\n // OAuth requires a URL\n if (!definition.url) return false\n \n // Explicitly disabled via auth: false or oauth: false\n if (definition.auth === false) return false\n if (definition.oauth === false) return false\n if (definition.auth === \"oauth\") return true\n \n // Configured custom headers take precedence over implicit OAuth auto-detection.\n if (definition.headers && Object.keys(definition.headers).length > 0) return false\n\n // OAuth is enabled when auth is not specified (auto-detect)\n return definition.auth === undefined\n}\n\n/**\n * Initialize the OAuth system on startup.\n * OAuth callback binding is lazy and starts from startAuth() only.\n */\nexport async function initializeOAuth(): Promise<void> {}\n\n/**\n * Shutdown the OAuth system.\n * Stops the callback server and cancels pending auths.\n */\nexport async function shutdownOAuth(): Promise<void> {\n for (const serverName of Array.from(pendingTransports.keys())) {\n await clearPendingAuth(serverName)\n }\n await stopCallbackServer()\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mcp-auth-flow.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAQH,OAAO,EAAoB,KAAK,cAAc,EAA0B,MAAM,yBAAyB,CAAA;AASvG,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,+BAA+B;AAC/B,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,SAAS,GAAG,mBAAmB,CAAA;AAE1E,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACxE;AAcD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,WAAW,GAAG,cAAc,CAyC1E;AAwDD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CA+BzF;AAUD,yEAAyE;AACzE,wBAAgB,iBAAiB;;;;;;;;;EA4KhC;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE9D;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA2C9B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAM3E;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,WAAW,GAAG,OAAO,CAc9D","sourcesContent":["// @ts-nocheck\n/**\n * MCP Auth Flow\n * \n * High-level OAuth flow management using the MCP SDK's built-in auth functions.\n */\n\nimport {\n auth as runSdkAuth,\n UnauthorizedError,\n} from \"@modelcontextprotocol/sdk/client/auth.js\"\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\nimport open from \"open\"\nimport { McpOAuthProvider, type McpOAuthConfig, type McpOAuthFlowState } from \"./mcp-oauth-provider.ts\"\nimport {\n ensureCallbackServer,\n waitForCallback,\n cancelPendingCallback,\n acquireCallbackServerOwner,\n releaseCallbackServerOwner,\n releaseCallbackServer,\n} from \"./mcp-callback-server.ts\"\nimport {\n getAuthForUrl,\n isTokenExpired,\n hasStoredTokens,\n clearAllCredentials,\n type StoredTokens,\n} from \"./mcp-auth.ts\"\nimport { abortable, throwIfAborted } from \"./abort.ts\"\nimport type { ServerEntry } from \"./types.ts\"\n\n/** Auth status for a server */\nexport type AuthStatus = \"authenticated\" | \"expired\" | \"not_authenticated\"\n\nexport interface AuthenticateOptions {\n onAuthorizationUrl?: (authorizationUrl: string) => void | Promise<void>\n}\n\n/** Timeout for manual auth completion (5 minutes) */\nconst MANUAL_AUTH_TIMEOUT_MS = 5 * 60 * 1000\n\n/**\n * Generate a cryptographically secure random state parameter.\n */\nfunction generateState(): string {\n return Array.from(crypto.getRandomValues(new Uint8Array(32)))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")\n}\n\n/**\n * Extract OAuth configuration from a ServerEntry.\n */\nexport function extractOAuthConfig(definition: ServerEntry): McpOAuthConfig {\n if (definition.oauth === false) {\n return {}\n }\n\n const config: McpOAuthConfig = {}\n if (definition.oauth?.grantType !== undefined) config.grantType = definition.oauth.grantType\n if (definition.oauth?.clientId !== undefined) config.clientId = definition.oauth.clientId\n if (definition.oauth?.clientSecret !== undefined) config.clientSecret = definition.oauth.clientSecret\n if (definition.oauth?.scope !== undefined) config.scope = definition.oauth.scope\n if (definition.oauth?.redirectUri !== undefined) {\n if (typeof definition.oauth.redirectUri !== \"string\") {\n throw new Error(\"OAuth redirectUri must be a string\")\n }\n const redirectUri = definition.oauth.redirectUri.trim()\n if (!redirectUri) {\n throw new Error(\"OAuth redirectUri must not be empty\")\n }\n config.redirectUri = redirectUri\n }\n if (definition.oauth?.clientName !== undefined) {\n if (typeof definition.oauth.clientName !== \"string\") {\n throw new Error(\"OAuth clientName must be a string\")\n }\n const clientName = definition.oauth.clientName.trim()\n if (!clientName) {\n throw new Error(\"OAuth clientName must not be empty\")\n }\n config.clientName = clientName\n }\n if (definition.oauth?.clientUri !== undefined) {\n if (typeof definition.oauth.clientUri !== \"string\") {\n throw new Error(\"OAuth clientUri must be a string\")\n }\n const clientUri = definition.oauth.clientUri.trim()\n if (!clientUri) {\n throw new Error(\"OAuth clientUri must not be empty\")\n }\n config.clientUri = clientUri\n }\n return config\n}\n\nfunction parseOAuthRedirectUri(redirectUri: string): { port: number; callbackHost: string; callbackPath: string } {\n let url: URL\n try {\n url = new URL(redirectUri)\n } catch (error) {\n throw new Error(`Invalid OAuth redirectUri: ${redirectUri}`, { cause: error })\n }\n\n const hostname = url.hostname.toLowerCase()\n const isLocalhost = hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"[::1]\" || hostname === \"::1\"\n if (url.protocol !== \"http:\" || !isLocalhost) {\n throw new Error(\"OAuth redirectUri must be an http:// localhost or loopback URI\")\n }\n\n if (url.username || url.password) {\n throw new Error(\"OAuth redirectUri must not include username or password\")\n }\n\n if (url.hash) {\n throw new Error(\"OAuth redirectUri must not include a fragment\")\n }\n\n if (!url.port) {\n throw new Error(\"OAuth redirectUri must include an explicit numeric port\")\n }\n\n const port = Number.parseInt(url.port, 10)\n if (!Number.isInteger(port) || port <= 0 || port > 65535) {\n throw new Error(\"OAuth redirectUri must include an explicit numeric port\")\n }\n\n const callbackHost = hostname === \"[::1]\" ? \"::1\" : hostname\n return { port, callbackHost, callbackPath: url.pathname }\n}\n\nfunction getSearchParamsFromInput(input: string): URLSearchParams | undefined {\n try {\n const url = new URL(input)\n const params = new URLSearchParams(url.search)\n if (url.hash) {\n const hash = url.hash.startsWith(\"#\") ? url.hash.slice(1) : url.hash\n const hashParams = new URLSearchParams(hash)\n for (const [key, value] of hashParams) {\n if (!params.has(key)) params.set(key, value)\n }\n }\n return params\n } catch {\n const query = input.includes(\"?\") ? input.slice(input.indexOf(\"?\") + 1) : input\n const params = new URLSearchParams(query.startsWith(\"#\") ? query.slice(1) : query)\n return params.has(\"code\") || params.has(\"state\") || params.has(\"error\") ? params : undefined\n }\n}\n\n/**\n * Extract an OAuth authorization code from either a raw code, a query string,\n * or the full localhost redirect URL copied from the browser address bar.\n */\nexport function parseAuthorizationCodeInput(input: string, expectedState?: string): string {\n const trimmed = input.trim()\n if (!trimmed) {\n throw new Error(\"Authorization code or redirect URL is required\")\n }\n\n const params = getSearchParamsFromInput(trimmed)\n if (params) {\n const error = params.get(\"error\")\n if (error) {\n const description = params.get(\"error_description\")\n throw new Error(description ? `${error}: ${description}` : error)\n }\n\n const state = params.get(\"state\")\n if (expectedState && !state) {\n throw new Error(\"OAuth state missing from redirect URL\")\n }\n if (expectedState && state !== expectedState) {\n throw new Error(\"OAuth state mismatch - potential CSRF attack\")\n }\n\n const code = params.get(\"code\")\n if (code) return code\n }\n\n if (/^[A-Za-z0-9._~+/=-]+$/.test(trimmed)) {\n return trimmed\n }\n\n throw new Error(\"Could not find an OAuth authorization code in the provided input\")\n}\n\ninterface PendingAuthFlow {\n state: McpOAuthFlowState\n controller: AbortController\n transport?: StreamableHTTPClientTransport\n timer?: ReturnType<typeof setTimeout>\n cleanup?: Promise<void>\n}\n\n/** Each session owns its flows; only the callback listener is shared. */\nexport function createMcpAuthFlow() {\n const owner = acquireCallbackServerOwner()\n const flows = new Map<string, PendingAuthFlow>()\n const authenticating = new Map<string, Promise<AuthStatus>>()\n let shutdownPromise: Promise<void> | undefined\n let closed = false\n\n function assertOpen(): void {\n if (closed) throw new Error(\"MCP OAuth session closed\")\n }\n\n async function clearPendingAuth(serverName: string, flow = flows.get(serverName)): Promise<void> {\n if (!flow) return\n if (!flow.cleanup) {\n flow.cleanup = (async () => {\n if (flows.get(serverName) === flow) flows.delete(serverName)\n if (flow.timer) clearTimeout(flow.timer)\n flow.controller.abort(new Error(\"Authorization cancelled\"))\n cancelPendingCallback(flow.state.oauthState)\n releaseCallbackServer(flow.state.oauthState)\n await flow.transport?.close().catch(() => {})\n })()\n }\n await flow.cleanup\n }\n\n async function startAuth(\n serverName: string,\n serverUrl: string,\n definition?: ServerEntry,\n ): Promise<{ authorizationUrl: string }> {\n assertOpen()\n const previous = flows.get(serverName)\n if (previous) await clearPendingAuth(serverName, previous)\n assertOpen()\n if (flows.has(serverName)) throw new Error(`OAuth flow already pending for server: ${serverName}`)\n const controller = new AbortController()\n const flow: PendingAuthFlow = { controller, state: { oauthState: generateState(), signal: controller.signal } }\n flows.set(serverName, flow)\n const signal = controller.signal\n const fetchFn: typeof fetch = (input, init) => fetch(input, {\n ...init, signal: init?.signal ? AbortSignal.any([init.signal, signal]) : signal,\n })\n try {\n const config = definition ? extractOAuthConfig(definition) : {}\n const storedAuth = await getAuthForUrl(serverName, serverUrl)\n throwIfAborted(signal)\n flow.state.clientInfo = storedAuth?.clientInfo\n // Reuse the registered redirect endpoint and client ID, including clients\n // without tokens. Display metadata changes never invalidate registrations.\n if (config.grantType !== \"client_credentials\") {\n if (!config.redirectUri && !config.clientId) {\n const registeredRedirect = storedAuth?.clientInfo?.redirectUris?.[0]\n if (registeredRedirect) config.redirectUri = registeredRedirect\n }\n const redirect = config.redirectUri ? parseOAuthRedirectUri(config.redirectUri) : undefined\n await ensureCallbackServer({\n owner,\n signal,\n strictPort: Boolean(config.clientId || storedAuth?.clientInfo) || config.redirectUri !== undefined,\n oauthState: flow.state.oauthState,\n reserveState: true,\n ...(redirect ? { port: redirect.port, callbackHost: redirect.callbackHost, callbackPath: redirect.callbackPath } : {}),\n })\n throwIfAborted(signal)\n }\n let capturedUrl: URL | undefined\n const authProvider = new McpOAuthProvider(serverName, serverUrl, config, {\n onRedirect: (url) => { throwIfAborted(signal); capturedUrl = url },\n }, flow.state)\n const result = await abortable(runSdkAuth(authProvider, { serverUrl, fetchFn }), signal)\n throwIfAborted(signal)\n if (result === \"AUTHORIZED\") {\n await clearPendingAuth(serverName, flow)\n return { authorizationUrl: \"\" }\n }\n if (config.grantType === \"client_credentials\" || !capturedUrl) {\n throw new UnauthorizedError(\"OAuth authorization URL was not provided\")\n }\n flow.transport = new StreamableHTTPClientTransport(new URL(serverUrl), { authProvider, fetch: fetchFn })\n flow.timer = setTimeout(() => { void clearPendingAuth(serverName, flow) }, MANUAL_AUTH_TIMEOUT_MS)\n flow.timer.unref?.()\n return { authorizationUrl: capturedUrl.toString() }\n } catch (error) {\n await clearPendingAuth(serverName, flow)\n throw error\n }\n }\n\n async function completeAuthFromInput(serverName: string, input: string): Promise<AuthStatus> {\n assertOpen()\n const flow = flows.get(serverName)\n if (!flow) throw new Error(`No pending OAuth flow for server: ${serverName}`)\n return completeAuth(serverName, parseAuthorizationCodeInput(input, flow.state.oauthState))\n }\n\n async function completeAuth(serverName: string, code: string): Promise<AuthStatus> {\n assertOpen()\n const flow = flows.get(serverName)\n if (!flow?.transport) throw new Error(`No pending OAuth flow for server: ${serverName}`)\n try {\n await abortable(flow.transport.finishAuth(code), flow.state.signal)\n throwIfAborted(flow.state.signal)\n return \"authenticated\"\n } finally {\n await clearPendingAuth(serverName, flow)\n }\n }\n\n async function authenticate(\n serverName: string,\n serverUrl: string,\n definition?: ServerEntry,\n options: AuthenticateOptions = {},\n ): Promise<AuthStatus> {\n assertOpen()\n const pending = authenticating.get(serverName)\n if (pending) return pending\n const operation = (async (): Promise<AuthStatus> => {\n const { authorizationUrl } = await startAuth(serverName, serverUrl, definition)\n if (!authorizationUrl) return \"authenticated\"\n assertOpen()\n const flow = flows.get(serverName)\n if (!flow) throw new Error(`No pending OAuth flow for server: ${serverName}`)\n const callback = waitForCallback(flow.state.oauthState)\n // Attach a rejection handler before asynchronous UI/browser handoffs.\n void callback.catch(() => {})\n try {\n if (options.onAuthorizationUrl) {\n await abortable(Promise.resolve(options.onAuthorizationUrl(authorizationUrl)), flow.state.signal)\n } else {\n console.log(`MCP Auth: Open this URL to authenticate ${serverName}:\\n${authorizationUrl}`)\n }\n throwIfAborted(flow.state.signal)\n try {\n await abortable(open(authorizationUrl), flow.state.signal)\n } catch (error) {\n throwIfAborted(flow.state.signal)\n console.warn(`MCP Auth: Failed to open browser for ${serverName}; waiting for manual callback`, { error })\n }\n const code = await callback\n return await completeAuth(serverName, code)\n } catch (error) {\n await clearPendingAuth(serverName, flow)\n throw error\n }\n })()\n authenticating.set(serverName, operation)\n try { return await operation } finally {\n if (authenticating.get(serverName) === operation) authenticating.delete(serverName)\n }\n }\n\n async function removeAuth(serverName: string): Promise<void> {\n assertOpen()\n await clearPendingAuth(serverName)\n clearAllCredentials(serverName)\n }\n\n function shutdown(): Promise<void> {\n if (!shutdownPromise) {\n // Mark closed before cleanup can yield, so stale callers cannot start work.\n closed = true\n shutdownPromise = (async () => {\n await Promise.all([...flows].map(([name, flow]) => clearPendingAuth(name, flow)))\n await releaseCallbackServerOwner(owner)\n })()\n }\n return shutdownPromise\n }\n\n return { startAuth, completeAuth, completeAuthFromInput, authenticate, removeAuth, shutdown }\n}\n\nexport type McpAuthFlow = ReturnType<typeof createMcpAuthFlow>\n\n/**\n * Get a valid access token for a server, refreshing if necessary.\n * \n * @param serverName - The name of the MCP server\n * @param serverUrl - The URL of the MCP server\n * @returns The valid tokens or null if not authenticated\n */\nexport async function getValidToken(\n serverName: string,\n serverUrl: string,\n): Promise<StoredTokens | null> {\n // Check if we have valid tokens\n const entry = await getAuthForUrl(serverName, serverUrl)\n if (!entry?.tokens) {\n return null\n }\n\n // Check expiration\n const expired = await isTokenExpired(serverName)\n if (expired === false) {\n return entry.tokens\n }\n\n if (expired === true && entry.tokens.refreshToken) {\n // Token is expired, try to refresh\n console.log(`MCP Auth: Token expired for ${serverName}, attempting refresh`)\n\n try {\n // Create auth provider for token refresh\n const authProvider = new McpOAuthProvider(serverName, serverUrl, {}, {\n onRedirect: async () => {},\n })\n\n const clientInfo = await authProvider.clientInformation()\n if (!clientInfo) {\n console.log(`MCP Auth: No client info for refresh for ${serverName}`)\n return null\n }\n\n const result = await runSdkAuth(authProvider, { serverUrl })\n if (result !== \"AUTHORIZED\") {\n return null\n }\n const refreshed = await getAuthForUrl(serverName, serverUrl)\n return refreshed?.tokens ?? null\n } catch (error) {\n console.error(`MCP Auth: Token refresh failed for ${serverName}`, { error })\n return null\n }\n }\n\n // No expiration info or no refresh token, assume valid\n return entry.tokens\n}\n\n/**\n * Check the authentication status for a server.\n * \n * @param serverName - The name of the MCP server\n * @returns The current auth status\n */\nexport async function getAuthStatus(serverName: string): Promise<AuthStatus> {\n const hasTokens = await hasStoredTokens(serverName)\n if (!hasTokens) return \"not_authenticated\"\n\n const expired = await isTokenExpired(serverName)\n return expired ? \"expired\" : \"authenticated\"\n}\n\n/**\n * Check if OAuth is supported for a server configuration.\n * OAuth is supported for HTTP servers unless explicitly disabled.\n * \n * @param definition - The server definition\n * @returns True if OAuth is supported\n */\nexport function supportsOAuth(definition: ServerEntry): boolean {\n // OAuth requires a URL\n if (!definition.url) return false\n \n // Explicitly disabled via auth: false or oauth: false\n if (definition.auth === false) return false\n if (definition.oauth === false) return false\n if (definition.auth === \"oauth\") return true\n \n // Configured custom headers take precedence over implicit OAuth auto-detection.\n if (definition.headers && Object.keys(definition.headers).length > 0) return false\n\n // OAuth is enabled when auth is not specified (auto-detect)\n return definition.auth === undefined\n}\n"]}
|
|
@@ -8,14 +8,9 @@ import { auth as runSdkAuth, UnauthorizedError, } from "@modelcontextprotocol/sd
|
|
|
8
8
|
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
9
9
|
import open from "open";
|
|
10
10
|
import { McpOAuthProvider } from "./mcp-oauth-provider.js";
|
|
11
|
-
import { ensureCallbackServer, waitForCallback, cancelPendingCallback,
|
|
12
|
-
import { getAuthForUrl, isTokenExpired, hasStoredTokens, clearAllCredentials,
|
|
13
|
-
|
|
14
|
-
const pendingTransports = new Map();
|
|
15
|
-
const pendingAuthStates = new Map();
|
|
16
|
-
const pendingAuthCleanupTimers = new Map();
|
|
17
|
-
// Deduplicate concurrent authenticate() calls per server.
|
|
18
|
-
const pendingAuthentications = new Map();
|
|
11
|
+
import { ensureCallbackServer, waitForCallback, cancelPendingCallback, acquireCallbackServerOwner, releaseCallbackServerOwner, releaseCallbackServer, } from "./mcp-callback-server.js";
|
|
12
|
+
import { getAuthForUrl, isTokenExpired, hasStoredTokens, clearAllCredentials, } from "./mcp-auth.js";
|
|
13
|
+
import { abortable, throwIfAborted } from "./abort.js";
|
|
19
14
|
/** Timeout for manual auth completion (5 minutes) */
|
|
20
15
|
const MANUAL_AUTH_TIMEOUT_MS = 5 * 60 * 1000;
|
|
21
16
|
/**
|
|
@@ -103,121 +98,6 @@ function parseOAuthRedirectUri(redirectUri) {
|
|
|
103
98
|
const callbackHost = hostname === "[::1]" ? "::1" : hostname;
|
|
104
99
|
return { port, callbackHost, callbackPath: url.pathname };
|
|
105
100
|
}
|
|
106
|
-
/**
|
|
107
|
-
* Start OAuth authentication flow for a server.
|
|
108
|
-
* Returns the authorization URL when browser authorization is required.
|
|
109
|
-
*/
|
|
110
|
-
export async function startAuth(serverName, serverUrl, definition) {
|
|
111
|
-
const config = definition ? extractOAuthConfig(definition) : {};
|
|
112
|
-
if (config.grantType === "client_credentials") {
|
|
113
|
-
const storedAuth = await getAuthForUrl(serverName, serverUrl);
|
|
114
|
-
if (storedAuth?.clientInfo && !storedAuth.tokens && !config.clientId) {
|
|
115
|
-
clearClientInfo(serverName);
|
|
116
|
-
clearCodeVerifier(serverName);
|
|
117
|
-
await clearOAuthState(serverName);
|
|
118
|
-
}
|
|
119
|
-
const authProvider = new McpOAuthProvider(serverName, serverUrl, config, {
|
|
120
|
-
onRedirect: async () => {
|
|
121
|
-
throw new Error("Browser redirect is not used for client_credentials flow");
|
|
122
|
-
},
|
|
123
|
-
});
|
|
124
|
-
const result = await runSdkAuth(authProvider, { serverUrl });
|
|
125
|
-
if (result !== "AUTHORIZED") {
|
|
126
|
-
throw new UnauthorizedError("Failed to authorize");
|
|
127
|
-
}
|
|
128
|
-
return { authorizationUrl: "" };
|
|
129
|
-
}
|
|
130
|
-
const redirectCallback = config.redirectUri !== undefined ? parseOAuthRedirectUri(config.redirectUri) : undefined;
|
|
131
|
-
const oauthState = generateState();
|
|
132
|
-
try {
|
|
133
|
-
await ensureCallbackServer({
|
|
134
|
-
strictPort: Boolean(config.clientId) || config.redirectUri !== undefined,
|
|
135
|
-
oauthState,
|
|
136
|
-
reserveState: true,
|
|
137
|
-
...(redirectCallback ? { port: redirectCallback.port, callbackHost: redirectCallback.callbackHost, callbackPath: redirectCallback.callbackPath } : {}),
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
catch (error) {
|
|
141
|
-
await clearOAuthState(serverName);
|
|
142
|
-
throw error;
|
|
143
|
-
}
|
|
144
|
-
let capturedUrl;
|
|
145
|
-
const authProvider = new McpOAuthProvider(serverName, serverUrl, config, {
|
|
146
|
-
onRedirect: async (url) => {
|
|
147
|
-
capturedUrl = url;
|
|
148
|
-
},
|
|
149
|
-
});
|
|
150
|
-
try {
|
|
151
|
-
const storedAuth = await getAuthForUrl(serverName, serverUrl);
|
|
152
|
-
if (storedAuth?.clientInfo && !config.clientId) {
|
|
153
|
-
if (!storedAuth.tokens) {
|
|
154
|
-
clearClientInfo(serverName);
|
|
155
|
-
clearCodeVerifier(serverName);
|
|
156
|
-
await clearOAuthState(serverName);
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
const redirectUris = storedAuth.clientInfo.redirectUris;
|
|
160
|
-
if (!Array.isArray(redirectUris) || !redirectUris.includes(authProvider.redirectUrl ?? "")) {
|
|
161
|
-
clearClientInfo(serverName);
|
|
162
|
-
clearTokens(serverName);
|
|
163
|
-
clearCodeVerifier(serverName);
|
|
164
|
-
await clearOAuthState(serverName);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
await updateOAuthState(serverName, oauthState, serverUrl);
|
|
169
|
-
const result = await runSdkAuth(authProvider, { serverUrl });
|
|
170
|
-
if (result === "AUTHORIZED") {
|
|
171
|
-
releaseCallbackServer(oauthState);
|
|
172
|
-
await clearOAuthState(serverName);
|
|
173
|
-
return { authorizationUrl: "" };
|
|
174
|
-
}
|
|
175
|
-
if (!capturedUrl) {
|
|
176
|
-
throw new UnauthorizedError("OAuth authorization URL was not provided");
|
|
177
|
-
}
|
|
178
|
-
const pendingTransport = new StreamableHTTPClientTransport(new URL(serverUrl), { authProvider });
|
|
179
|
-
await setPendingTransport(serverName, pendingTransport, oauthState);
|
|
180
|
-
return { authorizationUrl: capturedUrl.toString() };
|
|
181
|
-
}
|
|
182
|
-
catch (error) {
|
|
183
|
-
await clearPendingAuth(serverName, oauthState);
|
|
184
|
-
throw error;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
async function setPendingTransport(serverName, transport, oauthState) {
|
|
188
|
-
await clearPendingAuth(serverName);
|
|
189
|
-
pendingTransports.set(serverName, transport);
|
|
190
|
-
pendingAuthStates.set(serverName, oauthState);
|
|
191
|
-
const cleanupTimer = setTimeout(() => {
|
|
192
|
-
void clearPendingAuth(serverName, oauthState);
|
|
193
|
-
}, MANUAL_AUTH_TIMEOUT_MS);
|
|
194
|
-
cleanupTimer.unref?.();
|
|
195
|
-
pendingAuthCleanupTimers.set(serverName, cleanupTimer);
|
|
196
|
-
}
|
|
197
|
-
async function clearPendingAuth(serverName, oauthState) {
|
|
198
|
-
const pendingState = pendingAuthStates.get(serverName);
|
|
199
|
-
if (oauthState && pendingState && pendingState !== oauthState)
|
|
200
|
-
return;
|
|
201
|
-
const timer = pendingAuthCleanupTimers.get(serverName);
|
|
202
|
-
if (timer) {
|
|
203
|
-
clearTimeout(timer);
|
|
204
|
-
pendingAuthCleanupTimers.delete(serverName);
|
|
205
|
-
}
|
|
206
|
-
const transport = pendingTransports.get(serverName);
|
|
207
|
-
pendingTransports.delete(serverName);
|
|
208
|
-
pendingAuthStates.delete(serverName);
|
|
209
|
-
const stateToRelease = pendingState ?? oauthState;
|
|
210
|
-
if (stateToRelease) {
|
|
211
|
-
releaseCallbackServer(stateToRelease);
|
|
212
|
-
const storedState = await getOAuthState(serverName);
|
|
213
|
-
if (storedState === stateToRelease) {
|
|
214
|
-
await clearOAuthState(serverName);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
if (transport) {
|
|
218
|
-
await transport.close().catch(() => { });
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
101
|
function getSearchParamsFromInput(input) {
|
|
222
102
|
try {
|
|
223
103
|
const url = new URL(input);
|
|
@@ -270,101 +150,182 @@ export function parseAuthorizationCodeInput(input, expectedState) {
|
|
|
270
150
|
}
|
|
271
151
|
throw new Error("Could not find an OAuth authorization code in the provided input");
|
|
272
152
|
}
|
|
273
|
-
/**
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* Perform the complete OAuth authentication flow for a server.
|
|
301
|
-
*
|
|
302
|
-
* @param serverName - The name of the MCP server
|
|
303
|
-
* @param serverUrl - The URL of the MCP server
|
|
304
|
-
* @param definition - The server definition (optional)
|
|
305
|
-
* @returns The final auth status
|
|
306
|
-
*/
|
|
307
|
-
export async function authenticate(serverName, serverUrl, definition, options = {}) {
|
|
308
|
-
const inFlight = pendingAuthentications.get(serverName);
|
|
309
|
-
if (inFlight) {
|
|
310
|
-
return inFlight;
|
|
311
|
-
}
|
|
312
|
-
const operation = (async () => {
|
|
313
|
-
// Start auth flow
|
|
314
|
-
const { authorizationUrl } = await startAuth(serverName, serverUrl, definition);
|
|
315
|
-
// If no auth URL needed, already authenticated
|
|
316
|
-
if (!authorizationUrl) {
|
|
317
|
-
return "authenticated";
|
|
318
|
-
}
|
|
319
|
-
// Get the state that was already generated and stored in startAuth()
|
|
320
|
-
const oauthState = await getOAuthState(serverName);
|
|
321
|
-
if (!oauthState) {
|
|
322
|
-
throw new Error("OAuth state not found - this should not happen");
|
|
153
|
+
/** Each session owns its flows; only the callback listener is shared. */
|
|
154
|
+
export function createMcpAuthFlow() {
|
|
155
|
+
const owner = acquireCallbackServerOwner();
|
|
156
|
+
const flows = new Map();
|
|
157
|
+
const authenticating = new Map();
|
|
158
|
+
let shutdownPromise;
|
|
159
|
+
let closed = false;
|
|
160
|
+
function assertOpen() {
|
|
161
|
+
if (closed)
|
|
162
|
+
throw new Error("MCP OAuth session closed");
|
|
163
|
+
}
|
|
164
|
+
async function clearPendingAuth(serverName, flow = flows.get(serverName)) {
|
|
165
|
+
if (!flow)
|
|
166
|
+
return;
|
|
167
|
+
if (!flow.cleanup) {
|
|
168
|
+
flow.cleanup = (async () => {
|
|
169
|
+
if (flows.get(serverName) === flow)
|
|
170
|
+
flows.delete(serverName);
|
|
171
|
+
if (flow.timer)
|
|
172
|
+
clearTimeout(flow.timer);
|
|
173
|
+
flow.controller.abort(new Error("Authorization cancelled"));
|
|
174
|
+
cancelPendingCallback(flow.state.oauthState);
|
|
175
|
+
releaseCallbackServer(flow.state.oauthState);
|
|
176
|
+
await flow.transport?.close().catch(() => { });
|
|
177
|
+
})();
|
|
323
178
|
}
|
|
324
|
-
|
|
325
|
-
|
|
179
|
+
await flow.cleanup;
|
|
180
|
+
}
|
|
181
|
+
async function startAuth(serverName, serverUrl, definition) {
|
|
182
|
+
assertOpen();
|
|
183
|
+
const previous = flows.get(serverName);
|
|
184
|
+
if (previous)
|
|
185
|
+
await clearPendingAuth(serverName, previous);
|
|
186
|
+
assertOpen();
|
|
187
|
+
if (flows.has(serverName))
|
|
188
|
+
throw new Error(`OAuth flow already pending for server: ${serverName}`);
|
|
189
|
+
const controller = new AbortController();
|
|
190
|
+
const flow = { controller, state: { oauthState: generateState(), signal: controller.signal } };
|
|
191
|
+
flows.set(serverName, flow);
|
|
192
|
+
const signal = controller.signal;
|
|
193
|
+
const fetchFn = (input, init) => fetch(input, {
|
|
194
|
+
...init, signal: init?.signal ? AbortSignal.any([init.signal, signal]) : signal,
|
|
195
|
+
});
|
|
326
196
|
try {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
197
|
+
const config = definition ? extractOAuthConfig(definition) : {};
|
|
198
|
+
const storedAuth = await getAuthForUrl(serverName, serverUrl);
|
|
199
|
+
throwIfAborted(signal);
|
|
200
|
+
flow.state.clientInfo = storedAuth?.clientInfo;
|
|
201
|
+
// Reuse the registered redirect endpoint and client ID, including clients
|
|
202
|
+
// without tokens. Display metadata changes never invalidate registrations.
|
|
203
|
+
if (config.grantType !== "client_credentials") {
|
|
204
|
+
if (!config.redirectUri && !config.clientId) {
|
|
205
|
+
const registeredRedirect = storedAuth?.clientInfo?.redirectUris?.[0];
|
|
206
|
+
if (registeredRedirect)
|
|
207
|
+
config.redirectUri = registeredRedirect;
|
|
208
|
+
}
|
|
209
|
+
const redirect = config.redirectUri ? parseOAuthRedirectUri(config.redirectUri) : undefined;
|
|
210
|
+
await ensureCallbackServer({
|
|
211
|
+
owner,
|
|
212
|
+
signal,
|
|
213
|
+
strictPort: Boolean(config.clientId || storedAuth?.clientInfo) || config.redirectUri !== undefined,
|
|
214
|
+
oauthState: flow.state.oauthState,
|
|
215
|
+
reserveState: true,
|
|
216
|
+
...(redirect ? { port: redirect.port, callbackHost: redirect.callbackHost, callbackPath: redirect.callbackPath } : {}),
|
|
217
|
+
});
|
|
218
|
+
throwIfAborted(signal);
|
|
219
|
+
}
|
|
220
|
+
let capturedUrl;
|
|
221
|
+
const authProvider = new McpOAuthProvider(serverName, serverUrl, config, {
|
|
222
|
+
onRedirect: (url) => { throwIfAborted(signal); capturedUrl = url; },
|
|
223
|
+
}, flow.state);
|
|
224
|
+
const result = await abortable(runSdkAuth(authProvider, { serverUrl, fetchFn }), signal);
|
|
225
|
+
throwIfAborted(signal);
|
|
226
|
+
if (result === "AUTHORIZED") {
|
|
227
|
+
await clearPendingAuth(serverName, flow);
|
|
228
|
+
return { authorizationUrl: "" };
|
|
331
229
|
}
|
|
332
|
-
|
|
333
|
-
|
|
230
|
+
if (config.grantType === "client_credentials" || !capturedUrl) {
|
|
231
|
+
throw new UnauthorizedError("OAuth authorization URL was not provided");
|
|
334
232
|
}
|
|
233
|
+
flow.transport = new StreamableHTTPClientTransport(new URL(serverUrl), { authProvider, fetch: fetchFn });
|
|
234
|
+
flow.timer = setTimeout(() => { void clearPendingAuth(serverName, flow); }, MANUAL_AUTH_TIMEOUT_MS);
|
|
235
|
+
flow.timer.unref?.();
|
|
236
|
+
return { authorizationUrl: capturedUrl.toString() };
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
await clearPendingAuth(serverName, flow);
|
|
240
|
+
throw error;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async function completeAuthFromInput(serverName, input) {
|
|
244
|
+
assertOpen();
|
|
245
|
+
const flow = flows.get(serverName);
|
|
246
|
+
if (!flow)
|
|
247
|
+
throw new Error(`No pending OAuth flow for server: ${serverName}`);
|
|
248
|
+
return completeAuth(serverName, parseAuthorizationCodeInput(input, flow.state.oauthState));
|
|
249
|
+
}
|
|
250
|
+
async function completeAuth(serverName, code) {
|
|
251
|
+
assertOpen();
|
|
252
|
+
const flow = flows.get(serverName);
|
|
253
|
+
if (!flow?.transport)
|
|
254
|
+
throw new Error(`No pending OAuth flow for server: ${serverName}`);
|
|
255
|
+
try {
|
|
256
|
+
await abortable(flow.transport.finishAuth(code), flow.state.signal);
|
|
257
|
+
throwIfAborted(flow.state.signal);
|
|
258
|
+
return "authenticated";
|
|
259
|
+
}
|
|
260
|
+
finally {
|
|
261
|
+
await clearPendingAuth(serverName, flow);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
async function authenticate(serverName, serverUrl, definition, options = {}) {
|
|
265
|
+
assertOpen();
|
|
266
|
+
const pending = authenticating.get(serverName);
|
|
267
|
+
if (pending)
|
|
268
|
+
return pending;
|
|
269
|
+
const operation = (async () => {
|
|
270
|
+
const { authorizationUrl } = await startAuth(serverName, serverUrl, definition);
|
|
271
|
+
if (!authorizationUrl)
|
|
272
|
+
return "authenticated";
|
|
273
|
+
assertOpen();
|
|
274
|
+
const flow = flows.get(serverName);
|
|
275
|
+
if (!flow)
|
|
276
|
+
throw new Error(`No pending OAuth flow for server: ${serverName}`);
|
|
277
|
+
const callback = waitForCallback(flow.state.oauthState);
|
|
278
|
+
// Attach a rejection handler before asynchronous UI/browser handoffs.
|
|
279
|
+
void callback.catch(() => { });
|
|
335
280
|
try {
|
|
336
|
-
|
|
281
|
+
if (options.onAuthorizationUrl) {
|
|
282
|
+
await abortable(Promise.resolve(options.onAuthorizationUrl(authorizationUrl)), flow.state.signal);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
console.log(`MCP Auth: Open this URL to authenticate ${serverName}:\n${authorizationUrl}`);
|
|
286
|
+
}
|
|
287
|
+
throwIfAborted(flow.state.signal);
|
|
288
|
+
try {
|
|
289
|
+
await abortable(open(authorizationUrl), flow.state.signal);
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
throwIfAborted(flow.state.signal);
|
|
293
|
+
console.warn(`MCP Auth: Failed to open browser for ${serverName}; waiting for manual callback`, { error });
|
|
294
|
+
}
|
|
295
|
+
const code = await callback;
|
|
296
|
+
return await completeAuth(serverName, code);
|
|
337
297
|
}
|
|
338
298
|
catch (error) {
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
// Wait for callback
|
|
342
|
-
const code = await callbackPromise;
|
|
343
|
-
// Validate state
|
|
344
|
-
const storedState = await getOAuthState(serverName);
|
|
345
|
-
if (storedState !== oauthState) {
|
|
346
|
-
await clearOAuthState(serverName);
|
|
347
|
-
throw new Error("OAuth state mismatch - potential CSRF attack");
|
|
299
|
+
await clearPendingAuth(serverName, flow);
|
|
300
|
+
throw error;
|
|
348
301
|
}
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
302
|
+
})();
|
|
303
|
+
authenticating.set(serverName, operation);
|
|
304
|
+
try {
|
|
305
|
+
return await operation;
|
|
352
306
|
}
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
throw error;
|
|
307
|
+
finally {
|
|
308
|
+
if (authenticating.get(serverName) === operation)
|
|
309
|
+
authenticating.delete(serverName);
|
|
357
310
|
}
|
|
358
|
-
})();
|
|
359
|
-
pendingAuthentications.set(serverName, operation);
|
|
360
|
-
try {
|
|
361
|
-
return await operation;
|
|
362
311
|
}
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
312
|
+
async function removeAuth(serverName) {
|
|
313
|
+
assertOpen();
|
|
314
|
+
await clearPendingAuth(serverName);
|
|
315
|
+
clearAllCredentials(serverName);
|
|
316
|
+
}
|
|
317
|
+
function shutdown() {
|
|
318
|
+
if (!shutdownPromise) {
|
|
319
|
+
// Mark closed before cleanup can yield, so stale callers cannot start work.
|
|
320
|
+
closed = true;
|
|
321
|
+
shutdownPromise = (async () => {
|
|
322
|
+
await Promise.all([...flows].map(([name, flow]) => clearPendingAuth(name, flow)));
|
|
323
|
+
await releaseCallbackServerOwner(owner);
|
|
324
|
+
})();
|
|
366
325
|
}
|
|
326
|
+
return shutdownPromise;
|
|
367
327
|
}
|
|
328
|
+
return { startAuth, completeAuth, completeAuthFromInput, authenticate, removeAuth, shutdown };
|
|
368
329
|
}
|
|
369
330
|
/**
|
|
370
331
|
* Get a valid access token for a server, refreshing if necessary.
|
|
@@ -425,21 +386,6 @@ export async function getAuthStatus(serverName) {
|
|
|
425
386
|
const expired = await isTokenExpired(serverName);
|
|
426
387
|
return expired ? "expired" : "authenticated";
|
|
427
388
|
}
|
|
428
|
-
/**
|
|
429
|
-
* Remove all OAuth credentials for a server.
|
|
430
|
-
*
|
|
431
|
-
* @param serverName - The name of the MCP server
|
|
432
|
-
*/
|
|
433
|
-
export async function removeAuth(serverName) {
|
|
434
|
-
const oauthState = await getOAuthState(serverName);
|
|
435
|
-
if (oauthState) {
|
|
436
|
-
cancelPendingCallback(oauthState);
|
|
437
|
-
}
|
|
438
|
-
await clearPendingAuth(serverName, oauthState);
|
|
439
|
-
clearAllCredentials(serverName);
|
|
440
|
-
await clearOAuthState(serverName);
|
|
441
|
-
console.log(`MCP Auth: Removed credentials for ${serverName}`);
|
|
442
|
-
}
|
|
443
389
|
/**
|
|
444
390
|
* Check if OAuth is supported for a server configuration.
|
|
445
391
|
* OAuth is supported for HTTP servers unless explicitly disabled.
|
|
@@ -464,19 +410,4 @@ export function supportsOAuth(definition) {
|
|
|
464
410
|
// OAuth is enabled when auth is not specified (auto-detect)
|
|
465
411
|
return definition.auth === undefined;
|
|
466
412
|
}
|
|
467
|
-
/**
|
|
468
|
-
* Initialize the OAuth system on startup.
|
|
469
|
-
* OAuth callback binding is lazy and starts from startAuth() only.
|
|
470
|
-
*/
|
|
471
|
-
export async function initializeOAuth() { }
|
|
472
|
-
/**
|
|
473
|
-
* Shutdown the OAuth system.
|
|
474
|
-
* Stops the callback server and cancels pending auths.
|
|
475
|
-
*/
|
|
476
|
-
export async function shutdownOAuth() {
|
|
477
|
-
for (const serverName of Array.from(pendingTransports.keys())) {
|
|
478
|
-
await clearPendingAuth(serverName);
|
|
479
|
-
}
|
|
480
|
-
await stopCallbackServer();
|
|
481
|
-
}
|
|
482
413
|
//# sourceMappingURL=mcp-auth-flow.js.map
|