@code-yeongyu/senpi 2026.9.27-2 → 2026.9.27-3
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 +23 -0
- package/dist/bundle/chunks/anthropic-messages-3FGAXYJS.js +8 -0
- package/dist/bundle/chunks/{app-server-command-ATWHNOOO.js → app-server-command-ZVB35UIJ.js} +1 -1
- package/dist/bundle/chunks/azure-openai-responses-4SUOOZZ4.js +2 -0
- package/dist/bundle/chunks/{chunk-KMJXSXRX.js → chunk-357I4IUU.js} +2 -2
- package/dist/bundle/chunks/chunk-3SIQIY57.js +8 -0
- package/dist/bundle/chunks/chunk-45SZOLCU.js +2 -0
- package/dist/bundle/chunks/{chunk-77ACEMYL.js → chunk-6J6RDMBY.js} +1 -1
- package/dist/bundle/chunks/{chunk-FD34HSJJ.js → chunk-C6LQNMRB.js} +1 -1
- package/dist/bundle/chunks/chunk-ELM77A26.js +2 -0
- package/dist/bundle/chunks/chunk-GZVCRV7I.js +3 -0
- package/dist/bundle/chunks/{chunk-TTY5BHCG.js → chunk-H2SGCPMD.js} +1 -1
- package/dist/bundle/chunks/chunk-KLBKUBDV.js +2 -0
- package/dist/bundle/chunks/chunk-L6QV7NZI.js +2 -0
- package/dist/bundle/chunks/{chunk-ZKZAATFM.js → chunk-LDB5UMH2.js} +2 -2
- package/dist/bundle/chunks/{chunk-HZAKOVHN.js → chunk-LGKKU4VM.js} +1 -1
- package/dist/bundle/chunks/{chunk-6Q6DGME2.js → chunk-NMDALHXH.js} +1 -1
- package/dist/bundle/chunks/chunk-NNILBBOH.js +18 -0
- package/dist/bundle/chunks/{chunk-SUQDU5KM.js → chunk-OQRUK2DK.js} +1 -1
- package/dist/bundle/chunks/{chunk-67BC7VZV.js → chunk-OZN2KUPR.js} +6 -6
- package/dist/bundle/chunks/{chunk-X3T45623.js → chunk-QK4QKRTF.js} +1 -1
- package/dist/bundle/chunks/{chunk-WM5FVFAP.js → chunk-QPZVJQC5.js} +1 -1
- package/dist/bundle/chunks/{chunk-HPY47AVX.js → chunk-QYAO24GB.js} +1 -1
- package/dist/bundle/chunks/{chunk-6W2DB2GC.js → chunk-RULGEHQM.js} +1 -1
- package/dist/bundle/chunks/{chunk-6SLQ5HFO.js → chunk-RYI6XR6Z.js} +55 -53
- package/dist/bundle/chunks/chunk-U3VOXCGP.js +2 -0
- package/dist/bundle/chunks/{chunk-LPFZGWG2.js → chunk-Y7EIVDHZ.js} +1 -1
- package/dist/bundle/chunks/chunk-ZIVYE5YK.js +2 -0
- package/dist/bundle/chunks/cli-main-RONHLFWZ.js +3 -0
- package/dist/bundle/chunks/google-generative-ai-ZTGKZTGU.js +2 -0
- package/dist/bundle/chunks/google-vertex-CCZ376YK.js +2 -0
- package/dist/bundle/chunks/help-fast-path-5LRG6FCG.js +2 -0
- package/dist/bundle/chunks/host-command-JVPGQR74.js +2 -0
- package/dist/bundle/chunks/host-lifecycle-R4HLXLBM.js +3 -0
- package/dist/bundle/chunks/host-lifecycle.js +4 -4
- package/dist/bundle/chunks/interactive-host-runtime-FES2G62G.js +4 -0
- package/dist/bundle/chunks/interactive-mode-45EP2FVL.js +2 -0
- package/dist/bundle/chunks/{list-tips-EBRNBPBM.js → list-tips-XXMRDHN6.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-CE3W6COI.js → multi-session-host-EFCMD5OT.js} +6 -6
- package/dist/bundle/chunks/{openai-completions-4CLXDDHJ.js → openai-completions-OP6VFNUR.js} +1 -1
- package/dist/bundle/chunks/openai-images-6U5FCN5S.js +2 -0
- package/dist/bundle/chunks/openai-responses-7PWMBGYX.js +2 -0
- package/dist/bundle/chunks/openrouter-images-QIKWQZUD.js +2 -0
- package/dist/bundle/chunks/{package-manager-cli-2PHRL2SX.js → package-manager-cli-5XJS3TYM.js} +1 -1
- package/dist/bundle/chunks/rotation-stream-KW7PTEC4.js +2 -0
- package/dist/bundle/chunks/rpc-mode-ZHYECU24.js +2 -0
- package/dist/bundle/chunks/session-picker-QHIYVQP4.js +2 -0
- package/dist/bundle/chunks/session-worker.js +245 -238
- package/dist/bundle/chunks/{state-store-Q5EWEAFG.js → state-store-D4GGGT3J.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/continue-moved.d.ts +15 -0
- package/dist/cli/continue-moved.d.ts.map +1 -0
- package/dist/cli/continue-moved.js +26 -0
- package/dist/cli/continue-moved.js.map +1 -0
- package/dist/core/agent-session-runtime.d.ts +3 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +43 -10
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/session-registry-pump.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/session-registry-pump.js +5 -1
- package/dist/core/extensions/builtin/anthropic-subscription/session-registry-pump.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-claim.d.ts +13 -1
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-claim.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-claim.js +25 -2
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-claim.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-types.d.ts +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-types.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/catalog.d.ts +3 -0
- package/dist/core/extensions/builtin/mcp/catalog.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/catalog.js +9 -0
- package/dist/core/extensions/builtin/mcp/catalog.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/connection-types.d.ts +2 -0
- package/dist/core/extensions/builtin/mcp/connection-types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/connection-types.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/connection.d.ts +1 -1
- package/dist/core/extensions/builtin/mcp/connection.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/connection.js +3 -2
- package/dist/core/extensions/builtin/mcp/connection.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/session.d.ts +3 -0
- package/dist/core/extensions/builtin/mcp/expose/session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/expose/session.js +9 -2
- package/dist/core/extensions/builtin/mcp/expose/session.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/service-register.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service-register.js +7 -1
- package/dist/core/extensions/builtin/mcp/service-register.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/service-tools-changed.d.ts +18 -0
- package/dist/core/extensions/builtin/mcp/service-tools-changed.d.ts.map +1 -0
- package/dist/core/extensions/builtin/mcp/service-tools-changed.js +61 -0
- package/dist/core/extensions/builtin/mcp/service-tools-changed.js.map +1 -0
- package/dist/core/extensions/builtin/mcp/service-types.d.ts +13 -0
- package/dist/core/extensions/builtin/mcp/service-types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service-types.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/service.js +4 -37
- package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/shared-lease.js +1 -1
- package/dist/core/extensions/builtin/mcp/shared-lease.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/startup-race.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/startup-race.js +11 -1
- package/dist/core/extensions/builtin/mcp/startup-race.js.map +1 -1
- package/dist/core/moved-sessions.d.ts +10 -0
- package/dist/core/moved-sessions.d.ts.map +1 -0
- package/dist/core/moved-sessions.js +84 -0
- package/dist/core/moved-sessions.js.map +1 -0
- package/dist/core/process-crash-record.d.ts +62 -0
- package/dist/core/process-crash-record.d.ts.map +1 -0
- package/dist/core/process-crash-record.js +216 -0
- package/dist/core/process-crash-record.js.map +1 -0
- package/dist/core/resume-target.d.ts +20 -0
- package/dist/core/resume-target.d.ts.map +1 -0
- package/dist/core/resume-target.js +30 -0
- package/dist/core/resume-target.js.map +1 -0
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +1 -0
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-hold-errors.d.ts +20 -0
- package/dist/core/session-hold-errors.d.ts.map +1 -0
- package/dist/core/session-hold-errors.js +28 -0
- package/dist/core/session-hold-errors.js.map +1 -0
- package/dist/core/session-holders.d.ts +22 -0
- package/dist/core/session-holders.d.ts.map +1 -0
- package/dist/core/session-holders.js +234 -0
- package/dist/core/session-holders.js.map +1 -0
- package/dist/core/session-manager.d.ts +5 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-rebind.d.ts +7 -1
- package/dist/core/session-rebind.d.ts.map +1 -1
- package/dist/core/session-rebind.js +21 -5
- package/dist/core/session-rebind.js.map +1 -1
- package/dist/core/session-summary-index-file.d.ts.map +1 -1
- package/dist/core/session-summary-index-file.js +5 -2
- package/dist/core/session-summary-index-file.js.map +1 -1
- package/dist/core/session-summary.d.ts +3 -0
- package/dist/core/session-summary.d.ts.map +1 -1
- package/dist/core/session-summary.js +7 -0
- package/dist/core/session-summary.js.map +1 -1
- package/dist/legacy-dir-copy.d.ts +9 -0
- package/dist/legacy-dir-copy.d.ts.map +1 -0
- package/dist/legacy-dir-copy.js +69 -0
- package/dist/legacy-dir-copy.js.map +1 -0
- package/dist/legacy-senpi-dir-migration.d.ts.map +1 -1
- package/dist/legacy-senpi-dir-migration.js +64 -48
- package/dist/legacy-senpi-dir-migration.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +45 -19
- package/dist/main.js.map +1 -1
- package/dist/migrations-state.d.ts +1 -1
- package/dist/migrations-state.d.ts.map +1 -1
- package/dist/migrations-state.js +5 -1
- package/dist/migrations-state.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +4 -0
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +5 -3
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +8 -4
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/resume-rebind.d.ts +12 -0
- package/dist/modes/interactive/resume-rebind.d.ts.map +1 -0
- package/dist/modes/interactive/resume-rebind.js +37 -0
- package/dist/modes/interactive/resume-rebind.js.map +1 -0
- package/dist/modes/interactive/tips/catalog/computer-tips.d.ts +7 -0
- package/dist/modes/interactive/tips/catalog/computer-tips.d.ts.map +1 -0
- package/dist/modes/interactive/tips/catalog/computer-tips.js +36 -0
- package/dist/modes/interactive/tips/catalog/computer-tips.js.map +1 -0
- package/dist/modes/interactive/tips/registry.d.ts.map +1 -1
- package/dist/modes/interactive/tips/registry.js +2 -0
- package/dist/modes/interactive/tips/registry.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +3 -0
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/host-child-exit.d.ts.map +1 -1
- package/dist/modes/rpc/host-child-exit.js +4 -0
- package/dist/modes/rpc/host-child-exit.js.map +1 -1
- package/dist/modes/rpc/host-crash-record.d.ts +8 -0
- package/dist/modes/rpc/host-crash-record.d.ts.map +1 -1
- package/dist/modes/rpc/host-crash-record.js.map +1 -1
- package/dist/modes/rpc/host-crash-record.test.js +11 -0
- package/dist/modes/rpc/host-crash-record.test.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +2 -2
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +14 -6
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-request-deadline.d.ts +17 -0
- package/dist/modes/rpc/rpc-request-deadline.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-request-deadline.js +27 -0
- package/dist/modes/rpc/rpc-request-deadline.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +9 -2
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts +3 -6
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +9 -22
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-path-key.d.ts +10 -0
- package/dist/modes/rpc/session-path-key.d.ts.map +1 -0
- package/dist/modes/rpc/session-path-key.js +33 -0
- package/dist/modes/rpc/session-path-key.js.map +1 -0
- package/dist/modes/rpc/session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/session-registry.js +6 -10
- package/dist/modes/rpc/session-registry.js.map +1 -1
- package/dist/modes/rpc/session-sweep.d.ts +18 -0
- package/dist/modes/rpc/session-sweep.d.ts.map +1 -0
- package/dist/modes/rpc/session-sweep.js +32 -0
- package/dist/modes/rpc/session-sweep.js.map +1 -0
- package/dist/pi-dir-restore.d.ts +4 -0
- package/dist/pi-dir-restore.d.ts.map +1 -0
- package/dist/pi-dir-restore.js +92 -0
- package/dist/pi-dir-restore.js.map +1 -0
- package/docs/rpc.md +8 -3
- package/docs/sdk.md +29 -0
- package/docs/sessions.md +4 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +2 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +7 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js +3 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +3 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +10 -7
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +9 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/provider-diagnostic.d.ts +33 -0
- package/node_modules/@earendil-works/pi-ai/dist/provider-diagnostic.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/provider-diagnostic.js +56 -0
- package/node_modules/@earendil-works/pi-ai/dist/provider-diagnostic.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-diagnostic-carrier.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-diagnostic-carrier.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-diagnostic-carrier.js +18 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-diagnostic-carrier.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-diagnostic-sources.d.ts +26 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-diagnostic-sources.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-diagnostic-sources.js +103 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-diagnostic-sources.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-diagnostic-vocabulary.d.ts +36 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-diagnostic-vocabulary.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-diagnostic-vocabulary.js +129 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-diagnostic-vocabulary.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-retry.js +5 -4
- package/node_modules/@earendil-works/pi-ai/dist/utils/provider-retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
- package/dist/bundle/chunks/anthropic-messages-UYDVRFAS.js +0 -8
- package/dist/bundle/chunks/azure-openai-responses-DODWR4W6.js +0 -2
- package/dist/bundle/chunks/chunk-2L26KPZ6.js +0 -8
- package/dist/bundle/chunks/chunk-3CC5ZOBV.js +0 -13
- package/dist/bundle/chunks/chunk-L6JO4M6J.js +0 -3
- package/dist/bundle/chunks/chunk-SFYHCFRO.js +0 -2
- package/dist/bundle/chunks/chunk-TTHMOL5G.js +0 -2
- package/dist/bundle/chunks/chunk-UYCGOK6M.js +0 -2
- package/dist/bundle/chunks/chunk-ZTVQY5V6.js +0 -2
- package/dist/bundle/chunks/cli-main-HOM6UH3H.js +0 -3
- package/dist/bundle/chunks/google-generative-ai-VIEFECKJ.js +0 -2
- package/dist/bundle/chunks/google-vertex-Q64CKFID.js +0 -2
- package/dist/bundle/chunks/help-fast-path-YGYHMV2W.js +0 -2
- package/dist/bundle/chunks/host-command-XXSAFWBW.js +0 -2
- package/dist/bundle/chunks/host-lifecycle-GOMGJ25O.js +0 -3
- package/dist/bundle/chunks/interactive-host-runtime-IYCZWJGX.js +0 -4
- package/dist/bundle/chunks/interactive-mode-ZMO7YVYU.js +0 -2
- package/dist/bundle/chunks/openai-images-JA5N5DUU.js +0 -2
- package/dist/bundle/chunks/openai-responses-IBFGBAJP.js +0 -2
- package/dist/bundle/chunks/openrouter-images-MW5TXV7L.js +0 -2
- package/dist/bundle/chunks/rotation-stream-NATO6IMN.js +0 -2
- package/dist/bundle/chunks/rpc-mode-WCETTMFV.js +0 -2
- package/dist/bundle/chunks/session-picker-BP7THCWF.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-registry-pump.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-subscription/session-registry-pump.ts"],"names":[],"mappings":"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","sourcesContent":["import { sdkResultFailure } from \"./errors.ts\";\nimport { refusalError } from \"./refusal.ts\";\nimport type { SDKMessage, SDKUserMessage } from \"./sdk-boundary.ts\";\nimport { evaluateAbortOutcome } from \"./session-reattach.ts\";\nimport {\n\ttype AnthropicSubscriptionSessionEntry,\n\ttype AnthropicSubscriptionSessionRegistry,\n\tcreateSessionUuid,\n} from \"./session-registry.ts\";\nimport {\n\ttransitionToIdleSynced,\n\ttransitionToTurnResultSeen,\n\ttransitionToTurnSent,\n\ttransitionToTurnStreaming,\n\ttransitionToTurnWaiting,\n} from \"./session-registry-state.ts\";\nimport { bufferBeforeReplay, claimTurn, deliver, isReplayFor, resultMatchesTurn } from \"./session-turn-claim.ts\";\nimport type { ActiveTurn, PreReplayBufferLimits, SessionTurnResult } from \"./session-turn-types.ts\";\n\nexport type { SessionTurnResult } from \"./session-turn-types.ts\";\n\nimport { SessionTurnAttributionError } from \"./session-turn-types.ts\";\n\nexport const DEFAULT_PRE_REPLAY_MAX_MESSAGES = 64;\nexport const DEFAULT_PRE_REPLAY_MAX_BYTES = 256 * 1024;\nexport const SESSION_TURN_ABORT_GRACE_MS = 1_000;\n\nexport interface SessionTurnRequest {\n\tmessage: SDKUserMessage[\"message\"];\n\tsignal?: AbortSignal;\n\tonMessage?: (message: SDKMessage) => void;\n\tscheduleAbort?: (callback: () => void, delayMs: number) => () => void;\n}\n\nexport class ConcurrentSessionTurnAdmissionError extends Error {\n\treadonly code = \"claude_sdk_oauth_concurrent_turn_admission\";\n\n\tconstructor(sessionId: string) {\n\t\tsuper(`Concurrent Anthropic Subscription turn admission for session ${sessionId}`);\n\t\tthis.name = \"ConcurrentSessionTurnAdmissionError\";\n\t}\n}\n\nfunction currentTurn(entry: AnthropicSubscriptionSessionEntry): ActiveTurn | null {\n\treturn entry.activeTurn as ActiveTurn | null;\n}\n\nfunction scheduleAbort(callback: () => void, delayMs: number): () => void {\n\tconst timer = setTimeout(callback, delayMs);\n\ttimer.unref();\n\treturn () => clearTimeout(timer);\n}\n\nfunction removeAbortListener(turn: ActiveTurn): void {\n\tturn.signal?.removeEventListener(\"abort\", turn.onAbort);\n\tturn.cancelAbort?.();\n\tturn.cancelAbort = undefined;\n}\n\nfunction failTurn(\n\tregistry: AnthropicSubscriptionSessionRegistry,\n\tentry: AnthropicSubscriptionSessionEntry,\n\terror: Error,\n): void {\n\tconst turn = currentTurn(entry);\n\tif (turn) {\n\t\tremoveAbortListener(turn);\n\t\tentry.activeTurn = null;\n\t\tturn.reject(error);\n\t}\n\tif (registry.isCurrentGeneration(entry.senpiSessionId, entry.generation)) {\n\t\tregistry.closeSession(entry.senpiSessionId, error.message);\n\t}\n}\n\n/**\n * An interrupt that never produces a terminal result still ends the user's turn:\n * settle it as aborted and close only the query, so the binding survives and the\n * next turn reattaches. Rejecting here would drop the turn's continuity\n * observation and hand the following turn two.\n */\nfunction abortTurn(\n\tregistry: AnthropicSubscriptionSessionRegistry,\n\tentry: AnthropicSubscriptionSessionEntry,\n\tturn: ActiveTurn,\n\t_error: Error,\n): void {\n\tif (currentTurn(entry) !== turn || !registry.isCurrentGeneration(entry.senpiSessionId, turn.generation)) return;\n\tremoveAbortListener(turn);\n\tentry.activeTurn = null;\n\tregistry.closeSession(entry.senpiSessionId, \"abort_uncertain\");\n\tturn.resolve({ uuid: turn.uuid, messages: turn.messages, aborted: true });\n}\n\nfunction finishTurn(\n\tregistry: AnthropicSubscriptionSessionRegistry,\n\tentry: AnthropicSubscriptionSessionEntry,\n\tturn: ActiveTurn,\n\tmessage: Extract<SDKMessage, { type: \"result\" }>,\n): void {\n\tif (!resultMatchesTurn(message, turn)) {\n\t\tthrow new SessionTurnAttributionError(\n\t\t\t\"Anthropic Subscription result user_message_uuid did not match the active turn\",\n\t\t);\n\t}\n\tif (entry.state === \"TURN_CLAIMED\") transitionToTurnStreaming(entry);\n\tif (!turn.aborted) deliver(entry, turn, message);\n\ttransitionToTurnResultSeen(entry);\n\tremoveAbortListener(turn);\n\tentry.activeTurn = null;\n\tif (!turn.aborted || evaluateAbortOutcome(turn.interruptReceipt) === \"keep\") transitionToIdleSynced(entry);\n\telse registry.closeSession(entry.senpiSessionId, \"abort_uncertain\");\n\tturn.resolve({ uuid: turn.uuid, messages: turn.messages, aborted: turn.aborted });\n}\n\nfunction handleMessage(\n\tregistry: AnthropicSubscriptionSessionRegistry,\n\tentry: AnthropicSubscriptionSessionEntry,\n\tmessage: SDKMessage,\n): boolean {\n\t// A forked query mints a NEW session id (forkSession: true + resume): the\n\t// init message carries it, and it must be persisted BEFORE any turn-state\n\t// guard — otherwise subsequent reattach targets the original session and\n\t// the fork's content is lost.\n\tif (message.type === \"system\" && message.subtype === \"init\" && typeof message.session_id === \"string\") {\n\t\tif (message.session_id !== entry.sdkSessionId) entry.sdkSessionId = message.session_id;\n\t\tentry.sdkSessionIdConfirmed = true;\n\t}\n\tconst turn = currentTurn(entry);\n\tif (!turn || !registry.isCurrentGeneration(entry.senpiSessionId, turn.generation)) return false;\n\tif (!turn.claimed) {\n\t\tif (isReplayFor(message, turn.uuid)) {\n\t\t\tentry.sdkSessionIdConfirmed = true;\n\t\t\tfor (const buffered of claimTurn(entry, turn)) {\n\t\t\t\tif (buffered.type === \"result\") finishTurn(registry, entry, turn, buffered);\n\t\t\t\telse deliver(entry, turn, buffered);\n\t\t\t}\n\t\t} else if (message.type === \"stream_event\") bufferBeforeReplay(registry, entry, turn, message);\n\t\telse if (message.type === \"result\" && resultMatchesTurn(message, turn)) {\n\t\t\tconst failure = sdkResultFailure(message);\n\t\t\tif (failure) throw failure;\n\t\t\tfor (const buffered of claimTurn(entry, turn)) deliver(entry, turn, buffered);\n\t\t\tfinishTurn(registry, entry, turn, message);\n\t\t\treturn false;\n\t\t} else if (message.type === \"result\") {\n\t\t\t// A result that fails before the SDK ever echoed our user message (a\n\t\t\t// 400 version floor, a session limit) must surface as that failure so\n\t\t\t// failover can classify and rotate; only a genuine success-before-claim\n\t\t\t// is an attribution error.\n\t\t\tthrow (\n\t\t\t\tsdkResultFailure(message) ??\n\t\t\t\tnew SessionTurnAttributionError(\"Anthropic Subscription result arrived before replay claim\")\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t}\n\tif (message.type === \"user\" && \"isReplay\" in message && message.isReplay === true) return false;\n\tconst refusal = refusalError(message);\n\tif (refusal) {\n\t\tfailTurn(registry, entry, refusal);\n\t\treturn true;\n\t}\n\tif (message.type === \"result\") {\n\t\tconst failure = sdkResultFailure(message);\n\t\tif (failure) {\n\t\t\tfailTurn(registry, entry, failure);\n\t\t\treturn true;\n\t\t}\n\t\tfinishTurn(registry, entry, turn, message);\n\t} else deliver(entry, turn, message);\n\treturn false;\n}\n\nasync function runPump(\n\tregistry: AnthropicSubscriptionSessionRegistry,\n\tentry: AnthropicSubscriptionSessionEntry,\n): Promise<void> {\n\tconst iterator = entry.query[Symbol.asyncIterator]();\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { value, done } = await iterator.next();\n\t\t\tif (done) {\n\t\t\t\tfailTurn(registry, entry, new Error(\"Anthropic Subscription query ended before the active turn completed\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (handleMessage(registry, entry, value)) return;\n\t\t}\n\t} catch (error) {\n\t\tfailTurn(registry, entry, error instanceof Error ? error : new Error(String(error)));\n\t}\n}\n\nexport function submitSessionTurn(\n\tregistry: AnthropicSubscriptionSessionRegistry,\n\tentry: AnthropicSubscriptionSessionEntry,\n\trequest: SessionTurnRequest,\n\tlimits: PreReplayBufferLimits = {\n\t\tmaxMessages: DEFAULT_PRE_REPLAY_MAX_MESSAGES,\n\t\tmaxBytes: DEFAULT_PRE_REPLAY_MAX_BYTES,\n\t},\n): Promise<SessionTurnResult> {\n\tif (currentTurn(entry)) throw new ConcurrentSessionTurnAdmissionError(entry.senpiSessionId);\n\tif (entry.state === \"STARTING\") transitionToIdleSynced(entry);\n\ttransitionToTurnWaiting(entry);\n\tconst uuid = createSessionUuid();\n\tlet turn!: ActiveTurn;\n\tconst promise = new Promise<SessionTurnResult>((resolve, reject) => {\n\t\tconst onAbort = (): void => {\n\t\t\tif (turn.aborted) return;\n\t\t\tturn.aborted = true;\n\t\t\tturn.cancelAbort = (request.scheduleAbort ?? scheduleAbort)(\n\t\t\t\t() =>\n\t\t\t\t\tabortTurn(registry, entry, turn, new Error(\"Anthropic Subscription interrupted turn did not terminate\")),\n\t\t\t\tSESSION_TURN_ABORT_GRACE_MS,\n\t\t\t);\n\t\t\tvoid entry.query\n\t\t\t\t.interrupt()\n\t\t\t\t.then((receipt: unknown) => {\n\t\t\t\t\tturn.interruptReceipt = receipt;\n\t\t\t\t})\n\t\t\t\t.catch((error: unknown) => {\n\t\t\t\t\tconst detail = error instanceof Error ? error.message : String(error);\n\t\t\t\t\tabortTurn(registry, entry, turn, new Error(`Anthropic Subscription query interrupt failed: ${detail}`));\n\t\t\t\t});\n\t\t};\n\t\tturn = {\n\t\t\tuuid,\n\t\t\tgeneration: entry.generation,\n\t\t\tmessages: [],\n\t\t\tpreReplay: [],\n\t\t\tpreReplayBytes: 0,\n\t\t\tclaimed: false,\n\t\t\taborted: false,\n\t\t\tonMessage: request.onMessage,\n\t\t\tsignal: request.signal,\n\t\t\tonAbort,\n\t\t\tresolve,\n\t\t\treject,\n\t\t\tlimits,\n\t\t};\n\t});\n\tentry.activeTurn = turn;\n\tif (!entry.pumpTask) entry.pumpTask = runPump(registry, entry);\n\tentry.inputController.push({\n\t\ttype: \"user\",\n\t\tmessage: request.message,\n\t\tparent_tool_use_id: null,\n\t\tuuid,\n\t\tsession_id: entry.sdkSessionId,\n\t});\n\ttransitionToTurnSent(entry);\n\tif (request.signal?.aborted) turn.onAbort();\n\telse request.signal?.addEventListener(\"abort\", turn.onAbort, { once: true });\n\treturn promise;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-registry-pump.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-subscription/session-registry-pump.ts"],"names":[],"mappings":"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","sourcesContent":["import { sdkResultFailure } from \"./errors.ts\";\nimport { refusalError } from \"./refusal.ts\";\nimport type { SDKMessage, SDKUserMessage } from \"./sdk-boundary.ts\";\nimport { evaluateAbortOutcome } from \"./session-reattach.ts\";\nimport {\n\ttype AnthropicSubscriptionSessionEntry,\n\ttype AnthropicSubscriptionSessionRegistry,\n\tcreateSessionUuid,\n} from \"./session-registry.ts\";\nimport {\n\ttransitionToIdleSynced,\n\ttransitionToTurnResultSeen,\n\ttransitionToTurnSent,\n\ttransitionToTurnStreaming,\n\ttransitionToTurnWaiting,\n} from \"./session-registry-state.ts\";\nimport {\n\tbufferBeforeReplay,\n\tclaimTurn,\n\tdeliver,\n\tendForeignTurnBeforeReplay,\n\tisForeignResult,\n\tisReplayFor,\n\tresultMatchesTurn,\n} from \"./session-turn-claim.ts\";\nimport type { ActiveTurn, PreReplayBufferLimits, SessionTurnResult } from \"./session-turn-types.ts\";\n\nexport type { SessionTurnResult } from \"./session-turn-types.ts\";\n\nimport { SessionTurnAttributionError } from \"./session-turn-types.ts\";\n\nexport const DEFAULT_PRE_REPLAY_MAX_MESSAGES = 64;\nexport const DEFAULT_PRE_REPLAY_MAX_BYTES = 256 * 1024;\nexport const SESSION_TURN_ABORT_GRACE_MS = 1_000;\n\nexport interface SessionTurnRequest {\n\tmessage: SDKUserMessage[\"message\"];\n\tsignal?: AbortSignal;\n\tonMessage?: (message: SDKMessage) => void;\n\tscheduleAbort?: (callback: () => void, delayMs: number) => () => void;\n}\n\nexport class ConcurrentSessionTurnAdmissionError extends Error {\n\treadonly code = \"claude_sdk_oauth_concurrent_turn_admission\";\n\n\tconstructor(sessionId: string) {\n\t\tsuper(`Concurrent Anthropic Subscription turn admission for session ${sessionId}`);\n\t\tthis.name = \"ConcurrentSessionTurnAdmissionError\";\n\t}\n}\n\nfunction currentTurn(entry: AnthropicSubscriptionSessionEntry): ActiveTurn | null {\n\treturn entry.activeTurn as ActiveTurn | null;\n}\n\nfunction scheduleAbort(callback: () => void, delayMs: number): () => void {\n\tconst timer = setTimeout(callback, delayMs);\n\ttimer.unref();\n\treturn () => clearTimeout(timer);\n}\n\nfunction removeAbortListener(turn: ActiveTurn): void {\n\tturn.signal?.removeEventListener(\"abort\", turn.onAbort);\n\tturn.cancelAbort?.();\n\tturn.cancelAbort = undefined;\n}\n\nfunction failTurn(\n\tregistry: AnthropicSubscriptionSessionRegistry,\n\tentry: AnthropicSubscriptionSessionEntry,\n\terror: Error,\n): void {\n\tconst turn = currentTurn(entry);\n\tif (turn) {\n\t\tremoveAbortListener(turn);\n\t\tentry.activeTurn = null;\n\t\tturn.reject(error);\n\t}\n\tif (registry.isCurrentGeneration(entry.senpiSessionId, entry.generation)) {\n\t\tregistry.closeSession(entry.senpiSessionId, error.message);\n\t}\n}\n\n/**\n * An interrupt that never produces a terminal result still ends the user's turn:\n * settle it as aborted and close only the query, so the binding survives and the\n * next turn reattaches. Rejecting here would drop the turn's continuity\n * observation and hand the following turn two.\n */\nfunction abortTurn(\n\tregistry: AnthropicSubscriptionSessionRegistry,\n\tentry: AnthropicSubscriptionSessionEntry,\n\tturn: ActiveTurn,\n\t_error: Error,\n): void {\n\tif (currentTurn(entry) !== turn || !registry.isCurrentGeneration(entry.senpiSessionId, turn.generation)) return;\n\tremoveAbortListener(turn);\n\tentry.activeTurn = null;\n\tregistry.closeSession(entry.senpiSessionId, \"abort_uncertain\");\n\tturn.resolve({ uuid: turn.uuid, messages: turn.messages, aborted: true });\n}\n\nfunction finishTurn(\n\tregistry: AnthropicSubscriptionSessionRegistry,\n\tentry: AnthropicSubscriptionSessionEntry,\n\tturn: ActiveTurn,\n\tmessage: Extract<SDKMessage, { type: \"result\" }>,\n): void {\n\tif (!resultMatchesTurn(message, turn)) {\n\t\tthrow new SessionTurnAttributionError(\n\t\t\t\"Anthropic Subscription result user_message_uuid did not match the active turn\",\n\t\t);\n\t}\n\tif (entry.state === \"TURN_CLAIMED\") transitionToTurnStreaming(entry);\n\tif (!turn.aborted) deliver(entry, turn, message);\n\ttransitionToTurnResultSeen(entry);\n\tremoveAbortListener(turn);\n\tentry.activeTurn = null;\n\tif (!turn.aborted || evaluateAbortOutcome(turn.interruptReceipt) === \"keep\") transitionToIdleSynced(entry);\n\telse registry.closeSession(entry.senpiSessionId, \"abort_uncertain\");\n\tturn.resolve({ uuid: turn.uuid, messages: turn.messages, aborted: turn.aborted });\n}\n\nfunction handleMessage(\n\tregistry: AnthropicSubscriptionSessionRegistry,\n\tentry: AnthropicSubscriptionSessionEntry,\n\tmessage: SDKMessage,\n): boolean {\n\t// A forked query mints a NEW session id (forkSession: true + resume): the\n\t// init message carries it, and it must be persisted BEFORE any turn-state\n\t// guard — otherwise subsequent reattach targets the original session and\n\t// the fork's content is lost.\n\tif (message.type === \"system\" && message.subtype === \"init\" && typeof message.session_id === \"string\") {\n\t\tif (message.session_id !== entry.sdkSessionId) entry.sdkSessionId = message.session_id;\n\t\tentry.sdkSessionIdConfirmed = true;\n\t}\n\tconst turn = currentTurn(entry);\n\tif (!turn || !registry.isCurrentGeneration(entry.senpiSessionId, turn.generation)) return false;\n\tif (!turn.claimed) {\n\t\tif (isReplayFor(message, turn.uuid)) {\n\t\t\tentry.sdkSessionIdConfirmed = true;\n\t\t\tfor (const buffered of claimTurn(entry, turn)) {\n\t\t\t\tif (buffered.type === \"result\") finishTurn(registry, entry, turn, buffered);\n\t\t\t\telse deliver(entry, turn, buffered);\n\t\t\t}\n\t\t} else if (message.type === \"stream_event\") bufferBeforeReplay(registry, entry, turn, message);\n\t\telse if (message.type === \"result\" && resultMatchesTurn(message, turn)) {\n\t\t\tconst failure = sdkResultFailure(message);\n\t\t\tif (failure) throw failure;\n\t\t\tfor (const buffered of claimTurn(entry, turn)) deliver(entry, turn, buffered);\n\t\t\tfinishTurn(registry, entry, turn, message);\n\t\t\treturn false;\n\t\t} else if (message.type === \"result\" && isForeignResult(message, turn)) {\n\t\t\tendForeignTurnBeforeReplay(turn);\n\t\t} else if (message.type === \"result\") {\n\t\t\t// A result that fails before the SDK ever echoed our user message (a\n\t\t\t// 400 version floor, a session limit) must surface as that failure so\n\t\t\t// failover can classify and rotate; only a genuine success-before-claim\n\t\t\t// is an attribution error.\n\t\t\tthrow (\n\t\t\t\tsdkResultFailure(message) ??\n\t\t\t\tnew SessionTurnAttributionError(\"Anthropic Subscription result arrived before replay claim\")\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t}\n\tif (message.type === \"user\" && \"isReplay\" in message && message.isReplay === true) return false;\n\tconst refusal = refusalError(message);\n\tif (refusal) {\n\t\tfailTurn(registry, entry, refusal);\n\t\treturn true;\n\t}\n\tif (message.type === \"result\") {\n\t\tconst failure = sdkResultFailure(message);\n\t\tif (failure) {\n\t\t\tfailTurn(registry, entry, failure);\n\t\t\treturn true;\n\t\t}\n\t\tfinishTurn(registry, entry, turn, message);\n\t} else deliver(entry, turn, message);\n\treturn false;\n}\n\nasync function runPump(\n\tregistry: AnthropicSubscriptionSessionRegistry,\n\tentry: AnthropicSubscriptionSessionEntry,\n): Promise<void> {\n\tconst iterator = entry.query[Symbol.asyncIterator]();\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { value, done } = await iterator.next();\n\t\t\tif (done) {\n\t\t\t\tfailTurn(registry, entry, new Error(\"Anthropic Subscription query ended before the active turn completed\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (handleMessage(registry, entry, value)) return;\n\t\t}\n\t} catch (error) {\n\t\tfailTurn(registry, entry, error instanceof Error ? error : new Error(String(error)));\n\t}\n}\n\nexport function submitSessionTurn(\n\tregistry: AnthropicSubscriptionSessionRegistry,\n\tentry: AnthropicSubscriptionSessionEntry,\n\trequest: SessionTurnRequest,\n\tlimits: PreReplayBufferLimits = {\n\t\tmaxMessages: DEFAULT_PRE_REPLAY_MAX_MESSAGES,\n\t\tmaxBytes: DEFAULT_PRE_REPLAY_MAX_BYTES,\n\t},\n): Promise<SessionTurnResult> {\n\tif (currentTurn(entry)) throw new ConcurrentSessionTurnAdmissionError(entry.senpiSessionId);\n\tif (entry.state === \"STARTING\") transitionToIdleSynced(entry);\n\ttransitionToTurnWaiting(entry);\n\tconst uuid = createSessionUuid();\n\tlet turn!: ActiveTurn;\n\tconst promise = new Promise<SessionTurnResult>((resolve, reject) => {\n\t\tconst onAbort = (): void => {\n\t\t\tif (turn.aborted) return;\n\t\t\tturn.aborted = true;\n\t\t\tturn.cancelAbort = (request.scheduleAbort ?? scheduleAbort)(\n\t\t\t\t() =>\n\t\t\t\t\tabortTurn(registry, entry, turn, new Error(\"Anthropic Subscription interrupted turn did not terminate\")),\n\t\t\t\tSESSION_TURN_ABORT_GRACE_MS,\n\t\t\t);\n\t\t\tvoid entry.query\n\t\t\t\t.interrupt()\n\t\t\t\t.then((receipt: unknown) => {\n\t\t\t\t\tturn.interruptReceipt = receipt;\n\t\t\t\t})\n\t\t\t\t.catch((error: unknown) => {\n\t\t\t\t\tconst detail = error instanceof Error ? error.message : String(error);\n\t\t\t\t\tabortTurn(registry, entry, turn, new Error(`Anthropic Subscription query interrupt failed: ${detail}`));\n\t\t\t\t});\n\t\t};\n\t\tturn = {\n\t\t\tuuid,\n\t\t\tgeneration: entry.generation,\n\t\t\tmessages: [],\n\t\t\tpreReplay: [],\n\t\t\tpreReplayBytes: 0,\n\t\t\tpreReplayOverflowed: false,\n\t\t\tclaimed: false,\n\t\t\taborted: false,\n\t\t\tonMessage: request.onMessage,\n\t\t\tsignal: request.signal,\n\t\t\tonAbort,\n\t\t\tresolve,\n\t\t\treject,\n\t\t\tlimits,\n\t\t};\n\t});\n\tentry.activeTurn = turn;\n\tif (!entry.pumpTask) entry.pumpTask = runPump(registry, entry);\n\tentry.inputController.push({\n\t\ttype: \"user\",\n\t\tmessage: request.message,\n\t\tparent_tool_use_id: null,\n\t\tuuid,\n\t\tsession_id: entry.sdkSessionId,\n\t});\n\ttransitionToTurnSent(entry);\n\tif (request.signal?.aborted) turn.onAbort();\n\telse request.signal?.addEventListener(\"abort\", turn.onAbort, { once: true });\n\treturn promise;\n}\n"]}
|
|
@@ -2,12 +2,24 @@ import type { SDKMessage } from "./sdk-boundary.ts";
|
|
|
2
2
|
import type { AnthropicSubscriptionSessionEntry, AnthropicSubscriptionSessionRegistry } from "./session-registry.ts";
|
|
3
3
|
import type { ActiveTurn } from "./session-turn-types.ts";
|
|
4
4
|
export declare function deliver(entry: AnthropicSubscriptionSessionEntry, turn: ActiveTurn, message: SDKMessage): void;
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Claude Code echoes a submitted prompt before that turn's first API call, on the same ordered stream,
|
|
7
|
+
* so events ahead of our replay belong to a turn it is already running (an autonomous turn or a
|
|
8
|
+
* background subagent). Only main-thread events are held, as a bounded courtesy for an early event; a
|
|
9
|
+
* segment that outgrows the caps is another turn's and is dropped until that turn ends (senpi#2192).
|
|
10
|
+
*/
|
|
11
|
+
export declare function bufferBeforeReplay(registry: AnthropicSubscriptionSessionRegistry, entry: AnthropicSubscriptionSessionEntry, turn: ActiveTurn, message: Extract<SDKMessage, {
|
|
12
|
+
type: "stream_event";
|
|
13
|
+
}>): void;
|
|
14
|
+
export declare function endForeignTurnBeforeReplay(turn: ActiveTurn): void;
|
|
6
15
|
export declare function claimTurn(entry: AnthropicSubscriptionSessionEntry, turn: ActiveTurn): SDKMessage[];
|
|
7
16
|
export declare function isReplayFor(message: SDKMessage, uuid: string): boolean;
|
|
8
17
|
export declare function isAutonomousResult(message: Extract<SDKMessage, {
|
|
9
18
|
type: "result";
|
|
10
19
|
}>): boolean;
|
|
20
|
+
export declare function isForeignResult(message: Extract<SDKMessage, {
|
|
21
|
+
type: "result";
|
|
22
|
+
}>, turn: ActiveTurn): boolean;
|
|
11
23
|
export declare function resultMatchesTurn(message: Extract<SDKMessage, {
|
|
12
24
|
type: "result";
|
|
13
25
|
}>, turn: ActiveTurn): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-turn-claim.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-subscription/session-turn-claim.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iCAAiC,EAAE,oCAAoC,EAAE,MAAM,uBAAuB,CAAC;AAErH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-turn-claim.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-subscription/session-turn-claim.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iCAAiC,EAAE,oCAAoC,EAAE,MAAM,uBAAuB,CAAC;AAErH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,wBAAgB,OAAO,CAAC,KAAK,EAAE,iCAAiC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,CAI7G;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,oCAAoC,EAC9C,KAAK,EAAE,iCAAiC,EACxC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC,GACpD,IAAI,CAUN;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAGjE;AAOD,wBAAgB,SAAS,CAAC,KAAK,EAAE,iCAAiC,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,CAMlG;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,GAAG,OAAO,CAQ5F;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAK3G;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAK7G"}
|
|
@@ -1,21 +1,38 @@
|
|
|
1
1
|
import { Buffer } from "node:buffer";
|
|
2
2
|
import { transitionToTurnClaimed, transitionToTurnStreaming } from "./session-registry-state.js";
|
|
3
|
-
import { SessionTurnAttributionError } from "./session-turn-types.js";
|
|
4
3
|
export function deliver(entry, turn, message) {
|
|
5
4
|
if (entry.state === "TURN_CLAIMED")
|
|
6
5
|
transitionToTurnStreaming(entry);
|
|
7
6
|
turn.messages.push(message);
|
|
8
7
|
turn.onMessage?.(message);
|
|
9
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Claude Code echoes a submitted prompt before that turn's first API call, on the same ordered stream,
|
|
11
|
+
* so events ahead of our replay belong to a turn it is already running (an autonomous turn or a
|
|
12
|
+
* background subagent). Only main-thread events are held, as a bounded courtesy for an early event; a
|
|
13
|
+
* segment that outgrows the caps is another turn's and is dropped until that turn ends (senpi#2192).
|
|
14
|
+
*/
|
|
10
15
|
export function bufferBeforeReplay(registry, entry, turn, message) {
|
|
16
|
+
if (message.parent_tool_use_id !== null || turn.preReplayOverflowed)
|
|
17
|
+
return;
|
|
11
18
|
turn.preReplay.push(message);
|
|
12
19
|
turn.preReplayBytes += Buffer.byteLength(JSON.stringify(message));
|
|
13
20
|
if (turn.preReplay.length > turn.limits.maxMessages || turn.preReplayBytes > turn.limits.maxBytes) {
|
|
14
|
-
|
|
21
|
+
dropPreReplay(turn);
|
|
22
|
+
turn.preReplayOverflowed = true;
|
|
23
|
+
return;
|
|
15
24
|
}
|
|
16
25
|
if (!registry.isCurrentGeneration(entry.senpiSessionId, turn.generation))
|
|
17
26
|
turn.preReplay.length = 0;
|
|
18
27
|
}
|
|
28
|
+
export function endForeignTurnBeforeReplay(turn) {
|
|
29
|
+
dropPreReplay(turn);
|
|
30
|
+
turn.preReplayOverflowed = false;
|
|
31
|
+
}
|
|
32
|
+
function dropPreReplay(turn) {
|
|
33
|
+
turn.preReplay.length = 0;
|
|
34
|
+
turn.preReplayBytes = 0;
|
|
35
|
+
}
|
|
19
36
|
export function claimTurn(entry, turn) {
|
|
20
37
|
turn.claimed = true;
|
|
21
38
|
transitionToTurnClaimed(entry);
|
|
@@ -32,6 +49,12 @@ export function isAutonomousResult(message) {
|
|
|
32
49
|
const wire = message;
|
|
33
50
|
return wire.parent_tool_use_id != null || wire.subagent_type != null || wire.isSynthetic === true;
|
|
34
51
|
}
|
|
52
|
+
export function isForeignResult(message, turn) {
|
|
53
|
+
if ("user_message_uuid" in message && message.user_message_uuid !== undefined) {
|
|
54
|
+
return message.user_message_uuid !== turn.uuid;
|
|
55
|
+
}
|
|
56
|
+
return isAutonomousResult(message);
|
|
57
|
+
}
|
|
35
58
|
export function resultMatchesTurn(message, turn) {
|
|
36
59
|
if ("user_message_uuid" in message && message.user_message_uuid !== undefined) {
|
|
37
60
|
return message.user_message_uuid === turn.uuid;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-turn-claim.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-subscription/session-turn-claim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"session-turn-claim.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-subscription/session-turn-claim.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport type { SDKMessage } from \"./sdk-boundary.ts\";\nimport type { AnthropicSubscriptionSessionEntry, AnthropicSubscriptionSessionRegistry } from \"./session-registry.ts\";\nimport { transitionToTurnClaimed, transitionToTurnStreaming } from \"./session-registry-state.ts\";\nimport type { ActiveTurn } from \"./session-turn-types.ts\";\n\nexport function deliver(entry: AnthropicSubscriptionSessionEntry, turn: ActiveTurn, message: SDKMessage): void {\n\tif (entry.state === \"TURN_CLAIMED\") transitionToTurnStreaming(entry);\n\tturn.messages.push(message);\n\tturn.onMessage?.(message);\n}\n\n/**\n * Claude Code echoes a submitted prompt before that turn's first API call, on the same ordered stream,\n * so events ahead of our replay belong to a turn it is already running (an autonomous turn or a\n * background subagent). Only main-thread events are held, as a bounded courtesy for an early event; a\n * segment that outgrows the caps is another turn's and is dropped until that turn ends (senpi#2192).\n */\nexport function bufferBeforeReplay(\n\tregistry: AnthropicSubscriptionSessionRegistry,\n\tentry: AnthropicSubscriptionSessionEntry,\n\tturn: ActiveTurn,\n\tmessage: Extract<SDKMessage, { type: \"stream_event\" }>,\n): void {\n\tif (message.parent_tool_use_id !== null || turn.preReplayOverflowed) return;\n\tturn.preReplay.push(message);\n\tturn.preReplayBytes += Buffer.byteLength(JSON.stringify(message));\n\tif (turn.preReplay.length > turn.limits.maxMessages || turn.preReplayBytes > turn.limits.maxBytes) {\n\t\tdropPreReplay(turn);\n\t\tturn.preReplayOverflowed = true;\n\t\treturn;\n\t}\n\tif (!registry.isCurrentGeneration(entry.senpiSessionId, turn.generation)) turn.preReplay.length = 0;\n}\n\nexport function endForeignTurnBeforeReplay(turn: ActiveTurn): void {\n\tdropPreReplay(turn);\n\tturn.preReplayOverflowed = false;\n}\n\nfunction dropPreReplay(turn: ActiveTurn): void {\n\tturn.preReplay.length = 0;\n\tturn.preReplayBytes = 0;\n}\n\nexport function claimTurn(entry: AnthropicSubscriptionSessionEntry, turn: ActiveTurn): SDKMessage[] {\n\tturn.claimed = true;\n\ttransitionToTurnClaimed(entry);\n\tconst buffered = turn.preReplay.splice(0);\n\tturn.preReplayBytes = 0;\n\treturn buffered;\n}\n\nexport function isReplayFor(message: SDKMessage, uuid: string): boolean {\n\treturn message.type === \"user\" && \"isReplay\" in message && message.isReplay === true && message.uuid === uuid;\n}\n\nexport function isAutonomousResult(message: Extract<SDKMessage, { type: \"result\" }>): boolean {\n\tif (message.origin && message.origin.kind !== \"human\") return true;\n\tconst wire = message as SDKMessage & {\n\t\tparent_tool_use_id?: unknown;\n\t\tsubagent_type?: unknown;\n\t\tisSynthetic?: unknown;\n\t};\n\treturn wire.parent_tool_use_id != null || wire.subagent_type != null || wire.isSynthetic === true;\n}\n\nexport function isForeignResult(message: Extract<SDKMessage, { type: \"result\" }>, turn: ActiveTurn): boolean {\n\tif (\"user_message_uuid\" in message && message.user_message_uuid !== undefined) {\n\t\treturn message.user_message_uuid !== turn.uuid;\n\t}\n\treturn isAutonomousResult(message);\n}\n\nexport function resultMatchesTurn(message: Extract<SDKMessage, { type: \"result\" }>, turn: ActiveTurn): boolean {\n\tif (\"user_message_uuid\" in message && message.user_message_uuid !== undefined) {\n\t\treturn message.user_message_uuid === turn.uuid;\n\t}\n\treturn turn.claimed && !isAutonomousResult(message);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-turn-types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-subscription/session-turn-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,OAAO,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,MAAM,EAAE,qBAAqB,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,2BAA4B,SAAQ,KAAK;IACrD,QAAQ,CAAC,IAAI,uCAAuC;IAEpD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD"}
|
|
1
|
+
{"version":3,"file":"session-turn-types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-subscription/session-turn-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,OAAO,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,MAAM,EAAE,qBAAqB,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,2BAA4B,SAAQ,KAAK;IACrD,QAAQ,CAAC,IAAI,uCAAuC;IAEpD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-turn-types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-subscription/session-turn-types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-turn-types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-subscription/session-turn-types.ts"],"names":[],"mappings":"AAgCA,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAGrD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHP,SAAI,GAAG,mCAAmC,CAAC;QAInD,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC3C,CAAC;CACD","sourcesContent":["import type { SDKMessage } from \"./sdk-boundary.ts\";\n\nexport interface SessionTurnResult {\n\tuuid: string;\n\tmessages: SDKMessage[];\n\taborted: boolean;\n}\n\nexport interface ActiveTurn {\n\tuuid: string;\n\tgeneration: number;\n\tmessages: SDKMessage[];\n\tpreReplay: SDKMessage[];\n\tpreReplayBytes: number;\n\tpreReplayOverflowed: boolean;\n\tclaimed: boolean;\n\taborted: boolean;\n\tinterruptReceipt?: unknown;\n\tonMessage?: (message: SDKMessage) => void;\n\tsignal?: AbortSignal;\n\tonAbort: () => void;\n\tcancelAbort?: () => void;\n\tresolve: (result: SessionTurnResult) => void;\n\treject: (error: Error) => void;\n\tlimits: PreReplayBufferLimits;\n}\n\nexport interface PreReplayBufferLimits {\n\tmaxMessages: number;\n\tmaxBytes: number;\n}\n\nexport class SessionTurnAttributionError extends Error {\n\treadonly code = \"claude_sdk_oauth_turn_attribution\";\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"SessionTurnAttributionError\";\n\t}\n}\n"]}
|
|
@@ -21,6 +21,9 @@ export interface McpToolCatalogEntry {
|
|
|
21
21
|
}
|
|
22
22
|
type McpToolCatalogOptions = Pick<McpToolCatalogEntry, "agentDir" | "artifacts" | "ensureFresh" | "outputGuard">;
|
|
23
23
|
export declare function collectToolCatalog(server: string, connection: ServerConnection, config: McpServerConfig, options?: McpToolCatalogOptions): Promise<McpToolCatalogEntry[]>;
|
|
24
|
+
/** What registering these tools with this catalog's resources and prompts exposes;
|
|
25
|
+
* equal identities register identical definitions. */
|
|
26
|
+
export declare function mcpRegistrationIdentity(tools: readonly McpToolCatalogEntry[], catalog: McpCachedServerCatalog | undefined): string;
|
|
24
27
|
export declare function cachedToolsToCatalogEntries(server: string, catalog: McpCachedServerCatalog, connection: ServerConnection, requestTimeoutMs: number, ensureConnected: () => Promise<void>, options?: McpToolCatalogOptions): McpToolCatalogEntry[];
|
|
25
28
|
export {};
|
|
26
29
|
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,WAAW,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;CACzC;AAED,KAAK,qBAAqB,GAAG,IAAI,CAAC,mBAAmB,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,aAAa,CAAC,CAAC;AAEjH,wBAAsB,kBAAkB,CACvC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAiBhC;AAED,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,gBAAgB,EAC5B,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACpC,OAAO,GAAE,qBAA0B,GACjC,mBAAmB,EAAE,CAevB"}
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,WAAW,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;CACzC;AAED,KAAK,qBAAqB,GAAG,IAAI,CAAC,mBAAmB,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,aAAa,CAAC,CAAC;AAEjH,wBAAsB,kBAAkB,CACvC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAiBhC;AAED;sDACsD;AACtD,wBAAgB,uBAAuB,CACtC,KAAK,EAAE,SAAS,mBAAmB,EAAE,EACrC,OAAO,EAAE,sBAAsB,GAAG,SAAS,GACzC,MAAM,CAMR;AAED,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,gBAAgB,EAC5B,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACpC,OAAO,GAAE,qBAA0B,GACjC,mBAAmB,EAAE,CAevB"}
|
|
@@ -15,6 +15,15 @@ export async function collectToolCatalog(server, connection, config, options = {
|
|
|
15
15
|
tool: tool.name,
|
|
16
16
|
}));
|
|
17
17
|
}
|
|
18
|
+
/** What registering these tools with this catalog's resources and prompts exposes;
|
|
19
|
+
* equal identities register identical definitions. */
|
|
20
|
+
export function mcpRegistrationIdentity(tools, catalog) {
|
|
21
|
+
return JSON.stringify([
|
|
22
|
+
tools.map((entry) => [entry.tool, entry.description, entry.schema, entry.annotations]),
|
|
23
|
+
catalog?.resources ?? [],
|
|
24
|
+
catalog?.prompts ?? [],
|
|
25
|
+
]);
|
|
26
|
+
}
|
|
18
27
|
export function cachedToolsToCatalogEntries(server, catalog, connection, requestTimeoutMs, ensureConnected, options = {}) {
|
|
19
28
|
return catalog.tools.map((tool) => ({
|
|
20
29
|
annotations: tool.annotations,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/catalog.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAuBzD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,MAAc,EACd,UAA4B,EAC5B,MAAuB,EACvB,OAAO,GAA0B,EAAE;IAEnC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAa,CAAC,MAAM,EAAE,EAAE,CAC3D,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CACzG,CAAC;IACF,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU;QACV,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,MAAM,EAAE,IAAI,CAAC,WAAW;QACxB,MAAM;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;KACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,2BAA2B,CAC1C,MAAc,EACd,OAA+B,EAC/B,UAA4B,EAC5B,gBAAwB,EACxB,eAAoC,EACpC,OAAO,GAA0B,EAAE;IAEnC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU;QACV,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,eAAe;QACf,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,gBAAgB;QAChB,MAAM,EAAE,IAAI,CAAC,WAAW;QACxB,MAAM;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;KACf,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { McpCachedServerCatalog } from \"./catalog-cache.ts\";\nimport type { McpServerConfig, McpSettings } from \"./config-schema.ts\";\nimport type { ServerConnection } from \"./connection.ts\";\nimport { collectAllPages } from \"./expose/pagination.ts\";\nimport type { McpOutputArtifacts } from \"./guard/output-guard.ts\";\nimport type { McpEnsureFreshAuth } from \"./health.ts\";\n\ntype ListedTool = Awaited<ReturnType<Client[\"listTools\"]>>[\"tools\"][number];\n\nexport interface McpToolCatalogEntry {\n\tserver: string;\n\ttool: string;\n\tschema: ListedTool[\"inputSchema\"];\n\tdescription?: string;\n\tannotations?: ListedTool[\"annotations\"];\n\trequestTimeoutMs: number;\n\tconnection: ServerConnection;\n\tensureConnected?: () => Promise<void>;\n\tensureFresh?: McpEnsureFreshAuth;\n\tagentDir?: string;\n\tartifacts?: McpOutputArtifacts;\n\toutputGuard?: McpSettings[\"outputGuard\"];\n}\n\ntype McpToolCatalogOptions = Pick<McpToolCatalogEntry, \"agentDir\" | \"artifacts\" | \"ensureFresh\" | \"outputGuard\">;\n\nexport async function collectToolCatalog(\n\tserver: string,\n\tconnection: ServerConnection,\n\tconfig: McpServerConfig,\n\toptions: McpToolCatalogOptions = {},\n): Promise<McpToolCatalogEntry[]> {\n\tconst result = await collectAllPages<ListedTool>((cursor) =>\n\t\tconnection.client.listTools(cursor === undefined ? {} : { cursor }, { timeout: config.requestTimeoutMs }),\n\t);\n\treturn result.items.map((tool) => ({\n\t\tannotations: tool.annotations,\n\t\tagentDir: options.agentDir,\n\t\tartifacts: options.artifacts,\n\t\tconnection,\n\t\tdescription: tool.description,\n\t\tensureFresh: options.ensureFresh,\n\t\toutputGuard: options.outputGuard,\n\t\trequestTimeoutMs: config.requestTimeoutMs,\n\t\tschema: tool.inputSchema,\n\t\tserver,\n\t\ttool: tool.name,\n\t}));\n}\n\nexport function cachedToolsToCatalogEntries(\n\tserver: string,\n\tcatalog: McpCachedServerCatalog,\n\tconnection: ServerConnection,\n\trequestTimeoutMs: number,\n\tensureConnected: () => Promise<void>,\n\toptions: McpToolCatalogOptions = {},\n): McpToolCatalogEntry[] {\n\treturn catalog.tools.map((tool) => ({\n\t\tannotations: tool.annotations,\n\t\tagentDir: options.agentDir,\n\t\tartifacts: options.artifacts,\n\t\tconnection,\n\t\tdescription: tool.description,\n\t\tensureConnected,\n\t\tensureFresh: options.ensureFresh,\n\t\toutputGuard: options.outputGuard,\n\t\trequestTimeoutMs,\n\t\tschema: tool.inputSchema,\n\t\tserver,\n\t\ttool: tool.name,\n\t}));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/catalog.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAuBzD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,MAAc,EACd,UAA4B,EAC5B,MAAuB,EACvB,OAAO,GAA0B,EAAE;IAEnC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAa,CAAC,MAAM,EAAE,EAAE,CAC3D,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CACzG,CAAC;IACF,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU;QACV,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,MAAM,EAAE,IAAI,CAAC,WAAW;QACxB,MAAM;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;KACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;sDACsD;AACtD,MAAM,UAAU,uBAAuB,CACtC,KAAqC,EACrC,OAA2C;IAE3C,OAAO,IAAI,CAAC,SAAS,CAAC;QACrB,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACtF,OAAO,EAAE,SAAS,IAAI,EAAE;QACxB,OAAO,EAAE,OAAO,IAAI,EAAE;KACtB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CAC1C,MAAc,EACd,OAA+B,EAC/B,UAA4B,EAC5B,gBAAwB,EACxB,eAAoC,EACpC,OAAO,GAA0B,EAAE;IAEnC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU;QACV,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,eAAe;QACf,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,gBAAgB;QAChB,MAAM,EAAE,IAAI,CAAC,WAAW;QACxB,MAAM;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;KACf,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { McpCachedServerCatalog } from \"./catalog-cache.ts\";\nimport type { McpServerConfig, McpSettings } from \"./config-schema.ts\";\nimport type { ServerConnection } from \"./connection.ts\";\nimport { collectAllPages } from \"./expose/pagination.ts\";\nimport type { McpOutputArtifacts } from \"./guard/output-guard.ts\";\nimport type { McpEnsureFreshAuth } from \"./health.ts\";\n\ntype ListedTool = Awaited<ReturnType<Client[\"listTools\"]>>[\"tools\"][number];\n\nexport interface McpToolCatalogEntry {\n\tserver: string;\n\ttool: string;\n\tschema: ListedTool[\"inputSchema\"];\n\tdescription?: string;\n\tannotations?: ListedTool[\"annotations\"];\n\trequestTimeoutMs: number;\n\tconnection: ServerConnection;\n\tensureConnected?: () => Promise<void>;\n\tensureFresh?: McpEnsureFreshAuth;\n\tagentDir?: string;\n\tartifacts?: McpOutputArtifacts;\n\toutputGuard?: McpSettings[\"outputGuard\"];\n}\n\ntype McpToolCatalogOptions = Pick<McpToolCatalogEntry, \"agentDir\" | \"artifacts\" | \"ensureFresh\" | \"outputGuard\">;\n\nexport async function collectToolCatalog(\n\tserver: string,\n\tconnection: ServerConnection,\n\tconfig: McpServerConfig,\n\toptions: McpToolCatalogOptions = {},\n): Promise<McpToolCatalogEntry[]> {\n\tconst result = await collectAllPages<ListedTool>((cursor) =>\n\t\tconnection.client.listTools(cursor === undefined ? {} : { cursor }, { timeout: config.requestTimeoutMs }),\n\t);\n\treturn result.items.map((tool) => ({\n\t\tannotations: tool.annotations,\n\t\tagentDir: options.agentDir,\n\t\tartifacts: options.artifacts,\n\t\tconnection,\n\t\tdescription: tool.description,\n\t\tensureFresh: options.ensureFresh,\n\t\toutputGuard: options.outputGuard,\n\t\trequestTimeoutMs: config.requestTimeoutMs,\n\t\tschema: tool.inputSchema,\n\t\tserver,\n\t\ttool: tool.name,\n\t}));\n}\n\n/** What registering these tools with this catalog's resources and prompts exposes;\n * equal identities register identical definitions. */\nexport function mcpRegistrationIdentity(\n\ttools: readonly McpToolCatalogEntry[],\n\tcatalog: McpCachedServerCatalog | undefined,\n): string {\n\treturn JSON.stringify([\n\t\ttools.map((entry) => [entry.tool, entry.description, entry.schema, entry.annotations]),\n\t\tcatalog?.resources ?? [],\n\t\tcatalog?.prompts ?? [],\n\t]);\n}\n\nexport function cachedToolsToCatalogEntries(\n\tserver: string,\n\tcatalog: McpCachedServerCatalog,\n\tconnection: ServerConnection,\n\trequestTimeoutMs: number,\n\tensureConnected: () => Promise<void>,\n\toptions: McpToolCatalogOptions = {},\n): McpToolCatalogEntry[] {\n\treturn catalog.tools.map((tool) => ({\n\t\tannotations: tool.annotations,\n\t\tagentDir: options.agentDir,\n\t\tartifacts: options.artifacts,\n\t\tconnection,\n\t\tdescription: tool.description,\n\t\tensureConnected,\n\t\tensureFresh: options.ensureFresh,\n\t\toutputGuard: options.outputGuard,\n\t\trequestTimeoutMs,\n\t\tschema: tool.inputSchema,\n\t\tserver,\n\t\ttool: tool.name,\n\t}));\n}\n"]}
|
|
@@ -15,6 +15,8 @@ export type ServerConnectionToolsChangedEvent = {
|
|
|
15
15
|
readonly type: "tools_changed";
|
|
16
16
|
readonly serverName: string;
|
|
17
17
|
readonly generation: number;
|
|
18
|
+
/** `connect`: raised by every successful connect; `notification`: anything that reports a change. */
|
|
19
|
+
readonly cause: "connect" | "notification";
|
|
18
20
|
};
|
|
19
21
|
export interface ServerConnectionOptions {
|
|
20
22
|
readonly serverName: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/connection-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,MAAM,qBAAqB,GAC9B,UAAU,GACV,MAAM,GACN,YAAY,GACZ,WAAW,GACX,UAAU,GACV,WAAW,GACX,YAAY,GACZ,2BAA2B,CAAC;AAE/B,MAAM,MAAM,iCAAiC,GAAG;IAC/C,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC/C,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"connection-types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/connection-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,MAAM,qBAAqB,GAC9B,UAAU,GACV,MAAM,GACN,YAAY,GACZ,WAAW,GACX,UAAU,GACV,WAAW,GACX,YAAY,GACZ,2BAA2B,CAAC;AAE/B,MAAM,MAAM,iCAAiC,GAAG;IAC/C,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC/C,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,qGAAqG;IACrG,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,cAAc,CAAC;CAC3C,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAClD,QAAQ,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC;IACzC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,wBAAwB,CAAC;CAC1D;AAED,MAAM,MAAM,wBAAwB,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/connection-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { McpOAuthProvider } from \"./auth/oauth-provider.ts\";\nimport type { McpServerConfig } from \"./config-schema.ts\";\nimport type { McpElicitationUiProvider } from \"./elicitation.ts\";\nimport type { McpLogger } from \"./log.ts\";\n\nexport type ServerConnectionState =\n\t| \"disabled\"\n\t| \"idle\"\n\t| \"connecting\"\n\t| \"connected\"\n\t| \"degraded\"\n\t| \"suspended\"\n\t| \"needs_auth\"\n\t| \"needs_client_registration\";\n\nexport type ServerConnectionStateChangedEvent = {\n\treadonly type: \"state_changed\";\n\treadonly serverName: string;\n\treadonly generation: number;\n\treadonly state: ServerConnectionState;\n\treadonly previousState: ServerConnectionState;\n\treadonly error?: Error;\n};\n\nexport type ServerConnectionToolsChangedEvent = {\n\treadonly type: \"tools_changed\";\n\treadonly serverName: string;\n\treadonly generation: number;\n};\n\nexport interface ServerConnectionOptions {\n\treadonly serverName: string;\n\treadonly config: McpServerConfig;\n\treadonly logger: McpLogger;\n\treadonly env?: Record<string, string | undefined>;\n\treadonly authProvider?: McpOAuthProvider;\n\treadonly elicitationUiProvider?: McpElicitationUiProvider;\n}\n\nexport type ServerConnectionListener<TEvent> = (event: TEvent) => void | Promise<void>;\n"]}
|
|
1
|
+
{"version":3,"file":"connection-types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/connection-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { McpOAuthProvider } from \"./auth/oauth-provider.ts\";\nimport type { McpServerConfig } from \"./config-schema.ts\";\nimport type { McpElicitationUiProvider } from \"./elicitation.ts\";\nimport type { McpLogger } from \"./log.ts\";\n\nexport type ServerConnectionState =\n\t| \"disabled\"\n\t| \"idle\"\n\t| \"connecting\"\n\t| \"connected\"\n\t| \"degraded\"\n\t| \"suspended\"\n\t| \"needs_auth\"\n\t| \"needs_client_registration\";\n\nexport type ServerConnectionStateChangedEvent = {\n\treadonly type: \"state_changed\";\n\treadonly serverName: string;\n\treadonly generation: number;\n\treadonly state: ServerConnectionState;\n\treadonly previousState: ServerConnectionState;\n\treadonly error?: Error;\n};\n\nexport type ServerConnectionToolsChangedEvent = {\n\treadonly type: \"tools_changed\";\n\treadonly serverName: string;\n\treadonly generation: number;\n\t/** `connect`: raised by every successful connect; `notification`: anything that reports a change. */\n\treadonly cause: \"connect\" | \"notification\";\n};\n\nexport interface ServerConnectionOptions {\n\treadonly serverName: string;\n\treadonly config: McpServerConfig;\n\treadonly logger: McpLogger;\n\treadonly env?: Record<string, string | undefined>;\n\treadonly authProvider?: McpOAuthProvider;\n\treadonly elicitationUiProvider?: McpElicitationUiProvider;\n}\n\nexport type ServerConnectionListener<TEvent> = (event: TEvent) => void | Promise<void>;\n"]}
|
|
@@ -20,7 +20,7 @@ export declare class ServerConnection {
|
|
|
20
20
|
markSuspended(error?: Error): void;
|
|
21
21
|
markNeedsAuth(error?: Error): void;
|
|
22
22
|
markNeedsClientRegistration(error?: Error): void;
|
|
23
|
-
markToolsChanged(): void;
|
|
23
|
+
markToolsChanged(cause?: ServerConnectionToolsChangedEvent["cause"]): void;
|
|
24
24
|
onStateChange(listener: ServerConnectionListener<ServerConnectionStateChangedEvent>): () => void;
|
|
25
25
|
onToolsChanged(listener: ServerConnectionListener<ServerConnectionToolsChangedEvent>): () => void;
|
|
26
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAExE,OAAO,KAAK,EACX,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,iCAAiC,EACjC,iCAAiC,EACjC,MAAM,uBAAuB,CAAC;AAgB/B,YAAY,EACX,uBAAuB,EACvB,qBAAqB,EACrB,iCAAiC,EACjC,iCAAiC,GACjC,MAAM,uBAAuB,CAAC;AAE/B,qBAAa,gBAAgB;;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAgB5B,YAAY,OAAO,EAAE,uBAAuB,EAQ3C;IAED,IAAI,KAAK,IAAI,qBAAqB,CAEjC;IACD,IAAI,SAAS,IAAI,KAAK,GAAG,SAAS,CAEjC;IACD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,0BAA0B,IAAI,IAAI,CAajC;IAED,IAAI,MAAM,IAAI,MAAM,CAQnB;IAED,UAAU,IAAI,MAAM,GAAG,IAAI,CAE1B;IACD,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAYzB;IAgBK,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAS7B;IAED,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAM9B;IAED,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAMvB;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7B;IAED,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAE/B;IACD,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAEjC;IACD,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAEjC;IACD,2BAA2B,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAE/C;IAED,gBAAgB,
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAExE,OAAO,KAAK,EACX,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,iCAAiC,EACjC,iCAAiC,EACjC,MAAM,uBAAuB,CAAC;AAgB/B,YAAY,EACX,uBAAuB,EACvB,qBAAqB,EACrB,iCAAiC,EACjC,iCAAiC,GACjC,MAAM,uBAAuB,CAAC;AAE/B,qBAAa,gBAAgB;;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAgB5B,YAAY,OAAO,EAAE,uBAAuB,EAQ3C;IAED,IAAI,KAAK,IAAI,qBAAqB,CAEjC;IACD,IAAI,SAAS,IAAI,KAAK,GAAG,SAAS,CAEjC;IACD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,0BAA0B,IAAI,IAAI,CAajC;IAED,IAAI,MAAM,IAAI,MAAM,CAQnB;IAED,UAAU,IAAI,MAAM,GAAG,IAAI,CAE1B;IACD,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAYzB;IAgBK,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAS7B;IAED,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAM9B;IAED,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAMvB;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7B;IAED,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAE/B;IACD,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAEjC;IACD,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAEjC;IACD,2BAA2B,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAE/C;IAED,gBAAgB,CAAC,KAAK,GAAE,iCAAiC,CAAC,OAAO,CAAkB,GAAG,IAAI,CAOzF;IAED,aAAa,CAAC,QAAQ,EAAE,wBAAwB,CAAC,iCAAiC,CAAC,GAAG,MAAM,IAAI,CAG/F;IAED,cAAc,CAAC,QAAQ,EAAE,wBAAwB,CAAC,iCAAiC,CAAC,GAAG,MAAM,IAAI,CAGhG;CA+ID"}
|
|
@@ -140,11 +140,12 @@ export class ServerConnection {
|
|
|
140
140
|
markNeedsClientRegistration(error) {
|
|
141
141
|
this.#markFailure("needs_client_registration", error);
|
|
142
142
|
}
|
|
143
|
-
markToolsChanged() {
|
|
143
|
+
markToolsChanged(cause = "notification") {
|
|
144
144
|
this.#emit(this.#toolsListeners, {
|
|
145
145
|
type: "tools_changed",
|
|
146
146
|
serverName: this.serverName,
|
|
147
147
|
generation: this.#generation,
|
|
148
|
+
cause,
|
|
148
149
|
});
|
|
149
150
|
}
|
|
150
151
|
onStateChange(listener) {
|
|
@@ -233,7 +234,7 @@ export class ServerConnection {
|
|
|
233
234
|
// logger, filtered by config.logLevel, burst-capped.
|
|
234
235
|
subscribeMcpServerLogging(connection.client, { logLevel: this.#config.logLevel, logger: this.#logger });
|
|
235
236
|
this.#setState("connected");
|
|
236
|
-
this.markToolsChanged();
|
|
237
|
+
this.markToolsChanged("connect");
|
|
237
238
|
return connection.client;
|
|
238
239
|
}
|
|
239
240
|
async #disposeOwnedConnections() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/connection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { McpOAuthProvider } from \"./auth/oauth-provider.ts\";\nimport type {\n\tServerConnectionListener,\n\tServerConnectionOptions,\n\tServerConnectionState,\n\tServerConnectionStateChangedEvent,\n\tServerConnectionToolsChangedEvent,\n} from \"./connection-types.ts\";\nimport { diagnoseCapturedMcpConnectFailure, diagnoseMcpConnectFailure } from \"./diagnose.ts\";\nimport { ConnectError } from \"./errors.ts\";\nimport type { McpLogger } from \"./log.ts\";\nimport { subscribeMcpServerLogging } from \"./logging.ts\";\nimport { isMcpNeedsAuthError } from \"./needs-auth.ts\";\nimport { subscribeMcpListChanged } from \"./notifications.ts\";\nimport { subscribeMcpResourceUpdated } from \"./resources.ts\";\nimport {\n\tconnectMcpTransport,\n\tcreateMcpTransport,\n\ttype McpTransportConnection,\n\tshutdownMcpTransport,\n} from \"./transport.ts\";\nimport { type McpAsyncErrorSink, wrapAsync } from \"./wrap.ts\";\n\nexport type {\n\tServerConnectionOptions,\n\tServerConnectionState,\n\tServerConnectionStateChangedEvent,\n\tServerConnectionToolsChangedEvent,\n} from \"./connection-types.ts\";\n\nexport class ServerConnection {\n\treadonly serverName: string;\n\treadonly #logger: McpLogger;\n\treadonly #env: Record<string, string | undefined> | undefined;\n\treadonly #config: ServerConnectionOptions[\"config\"];\n\treadonly #authProvider: McpOAuthProvider | undefined;\n\treadonly #elicitationUiProvider: ServerConnectionOptions[\"elicitationUiProvider\"];\n\t#state: ServerConnectionState;\n\t#generation = 0;\n\t#connection: McpTransportConnection | undefined;\n\t#pendingConnection: McpTransportConnection | undefined;\n\t#pendingConnect: Promise<Client> | undefined;\n\t#lastError: Error | undefined;\n\treadonly #stateListeners = new Set<ServerConnectionListener<ServerConnectionStateChangedEvent>>();\n\treadonly #toolsListeners = new Set<ServerConnectionListener<ServerConnectionToolsChangedEvent>>();\n\treadonly #shutdownConnections = new Map<McpTransportConnection, Promise<void>>();\n\n\tconstructor(options: ServerConnectionOptions) {\n\t\tthis.serverName = options.serverName;\n\t\tthis.#config = options.config;\n\t\tthis.#logger = options.logger;\n\t\tthis.#env = options.env;\n\t\tthis.#authProvider = options.authProvider;\n\t\tthis.#elicitationUiProvider = options.elicitationUiProvider;\n\t\tthis.#state = options.config.enabled ? \"idle\" : \"disabled\";\n\t}\n\n\tget state(): ServerConnectionState {\n\t\treturn this.#state;\n\t}\n\tget lastError(): Error | undefined {\n\t\treturn this.#lastError;\n\t}\n\tget generation(): number {\n\t\treturn this.#generation;\n\t}\n\n\trefreshCapturedDiagnostics(): void {\n\t\tconst current = this.#lastError;\n\t\tif (current === undefined) return;\n\t\tconst capturedError = diagnoseCapturedMcpConnectFailure({\n\t\t\tconfig: this.#config,\n\t\t\tcause: current,\n\t\t\tenv: this.#env,\n\t\t\tlogger: this.#logger,\n\t\t\tserverName: this.serverName,\n\t\t});\n\t\tif (capturedError !== null && capturedError.message !== current.message) {\n\t\t\tthis.#lastError = capturedError;\n\t\t}\n\t}\n\n\tget client(): Client {\n\t\tif (this.#connection === undefined) {\n\t\t\tthrow new ConnectError(`MCP server ${this.serverName} is not connected`, {\n\t\t\t\tphase: \"client\",\n\t\t\t\tserverName: this.serverName,\n\t\t\t});\n\t\t}\n\t\treturn this.#connection.client;\n\t}\n\n\tgetRootPid(): number | null {\n\t\treturn this.#connection?.getRootPid() ?? null;\n\t}\n\tconnect(): Promise<Client> {\n\t\tif (this.#state === \"disabled\") {\n\t\t\treturn Promise.reject(this.#connectError(`MCP server ${this.serverName} is disabled`, \"connect\"));\n\t\t}\n\t\tif (this.#state === \"connected\") return Promise.resolve(this.client);\n\t\tif (this.#pendingConnect) return this.#pendingConnect;\n\n\t\tconst generation = this.#generation;\n\t\tthis.#pendingConnect = this.#openConnection(generation).finally(() => {\n\t\t\tif (this.#pendingConnect !== undefined && generation === this.#generation) this.#pendingConnect = undefined;\n\t\t});\n\t\treturn this.#pendingConnect;\n\t}\n\n\t// Building the transport is async (the MCP SDK loads on first use), so the\n\t// single-flight promise is published before it resolves; \"connecting\" is\n\t// entered only once the transport exists and this generation still owns it.\n\tasync #openConnection(generation: number): Promise<Client> {\n\t\tconst connection = await this.#createTransportConnection(generation);\n\t\tthis.#pendingConnection = connection;\n\t\tif (generation === this.#generation && this.#state !== \"disabled\") this.#setState(\"connecting\");\n\t\ttry {\n\t\t\treturn await this.#connectTransport(connection, generation);\n\t\t} finally {\n\t\t\tif (this.#pendingConnection === connection) this.#pendingConnection = undefined;\n\t\t}\n\t}\n\n\tasync renew(): Promise<Client> {\n\t\tif (this.#state === \"disabled\") {\n\t\t\tthrow this.#connectError(`MCP server ${this.serverName} is disabled`, \"renew\");\n\t\t}\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#setState(\"idle\");\n\t\tawait this.#disposeOwnedConnections();\n\t\treturn this.connect();\n\t}\n\n\tbumpGeneration(): Promise<void> {\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#lastError = undefined;\n\t\tif (this.#state !== \"disabled\") this.#setState(\"idle\");\n\t\treturn this.#disposeOwnedConnections();\n\t}\n\n\tdisable(): Promise<void> {\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#lastError = undefined;\n\t\tthis.#setState(\"disabled\");\n\t\treturn this.#disposeOwnedConnections();\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#setState(\"disabled\");\n\t\tawait this.#disposeOwnedConnections();\n\t}\n\n\tmarkDegraded(error: Error): void {\n\t\tthis.#markFailure(\"degraded\", error);\n\t}\n\tmarkSuspended(error?: Error): void {\n\t\tthis.#markFailure(\"suspended\", error);\n\t}\n\tmarkNeedsAuth(error?: Error): void {\n\t\tthis.#markFailure(\"needs_auth\", error);\n\t}\n\tmarkNeedsClientRegistration(error?: Error): void {\n\t\tthis.#markFailure(\"needs_client_registration\", error);\n\t}\n\n\tmarkToolsChanged(): void {\n\t\tthis.#emit(this.#toolsListeners, {\n\t\t\ttype: \"tools_changed\",\n\t\t\tserverName: this.serverName,\n\t\t\tgeneration: this.#generation,\n\t\t});\n\t}\n\n\tonStateChange(listener: ServerConnectionListener<ServerConnectionStateChangedEvent>): () => void {\n\t\tthis.#stateListeners.add(listener);\n\t\treturn () => this.#stateListeners.delete(listener);\n\t}\n\n\tonToolsChanged(listener: ServerConnectionListener<ServerConnectionToolsChangedEvent>): () => void {\n\t\tthis.#toolsListeners.add(listener);\n\t\treturn () => this.#toolsListeners.delete(listener);\n\t}\n\n\tasync #createTransportConnection(generation: number): Promise<McpTransportConnection> {\n\t\tconst connection = createMcpTransport({\n\t\t\tauthProvider: this.#authProvider,\n\t\t\tconfig: this.#config,\n\t\t\tenv: this.#env,\n\t\t\telicitationUiProvider: this.#elicitationUiProvider,\n\t\t\tlogger: this.#logger,\n\t\t\tserverName: this.serverName,\n\t\t});\n\t\tawait connection.materialize();\n\t\tconnection.transport.onclose = wrapAsync(\n\t\t\t\"connection.transport.onclose\",\n\t\t\t() => {\n\t\t\t\tif (this.#shutdownConnections.has(connection)) return;\n\t\t\t\tif (connection === this.#pendingConnection && this.#state === \"connecting\") {\n\t\t\t\t\tconst closeError = this.#connectError(`MCP server ${this.serverName} transport closed`, \"close\", true);\n\t\t\t\t\tconst capturedError = diagnoseCapturedMcpConnectFailure({\n\t\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\t\tcause: closeError,\n\t\t\t\t\t\tenv: this.#env,\n\t\t\t\t\t\tlogger: this.#logger,\n\t\t\t\t\t\tserverName: this.serverName,\n\t\t\t\t\t});\n\t\t\t\t\tif (capturedError !== null) this.markDegraded(capturedError);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (connection !== this.#connection && connection !== this.#pendingConnection) return;\n\t\t\t\tif (generation === this.#generation && this.#state !== \"disabled\") {\n\t\t\t\t\tthis.markDegraded(this.#connectError(`MCP server ${this.serverName} transport closed`, \"close\", true));\n\t\t\t\t}\n\t\t\t},\n\t\t\tthis.#sink,\n\t\t);\n\t\treturn connection;\n\t}\n\n\tasync #connectTransport(connection: McpTransportConnection, generation: number): Promise<Client> {\n\t\ttry {\n\t\t\tawait connectMcpTransport(connection);\n\t\t} catch (error) {\n\t\t\tif (this.#pendingConnection === connection) this.#pendingConnection = undefined;\n\t\t\tawait this.#shutdown(connection);\n\t\t\tif (generation !== this.#generation || this.#state === \"disabled\") {\n\t\t\t\tthrow this.#connectError(`MCP server ${this.serverName} connect was superseded`, \"connect\", true);\n\t\t\t}\n\t\t\tif (isMcpNeedsAuthError(error)) {\n\t\t\t\tconst authError = error instanceof Error ? error : new Error(String(error));\n\t\t\t\tthis.markNeedsAuth(authError);\n\t\t\t\tthrow authError;\n\t\t\t}\n\t\t\tconst connectError = await diagnoseMcpConnectFailure({\n\t\t\t\tconfig: this.#config,\n\t\t\t\tcause: error instanceof Error ? error : new Error(String(error)),\n\t\t\t\tenv: this.#env,\n\t\t\t\tlogger: this.#logger,\n\t\t\t\tserverName: this.serverName,\n\t\t\t});\n\t\t\tthis.markDegraded(connectError);\n\t\t\tthrow connectError;\n\t\t}\n\t\tif (generation !== this.#generation || this.#state === \"disabled\") {\n\t\t\tawait this.#shutdown(connection);\n\t\t\tthrow this.#connectError(`MCP server ${this.serverName} connect was superseded`, \"connect\", true);\n\t\t}\n\t\tif (this.#pendingConnection === connection) this.#pendingConnection = undefined;\n\t\tthis.#connection = connection;\n\t\tthis.#lastError = undefined;\n\t\t// Subscribe to list_changed on the fresh client (even if the server never\n\t\t// declared the capability) so dynamic catalog updates reach the service.\n\t\tsubscribeMcpListChanged(connection.client, () => this.markToolsChanged());\n\t\t// Resource updates ride the same refresh path: the service re-collects the\n\t\t// catalog (tools AND resources) on tools-changed.\n\t\tsubscribeMcpResourceUpdated(connection.client, () => this.markToolsChanged());\n\t\t// Server logging notifications (todo 42): RFC-5424 → the per-server\n\t\t// logger, filtered by config.logLevel, burst-capped.\n\t\tsubscribeMcpServerLogging(connection.client, { logLevel: this.#config.logLevel, logger: this.#logger });\n\t\tthis.#setState(\"connected\");\n\t\tthis.markToolsChanged();\n\t\treturn connection.client;\n\t}\n\n\tasync #disposeOwnedConnections(): Promise<void> {\n\t\tconst connections = new Set<McpTransportConnection>();\n\t\tconst connection = this.#connection;\n\t\tthis.#connection = undefined;\n\t\tif (connection !== undefined) connections.add(connection);\n\t\tconst pendingConnection = this.#pendingConnection;\n\t\tthis.#pendingConnection = undefined;\n\t\tif (pendingConnection !== undefined) connections.add(pendingConnection);\n\t\tawait Promise.all([...connections].map((item) => this.#shutdown(item)));\n\t}\n\n\tasync #shutdown(connection: McpTransportConnection): Promise<void> {\n\t\tconst pending = this.#shutdownConnections.get(connection);\n\t\tif (pending !== undefined) {\n\t\t\tawait pending;\n\t\t\treturn;\n\t\t}\n\t\tconst shutdown = (async () => {\n\t\t\tawait shutdownMcpTransport(connection);\n\t\t})();\n\t\tthis.#shutdownConnections.set(connection, shutdown);\n\t\ttry {\n\t\t\tawait shutdown;\n\t\t} finally {\n\t\t\tthis.#shutdownConnections.delete(connection);\n\t\t}\n\t}\n\n\t#setState(state: ServerConnectionState, error?: Error): void {\n\t\tif (this.#state === state) return;\n\t\tconst previousState = this.#state;\n\t\tthis.#state = state;\n\t\tthis.#emit(this.#stateListeners, {\n\t\t\ttype: \"state_changed\",\n\t\t\tserverName: this.serverName,\n\t\t\tpreviousState,\n\t\t\tstate,\n\t\t\tgeneration: this.#generation,\n\t\t\terror,\n\t\t});\n\t}\n\n\t#emit<TEvent>(listeners: Set<ServerConnectionListener<TEvent>>, event: TEvent): void {\n\t\tfor (const listener of listeners) {\n\t\t\tvoid wrapAsync(\"connection.event\", listener, this.#sink)(event);\n\t\t}\n\t}\n\n\t#markFailure(state: ServerConnectionState, error: Error | undefined): void {\n\t\tthis.#lastError = error;\n\t\tthis.#setState(state, error);\n\t}\n\n\t#connectError(message: string, phase: string, retriable?: true, cause?: unknown): ConnectError {\n\t\treturn new ConnectError(message, { cause, phase, retriable, serverName: this.serverName });\n\t}\n\n\tget #sink(): McpAsyncErrorSink {\n\t\treturn { logger: this.#logger };\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/connection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { McpOAuthProvider } from \"./auth/oauth-provider.ts\";\nimport type {\n\tServerConnectionListener,\n\tServerConnectionOptions,\n\tServerConnectionState,\n\tServerConnectionStateChangedEvent,\n\tServerConnectionToolsChangedEvent,\n} from \"./connection-types.ts\";\nimport { diagnoseCapturedMcpConnectFailure, diagnoseMcpConnectFailure } from \"./diagnose.ts\";\nimport { ConnectError } from \"./errors.ts\";\nimport type { McpLogger } from \"./log.ts\";\nimport { subscribeMcpServerLogging } from \"./logging.ts\";\nimport { isMcpNeedsAuthError } from \"./needs-auth.ts\";\nimport { subscribeMcpListChanged } from \"./notifications.ts\";\nimport { subscribeMcpResourceUpdated } from \"./resources.ts\";\nimport {\n\tconnectMcpTransport,\n\tcreateMcpTransport,\n\ttype McpTransportConnection,\n\tshutdownMcpTransport,\n} from \"./transport.ts\";\nimport { type McpAsyncErrorSink, wrapAsync } from \"./wrap.ts\";\n\nexport type {\n\tServerConnectionOptions,\n\tServerConnectionState,\n\tServerConnectionStateChangedEvent,\n\tServerConnectionToolsChangedEvent,\n} from \"./connection-types.ts\";\n\nexport class ServerConnection {\n\treadonly serverName: string;\n\treadonly #logger: McpLogger;\n\treadonly #env: Record<string, string | undefined> | undefined;\n\treadonly #config: ServerConnectionOptions[\"config\"];\n\treadonly #authProvider: McpOAuthProvider | undefined;\n\treadonly #elicitationUiProvider: ServerConnectionOptions[\"elicitationUiProvider\"];\n\t#state: ServerConnectionState;\n\t#generation = 0;\n\t#connection: McpTransportConnection | undefined;\n\t#pendingConnection: McpTransportConnection | undefined;\n\t#pendingConnect: Promise<Client> | undefined;\n\t#lastError: Error | undefined;\n\treadonly #stateListeners = new Set<ServerConnectionListener<ServerConnectionStateChangedEvent>>();\n\treadonly #toolsListeners = new Set<ServerConnectionListener<ServerConnectionToolsChangedEvent>>();\n\treadonly #shutdownConnections = new Map<McpTransportConnection, Promise<void>>();\n\n\tconstructor(options: ServerConnectionOptions) {\n\t\tthis.serverName = options.serverName;\n\t\tthis.#config = options.config;\n\t\tthis.#logger = options.logger;\n\t\tthis.#env = options.env;\n\t\tthis.#authProvider = options.authProvider;\n\t\tthis.#elicitationUiProvider = options.elicitationUiProvider;\n\t\tthis.#state = options.config.enabled ? \"idle\" : \"disabled\";\n\t}\n\n\tget state(): ServerConnectionState {\n\t\treturn this.#state;\n\t}\n\tget lastError(): Error | undefined {\n\t\treturn this.#lastError;\n\t}\n\tget generation(): number {\n\t\treturn this.#generation;\n\t}\n\n\trefreshCapturedDiagnostics(): void {\n\t\tconst current = this.#lastError;\n\t\tif (current === undefined) return;\n\t\tconst capturedError = diagnoseCapturedMcpConnectFailure({\n\t\t\tconfig: this.#config,\n\t\t\tcause: current,\n\t\t\tenv: this.#env,\n\t\t\tlogger: this.#logger,\n\t\t\tserverName: this.serverName,\n\t\t});\n\t\tif (capturedError !== null && capturedError.message !== current.message) {\n\t\t\tthis.#lastError = capturedError;\n\t\t}\n\t}\n\n\tget client(): Client {\n\t\tif (this.#connection === undefined) {\n\t\t\tthrow new ConnectError(`MCP server ${this.serverName} is not connected`, {\n\t\t\t\tphase: \"client\",\n\t\t\t\tserverName: this.serverName,\n\t\t\t});\n\t\t}\n\t\treturn this.#connection.client;\n\t}\n\n\tgetRootPid(): number | null {\n\t\treturn this.#connection?.getRootPid() ?? null;\n\t}\n\tconnect(): Promise<Client> {\n\t\tif (this.#state === \"disabled\") {\n\t\t\treturn Promise.reject(this.#connectError(`MCP server ${this.serverName} is disabled`, \"connect\"));\n\t\t}\n\t\tif (this.#state === \"connected\") return Promise.resolve(this.client);\n\t\tif (this.#pendingConnect) return this.#pendingConnect;\n\n\t\tconst generation = this.#generation;\n\t\tthis.#pendingConnect = this.#openConnection(generation).finally(() => {\n\t\t\tif (this.#pendingConnect !== undefined && generation === this.#generation) this.#pendingConnect = undefined;\n\t\t});\n\t\treturn this.#pendingConnect;\n\t}\n\n\t// Building the transport is async (the MCP SDK loads on first use), so the\n\t// single-flight promise is published before it resolves; \"connecting\" is\n\t// entered only once the transport exists and this generation still owns it.\n\tasync #openConnection(generation: number): Promise<Client> {\n\t\tconst connection = await this.#createTransportConnection(generation);\n\t\tthis.#pendingConnection = connection;\n\t\tif (generation === this.#generation && this.#state !== \"disabled\") this.#setState(\"connecting\");\n\t\ttry {\n\t\t\treturn await this.#connectTransport(connection, generation);\n\t\t} finally {\n\t\t\tif (this.#pendingConnection === connection) this.#pendingConnection = undefined;\n\t\t}\n\t}\n\n\tasync renew(): Promise<Client> {\n\t\tif (this.#state === \"disabled\") {\n\t\t\tthrow this.#connectError(`MCP server ${this.serverName} is disabled`, \"renew\");\n\t\t}\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#setState(\"idle\");\n\t\tawait this.#disposeOwnedConnections();\n\t\treturn this.connect();\n\t}\n\n\tbumpGeneration(): Promise<void> {\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#lastError = undefined;\n\t\tif (this.#state !== \"disabled\") this.#setState(\"idle\");\n\t\treturn this.#disposeOwnedConnections();\n\t}\n\n\tdisable(): Promise<void> {\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#lastError = undefined;\n\t\tthis.#setState(\"disabled\");\n\t\treturn this.#disposeOwnedConnections();\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tthis.#generation++;\n\t\tthis.#pendingConnect = undefined;\n\t\tthis.#setState(\"disabled\");\n\t\tawait this.#disposeOwnedConnections();\n\t}\n\n\tmarkDegraded(error: Error): void {\n\t\tthis.#markFailure(\"degraded\", error);\n\t}\n\tmarkSuspended(error?: Error): void {\n\t\tthis.#markFailure(\"suspended\", error);\n\t}\n\tmarkNeedsAuth(error?: Error): void {\n\t\tthis.#markFailure(\"needs_auth\", error);\n\t}\n\tmarkNeedsClientRegistration(error?: Error): void {\n\t\tthis.#markFailure(\"needs_client_registration\", error);\n\t}\n\n\tmarkToolsChanged(cause: ServerConnectionToolsChangedEvent[\"cause\"] = \"notification\"): void {\n\t\tthis.#emit(this.#toolsListeners, {\n\t\t\ttype: \"tools_changed\",\n\t\t\tserverName: this.serverName,\n\t\t\tgeneration: this.#generation,\n\t\t\tcause,\n\t\t});\n\t}\n\n\tonStateChange(listener: ServerConnectionListener<ServerConnectionStateChangedEvent>): () => void {\n\t\tthis.#stateListeners.add(listener);\n\t\treturn () => this.#stateListeners.delete(listener);\n\t}\n\n\tonToolsChanged(listener: ServerConnectionListener<ServerConnectionToolsChangedEvent>): () => void {\n\t\tthis.#toolsListeners.add(listener);\n\t\treturn () => this.#toolsListeners.delete(listener);\n\t}\n\n\tasync #createTransportConnection(generation: number): Promise<McpTransportConnection> {\n\t\tconst connection = createMcpTransport({\n\t\t\tauthProvider: this.#authProvider,\n\t\t\tconfig: this.#config,\n\t\t\tenv: this.#env,\n\t\t\telicitationUiProvider: this.#elicitationUiProvider,\n\t\t\tlogger: this.#logger,\n\t\t\tserverName: this.serverName,\n\t\t});\n\t\tawait connection.materialize();\n\t\tconnection.transport.onclose = wrapAsync(\n\t\t\t\"connection.transport.onclose\",\n\t\t\t() => {\n\t\t\t\tif (this.#shutdownConnections.has(connection)) return;\n\t\t\t\tif (connection === this.#pendingConnection && this.#state === \"connecting\") {\n\t\t\t\t\tconst closeError = this.#connectError(`MCP server ${this.serverName} transport closed`, \"close\", true);\n\t\t\t\t\tconst capturedError = diagnoseCapturedMcpConnectFailure({\n\t\t\t\t\t\tconfig: this.#config,\n\t\t\t\t\t\tcause: closeError,\n\t\t\t\t\t\tenv: this.#env,\n\t\t\t\t\t\tlogger: this.#logger,\n\t\t\t\t\t\tserverName: this.serverName,\n\t\t\t\t\t});\n\t\t\t\t\tif (capturedError !== null) this.markDegraded(capturedError);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (connection !== this.#connection && connection !== this.#pendingConnection) return;\n\t\t\t\tif (generation === this.#generation && this.#state !== \"disabled\") {\n\t\t\t\t\tthis.markDegraded(this.#connectError(`MCP server ${this.serverName} transport closed`, \"close\", true));\n\t\t\t\t}\n\t\t\t},\n\t\t\tthis.#sink,\n\t\t);\n\t\treturn connection;\n\t}\n\n\tasync #connectTransport(connection: McpTransportConnection, generation: number): Promise<Client> {\n\t\ttry {\n\t\t\tawait connectMcpTransport(connection);\n\t\t} catch (error) {\n\t\t\tif (this.#pendingConnection === connection) this.#pendingConnection = undefined;\n\t\t\tawait this.#shutdown(connection);\n\t\t\tif (generation !== this.#generation || this.#state === \"disabled\") {\n\t\t\t\tthrow this.#connectError(`MCP server ${this.serverName} connect was superseded`, \"connect\", true);\n\t\t\t}\n\t\t\tif (isMcpNeedsAuthError(error)) {\n\t\t\t\tconst authError = error instanceof Error ? error : new Error(String(error));\n\t\t\t\tthis.markNeedsAuth(authError);\n\t\t\t\tthrow authError;\n\t\t\t}\n\t\t\tconst connectError = await diagnoseMcpConnectFailure({\n\t\t\t\tconfig: this.#config,\n\t\t\t\tcause: error instanceof Error ? error : new Error(String(error)),\n\t\t\t\tenv: this.#env,\n\t\t\t\tlogger: this.#logger,\n\t\t\t\tserverName: this.serverName,\n\t\t\t});\n\t\t\tthis.markDegraded(connectError);\n\t\t\tthrow connectError;\n\t\t}\n\t\tif (generation !== this.#generation || this.#state === \"disabled\") {\n\t\t\tawait this.#shutdown(connection);\n\t\t\tthrow this.#connectError(`MCP server ${this.serverName} connect was superseded`, \"connect\", true);\n\t\t}\n\t\tif (this.#pendingConnection === connection) this.#pendingConnection = undefined;\n\t\tthis.#connection = connection;\n\t\tthis.#lastError = undefined;\n\t\t// Subscribe to list_changed on the fresh client (even if the server never\n\t\t// declared the capability) so dynamic catalog updates reach the service.\n\t\tsubscribeMcpListChanged(connection.client, () => this.markToolsChanged());\n\t\t// Resource updates ride the same refresh path: the service re-collects the\n\t\t// catalog (tools AND resources) on tools-changed.\n\t\tsubscribeMcpResourceUpdated(connection.client, () => this.markToolsChanged());\n\t\t// Server logging notifications (todo 42): RFC-5424 → the per-server\n\t\t// logger, filtered by config.logLevel, burst-capped.\n\t\tsubscribeMcpServerLogging(connection.client, { logLevel: this.#config.logLevel, logger: this.#logger });\n\t\tthis.#setState(\"connected\");\n\t\tthis.markToolsChanged(\"connect\");\n\t\treturn connection.client;\n\t}\n\n\tasync #disposeOwnedConnections(): Promise<void> {\n\t\tconst connections = new Set<McpTransportConnection>();\n\t\tconst connection = this.#connection;\n\t\tthis.#connection = undefined;\n\t\tif (connection !== undefined) connections.add(connection);\n\t\tconst pendingConnection = this.#pendingConnection;\n\t\tthis.#pendingConnection = undefined;\n\t\tif (pendingConnection !== undefined) connections.add(pendingConnection);\n\t\tawait Promise.all([...connections].map((item) => this.#shutdown(item)));\n\t}\n\n\tasync #shutdown(connection: McpTransportConnection): Promise<void> {\n\t\tconst pending = this.#shutdownConnections.get(connection);\n\t\tif (pending !== undefined) {\n\t\t\tawait pending;\n\t\t\treturn;\n\t\t}\n\t\tconst shutdown = (async () => {\n\t\t\tawait shutdownMcpTransport(connection);\n\t\t})();\n\t\tthis.#shutdownConnections.set(connection, shutdown);\n\t\ttry {\n\t\t\tawait shutdown;\n\t\t} finally {\n\t\t\tthis.#shutdownConnections.delete(connection);\n\t\t}\n\t}\n\n\t#setState(state: ServerConnectionState, error?: Error): void {\n\t\tif (this.#state === state) return;\n\t\tconst previousState = this.#state;\n\t\tthis.#state = state;\n\t\tthis.#emit(this.#stateListeners, {\n\t\t\ttype: \"state_changed\",\n\t\t\tserverName: this.serverName,\n\t\t\tpreviousState,\n\t\t\tstate,\n\t\t\tgeneration: this.#generation,\n\t\t\terror,\n\t\t});\n\t}\n\n\t#emit<TEvent>(listeners: Set<ServerConnectionListener<TEvent>>, event: TEvent): void {\n\t\tfor (const listener of listeners) {\n\t\t\tvoid wrapAsync(\"connection.event\", listener, this.#sink)(event);\n\t\t}\n\t}\n\n\t#markFailure(state: ServerConnectionState, error: Error | undefined): void {\n\t\tthis.#lastError = error;\n\t\tthis.#setState(state, error);\n\t}\n\n\t#connectError(message: string, phase: string, retriable?: true, cause?: unknown): ConnectError {\n\t\treturn new ConnectError(message, { cause, phase, retriable, serverName: this.serverName });\n\t}\n\n\tget #sink(): McpAsyncErrorSink {\n\t\treturn { logger: this.#logger };\n\t}\n}\n"]}
|
|
@@ -22,6 +22,9 @@ export interface McpDirectRegistrationEntry {
|
|
|
22
22
|
readonly cachedCatalog?: McpCachedServerCatalog;
|
|
23
23
|
readonly ensureFresh?: () => Promise<void>;
|
|
24
24
|
readonly ensureCachedToolConnected?: () => Promise<void>;
|
|
25
|
+
/** A startup connect still owns this server's catalog; its refresh registers it. */
|
|
26
|
+
readonly startupCatalogPending?: boolean;
|
|
27
|
+
readonly onRegistered?: (identity: string) => void;
|
|
25
28
|
}
|
|
26
29
|
export declare function registerDirectMcpTools(pi: Pick<ExtensionAPI, "getActiveTools" | "setActiveTools" | "registerTool">, config: ResolvedMcpConfig, entries: Iterable<McpDirectRegistrationEntry>, toolSearchService: ToolSearchService, options?: McpCatalogRegistrationOptions): Promise<McpSessionRegistration | undefined>;
|
|
27
30
|
//# sourceMappingURL=session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/expose/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAOtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAA0B,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEjF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,KAAK,oBAAoB,EAAyB,MAAM,aAAa,CAAC;AAE/E,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,GAAG;IAC3D,eAAe,EAAE,iBAAiB,EAAE,CAAC;IACrC,aAAa,EAAE,eAAe,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,sBAAsB,CAAC;IAChD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,oFAAoF;IACpF,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD;AAED,wBAAsB,sBAAsB,CAC3C,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,cAAc,CAAC,EAC5E,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,QAAQ,CAAC,0BAA0B,CAAC,EAC7C,iBAAiB,EAAE,iBAAiB,EACpC,OAAO,GAAE,6BAAkC,GACzC,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAoF7C"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cachedToolsToCatalogEntries, collectToolCatalog } from "../catalog.js";
|
|
1
|
+
import { cachedToolsToCatalogEntries, collectToolCatalog, mcpRegistrationIdentity, } from "../catalog.js";
|
|
2
2
|
import { createMcpLogger } from "../log.js";
|
|
3
3
|
import { createMcpResourceTools } from "../resources.js";
|
|
4
4
|
import { computeMcpExposurePolicy } from "./policy.js";
|
|
@@ -10,12 +10,13 @@ export async function registerDirectMcpTools(pi, config, entries, toolSearchServ
|
|
|
10
10
|
const proxyGateways = [];
|
|
11
11
|
const resourceServers = [];
|
|
12
12
|
const promptServers = [];
|
|
13
|
+
const recordRegisteredListings = [];
|
|
13
14
|
for (const entry of entries) {
|
|
14
15
|
const server = config.servers[entry.name];
|
|
15
16
|
if (server?.config === undefined)
|
|
16
17
|
continue;
|
|
17
18
|
const catalog = entry.cachedCatalog === undefined
|
|
18
|
-
? entry.connection.state === "connected"
|
|
19
|
+
? entry.connection.state === "connected" && entry.startupCatalogPending !== true
|
|
19
20
|
? await collectToolCatalog(entry.name, entry.connection, server.config, {
|
|
20
21
|
agentDir: entry.agentDir,
|
|
21
22
|
artifacts: entry.artifacts,
|
|
@@ -29,6 +30,8 @@ export async function registerDirectMcpTools(pi, config, entries, toolSearchServ
|
|
|
29
30
|
ensureFresh: entry.ensureFresh,
|
|
30
31
|
outputGuard: config.settings.outputGuard,
|
|
31
32
|
});
|
|
33
|
+
const identity = mcpRegistrationIdentity(catalog, entry.cachedCatalog);
|
|
34
|
+
recordRegisteredListings.push(() => entry.onRegistered?.(identity));
|
|
32
35
|
const cachedPrompts = entry.cachedCatalog?.prompts ?? [];
|
|
33
36
|
if (cachedPrompts.length > 0) {
|
|
34
37
|
promptServers.push({
|
|
@@ -66,10 +69,14 @@ export async function registerDirectMcpTools(pi, config, entries, toolSearchServ
|
|
|
66
69
|
!searchMode &&
|
|
67
70
|
proxyGateways.length === 0 &&
|
|
68
71
|
options.refreshActiveSetWhenEmpty !== true) {
|
|
72
|
+
for (const record of recordRegisteredListings)
|
|
73
|
+
record();
|
|
69
74
|
return undefined;
|
|
70
75
|
}
|
|
71
76
|
const utilityTools = resourceServers.length > 0 ? createMcpResourceTools(() => resourceServers) : [];
|
|
72
77
|
const registration = registerMcpTierBTools(pi, { activeEntries, proxyGateways, registeredEntries, searchMode, settings: config.settings, utilityTools }, toolSearchService, (message) => createMcpLogger("service").warn(message));
|
|
78
|
+
for (const record of recordRegisteredListings)
|
|
79
|
+
record();
|
|
73
80
|
return { ...registration, promptServers, resourceServers };
|
|
74
81
|
}
|
|
75
82
|
//# sourceMappingURL=session.js.map
|