@gajae-code/coding-agent 0.13.2 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +215 -8
- package/README.md +2 -0
- package/bin/gajaessi.js +4 -0
- package/dist/types/async/job-manager.d.ts +55 -2
- package/dist/types/async/support.d.ts +14 -0
- package/dist/types/capability/mcp.d.ts +6 -0
- package/dist/types/capability/types.d.ts +6 -0
- package/dist/types/cli/accounts-cli.d.ts +19 -0
- package/dist/types/cli/args.d.ts +3 -0
- package/dist/types/cli/config-cli.d.ts +6 -0
- package/dist/types/cli/crash-cli.d.ts +10 -0
- package/dist/types/cli/customize-doctor.d.ts +145 -0
- package/dist/types/cli/daemon-cli.d.ts +3 -1
- package/dist/types/cli/mcp-cli.d.ts +11 -0
- package/dist/types/cli/notify-cli.d.ts +1 -1
- package/dist/types/cli/root-flags.d.ts +12 -0
- package/dist/types/cli/setup-cli.d.ts +3 -1
- package/dist/types/cli/skills-cli.d.ts +2 -1
- package/dist/types/cli/update-cli.d.ts +19 -1
- package/dist/types/cli.d.ts +6 -0
- package/dist/types/commands/accounts.d.ts +40 -0
- package/dist/types/commands/crash.d.ts +24 -0
- package/dist/types/commands/customize.d.ts +22 -0
- package/dist/types/commands/daemon.d.ts +1 -1
- package/dist/types/commands/launch.d.ts +6 -0
- package/dist/types/commands/setup.d.ts +6 -0
- package/dist/types/commands/skills.d.ts +6 -1
- package/dist/types/commands/update.d.ts +7 -0
- package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
- package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
- package/dist/types/config/config-schema-version.d.ts +10 -0
- package/dist/types/config/file-lock.d.ts +18 -0
- package/dist/types/config/model-profile-activation.d.ts +3 -1
- package/dist/types/config/model-registry.d.ts +10 -1
- package/dist/types/config/models-config-schema.d.ts +2 -0
- package/dist/types/config/settings-schema.d.ts +73 -9
- package/dist/types/config/settings.d.ts +63 -0
- package/dist/types/config/skill-settings-defaults.d.ts +26 -0
- package/dist/types/config/task-delegation.d.ts +39 -0
- package/dist/types/config/update-channel.d.ts +10 -0
- package/dist/types/coordinator-mcp/server.d.ts +5 -1
- package/dist/types/crash/index-store.d.ts +87 -0
- package/dist/types/crash/nudge.d.ts +50 -0
- package/dist/types/crash/record-loader.d.ts +17 -0
- package/dist/types/crash/report.d.ts +134 -0
- package/dist/types/crash/sanitize.d.ts +25 -0
- package/dist/types/cursor.d.ts +13 -2
- package/dist/types/customization/import.d.ts +37 -0
- package/dist/types/customization/index.d.ts +4 -0
- package/dist/types/customization/inventory.d.ts +25 -0
- package/dist/types/customization/mutations.d.ts +32 -0
- package/dist/types/customization/types.d.ts +115 -0
- package/dist/types/daemon/control-types.d.ts +8 -1
- package/dist/types/daemon/operator-contract.d.ts +4 -4
- package/dist/types/discovery/claude.d.ts +39 -1
- package/dist/types/discovery/codex.d.ts +39 -1
- package/dist/types/discovery/index.d.ts +2 -0
- package/dist/types/discovery/mcp-compat.d.ts +30 -0
- package/dist/types/edit/renderer.d.ts +23 -0
- package/dist/types/extensibility/extensions/runner.d.ts +3 -0
- package/dist/types/extensibility/extensions/types.d.ts +21 -4
- package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
- package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
- package/dist/types/extensibility/hooks/loader.d.ts +19 -5
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
- package/dist/types/extensibility/skill-management.d.ts +107 -0
- package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
- package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
- package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
- package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
- package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
- package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
- package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
- package/dist/types/hooks/events.d.ts +60 -0
- package/dist/types/hooks/normalize.d.ts +83 -0
- package/dist/types/hooks/skill-state.d.ts +9 -2
- package/dist/types/main.d.ts +2 -1
- package/dist/types/modes/acp/abort-scope.d.ts +13 -0
- package/dist/types/modes/acp/acp-agent.d.ts +7 -4
- package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
- package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
- package/dist/types/modes/components/customization/index.d.ts +1 -0
- package/dist/types/modes/components/dynamic-theme-text.d.ts +9 -0
- package/dist/types/modes/components/gajae-pet-widget.d.ts +6 -28
- package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
- package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
- package/dist/types/modes/components/oauth-selector.d.ts +10 -4
- package/dist/types/modes/components/pet-capability.d.ts +7 -21
- package/dist/types/modes/components/settings-selector.d.ts +5 -0
- package/dist/types/modes/components/status-line/gh.d.ts +6 -2
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
- package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
- package/dist/types/modes/interactive-mode.d.ts +1 -0
- package/dist/types/modes/theme/defaults/index.d.ts +118 -0
- package/dist/types/modes/types.d.ts +1 -0
- package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
- package/dist/types/runtime-mcp/config.d.ts +9 -0
- package/dist/types/runtime-mcp/manager.d.ts +26 -1
- package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
- package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
- package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
- package/dist/types/runtime-mcp/protocol.d.ts +278 -0
- package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
- package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
- package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
- package/dist/types/runtime-mcp/types.d.ts +102 -10
- package/dist/types/sdk/acp/adapter.d.ts +26 -5
- package/dist/types/sdk/broker/broker.d.ts +3 -55
- package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
- package/dist/types/sdk/broker/session-index.d.ts +14 -5
- package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
- package/dist/types/sdk/bus/config.d.ts +11 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
- package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
- package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
- package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
- package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
- package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
- package/dist/types/sdk/bus/index.d.ts +85 -99
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
- package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
- package/dist/types/sdk/bus/notification-service.d.ts +52 -0
- package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
- package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
- package/dist/types/sdk/bus/session-control.d.ts +25 -1
- package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
- package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
- package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
- package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
- package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
- package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
- package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
- package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
- package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
- package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
- package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
- package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
- package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
- package/dist/types/sdk/cli/rows.d.ts +2 -11
- package/dist/types/sdk/cli/session-cli.d.ts +15 -25
- package/dist/types/sdk/client/client.d.ts +97 -1
- package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
- package/dist/types/sdk/host/control/index.d.ts +1 -1
- package/dist/types/sdk/host/control/operations.d.ts +18 -5
- package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
- package/dist/types/sdk/host/host.d.ts +15 -1
- package/dist/types/sdk/host/query/handlers.d.ts +5 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
- package/dist/types/sdk/host/session-runtime.d.ts +127 -7
- package/dist/types/sdk/host/types.d.ts +1 -1
- package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
- package/dist/types/sdk/index.d.ts +2 -1
- package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
- package/dist/types/sdk/lifecycle/client.d.ts +59 -0
- package/dist/types/sdk/lifecycle/index.d.ts +3 -0
- package/dist/types/sdk/lifecycle/service.d.ts +232 -0
- package/dist/types/sdk/mcp/server.d.ts +9 -6
- package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
- package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
- package/dist/types/sdk/prompt-status.d.ts +10 -3
- package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
- package/dist/types/sdk/receipt-state.d.ts +17 -0
- package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
- package/dist/types/sdk/router/index.d.ts +1 -0
- package/dist/types/sdk/router/session-router.d.ts +152 -0
- package/dist/types/sdk/session-list.d.ts +22 -0
- package/dist/types/sdk/session-reconnect.d.ts +43 -1
- package/dist/types/sdk/session.d.ts +34 -1
- package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
- package/dist/types/session/account-inventory.d.ts +86 -0
- package/dist/types/session/agent-session.d.ts +145 -6
- package/dist/types/session/agent-storage.d.ts +10 -0
- package/dist/types/session/coordinator-tool-label.d.ts +28 -0
- package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
- package/dist/types/session/messages.d.ts +1 -1
- package/dist/types/session/secure-token-file.d.ts +3 -0
- package/dist/types/session/session-manager.d.ts +47 -1
- package/dist/types/session/startup-auth-config.d.ts +44 -0
- package/dist/types/session/terminal-abort.d.ts +378 -0
- package/dist/types/session/yield-queue.d.ts +7 -0
- package/dist/types/session-import/claude.d.ts +26 -0
- package/dist/types/session-import/codex.d.ts +88 -0
- package/dist/types/session-import/command.d.ts +35 -0
- package/dist/types/session-import/detect.d.ts +22 -0
- package/dist/types/session-import/index.d.ts +7 -0
- package/dist/types/session-import/provider-codex.d.ts +22 -0
- package/dist/types/session-import/provider-service.d.ts +38 -0
- package/dist/types/session-import/redact.d.ts +23 -0
- package/dist/types/session-import/service.d.ts +47 -0
- package/dist/types/session-import/types.d.ts +120 -0
- package/dist/types/setup/paseo/check.d.ts +16 -0
- package/dist/types/setup/paseo/install-saga.d.ts +115 -0
- package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
- package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
- package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
- package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
- package/dist/types/setup/paseo/provider-config.d.ts +35 -0
- package/dist/types/setup/paseo/remove.d.ts +14 -0
- package/dist/types/setup/paseo/result-types.d.ts +59 -0
- package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
- package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
- package/dist/types/skill-state/active-state.d.ts +5 -1
- package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
- package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
- package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
- package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
- package/dist/types/slash-commands/types.d.ts +7 -1
- package/dist/types/task/executor.d.ts +10 -0
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/tools/ask-answer-registry.d.ts +6 -3
- package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
- package/dist/types/tools/bash.d.ts +2 -6
- package/dist/types/tools/browser/attach.d.ts +11 -0
- package/dist/types/tools/browser/launch.d.ts +20 -0
- package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
- package/dist/types/tools/browser/render.d.ts +1 -0
- package/dist/types/tools/browser.d.ts +3 -1
- package/dist/types/tools/image-gen.d.ts +10 -2
- package/dist/types/tools/index.d.ts +8 -0
- package/dist/types/tools/monitor.d.ts +1 -1
- package/dist/types/tools/skill-discovery.d.ts +8 -1
- package/dist/types/tools/subagent.d.ts +2 -0
- package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
- package/dist/types/utils/herdr-pane.d.ts +76 -0
- package/package.json +19 -9
- package/scripts/build-binary.ts +2 -1
- package/scripts/build-sdk-package-smoke.ts +2 -13
- package/scripts/capture-sticky-viewport-showcase.ts +0 -1
- package/scripts/compile-args.ts +2 -0
- package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
- package/scripts/generate-sdk-operation-inventory.ts +28 -0
- package/scripts/generate-telegram-baseline-manifest.ts +1 -0
- package/scripts/generate-tool-catalog.ts +6 -4
- package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
- package/src/async/job-manager.ts +352 -17
- package/src/async/support.ts +25 -0
- package/src/autoresearch/dashboard.ts +28 -13
- package/src/capability/index.ts +3 -1
- package/src/capability/mcp.ts +6 -0
- package/src/capability/types.ts +6 -0
- package/src/cli/accounts-cli.ts +395 -0
- package/src/cli/args.ts +23 -0
- package/src/cli/auth-broker-cli.ts +136 -66
- package/src/cli/auth-gateway-cli.ts +94 -70
- package/src/cli/config-cli.ts +27 -2
- package/src/cli/crash-cli.ts +78 -0
- package/src/cli/customize-doctor.ts +1605 -0
- package/src/cli/daemon-cli.ts +12 -3
- package/src/cli/fast-help.ts +1 -0
- package/src/cli/mcp-cli.ts +128 -60
- package/src/cli/notify-cli.ts +8 -14
- package/src/cli/root-flags.ts +8 -0
- package/src/cli/setup-cli.ts +145 -0
- package/src/cli/skills-cli.ts +38 -2
- package/src/cli/update-cli.ts +167 -12
- package/src/cli.ts +4 -0
- package/src/commands/accounts.ts +71 -0
- package/src/commands/crash.ts +35 -0
- package/src/commands/customize.ts +84 -0
- package/src/commands/daemon.ts +2 -2
- package/src/commands/deep-interview.ts +2 -0
- package/src/commands/launch.ts +1 -0
- package/src/commands/mcp.ts +12 -7
- package/src/commands/ralplan.ts +2 -0
- package/src/commands/sdk.ts +65 -32
- package/src/commands/setup.ts +5 -0
- package/src/commands/skills.ts +14 -4
- package/src/commands/ultragoal.ts +10 -1
- package/src/commands/update.ts +26 -15
- package/src/config/atomic-yaml-patch-worker.ts +57 -0
- package/src/config/atomic-yaml-patch.ts +769 -29
- package/src/config/config-schema-version.ts +10 -0
- package/src/config/file-lock.ts +70 -1
- package/src/config/mcp-schema.json +52 -14
- package/src/config/model-profile-activation.ts +23 -2
- package/src/config/model-profiles.ts +88 -21
- package/src/config/model-registry.ts +147 -21
- package/src/config/models-config-schema.ts +1 -1
- package/src/config/settings-schema.ts +77 -7
- package/src/config/settings.ts +4038 -199
- package/src/config/skill-settings-defaults.ts +41 -3
- package/src/config/task-delegation.ts +87 -0
- package/src/config/update-channel.ts +23 -0
- package/src/coordinator-mcp/server.ts +377 -308
- package/src/crash/index-store.ts +723 -0
- package/src/crash/nudge.ts +89 -0
- package/src/crash/record-loader.ts +149 -0
- package/src/crash/report.ts +551 -0
- package/src/crash/sanitize.ts +129 -0
- package/src/cursor.ts +36 -10
- package/src/customization/import.ts +946 -0
- package/src/customization/index.ts +4 -0
- package/src/customization/inventory.ts +335 -0
- package/src/customization/mutations.ts +141 -0
- package/src/customization/types.ts +223 -0
- package/src/daemon/control-types.ts +8 -1
- package/src/daemon/operator-contract.ts +6 -6
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +31 -6
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
- package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
- package/src/discovery/claude-hooks.ts +38 -0
- package/src/discovery/claude.ts +142 -209
- package/src/discovery/codex-hooks.ts +38 -0
- package/src/discovery/codex.ts +132 -198
- package/src/discovery/helpers.ts +8 -1
- package/src/discovery/index.ts +2 -0
- package/src/discovery/mcp-compat.ts +234 -0
- package/src/discovery/mcp-json.ts +6 -0
- package/src/edit/renderer.ts +40 -0
- package/src/edit/streaming.ts +4 -2
- package/src/exec/bash-executor.ts +24 -20
- package/src/export/html/index.ts +51 -2
- package/src/extensibility/extensions/loader.ts +9 -1
- package/src/extensibility/extensions/runner.ts +17 -4
- package/src/extensibility/extensions/types.ts +31 -6
- package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
- package/src/extensibility/gjc-plugins/installer.ts +9 -5
- package/src/extensibility/gjc-plugins/observability.ts +8 -2
- package/src/extensibility/gjc-plugins/registry.ts +13 -2
- package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
- package/src/extensibility/gjc-plugins/schema.ts +222 -39
- package/src/extensibility/hooks/loader.ts +154 -10
- package/src/extensibility/runtime-skill-discovery.ts +257 -60
- package/src/extensibility/skill-management.ts +368 -0
- package/src/extensibility/skills.ts +52 -16
- package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
- package/src/gjc-runtime/launch-worktree.ts +56 -2
- package/src/gjc-runtime/linux-proc.ts +7 -1
- package/src/gjc-runtime/ralplan-runtime.ts +100 -164
- package/src/gjc-runtime/session-state-lock.ts +992 -0
- package/src/gjc-runtime/session-state-sidecar.ts +644 -142
- package/src/gjc-runtime/state-writer.ts +39 -14
- package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
- package/src/gjc-runtime/ultragoal-guard.ts +11 -4
- package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
- package/src/gjc-runtime/workflow-settings.ts +596 -0
- package/src/goals/tools/goal-tool.ts +6 -1
- package/src/hooks/events.ts +291 -0
- package/src/hooks/native-skill-hook.ts +4 -0
- package/src/hooks/normalize.ts +369 -0
- package/src/hooks/skill-state.ts +165 -46
- package/src/internal-urls/docs-index.generated.ts +41 -32
- package/src/main.ts +36 -5
- package/src/migrate/mcp-mapper.ts +25 -2
- package/src/modes/acp/abort-scope.ts +29 -0
- package/src/modes/acp/acp-agent.ts +423 -98
- package/src/modes/components/assistant-message.ts +6 -1
- package/src/modes/components/chrome.ts +4 -3
- package/src/modes/components/customization/customization-dashboard.ts +443 -0
- package/src/modes/components/customization/import-wizard.ts +372 -0
- package/src/modes/components/customization/index.ts +1 -0
- package/src/modes/components/dynamic-theme-text.ts +22 -0
- package/src/modes/components/gajae-pet-widget.ts +607 -193
- package/src/modes/components/irc-sidebar.ts +11 -0
- package/src/modes/components/iterm-pet-transport.ts +585 -0
- package/src/modes/components/model-selector.ts +1 -6
- package/src/modes/components/oauth-selector.ts +277 -86
- package/src/modes/components/pet-capability.ts +35 -31
- package/src/modes/components/settings-selector.ts +29 -5
- package/src/modes/components/status-line/gh.ts +45 -1
- package/src/modes/components/status-line/segments.ts +19 -4
- package/src/modes/components/tool-status-header.ts +13 -3
- package/src/modes/controllers/command-controller.ts +20 -8
- package/src/modes/controllers/extension-ui-controller.ts +56 -257
- package/src/modes/controllers/input-controller.ts +10 -0
- package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
- package/src/modes/controllers/selector-controller.ts +238 -77
- package/src/modes/controllers/stt-controller.ts +3 -3
- package/src/modes/interactive-mode.ts +88 -16
- package/src/modes/print-mode.ts +35 -6
- package/src/modes/runtime-init.ts +21 -68
- package/src/modes/theme/defaults/index.ts +2 -0
- package/src/modes/theme/defaults/ouroboros.json +118 -0
- package/src/modes/types.ts +1 -0
- package/src/modes/utils/injected-user-submission.ts +25 -0
- package/src/modes/utils/terminal-bell.ts +15 -1
- package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
- package/src/prompts/agent-fragments/restricted-bash.md +1 -1
- package/src/prompts/agents/critic.md +1 -1
- package/src/prompts/system/rlm-research.md +1 -1
- package/src/prompts/system/system-prompt.md +0 -2
- package/src/prompts/tools/bash.md +7 -1
- package/src/prompts/tools/browser.md +1 -1
- package/src/prompts/tools/cron.md +6 -6
- package/src/prompts/tools/read.md +0 -2
- package/src/prompts/tools/skill-discovery.md +4 -2
- package/src/runtime-mcp/client.ts +427 -23
- package/src/runtime-mcp/config.ts +37 -5
- package/src/runtime-mcp/manager-pool.test.ts +56 -0
- package/src/runtime-mcp/manager.ts +52 -2
- package/src/runtime-mcp/oauth-discovery.ts +13 -0
- package/src/runtime-mcp/oauth-flow.ts +46 -1
- package/src/runtime-mcp/pool-key.ts +5 -1
- package/src/runtime-mcp/pool.test.ts +9 -0
- package/src/runtime-mcp/protocol.test.ts +353 -0
- package/src/runtime-mcp/protocol.ts +624 -0
- package/src/runtime-mcp/scope-config.ts +78 -0
- package/src/runtime-mcp/tool-bridge.ts +44 -10
- package/src/runtime-mcp/transports/http.ts +84 -13
- package/src/runtime-mcp/types.ts +123 -12
- package/src/sdk/acp/adapter.ts +328 -97
- package/src/sdk/broker/broker.ts +160 -741
- package/src/sdk/broker/ensure.ts +9 -1
- package/src/sdk/broker/lifecycle.ts +510 -116
- package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
- package/src/sdk/broker/process-incarnation.ts +19 -0
- package/src/sdk/broker/session-index.ts +516 -117
- package/src/sdk/broker/startup-failure.ts +28 -5
- package/src/sdk/broker/transport.ts +1 -13
- package/src/sdk/bus/chat-daemon-cli.ts +4 -2
- package/src/sdk/bus/chat-daemon-control.ts +67 -6
- package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
- package/src/sdk/bus/config.ts +13 -0
- package/src/sdk/bus/conversation-store.ts +59 -171
- package/src/sdk/bus/daemon-paths.ts +20 -0
- package/src/sdk/bus/discord-conversation.ts +2 -0
- package/src/sdk/bus/discord-daemon.ts +524 -126
- package/src/sdk/bus/discord-live-provider.ts +206 -79
- package/src/sdk/bus/existing-thread-readiness.ts +4 -97
- package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
- package/src/sdk/bus/index.ts +2480 -456
- package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
- package/src/sdk/bus/lifecycle-commands.ts +2 -2
- package/src/sdk/bus/managed-daemon.ts +2 -145
- package/src/sdk/bus/notification-service.ts +196 -0
- package/src/sdk/bus/operator-runtime.ts +1 -1
- package/src/sdk/bus/prompt-reconciliation.ts +24 -15
- package/src/sdk/bus/reconciliation-store.ts +553 -24
- package/src/sdk/bus/session-control.ts +49 -3
- package/src/sdk/bus/slack-conversation.ts +4 -0
- package/src/sdk/bus/slack-daemon.ts +733 -134
- package/src/sdk/bus/slack-live-provider.ts +65 -15
- package/src/sdk/bus/slack-provider.ts +4 -0
- package/src/sdk/bus/slack-thread-binding.ts +9 -104
- package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
- package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
- package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
- package/src/sdk/bus/telegram-daemon-control.ts +3 -13
- package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
- package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
- package/src/sdk/bus/telegram-daemon.ts +2552 -2280
- package/src/sdk/bus/telegram-reference.ts +1 -226
- package/src/sdk/bus/telegram-setup.ts +2 -2
- package/src/sdk/bus/threaded-render.ts +1 -0
- package/src/sdk/bus/topic-registry.ts +279 -146
- package/src/sdk/cli/rows.ts +2 -35
- package/src/sdk/cli/session-cli.ts +776 -700
- package/src/sdk/client/client.ts +892 -1
- package/src/sdk/host/control/dispatch.ts +93 -58
- package/src/sdk/host/control/index.ts +1 -1
- package/src/sdk/host/control/operations.ts +18 -10
- package/src/sdk/host/control/runtime-gate.ts +40 -0
- package/src/sdk/host/host.ts +63 -12
- package/src/sdk/host/query/handlers.ts +66 -7
- package/src/sdk/host/reverse-leases.ts +2 -2
- package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
- package/src/sdk/host/session-runtime.test.ts +2787 -34
- package/src/sdk/host/session-runtime.ts +1489 -101
- package/src/sdk/host/surface-policy.ts +12 -8
- package/src/sdk/host/types.ts +1 -1
- package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
- package/src/sdk/host/websocket-transport.ts +85 -50
- package/src/sdk/index.ts +2 -1
- package/src/sdk/lifecycle/broker-client.ts +53 -0
- package/src/sdk/lifecycle/client.ts +234 -0
- package/src/sdk/lifecycle/index.ts +3 -0
- package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
- package/src/sdk/lifecycle/service.ts +720 -0
- package/src/sdk/mcp/server.ts +226 -188
- package/src/sdk/prompt-deadline-lease.ts +55 -0
- package/src/sdk/prompt-deadline-manager.ts +148 -0
- package/src/sdk/prompt-status.ts +11 -3
- package/src/sdk/protocol/operation-inventory.generated.json +272 -129
- package/src/sdk/protocol/operation-registry.ts +71 -8
- package/src/sdk/receipt-state.ts +43 -0
- package/src/sdk/reconciliation-extensions.ts +14 -0
- package/src/sdk/router/index.ts +1 -0
- package/src/sdk/router/session-router.ts +1658 -0
- package/src/sdk/session-list.ts +93 -0
- package/src/sdk/session-reconnect.ts +45 -1
- package/src/sdk/session.ts +716 -120
- package/src/sdk/transport/serve-cli.ts +18 -34
- package/src/session/account-inventory.ts +603 -0
- package/src/session/agent-session.ts +2873 -559
- package/src/session/agent-storage.ts +35 -0
- package/src/session/blob-store.ts +32 -1
- package/src/session/coordinator-tool-label.ts +40 -0
- package/src/session/internal/managed-session-scope.ts +4 -0
- package/src/session/internal/managed-session-storage.ts +199 -31
- package/src/session/messages.ts +1 -1
- package/src/session/secure-token-file.ts +80 -0
- package/src/session/session-manager.ts +757 -57
- package/src/session/session-storage.ts +25 -16
- package/src/session/startup-auth-config.ts +297 -0
- package/src/session/terminal-abort.ts +1253 -0
- package/src/session/yield-queue.ts +57 -15
- package/src/session-import/claude.ts +334 -0
- package/src/session-import/codex.ts +1033 -0
- package/src/session-import/command.ts +77 -0
- package/src/session-import/detect.ts +133 -0
- package/src/session-import/index.ts +7 -0
- package/src/session-import/provider-codex.ts +327 -0
- package/src/session-import/provider-service.ts +457 -0
- package/src/session-import/redact.ts +128 -0
- package/src/session-import/service.ts +1264 -0
- package/src/session-import/types.ts +148 -0
- package/src/setup/paseo/check.ts +213 -0
- package/src/setup/paseo/install-saga.ts +293 -0
- package/src/setup/paseo/json-publisher.ts +263 -0
- package/src/setup/paseo/orchestration-preferences.ts +86 -0
- package/src/setup/paseo/paseo-ownership.ts +224 -0
- package/src/setup/paseo/paseo-setup.ts +253 -0
- package/src/setup/paseo/provider-config.ts +139 -0
- package/src/setup/paseo/remove.ts +183 -0
- package/src/setup/paseo/result-types.ts +79 -0
- package/src/setup/paseo/setup-deps.ts +175 -0
- package/src/setup/paseo/skills-bridge.ts +260 -0
- package/src/skill-state/active-state.ts +21 -11
- package/src/slash-commands/acp-builtins.ts +9 -1
- package/src/slash-commands/builtin-registry.ts +117 -19
- package/src/slash-commands/helpers/credential-switch.ts +143 -0
- package/src/slash-commands/helpers/mcp.ts +9 -3
- package/src/slash-commands/helpers/usage-report.ts +61 -56
- package/src/slash-commands/types.ts +7 -2
- package/src/task/executor.ts +30 -11
- package/src/task/index.ts +66 -7
- package/src/task/render.ts +23 -9
- package/src/tools/ask-answer-registry.ts +23 -7
- package/src/tools/ask.ts +8 -4
- package/src/tools/bash-sleep-advisory.ts +115 -0
- package/src/tools/bash.ts +98 -18
- package/src/tools/browser/attach.ts +71 -3
- package/src/tools/browser/launch.ts +86 -13
- package/src/tools/browser/profile-discovery.ts +57 -7
- package/src/tools/browser/render.ts +8 -1
- package/src/tools/browser.ts +130 -21
- package/src/tools/computer.enforcement.test.ts +1 -1
- package/src/tools/computer.ts +3 -2
- package/src/tools/cron.ts +12 -1
- package/src/tools/image-gen.ts +349 -142
- package/src/tools/index.ts +8 -0
- package/src/tools/job.ts +33 -6
- package/src/tools/monitor.ts +41 -2
- package/src/tools/skill-discovery.ts +21 -29
- package/src/tools/subagent.ts +142 -24
- package/src/tools/todo-contract.ts +55 -3
- package/src/tools/todo-write.ts +4 -3
- package/src/tools/tool-catalog.generated.ts +6 -6
- package/src/tools/ultragoal-ask-guard.ts +10 -3
- package/src/utils/herdr-pane.ts +345 -0
- package/src/utils/title-generator.ts +2 -0
- package/src/web/scrapers/index.ts +6 -4
- package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
- package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
- package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
- package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
- package/dist/types/runtime/lazy-service.test.d.ts +0 -1
- package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
- package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
- package/dist/types/runtime-mcp/config.test.d.ts +0 -1
- package/dist/types/runtime-mcp/http.test.d.ts +0 -1
- package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
- package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
- package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
- package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
- package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
- package/dist/types/sdk/elevation/audit.d.ts +0 -93
- package/dist/types/sdk/elevation/capability.d.ts +0 -3
- package/dist/types/sdk/elevation/digest.d.ts +0 -72
- package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
- package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
- package/dist/types/sdk/elevation/owner.d.ts +0 -48
- package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
- package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
- package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
- package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
- package/dist/types/session/auth-broker-config.d.ts +0 -13
- package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
- package/dist/types/skills/skills.test.d.ts +0 -1
- package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
- package/dist/types/task/token-log.test.d.ts +0 -1
- package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
- package/dist/types/tools/descriptors.test.d.ts +0 -1
- package/scripts/g005-daemon-smoke.ts +0 -180
- package/scripts/g011-daemon-path-smoke.ts +0 -153
- package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
- package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
- package/src/sdk/bus/telegram-cli.ts +0 -212
- package/src/sdk/elevation/allowlist.ts +0 -54
- package/src/sdk/elevation/audit.ts +0 -208
- package/src/sdk/elevation/capability.ts +0 -41
- package/src/sdk/elevation/digest.ts +0 -129
- package/src/sdk/elevation/dispatch-receipt.ts +0 -184
- package/src/sdk/elevation/grant-ledger.ts +0 -1142
- package/src/sdk/elevation/owner.ts +0 -109
- package/src/session/auth-broker-config.ts +0 -109
- /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
- /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
- /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
|
@@ -1,11 +1,33 @@
|
|
|
1
1
|
import { expect, test, vi } from "bun:test";
|
|
2
2
|
import { rm } from "node:fs/promises";
|
|
3
|
+
import { legacyMcpMethodNotFound } from "../../test/mcp-test-utils";
|
|
3
4
|
import * as configValue from "../config/resolve-config-value";
|
|
4
5
|
import { MCPManager } from "./manager";
|
|
5
6
|
import { MCPConnectionPool } from "./pool";
|
|
6
7
|
import { computeMCPPoolKey } from "./pool-key";
|
|
8
|
+
import type { MCPProtocolObservation } from "./protocol";
|
|
9
|
+
import { legacyEraObservation } from "./protocol";
|
|
7
10
|
import type { MCPRequestOptions, MCPServerConfig, MCPServerConnection, MCPTransport } from "./types";
|
|
8
11
|
|
|
12
|
+
/** Fake connections model pre-v2 stdio servers: legacy era, forced by transport. */
|
|
13
|
+
function fakeLegacyProtocol(capabilities: {
|
|
14
|
+
tools?: unknown;
|
|
15
|
+
resources?: unknown;
|
|
16
|
+
prompts?: unknown;
|
|
17
|
+
}): MCPProtocolObservation {
|
|
18
|
+
return legacyEraObservation({
|
|
19
|
+
preference: "auto",
|
|
20
|
+
effectiveVersion: "2025-03-26",
|
|
21
|
+
negotiation: "legacy-forced",
|
|
22
|
+
downgradeReason: "stdio-transport",
|
|
23
|
+
serverInfo: { name: "fake", version: "1" },
|
|
24
|
+
capabilities: {
|
|
25
|
+
tools: capabilities.tools !== undefined,
|
|
26
|
+
resources: capabilities.resources !== undefined,
|
|
27
|
+
prompts: capabilities.prompts !== undefined,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
9
31
|
class ManagerFakeTransport implements MCPTransport {
|
|
10
32
|
connected = true;
|
|
11
33
|
closeCount = 0;
|
|
@@ -136,6 +158,7 @@ test("withPreparedLease admission closes before disconnectAll snapshots scoped o
|
|
|
136
158
|
transport: new ManagerFakeTransport(),
|
|
137
159
|
serverInfo: { name: "fake", version: "1" },
|
|
138
160
|
capabilities: { tools: {} },
|
|
161
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
139
162
|
}) satisfies MCPServerConnection,
|
|
140
163
|
});
|
|
141
164
|
const manager = new MCPManager(".", null, { pool, sessionId: "admission-disconnect" });
|
|
@@ -157,6 +180,7 @@ test("withPreparedLease admission closes during reconnect before fresh entry exi
|
|
|
157
180
|
transport: new ManagerFakeTransport(),
|
|
158
181
|
serverInfo: { name: "fake", version: "1" },
|
|
159
182
|
capabilities: { tools: {} },
|
|
183
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
160
184
|
}) satisfies MCPServerConnection,
|
|
161
185
|
});
|
|
162
186
|
const manager = new MCPManager(".", null, { pool, sessionId: "admission-reconnect" });
|
|
@@ -182,6 +206,7 @@ test("manager connection lifecycle is owned by pool leases", async () => {
|
|
|
182
206
|
transport,
|
|
183
207
|
serverInfo: { name: "fake", version: "1" },
|
|
184
208
|
capabilities: { tools: {} },
|
|
209
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
185
210
|
} satisfies MCPServerConnection;
|
|
186
211
|
},
|
|
187
212
|
});
|
|
@@ -207,6 +232,7 @@ test("manager resolves one canonical stdio cwd for transport and pool identity",
|
|
|
207
232
|
transport: new ManagerFakeTransport(),
|
|
208
233
|
serverInfo: { name: "fake", version: "1" },
|
|
209
234
|
capabilities: { tools: {} },
|
|
235
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
210
236
|
} satisfies MCPServerConnection;
|
|
211
237
|
},
|
|
212
238
|
});
|
|
@@ -240,6 +266,7 @@ test("manager resource subscriptions flow through the lease aggregate", async ()
|
|
|
240
266
|
transport,
|
|
241
267
|
serverInfo: { name: "fake", version: "1" },
|
|
242
268
|
capabilities: { tools: {}, resources: { subscribe: true } },
|
|
269
|
+
protocol: fakeLegacyProtocol({ tools: {}, resources: { subscribe: true } }),
|
|
243
270
|
} satisfies MCPServerConnection;
|
|
244
271
|
},
|
|
245
272
|
});
|
|
@@ -285,6 +312,7 @@ test("disconnectAll cancels hanging config resolution before opening a lease", a
|
|
|
285
312
|
transport: new ManagerFakeTransport(),
|
|
286
313
|
serverInfo: { name: "fake", version: "1" },
|
|
287
314
|
capabilities: { tools: {} },
|
|
315
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
288
316
|
}) satisfies MCPServerConnection,
|
|
289
317
|
});
|
|
290
318
|
const manager = new MCPManager(".", null, { pool, sessionId: "config-hang" });
|
|
@@ -313,6 +341,7 @@ test("caller abort after acquisition releases a hanging prepared lease", async (
|
|
|
313
341
|
transport,
|
|
314
342
|
serverInfo: { name: "fake", version: "1" },
|
|
315
343
|
capabilities: { tools: {} },
|
|
344
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
316
345
|
} satisfies MCPServerConnection;
|
|
317
346
|
},
|
|
318
347
|
});
|
|
@@ -346,6 +375,7 @@ test("disconnectAll releases an active prepared lease and settles its callback",
|
|
|
346
375
|
transport,
|
|
347
376
|
serverInfo: { name: "fake", version: "1" },
|
|
348
377
|
capabilities: { tools: {} },
|
|
378
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
349
379
|
} satisfies MCPServerConnection;
|
|
350
380
|
},
|
|
351
381
|
});
|
|
@@ -375,6 +405,7 @@ test("disconnectAll aggregates active transient release failures", async () => {
|
|
|
375
405
|
transport,
|
|
376
406
|
serverInfo: { name: "fake", version: "1" },
|
|
377
407
|
capabilities: { tools: {} },
|
|
408
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
378
409
|
} satisfies MCPServerConnection;
|
|
379
410
|
},
|
|
380
411
|
});
|
|
@@ -403,6 +434,7 @@ test("transient lease does not replace the manager-owned lease mapping", async (
|
|
|
403
434
|
transport,
|
|
404
435
|
serverInfo: { name: "fake", version: "1" },
|
|
405
436
|
capabilities: { tools: {} },
|
|
437
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
406
438
|
} satisfies MCPServerConnection;
|
|
407
439
|
},
|
|
408
440
|
});
|
|
@@ -436,6 +468,7 @@ test("prepared transient operations acquire and release through the pool", async
|
|
|
436
468
|
transport,
|
|
437
469
|
serverInfo: { name: "fake", version: "1" },
|
|
438
470
|
capabilities: { tools: {} },
|
|
471
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
439
472
|
} satisfies MCPServerConnection;
|
|
440
473
|
},
|
|
441
474
|
});
|
|
@@ -460,6 +493,7 @@ test("reconnect retires held transient leases before opening a fresh physical co
|
|
|
460
493
|
transport,
|
|
461
494
|
serverInfo: { name: "fake", version: "1" },
|
|
462
495
|
capabilities: { tools: {} },
|
|
496
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
463
497
|
} satisfies MCPServerConnection;
|
|
464
498
|
},
|
|
465
499
|
});
|
|
@@ -507,6 +541,7 @@ test("shutdown closes retired and replacement physical entries after HTTP-style
|
|
|
507
541
|
transport,
|
|
508
542
|
serverInfo: { name: "fake", version: "1" },
|
|
509
543
|
capabilities: { tools: {} },
|
|
544
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
510
545
|
} satisfies MCPServerConnection;
|
|
511
546
|
},
|
|
512
547
|
});
|
|
@@ -541,6 +576,7 @@ test("successful HTTP-style rotations remove settled retired-release records whi
|
|
|
541
576
|
transport,
|
|
542
577
|
serverInfo: { name: "fake", version: "1" },
|
|
543
578
|
capabilities: { tools: {} },
|
|
579
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
544
580
|
} satisfies MCPServerConnection;
|
|
545
581
|
},
|
|
546
582
|
});
|
|
@@ -582,6 +618,7 @@ test("manager disconnectAll aggregates a rejecting retired HTTP-style close", as
|
|
|
582
618
|
transport,
|
|
583
619
|
serverInfo: { name: "fake", version: "1" },
|
|
584
620
|
capabilities: { tools: {} },
|
|
621
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
585
622
|
} satisfies MCPServerConnection;
|
|
586
623
|
},
|
|
587
624
|
});
|
|
@@ -624,6 +661,7 @@ test("reconnect uses the exact backoff schedule and coalesces concurrent request
|
|
|
624
661
|
transport: new ManagerFakeTransport(),
|
|
625
662
|
serverInfo: { name: "fake", version: "1" },
|
|
626
663
|
capabilities: { tools: {} },
|
|
664
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
627
665
|
} satisfies MCPServerConnection;
|
|
628
666
|
},
|
|
629
667
|
});
|
|
@@ -661,6 +699,7 @@ test("disconnectAll reports typed lease-release failures after clearing all stat
|
|
|
661
699
|
transport,
|
|
662
700
|
serverInfo: { name: "fake", version: "1" },
|
|
663
701
|
capabilities: { tools: {} },
|
|
702
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
664
703
|
} satisfies MCPServerConnection;
|
|
665
704
|
},
|
|
666
705
|
});
|
|
@@ -680,6 +719,7 @@ test("manager lease advertises its canonical roots through the pool", async () =
|
|
|
680
719
|
transport: new ManagerFakeTransport(),
|
|
681
720
|
serverInfo: { name: "fake", version: "1" },
|
|
682
721
|
capabilities: { tools: {} },
|
|
722
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
683
723
|
}) satisfies MCPServerConnection,
|
|
684
724
|
});
|
|
685
725
|
const manager = new MCPManager(".", null, { pool, sessionId: "roots-session" });
|
|
@@ -708,6 +748,7 @@ test("per-session manager facades remain isolated while shared tools-only facade
|
|
|
708
748
|
transport,
|
|
709
749
|
serverInfo: { name: "fake", version: "1" },
|
|
710
750
|
capabilities: { tools: {} },
|
|
751
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
711
752
|
} satisfies MCPServerConnection;
|
|
712
753
|
},
|
|
713
754
|
});
|
|
@@ -757,6 +798,7 @@ test("shared prompt execution stays lease-bound while one manager releases", asy
|
|
|
757
798
|
transport,
|
|
758
799
|
serverInfo: { name: "prompt", version: "1" },
|
|
759
800
|
capabilities: { tools: {}, resources: { subscribe: true }, prompts: {} },
|
|
801
|
+
protocol: fakeLegacyProtocol({ tools: {}, resources: { subscribe: true }, prompts: {} }),
|
|
760
802
|
} satisfies MCPServerConnection;
|
|
761
803
|
},
|
|
762
804
|
});
|
|
@@ -807,6 +849,7 @@ test("shared replacement is deferred across an unrelated reconnecting server", a
|
|
|
807
849
|
transport,
|
|
808
850
|
serverInfo: { name: "multi", version: String(generation) },
|
|
809
851
|
capabilities: { tools: {} },
|
|
852
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
810
853
|
} satisfies MCPServerConnection;
|
|
811
854
|
},
|
|
812
855
|
});
|
|
@@ -874,6 +917,7 @@ test("shared replacement rebind reconciles a lease acquired before a second rota
|
|
|
874
917
|
transport,
|
|
875
918
|
serverInfo: { name: "generation", version: String(generation) },
|
|
876
919
|
capabilities: { tools: {} },
|
|
920
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
877
921
|
} satisfies MCPServerConnection;
|
|
878
922
|
},
|
|
879
923
|
});
|
|
@@ -947,6 +991,7 @@ test("shared initial join reconciles a lease acquired before owner rotation", as
|
|
|
947
991
|
transport,
|
|
948
992
|
serverInfo: { name: "initial-join", version: String(generation) },
|
|
949
993
|
capabilities: { tools: {} },
|
|
994
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
950
995
|
} satisfies MCPServerConnection;
|
|
951
996
|
},
|
|
952
997
|
});
|
|
@@ -1010,6 +1055,7 @@ test("initial join hook rejection releases the acquired lease", async () => {
|
|
|
1010
1055
|
transport,
|
|
1011
1056
|
serverInfo: { name: "hook-rejection", version: String(opens) },
|
|
1012
1057
|
capabilities: { tools: {} },
|
|
1058
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
1013
1059
|
} satisfies MCPServerConnection;
|
|
1014
1060
|
},
|
|
1015
1061
|
});
|
|
@@ -1060,6 +1106,7 @@ test("initial join retry failure clears pending state for a subsequent connect",
|
|
|
1060
1106
|
transport,
|
|
1061
1107
|
serverInfo: { name: "retry-failure", version: String(generation) },
|
|
1062
1108
|
capabilities: { tools: {} },
|
|
1109
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
1063
1110
|
} satisfies MCPServerConnection;
|
|
1064
1111
|
},
|
|
1065
1112
|
});
|
|
@@ -1136,6 +1183,7 @@ test("shared replacement is requeued when reconnect starts during acquisition",
|
|
|
1136
1183
|
transport,
|
|
1137
1184
|
serverInfo: { name: "inverse", version: String(generation) },
|
|
1138
1185
|
capabilities: { tools: {} },
|
|
1186
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
1139
1187
|
} satisfies MCPServerConnection;
|
|
1140
1188
|
},
|
|
1141
1189
|
});
|
|
@@ -1216,6 +1264,7 @@ test("queued shared replacement is dropped when teardown begins", async () => {
|
|
|
1216
1264
|
transport,
|
|
1217
1265
|
serverInfo: { name: "drop", version: String(generation) },
|
|
1218
1266
|
capabilities: { tools: {} },
|
|
1267
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
1219
1268
|
} satisfies MCPServerConnection;
|
|
1220
1269
|
},
|
|
1221
1270
|
});
|
|
@@ -1263,6 +1312,7 @@ test("shared replacement rebind is fenced when peer disconnects during old-lease
|
|
|
1263
1312
|
transport,
|
|
1264
1313
|
serverInfo: { name: "race", version: String(opens) },
|
|
1265
1314
|
capabilities: { tools: {}, resources: { subscribe: true }, prompts: {} },
|
|
1315
|
+
protocol: fakeLegacyProtocol({ tools: {}, resources: { subscribe: true }, prompts: {} }),
|
|
1266
1316
|
} satisfies MCPServerConnection;
|
|
1267
1317
|
},
|
|
1268
1318
|
});
|
|
@@ -1316,6 +1366,7 @@ test("shared noReplay request failure coordinates one replacement without resend
|
|
|
1316
1366
|
transport,
|
|
1317
1367
|
serverInfo: { name: "recovery", version: "1" },
|
|
1318
1368
|
capabilities: { tools: {} },
|
|
1369
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
1319
1370
|
} satisfies MCPServerConnection;
|
|
1320
1371
|
},
|
|
1321
1372
|
});
|
|
@@ -1358,6 +1409,7 @@ test("released shared facade tools fail live-state checks while surviving lease
|
|
|
1358
1409
|
transport,
|
|
1359
1410
|
serverInfo: { name: "fake", version: "1" },
|
|
1360
1411
|
capabilities: { tools: {} },
|
|
1412
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
1361
1413
|
} satisfies MCPServerConnection;
|
|
1362
1414
|
},
|
|
1363
1415
|
});
|
|
@@ -1401,6 +1453,7 @@ test("shared restart rebinds every surviving manager lease before subsequent cal
|
|
|
1401
1453
|
transport,
|
|
1402
1454
|
serverInfo: { name: "fake", version: "1" },
|
|
1403
1455
|
capabilities: { tools: {} },
|
|
1456
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
1404
1457
|
} satisfies MCPServerConnection;
|
|
1405
1458
|
},
|
|
1406
1459
|
});
|
|
@@ -1444,6 +1497,7 @@ test("shared transport crash has one restart owner across manager facades", asyn
|
|
|
1444
1497
|
transport,
|
|
1445
1498
|
serverInfo: { name: "fake", version: "1" },
|
|
1446
1499
|
capabilities: { tools: {} },
|
|
1500
|
+
protocol: fakeLegacyProtocol({ tools: {} }),
|
|
1447
1501
|
} satisfies MCPServerConnection;
|
|
1448
1502
|
},
|
|
1449
1503
|
});
|
|
@@ -1510,6 +1564,7 @@ test("shared HTTP leases use one MCP session and one callback stream while relea
|
|
|
1510
1564
|
toolsListCount += 1;
|
|
1511
1565
|
return Response.json({ jsonrpc: "2.0", id: message.id, result: { tools: [] } });
|
|
1512
1566
|
}
|
|
1567
|
+
if (message.method === "server/discover") return legacyMcpMethodNotFound(message.id);
|
|
1513
1568
|
return Response.json({ jsonrpc: "2.0", id: message.id, result: {} });
|
|
1514
1569
|
},
|
|
1515
1570
|
});
|
|
@@ -1576,6 +1631,7 @@ test("S7-style HTTP stub keeps distinct paths and queries on one host in separat
|
|
|
1576
1631
|
if (message.method === "notifications/initialized") return new Response(null, { status: 202 });
|
|
1577
1632
|
if (message.method === "tools/list")
|
|
1578
1633
|
return Response.json({ jsonrpc: "2.0", id: message.id, result: { tools: [] } });
|
|
1634
|
+
if (message.method === "server/discover") return legacyMcpMethodNotFound(message.id);
|
|
1579
1635
|
return Response.json({ jsonrpc: "2.0", id: message.id, result: {} });
|
|
1580
1636
|
},
|
|
1581
1637
|
});
|
|
@@ -33,12 +33,14 @@ import {
|
|
|
33
33
|
MCPPoolLeaseObsoleteError,
|
|
34
34
|
MCPPoolLeaseReleaseError,
|
|
35
35
|
} from "./pool";
|
|
36
|
+
import type { MCPProtocolObservation } from "./protocol";
|
|
36
37
|
import type { MCPToolDetails } from "./tool-bridge";
|
|
37
38
|
import { DeferredMCPTool, MCPTool } from "./tool-bridge";
|
|
38
39
|
import type { MCPToolCache } from "./tool-cache";
|
|
39
40
|
import { HttpTransport } from "./transports/http";
|
|
40
41
|
import type {
|
|
41
42
|
MCPGetPromptResult,
|
|
43
|
+
MCPInputRequestHandler,
|
|
42
44
|
MCPPrompt,
|
|
43
45
|
MCPRequestOptions,
|
|
44
46
|
MCPResource,
|
|
@@ -252,6 +254,12 @@ export interface MCPDiscoverOptions {
|
|
|
252
254
|
filterBrowser?: boolean;
|
|
253
255
|
/** Only connect servers with autoload !== false (default: false) */
|
|
254
256
|
autoloadOnly?: boolean;
|
|
257
|
+
/**
|
|
258
|
+
* Restrict discovery to GJC's native `.gjc` scopes (user + project).
|
|
259
|
+
* Runtime MCP authority for GJC sessions; Claude Code/Codex files are
|
|
260
|
+
* explicit import sources into `.gjc`, not implicit runtime authorities.
|
|
261
|
+
*/
|
|
262
|
+
nativeOnly?: boolean;
|
|
255
263
|
/** Called when starting to connect to servers */
|
|
256
264
|
onConnecting?: (serverNames: string[]) => void;
|
|
257
265
|
/** Load only this explicit MCP config file. */
|
|
@@ -323,6 +331,7 @@ export class MCPManager {
|
|
|
323
331
|
#pendingToolLoads = new Map<string, Promise<ToolLoadResult>>();
|
|
324
332
|
#sources = new Map<string, SourceMeta>();
|
|
325
333
|
#authStorage: AuthStorage | null = null;
|
|
334
|
+
#inputRequestHandler: MCPInputRequestHandler | null = null;
|
|
326
335
|
#onNotification?: (serverName: string, method: string, params: unknown) => void;
|
|
327
336
|
#onToolsChanged?: (tools: CustomTool<TSchema, MCPToolDetails>[]) => void;
|
|
328
337
|
#onResourcesChanged?: (serverName: string, uri: string) => void;
|
|
@@ -862,6 +871,16 @@ export class MCPManager {
|
|
|
862
871
|
this.#authStorage = authStorage;
|
|
863
872
|
}
|
|
864
873
|
|
|
874
|
+
/**
|
|
875
|
+
* Register the handler for modern MRTR `input_required` results (structured
|
|
876
|
+
* elicitation/roots/sampling input requests). Runtimes with an interactive
|
|
877
|
+
* question surface (e.g. ACP `elicitation/create`) register here; without a
|
|
878
|
+
* handler, `input_required` fails explicitly instead of hanging.
|
|
879
|
+
*/
|
|
880
|
+
setInputRequestHandler(handler: MCPInputRequestHandler | null): void {
|
|
881
|
+
this.#inputRequestHandler = handler;
|
|
882
|
+
}
|
|
883
|
+
|
|
865
884
|
/**
|
|
866
885
|
* Discover and connect to all MCP servers from .mcp.json files.
|
|
867
886
|
* Returns tools and any connection errors.
|
|
@@ -885,6 +904,7 @@ export class MCPManager {
|
|
|
885
904
|
filterExa: options?.filterExa,
|
|
886
905
|
filterBrowser: options?.filterBrowser,
|
|
887
906
|
autoloadOnly: options?.autoloadOnly,
|
|
907
|
+
nativeOnly: options?.nativeOnly,
|
|
888
908
|
configPath: options?.configPath,
|
|
889
909
|
});
|
|
890
910
|
const result = await this.#connectServers(configs, sources, options?.onConnecting);
|
|
@@ -1093,6 +1113,7 @@ export class MCPManager {
|
|
|
1093
1113
|
const reconnect = () => this.reconnectServer(name);
|
|
1094
1114
|
const customTools = MCPTool.fromTools(this.#connectionForLease(connection), serverTools, reconnect, {
|
|
1095
1115
|
noReplay: config.sharing === "shared",
|
|
1116
|
+
inputHandler: () => this.#inputRequestHandler ?? undefined,
|
|
1096
1117
|
});
|
|
1097
1118
|
this.#replaceServerTools(name, customTools);
|
|
1098
1119
|
if (!this.#toolsOnly) this.#onToolsChanged?.(this.#tools);
|
|
@@ -1207,6 +1228,7 @@ export class MCPManager {
|
|
|
1207
1228
|
allTools.push(
|
|
1208
1229
|
...MCPTool.fromTools(this.#connectionForLease(connection), serverTools, reconnect, {
|
|
1209
1230
|
noReplay: task.config.sharing === "shared",
|
|
1231
|
+
inputHandler: () => this.#inputRequestHandler ?? undefined,
|
|
1210
1232
|
}),
|
|
1211
1233
|
);
|
|
1212
1234
|
} catch (error) {
|
|
@@ -1239,7 +1261,10 @@ export class MCPManager {
|
|
|
1239
1261
|
() => this.#waitForConnection(name).then(connection => this.#connectionForLease(connection)),
|
|
1240
1262
|
source,
|
|
1241
1263
|
reconnect,
|
|
1242
|
-
{
|
|
1264
|
+
{
|
|
1265
|
+
noReplay: task.config.sharing === "shared",
|
|
1266
|
+
inputHandler: () => this.#inputRequestHandler ?? undefined,
|
|
1267
|
+
},
|
|
1243
1268
|
),
|
|
1244
1269
|
);
|
|
1245
1270
|
} catch (error) {
|
|
@@ -1379,6 +1404,27 @@ export class MCPManager {
|
|
|
1379
1404
|
return "disconnected";
|
|
1380
1405
|
}
|
|
1381
1406
|
|
|
1407
|
+
/**
|
|
1408
|
+
* Get the authoritative protocol observation for a connected server
|
|
1409
|
+
* (preference, negotiated era/version, downgrade decision, deprecation state).
|
|
1410
|
+
* Secret-free; the single observation model consumed by customization doctor
|
|
1411
|
+
* (#4288) and /extensions (#4291). Returns undefined when not connected.
|
|
1412
|
+
*/
|
|
1413
|
+
getProtocolObservation(name: string): MCPProtocolObservation | undefined {
|
|
1414
|
+
return this.#connections.get(name)?.protocol;
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
/**
|
|
1418
|
+
* Snapshot of protocol observations for all connected servers.
|
|
1419
|
+
*/
|
|
1420
|
+
getProtocolObservations(): ReadonlyMap<string, MCPProtocolObservation> {
|
|
1421
|
+
const snapshot = new Map<string, MCPProtocolObservation>();
|
|
1422
|
+
for (const [name, connection] of this.#connections) {
|
|
1423
|
+
snapshot.set(name, connection.protocol);
|
|
1424
|
+
}
|
|
1425
|
+
return snapshot;
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1382
1428
|
/**
|
|
1383
1429
|
* Get the source metadata for a server.
|
|
1384
1430
|
*/
|
|
@@ -1947,6 +1993,7 @@ export class MCPManager {
|
|
|
1947
1993
|
const reconnect = () => this.reconnectServer(name);
|
|
1948
1994
|
const customTools = MCPTool.fromTools(this.#connectionForLease(connection), serverTools, reconnect, {
|
|
1949
1995
|
noReplay: config.sharing === "shared",
|
|
1996
|
+
inputHandler: () => this.#inputRequestHandler ?? undefined,
|
|
1950
1997
|
});
|
|
1951
1998
|
void this.toolCache?.set(name, config, serverTools);
|
|
1952
1999
|
this.#replaceServerTools(name, customTools);
|
|
@@ -2002,8 +2049,10 @@ export class MCPManager {
|
|
|
2002
2049
|
const globalEpoch = this.#epoch;
|
|
2003
2050
|
const disconnectEpoch = this.#disconnectEpochs.get(name) ?? 0;
|
|
2004
2051
|
|
|
2005
|
-
// Clear cached tools
|
|
2052
|
+
// Clear cached tools and any server-supplied freshness hints
|
|
2006
2053
|
connection.tools = undefined;
|
|
2054
|
+
connection.toolsFreshUntil = undefined;
|
|
2055
|
+
connection.toolsCacheScope = undefined;
|
|
2007
2056
|
|
|
2008
2057
|
// Reload tools
|
|
2009
2058
|
const facade = this.#connectionForLease(connection);
|
|
@@ -2012,6 +2061,7 @@ export class MCPManager {
|
|
|
2012
2061
|
const reconnect = () => this.reconnectServer(name);
|
|
2013
2062
|
const customTools = MCPTool.fromTools(facade, serverTools, reconnect, {
|
|
2014
2063
|
noReplay: connection.config.sharing === "shared",
|
|
2064
|
+
inputHandler: () => this.#inputRequestHandler ?? undefined,
|
|
2015
2065
|
});
|
|
2016
2066
|
void this.toolCache?.set(name, connection.config, serverTools);
|
|
2017
2067
|
|
|
@@ -12,6 +12,10 @@ export interface OAuthEndpoints {
|
|
|
12
12
|
tokenUrl: string;
|
|
13
13
|
clientId?: string;
|
|
14
14
|
scopes?: string;
|
|
15
|
+
/** Issuer recorded from the validated metadata document (RFC 9207). */
|
|
16
|
+
issuer?: string;
|
|
17
|
+
/** `authorization_response_iss_parameter_supported` from the same metadata. */
|
|
18
|
+
authorizationResponseIssSupported?: boolean;
|
|
15
19
|
}
|
|
16
20
|
|
|
17
21
|
export interface AuthDetectionResult {
|
|
@@ -413,6 +417,15 @@ export async function discoverOAuthEndpoints(
|
|
|
413
417
|
...endpoints,
|
|
414
418
|
authorizationUrl: authorization.url.toString(),
|
|
415
419
|
tokenUrl: token.url.toString(),
|
|
420
|
+
// RFC 9207 (MCP 2026-07-28): record the issuer from this validated
|
|
421
|
+
// metadata document so the authorization response can be checked.
|
|
422
|
+
...(issuer ? { issuer } : {}),
|
|
423
|
+
...(typeof metadata.authorization_response_iss_parameter_supported === "boolean"
|
|
424
|
+
? {
|
|
425
|
+
authorizationResponseIssSupported:
|
|
426
|
+
metadata.authorization_response_iss_parameter_supported,
|
|
427
|
+
}
|
|
428
|
+
: {}),
|
|
416
429
|
};
|
|
417
430
|
}
|
|
418
431
|
}
|
|
@@ -95,15 +95,39 @@ function resolveCallbackOptions(config: MCPOAuthConfig): OAuthCallbackFlowOption
|
|
|
95
95
|
callbackHostname: resolveCallbackHostname(redirectUri),
|
|
96
96
|
callbackBindHostname: CALLBACK_BIND_HOSTNAME,
|
|
97
97
|
redirectUri,
|
|
98
|
+
...(config.issuer ? { expectedIssuer: config.issuer } : {}),
|
|
99
|
+
...(config.issuerResponseIssSupported !== undefined
|
|
100
|
+
? { issuerResponseIssSupported: config.issuerResponseIssSupported }
|
|
101
|
+
: {}),
|
|
98
102
|
};
|
|
99
103
|
}
|
|
100
104
|
|
|
105
|
+
/**
|
|
106
|
+
* Canonical MCP server resource URI per RFC 8707 §2: absolute URI, lowercase
|
|
107
|
+
* scheme/host, no fragment, no trailing slash on an empty path.
|
|
108
|
+
*/
|
|
109
|
+
export function canonicalMCPResourceUri(raw: string): string | undefined {
|
|
110
|
+
try {
|
|
111
|
+
const url = new URL(raw);
|
|
112
|
+
if (url.hash) url.hash = "";
|
|
113
|
+
const serialized = url.toString();
|
|
114
|
+
return url.pathname === "/" && serialized.endsWith("/") ? serialized.slice(0, -1) : serialized;
|
|
115
|
+
} catch {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
101
120
|
export interface MCPOAuthConfig {
|
|
102
121
|
/** Authorization endpoint URL */
|
|
103
122
|
authorizationUrl: string;
|
|
104
123
|
/** Token endpoint URL */
|
|
105
124
|
tokenUrl: string;
|
|
106
|
-
/**
|
|
125
|
+
/**
|
|
126
|
+
* Client ID (optional when already embedded in authorization URL). An
|
|
127
|
+
* HTTPS URL here is a Client ID Metadata Document (CIMD) reference per
|
|
128
|
+
* MCP 2026-07-28 and is used as-is; Dynamic Client Registration is only a
|
|
129
|
+
* deprecated backwards-compatibility fallback when no client id exists.
|
|
130
|
+
*/
|
|
107
131
|
clientId?: string;
|
|
108
132
|
/** Client secret (optional for PKCE flows) */
|
|
109
133
|
clientSecret?: string;
|
|
@@ -115,6 +139,19 @@ export interface MCPOAuthConfig {
|
|
|
115
139
|
callbackPort?: number;
|
|
116
140
|
/** Custom callback path (default: /callback or redirectUri pathname) */
|
|
117
141
|
callbackPath?: string;
|
|
142
|
+
/**
|
|
143
|
+
* Canonical URI of the target MCP server (RFC 8707). Sent as the `resource`
|
|
144
|
+
* parameter on BOTH the authorization and token requests, regardless of
|
|
145
|
+
* authorization-server support.
|
|
146
|
+
*/
|
|
147
|
+
resource?: string;
|
|
148
|
+
/**
|
|
149
|
+
* Expected authorization-server issuer recorded from validated discovery
|
|
150
|
+
* metadata (RFC 9207 / MCP 2026-07-28). Validation fails closed on mismatch.
|
|
151
|
+
*/
|
|
152
|
+
issuer?: string;
|
|
153
|
+
/** `authorization_response_iss_parameter_supported` from the same metadata. */
|
|
154
|
+
issuerResponseIssSupported?: boolean;
|
|
118
155
|
}
|
|
119
156
|
|
|
120
157
|
/**
|
|
@@ -174,6 +211,10 @@ export class MCPOAuthFlow extends OAuthCallbackFlow {
|
|
|
174
211
|
}
|
|
175
212
|
params.set("redirect_uri", redirectUri);
|
|
176
213
|
params.set("state", state);
|
|
214
|
+
// RFC 8707: the canonical MCP server resource MUST be on the authorization request.
|
|
215
|
+
if (this.config.resource && !params.get("resource")) {
|
|
216
|
+
params.set("resource", this.config.resource);
|
|
217
|
+
}
|
|
177
218
|
|
|
178
219
|
// Add PKCE challenge (some providers require it)
|
|
179
220
|
const codeVerifier = this.#generateCodeVerifier();
|
|
@@ -200,6 +241,10 @@ export class MCPOAuthFlow extends OAuthCallbackFlow {
|
|
|
200
241
|
if (this.#resolvedClientId) {
|
|
201
242
|
params.set("client_id", this.#resolvedClientId);
|
|
202
243
|
}
|
|
244
|
+
// RFC 8707: the canonical MCP server resource MUST be on the token request.
|
|
245
|
+
if (this.config.resource) {
|
|
246
|
+
params.set("resource", this.config.resource);
|
|
247
|
+
}
|
|
203
248
|
|
|
204
249
|
// Add code verifier for PKCE
|
|
205
250
|
if (this.#codeVerifier) {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
3
|
import { realpathSync } from "node:fs";
|
|
4
4
|
import * as path from "node:path";
|
|
5
|
+
import { resolveMCPProtocolPreference } from "./protocol";
|
|
5
6
|
import type { MCPServerConfig } from "./types";
|
|
6
7
|
|
|
7
8
|
export type MCPPoolSharingMode = "per-session" | "shared";
|
|
@@ -67,6 +68,8 @@ export interface MCPPoolKeyIdentity {
|
|
|
67
68
|
authScopeId: string;
|
|
68
69
|
pluginNetworkPolicyId: string;
|
|
69
70
|
capabilityProfile: MCPPoolCapabilityProfile;
|
|
71
|
+
/** Resolved protocol preference (auto | 2026-07-28 | legacy); partitions protocol generations. */
|
|
72
|
+
protocolPreference: string;
|
|
70
73
|
sessionId?: string;
|
|
71
74
|
}
|
|
72
75
|
|
|
@@ -262,10 +265,11 @@ export function buildMCPPoolKeyIdentity(
|
|
|
262
265
|
}
|
|
263
266
|
const headers = headerIdentity(source, options, auth.kind, auth.scope);
|
|
264
267
|
const identity: MCPPoolKeyIdentity = {
|
|
265
|
-
schemaVersion:
|
|
268
|
+
schemaVersion: 2,
|
|
266
269
|
serverName,
|
|
267
270
|
sharingMode,
|
|
268
271
|
transport,
|
|
272
|
+
protocolPreference: resolveMCPProtocolPreference(source.protocol),
|
|
269
273
|
command: source.type === "http" || source.type === "sse" ? "" : source.command,
|
|
270
274
|
argsNormalized: source.type === "http" || source.type === "sse" ? [] : [...(source.args ?? [])],
|
|
271
275
|
effectiveCwdRealpath: effectiveCwd(config, options),
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
import { MCPConnectionPool, MCPPoolAcquireAbortError, MCPPoolLeaseInvalidatedError } from "./pool";
|
|
3
3
|
import { MCPPoolConfigError } from "./pool-key";
|
|
4
|
+
import { legacyEraObservation } from "./protocol";
|
|
4
5
|
import type { MCPRequestOptions, MCPServerConfig, MCPServerConnection, MCPTransport } from "./types";
|
|
5
6
|
import { MCPExpectedFailure, MCPNotificationMethods } from "./types";
|
|
6
7
|
|
|
@@ -103,6 +104,14 @@ function connection(name: string, configValue: MCPServerConfig, transport: FakeT
|
|
|
103
104
|
transport,
|
|
104
105
|
serverInfo: { name: "fake", version: "1" },
|
|
105
106
|
capabilities: { tools: {}, resources: { subscribe: true } },
|
|
107
|
+
protocol: legacyEraObservation({
|
|
108
|
+
preference: "auto",
|
|
109
|
+
effectiveVersion: "2025-03-26",
|
|
110
|
+
negotiation: "legacy-forced",
|
|
111
|
+
downgradeReason: "stdio-transport",
|
|
112
|
+
serverInfo: { name: "fake", version: "1" },
|
|
113
|
+
capabilities: { tools: true, resources: true },
|
|
114
|
+
}),
|
|
106
115
|
};
|
|
107
116
|
}
|
|
108
117
|
|