@anthropic-field/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.last_build +0 -0
- package/dist/docs/architecture.md +80 -0
- package/dist/docs/assets/connected_devtools.png +0 -0
- package/dist/docs/assets/gemini-screenshot.png +0 -0
- package/dist/docs/assets/monitoring-dashboard-logs.png +0 -0
- package/dist/docs/assets/monitoring-dashboard-metrics.png +0 -0
- package/dist/docs/assets/monitoring-dashboard-overview.png +0 -0
- package/dist/docs/assets/release_patch.png +0 -0
- package/dist/docs/assets/theme-ansi-light.png +0 -0
- package/dist/docs/assets/theme-ansi.png +0 -0
- package/dist/docs/assets/theme-atom-one.png +0 -0
- package/dist/docs/assets/theme-ayu-light.png +0 -0
- package/dist/docs/assets/theme-ayu.png +0 -0
- package/dist/docs/assets/theme-custom.png +0 -0
- package/dist/docs/assets/theme-default-light.png +0 -0
- package/dist/docs/assets/theme-default.png +0 -0
- package/dist/docs/assets/theme-dracula.png +0 -0
- package/dist/docs/assets/theme-github-light.png +0 -0
- package/dist/docs/assets/theme-github.png +0 -0
- package/dist/docs/assets/theme-google-light.png +0 -0
- package/dist/docs/assets/theme-xcode-light.png +0 -0
- package/dist/docs/changelogs/index.md +743 -0
- package/dist/docs/changelogs/latest.md +338 -0
- package/dist/docs/changelogs/preview.md +437 -0
- package/dist/docs/cli/authentication.md +3 -0
- package/dist/docs/cli/checkpointing.md +94 -0
- package/dist/docs/cli/cli-reference.md +101 -0
- package/dist/docs/cli/commands.md +430 -0
- package/dist/docs/cli/creating-skills.md +80 -0
- package/dist/docs/cli/custom-commands.md +315 -0
- package/dist/docs/cli/enterprise.md +565 -0
- package/dist/docs/cli/gemini-ignore.md +71 -0
- package/dist/docs/cli/gemini-md.md +108 -0
- package/dist/docs/cli/generation-settings.md +210 -0
- package/dist/docs/cli/headless.md +388 -0
- package/dist/docs/cli/index.md +65 -0
- package/dist/docs/cli/keyboard-shortcuts.md +140 -0
- package/dist/docs/cli/model-routing.md +42 -0
- package/dist/docs/cli/model.md +62 -0
- package/dist/docs/cli/rewind.md +51 -0
- package/dist/docs/cli/sandbox.md +171 -0
- package/dist/docs/cli/session-management.md +158 -0
- package/dist/docs/cli/settings.md +139 -0
- package/dist/docs/cli/skills.md +112 -0
- package/dist/docs/cli/system-prompt.md +125 -0
- package/dist/docs/cli/telemetry.md +826 -0
- package/dist/docs/cli/themes.md +235 -0
- package/dist/docs/cli/token-caching.md +20 -0
- package/dist/docs/cli/trusted-folders.md +95 -0
- package/dist/docs/cli/tutorials/skills-getting-started.md +97 -0
- package/dist/docs/cli/tutorials.md +87 -0
- package/dist/docs/cli/uninstall.md +65 -0
- package/dist/docs/core/index.md +107 -0
- package/dist/docs/core/memport.md +246 -0
- package/dist/docs/core/policy-engine.md +305 -0
- package/dist/docs/core/remote-agents.md +84 -0
- package/dist/docs/core/subagents.md +191 -0
- package/dist/docs/core/tools-api.md +131 -0
- package/dist/docs/examples/proxy-script.md +83 -0
- package/dist/docs/extensions/best-practices.md +139 -0
- package/dist/docs/extensions/index.md +45 -0
- package/dist/docs/extensions/reference.md +336 -0
- package/dist/docs/extensions/releasing.md +183 -0
- package/dist/docs/extensions/writing-extensions.md +281 -0
- package/dist/docs/faq.md +154 -0
- package/dist/docs/get-started/authentication.md +321 -0
- package/dist/docs/get-started/configuration-v1.md +888 -0
- package/dist/docs/get-started/configuration.md +1585 -0
- package/dist/docs/get-started/examples.md +219 -0
- package/dist/docs/get-started/gemini-3.md +101 -0
- package/dist/docs/get-started/index.md +71 -0
- package/dist/docs/get-started/installation.md +141 -0
- package/dist/docs/hooks/best-practices.md +677 -0
- package/dist/docs/hooks/index.md +164 -0
- package/dist/docs/hooks/reference.md +322 -0
- package/dist/docs/hooks/writing-hooks.md +450 -0
- package/dist/docs/ide-integration/ide-companion-spec.md +267 -0
- package/dist/docs/ide-integration/index.md +202 -0
- package/dist/docs/index.md +149 -0
- package/dist/docs/integration-tests.md +211 -0
- package/dist/docs/issue-and-pr-automation.md +134 -0
- package/dist/docs/local-development.md +128 -0
- package/dist/docs/mermaid/context.mmd +103 -0
- package/dist/docs/mermaid/render-path.mmd +64 -0
- package/dist/docs/npm.md +62 -0
- package/dist/docs/quota-and-pricing.md +158 -0
- package/dist/docs/release-confidence.md +164 -0
- package/dist/docs/releases.md +540 -0
- package/dist/docs/sidebar.json +152 -0
- package/dist/docs/tools/file-system.md +217 -0
- package/dist/docs/tools/index.md +98 -0
- package/dist/docs/tools/mcp-server.md +1079 -0
- package/dist/docs/tools/memory.md +54 -0
- package/dist/docs/tools/shell.md +260 -0
- package/dist/docs/tools/todos.md +57 -0
- package/dist/docs/tools/web-fetch.md +59 -0
- package/dist/docs/tools/web-search.md +42 -0
- package/dist/docs/tos-privacy.md +96 -0
- package/dist/docs/troubleshooting.md +173 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/src/__mocks__/fs/promises.d.ts +11 -0
- package/dist/src/__mocks__/fs/promises.js +17 -0
- package/dist/src/__mocks__/fs/promises.js.map +1 -0
- package/dist/src/agents/a2a-client-manager.d.ts +77 -0
- package/dist/src/agents/a2a-client-manager.js +173 -0
- package/dist/src/agents/a2a-client-manager.js.map +1 -0
- package/dist/src/agents/a2aUtils.d.ts +29 -0
- package/dist/src/agents/a2aUtils.js +113 -0
- package/dist/src/agents/a2aUtils.js.map +1 -0
- package/dist/src/agents/acknowledgedAgents.d.ts +18 -0
- package/dist/src/agents/acknowledgedAgents.js +58 -0
- package/dist/src/agents/acknowledgedAgents.js.map +1 -0
- package/dist/src/agents/agent-scheduler.d.ts +33 -0
- package/dist/src/agents/agent-scheduler.js +29 -0
- package/dist/src/agents/agent-scheduler.js.map +1 -0
- package/dist/src/agents/agentLoader.d.ts +73 -0
- package/dist/src/agents/agentLoader.js +268 -0
- package/dist/src/agents/agentLoader.js.map +1 -0
- package/dist/src/agents/cli-help-agent.d.ts +24 -0
- package/dist/src/agents/cli-help-agent.js +80 -0
- package/dist/src/agents/cli-help-agent.js.map +1 -0
- package/dist/src/agents/codebase-investigator.d.ts +47 -0
- package/dist/src/agents/codebase-investigator.js +159 -0
- package/dist/src/agents/codebase-investigator.js.map +1 -0
- package/dist/src/agents/generalist-agent.d.ts +21 -0
- package/dist/src/agents/generalist-agent.js +60 -0
- package/dist/src/agents/generalist-agent.js.map +1 -0
- package/dist/src/agents/local-executor.d.ts +110 -0
- package/dist/src/agents/local-executor.js +879 -0
- package/dist/src/agents/local-executor.js.map +1 -0
- package/dist/src/agents/local-invocation.d.ts +45 -0
- package/dist/src/agents/local-invocation.js +101 -0
- package/dist/src/agents/local-invocation.js.map +1 -0
- package/dist/src/agents/registry.d.ts +85 -0
- package/dist/src/agents/registry.js +374 -0
- package/dist/src/agents/registry.js.map +1 -0
- package/dist/src/agents/remote-invocation.d.ts +35 -0
- package/dist/src/agents/remote-invocation.js +127 -0
- package/dist/src/agents/remote-invocation.js.map +1 -0
- package/dist/src/agents/subagent-tool-wrapper.d.ts +38 -0
- package/dist/src/agents/subagent-tool-wrapper.js +51 -0
- package/dist/src/agents/subagent-tool-wrapper.js.map +1 -0
- package/dist/src/agents/subagent-tool.d.ts +15 -0
- package/dist/src/agents/subagent-tool.js +61 -0
- package/dist/src/agents/subagent-tool.js.map +1 -0
- package/dist/src/agents/types.d.ts +154 -0
- package/dist/src/agents/types.js +23 -0
- package/dist/src/agents/types.js.map +1 -0
- package/dist/src/agents/utils.d.ts +15 -0
- package/dist/src/agents/utils.js +29 -0
- package/dist/src/agents/utils.js.map +1 -0
- package/dist/src/availability/errorClassification.d.ts +7 -0
- package/dist/src/availability/errorClassification.js +20 -0
- package/dist/src/availability/errorClassification.js.map +1 -0
- package/dist/src/availability/modelAvailabilityService.d.ts +36 -0
- package/dist/src/availability/modelAvailabilityService.js +87 -0
- package/dist/src/availability/modelAvailabilityService.js.map +1 -0
- package/dist/src/availability/modelPolicy.d.ts +49 -0
- package/dist/src/availability/modelPolicy.js +7 -0
- package/dist/src/availability/modelPolicy.js.map +1 -0
- package/dist/src/availability/policyCatalog.d.ts +24 -0
- package/dist/src/availability/policyCatalog.js +106 -0
- package/dist/src/availability/policyCatalog.js.map +1 -0
- package/dist/src/availability/policyHelpers.d.ts +52 -0
- package/dist/src/availability/policyHelpers.js +143 -0
- package/dist/src/availability/policyHelpers.js.map +1 -0
- package/dist/src/availability/testUtils.d.ts +10 -0
- package/dist/src/availability/testUtils.js +22 -0
- package/dist/src/availability/testUtils.js.map +1 -0
- package/dist/src/code_assist/admin/admin_controls.d.ts +32 -0
- package/dist/src/code_assist/admin/admin_controls.js +120 -0
- package/dist/src/code_assist/admin/admin_controls.js.map +1 -0
- package/dist/src/code_assist/codeAssist.d.ts +12 -0
- package/dist/src/code_assist/codeAssist.js +31 -0
- package/dist/src/code_assist/codeAssist.js.map +1 -0
- package/dist/src/code_assist/converter.d.ts +75 -0
- package/dist/src/code_assist/converter.js +161 -0
- package/dist/src/code_assist/converter.js.map +1 -0
- package/dist/src/code_assist/experiments/client_metadata.d.ts +12 -0
- package/dist/src/code_assist/experiments/client_metadata.js +51 -0
- package/dist/src/code_assist/experiments/client_metadata.js.map +1 -0
- package/dist/src/code_assist/experiments/experiments.d.ts +17 -0
- package/dist/src/code_assist/experiments/experiments.js +57 -0
- package/dist/src/code_assist/experiments/experiments.js.map +1 -0
- package/dist/src/code_assist/experiments/flagNames.d.ts +16 -0
- package/dist/src/code_assist/experiments/flagNames.js +16 -0
- package/dist/src/code_assist/experiments/flagNames.js.map +1 -0
- package/dist/src/code_assist/experiments/types.d.ts +35 -0
- package/dist/src/code_assist/experiments/types.js +7 -0
- package/dist/src/code_assist/experiments/types.js.map +1 -0
- package/dist/src/code_assist/oauth-credential-storage.d.ts +25 -0
- package/dist/src/code_assist/oauth-credential-storage.js +109 -0
- package/dist/src/code_assist/oauth-credential-storage.js.map +1 -0
- package/dist/src/code_assist/oauth2.d.ts +25 -0
- package/dist/src/code_assist/oauth2.js +579 -0
- package/dist/src/code_assist/oauth2.js.map +1 -0
- package/dist/src/code_assist/server.d.ts +50 -0
- package/dist/src/code_assist/server.js +228 -0
- package/dist/src/code_assist/server.js.map +1 -0
- package/dist/src/code_assist/setup.d.ts +46 -0
- package/dist/src/code_assist/setup.js +179 -0
- package/dist/src/code_assist/setup.js.map +1 -0
- package/dist/src/code_assist/telemetry.d.ts +14 -0
- package/dist/src/code_assist/telemetry.js +157 -0
- package/dist/src/code_assist/telemetry.js.map +1 -0
- package/dist/src/code_assist/types.d.ts +306 -0
- package/dist/src/code_assist/types.js +94 -0
- package/dist/src/code_assist/types.js.map +1 -0
- package/dist/src/cognitive/gemini-adapter.d.ts +29 -0
- package/dist/src/cognitive/gemini-adapter.js +109 -0
- package/dist/src/cognitive/gemini-adapter.js.map +1 -0
- package/dist/src/cognitive/index.d.ts +22 -0
- package/dist/src/cognitive/index.js +50 -0
- package/dist/src/cognitive/index.js.map +1 -0
- package/dist/src/cognitive/integration.d.ts +57 -0
- package/dist/src/cognitive/integration.js +103 -0
- package/dist/src/cognitive/integration.js.map +1 -0
- package/dist/src/cognitive/loader/index.d.ts +8 -0
- package/dist/src/cognitive/loader/index.js +9 -0
- package/dist/src/cognitive/loader/index.js.map +1 -0
- package/dist/src/cognitive/loader/module-loader.d.ts +67 -0
- package/dist/src/cognitive/loader/module-loader.js +369 -0
- package/dist/src/cognitive/loader/module-loader.js.map +1 -0
- package/dist/src/cognitive/runtime/envelope.d.ts +31 -0
- package/dist/src/cognitive/runtime/envelope.js +167 -0
- package/dist/src/cognitive/runtime/envelope.js.map +1 -0
- package/dist/src/cognitive/runtime/executor.d.ts +65 -0
- package/dist/src/cognitive/runtime/executor.js +245 -0
- package/dist/src/cognitive/runtime/executor.js.map +1 -0
- package/dist/src/cognitive/runtime/index.d.ts +12 -0
- package/dist/src/cognitive/runtime/index.js +18 -0
- package/dist/src/cognitive/runtime/index.js.map +1 -0
- package/dist/src/cognitive/runtime/prompt-builder.d.ts +34 -0
- package/dist/src/cognitive/runtime/prompt-builder.js +216 -0
- package/dist/src/cognitive/runtime/prompt-builder.js.map +1 -0
- package/dist/src/cognitive/runtime/repair-pass.d.ts +43 -0
- package/dist/src/cognitive/runtime/repair-pass.js +170 -0
- package/dist/src/cognitive/runtime/repair-pass.js.map +1 -0
- package/dist/src/cognitive/runtime/risk-aggregator.d.ts +39 -0
- package/dist/src/cognitive/runtime/risk-aggregator.js +90 -0
- package/dist/src/cognitive/runtime/risk-aggregator.js.map +1 -0
- package/dist/src/cognitive/tool/cognitive-registry.d.ts +99 -0
- package/dist/src/cognitive/tool/cognitive-registry.js +192 -0
- package/dist/src/cognitive/tool/cognitive-registry.js.map +1 -0
- package/dist/src/cognitive/tool/cognitive-tool.d.ts +56 -0
- package/dist/src/cognitive/tool/cognitive-tool.js +217 -0
- package/dist/src/cognitive/tool/cognitive-tool.js.map +1 -0
- package/dist/src/cognitive/tool/index.d.ts +9 -0
- package/dist/src/cognitive/tool/index.js +10 -0
- package/dist/src/cognitive/tool/index.js.map +1 -0
- package/dist/src/cognitive/types.d.ts +234 -0
- package/dist/src/cognitive/types.js +10 -0
- package/dist/src/cognitive/types.js.map +1 -0
- package/dist/src/cognitive/validator/envelope-validator.d.ts +45 -0
- package/dist/src/cognitive/validator/envelope-validator.js +214 -0
- package/dist/src/cognitive/validator/envelope-validator.js.map +1 -0
- package/dist/src/cognitive/validator/index.d.ts +9 -0
- package/dist/src/cognitive/validator/index.js +10 -0
- package/dist/src/cognitive/validator/index.js.map +1 -0
- package/dist/src/cognitive/validator/schema-validator.d.ts +46 -0
- package/dist/src/cognitive/validator/schema-validator.js +202 -0
- package/dist/src/cognitive/validator/schema-validator.js.map +1 -0
- package/dist/src/commands/cognitive.d.ts +39 -0
- package/dist/src/commands/cognitive.js +335 -0
- package/dist/src/commands/cognitive.js.map +1 -0
- package/dist/src/commands/extensions.d.ts +7 -0
- package/dist/src/commands/extensions.js +9 -0
- package/dist/src/commands/extensions.js.map +1 -0
- package/dist/src/commands/init.d.ts +7 -0
- package/dist/src/commands/init.js +53 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/memory.d.ts +11 -0
- package/dist/src/commands/memory.js +80 -0
- package/dist/src/commands/memory.js.map +1 -0
- package/dist/src/commands/restore.d.ts +9 -0
- package/dist/src/commands/restore.js +46 -0
- package/dist/src/commands/restore.js.map +1 -0
- package/dist/src/commands/types.d.ts +41 -0
- package/dist/src/commands/types.js +7 -0
- package/dist/src/commands/types.js.map +1 -0
- package/dist/src/config/config.d.ts +766 -0
- package/dist/src/config/config.js +1625 -0
- package/dist/src/config/config.js.map +1 -0
- package/dist/src/config/constants.d.ts +15 -0
- package/dist/src/config/constants.js +24 -0
- package/dist/src/config/constants.js.map +1 -0
- package/dist/src/config/defaultModelConfigs.d.ts +7 -0
- package/dist/src/config/defaultModelConfigs.js +231 -0
- package/dist/src/config/defaultModelConfigs.js.map +1 -0
- package/dist/src/config/models.d.ts +67 -0
- package/dist/src/config/models.js +144 -0
- package/dist/src/config/models.js.map +1 -0
- package/dist/src/config/storage.d.ts +44 -0
- package/dist/src/config/storage.js +139 -0
- package/dist/src/config/storage.js.map +1 -0
- package/dist/src/confirmation-bus/index.d.ts +7 -0
- package/dist/src/confirmation-bus/index.js +8 -0
- package/dist/src/confirmation-bus/index.js.map +1 -0
- package/dist/src/confirmation-bus/message-bus.d.ts +24 -0
- package/dist/src/confirmation-bus/message-bus.js +120 -0
- package/dist/src/confirmation-bus/message-bus.js.map +1 -0
- package/dist/src/confirmation-bus/types.d.ts +147 -0
- package/dist/src/confirmation-bus/types.js +25 -0
- package/dist/src/confirmation-bus/types.js.map +1 -0
- package/dist/src/core/apiKeyCredentialStorage.d.ts +17 -0
- package/dist/src/core/apiKeyCredentialStorage.js +64 -0
- package/dist/src/core/apiKeyCredentialStorage.js.map +1 -0
- package/dist/src/core/baseLlmClient.d.ts +74 -0
- package/dist/src/core/baseLlmClient.js +167 -0
- package/dist/src/core/baseLlmClient.js.map +1 -0
- package/dist/src/core/client.d.ts +59 -0
- package/dist/src/core/client.js +716 -0
- package/dist/src/core/client.js.map +1 -0
- package/dist/src/core/contentGenerator.d.ts +34 -0
- package/dist/src/core/contentGenerator.js +107 -0
- package/dist/src/core/contentGenerator.js.map +1 -0
- package/dist/src/core/coreToolHookTriggers.d.ts +23 -0
- package/dist/src/core/coreToolHookTriggers.js +195 -0
- package/dist/src/core/coreToolHookTriggers.js.map +1 -0
- package/dist/src/core/coreToolScheduler.d.ts +50 -0
- package/dist/src/core/coreToolScheduler.js +703 -0
- package/dist/src/core/coreToolScheduler.js.map +1 -0
- package/dist/src/core/fakeContentGenerator.d.ts +34 -0
- package/dist/src/core/fakeContentGenerator.js +59 -0
- package/dist/src/core/fakeContentGenerator.js.map +1 -0
- package/dist/src/core/geminiChat.d.ts +160 -0
- package/dist/src/core/geminiChat.js +744 -0
- package/dist/src/core/geminiChat.js.map +1 -0
- package/dist/src/core/geminiRequest.d.ts +13 -0
- package/dist/src/core/geminiRequest.js +11 -0
- package/dist/src/core/geminiRequest.js.map +1 -0
- package/dist/src/core/logger.d.ts +65 -0
- package/dist/src/core/logger.js +368 -0
- package/dist/src/core/logger.js.map +1 -0
- package/dist/src/core/loggingContentGenerator.d.ts +29 -0
- package/dist/src/core/loggingContentGenerator.js +202 -0
- package/dist/src/core/loggingContentGenerator.js.map +1 -0
- package/dist/src/core/prompts.d.ts +19 -0
- package/dist/src/core/prompts.js +27 -0
- package/dist/src/core/prompts.js.map +1 -0
- package/dist/src/core/recordingContentGenerator.d.ts +19 -0
- package/dist/src/core/recordingContentGenerator.js +82 -0
- package/dist/src/core/recordingContentGenerator.js.map +1 -0
- package/dist/src/core/tokenLimits.d.ts +10 -0
- package/dist/src/core/tokenLimits.js +22 -0
- package/dist/src/core/tokenLimits.js.map +1 -0
- package/dist/src/core/turn.d.ts +167 -0
- package/dist/src/core/turn.js +209 -0
- package/dist/src/core/turn.js.map +1 -0
- package/dist/src/fallback/handler.d.ts +7 -0
- package/dist/src/fallback/handler.js +110 -0
- package/dist/src/fallback/handler.js.map +1 -0
- package/dist/src/fallback/types.d.ts +31 -0
- package/dist/src/fallback/types.js +7 -0
- package/dist/src/fallback/types.js.map +1 -0
- package/dist/src/generated/git-commit.d.ts +7 -0
- package/dist/src/generated/git-commit.js +10 -0
- package/dist/src/generated/git-commit.js.map +1 -0
- package/dist/src/hooks/hookAggregator.d.ts +68 -0
- package/dist/src/hooks/hookAggregator.js +279 -0
- package/dist/src/hooks/hookAggregator.js.map +1 -0
- package/dist/src/hooks/hookEventHandler.d.ts +107 -0
- package/dist/src/hooks/hookEventHandler.js +325 -0
- package/dist/src/hooks/hookEventHandler.js.map +1 -0
- package/dist/src/hooks/hookPlanner.d.ts +42 -0
- package/dist/src/hooks/hookPlanner.js +103 -0
- package/dist/src/hooks/hookPlanner.js.map +1 -0
- package/dist/src/hooks/hookRegistry.d.ts +75 -0
- package/dist/src/hooks/hookRegistry.js +215 -0
- package/dist/src/hooks/hookRegistry.js.map +1 -0
- package/dist/src/hooks/hookRunner.d.ts +44 -0
- package/dist/src/hooks/hookRunner.js +329 -0
- package/dist/src/hooks/hookRunner.js.map +1 -0
- package/dist/src/hooks/hookSystem.d.ts +99 -0
- package/dist/src/hooks/hookSystem.js +262 -0
- package/dist/src/hooks/hookSystem.js.map +1 -0
- package/dist/src/hooks/hookTranslator.d.ts +113 -0
- package/dist/src/hooks/hookTranslator.js +233 -0
- package/dist/src/hooks/hookTranslator.js.map +1 -0
- package/dist/src/hooks/index.d.ts +16 -0
- package/dist/src/hooks/index.js +16 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/hooks/trustedHooks.d.ts +28 -0
- package/dist/src/hooks/trustedHooks.js +90 -0
- package/dist/src/hooks/trustedHooks.js.map +1 -0
- package/dist/src/hooks/types.d.ts +442 -0
- package/dist/src/hooks/types.js +303 -0
- package/dist/src/hooks/types.js.map +1 -0
- package/dist/src/ide/constants.d.ts +9 -0
- package/dist/src/ide/constants.js +10 -0
- package/dist/src/ide/constants.js.map +1 -0
- package/dist/src/ide/detect-ide.d.ts +109 -0
- package/dist/src/ide/detect-ide.js +125 -0
- package/dist/src/ide/detect-ide.js.map +1 -0
- package/dist/src/ide/ide-client.d.ts +113 -0
- package/dist/src/ide/ide-client.js +669 -0
- package/dist/src/ide/ide-client.js.map +1 -0
- package/dist/src/ide/ide-installer.d.ts +14 -0
- package/dist/src/ide/ide-installer.js +227 -0
- package/dist/src/ide/ide-installer.js.map +1 -0
- package/dist/src/ide/ideContext.d.ts +44 -0
- package/dist/src/ide/ideContext.js +101 -0
- package/dist/src/ide/ideContext.js.map +1 -0
- package/dist/src/ide/process-utils.d.ts +21 -0
- package/dist/src/ide/process-utils.js +181 -0
- package/dist/src/ide/process-utils.js.map +1 -0
- package/dist/src/ide/types.d.ts +486 -0
- package/dist/src/ide/types.js +138 -0
- package/dist/src/ide/types.js.map +1 -0
- package/dist/src/index.d.ts +145 -0
- package/dist/src/index.js +161 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/auth-provider.d.ts +16 -0
- package/dist/src/mcp/auth-provider.js +7 -0
- package/dist/src/mcp/auth-provider.js.map +1 -0
- package/dist/src/mcp/google-auth-provider.d.ts +33 -0
- package/dist/src/mcp/google-auth-provider.js +118 -0
- package/dist/src/mcp/google-auth-provider.js.map +1 -0
- package/dist/src/mcp/oauth-provider.d.ts +160 -0
- package/dist/src/mcp/oauth-provider.js +729 -0
- package/dist/src/mcp/oauth-provider.js.map +1 -0
- package/dist/src/mcp/oauth-token-storage.d.ts +65 -0
- package/dist/src/mcp/oauth-token-storage.js +181 -0
- package/dist/src/mcp/oauth-token-storage.js.map +1 -0
- package/dist/src/mcp/oauth-utils.d.ts +142 -0
- package/dist/src/mcp/oauth-utils.js +289 -0
- package/dist/src/mcp/oauth-utils.js.map +1 -0
- package/dist/src/mcp/sa-impersonation-provider.d.ts +27 -0
- package/dist/src/mcp/sa-impersonation-provider.js +113 -0
- package/dist/src/mcp/sa-impersonation-provider.js.map +1 -0
- package/dist/src/mcp/token-storage/base-token-storage.d.ts +19 -0
- package/dist/src/mcp/token-storage/base-token-storage.js +36 -0
- package/dist/src/mcp/token-storage/base-token-storage.js.map +1 -0
- package/dist/src/mcp/token-storage/file-token-storage.d.ts +24 -0
- package/dist/src/mcp/token-storage/file-token-storage.js +145 -0
- package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -0
- package/dist/src/mcp/token-storage/hybrid-token-storage.d.ts +23 -0
- package/dist/src/mcp/token-storage/hybrid-token-storage.js +78 -0
- package/dist/src/mcp/token-storage/hybrid-token-storage.js.map +1 -0
- package/dist/src/mcp/token-storage/index.d.ts +11 -0
- package/dist/src/mcp/token-storage/index.js +12 -0
- package/dist/src/mcp/token-storage/index.js.map +1 -0
- package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +35 -0
- package/dist/src/mcp/token-storage/keychain-token-storage.js +246 -0
- package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -0
- package/dist/src/mcp/token-storage/types.d.ts +44 -0
- package/dist/src/mcp/token-storage/types.js +11 -0
- package/dist/src/mcp/token-storage/types.js.map +1 -0
- package/dist/src/mocks/msw.d.ts +6 -0
- package/dist/src/mocks/msw.js +8 -0
- package/dist/src/mocks/msw.js.map +1 -0
- package/dist/src/output/json-formatter.d.ts +11 -0
- package/dist/src/output/json-formatter.js +33 -0
- package/dist/src/output/json-formatter.js.map +1 -0
- package/dist/src/output/stream-json-formatter.d.ts +32 -0
- package/dist/src/output/stream-json-formatter.js +58 -0
- package/dist/src/output/stream-json-formatter.js.map +1 -0
- package/dist/src/output/types.d.ts +85 -0
- package/dist/src/output/types.js +22 -0
- package/dist/src/output/types.js.map +1 -0
- package/dist/src/policy/config.d.ts +31 -0
- package/dist/src/policy/config.js +355 -0
- package/dist/src/policy/config.js.map +1 -0
- package/dist/src/policy/index.d.ts +9 -0
- package/dist/src/policy/index.js +10 -0
- package/dist/src/policy/index.js.map +1 -0
- package/dist/src/policy/policies/discovered.toml +8 -0
- package/dist/src/policy/policies/plan.toml +79 -0
- package/dist/src/policy/policies/read-only.toml +51 -0
- package/dist/src/policy/policies/write.toml +78 -0
- package/dist/src/policy/policies/yolo.toml +32 -0
- package/dist/src/policy/policy-engine.d.ts +65 -0
- package/dist/src/policy/policy-engine.js +357 -0
- package/dist/src/policy/policy-engine.js.map +1 -0
- package/dist/src/policy/stable-stringify.d.ts +58 -0
- package/dist/src/policy/stable-stringify.js +122 -0
- package/dist/src/policy/stable-stringify.js.map +1 -0
- package/dist/src/policy/toml-loader.d.ts +45 -0
- package/dist/src/policy/toml-loader.js +366 -0
- package/dist/src/policy/toml-loader.js.map +1 -0
- package/dist/src/policy/types.d.ts +220 -0
- package/dist/src/policy/types.js +44 -0
- package/dist/src/policy/types.js.map +1 -0
- package/dist/src/policy/utils.d.ts +21 -0
- package/dist/src/policy/utils.js +45 -0
- package/dist/src/policy/utils.js.map +1 -0
- package/dist/src/prompts/mcp-prompts.d.ts +8 -0
- package/dist/src/prompts/mcp-prompts.js +13 -0
- package/dist/src/prompts/mcp-prompts.js.map +1 -0
- package/dist/src/prompts/prompt-registry.d.ts +34 -0
- package/dist/src/prompts/prompt-registry.js +64 -0
- package/dist/src/prompts/prompt-registry.js.map +1 -0
- package/dist/src/prompts/promptProvider.d.ts +18 -0
- package/dist/src/prompts/promptProvider.js +129 -0
- package/dist/src/prompts/promptProvider.js.map +1 -0
- package/dist/src/prompts/snippets.d.ts +76 -0
- package/dist/src/prompts/snippets.js +455 -0
- package/dist/src/prompts/snippets.js.map +1 -0
- package/dist/src/prompts/utils.d.ts +23 -0
- package/dist/src/prompts/utils.js +72 -0
- package/dist/src/prompts/utils.js.map +1 -0
- package/dist/src/resources/resource-registry.d.ts +30 -0
- package/dist/src/resources/resource-registry.js +57 -0
- package/dist/src/resources/resource-registry.js.map +1 -0
- package/dist/src/routing/modelRouterService.d.ts +23 -0
- package/dist/src/routing/modelRouterService.js +80 -0
- package/dist/src/routing/modelRouterService.js.map +1 -0
- package/dist/src/routing/routingStrategy.d.ts +64 -0
- package/dist/src/routing/routingStrategy.js +7 -0
- package/dist/src/routing/routingStrategy.js.map +1 -0
- package/dist/src/routing/strategies/classifierStrategy.d.ts +12 -0
- package/dist/src/routing/strategies/classifierStrategy.js +152 -0
- package/dist/src/routing/strategies/classifierStrategy.js.map +1 -0
- package/dist/src/routing/strategies/compositeStrategy.d.ts +26 -0
- package/dist/src/routing/strategies/compositeStrategy.js +70 -0
- package/dist/src/routing/strategies/compositeStrategy.js.map +1 -0
- package/dist/src/routing/strategies/defaultStrategy.d.ts +12 -0
- package/dist/src/routing/strategies/defaultStrategy.js +21 -0
- package/dist/src/routing/strategies/defaultStrategy.js.map +1 -0
- package/dist/src/routing/strategies/fallbackStrategy.d.ts +12 -0
- package/dist/src/routing/strategies/fallbackStrategy.js +33 -0
- package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -0
- package/dist/src/routing/strategies/numericalClassifierStrategy.d.ts +13 -0
- package/dist/src/routing/strategies/numericalClassifierStrategy.js +178 -0
- package/dist/src/routing/strategies/numericalClassifierStrategy.js.map +1 -0
- package/dist/src/routing/strategies/overrideStrategy.d.ts +15 -0
- package/dist/src/routing/strategies/overrideStrategy.js +29 -0
- package/dist/src/routing/strategies/overrideStrategy.js.map +1 -0
- package/dist/src/safety/built-in.d.ts +21 -0
- package/dist/src/safety/built-in.js +106 -0
- package/dist/src/safety/built-in.js.map +1 -0
- package/dist/src/safety/checker-runner.d.ts +48 -0
- package/dist/src/safety/checker-runner.js +219 -0
- package/dist/src/safety/checker-runner.js.map +1 -0
- package/dist/src/safety/context-builder.d.ts +23 -0
- package/dist/src/safety/context-builder.js +47 -0
- package/dist/src/safety/context-builder.js.map +1 -0
- package/dist/src/safety/protocol.d.ts +88 -0
- package/dist/src/safety/protocol.js +15 -0
- package/dist/src/safety/protocol.js.map +1 -0
- package/dist/src/safety/registry.d.ts +26 -0
- package/dist/src/safety/registry.js +65 -0
- package/dist/src/safety/registry.js.map +1 -0
- package/dist/src/scheduler/confirmation.d.ts +49 -0
- package/dist/src/scheduler/confirmation.js +183 -0
- package/dist/src/scheduler/confirmation.js.map +1 -0
- package/dist/src/scheduler/policy.d.ts +25 -0
- package/dist/src/scheduler/policy.js +108 -0
- package/dist/src/scheduler/policy.js.map +1 -0
- package/dist/src/scheduler/scheduler.d.ts +61 -0
- package/dist/src/scheduler/scheduler.js +356 -0
- package/dist/src/scheduler/scheduler.js.map +1 -0
- package/dist/src/scheduler/state-manager.d.ts +73 -0
- package/dist/src/scheduler/state-manager.js +356 -0
- package/dist/src/scheduler/state-manager.js.map +1 -0
- package/dist/src/scheduler/tool-executor.d.ts +22 -0
- package/dist/src/scheduler/tool-executor.js +201 -0
- package/dist/src/scheduler/tool-executor.js.map +1 -0
- package/dist/src/scheduler/tool-modifier.d.ts +23 -0
- package/dist/src/scheduler/tool-modifier.js +50 -0
- package/dist/src/scheduler/tool-modifier.js.map +1 -0
- package/dist/src/scheduler/types.d.ts +118 -0
- package/dist/src/scheduler/types.js +7 -0
- package/dist/src/scheduler/types.js.map +1 -0
- package/dist/src/services/chatCompressionService.d.ts +41 -0
- package/dist/src/services/chatCompressionService.js +339 -0
- package/dist/src/services/chatCompressionService.js.map +1 -0
- package/dist/src/services/chatRecordingService.d.ts +174 -0
- package/dist/src/services/chatRecordingService.js +427 -0
- package/dist/src/services/chatRecordingService.js.map +1 -0
- package/dist/src/services/contextManager.d.ts +29 -0
- package/dist/src/services/contextManager.js +71 -0
- package/dist/src/services/contextManager.js.map +1 -0
- package/dist/src/services/environmentSanitization.d.ts +15 -0
- package/dist/src/services/environmentSanitization.js +145 -0
- package/dist/src/services/environmentSanitization.js.map +1 -0
- package/dist/src/services/fileDiscoveryService.d.ts +45 -0
- package/dist/src/services/fileDiscoveryService.js +141 -0
- package/dist/src/services/fileDiscoveryService.js.map +1 -0
- package/dist/src/services/fileSystemService.d.ts +31 -0
- package/dist/src/services/fileSystemService.js +18 -0
- package/dist/src/services/fileSystemService.js.map +1 -0
- package/dist/src/services/gitService.d.ts +24 -0
- package/dist/src/services/gitService.js +132 -0
- package/dist/src/services/gitService.js.map +1 -0
- package/dist/src/services/loopDetectionService.d.ts +106 -0
- package/dist/src/services/loopDetectionService.js +433 -0
- package/dist/src/services/loopDetectionService.js.map +1 -0
- package/dist/src/services/modelConfigService.d.ts +86 -0
- package/dist/src/services/modelConfigService.js +215 -0
- package/dist/src/services/modelConfigService.js.map +1 -0
- package/dist/src/services/modelConfigServiceTestUtils.d.ts +10 -0
- package/dist/src/services/modelConfigServiceTestUtils.js +17 -0
- package/dist/src/services/modelConfigServiceTestUtils.js.map +1 -0
- package/dist/src/services/sessionSummaryService.d.ts +28 -0
- package/dist/src/services/sessionSummaryService.js +131 -0
- package/dist/src/services/sessionSummaryService.js.map +1 -0
- package/dist/src/services/sessionSummaryUtils.d.ts +16 -0
- package/dist/src/services/sessionSummaryUtils.js +129 -0
- package/dist/src/services/sessionSummaryUtils.js.map +1 -0
- package/dist/src/services/shellExecutionService.d.ts +145 -0
- package/dist/src/services/shellExecutionService.js +871 -0
- package/dist/src/services/shellExecutionService.js.map +1 -0
- package/dist/src/services/test-data/resolved-aliases-retry.golden.json +238 -0
- package/dist/src/services/test-data/resolved-aliases.golden.json +238 -0
- package/dist/src/skills/builtin/skill-creator/SKILL.md +382 -0
- package/dist/src/skills/builtin/skill-creator/scripts/init_skill.cjs +235 -0
- package/dist/src/skills/builtin/skill-creator/scripts/package_skill.cjs +102 -0
- package/dist/src/skills/builtin/skill-creator/scripts/validate_skill.cjs +127 -0
- package/dist/src/skills/skillLoader.d.ts +31 -0
- package/dist/src/skills/skillLoader.js +133 -0
- package/dist/src/skills/skillLoader.js.map +1 -0
- package/dist/src/skills/skillManager.d.ts +69 -0
- package/dist/src/skills/skillManager.js +138 -0
- package/dist/src/skills/skillManager.js.map +1 -0
- package/dist/src/telemetry/activity-detector.d.ts +41 -0
- package/dist/src/telemetry/activity-detector.js +61 -0
- package/dist/src/telemetry/activity-detector.js.map +1 -0
- package/dist/src/telemetry/activity-monitor.d.ts +116 -0
- package/dist/src/telemetry/activity-monitor.js +209 -0
- package/dist/src/telemetry/activity-monitor.js.map +1 -0
- package/dist/src/telemetry/activity-types.d.ts +19 -0
- package/dist/src/telemetry/activity-types.js +21 -0
- package/dist/src/telemetry/activity-types.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +172 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +1316 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +150 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +377 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -0
- package/dist/src/telemetry/config.d.ts +31 -0
- package/dist/src/telemetry/config.js +78 -0
- package/dist/src/telemetry/config.js.map +1 -0
- package/dist/src/telemetry/constants.d.ts +6 -0
- package/dist/src/telemetry/constants.js +7 -0
- package/dist/src/telemetry/constants.js.map +1 -0
- package/dist/src/telemetry/file-exporters.d.ts +29 -0
- package/dist/src/telemetry/file-exporters.js +62 -0
- package/dist/src/telemetry/file-exporters.js.map +1 -0
- package/dist/src/telemetry/gcp-exporters.d.ts +35 -0
- package/dist/src/telemetry/gcp-exporters.js +120 -0
- package/dist/src/telemetry/gcp-exporters.js.map +1 -0
- package/dist/src/telemetry/high-water-mark-tracker.d.ts +43 -0
- package/dist/src/telemetry/high-water-mark-tracker.js +88 -0
- package/dist/src/telemetry/high-water-mark-tracker.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +33 -0
- package/dist/src/telemetry/index.js +44 -0
- package/dist/src/telemetry/index.js.map +1 -0
- package/dist/src/telemetry/integration.test.circular.d.ts +6 -0
- package/dist/src/telemetry/integration.test.circular.js +54 -0
- package/dist/src/telemetry/integration.test.circular.js.map +1 -0
- package/dist/src/telemetry/loggers.d.ts +46 -0
- package/dist/src/telemetry/loggers.js +517 -0
- package/dist/src/telemetry/loggers.js.map +1 -0
- package/dist/src/telemetry/loggers.test.circular.d.ts +6 -0
- package/dist/src/telemetry/loggers.test.circular.js +107 -0
- package/dist/src/telemetry/loggers.test.circular.js.map +1 -0
- package/dist/src/telemetry/memory-monitor.d.ts +149 -0
- package/dist/src/telemetry/memory-monitor.js +335 -0
- package/dist/src/telemetry/memory-monitor.js.map +1 -0
- package/dist/src/telemetry/metrics.d.ts +533 -0
- package/dist/src/telemetry/metrics.js +852 -0
- package/dist/src/telemetry/metrics.js.map +1 -0
- package/dist/src/telemetry/rate-limiter.d.ts +48 -0
- package/dist/src/telemetry/rate-limiter.js +100 -0
- package/dist/src/telemetry/rate-limiter.js.map +1 -0
- package/dist/src/telemetry/sanitize.d.ts +25 -0
- package/dist/src/telemetry/sanitize.js +48 -0
- package/dist/src/telemetry/sanitize.js.map +1 -0
- package/dist/src/telemetry/sdk.d.ts +16 -0
- package/dist/src/telemetry/sdk.js +307 -0
- package/dist/src/telemetry/sdk.js.map +1 -0
- package/dist/src/telemetry/semantic.d.ts +82 -0
- package/dist/src/telemetry/semantic.js +357 -0
- package/dist/src/telemetry/semantic.js.map +1 -0
- package/dist/src/telemetry/startupProfiler.d.ts +51 -0
- package/dist/src/telemetry/startupProfiler.js +170 -0
- package/dist/src/telemetry/startupProfiler.js.map +1 -0
- package/dist/src/telemetry/telemetry-utils.d.ts +6 -0
- package/dist/src/telemetry/telemetry-utils.js +14 -0
- package/dist/src/telemetry/telemetry-utils.js.map +1 -0
- package/dist/src/telemetry/telemetryAttributes.d.ts +8 -0
- package/dist/src/telemetry/telemetryAttributes.js +19 -0
- package/dist/src/telemetry/telemetryAttributes.js.map +1 -0
- package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
- package/dist/src/telemetry/tool-call-decision.js +29 -0
- package/dist/src/telemetry/tool-call-decision.js.map +1 -0
- package/dist/src/telemetry/trace.d.ts +46 -0
- package/dist/src/telemetry/trace.js +121 -0
- package/dist/src/telemetry/trace.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +566 -0
- package/dist/src/telemetry/types.js +1495 -0
- package/dist/src/telemetry/types.js.map +1 -0
- package/dist/src/telemetry/uiTelemetry.d.ts +76 -0
- package/dist/src/telemetry/uiTelemetry.js +154 -0
- package/dist/src/telemetry/uiTelemetry.js.map +1 -0
- package/dist/src/test-utils/config.d.ts +17 -0
- package/dist/src/test-utils/config.js +32 -0
- package/dist/src/test-utils/config.js.map +1 -0
- package/dist/src/test-utils/index.d.ts +6 -0
- package/dist/src/test-utils/index.js +7 -0
- package/dist/src/test-utils/index.js.map +1 -0
- package/dist/src/test-utils/mock-message-bus.d.ts +43 -0
- package/dist/src/test-utils/mock-message-bus.js +96 -0
- package/dist/src/test-utils/mock-message-bus.js.map +1 -0
- package/dist/src/test-utils/mock-tool.d.ts +69 -0
- package/dist/src/test-utils/mock-tool.js +123 -0
- package/dist/src/test-utils/mock-tool.js.map +1 -0
- package/dist/src/test-utils/mockWorkspaceContext.d.ts +13 -0
- package/dist/src/test-utils/mockWorkspaceContext.js +24 -0
- package/dist/src/test-utils/mockWorkspaceContext.js.map +1 -0
- package/dist/src/tools/activate-skill.d.ts +27 -0
- package/dist/src/tools/activate-skill.js +133 -0
- package/dist/src/tools/activate-skill.js.map +1 -0
- package/dist/src/tools/ask-user.d.ts +23 -0
- package/dist/src/tools/ask-user.js +155 -0
- package/dist/src/tools/ask-user.js.map +1 -0
- package/dist/src/tools/constants.d.ts +7 -0
- package/dist/src/tools/constants.js +8 -0
- package/dist/src/tools/constants.js.map +1 -0
- package/dist/src/tools/diffOptions.d.ts +9 -0
- package/dist/src/tools/diffOptions.js +50 -0
- package/dist/src/tools/diffOptions.js.map +1 -0
- package/dist/src/tools/edit.d.ts +79 -0
- package/dist/src/tools/edit.js +750 -0
- package/dist/src/tools/edit.js.map +1 -0
- package/dist/src/tools/get-internal-docs.d.ts +27 -0
- package/dist/src/tools/get-internal-docs.js +122 -0
- package/dist/src/tools/get-internal-docs.js.map +1 -0
- package/dist/src/tools/glob.d.ts +57 -0
- package/dist/src/tools/glob.js +240 -0
- package/dist/src/tools/glob.js.map +1 -0
- package/dist/src/tools/grep.d.ts +41 -0
- package/dist/src/tools/grep.js +505 -0
- package/dist/src/tools/grep.js.map +1 -0
- package/dist/src/tools/ls.d.ts +69 -0
- package/dist/src/tools/ls.js +214 -0
- package/dist/src/tools/ls.js.map +1 -0
- package/dist/src/tools/mcp-client-manager.d.ts +93 -0
- package/dist/src/tools/mcp-client-manager.js +338 -0
- package/dist/src/tools/mcp-client-manager.js.map +1 -0
- package/dist/src/tools/mcp-client.d.ts +243 -0
- package/dist/src/tools/mcp-client.js +1351 -0
- package/dist/src/tools/mcp-client.js.map +1 -0
- package/dist/src/tools/mcp-tool.d.ts +49 -0
- package/dist/src/tools/mcp-tool.js +300 -0
- package/dist/src/tools/mcp-tool.js.map +1 -0
- package/dist/src/tools/memoryTool.d.ts +42 -0
- package/dist/src/tools/memoryTool.js +269 -0
- package/dist/src/tools/memoryTool.js.map +1 -0
- package/dist/src/tools/modifiable-tool.d.ts +36 -0
- package/dist/src/tools/modifiable-tool.js +110 -0
- package/dist/src/tools/modifiable-tool.js.map +1 -0
- package/dist/src/tools/read-file.d.ts +37 -0
- package/dist/src/tools/read-file.js +141 -0
- package/dist/src/tools/read-file.js.map +1 -0
- package/dist/src/tools/read-many-files.d.ts +54 -0
- package/dist/src/tools/read-many-files.js +364 -0
- package/dist/src/tools/read-many-files.js.map +1 -0
- package/dist/src/tools/ripGrep.d.ts +74 -0
- package/dist/src/tools/ripGrep.js +422 -0
- package/dist/src/tools/ripGrep.js.map +1 -0
- package/dist/src/tools/shell.d.ts +33 -0
- package/dist/src/tools/shell.js +436 -0
- package/dist/src/tools/shell.js.map +1 -0
- package/dist/src/tools/tool-error.d.ts +70 -0
- package/dist/src/tools/tool-error.js +92 -0
- package/dist/src/tools/tool-error.js.map +1 -0
- package/dist/src/tools/tool-names.d.ts +41 -0
- package/dist/src/tools/tool-names.js +94 -0
- package/dist/src/tools/tool-names.js.map +1 -0
- package/dist/src/tools/tool-registry.d.ts +103 -0
- package/dist/src/tools/tool-registry.js +429 -0
- package/dist/src/tools/tool-registry.js.map +1 -0
- package/dist/src/tools/tools.d.ts +347 -0
- package/dist/src/tools/tools.js +405 -0
- package/dist/src/tools/tools.js.map +1 -0
- package/dist/src/tools/web-fetch.d.ts +35 -0
- package/dist/src/tools/web-fetch.js +299 -0
- package/dist/src/tools/web-fetch.js.map +1 -0
- package/dist/src/tools/web-search.d.ts +50 -0
- package/dist/src/tools/web-search.js +141 -0
- package/dist/src/tools/web-search.js.map +1 -0
- package/dist/src/tools/write-file.d.ts +53 -0
- package/dist/src/tools/write-file.js +341 -0
- package/dist/src/tools/write-file.js.map +1 -0
- package/dist/src/tools/write-todos.d.ts +50 -0
- package/dist/src/tools/write-todos.js +194 -0
- package/dist/src/tools/write-todos.js.map +1 -0
- package/dist/src/utils/apiConversionUtils.d.ts +12 -0
- package/dist/src/utils/apiConversionUtils.js +46 -0
- package/dist/src/utils/apiConversionUtils.js.map +1 -0
- package/dist/src/utils/bfsFileSearch.d.ts +32 -0
- package/dist/src/utils/bfsFileSearch.js +136 -0
- package/dist/src/utils/bfsFileSearch.js.map +1 -0
- package/dist/src/utils/browser.d.ts +13 -0
- package/dist/src/utils/browser.js +50 -0
- package/dist/src/utils/browser.js.map +1 -0
- package/dist/src/utils/channel.d.ts +19 -0
- package/dist/src/utils/channel.js +49 -0
- package/dist/src/utils/channel.js.map +1 -0
- package/dist/src/utils/checkpointUtils.d.ts +82 -0
- package/dist/src/utils/checkpointUtils.js +117 -0
- package/dist/src/utils/checkpointUtils.js.map +1 -0
- package/dist/src/utils/constants.d.ts +7 -0
- package/dist/src/utils/constants.js +8 -0
- package/dist/src/utils/constants.js.map +1 -0
- package/dist/src/utils/customHeaderUtils.d.ts +9 -0
- package/dist/src/utils/customHeaderUtils.js +34 -0
- package/dist/src/utils/customHeaderUtils.js.map +1 -0
- package/dist/src/utils/debugLogger.d.ts +28 -0
- package/dist/src/utils/debugLogger.js +61 -0
- package/dist/src/utils/debugLogger.js.map +1 -0
- package/dist/src/utils/delay.d.ts +16 -0
- package/dist/src/utils/delay.js +43 -0
- package/dist/src/utils/delay.js.map +1 -0
- package/dist/src/utils/editCorrector.d.ts +54 -0
- package/dist/src/utils/editCorrector.js +596 -0
- package/dist/src/utils/editCorrector.js.map +1 -0
- package/dist/src/utils/editor.d.ts +39 -0
- package/dist/src/utils/editor.js +219 -0
- package/dist/src/utils/editor.js.map +1 -0
- package/dist/src/utils/environmentContext.d.ts +23 -0
- package/dist/src/utils/environmentContext.js +81 -0
- package/dist/src/utils/environmentContext.js.map +1 -0
- package/dist/src/utils/errorParsing.d.ts +8 -0
- package/dist/src/utils/errorParsing.js +65 -0
- package/dist/src/utils/errorParsing.js.map +1 -0
- package/dist/src/utils/errorReporting.d.ts +14 -0
- package/dist/src/utils/errorReporting.js +89 -0
- package/dist/src/utils/errorReporting.js.map +1 -0
- package/dist/src/utils/errors.d.ts +53 -0
- package/dist/src/utils/errors.js +145 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/events.d.ts +211 -0
- package/dist/src/utils/events.js +134 -0
- package/dist/src/utils/events.js.map +1 -0
- package/dist/src/utils/exitCodes.d.ts +12 -0
- package/dist/src/utils/exitCodes.js +13 -0
- package/dist/src/utils/exitCodes.js.map +1 -0
- package/dist/src/utils/extensionLoader.d.ts +86 -0
- package/dist/src/utils/extensionLoader.js +208 -0
- package/dist/src/utils/extensionLoader.js.map +1 -0
- package/dist/src/utils/fetch.d.ts +12 -0
- package/dist/src/utils/fetch.js +55 -0
- package/dist/src/utils/fetch.js.map +1 -0
- package/dist/src/utils/fileDiffUtils.d.ts +18 -0
- package/dist/src/utils/fileDiffUtils.js +37 -0
- package/dist/src/utils/fileDiffUtils.js.map +1 -0
- package/dist/src/utils/fileUtils.d.ts +86 -0
- package/dist/src/utils/fileUtils.js +495 -0
- package/dist/src/utils/fileUtils.js.map +1 -0
- package/dist/src/utils/filesearch/crawlCache.d.ts +25 -0
- package/dist/src/utils/filesearch/crawlCache.js +57 -0
- package/dist/src/utils/filesearch/crawlCache.js.map +1 -0
- package/dist/src/utils/filesearch/crawler.d.ts +16 -0
- package/dist/src/utils/filesearch/crawler.js +67 -0
- package/dist/src/utils/filesearch/crawler.js.map +1 -0
- package/dist/src/utils/filesearch/fileSearch.d.ts +39 -0
- package/dist/src/utils/filesearch/fileSearch.js +192 -0
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -0
- package/dist/src/utils/filesearch/ignore.d.ts +37 -0
- package/dist/src/utils/filesearch/ignore.js +99 -0
- package/dist/src/utils/filesearch/ignore.js.map +1 -0
- package/dist/src/utils/filesearch/result-cache.d.ts +33 -0
- package/dist/src/utils/filesearch/result-cache.js +59 -0
- package/dist/src/utils/filesearch/result-cache.js.map +1 -0
- package/dist/src/utils/formatters.d.ts +7 -0
- package/dist/src/utils/formatters.js +17 -0
- package/dist/src/utils/formatters.js.map +1 -0
- package/dist/src/utils/generateContentResponseUtilities.d.ts +15 -0
- package/dist/src/utils/generateContentResponseUtilities.js +186 -0
- package/dist/src/utils/generateContentResponseUtilities.js.map +1 -0
- package/dist/src/utils/getFolderStructure.d.ts +31 -0
- package/dist/src/utils/getFolderStructure.js +243 -0
- package/dist/src/utils/getFolderStructure.js.map +1 -0
- package/dist/src/utils/getPty.d.ts +19 -0
- package/dist/src/utils/getPty.js +23 -0
- package/dist/src/utils/getPty.js.map +1 -0
- package/dist/src/utils/gitIgnoreParser.d.ts +19 -0
- package/dist/src/utils/gitIgnoreParser.js +169 -0
- package/dist/src/utils/gitIgnoreParser.js.map +1 -0
- package/dist/src/utils/gitUtils.d.ts +17 -0
- package/dist/src/utils/gitUtils.js +61 -0
- package/dist/src/utils/gitUtils.js.map +1 -0
- package/dist/src/utils/googleErrors.d.ts +104 -0
- package/dist/src/utils/googleErrors.js +165 -0
- package/dist/src/utils/googleErrors.js.map +1 -0
- package/dist/src/utils/googleQuotaErrors.d.ts +51 -0
- package/dist/src/utils/googleQuotaErrors.js +250 -0
- package/dist/src/utils/googleQuotaErrors.js.map +1 -0
- package/dist/src/utils/httpErrors.d.ts +18 -0
- package/dist/src/utils/httpErrors.js +36 -0
- package/dist/src/utils/httpErrors.js.map +1 -0
- package/dist/src/utils/ignoreFileParser.d.ts +30 -0
- package/dist/src/utils/ignoreFileParser.js +100 -0
- package/dist/src/utils/ignoreFileParser.js.map +1 -0
- package/dist/src/utils/ignorePatterns.d.ts +103 -0
- package/dist/src/utils/ignorePatterns.js +220 -0
- package/dist/src/utils/ignorePatterns.js.map +1 -0
- package/dist/src/utils/installationManager.d.ts +16 -0
- package/dist/src/utils/installationManager.js +51 -0
- package/dist/src/utils/installationManager.js.map +1 -0
- package/dist/src/utils/language-detection.d.ts +6 -0
- package/dist/src/utils/language-detection.js +101 -0
- package/dist/src/utils/language-detection.js.map +1 -0
- package/dist/src/utils/llm-edit-fixer.d.ts +26 -0
- package/dist/src/utils/llm-edit-fixer.js +152 -0
- package/dist/src/utils/llm-edit-fixer.js.map +1 -0
- package/dist/src/utils/memoryDiscovery.d.ts +40 -0
- package/dist/src/utils/memoryDiscovery.js +421 -0
- package/dist/src/utils/memoryDiscovery.js.map +1 -0
- package/dist/src/utils/memoryImportProcessor.d.ts +42 -0
- package/dist/src/utils/memoryImportProcessor.js +273 -0
- package/dist/src/utils/memoryImportProcessor.js.map +1 -0
- package/dist/src/utils/messageInspectors.d.ts +8 -0
- package/dist/src/utils/messageInspectors.js +16 -0
- package/dist/src/utils/messageInspectors.js.map +1 -0
- package/dist/src/utils/nextSpeakerChecker.d.ts +12 -0
- package/dist/src/utils/nextSpeakerChecker.js +97 -0
- package/dist/src/utils/nextSpeakerChecker.js.map +1 -0
- package/dist/src/utils/package.d.ts +26 -0
- package/dist/src/utils/package.js +35 -0
- package/dist/src/utils/package.js.map +1 -0
- package/dist/src/utils/partUtils.d.ts +35 -0
- package/dist/src/utils/partUtils.js +133 -0
- package/dist/src/utils/partUtils.js.map +1 -0
- package/dist/src/utils/pathCorrector.d.ts +25 -0
- package/dist/src/utils/pathCorrector.js +43 -0
- package/dist/src/utils/pathCorrector.js.map +1 -0
- package/dist/src/utils/pathReader.d.ts +17 -0
- package/dist/src/utils/pathReader.js +92 -0
- package/dist/src/utils/pathReader.js.map +1 -0
- package/dist/src/utils/paths.d.ts +78 -0
- package/dist/src/utils/paths.js +311 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/utils/process-utils.d.ts +32 -0
- package/dist/src/utils/process-utils.js +88 -0
- package/dist/src/utils/process-utils.js.map +1 -0
- package/dist/src/utils/promptIdContext.d.ts +13 -0
- package/dist/src/utils/promptIdContext.js +23 -0
- package/dist/src/utils/promptIdContext.js.map +1 -0
- package/dist/src/utils/quotaErrorDetection.d.ts +16 -0
- package/dist/src/utils/quotaErrorDetection.js +19 -0
- package/dist/src/utils/quotaErrorDetection.js.map +1 -0
- package/dist/src/utils/retry.d.ts +39 -0
- package/dist/src/utils/retry.js +267 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/safeJsonStringify.d.ts +13 -0
- package/dist/src/utils/safeJsonStringify.js +49 -0
- package/dist/src/utils/safeJsonStringify.js.map +1 -0
- package/dist/src/utils/schemaValidator.d.ts +21 -0
- package/dist/src/utils/schemaValidator.js +59 -0
- package/dist/src/utils/schemaValidator.js.map +1 -0
- package/dist/src/utils/secure-browser-launcher.d.ts +23 -0
- package/dist/src/utils/secure-browser-launcher.js +165 -0
- package/dist/src/utils/secure-browser-launcher.js.map +1 -0
- package/dist/src/utils/security.d.ts +16 -0
- package/dist/src/utils/security.js +88 -0
- package/dist/src/utils/security.js.map +1 -0
- package/dist/src/utils/session.d.ts +6 -0
- package/dist/src/utils/session.js +8 -0
- package/dist/src/utils/session.js.map +1 -0
- package/dist/src/utils/shell-utils.d.ts +118 -0
- package/dist/src/utils/shell-utils.js +708 -0
- package/dist/src/utils/shell-utils.js.map +1 -0
- package/dist/src/utils/stdio.d.ts +32 -0
- package/dist/src/utils/stdio.js +85 -0
- package/dist/src/utils/stdio.js.map +1 -0
- package/dist/src/utils/summarizer.d.ts +27 -0
- package/dist/src/utils/summarizer.js +50 -0
- package/dist/src/utils/summarizer.js.map +1 -0
- package/dist/src/utils/systemEncoding.d.ts +40 -0
- package/dist/src/utils/systemEncoding.js +150 -0
- package/dist/src/utils/systemEncoding.js.map +1 -0
- package/dist/src/utils/terminal.d.ts +22 -0
- package/dist/src/utils/terminal.js +62 -0
- package/dist/src/utils/terminal.js.map +1 -0
- package/dist/src/utils/terminalSerializer.d.ts +25 -0
- package/dist/src/utils/terminalSerializer.js +444 -0
- package/dist/src/utils/terminalSerializer.js.map +1 -0
- package/dist/src/utils/testUtils.d.ts +29 -0
- package/dist/src/utils/testUtils.js +70 -0
- package/dist/src/utils/testUtils.js.map +1 -0
- package/dist/src/utils/textUtils.d.ts +32 -0
- package/dist/src/utils/textUtils.js +65 -0
- package/dist/src/utils/textUtils.js.map +1 -0
- package/dist/src/utils/thoughtUtils.d.ts +21 -0
- package/dist/src/utils/thoughtUtils.js +39 -0
- package/dist/src/utils/thoughtUtils.js.map +1 -0
- package/dist/src/utils/tokenCalculation.d.ts +19 -0
- package/dist/src/utils/tokenCalculation.js +150 -0
- package/dist/src/utils/tokenCalculation.js.map +1 -0
- package/dist/src/utils/tool-utils.d.ts +28 -0
- package/dist/src/utils/tool-utils.js +96 -0
- package/dist/src/utils/tool-utils.js.map +1 -0
- package/dist/src/utils/toolCallContext.d.ts +35 -0
- package/dist/src/utils/toolCallContext.js +29 -0
- package/dist/src/utils/toolCallContext.js.map +1 -0
- package/dist/src/utils/userAccountManager.d.ts +20 -0
- package/dist/src/utils/userAccountManager.js +115 -0
- package/dist/src/utils/userAccountManager.js.map +1 -0
- package/dist/src/utils/version.d.ts +6 -0
- package/dist/src/utils/version.js +15 -0
- package/dist/src/utils/version.js.map +1 -0
- package/dist/src/utils/workspaceContext.d.ts +82 -0
- package/dist/src/utils/workspaceContext.js +192 -0
- package/dist/src/utils/workspaceContext.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +97 -0
|
@@ -0,0 +1,729 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import * as http from 'node:http';
|
|
7
|
+
import * as crypto from 'node:crypto';
|
|
8
|
+
import { URL } from 'node:url';
|
|
9
|
+
import { openBrowserSecurely } from '../utils/secure-browser-launcher.js';
|
|
10
|
+
import { MCPOAuthTokenStorage } from './oauth-token-storage.js';
|
|
11
|
+
import { getErrorMessage } from '../utils/errors.js';
|
|
12
|
+
import { OAuthUtils, ResourceMismatchError } from './oauth-utils.js';
|
|
13
|
+
import { coreEvents } from '../utils/events.js';
|
|
14
|
+
import { debugLogger } from '../utils/debugLogger.js';
|
|
15
|
+
export const OAUTH_DISPLAY_MESSAGE_EVENT = 'oauth-display-message';
|
|
16
|
+
const REDIRECT_PATH = '/oauth/callback';
|
|
17
|
+
const HTTP_OK = 200;
|
|
18
|
+
/**
|
|
19
|
+
* Provider for handling OAuth authentication for MCP servers.
|
|
20
|
+
*/
|
|
21
|
+
export class MCPOAuthProvider {
|
|
22
|
+
tokenStorage;
|
|
23
|
+
constructor(tokenStorage = new MCPOAuthTokenStorage()) {
|
|
24
|
+
this.tokenStorage = tokenStorage;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Register a client dynamically with the OAuth server.
|
|
28
|
+
*
|
|
29
|
+
* @param registrationUrl The client registration endpoint URL
|
|
30
|
+
* @param config OAuth configuration
|
|
31
|
+
* @param redirectPort The port to use for the redirect URI
|
|
32
|
+
* @returns The registered client information
|
|
33
|
+
*/
|
|
34
|
+
async registerClient(registrationUrl, config, redirectPort) {
|
|
35
|
+
const redirectUri = config.redirectUri || `http://localhost:${redirectPort}${REDIRECT_PATH}`;
|
|
36
|
+
const registrationRequest = {
|
|
37
|
+
client_name: 'Gemini CLI MCP Client',
|
|
38
|
+
redirect_uris: [redirectUri],
|
|
39
|
+
grant_types: ['authorization_code', 'refresh_token'],
|
|
40
|
+
response_types: ['code'],
|
|
41
|
+
token_endpoint_auth_method: 'none', // Public client
|
|
42
|
+
scope: config.scopes?.join(' ') || '',
|
|
43
|
+
};
|
|
44
|
+
const response = await fetch(registrationUrl, {
|
|
45
|
+
method: 'POST',
|
|
46
|
+
headers: {
|
|
47
|
+
'Content-Type': 'application/json',
|
|
48
|
+
},
|
|
49
|
+
body: JSON.stringify(registrationRequest),
|
|
50
|
+
});
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
const errorText = await response.text();
|
|
53
|
+
throw new Error(`Client registration failed: ${response.status} ${response.statusText} - ${errorText}`);
|
|
54
|
+
}
|
|
55
|
+
return (await response.json());
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Discover OAuth configuration from an MCP server URL.
|
|
59
|
+
*
|
|
60
|
+
* @param mcpServerUrl The MCP server URL
|
|
61
|
+
* @returns OAuth configuration if discovered, null otherwise
|
|
62
|
+
*/
|
|
63
|
+
async discoverOAuthFromMCPServer(mcpServerUrl) {
|
|
64
|
+
// Use the full URL with path preserved for OAuth discovery
|
|
65
|
+
return OAuthUtils.discoverOAuthConfig(mcpServerUrl);
|
|
66
|
+
}
|
|
67
|
+
async discoverAuthServerMetadataForRegistration(authorizationUrl) {
|
|
68
|
+
const authUrl = new URL(authorizationUrl);
|
|
69
|
+
// Preserve path components for issuers with path-based discovery (e.g., Keycloak)
|
|
70
|
+
// Extract issuer by removing the OIDC protocol-specific path suffix
|
|
71
|
+
// For example: http://localhost:8888/realms/my-realm/protocol/openid-connect/auth
|
|
72
|
+
// -> http://localhost:8888/realms/my-realm
|
|
73
|
+
const oidcPatterns = [
|
|
74
|
+
'/protocol/openid-connect/auth',
|
|
75
|
+
'/protocol/openid-connect/authorize',
|
|
76
|
+
'/oauth2/authorize',
|
|
77
|
+
'/oauth/authorize',
|
|
78
|
+
'/authorize',
|
|
79
|
+
];
|
|
80
|
+
let pathname = authUrl.pathname.replace(/\/$/, ''); // Trim trailing slash
|
|
81
|
+
for (const pattern of oidcPatterns) {
|
|
82
|
+
if (pathname.endsWith(pattern)) {
|
|
83
|
+
pathname = pathname.slice(0, -pattern.length);
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const issuerCandidates = new Set();
|
|
88
|
+
issuerCandidates.add(authUrl.origin);
|
|
89
|
+
if (pathname) {
|
|
90
|
+
issuerCandidates.add(`${authUrl.origin}${pathname}`);
|
|
91
|
+
const versionSegmentPattern = /^v\d+(\.\d+)?$/i;
|
|
92
|
+
const segments = pathname.split('/').filter(Boolean);
|
|
93
|
+
const lastSegment = segments.at(-1);
|
|
94
|
+
if (lastSegment && versionSegmentPattern.test(lastSegment)) {
|
|
95
|
+
const withoutVersionPath = segments.slice(0, -1);
|
|
96
|
+
if (withoutVersionPath.length) {
|
|
97
|
+
issuerCandidates.add(`${authUrl.origin}/${withoutVersionPath.join('/')}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const attemptedIssuers = Array.from(issuerCandidates);
|
|
102
|
+
let selectedIssuer = attemptedIssuers[0];
|
|
103
|
+
let discoveredMetadata = null;
|
|
104
|
+
for (const issuer of attemptedIssuers) {
|
|
105
|
+
debugLogger.debug(` Trying issuer URL: ${issuer}`);
|
|
106
|
+
const metadata = await OAuthUtils.discoverAuthorizationServerMetadata(issuer);
|
|
107
|
+
if (metadata) {
|
|
108
|
+
selectedIssuer = issuer;
|
|
109
|
+
discoveredMetadata = metadata;
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (!discoveredMetadata) {
|
|
114
|
+
throw new Error(`Failed to fetch authorization server metadata for client registration (attempted issuers: ${attemptedIssuers.join(', ')})`);
|
|
115
|
+
}
|
|
116
|
+
debugLogger.debug(` Selected issuer URL: ${selectedIssuer}`);
|
|
117
|
+
return {
|
|
118
|
+
issuerUrl: selectedIssuer,
|
|
119
|
+
metadata: discoveredMetadata,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Generate PKCE parameters for OAuth flow.
|
|
124
|
+
*
|
|
125
|
+
* @returns PKCE parameters including code verifier, challenge, and state
|
|
126
|
+
*/
|
|
127
|
+
generatePKCEParams() {
|
|
128
|
+
// Generate code verifier (43-128 characters)
|
|
129
|
+
// using 64 bytes results in ~86 characters, safely above the minimum of 43
|
|
130
|
+
const codeVerifier = crypto.randomBytes(64).toString('base64url');
|
|
131
|
+
// Generate code challenge using SHA256
|
|
132
|
+
const codeChallenge = crypto
|
|
133
|
+
.createHash('sha256')
|
|
134
|
+
.update(codeVerifier)
|
|
135
|
+
.digest('base64url');
|
|
136
|
+
// Generate state for CSRF protection
|
|
137
|
+
const state = crypto.randomBytes(16).toString('base64url');
|
|
138
|
+
return { codeVerifier, codeChallenge, state };
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Start a local HTTP server to handle OAuth callback.
|
|
142
|
+
* The server will listen on the specified port (or port 0 for OS assignment).
|
|
143
|
+
*
|
|
144
|
+
* @param expectedState The state parameter to validate
|
|
145
|
+
* @returns Object containing the port (available immediately) and a promise for the auth response
|
|
146
|
+
*/
|
|
147
|
+
startCallbackServer(expectedState, port) {
|
|
148
|
+
let portResolve;
|
|
149
|
+
let portReject;
|
|
150
|
+
const portPromise = new Promise((resolve, reject) => {
|
|
151
|
+
portResolve = resolve;
|
|
152
|
+
portReject = reject;
|
|
153
|
+
});
|
|
154
|
+
const responsePromise = new Promise((resolve, reject) => {
|
|
155
|
+
let serverPort;
|
|
156
|
+
const server = http.createServer(async (req, res) => {
|
|
157
|
+
try {
|
|
158
|
+
const url = new URL(req.url, `http://localhost:${serverPort}`);
|
|
159
|
+
if (url.pathname !== REDIRECT_PATH) {
|
|
160
|
+
res.writeHead(404);
|
|
161
|
+
res.end('Not found');
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const code = url.searchParams.get('code');
|
|
165
|
+
const state = url.searchParams.get('state');
|
|
166
|
+
const error = url.searchParams.get('error');
|
|
167
|
+
if (error) {
|
|
168
|
+
res.writeHead(HTTP_OK, { 'Content-Type': 'text/html' });
|
|
169
|
+
res.end(`
|
|
170
|
+
<html>
|
|
171
|
+
<body>
|
|
172
|
+
<h1>Authentication Failed</h1>
|
|
173
|
+
<p>Error: ${error.replace(/</g, '<').replace(/>/g, '>')}</p>
|
|
174
|
+
<p>${(url.searchParams.get('error_description') || '').replace(/</g, '<').replace(/>/g, '>')}</p>
|
|
175
|
+
<p>You can close this window.</p>
|
|
176
|
+
</body>
|
|
177
|
+
</html>
|
|
178
|
+
`);
|
|
179
|
+
server.close();
|
|
180
|
+
reject(new Error(`OAuth error: ${error}`));
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (!code || !state) {
|
|
184
|
+
res.writeHead(400);
|
|
185
|
+
res.end('Missing code or state parameter');
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (state !== expectedState) {
|
|
189
|
+
res.writeHead(400);
|
|
190
|
+
res.end('Invalid state parameter');
|
|
191
|
+
server.close();
|
|
192
|
+
reject(new Error('State mismatch - possible CSRF attack'));
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// Send success response to browser
|
|
196
|
+
res.writeHead(HTTP_OK, { 'Content-Type': 'text/html' });
|
|
197
|
+
res.end(`
|
|
198
|
+
<html>
|
|
199
|
+
<body>
|
|
200
|
+
<h1>Authentication Successful!</h1>
|
|
201
|
+
<p>You can close this window and return to Gemini CLI.</p>
|
|
202
|
+
<script>window.close();</script>
|
|
203
|
+
</body>
|
|
204
|
+
</html>
|
|
205
|
+
`);
|
|
206
|
+
server.close();
|
|
207
|
+
resolve({ code, state });
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
server.close();
|
|
211
|
+
reject(error);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
server.on('error', (error) => {
|
|
215
|
+
portReject(error);
|
|
216
|
+
reject(error);
|
|
217
|
+
});
|
|
218
|
+
// Determine which port to use (env var, argument, or OS-assigned)
|
|
219
|
+
let listenPort = 0; // Default to OS-assigned port
|
|
220
|
+
const portStr = process.env['OAUTH_CALLBACK_PORT'];
|
|
221
|
+
if (portStr) {
|
|
222
|
+
const envPort = parseInt(portStr, 10);
|
|
223
|
+
if (isNaN(envPort) || envPort <= 0 || envPort > 65535) {
|
|
224
|
+
const error = new Error(`Invalid value for OAUTH_CALLBACK_PORT: "${portStr}"`);
|
|
225
|
+
portReject(error);
|
|
226
|
+
reject(error);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
listenPort = envPort;
|
|
230
|
+
}
|
|
231
|
+
else if (port !== undefined) {
|
|
232
|
+
listenPort = port;
|
|
233
|
+
}
|
|
234
|
+
server.listen(listenPort, () => {
|
|
235
|
+
const address = server.address();
|
|
236
|
+
serverPort = address.port;
|
|
237
|
+
debugLogger.log(`OAuth callback server listening on port ${serverPort}`);
|
|
238
|
+
portResolve(serverPort); // Resolve port promise immediately
|
|
239
|
+
});
|
|
240
|
+
// Timeout after 5 minutes
|
|
241
|
+
setTimeout(() => {
|
|
242
|
+
server.close();
|
|
243
|
+
reject(new Error('OAuth callback timeout'));
|
|
244
|
+
}, 5 * 60 * 1000);
|
|
245
|
+
});
|
|
246
|
+
return { port: portPromise, response: responsePromise };
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Extract the port number from a URL string if available and valid.
|
|
250
|
+
*
|
|
251
|
+
* @param urlString The URL string to parse
|
|
252
|
+
* @returns The port number or undefined if not found or invalid
|
|
253
|
+
*/
|
|
254
|
+
getPortFromUrl(urlString) {
|
|
255
|
+
if (!urlString) {
|
|
256
|
+
return undefined;
|
|
257
|
+
}
|
|
258
|
+
try {
|
|
259
|
+
const url = new URL(urlString);
|
|
260
|
+
if (url.port) {
|
|
261
|
+
const parsedPort = parseInt(url.port, 10);
|
|
262
|
+
if (!isNaN(parsedPort) && parsedPort > 0 && parsedPort <= 65535) {
|
|
263
|
+
return parsedPort;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// Ignore invalid URL
|
|
269
|
+
}
|
|
270
|
+
return undefined;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Build the authorization URL for the OAuth flow.
|
|
274
|
+
|
|
275
|
+
*
|
|
276
|
+
* @param config OAuth configuration
|
|
277
|
+
* @param pkceParams PKCE parameters
|
|
278
|
+
* @param redirectPort The port to use for the redirect URI
|
|
279
|
+
* @param mcpServerUrl The MCP server URL to use as the resource parameter
|
|
280
|
+
* @returns The authorization URL
|
|
281
|
+
*/
|
|
282
|
+
buildAuthorizationUrl(config, pkceParams, redirectPort, mcpServerUrl) {
|
|
283
|
+
const redirectUri = config.redirectUri || `http://localhost:${redirectPort}${REDIRECT_PATH}`;
|
|
284
|
+
const params = new URLSearchParams({
|
|
285
|
+
client_id: config.clientId,
|
|
286
|
+
response_type: 'code',
|
|
287
|
+
redirect_uri: redirectUri,
|
|
288
|
+
state: pkceParams.state,
|
|
289
|
+
code_challenge: pkceParams.codeChallenge,
|
|
290
|
+
code_challenge_method: 'S256',
|
|
291
|
+
});
|
|
292
|
+
if (config.scopes && config.scopes.length > 0) {
|
|
293
|
+
params.append('scope', config.scopes.join(' '));
|
|
294
|
+
}
|
|
295
|
+
if (config.audiences && config.audiences.length > 0) {
|
|
296
|
+
params.append('audience', config.audiences.join(' '));
|
|
297
|
+
}
|
|
298
|
+
// Add resource parameter for MCP OAuth spec compliance
|
|
299
|
+
// Only add if we have an MCP server URL (indicates MCP OAuth flow, not standard OAuth)
|
|
300
|
+
if (mcpServerUrl) {
|
|
301
|
+
try {
|
|
302
|
+
params.append('resource', OAuthUtils.buildResourceParameter(mcpServerUrl));
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
debugLogger.warn(`Could not add resource parameter: ${getErrorMessage(error)}`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
const url = new URL(config.authorizationUrl);
|
|
309
|
+
params.forEach((value, key) => {
|
|
310
|
+
url.searchParams.append(key, value);
|
|
311
|
+
});
|
|
312
|
+
return url.toString();
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Exchange authorization code for tokens.
|
|
316
|
+
*
|
|
317
|
+
* @param config OAuth configuration
|
|
318
|
+
* @param code Authorization code
|
|
319
|
+
* @param codeVerifier PKCE code verifier
|
|
320
|
+
* @param redirectPort The port to use for the redirect URI
|
|
321
|
+
* @param mcpServerUrl The MCP server URL to use as the resource parameter
|
|
322
|
+
* @returns The token response
|
|
323
|
+
*/
|
|
324
|
+
async exchangeCodeForToken(config, code, codeVerifier, redirectPort, mcpServerUrl) {
|
|
325
|
+
const redirectUri = config.redirectUri || `http://localhost:${redirectPort}${REDIRECT_PATH}`;
|
|
326
|
+
const params = new URLSearchParams({
|
|
327
|
+
grant_type: 'authorization_code',
|
|
328
|
+
code,
|
|
329
|
+
redirect_uri: redirectUri,
|
|
330
|
+
code_verifier: codeVerifier,
|
|
331
|
+
client_id: config.clientId,
|
|
332
|
+
});
|
|
333
|
+
if (config.clientSecret) {
|
|
334
|
+
params.append('client_secret', config.clientSecret);
|
|
335
|
+
}
|
|
336
|
+
if (config.audiences && config.audiences.length > 0) {
|
|
337
|
+
params.append('audience', config.audiences.join(' '));
|
|
338
|
+
}
|
|
339
|
+
// Add resource parameter for MCP OAuth spec compliance
|
|
340
|
+
// Only add if we have an MCP server URL (indicates MCP OAuth flow, not standard OAuth)
|
|
341
|
+
if (mcpServerUrl) {
|
|
342
|
+
const resourceUrl = mcpServerUrl;
|
|
343
|
+
try {
|
|
344
|
+
params.append('resource', OAuthUtils.buildResourceParameter(resourceUrl));
|
|
345
|
+
}
|
|
346
|
+
catch (error) {
|
|
347
|
+
debugLogger.warn(`Could not add resource parameter: ${getErrorMessage(error)}`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
const response = await fetch(config.tokenUrl, {
|
|
351
|
+
method: 'POST',
|
|
352
|
+
headers: {
|
|
353
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
354
|
+
Accept: 'application/json, application/x-www-form-urlencoded',
|
|
355
|
+
},
|
|
356
|
+
body: params.toString(),
|
|
357
|
+
});
|
|
358
|
+
const responseText = await response.text();
|
|
359
|
+
const contentType = response.headers.get('content-type') || '';
|
|
360
|
+
if (!response.ok) {
|
|
361
|
+
// Try to parse error from form-urlencoded response
|
|
362
|
+
let errorMessage = null;
|
|
363
|
+
try {
|
|
364
|
+
const errorParams = new URLSearchParams(responseText);
|
|
365
|
+
const error = errorParams.get('error');
|
|
366
|
+
const errorDescription = errorParams.get('error_description');
|
|
367
|
+
if (error) {
|
|
368
|
+
errorMessage = `Token exchange failed: ${error} - ${errorDescription || 'No description'}`;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
// Fall back to raw error
|
|
373
|
+
}
|
|
374
|
+
throw new Error(errorMessage ||
|
|
375
|
+
`Token exchange failed: ${response.status} - ${responseText}`);
|
|
376
|
+
}
|
|
377
|
+
// Log unexpected content types for debugging
|
|
378
|
+
if (!contentType.includes('application/json') &&
|
|
379
|
+
!contentType.includes('application/x-www-form-urlencoded')) {
|
|
380
|
+
debugLogger.warn(`Token endpoint returned unexpected content-type: ${contentType}. ` +
|
|
381
|
+
`Expected application/json or application/x-www-form-urlencoded. ` +
|
|
382
|
+
`Will attempt to parse response.`);
|
|
383
|
+
}
|
|
384
|
+
// Try to parse as JSON first, fall back to form-urlencoded
|
|
385
|
+
try {
|
|
386
|
+
return JSON.parse(responseText);
|
|
387
|
+
}
|
|
388
|
+
catch {
|
|
389
|
+
// Parse form-urlencoded response
|
|
390
|
+
const tokenParams = new URLSearchParams(responseText);
|
|
391
|
+
const accessToken = tokenParams.get('access_token');
|
|
392
|
+
const tokenType = tokenParams.get('token_type') || 'Bearer';
|
|
393
|
+
const expiresIn = tokenParams.get('expires_in');
|
|
394
|
+
const refreshToken = tokenParams.get('refresh_token');
|
|
395
|
+
const scope = tokenParams.get('scope');
|
|
396
|
+
if (!accessToken) {
|
|
397
|
+
// Check for error in response
|
|
398
|
+
const error = tokenParams.get('error');
|
|
399
|
+
const errorDescription = tokenParams.get('error_description');
|
|
400
|
+
throw new Error(`Token exchange failed: ${error || 'no_access_token'} - ${errorDescription || responseText}`);
|
|
401
|
+
}
|
|
402
|
+
return {
|
|
403
|
+
access_token: accessToken,
|
|
404
|
+
token_type: tokenType,
|
|
405
|
+
expires_in: expiresIn ? parseInt(expiresIn, 10) : undefined,
|
|
406
|
+
refresh_token: refreshToken || undefined,
|
|
407
|
+
scope: scope || undefined,
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Refresh an access token using a refresh token.
|
|
413
|
+
*
|
|
414
|
+
* @param config OAuth configuration
|
|
415
|
+
* @param refreshToken The refresh token
|
|
416
|
+
* @param tokenUrl The token endpoint URL
|
|
417
|
+
* @param mcpServerUrl The MCP server URL to use as the resource parameter
|
|
418
|
+
* @returns The new token response
|
|
419
|
+
*/
|
|
420
|
+
async refreshAccessToken(config, refreshToken, tokenUrl, mcpServerUrl) {
|
|
421
|
+
const params = new URLSearchParams({
|
|
422
|
+
grant_type: 'refresh_token',
|
|
423
|
+
refresh_token: refreshToken,
|
|
424
|
+
client_id: config.clientId,
|
|
425
|
+
});
|
|
426
|
+
if (config.clientSecret) {
|
|
427
|
+
params.append('client_secret', config.clientSecret);
|
|
428
|
+
}
|
|
429
|
+
if (config.scopes && config.scopes.length > 0) {
|
|
430
|
+
params.append('scope', config.scopes.join(' '));
|
|
431
|
+
}
|
|
432
|
+
if (config.audiences && config.audiences.length > 0) {
|
|
433
|
+
params.append('audience', config.audiences.join(' '));
|
|
434
|
+
}
|
|
435
|
+
// Add resource parameter for MCP OAuth spec compliance
|
|
436
|
+
// Only add if we have an MCP server URL (indicates MCP OAuth flow, not standard OAuth)
|
|
437
|
+
if (mcpServerUrl) {
|
|
438
|
+
try {
|
|
439
|
+
params.append('resource', OAuthUtils.buildResourceParameter(mcpServerUrl));
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
debugLogger.warn(`Could not add resource parameter: ${getErrorMessage(error)}`);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
const response = await fetch(tokenUrl, {
|
|
446
|
+
method: 'POST',
|
|
447
|
+
headers: {
|
|
448
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
449
|
+
Accept: 'application/json, application/x-www-form-urlencoded',
|
|
450
|
+
},
|
|
451
|
+
body: params.toString(),
|
|
452
|
+
});
|
|
453
|
+
const responseText = await response.text();
|
|
454
|
+
const contentType = response.headers.get('content-type') || '';
|
|
455
|
+
if (!response.ok) {
|
|
456
|
+
// Try to parse error from form-urlencoded response
|
|
457
|
+
let errorMessage = null;
|
|
458
|
+
try {
|
|
459
|
+
const errorParams = new URLSearchParams(responseText);
|
|
460
|
+
const error = errorParams.get('error');
|
|
461
|
+
const errorDescription = errorParams.get('error_description');
|
|
462
|
+
if (error) {
|
|
463
|
+
errorMessage = `Token refresh failed: ${error} - ${errorDescription || 'No description'}`;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
catch {
|
|
467
|
+
// Fall back to raw error
|
|
468
|
+
}
|
|
469
|
+
throw new Error(errorMessage ||
|
|
470
|
+
`Token refresh failed: ${response.status} - ${responseText}`);
|
|
471
|
+
}
|
|
472
|
+
// Log unexpected content types for debugging
|
|
473
|
+
if (!contentType.includes('application/json') &&
|
|
474
|
+
!contentType.includes('application/x-www-form-urlencoded')) {
|
|
475
|
+
debugLogger.warn(`Token refresh endpoint returned unexpected content-type: ${contentType}. ` +
|
|
476
|
+
`Expected application/json or application/x-www-form-urlencoded. ` +
|
|
477
|
+
`Will attempt to parse response.`);
|
|
478
|
+
}
|
|
479
|
+
// Try to parse as JSON first, fall back to form-urlencoded
|
|
480
|
+
try {
|
|
481
|
+
return JSON.parse(responseText);
|
|
482
|
+
}
|
|
483
|
+
catch {
|
|
484
|
+
// Parse form-urlencoded response
|
|
485
|
+
const tokenParams = new URLSearchParams(responseText);
|
|
486
|
+
const accessToken = tokenParams.get('access_token');
|
|
487
|
+
const tokenType = tokenParams.get('token_type') || 'Bearer';
|
|
488
|
+
const expiresIn = tokenParams.get('expires_in');
|
|
489
|
+
const refreshToken = tokenParams.get('refresh_token');
|
|
490
|
+
const scope = tokenParams.get('scope');
|
|
491
|
+
if (!accessToken) {
|
|
492
|
+
// Check for error in response
|
|
493
|
+
const error = tokenParams.get('error');
|
|
494
|
+
const errorDescription = tokenParams.get('error_description');
|
|
495
|
+
throw new Error(`Token refresh failed: ${error || 'unknown_error'} - ${errorDescription || responseText}`);
|
|
496
|
+
}
|
|
497
|
+
return {
|
|
498
|
+
access_token: accessToken,
|
|
499
|
+
token_type: tokenType,
|
|
500
|
+
expires_in: expiresIn ? parseInt(expiresIn, 10) : undefined,
|
|
501
|
+
refresh_token: refreshToken || undefined,
|
|
502
|
+
scope: scope || undefined,
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Perform the full OAuth authorization code flow with PKCE.
|
|
508
|
+
*
|
|
509
|
+
* @param serverName The name of the MCP server
|
|
510
|
+
* @param config OAuth configuration
|
|
511
|
+
* @param mcpServerUrl Optional MCP server URL for OAuth discovery
|
|
512
|
+
* @param messageHandler Optional handler for displaying user-facing messages
|
|
513
|
+
* @returns The obtained OAuth token
|
|
514
|
+
*/
|
|
515
|
+
async authenticate(serverName, config, mcpServerUrl) {
|
|
516
|
+
// Helper function to display messages through handler or fallback to console.log
|
|
517
|
+
const displayMessage = (message) => {
|
|
518
|
+
coreEvents.emitFeedback('info', message);
|
|
519
|
+
};
|
|
520
|
+
// If no authorization URL is provided, try to discover OAuth configuration
|
|
521
|
+
if (!config.authorizationUrl && mcpServerUrl) {
|
|
522
|
+
debugLogger.debug(`Starting OAuth for MCP server "${serverName}"…
|
|
523
|
+
✓ No authorization URL; using OAuth discovery`);
|
|
524
|
+
// First check if the server requires authentication via WWW-Authenticate header
|
|
525
|
+
try {
|
|
526
|
+
const headers = OAuthUtils.isSSEEndpoint(mcpServerUrl)
|
|
527
|
+
? { Accept: 'text/event-stream' }
|
|
528
|
+
: { Accept: 'application/json' };
|
|
529
|
+
const response = await fetch(mcpServerUrl, {
|
|
530
|
+
method: 'HEAD',
|
|
531
|
+
headers,
|
|
532
|
+
});
|
|
533
|
+
if (response.status === 401 || response.status === 307) {
|
|
534
|
+
const wwwAuthenticate = response.headers.get('www-authenticate');
|
|
535
|
+
if (wwwAuthenticate) {
|
|
536
|
+
const discoveredConfig = await OAuthUtils.discoverOAuthFromWWWAuthenticate(wwwAuthenticate, mcpServerUrl);
|
|
537
|
+
if (discoveredConfig) {
|
|
538
|
+
// Merge discovered config with existing config, preserving clientId and clientSecret
|
|
539
|
+
config = {
|
|
540
|
+
...config,
|
|
541
|
+
authorizationUrl: discoveredConfig.authorizationUrl,
|
|
542
|
+
tokenUrl: discoveredConfig.tokenUrl,
|
|
543
|
+
scopes: config.scopes || discoveredConfig.scopes || [],
|
|
544
|
+
// Preserve existing client credentials
|
|
545
|
+
clientId: config.clientId,
|
|
546
|
+
clientSecret: config.clientSecret,
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
catch (error) {
|
|
553
|
+
// Re-throw security validation errors
|
|
554
|
+
if (error instanceof ResourceMismatchError) {
|
|
555
|
+
throw error;
|
|
556
|
+
}
|
|
557
|
+
debugLogger.debug(`Failed to check endpoint for authentication requirements: ${getErrorMessage(error)}`);
|
|
558
|
+
}
|
|
559
|
+
// If we still don't have OAuth config, try the standard discovery
|
|
560
|
+
if (!config.authorizationUrl) {
|
|
561
|
+
const discoveredConfig = await this.discoverOAuthFromMCPServer(mcpServerUrl);
|
|
562
|
+
if (discoveredConfig) {
|
|
563
|
+
// Merge discovered config with existing config, preserving clientId and clientSecret
|
|
564
|
+
config = {
|
|
565
|
+
...config,
|
|
566
|
+
authorizationUrl: discoveredConfig.authorizationUrl,
|
|
567
|
+
tokenUrl: discoveredConfig.tokenUrl,
|
|
568
|
+
scopes: config.scopes || discoveredConfig.scopes || [],
|
|
569
|
+
registrationUrl: discoveredConfig.registrationUrl,
|
|
570
|
+
// Preserve existing client credentials
|
|
571
|
+
clientId: config.clientId,
|
|
572
|
+
clientSecret: config.clientSecret,
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
else {
|
|
576
|
+
throw new Error('Failed to discover OAuth configuration from MCP server');
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
// Generate PKCE parameters
|
|
581
|
+
const pkceParams = this.generatePKCEParams();
|
|
582
|
+
// Determine preferred port from redirectUri if available
|
|
583
|
+
const preferredPort = this.getPortFromUrl(config.redirectUri);
|
|
584
|
+
// Start callback server first to allocate port
|
|
585
|
+
// This ensures we only create one server and eliminates race conditions
|
|
586
|
+
const callbackServer = this.startCallbackServer(pkceParams.state, preferredPort);
|
|
587
|
+
// Wait for server to start and get the allocated port
|
|
588
|
+
// We need this port for client registration and auth URL building
|
|
589
|
+
const redirectPort = await callbackServer.port;
|
|
590
|
+
debugLogger.debug(`Callback server listening on port ${redirectPort}`);
|
|
591
|
+
// If no client ID is provided, try dynamic client registration
|
|
592
|
+
if (!config.clientId) {
|
|
593
|
+
let registrationUrl = config.registrationUrl;
|
|
594
|
+
// If no registration URL was previously discovered, try to discover it
|
|
595
|
+
if (!registrationUrl) {
|
|
596
|
+
// Extract server URL from authorization URL
|
|
597
|
+
if (!config.authorizationUrl) {
|
|
598
|
+
throw new Error('Cannot perform dynamic registration without authorization URL');
|
|
599
|
+
}
|
|
600
|
+
debugLogger.debug('→ Attempting dynamic client registration...');
|
|
601
|
+
const { metadata: authServerMetadata } = await this.discoverAuthServerMetadataForRegistration(config.authorizationUrl);
|
|
602
|
+
registrationUrl = authServerMetadata.registration_endpoint;
|
|
603
|
+
}
|
|
604
|
+
// Register client if registration endpoint is available
|
|
605
|
+
if (registrationUrl) {
|
|
606
|
+
const clientRegistration = await this.registerClient(registrationUrl, config, redirectPort);
|
|
607
|
+
config.clientId = clientRegistration.client_id;
|
|
608
|
+
if (clientRegistration.client_secret) {
|
|
609
|
+
config.clientSecret = clientRegistration.client_secret;
|
|
610
|
+
}
|
|
611
|
+
debugLogger.debug('✓ Dynamic client registration successful');
|
|
612
|
+
}
|
|
613
|
+
else {
|
|
614
|
+
throw new Error('No client ID provided and dynamic registration not supported');
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
// Validate configuration
|
|
618
|
+
if (!config.clientId || !config.authorizationUrl || !config.tokenUrl) {
|
|
619
|
+
throw new Error('Missing required OAuth configuration after discovery and registration');
|
|
620
|
+
}
|
|
621
|
+
// Build authorization URL
|
|
622
|
+
const authUrl = this.buildAuthorizationUrl(config, pkceParams, redirectPort, mcpServerUrl);
|
|
623
|
+
displayMessage(`Authentication required for MCP Server: '${serverName}'
|
|
624
|
+
→ Opening your browser for OAuth sign-in...
|
|
625
|
+
|
|
626
|
+
If the browser does not open, copy and paste this URL into your browser:
|
|
627
|
+
${authUrl}
|
|
628
|
+
|
|
629
|
+
💡 TIP: Triple-click to select the entire URL, then copy and paste it into your browser.
|
|
630
|
+
⚠️ Make sure to copy the COMPLETE URL - it may wrap across multiple lines.`);
|
|
631
|
+
// Open browser securely (callback server is already running)
|
|
632
|
+
try {
|
|
633
|
+
await openBrowserSecurely(authUrl);
|
|
634
|
+
}
|
|
635
|
+
catch (error) {
|
|
636
|
+
debugLogger.warn('Failed to open browser automatically:', getErrorMessage(error));
|
|
637
|
+
}
|
|
638
|
+
// Wait for callback
|
|
639
|
+
const { code } = await callbackServer.response;
|
|
640
|
+
debugLogger.debug('✓ Authorization code received, exchanging for tokens...');
|
|
641
|
+
// Exchange code for tokens
|
|
642
|
+
const tokenResponse = await this.exchangeCodeForToken(config, code, pkceParams.codeVerifier, redirectPort, mcpServerUrl);
|
|
643
|
+
// Convert to our token format
|
|
644
|
+
if (!tokenResponse.access_token) {
|
|
645
|
+
throw new Error('No access token received from token endpoint');
|
|
646
|
+
}
|
|
647
|
+
const token = {
|
|
648
|
+
accessToken: tokenResponse.access_token,
|
|
649
|
+
tokenType: tokenResponse.token_type || 'Bearer',
|
|
650
|
+
refreshToken: tokenResponse.refresh_token,
|
|
651
|
+
scope: tokenResponse.scope,
|
|
652
|
+
};
|
|
653
|
+
if (tokenResponse.expires_in) {
|
|
654
|
+
token.expiresAt = Date.now() + tokenResponse.expires_in * 1000;
|
|
655
|
+
}
|
|
656
|
+
// Save token
|
|
657
|
+
try {
|
|
658
|
+
await this.tokenStorage.saveToken(serverName, token, config.clientId, config.tokenUrl, mcpServerUrl);
|
|
659
|
+
debugLogger.debug('✓ Authentication successful! Token saved.');
|
|
660
|
+
// Verify token was saved
|
|
661
|
+
const savedToken = await this.tokenStorage.getCredentials(serverName);
|
|
662
|
+
if (savedToken && savedToken.token && savedToken.token.accessToken) {
|
|
663
|
+
// Avoid leaking token material; log a short SHA-256 fingerprint instead.
|
|
664
|
+
const tokenFingerprint = crypto
|
|
665
|
+
.createHash('sha256')
|
|
666
|
+
.update(savedToken.token.accessToken)
|
|
667
|
+
.digest('hex')
|
|
668
|
+
.slice(0, 8);
|
|
669
|
+
debugLogger.debug(`✓ Token verification successful (fingerprint: ${tokenFingerprint})`);
|
|
670
|
+
}
|
|
671
|
+
else {
|
|
672
|
+
debugLogger.warn('Token verification failed: token not found or invalid after save');
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
catch (saveError) {
|
|
676
|
+
debugLogger.error('Failed to save auth token.', saveError);
|
|
677
|
+
throw saveError;
|
|
678
|
+
}
|
|
679
|
+
return token;
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* Get a valid access token for an MCP server, refreshing if necessary.
|
|
683
|
+
*
|
|
684
|
+
* @param serverName The name of the MCP server
|
|
685
|
+
* @param config OAuth configuration
|
|
686
|
+
* @returns A valid access token or null if not authenticated
|
|
687
|
+
*/
|
|
688
|
+
async getValidToken(serverName, config) {
|
|
689
|
+
debugLogger.debug(`Getting valid token for server: ${serverName}`);
|
|
690
|
+
const credentials = await this.tokenStorage.getCredentials(serverName);
|
|
691
|
+
if (!credentials) {
|
|
692
|
+
debugLogger.debug(`No credentials found for server: ${serverName}`);
|
|
693
|
+
return null;
|
|
694
|
+
}
|
|
695
|
+
const { token } = credentials;
|
|
696
|
+
debugLogger.debug(`Found token for server: ${serverName}, expired: ${this.tokenStorage.isTokenExpired(token)}`);
|
|
697
|
+
// Check if token is expired
|
|
698
|
+
if (!this.tokenStorage.isTokenExpired(token)) {
|
|
699
|
+
debugLogger.debug(`Returning valid token for server: ${serverName}`);
|
|
700
|
+
return token.accessToken;
|
|
701
|
+
}
|
|
702
|
+
// Try to refresh if we have a refresh token
|
|
703
|
+
if (token.refreshToken && config.clientId && credentials.tokenUrl) {
|
|
704
|
+
try {
|
|
705
|
+
debugLogger.log(`Refreshing expired token for MCP server: ${serverName}`);
|
|
706
|
+
const newTokenResponse = await this.refreshAccessToken(config, token.refreshToken, credentials.tokenUrl, credentials.mcpServerUrl);
|
|
707
|
+
// Update stored token
|
|
708
|
+
const newToken = {
|
|
709
|
+
accessToken: newTokenResponse.access_token,
|
|
710
|
+
tokenType: newTokenResponse.token_type,
|
|
711
|
+
refreshToken: newTokenResponse.refresh_token || token.refreshToken,
|
|
712
|
+
scope: newTokenResponse.scope || token.scope,
|
|
713
|
+
};
|
|
714
|
+
if (newTokenResponse.expires_in) {
|
|
715
|
+
newToken.expiresAt = Date.now() + newTokenResponse.expires_in * 1000;
|
|
716
|
+
}
|
|
717
|
+
await this.tokenStorage.saveToken(serverName, newToken, config.clientId, credentials.tokenUrl, credentials.mcpServerUrl);
|
|
718
|
+
return newToken.accessToken;
|
|
719
|
+
}
|
|
720
|
+
catch (error) {
|
|
721
|
+
coreEvents.emitFeedback('error', 'Failed to refresh auth token.', error);
|
|
722
|
+
// Remove invalid token
|
|
723
|
+
await this.tokenStorage.deleteCredentials(serverName);
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
return null;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
//# sourceMappingURL=oauth-provider.js.map
|