@animalabs/agent-framework 0.22.2 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -4
- package/dist/src/agent.d.ts +108 -17
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +207 -67
- package/dist/src/agent.js.map +1 -1
- package/dist/src/api/mcp-server-core.js +1 -1
- package/dist/src/api/mcp-server-core.js.map +1 -1
- package/dist/src/api/server.d.ts.map +1 -1
- package/dist/src/api/server.js +5 -1
- package/dist/src/api/server.js.map +1 -1
- package/dist/src/api/types.d.ts +1 -1
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/branch-names.d.ts +14 -0
- package/dist/src/branch-names.d.ts.map +1 -0
- package/dist/src/branch-names.js +22 -0
- package/dist/src/branch-names.js.map +1 -0
- package/dist/src/closest-names.d.ts +28 -0
- package/dist/src/closest-names.d.ts.map +1 -0
- package/dist/src/closest-names.js +98 -0
- package/dist/src/closest-names.js.map +1 -0
- package/dist/src/code-execution/index.d.ts +1 -1
- package/dist/src/code-execution/index.d.ts.map +1 -1
- package/dist/src/code-execution/index.js.map +1 -1
- package/dist/src/code-execution/py-runner.d.ts +50 -7
- package/dist/src/code-execution/py-runner.d.ts.map +1 -1
- package/dist/src/code-execution/py-runner.js +258 -90
- package/dist/src/code-execution/py-runner.js.map +1 -1
- package/dist/src/code-execution/runtime-py.d.ts +3 -2
- package/dist/src/code-execution/runtime-py.d.ts.map +1 -1
- package/dist/src/code-execution/runtime-py.js +94 -8
- package/dist/src/code-execution/runtime-py.js.map +1 -1
- package/dist/src/code-execution/tool-definition.d.ts +17 -1
- package/dist/src/code-execution/tool-definition.d.ts.map +1 -1
- package/dist/src/code-execution/tool-definition.js +72 -6
- package/dist/src/code-execution/tool-definition.js.map +1 -1
- package/dist/src/config-checks.d.ts +28 -0
- package/dist/src/config-checks.d.ts.map +1 -0
- package/dist/src/config-checks.js +56 -0
- package/dist/src/config-checks.js.map +1 -0
- package/dist/src/deadline-timer.d.ts +21 -0
- package/dist/src/deadline-timer.d.ts.map +1 -0
- package/dist/src/deadline-timer.js +43 -0
- package/dist/src/deadline-timer.js.map +1 -0
- package/dist/src/error-message.d.ts +30 -0
- package/dist/src/error-message.d.ts.map +1 -0
- package/dist/src/error-message.js +50 -0
- package/dist/src/error-message.js.map +1 -0
- package/dist/src/framework.d.ts +1529 -165
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +8264 -1939
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +8 -0
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +36 -5
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/held-writes.d.ts +16 -0
- package/dist/src/held-writes.d.ts.map +1 -0
- package/dist/src/held-writes.js +56 -0
- package/dist/src/held-writes.js.map +1 -0
- package/dist/src/index.d.ts +10 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +11 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/capability-grant.d.ts +4 -0
- package/dist/src/mcpl/capability-grant.d.ts.map +1 -1
- package/dist/src/mcpl/capability-grant.js +1 -1
- package/dist/src/mcpl/capability-grant.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +233 -18
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +975 -386
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/checkpoint-manager.d.ts +21 -1
- package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -1
- package/dist/src/mcpl/checkpoint-manager.js +91 -30
- package/dist/src/mcpl/checkpoint-manager.js.map +1 -1
- package/dist/src/mcpl/conversation-router.d.ts +19 -3
- package/dist/src/mcpl/conversation-router.d.ts.map +1 -1
- package/dist/src/mcpl/conversation-router.js +23 -8
- package/dist/src/mcpl/conversation-router.js.map +1 -1
- package/dist/src/mcpl/convert-block.d.ts +20 -0
- package/dist/src/mcpl/convert-block.d.ts.map +1 -0
- package/dist/src/mcpl/convert-block.js +88 -0
- package/dist/src/mcpl/convert-block.js.map +1 -0
- package/dist/src/mcpl/errors.d.ts +13 -0
- package/dist/src/mcpl/errors.d.ts.map +1 -1
- package/dist/src/mcpl/errors.js +28 -0
- package/dist/src/mcpl/errors.js.map +1 -1
- package/dist/src/mcpl/hook-orchestrator.d.ts +23 -0
- package/dist/src/mcpl/hook-orchestrator.d.ts.map +1 -1
- package/dist/src/mcpl/hook-orchestrator.js +83 -72
- package/dist/src/mcpl/hook-orchestrator.js.map +1 -1
- package/dist/src/mcpl/inbound-source.d.ts +114 -0
- package/dist/src/mcpl/inbound-source.d.ts.map +1 -0
- package/dist/src/mcpl/inbound-source.js +83 -0
- package/dist/src/mcpl/inbound-source.js.map +1 -0
- package/dist/src/mcpl/index.d.ts +7 -1
- package/dist/src/mcpl/index.d.ts.map +1 -1
- package/dist/src/mcpl/index.js +5 -1
- package/dist/src/mcpl/index.js.map +1 -1
- package/dist/src/mcpl/inference-router.d.ts +19 -13
- package/dist/src/mcpl/inference-router.d.ts.map +1 -1
- package/dist/src/mcpl/inference-router.js +155 -87
- package/dist/src/mcpl/inference-router.js.map +1 -1
- package/dist/src/mcpl/log-value.d.ts +7 -0
- package/dist/src/mcpl/log-value.d.ts.map +1 -1
- package/dist/src/mcpl/log-value.js +9 -0
- package/dist/src/mcpl/log-value.js.map +1 -1
- package/dist/src/mcpl/modern-connection.d.ts +227 -0
- package/dist/src/mcpl/modern-connection.d.ts.map +1 -0
- package/dist/src/mcpl/modern-connection.js +1088 -0
- package/dist/src/mcpl/modern-connection.js.map +1 -0
- package/dist/src/mcpl/prefix-rule.d.ts +18 -0
- package/dist/src/mcpl/prefix-rule.d.ts.map +1 -0
- package/dist/src/mcpl/prefix-rule.js +25 -0
- package/dist/src/mcpl/prefix-rule.js.map +1 -0
- package/dist/src/mcpl/protocol-family.d.ts +179 -0
- package/dist/src/mcpl/protocol-family.d.ts.map +1 -0
- package/dist/src/mcpl/protocol-family.js +697 -0
- package/dist/src/mcpl/protocol-family.js.map +1 -0
- package/dist/src/mcpl/push-coalescer.d.ts +58 -17
- package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
- package/dist/src/mcpl/push-coalescer.js +93 -32
- package/dist/src/mcpl/push-coalescer.js.map +1 -1
- package/dist/src/mcpl/push-handler.d.ts +16 -9
- package/dist/src/mcpl/push-handler.d.ts.map +1 -1
- package/dist/src/mcpl/push-handler.js +18 -83
- package/dist/src/mcpl/push-handler.js.map +1 -1
- package/dist/src/mcpl/reference-fetcher.d.ts +76 -13
- package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
- package/dist/src/mcpl/reference-fetcher.js +275 -66
- package/dist/src/mcpl/reference-fetcher.js.map +1 -1
- package/dist/src/mcpl/references.d.ts +98 -18
- package/dist/src/mcpl/references.d.ts.map +1 -1
- package/dist/src/mcpl/references.js +170 -32
- package/dist/src/mcpl/references.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +406 -31
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +1331 -272
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/mcpl/server-registry.d.ts +35 -6
- package/dist/src/mcpl/server-registry.d.ts.map +1 -1
- package/dist/src/mcpl/server-registry.js +63 -13
- package/dist/src/mcpl/server-registry.js.map +1 -1
- package/dist/src/mcpl/skip-reply-wake.d.ts +36 -0
- package/dist/src/mcpl/skip-reply-wake.d.ts.map +1 -0
- package/dist/src/mcpl/skip-reply-wake.js +55 -0
- package/dist/src/mcpl/skip-reply-wake.js.map +1 -0
- package/dist/src/mcpl/tool-result-normalize.d.ts +54 -0
- package/dist/src/mcpl/tool-result-normalize.d.ts.map +1 -0
- package/dist/src/mcpl/tool-result-normalize.js +232 -0
- package/dist/src/mcpl/tool-result-normalize.js.map +1 -0
- package/dist/src/mcpl/transport.d.ts +104 -12
- package/dist/src/mcpl/transport.d.ts.map +1 -1
- package/dist/src/mcpl/transport.js +315 -85
- package/dist/src/mcpl/transport.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +76 -19
- package/dist/src/mcpl/types.d.ts.map +1 -1
- package/dist/src/mcpl/types.js.map +1 -1
- package/dist/src/mcpl/visible-content.d.ts +16 -0
- package/dist/src/mcpl/visible-content.d.ts.map +1 -1
- package/dist/src/mcpl/visible-content.js +26 -0
- package/dist/src/mcpl/visible-content.js.map +1 -1
- package/dist/src/module-registry.d.ts +34 -6
- package/dist/src/module-registry.d.ts.map +1 -1
- package/dist/src/module-registry.js +119 -31
- package/dist/src/module-registry.js.map +1 -1
- package/dist/src/modules/api/index.d.ts +1 -1
- package/dist/src/modules/api/index.d.ts.map +1 -1
- package/dist/src/modules/api/index.js +3 -2
- package/dist/src/modules/api/index.js.map +1 -1
- package/dist/src/modules/discord/discord-js-client.d.ts +43 -2
- package/dist/src/modules/discord/discord-js-client.d.ts.map +1 -1
- package/dist/src/modules/discord/discord-js-client.js +286 -67
- package/dist/src/modules/discord/discord-js-client.js.map +1 -1
- package/dist/src/modules/discord/index.d.ts +53 -5
- package/dist/src/modules/discord/index.d.ts.map +1 -1
- package/dist/src/modules/discord/index.js +712 -186
- package/dist/src/modules/discord/index.js.map +1 -1
- package/dist/src/modules/discord/refusal.d.ts +14 -0
- package/dist/src/modules/discord/refusal.d.ts.map +1 -0
- package/dist/src/modules/discord/refusal.js +14 -0
- package/dist/src/modules/discord/refusal.js.map +1 -0
- package/dist/src/modules/discord/types.d.ts +27 -4
- package/dist/src/modules/discord/types.d.ts.map +1 -1
- package/dist/src/modules/health/index.d.ts.map +1 -1
- package/dist/src/modules/health/index.js +8 -3
- package/dist/src/modules/health/index.js.map +1 -1
- package/dist/src/modules/history/index.d.ts +3 -1
- package/dist/src/modules/history/index.d.ts.map +1 -1
- package/dist/src/modules/history/index.js +359 -127
- package/dist/src/modules/history/index.js.map +1 -1
- package/dist/src/modules/history/semantic.d.ts +28 -1
- package/dist/src/modules/history/semantic.d.ts.map +1 -1
- package/dist/src/modules/history/semantic.js +177 -32
- package/dist/src/modules/history/semantic.js.map +1 -1
- package/dist/src/modules/index.d.ts +1 -1
- package/dist/src/modules/index.d.ts.map +1 -1
- package/dist/src/modules/index.js +1 -1
- package/dist/src/modules/index.js.map +1 -1
- package/dist/src/modules/unknown-tool.d.ts +10 -0
- package/dist/src/modules/unknown-tool.d.ts.map +1 -0
- package/dist/src/modules/unknown-tool.js +17 -0
- package/dist/src/modules/unknown-tool.js.map +1 -0
- package/dist/src/modules/workspace/disk-agreement.d.ts +57 -4
- package/dist/src/modules/workspace/disk-agreement.d.ts.map +1 -1
- package/dist/src/modules/workspace/disk-agreement.js +75 -7
- package/dist/src/modules/workspace/disk-agreement.js.map +1 -1
- package/dist/src/modules/workspace/effects.d.ts +66 -7
- package/dist/src/modules/workspace/effects.d.ts.map +1 -1
- package/dist/src/modules/workspace/effects.js +303 -46
- package/dist/src/modules/workspace/effects.js.map +1 -1
- package/dist/src/modules/workspace/index.d.ts +313 -45
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +1404 -304
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/observe.d.ts +315 -16
- package/dist/src/modules/workspace/observe.d.ts.map +1 -1
- package/dist/src/modules/workspace/observe.js +727 -37
- package/dist/src/modules/workspace/observe.js.map +1 -1
- package/dist/src/modules/workspace/reconcile.d.ts +58 -7
- package/dist/src/modules/workspace/reconcile.d.ts.map +1 -1
- package/dist/src/modules/workspace/reconcile.js +521 -56
- package/dist/src/modules/workspace/reconcile.js.map +1 -1
- package/dist/src/modules/workspace/types.d.ts +28 -5
- package/dist/src/modules/workspace/types.d.ts.map +1 -1
- package/dist/src/modules/workspace/types.js.map +1 -1
- package/dist/src/modules/workspace/watcher.d.ts +49 -2
- package/dist/src/modules/workspace/watcher.d.ts.map +1 -1
- package/dist/src/modules/workspace/watcher.js +158 -29
- package/dist/src/modules/workspace/watcher.js.map +1 -1
- package/dist/src/prose-drafts.d.ts +240 -0
- package/dist/src/prose-drafts.d.ts.map +1 -0
- package/dist/src/prose-drafts.js +362 -0
- package/dist/src/prose-drafts.js.map +1 -0
- package/dist/src/prose-segments.d.ts +21 -2
- package/dist/src/prose-segments.d.ts.map +1 -1
- package/dist/src/prose-segments.js +46 -9
- package/dist/src/prose-segments.js.map +1 -1
- package/dist/src/recovery/offline-branch.d.ts +1 -0
- package/dist/src/recovery/offline-branch.d.ts.map +1 -1
- package/dist/src/recovery/offline-branch.js +3 -1
- package/dist/src/recovery/offline-branch.js.map +1 -1
- package/dist/src/safe-slice.d.ts +5 -1
- package/dist/src/safe-slice.d.ts.map +1 -1
- package/dist/src/safe-slice.js +9 -1
- package/dist/src/safe-slice.js.map +1 -1
- package/dist/src/silent-heartbeat.d.ts +112 -39
- package/dist/src/silent-heartbeat.d.ts.map +1 -1
- package/dist/src/silent-heartbeat.js +100 -29
- package/dist/src/silent-heartbeat.js.map +1 -1
- package/dist/src/tool-args.d.ts +40 -0
- package/dist/src/tool-args.d.ts.map +1 -0
- package/dist/src/tool-args.js +207 -0
- package/dist/src/tool-args.js.map +1 -0
- package/dist/src/tool-image-ledger.d.ts +87 -19
- package/dist/src/tool-image-ledger.d.ts.map +1 -1
- package/dist/src/tool-image-ledger.js +135 -32
- package/dist/src/tool-image-ledger.js.map +1 -1
- package/dist/src/tool-presentation.d.ts +9 -0
- package/dist/src/tool-presentation.d.ts.map +1 -1
- package/dist/src/tool-presentation.js +266 -62
- package/dist/src/tool-presentation.js.map +1 -1
- package/dist/src/tool-result-guard.d.ts.map +1 -1
- package/dist/src/tool-result-guard.js +7 -10
- package/dist/src/tool-result-guard.js.map +1 -1
- package/dist/src/tool-result-history.d.ts +32 -3
- package/dist/src/tool-result-history.d.ts.map +1 -1
- package/dist/src/tool-result-history.js +106 -19
- package/dist/src/tool-result-history.js.map +1 -1
- package/dist/src/tune-out/coordinator.d.ts +25 -1
- package/dist/src/tune-out/coordinator.d.ts.map +1 -1
- package/dist/src/tune-out/coordinator.js +260 -65
- package/dist/src/tune-out/coordinator.js.map +1 -1
- package/dist/src/types/agent.d.ts +44 -22
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/events.d.ts +25 -0
- package/dist/src/types/events.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +38 -7
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/inference-log.d.ts +1 -1
- package/dist/src/types/inference-log.d.ts.map +1 -1
- package/dist/src/types/module.d.ts +77 -14
- package/dist/src/types/module.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +97 -8
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/src/usage/usage-tracker.d.ts +5 -0
- package/dist/src/usage/usage-tracker.d.ts.map +1 -1
- package/dist/src/usage/usage-tracker.js +35 -8
- package/dist/src/usage/usage-tracker.js.map +1 -1
- package/package.json +5 -4
- package/src/agent.ts +257 -72
- package/src/api/mcp-server-core.ts +1 -1
- package/src/api/server.ts +4 -1
- package/src/api/types.ts +1 -1
- package/src/branch-names.ts +19 -0
- package/src/closest-names.ts +94 -0
- package/src/code-execution/index.ts +1 -0
- package/src/code-execution/py-runner.ts +304 -93
- package/src/code-execution/runtime-py.ts +94 -8
- package/src/code-execution/tool-definition.ts +85 -7
- package/src/config-checks.ts +50 -0
- package/src/deadline-timer.ts +44 -0
- package/src/error-message.ts +48 -0
- package/src/framework.ts +8625 -1984
- package/src/gate/event-gate.ts +38 -5
- package/src/held-writes.ts +59 -0
- package/src/index.ts +29 -5
- package/src/mcpl/capability-grant.ts +1 -1
- package/src/mcpl/channel-registry.ts +1095 -411
- package/src/mcpl/checkpoint-manager.ts +104 -29
- package/src/mcpl/conversation-router.ts +28 -8
- package/src/mcpl/convert-block.ts +105 -0
- package/src/mcpl/errors.ts +28 -0
- package/src/mcpl/hook-orchestrator.ts +84 -77
- package/src/mcpl/inbound-source.ts +156 -0
- package/src/mcpl/index.ts +23 -1
- package/src/mcpl/inference-router.ts +179 -103
- package/src/mcpl/log-value.ts +10 -0
- package/src/mcpl/modern-connection.ts +1182 -0
- package/src/mcpl/prefix-rule.ts +32 -0
- package/src/mcpl/protocol-family.ts +691 -0
- package/src/mcpl/push-coalescer.ts +110 -36
- package/src/mcpl/push-handler.ts +20 -90
- package/src/mcpl/reference-fetcher.ts +318 -67
- package/src/mcpl/references.ts +183 -34
- package/src/mcpl/server-connection.ts +1404 -280
- package/src/mcpl/server-registry.ts +63 -14
- package/src/mcpl/skip-reply-wake.ts +73 -0
- package/src/mcpl/tool-result-normalize.ts +294 -0
- package/src/mcpl/transport.ts +320 -76
- package/src/mcpl/types.ts +77 -19
- package/src/mcpl/visible-content.ts +28 -0
- package/src/module-registry.ts +126 -36
- package/src/modules/api/index.ts +3 -2
- package/src/modules/discord/discord-js-client.ts +306 -74
- package/src/modules/discord/index.ts +737 -201
- package/src/modules/discord/refusal.ts +13 -0
- package/src/modules/discord/types.ts +27 -6
- package/src/modules/health/index.ts +8 -3
- package/src/modules/history/index.ts +410 -120
- package/src/modules/history/semantic.ts +189 -32
- package/src/modules/index.ts +1 -1
- package/src/modules/unknown-tool.ts +16 -0
- package/src/modules/workspace/disk-agreement.ts +97 -8
- package/src/modules/workspace/effects.ts +291 -36
- package/src/modules/workspace/index.ts +1469 -321
- package/src/modules/workspace/observe.ts +784 -41
- package/src/modules/workspace/reconcile.ts +619 -64
- package/src/modules/workspace/types.ts +28 -5
- package/src/modules/workspace/watcher.ts +154 -30
- package/src/prose-drafts.ts +481 -0
- package/src/prose-segments.ts +51 -8
- package/src/recovery/offline-branch.ts +4 -1
- package/src/safe-slice.ts +9 -1
- package/src/silent-heartbeat.ts +184 -59
- package/src/tool-args.ts +213 -0
- package/src/tool-image-ledger.ts +153 -34
- package/src/tool-presentation.ts +233 -42
- package/src/tool-result-guard.ts +7 -8
- package/src/tool-result-history.ts +124 -20
- package/src/tune-out/coordinator.ts +259 -65
- package/src/types/agent.ts +44 -24
- package/src/types/events.ts +25 -0
- package/src/types/framework.ts +38 -7
- package/src/types/inference-log.ts +1 -1
- package/src/types/module.ts +79 -14
- package/src/types/trace.ts +103 -8
- package/src/usage/usage-tracker.ts +32 -8
- package/dist/test/activation-request-sanitize.test.d.ts +0 -2
- package/dist/test/activation-request-sanitize.test.d.ts.map +0 -1
- package/dist/test/activation-request-sanitize.test.js +0 -89
- package/dist/test/activation-request-sanitize.test.js.map +0 -1
- package/dist/test/agent-cache-ttl.test.d.ts +0 -2
- package/dist/test/agent-cache-ttl.test.d.ts.map +0 -1
- package/dist/test/agent-cache-ttl.test.js +0 -41
- package/dist/test/agent-cache-ttl.test.js.map +0 -1
- package/dist/test/agent-runtime-settings.test.d.ts +0 -2
- package/dist/test/agent-runtime-settings.test.d.ts.map +0 -1
- package/dist/test/agent-runtime-settings.test.js +0 -1598
- package/dist/test/agent-runtime-settings.test.js.map +0 -1
- package/dist/test/api-admin-gate.test.d.ts +0 -2
- package/dist/test/api-admin-gate.test.d.ts.map +0 -1
- package/dist/test/api-admin-gate.test.js +0 -116
- package/dist/test/api-admin-gate.test.js.map +0 -1
- package/dist/test/assistant-persist-refusal.test.d.ts +0 -2
- package/dist/test/assistant-persist-refusal.test.d.ts.map +0 -1
- package/dist/test/assistant-persist-refusal.test.js +0 -63
- package/dist/test/assistant-persist-refusal.test.js.map +0 -1
- package/dist/test/batched-wake-locus.test.d.ts +0 -2
- package/dist/test/batched-wake-locus.test.d.ts.map +0 -1
- package/dist/test/batched-wake-locus.test.js +0 -166
- package/dist/test/batched-wake-locus.test.js.map +0 -1
- package/dist/test/busy-agent-scheduler.test.d.ts +0 -2
- package/dist/test/busy-agent-scheduler.test.d.ts.map +0 -1
- package/dist/test/busy-agent-scheduler.test.js +0 -92
- package/dist/test/busy-agent-scheduler.test.js.map +0 -1
- package/dist/test/channel-incoming-targeting.test.d.ts +0 -2
- package/dist/test/channel-incoming-targeting.test.d.ts.map +0 -1
- package/dist/test/channel-incoming-targeting.test.js +0 -81
- package/dist/test/channel-incoming-targeting.test.js.map +0 -1
- package/dist/test/channel-label-history.test.d.ts +0 -2
- package/dist/test/channel-label-history.test.d.ts.map +0 -1
- package/dist/test/channel-label-history.test.js +0 -424
- package/dist/test/channel-label-history.test.js.map +0 -1
- package/dist/test/channel-lifecycle-provenance.test.d.ts +0 -2
- package/dist/test/channel-lifecycle-provenance.test.d.ts.map +0 -1
- package/dist/test/channel-lifecycle-provenance.test.js +0 -47
- package/dist/test/channel-lifecycle-provenance.test.js.map +0 -1
- package/dist/test/channel-registry-routing.test.d.ts +0 -2
- package/dist/test/channel-registry-routing.test.d.ts.map +0 -1
- package/dist/test/channel-registry-routing.test.js +0 -446
- package/dist/test/channel-registry-routing.test.js.map +0 -1
- package/dist/test/channel-registry-typing.test.d.ts +0 -2
- package/dist/test/channel-registry-typing.test.d.ts.map +0 -1
- package/dist/test/channel-registry-typing.test.js +0 -91
- package/dist/test/channel-registry-typing.test.js.map +0 -1
- package/dist/test/channels-changed-respond-first.test.d.ts +0 -2
- package/dist/test/channels-changed-respond-first.test.d.ts.map +0 -1
- package/dist/test/channels-changed-respond-first.test.js +0 -74
- package/dist/test/channels-changed-respond-first.test.js.map +0 -1
- package/dist/test/checkpoint-attribution.test.d.ts +0 -2
- package/dist/test/checkpoint-attribution.test.d.ts.map +0 -1
- package/dist/test/checkpoint-attribution.test.js +0 -200
- package/dist/test/checkpoint-attribution.test.js.map +0 -1
- package/dist/test/code-execution.test.d.ts +0 -11
- package/dist/test/code-execution.test.d.ts.map +0 -1
- package/dist/test/code-execution.test.js +0 -1272
- package/dist/test/code-execution.test.js.map +0 -1
- package/dist/test/component-defaults.test.d.ts +0 -2
- package/dist/test/component-defaults.test.d.ts.map +0 -1
- package/dist/test/component-defaults.test.js +0 -54
- package/dist/test/component-defaults.test.js.map +0 -1
- package/dist/test/conversation-fork-injection-scoping.test.d.ts +0 -2
- package/dist/test/conversation-fork-injection-scoping.test.d.ts.map +0 -1
- package/dist/test/conversation-fork-injection-scoping.test.js +0 -200
- package/dist/test/conversation-fork-injection-scoping.test.js.map +0 -1
- package/dist/test/conversation-router.test.d.ts +0 -2
- package/dist/test/conversation-router.test.d.ts.map +0 -1
- package/dist/test/conversation-router.test.js +0 -174
- package/dist/test/conversation-router.test.js.map +0 -1
- package/dist/test/conversation-routing.test.d.ts +0 -7
- package/dist/test/conversation-routing.test.d.ts.map +0 -1
- package/dist/test/conversation-routing.test.js +0 -621
- package/dist/test/conversation-routing.test.js.map +0 -1
- package/dist/test/deferred-wake-integrity.test.d.ts +0 -29
- package/dist/test/deferred-wake-integrity.test.d.ts.map +0 -1
- package/dist/test/deferred-wake-integrity.test.js +0 -320
- package/dist/test/deferred-wake-integrity.test.js.map +0 -1
- package/dist/test/discord-awareness-outbox.test.d.ts +0 -2
- package/dist/test/discord-awareness-outbox.test.d.ts.map +0 -1
- package/dist/test/discord-awareness-outbox.test.js +0 -371
- package/dist/test/discord-awareness-outbox.test.js.map +0 -1
- package/dist/test/discord-history-delete-window.test.d.ts +0 -2
- package/dist/test/discord-history-delete-window.test.d.ts.map +0 -1
- package/dist/test/discord-history-delete-window.test.js +0 -81
- package/dist/test/discord-history-delete-window.test.js.map +0 -1
- package/dist/test/discord-history-sync.test.d.ts +0 -2
- package/dist/test/discord-history-sync.test.d.ts.map +0 -1
- package/dist/test/discord-history-sync.test.js +0 -56
- package/dist/test/discord-history-sync.test.js.map +0 -1
- package/dist/test/discord-typing-keepalive.test.d.ts +0 -2
- package/dist/test/discord-typing-keepalive.test.d.ts.map +0 -1
- package/dist/test/discord-typing-keepalive.test.js +0 -77
- package/dist/test/discord-typing-keepalive.test.js.map +0 -1
- package/dist/test/ephemeral-settle.test.d.ts +0 -2
- package/dist/test/ephemeral-settle.test.d.ts.map +0 -1
- package/dist/test/ephemeral-settle.test.js +0 -354
- package/dist/test/ephemeral-settle.test.js.map +0 -1
- package/dist/test/event-gate-passthrough.test.d.ts +0 -15
- package/dist/test/event-gate-passthrough.test.d.ts.map +0 -1
- package/dist/test/event-gate-passthrough.test.js +0 -289
- package/dist/test/event-gate-passthrough.test.js.map +0 -1
- package/dist/test/event-gate-policy-mutation.test.d.ts +0 -2
- package/dist/test/event-gate-policy-mutation.test.d.ts.map +0 -1
- package/dist/test/event-gate-policy-mutation.test.js +0 -137
- package/dist/test/event-gate-policy-mutation.test.js.map +0 -1
- package/dist/test/event-gate-rate-limit.test.d.ts +0 -2
- package/dist/test/event-gate-rate-limit.test.d.ts.map +0 -1
- package/dist/test/event-gate-rate-limit.test.js +0 -627
- package/dist/test/event-gate-rate-limit.test.js.map +0 -1
- package/dist/test/event-gate-script.test.d.ts +0 -2
- package/dist/test/event-gate-script.test.d.ts.map +0 -1
- package/dist/test/event-gate-script.test.js +0 -95
- package/dist/test/event-gate-script.test.js.map +0 -1
- package/dist/test/event-gate-selfwake.test.d.ts +0 -15
- package/dist/test/event-gate-selfwake.test.d.ts.map +0 -1
- package/dist/test/event-gate-selfwake.test.js +0 -125
- package/dist/test/event-gate-selfwake.test.js.map +0 -1
- package/dist/test/event-gate-tags.test.d.ts +0 -2
- package/dist/test/event-gate-tags.test.d.ts.map +0 -1
- package/dist/test/event-gate-tags.test.js +0 -76
- package/dist/test/event-gate-tags.test.js.map +0 -1
- package/dist/test/event-gate.test.d.ts +0 -2
- package/dist/test/event-gate.test.d.ts.map +0 -1
- package/dist/test/event-gate.test.js +0 -919
- package/dist/test/event-gate.test.js.map +0 -1
- package/dist/test/explicit-prose-routing.test.d.ts +0 -11
- package/dist/test/explicit-prose-routing.test.d.ts.map +0 -1
- package/dist/test/explicit-prose-routing.test.js +0 -1715
- package/dist/test/explicit-prose-routing.test.js.map +0 -1
- package/dist/test/framework.test.d.ts +0 -5
- package/dist/test/framework.test.d.ts.map +0 -1
- package/dist/test/framework.test.js +0 -1048
- package/dist/test/framework.test.js.map +0 -1
- package/dist/test/gather-context-timeout.test.d.ts +0 -2
- package/dist/test/gather-context-timeout.test.d.ts.map +0 -1
- package/dist/test/gather-context-timeout.test.js +0 -120
- package/dist/test/gather-context-timeout.test.js.map +0 -1
- package/dist/test/health-snapshot.test.d.ts +0 -2
- package/dist/test/health-snapshot.test.d.ts.map +0 -1
- package/dist/test/health-snapshot.test.js +0 -74
- package/dist/test/health-snapshot.test.js.map +0 -1
- package/dist/test/helpers/coalescing-fixture.d.ts +0 -74
- package/dist/test/helpers/coalescing-fixture.d.ts.map +0 -1
- package/dist/test/helpers/coalescing-fixture.js +0 -152
- package/dist/test/helpers/coalescing-fixture.js.map +0 -1
- package/dist/test/helpers/coalescing-kill-child.d.ts +0 -2
- package/dist/test/helpers/coalescing-kill-child.d.ts.map +0 -1
- package/dist/test/helpers/coalescing-kill-child.js +0 -24
- package/dist/test/helpers/coalescing-kill-child.js.map +0 -1
- package/dist/test/helpers/mock-membrane.d.ts +0 -53
- package/dist/test/helpers/mock-membrane.d.ts.map +0 -1
- package/dist/test/helpers/mock-membrane.js +0 -168
- package/dist/test/helpers/mock-membrane.js.map +0 -1
- package/dist/test/helpers/pytc-stop-rows.d.ts +0 -11
- package/dist/test/helpers/pytc-stop-rows.d.ts.map +0 -1
- package/dist/test/helpers/pytc-stop-rows.js +0 -143
- package/dist/test/helpers/pytc-stop-rows.js.map +0 -1
- package/dist/test/helpers/quiesce-crash-child.d.ts +0 -2
- package/dist/test/helpers/quiesce-crash-child.d.ts.map +0 -1
- package/dist/test/helpers/quiesce-crash-child.js +0 -156
- package/dist/test/helpers/quiesce-crash-child.js.map +0 -1
- package/dist/test/hide-then-turn.test.d.ts +0 -2
- package/dist/test/hide-then-turn.test.d.ts.map +0 -1
- package/dist/test/hide-then-turn.test.js +0 -101
- package/dist/test/hide-then-turn.test.js.map +0 -1
- package/dist/test/history-module-overview.test.d.ts +0 -2
- package/dist/test/history-module-overview.test.d.ts.map +0 -1
- package/dist/test/history-module-overview.test.js +0 -711
- package/dist/test/history-module-overview.test.js.map +0 -1
- package/dist/test/history-module-realstore.test.d.ts +0 -2
- package/dist/test/history-module-realstore.test.d.ts.map +0 -1
- package/dist/test/history-module-realstore.test.js +0 -363
- package/dist/test/history-module-realstore.test.js.map +0 -1
- package/dist/test/history-module-semantic.test.d.ts +0 -2
- package/dist/test/history-module-semantic.test.d.ts.map +0 -1
- package/dist/test/history-module-semantic.test.js +0 -213
- package/dist/test/history-module-semantic.test.js.map +0 -1
- package/dist/test/history-module-ux.test.d.ts +0 -2
- package/dist/test/history-module-ux.test.d.ts.map +0 -1
- package/dist/test/history-module-ux.test.js +0 -304
- package/dist/test/history-module-ux.test.js.map +0 -1
- package/dist/test/history-module.test.d.ts +0 -2
- package/dist/test/history-module.test.d.ts.map +0 -1
- package/dist/test/history-module.test.js +0 -619
- package/dist/test/history-module.test.js.map +0 -1
- package/dist/test/history-semantic-review-findings.test.d.ts +0 -2
- package/dist/test/history-semantic-review-findings.test.d.ts.map +0 -1
- package/dist/test/history-semantic-review-findings.test.js +0 -338
- package/dist/test/history-semantic-review-findings.test.js.map +0 -1
- package/dist/test/history-semantic-sync-converges.test.d.ts +0 -2
- package/dist/test/history-semantic-sync-converges.test.d.ts.map +0 -1
- package/dist/test/history-semantic-sync-converges.test.js +0 -109
- package/dist/test/history-semantic-sync-converges.test.js.map +0 -1
- package/dist/test/host-quiesce.test.d.ts +0 -2
- package/dist/test/host-quiesce.test.d.ts.map +0 -1
- package/dist/test/host-quiesce.test.js +0 -988
- package/dist/test/host-quiesce.test.js.map +0 -1
- package/dist/test/inference-exhaustion-rewind.test.d.ts +0 -2
- package/dist/test/inference-exhaustion-rewind.test.d.ts.map +0 -1
- package/dist/test/inference-exhaustion-rewind.test.js +0 -387
- package/dist/test/inference-exhaustion-rewind.test.js.map +0 -1
- package/dist/test/inference-failure-bounds.test.d.ts +0 -2
- package/dist/test/inference-failure-bounds.test.d.ts.map +0 -1
- package/dist/test/inference-failure-bounds.test.js +0 -1202
- package/dist/test/inference-failure-bounds.test.js.map +0 -1
- package/dist/test/inference-failure-observability.test.d.ts +0 -2
- package/dist/test/inference-failure-observability.test.d.ts.map +0 -1
- package/dist/test/inference-failure-observability.test.js +0 -84
- package/dist/test/inference-failure-observability.test.js.map +0 -1
- package/dist/test/journal-tool.test.d.ts +0 -2
- package/dist/test/journal-tool.test.d.ts.map +0 -1
- package/dist/test/journal-tool.test.js +0 -33
- package/dist/test/journal-tool.test.js.map +0 -1
- package/dist/test/kv-unified-open-flight-retry.test.d.ts +0 -2
- package/dist/test/kv-unified-open-flight-retry.test.d.ts.map +0 -1
- package/dist/test/kv-unified-open-flight-retry.test.js +0 -189
- package/dist/test/kv-unified-open-flight-retry.test.js.map +0 -1
- package/dist/test/kv-unified-wiring.test.d.ts +0 -2
- package/dist/test/kv-unified-wiring.test.d.ts.map +0 -1
- package/dist/test/kv-unified-wiring.test.js +0 -95
- package/dist/test/kv-unified-wiring.test.js.map +0 -1
- package/dist/test/late-events-after-stop.test.d.ts +0 -2
- package/dist/test/late-events-after-stop.test.d.ts.map +0 -1
- package/dist/test/late-events-after-stop.test.js +0 -122
- package/dist/test/late-events-after-stop.test.js.map +0 -1
- package/dist/test/liveness-watchdog.test.d.ts +0 -2
- package/dist/test/liveness-watchdog.test.d.ts.map +0 -1
- package/dist/test/liveness-watchdog.test.js +0 -94
- package/dist/test/liveness-watchdog.test.js.map +0 -1
- package/dist/test/machine-close-provenance.test.d.ts +0 -2
- package/dist/test/machine-close-provenance.test.d.ts.map +0 -1
- package/dist/test/machine-close-provenance.test.js +0 -116
- package/dist/test/machine-close-provenance.test.js.map +0 -1
- package/dist/test/maintenance-timer.test.d.ts +0 -2
- package/dist/test/maintenance-timer.test.d.ts.map +0 -1
- package/dist/test/maintenance-timer.test.js +0 -1827
- package/dist/test/maintenance-timer.test.js.map +0 -1
- package/dist/test/mcp-server-bin.test.d.ts +0 -2
- package/dist/test/mcp-server-bin.test.d.ts.map +0 -1
- package/dist/test/mcp-server-bin.test.js +0 -142
- package/dist/test/mcp-server-bin.test.js.map +0 -1
- package/dist/test/mcpl-access-provider.test.d.ts +0 -2
- package/dist/test/mcpl-access-provider.test.d.ts.map +0 -1
- package/dist/test/mcpl-access-provider.test.js +0 -20
- package/dist/test/mcpl-access-provider.test.js.map +0 -1
- package/dist/test/mcpl-awareness-barrier.test.d.ts +0 -2
- package/dist/test/mcpl-awareness-barrier.test.d.ts.map +0 -1
- package/dist/test/mcpl-awareness-barrier.test.js +0 -769
- package/dist/test/mcpl-awareness-barrier.test.js.map +0 -1
- package/dist/test/mcpl-capability-grant.test.d.ts +0 -10
- package/dist/test/mcpl-capability-grant.test.d.ts.map +0 -1
- package/dist/test/mcpl-capability-grant.test.js +0 -111
- package/dist/test/mcpl-capability-grant.test.js.map +0 -1
- package/dist/test/mcpl-capability-scoping.test.d.ts +0 -2
- package/dist/test/mcpl-capability-scoping.test.d.ts.map +0 -1
- package/dist/test/mcpl-capability-scoping.test.js +0 -266
- package/dist/test/mcpl-capability-scoping.test.js.map +0 -1
- package/dist/test/mcpl-child-env.test.d.ts +0 -2
- package/dist/test/mcpl-child-env.test.d.ts.map +0 -1
- package/dist/test/mcpl-child-env.test.js +0 -158
- package/dist/test/mcpl-child-env.test.js.map +0 -1
- package/dist/test/mcpl-coalesced-content-parity.test.d.ts +0 -2
- package/dist/test/mcpl-coalesced-content-parity.test.d.ts.map +0 -1
- package/dist/test/mcpl-coalesced-content-parity.test.js +0 -532
- package/dist/test/mcpl-coalesced-content-parity.test.js.map +0 -1
- package/dist/test/mcpl-coalescing.test.d.ts +0 -2
- package/dist/test/mcpl-coalescing.test.d.ts.map +0 -1
- package/dist/test/mcpl-coalescing.test.js +0 -1125
- package/dist/test/mcpl-coalescing.test.js.map +0 -1
- package/dist/test/mcpl-config-diagnostics.test.d.ts +0 -2
- package/dist/test/mcpl-config-diagnostics.test.d.ts.map +0 -1
- package/dist/test/mcpl-config-diagnostics.test.js +0 -452
- package/dist/test/mcpl-config-diagnostics.test.js.map +0 -1
- package/dist/test/mcpl-empty-content.test.d.ts +0 -2
- package/dist/test/mcpl-empty-content.test.d.ts.map +0 -1
- package/dist/test/mcpl-empty-content.test.js +0 -368
- package/dist/test/mcpl-empty-content.test.js.map +0 -1
- package/dist/test/mcpl-gate-roundtrip.test.d.ts +0 -2
- package/dist/test/mcpl-gate-roundtrip.test.d.ts.map +0 -1
- package/dist/test/mcpl-gate-roundtrip.test.js +0 -285
- package/dist/test/mcpl-gate-roundtrip.test.js.map +0 -1
- package/dist/test/mcpl-list-status.test.d.ts +0 -2
- package/dist/test/mcpl-list-status.test.d.ts.map +0 -1
- package/dist/test/mcpl-list-status.test.js +0 -82
- package/dist/test/mcpl-list-status.test.js.map +0 -1
- package/dist/test/mcpl-manifest-changed.test.d.ts +0 -2
- package/dist/test/mcpl-manifest-changed.test.d.ts.map +0 -1
- package/dist/test/mcpl-manifest-changed.test.js +0 -178
- package/dist/test/mcpl-manifest-changed.test.js.map +0 -1
- package/dist/test/mcpl-push-convert.test.d.ts +0 -2
- package/dist/test/mcpl-push-convert.test.d.ts.map +0 -1
- package/dist/test/mcpl-push-convert.test.js +0 -42
- package/dist/test/mcpl-push-convert.test.js.map +0 -1
- package/dist/test/mcpl-reconnect-events.test.d.ts +0 -2
- package/dist/test/mcpl-reconnect-events.test.d.ts.map +0 -1
- package/dist/test/mcpl-reconnect-events.test.js +0 -144
- package/dist/test/mcpl-reconnect-events.test.js.map +0 -1
- package/dist/test/mcpl-reconnect-reregistration.test.d.ts +0 -2
- package/dist/test/mcpl-reconnect-reregistration.test.d.ts.map +0 -1
- package/dist/test/mcpl-reconnect-reregistration.test.js +0 -238
- package/dist/test/mcpl-reconnect-reregistration.test.js.map +0 -1
- package/dist/test/mcpl-reference-fetcher.test.d.ts +0 -2
- package/dist/test/mcpl-reference-fetcher.test.d.ts.map +0 -1
- package/dist/test/mcpl-reference-fetcher.test.js +0 -427
- package/dist/test/mcpl-reference-fetcher.test.js.map +0 -1
- package/dist/test/mcpl-reference-fields.test.d.ts +0 -2
- package/dist/test/mcpl-reference-fields.test.d.ts.map +0 -1
- package/dist/test/mcpl-reference-fields.test.js +0 -149
- package/dist/test/mcpl-reference-fields.test.js.map +0 -1
- package/dist/test/mcpl-rejection-log-lines.test.d.ts +0 -2
- package/dist/test/mcpl-rejection-log-lines.test.d.ts.map +0 -1
- package/dist/test/mcpl-rejection-log-lines.test.js +0 -349
- package/dist/test/mcpl-rejection-log-lines.test.js.map +0 -1
- package/dist/test/mcpl-request-timeout.test.d.ts +0 -2
- package/dist/test/mcpl-request-timeout.test.d.ts.map +0 -1
- package/dist/test/mcpl-request-timeout.test.js +0 -138
- package/dist/test/mcpl-request-timeout.test.js.map +0 -1
- package/dist/test/mcpl-runtime-lifecycle.test.d.ts +0 -7
- package/dist/test/mcpl-runtime-lifecycle.test.d.ts.map +0 -1
- package/dist/test/mcpl-runtime-lifecycle.test.js +0 -142
- package/dist/test/mcpl-runtime-lifecycle.test.js.map +0 -1
- package/dist/test/mcpl-stderr-tail.test.d.ts +0 -2
- package/dist/test/mcpl-stderr-tail.test.d.ts.map +0 -1
- package/dist/test/mcpl-stderr-tail.test.js +0 -210
- package/dist/test/mcpl-stderr-tail.test.js.map +0 -1
- package/dist/test/mcpl-tool-class-listing.test.d.ts +0 -2
- package/dist/test/mcpl-tool-class-listing.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-class-listing.test.js +0 -147
- package/dist/test/mcpl-tool-class-listing.test.js.map +0 -1
- package/dist/test/mcpl-tool-classes.test.d.ts +0 -7
- package/dist/test/mcpl-tool-classes.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-classes.test.js +0 -80
- package/dist/test/mcpl-tool-classes.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts +0 -2
- package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-e2e.test.js +0 -237
- package/dist/test/mcpl-tool-lifecycle-e2e.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts +0 -11
- package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-emitter.test.js +0 -412
- package/dist/test/mcpl-tool-lifecycle-emitter.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-script.test.d.ts +0 -2
- package/dist/test/mcpl-tool-lifecycle-script.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-script.test.js +0 -288
- package/dist/test/mcpl-tool-lifecycle-script.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle.test.d.ts +0 -11
- package/dist/test/mcpl-tool-lifecycle.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle.test.js +0 -270
- package/dist/test/mcpl-tool-lifecycle.test.js.map +0 -1
- package/dist/test/mcpl-transport-close.test.d.ts +0 -2
- package/dist/test/mcpl-transport-close.test.d.ts.map +0 -1
- package/dist/test/mcpl-transport-close.test.js +0 -373
- package/dist/test/mcpl-transport-close.test.js.map +0 -1
- package/dist/test/mcpl-transport-spawn.test.d.ts +0 -2
- package/dist/test/mcpl-transport-spawn.test.d.ts.map +0 -1
- package/dist/test/mcpl-transport-spawn.test.js +0 -58
- package/dist/test/mcpl-transport-spawn.test.js.map +0 -1
- package/dist/test/mcpl-ws-transport.test.d.ts +0 -2
- package/dist/test/mcpl-ws-transport.test.d.ts.map +0 -1
- package/dist/test/mcpl-ws-transport.test.js +0 -259
- package/dist/test/mcpl-ws-transport.test.js.map +0 -1
- package/dist/test/module-context-integration.test.d.ts +0 -18
- package/dist/test/module-context-integration.test.d.ts.map +0 -1
- package/dist/test/module-context-integration.test.js +0 -181
- package/dist/test/module-context-integration.test.js.map +0 -1
- package/dist/test/offline-recovery-branch.test.d.ts +0 -2
- package/dist/test/offline-recovery-branch.test.d.ts.map +0 -1
- package/dist/test/offline-recovery-branch.test.js +0 -570
- package/dist/test/offline-recovery-branch.test.js.map +0 -1
- package/dist/test/operator-surgery.test.d.ts +0 -2
- package/dist/test/operator-surgery.test.d.ts.map +0 -1
- package/dist/test/operator-surgery.test.js +0 -595
- package/dist/test/operator-surgery.test.js.map +0 -1
- package/dist/test/ops-alert.test.d.ts +0 -2
- package/dist/test/ops-alert.test.d.ts.map +0 -1
- package/dist/test/ops-alert.test.js +0 -153
- package/dist/test/ops-alert.test.js.map +0 -1
- package/dist/test/overbudget-drain-breaker.test.d.ts +0 -2
- package/dist/test/overbudget-drain-breaker.test.d.ts.map +0 -1
- package/dist/test/overbudget-drain-breaker.test.js +0 -198
- package/dist/test/overbudget-drain-breaker.test.js.map +0 -1
- package/dist/test/pack-installs-alone.test.d.ts +0 -2
- package/dist/test/pack-installs-alone.test.d.ts.map +0 -1
- package/dist/test/pack-installs-alone.test.js +0 -284
- package/dist/test/pack-installs-alone.test.js.map +0 -1
- package/dist/test/per-agent-delivery.test.d.ts +0 -2
- package/dist/test/per-agent-delivery.test.d.ts.map +0 -1
- package/dist/test/per-agent-delivery.test.js +0 -108
- package/dist/test/per-agent-delivery.test.js.map +0 -1
- package/dist/test/physical-window-restart.test.d.ts +0 -16
- package/dist/test/physical-window-restart.test.d.ts.map +0 -1
- package/dist/test/physical-window-restart.test.js +0 -487
- package/dist/test/physical-window-restart.test.js.map +0 -1
- package/dist/test/placed-reaction-baseline.test.d.ts +0 -2
- package/dist/test/placed-reaction-baseline.test.d.ts.map +0 -1
- package/dist/test/placed-reaction-baseline.test.js +0 -312
- package/dist/test/placed-reaction-baseline.test.js.map +0 -1
- package/dist/test/present-while-acting.test.d.ts +0 -19
- package/dist/test/present-while-acting.test.d.ts.map +0 -1
- package/dist/test/present-while-acting.test.js +0 -1649
- package/dist/test/present-while-acting.test.js.map +0 -1
- package/dist/test/prose-segments.test.d.ts +0 -2
- package/dist/test/prose-segments.test.d.ts.map +0 -1
- package/dist/test/prose-segments.test.js +0 -52
- package/dist/test/prose-segments.test.js.map +0 -1
- package/dist/test/prose-stream-router.test.d.ts +0 -2
- package/dist/test/prose-stream-router.test.d.ts.map +0 -1
- package/dist/test/prose-stream-router.test.js +0 -171
- package/dist/test/prose-stream-router.test.js.map +0 -1
- package/dist/test/provider-acceleration-cooldown.test.d.ts +0 -2
- package/dist/test/provider-acceleration-cooldown.test.d.ts.map +0 -1
- package/dist/test/provider-acceleration-cooldown.test.js +0 -435
- package/dist/test/provider-acceleration-cooldown.test.js.map +0 -1
- package/dist/test/provider-waits.test.d.ts +0 -2
- package/dist/test/provider-waits.test.d.ts.map +0 -1
- package/dist/test/provider-waits.test.js +0 -2259
- package/dist/test/provider-waits.test.js.map +0 -1
- package/dist/test/puppet-tool-call.test.d.ts +0 -2
- package/dist/test/puppet-tool-call.test.d.ts.map +0 -1
- package/dist/test/puppet-tool-call.test.js +0 -226
- package/dist/test/puppet-tool-call.test.js.map +0 -1
- package/dist/test/puppet-turn-reservation.test.d.ts +0 -2
- package/dist/test/puppet-turn-reservation.test.d.ts.map +0 -1
- package/dist/test/puppet-turn-reservation.test.js +0 -139
- package/dist/test/puppet-turn-reservation.test.js.map +0 -1
- package/dist/test/reaction-baseline-platform.test.d.ts +0 -2
- package/dist/test/reaction-baseline-platform.test.d.ts.map +0 -1
- package/dist/test/reaction-baseline-platform.test.js +0 -124
- package/dist/test/reaction-baseline-platform.test.js.map +0 -1
- package/dist/test/record-journal.test.d.ts +0 -6
- package/dist/test/record-journal.test.d.ts.map +0 -1
- package/dist/test/record-journal.test.js +0 -269
- package/dist/test/record-journal.test.js.map +0 -1
- package/dist/test/refusal-reaction-baseline.test.d.ts +0 -2
- package/dist/test/refusal-reaction-baseline.test.d.ts.map +0 -1
- package/dist/test/refusal-reaction-baseline.test.js +0 -81
- package/dist/test/refusal-reaction-baseline.test.js.map +0 -1
- package/dist/test/refusal-rewind.test.d.ts +0 -2
- package/dist/test/refusal-rewind.test.d.ts.map +0 -1
- package/dist/test/refusal-rewind.test.js +0 -117
- package/dist/test/refusal-rewind.test.js.map +0 -1
- package/dist/test/refusal-single-call.test.d.ts +0 -2
- package/dist/test/refusal-single-call.test.d.ts.map +0 -1
- package/dist/test/refusal-single-call.test.js +0 -177
- package/dist/test/refusal-single-call.test.js.map +0 -1
- package/dist/test/release-bump.test.d.ts +0 -2
- package/dist/test/release-bump.test.d.ts.map +0 -1
- package/dist/test/release-bump.test.js +0 -248
- package/dist/test/release-bump.test.js.map +0 -1
- package/dist/test/release-changelog.test.d.ts +0 -2
- package/dist/test/release-changelog.test.d.ts.map +0 -1
- package/dist/test/release-changelog.test.js +0 -159
- package/dist/test/release-changelog.test.js.map +0 -1
- package/dist/test/release-holds.test.d.ts +0 -2
- package/dist/test/release-holds.test.d.ts.map +0 -1
- package/dist/test/release-holds.test.js +0 -456
- package/dist/test/release-holds.test.js.map +0 -1
- package/dist/test/same-round-think-policy.test.d.ts +0 -2
- package/dist/test/same-round-think-policy.test.d.ts.map +0 -1
- package/dist/test/same-round-think-policy.test.js +0 -853
- package/dist/test/same-round-think-policy.test.js.map +0 -1
- package/dist/test/save-recent-image.test.d.ts +0 -26
- package/dist/test/save-recent-image.test.d.ts.map +0 -1
- package/dist/test/save-recent-image.test.js +0 -974
- package/dist/test/save-recent-image.test.js.map +0 -1
- package/dist/test/shutdown-errors.test.d.ts +0 -2
- package/dist/test/shutdown-errors.test.d.ts.map +0 -1
- package/dist/test/shutdown-errors.test.js +0 -662
- package/dist/test/shutdown-errors.test.js.map +0 -1
- package/dist/test/silent-heartbeat-rows.test.d.ts +0 -2
- package/dist/test/silent-heartbeat-rows.test.d.ts.map +0 -1
- package/dist/test/silent-heartbeat-rows.test.js +0 -451
- package/dist/test/silent-heartbeat-rows.test.js.map +0 -1
- package/dist/test/silent-heartbeat.test.d.ts +0 -2
- package/dist/test/silent-heartbeat.test.d.ts.map +0 -1
- package/dist/test/silent-heartbeat.test.js +0 -165
- package/dist/test/silent-heartbeat.test.js.map +0 -1
- package/dist/test/state-scaling-e2e.test.d.ts +0 -22
- package/dist/test/state-scaling-e2e.test.d.ts.map +0 -1
- package/dist/test/state-scaling-e2e.test.js +0 -206
- package/dist/test/state-scaling-e2e.test.js.map +0 -1
- package/dist/test/state-scaling.test.d.ts +0 -12
- package/dist/test/state-scaling.test.d.ts.map +0 -1
- package/dist/test/state-scaling.test.js +0 -251
- package/dist/test/state-scaling.test.js.map +0 -1
- package/dist/test/stop-with-host-operations.test.d.ts +0 -20
- package/dist/test/stop-with-host-operations.test.d.ts.map +0 -1
- package/dist/test/stop-with-host-operations.test.js +0 -1174
- package/dist/test/stop-with-host-operations.test.js.map +0 -1
- package/dist/test/stop-with-work-in-flight.test.d.ts +0 -23
- package/dist/test/stop-with-work-in-flight.test.d.ts.map +0 -1
- package/dist/test/stop-with-work-in-flight.test.js +0 -784
- package/dist/test/stop-with-work-in-flight.test.js.map +0 -1
- package/dist/test/surgery-marks-receipt.test.d.ts +0 -2
- package/dist/test/surgery-marks-receipt.test.d.ts.map +0 -1
- package/dist/test/surgery-marks-receipt.test.js +0 -540
- package/dist/test/surgery-marks-receipt.test.js.map +0 -1
- package/dist/test/thinking-token-stamp.test.d.ts +0 -12
- package/dist/test/thinking-token-stamp.test.d.ts.map +0 -1
- package/dist/test/thinking-token-stamp.test.js +0 -129
- package/dist/test/thinking-token-stamp.test.js.map +0 -1
- package/dist/test/timezone.test.d.ts +0 -2
- package/dist/test/timezone.test.d.ts.map +0 -1
- package/dist/test/timezone.test.js +0 -18
- package/dist/test/timezone.test.js.map +0 -1
- package/dist/test/tool-batch-hook.test.d.ts +0 -8
- package/dist/test/tool-batch-hook.test.d.ts.map +0 -1
- package/dist/test/tool-batch-hook.test.js +0 -275
- package/dist/test/tool-batch-hook.test.js.map +0 -1
- package/dist/test/tool-policy.test.d.ts +0 -2
- package/dist/test/tool-policy.test.d.ts.map +0 -1
- package/dist/test/tool-policy.test.js +0 -51
- package/dist/test/tool-policy.test.js.map +0 -1
- package/dist/test/tool-presentation.test.d.ts +0 -2
- package/dist/test/tool-presentation.test.d.ts.map +0 -1
- package/dist/test/tool-presentation.test.js +0 -268
- package/dist/test/tool-presentation.test.js.map +0 -1
- package/dist/test/tool-result-content.test.d.ts +0 -2
- package/dist/test/tool-result-content.test.d.ts.map +0 -1
- package/dist/test/tool-result-content.test.js +0 -37
- package/dist/test/tool-result-content.test.js.map +0 -1
- package/dist/test/tool-result-guard.test.d.ts +0 -2
- package/dist/test/tool-result-guard.test.d.ts.map +0 -1
- package/dist/test/tool-result-guard.test.js +0 -3729
- package/dist/test/tool-result-guard.test.js.map +0 -1
- package/dist/test/tool-result-history.test.d.ts +0 -7
- package/dist/test/tool-result-history.test.d.ts.map +0 -1
- package/dist/test/tool-result-history.test.js +0 -156
- package/dist/test/tool-result-history.test.js.map +0 -1
- package/dist/test/tool-result-spill.test.d.ts +0 -13
- package/dist/test/tool-result-spill.test.d.ts.map +0 -1
- package/dist/test/tool-result-spill.test.js +0 -586
- package/dist/test/tool-result-spill.test.js.map +0 -1
- package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts +0 -2
- package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts.map +0 -1
- package/dist/test/tool-wrapper-prose-guard-integration.test.js +0 -485
- package/dist/test/tool-wrapper-prose-guard-integration.test.js.map +0 -1
- package/dist/test/tool-wrapper-prose-guard.test.d.ts +0 -2
- package/dist/test/tool-wrapper-prose-guard.test.d.ts.map +0 -1
- package/dist/test/tool-wrapper-prose-guard.test.js +0 -34
- package/dist/test/tool-wrapper-prose-guard.test.js.map +0 -1
- package/dist/test/tools-observe-parser-conformance.test.d.ts +0 -2
- package/dist/test/tools-observe-parser-conformance.test.d.ts.map +0 -1
- package/dist/test/tools-observe-parser-conformance.test.js +0 -129
- package/dist/test/tools-observe-parser-conformance.test.js.map +0 -1
- package/dist/test/trunk-channel-routing.test.d.ts +0 -19
- package/dist/test/trunk-channel-routing.test.d.ts.map +0 -1
- package/dist/test/trunk-channel-routing.test.js +0 -652
- package/dist/test/trunk-channel-routing.test.js.map +0 -1
- package/dist/test/tune-out-e2e.test.d.ts +0 -2
- package/dist/test/tune-out-e2e.test.d.ts.map +0 -1
- package/dist/test/tune-out-e2e.test.js +0 -142
- package/dist/test/tune-out-e2e.test.js.map +0 -1
- package/dist/test/tune-out-gate-composition.test.d.ts +0 -2
- package/dist/test/tune-out-gate-composition.test.d.ts.map +0 -1
- package/dist/test/tune-out-gate-composition.test.js +0 -221
- package/dist/test/tune-out-gate-composition.test.js.map +0 -1
- package/dist/test/tune-out-lifecycle.test.d.ts +0 -2
- package/dist/test/tune-out-lifecycle.test.d.ts.map +0 -1
- package/dist/test/tune-out-lifecycle.test.js +0 -121
- package/dist/test/tune-out-lifecycle.test.js.map +0 -1
- package/dist/test/turn-trigger-provenance.test.d.ts +0 -2
- package/dist/test/turn-trigger-provenance.test.d.ts.map +0 -1
- package/dist/test/turn-trigger-provenance.test.js +0 -137
- package/dist/test/turn-trigger-provenance.test.js.map +0 -1
- package/dist/test/unconvertible-tool-result.test.d.ts +0 -2
- package/dist/test/unconvertible-tool-result.test.d.ts.map +0 -1
- package/dist/test/unconvertible-tool-result.test.js +0 -358
- package/dist/test/unconvertible-tool-result.test.js.map +0 -1
- package/dist/test/unsent-compiles.test.d.ts +0 -2
- package/dist/test/unsent-compiles.test.d.ts.map +0 -1
- package/dist/test/unsent-compiles.test.js +0 -139
- package/dist/test/unsent-compiles.test.js.map +0 -1
- package/dist/test/usage-accounting.test.d.ts +0 -2
- package/dist/test/usage-accounting.test.d.ts.map +0 -1
- package/dist/test/usage-accounting.test.js +0 -13
- package/dist/test/usage-accounting.test.js.map +0 -1
- package/dist/test/usage-tracker.test.d.ts +0 -2
- package/dist/test/usage-tracker.test.d.ts.map +0 -1
- package/dist/test/usage-tracker.test.js +0 -129
- package/dist/test/usage-tracker.test.js.map +0 -1
- package/dist/test/utils-surface.test.d.ts +0 -2
- package/dist/test/utils-surface.test.d.ts.map +0 -1
- package/dist/test/utils-surface.test.js +0 -145
- package/dist/test/utils-surface.test.js.map +0 -1
- package/dist/test/workspace-branch-continuation.test.d.ts +0 -15
- package/dist/test/workspace-branch-continuation.test.d.ts.map +0 -1
- package/dist/test/workspace-branch-continuation.test.js +0 -183
- package/dist/test/workspace-branch-continuation.test.js.map +0 -1
- package/dist/test/workspace-materialize-freshness.test.d.ts +0 -16
- package/dist/test/workspace-materialize-freshness.test.d.ts.map +0 -1
- package/dist/test/workspace-materialize-freshness.test.js +0 -252
- package/dist/test/workspace-materialize-freshness.test.js.map +0 -1
- package/dist/test/workspace-path-containment.test.d.ts +0 -19
- package/dist/test/workspace-path-containment.test.d.ts.map +0 -1
- package/dist/test/workspace-path-containment.test.js +0 -91
- package/dist/test/workspace-path-containment.test.js.map +0 -1
- package/dist/test/workspace-read-file-from-disk.test.d.ts +0 -17
- package/dist/test/workspace-read-file-from-disk.test.d.ts.map +0 -1
- package/dist/test/workspace-read-file-from-disk.test.js +0 -174
- package/dist/test/workspace-read-file-from-disk.test.js.map +0 -1
- package/dist/test/workspace-read-image.test.d.ts +0 -2
- package/dist/test/workspace-read-image.test.d.ts.map +0 -1
- package/dist/test/workspace-read-image.test.js +0 -597
- package/dist/test/workspace-read-image.test.js.map +0 -1
- package/dist/test/workspace-read-text.test.d.ts +0 -2
- package/dist/test/workspace-read-text.test.d.ts.map +0 -1
- package/dist/test/workspace-read-text.test.js +0 -101
- package/dist/test/workspace-read-text.test.js.map +0 -1
- package/dist/test/workspace-restore-order.test.d.ts +0 -16
- package/dist/test/workspace-restore-order.test.d.ts.map +0 -1
- package/dist/test/workspace-restore-order.test.js +0 -140
- package/dist/test/workspace-restore-order.test.js.map +0 -1
- package/dist/test/workspace-three-way.test.d.ts +0 -12
- package/dist/test/workspace-three-way.test.d.ts.map +0 -1
- package/dist/test/workspace-three-way.test.js +0 -4094
- package/dist/test/workspace-three-way.test.js.map +0 -1
- package/dist/test/workspace-watcher.test.d.ts +0 -2
- package/dist/test/workspace-watcher.test.d.ts.map +0 -1
- package/dist/test/workspace-watcher.test.js +0 -281
- package/dist/test/workspace-watcher.test.js.map +0 -1
- package/dist/test/xml-round-persist.test.d.ts +0 -19
- package/dist/test/xml-round-persist.test.d.ts.map +0 -1
- package/dist/test/xml-round-persist.test.js +0 -235
- package/dist/test/xml-round-persist.test.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
package/src/mcpl/transport.ts
CHANGED
|
@@ -23,6 +23,9 @@ import { StringDecoder } from 'node:string_decoder';
|
|
|
23
23
|
import WebSocket from 'ws';
|
|
24
24
|
|
|
25
25
|
import type { McplServerConfig } from './types.js';
|
|
26
|
+
import { describeCredentialError, noteDialSent, redactUrl, resolveServerBinding, urlAsDialed } from './protocol-family.js';
|
|
27
|
+
import { assertBooleanSetting } from '../config-checks.js';
|
|
28
|
+
import { logDetail } from './log-value.js';
|
|
26
29
|
|
|
27
30
|
/** Why/how a transport closed. `code`/`signal` are populated for stdio child
|
|
28
31
|
* exits; `reason` carries a WebSocket close reason or an error message. */
|
|
@@ -43,6 +46,9 @@ export interface TransportCloseInfo {
|
|
|
43
46
|
* - `'stderr'` `(line: string)` diagnostic line (stdio child stderr; never WS)
|
|
44
47
|
* - `'error'` `(err: Error)` transport-level error
|
|
45
48
|
* - `'close'` `(info: TransportCloseInfo)` transport closed (once)
|
|
49
|
+
* - `'unreaped'` `(failure: Error)` a stdio child whose pipe failed
|
|
50
|
+
* outlived SIGKILL too: the transport stays open, owning the child, and
|
|
51
|
+
* close() retries the reap (never WS)
|
|
46
52
|
*
|
|
47
53
|
* Inbound `'line'`/`'stderr'` events are buffered until the first matching
|
|
48
54
|
* listener attaches (and re-buffered whenever there are none), so no message is
|
|
@@ -55,7 +61,10 @@ export abstract class McplTransport extends EventEmitter {
|
|
|
55
61
|
private lineBuffer: string[] = [];
|
|
56
62
|
private stderrBuffer: string[] = [];
|
|
57
63
|
|
|
58
|
-
|
|
64
|
+
/** The server's id from its config, so a line the transport logs names it.
|
|
65
|
+
* The stdio and WebSocket transports always give it; a test's stand-in
|
|
66
|
+
* transport may leave it out. */
|
|
67
|
+
protected constructor(protected readonly serverId?: string) {
|
|
59
68
|
super();
|
|
60
69
|
// Flush buffered inbound lines the moment a consumer subscribes.
|
|
61
70
|
this.on('newListener', (event) => {
|
|
@@ -85,6 +94,26 @@ export abstract class McplTransport extends EventEmitter {
|
|
|
85
94
|
return '';
|
|
86
95
|
}
|
|
87
96
|
|
|
97
|
+
/**
|
|
98
|
+
* The error a stdio child's stdin or stdout failed with, once one has. The
|
|
99
|
+
* transport is ending the child then, and stays open until it exits, but
|
|
100
|
+
* writes nothing more to it: writeLine drops each line, and both engines
|
|
101
|
+
* refuse a request as not sent. Undefined while writes go out, and always
|
|
102
|
+
* for a transport that has no pipes.
|
|
103
|
+
*/
|
|
104
|
+
get pipeFailure(): Error | undefined {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Resolves once the server's diagnostic stream has ended or closed, so that
|
|
110
|
+
* {@link stderrTail} holds what arrived on it, or once `ms` have passed while
|
|
111
|
+
* it hasn't. At once for a transport that has none.
|
|
112
|
+
*/
|
|
113
|
+
stderrEnded(_ms: number): Promise<void> {
|
|
114
|
+
return Promise.resolve();
|
|
115
|
+
}
|
|
116
|
+
|
|
88
117
|
/** Deliver an inbound line, buffering it if nobody is listening yet. */
|
|
89
118
|
protected pushLine(line: string): void {
|
|
90
119
|
if (this.listenerCount('line') > 0) this.emit('line', line);
|
|
@@ -97,6 +126,23 @@ export abstract class McplTransport extends EventEmitter {
|
|
|
97
126
|
else this.stderrBuffer.push(line);
|
|
98
127
|
}
|
|
99
128
|
|
|
129
|
+
/**
|
|
130
|
+
* Report a transport error: to the 'error' listeners if there are any, else
|
|
131
|
+
* as a log line. EventEmitter throws an 'error' that nothing listens for,
|
|
132
|
+
* and a transport reports its errors from I/O callbacks, where nothing
|
|
133
|
+
* catches that throw, so it would end the process. A transport has no
|
|
134
|
+
* listener from its creation until the handshake attaches one, and a
|
|
135
|
+
* WebSocket server that sends a malformed frame with its upgrade response
|
|
136
|
+
* makes ws raise an 'error' in that window.
|
|
137
|
+
*/
|
|
138
|
+
protected reportError(err: Error): void {
|
|
139
|
+
if (this.listenerCount('error') > 0) this.emit('error', err);
|
|
140
|
+
else {
|
|
141
|
+
const server = this.serverId === undefined ? '' : `${this.serverId}: `;
|
|
142
|
+
console.error(`[mcpl] ${server}a ${this.kind} transport error, with nothing listening for it: ${logDetail(err.message)}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
100
146
|
/** Emit 'close' exactly once. */
|
|
101
147
|
protected markClosed(info: TransportCloseInfo): void {
|
|
102
148
|
if (this._closed) return;
|
|
@@ -136,20 +182,23 @@ export const CHILD_ENV_ALLOWLIST = [
|
|
|
136
182
|
'http_proxy', 'https_proxy', 'no_proxy',
|
|
137
183
|
'__CF_USER_TEXT_ENCODING',
|
|
138
184
|
// Windows equivalents, harmless elsewhere.
|
|
139
|
-
|
|
185
|
+
// USERNAME is Windows' USER, which Python's getpass.getuser() reads there.
|
|
186
|
+
'SYSTEMROOT', 'WINDIR', 'COMSPEC', 'PATHEXT', 'APPDATA', 'LOCALAPPDATA', 'USERPROFILE', 'USERNAME',
|
|
140
187
|
];
|
|
141
188
|
|
|
142
189
|
/** Environment for a stdio child: allowlisted host vars (+ LC_*), then the
|
|
143
190
|
* server's declared `env` on top. Windows names merge case-insensitively;
|
|
144
|
-
* POSIX names remain case-sensitive. `inheritEnv: true` restores full inheritance
|
|
191
|
+
* POSIX names remain case-sensitive. `inheritEnv: true` restores full inheritance,
|
|
192
|
+
* and only `true` does: a direct caller can pass any value, unchecked. */
|
|
145
193
|
export function buildChildEnv(
|
|
146
194
|
config: Pick<McplServerConfig, 'env' | 'inheritEnv'>,
|
|
147
195
|
hostEnv: NodeJS.ProcessEnv = process.env,
|
|
148
196
|
platform: NodeJS.Platform = process.platform,
|
|
149
197
|
): NodeJS.ProcessEnv {
|
|
150
198
|
const win = platform === 'win32';
|
|
151
|
-
const
|
|
152
|
-
|
|
199
|
+
const inherit = config.inheritEnv === true;
|
|
200
|
+
const env: NodeJS.ProcessEnv = inherit ? { ...hostEnv } : {};
|
|
201
|
+
if (!inherit) {
|
|
153
202
|
for (const [key, value] of Object.entries(hostEnv)) {
|
|
154
203
|
if (value === undefined) continue;
|
|
155
204
|
// Windows commonly enumerates Path/SystemRoot rather than PATH/SYSTEMROOT.
|
|
@@ -184,22 +233,64 @@ export function buildChildEnv(
|
|
|
184
233
|
/** The most of a stdio child's stderr a transport keeps for {@link McplTransport.stderrTail}. */
|
|
185
234
|
export const STDERR_TAIL_CHARS = 2_048;
|
|
186
235
|
|
|
236
|
+
/**
|
|
237
|
+
* How long a refusal at a stdio child's exit waits for the child's stderr to
|
|
238
|
+
* end, so that its `stderrTail` holds what the child wrote. Node can emit a
|
|
239
|
+
* child's `exit` before it has read the last of the child's stderr. When the
|
|
240
|
+
* child held the stream alone, the stream ends with it, and the wait is short.
|
|
241
|
+
* The bound binds when another process still holds the stream, such as one the
|
|
242
|
+
* server started that inherited it, or when the host's loop stalls past it
|
|
243
|
+
* before reading an end that is waiting. The tail then holds what had arrived.
|
|
244
|
+
* A process that keeps the stream open, such as one the server started and
|
|
245
|
+
* left running, holds the refusal up by the bound, a fifth of the reconnect's
|
|
246
|
+
* default first interval.
|
|
247
|
+
*/
|
|
248
|
+
export const STDERR_END_WAIT_MS = 1_000;
|
|
249
|
+
|
|
187
250
|
export class StdioTransport extends McplTransport {
|
|
188
251
|
readonly kind = 'stdio' as const;
|
|
189
252
|
/** The first error on the child's stdin or stdout, named in the close reason. */
|
|
190
253
|
private pipeError: Error | undefined;
|
|
191
254
|
private stderrEnd = '';
|
|
192
255
|
private stderrCut = false;
|
|
256
|
+
/** True once the child's stderr has ended or closed. */
|
|
257
|
+
private stderrDone = false;
|
|
193
258
|
|
|
194
259
|
override get stderrTail(): string {
|
|
195
260
|
return (this.stderrCut ? '…' : '') + this.stderrEnd;
|
|
196
261
|
}
|
|
197
262
|
|
|
263
|
+
override get pipeFailure(): Error | undefined {
|
|
264
|
+
return this.pipeError;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
override stderrEnded(ms: number): Promise<void> {
|
|
268
|
+
const stderr = this.child.stderr;
|
|
269
|
+
if (!stderr || this.stderrDone) return Promise.resolve();
|
|
270
|
+
return new Promise((resolve) => {
|
|
271
|
+
let timer: NodeJS.Timeout | undefined;
|
|
272
|
+
const done = () => {
|
|
273
|
+
clearTimeout(timer);
|
|
274
|
+
stderr.off('end', done);
|
|
275
|
+
stderr.off('close', done);
|
|
276
|
+
resolve();
|
|
277
|
+
};
|
|
278
|
+
// Added after the constructor's listeners, so the tail already holds the
|
|
279
|
+
// stream's last characters when these run.
|
|
280
|
+
stderr.once('end', done);
|
|
281
|
+
stderr.once('close', done);
|
|
282
|
+
timer = setTimeout(done, ms);
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
|
|
198
286
|
private constructor(
|
|
199
287
|
private readonly child: ChildProcess,
|
|
200
288
|
private readonly rl: ReadlineInterface,
|
|
289
|
+
/** The server this child serves, named in its stderr lines and in what
|
|
290
|
+
* its reaping reports. */
|
|
291
|
+
serverId: string,
|
|
201
292
|
) {
|
|
202
|
-
super();
|
|
293
|
+
super(serverId);
|
|
203
294
|
|
|
204
295
|
this.rl.on('line', (line: string) => this.pushLine(line));
|
|
205
296
|
|
|
@@ -224,21 +315,34 @@ export class StdioTransport extends McplTransport {
|
|
|
224
315
|
this.child.stderr?.on('end', () => {
|
|
225
316
|
received(decoder.end());
|
|
226
317
|
if (carry.length > 0) this.pushStderr(carry);
|
|
318
|
+
this.stderrDone = true;
|
|
227
319
|
});
|
|
320
|
+
// A stream destroyed by an error closes without ending: nothing more comes.
|
|
321
|
+
this.child.stderr?.on('close', () => { this.stderrDone = true; });
|
|
228
322
|
|
|
229
|
-
this.child.on('error', (err) => this.
|
|
323
|
+
this.child.on('error', (err) => this.reportError(err));
|
|
230
324
|
// The child's stdin and stdout carry the protocol, so after an error on
|
|
231
325
|
// either, a write's EPIPE or a read error, this transport can't reach the
|
|
232
|
-
// child even if it's still running. The handler
|
|
233
|
-
//
|
|
234
|
-
//
|
|
235
|
-
//
|
|
236
|
-
//
|
|
237
|
-
//
|
|
238
|
-
//
|
|
326
|
+
// child even if it's still running. The handler ends the child as close()
|
|
327
|
+
// does, SIGTERM and then SIGKILL, in the one attempt close() shares, and
|
|
328
|
+
// the exit's close names the error, so the connection handles it as any
|
|
329
|
+
// other exit. The close is the report: no 'error' is emitted, nothing is
|
|
330
|
+
// thrown, and nothing more is written meanwhile (pipeFailure). The first
|
|
331
|
+
// error starts that one attempt, and a later one, from either pipe, adds
|
|
332
|
+
// nothing to it. A child that outlives SIGKILL too stays this
|
|
333
|
+
// transport's: 'unreaped' says so, unless the host is closing it, whose
|
|
334
|
+
// close() reports the failure itself. A child that stops reading without
|
|
335
|
+
// closing its stdin raises no error: the writes are buffered, and only
|
|
336
|
+
// request timeouts bound it (McplServerConfig.requestTimeoutMs). Under
|
|
337
|
+
// Bun a child that closes its stdin isn't reported either: Bun emits no
|
|
338
|
+
// 'error' for the writes to it (checked on 1.3.10, 1.4.3 and 1.4.4's
|
|
339
|
+
// canary), so request timeouts are its only bound too.
|
|
239
340
|
const endOnPipeError = (err: Error) => {
|
|
240
|
-
this.pipeError
|
|
241
|
-
|
|
341
|
+
if (this.pipeError) return;
|
|
342
|
+
this.pipeError = err;
|
|
343
|
+
void this.terminate().catch((failure: unknown) => {
|
|
344
|
+
if (!this.closed) this.emit('unreaped', failure instanceof Error ? failure : new Error(String(failure)));
|
|
345
|
+
});
|
|
242
346
|
};
|
|
243
347
|
this.child.stdin?.on('error', endOnPipeError);
|
|
244
348
|
// On the stream itself, since close() closes readline, which takes its own
|
|
@@ -247,13 +351,11 @@ export class StdioTransport extends McplTransport {
|
|
|
247
351
|
// listener absorbs that copy.
|
|
248
352
|
this.child.stdout?.on('error', endOnPipeError);
|
|
249
353
|
this.rl.on('error', () => { /* readline's copy of a stdout error, handled above */ });
|
|
250
|
-
// stderr carries diagnostics only: a read error on it is reported
|
|
251
|
-
//
|
|
252
|
-
// is wired; during a handshake the listener is the
|
|
253
|
-
// fails it.
|
|
254
|
-
this.child.stderr?.on('error', (err) =>
|
|
255
|
-
if (this.listenerCount('error') > 0) this.emit('error', err);
|
|
256
|
-
});
|
|
354
|
+
// stderr carries diagnostics only: a read error on it is reported, to the
|
|
355
|
+
// listeners or else in the log, and never thrown. It ends nothing once
|
|
356
|
+
// the connection is wired; during a handshake the listener is the
|
|
357
|
+
// handshake's, which fails it.
|
|
358
|
+
this.child.stderr?.on('error', (err) => this.reportError(err));
|
|
257
359
|
this.child.on('exit', (code, signal) => this.markClosed({
|
|
258
360
|
code,
|
|
259
361
|
signal,
|
|
@@ -293,35 +395,93 @@ export class StdioTransport extends McplTransport {
|
|
|
293
395
|
});
|
|
294
396
|
});
|
|
295
397
|
const rl = createInterface({ input: child.stdout! });
|
|
296
|
-
return new StdioTransport(child, rl);
|
|
398
|
+
return new StdioTransport(child, rl, config.id);
|
|
297
399
|
}
|
|
298
400
|
|
|
299
401
|
writeLine(json: string): void {
|
|
402
|
+
// Nothing more goes to a child whose stdin or stdout has failed: this
|
|
403
|
+
// transport is ending it.
|
|
404
|
+
if (this.pipeError) return;
|
|
300
405
|
// stdin may be gone if the child died between the closed-check and here.
|
|
301
406
|
this.child.stdin?.write(json + '\n');
|
|
302
407
|
}
|
|
303
408
|
|
|
304
|
-
|
|
409
|
+
private closing: Promise<void> | null = null;
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Close and reap: resolves once the child has actually exited, not merely
|
|
413
|
+
* been signalled (`child.killed` is true as soon as a signal is sent). A
|
|
414
|
+
* child that outlives SIGTERM by {@link STDIO_EXIT_GRACE_MS} gets SIGKILL.
|
|
415
|
+
* If it still hasn't exited after that bound again, close rejects: an
|
|
416
|
+
* explicit cleanup failure, rather than waiting forever or claiming an
|
|
417
|
+
* exit that wasn't seen. Calls share one attempt, and so does a pipe
|
|
418
|
+
* failure that is already ending the child; a later call succeeds if the
|
|
419
|
+
* child has exited since.
|
|
420
|
+
*/
|
|
421
|
+
close(): Promise<void> {
|
|
422
|
+
if (!this.closing) {
|
|
423
|
+
this.closing = this.reap();
|
|
424
|
+
return this.closing;
|
|
425
|
+
}
|
|
426
|
+
// A later call re-checks a failed verdict: a child that has exited since
|
|
427
|
+
// is reaped now. No new signals are sent.
|
|
428
|
+
return this.closing.catch((error: unknown) => {
|
|
429
|
+
if (this.exited()) return;
|
|
430
|
+
throw error;
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
private async reap(): Promise<void> {
|
|
305
435
|
this.markClosed({ reason: 'closed by host' });
|
|
306
436
|
this.rl.close();
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
437
|
+
await this.terminate();
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/** Whether the child has exited, or never started (a spawn error). */
|
|
441
|
+
private exited(): boolean {
|
|
442
|
+
return this.child.pid === undefined || this.child.exitCode !== null || this.child.signalCode !== null;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
private terminating: Promise<void> | null = null;
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* End the child: SIGTERM, then SIGKILL once it has outlived SIGTERM by
|
|
449
|
+
* {@link STDIO_EXIT_GRACE_MS}. Resolves once it has exited; rejects if it
|
|
450
|
+
* still hasn't that long after SIGKILL. close() and a pipe failure share
|
|
451
|
+
* one attempt, so no second signal or timer goes out. A failed attempt is
|
|
452
|
+
* re-checked, not repeated: a child that has exited since resolves it.
|
|
453
|
+
*/
|
|
454
|
+
private terminate(): Promise<void> {
|
|
455
|
+
this.terminating ??= this.escalate();
|
|
456
|
+
return this.terminating.catch((error: unknown) => {
|
|
457
|
+
if (this.exited()) return;
|
|
458
|
+
throw error;
|
|
321
459
|
});
|
|
322
460
|
}
|
|
461
|
+
|
|
462
|
+
private async escalate(): Promise<void> {
|
|
463
|
+
const child = this.child;
|
|
464
|
+
if (this.exited()) return;
|
|
465
|
+
const exited = new Promise<void>((resolve) => child.once('exit', () => resolve()));
|
|
466
|
+
const exitWithin = (ms: number) => new Promise<boolean>((resolve) => {
|
|
467
|
+
const timer = setTimeout(() => resolve(false), ms);
|
|
468
|
+
void exited.then(() => { clearTimeout(timer); resolve(true); });
|
|
469
|
+
});
|
|
470
|
+
child.kill('SIGTERM');
|
|
471
|
+
if (await exitWithin(STDIO_EXIT_GRACE_MS)) return;
|
|
472
|
+
const named = `stdio child ${child.pid} of MCP server "${this.serverId}"`;
|
|
473
|
+
console.error(`[mcpl] ${named} ignored SIGTERM for ${STDIO_EXIT_GRACE_MS}ms — sending SIGKILL`);
|
|
474
|
+
child.kill('SIGKILL');
|
|
475
|
+
if (await exitWithin(STDIO_EXIT_GRACE_MS)) return;
|
|
476
|
+
throw new Error(
|
|
477
|
+
`${named} did not exit within ${STDIO_EXIT_GRACE_MS}ms of SIGKILL; it could not be reaped`,
|
|
478
|
+
);
|
|
479
|
+
}
|
|
323
480
|
}
|
|
324
481
|
|
|
482
|
+
/** How long a stdio child gets to exit after SIGTERM, and again after SIGKILL. */
|
|
483
|
+
const STDIO_EXIT_GRACE_MS = 2_000;
|
|
484
|
+
|
|
325
485
|
// ---------------------------------------------------------------------------
|
|
326
486
|
// WebSocket
|
|
327
487
|
// ---------------------------------------------------------------------------
|
|
@@ -329,11 +489,23 @@ export class StdioTransport extends McplTransport {
|
|
|
329
489
|
/** Timeout for the WebSocket to reach OPEN before we give up (ms). */
|
|
330
490
|
const WS_OPEN_TIMEOUT_MS = 15_000;
|
|
331
491
|
|
|
492
|
+
/** `work`, or `signal`'s reason once it aborts, whichever comes first. The
|
|
493
|
+
* listener comes off the signal when `work` settles, so a long-lived signal,
|
|
494
|
+
* such as a reconnect loop's, doesn't gather one per dial. */
|
|
495
|
+
function raceAbort<T>(work: Promise<T>, signal: AbortSignal): Promise<T> {
|
|
496
|
+
if (signal.aborted) return Promise.reject(signal.reason);
|
|
497
|
+
return new Promise<T>((resolve, reject) => {
|
|
498
|
+
const onAbort = () => reject(signal.reason);
|
|
499
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
500
|
+
work.then(resolve, reject).finally(() => signal.removeEventListener('abort', onAbort));
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
|
|
332
504
|
export class WebSocketTransport extends McplTransport {
|
|
333
505
|
readonly kind = 'websocket' as const;
|
|
334
506
|
|
|
335
|
-
private constructor(private readonly ws: WebSocket) {
|
|
336
|
-
super();
|
|
507
|
+
private constructor(private readonly ws: WebSocket, serverId: string) {
|
|
508
|
+
super(serverId);
|
|
337
509
|
|
|
338
510
|
this.ws.on('message', (data: WebSocket.RawData, isBinary: boolean) => {
|
|
339
511
|
// MCPL frames are UTF-8 JSON text. A frame MAY contain multiple
|
|
@@ -345,7 +517,7 @@ export class WebSocketTransport extends McplTransport {
|
|
|
345
517
|
}
|
|
346
518
|
});
|
|
347
519
|
|
|
348
|
-
this.ws.on('error', (err: Error) => this.
|
|
520
|
+
this.ws.on('error', (err: Error) => this.reportError(err));
|
|
349
521
|
this.ws.on('close', (code: number, reason: Buffer) => {
|
|
350
522
|
const text = reason?.toString('utf8');
|
|
351
523
|
this.markClosed(text ? { code, reason: text, reasonFromPeer: true } : { code, reason: 'websocket closed' });
|
|
@@ -355,28 +527,43 @@ export class WebSocketTransport extends McplTransport {
|
|
|
355
527
|
/**
|
|
356
528
|
* Dial `config.url` and resolve once the socket is OPEN. Appends `?token=`
|
|
357
529
|
* when `config.token` is set. Rejects on connect error / timeout (and tears
|
|
358
|
-
* the socket down) so a failed dial never leaks an open handle.
|
|
530
|
+
* the socket down) so a failed dial never leaks an open handle. `signal`
|
|
531
|
+
* ends a dial whose connection is closed meanwhile, at once, rather than
|
|
532
|
+
* at the open timeout.
|
|
359
533
|
*/
|
|
360
|
-
static async open(config: McplServerConfig): Promise<WebSocketTransport> {
|
|
534
|
+
static async open(config: McplServerConfig, signal?: AbortSignal): Promise<WebSocketTransport> {
|
|
361
535
|
// Resolve the per-dial credential first: the provider runs on every
|
|
362
536
|
// connect AND reconnect, so rotation happens at the transport layer and
|
|
363
537
|
// nothing above it ever holds a credential.
|
|
364
538
|
let token: string | null = config.token ?? null;
|
|
539
|
+
const abandoned = (): Error =>
|
|
540
|
+
new Error(`MCPL server "${config.id}" WebSocket connect abandoned: the connection was closed (${redactUrl(config.url)})`);
|
|
365
541
|
if (config.accessProvider) {
|
|
542
|
+
if (signal?.aborted) throw abandoned();
|
|
366
543
|
try {
|
|
367
|
-
|
|
544
|
+
// A dial whose connection is closed meanwhile stops waiting for the
|
|
545
|
+
// provider; whatever the provider does later is ignored.
|
|
546
|
+
const provided = Promise.resolve(config.accessProvider());
|
|
547
|
+
provided.catch(() => { /* a late failure after the dial was abandoned */ });
|
|
548
|
+
token = (signal ? await raceAbort(provided, signal) : await provided) ?? token;
|
|
368
549
|
} catch (err) {
|
|
550
|
+
if (signal?.aborted) throw abandoned();
|
|
369
551
|
// Fall back to the static token (if any) rather than failing the dial
|
|
370
552
|
// outright — the server will refuse a stale credential loudly anyway.
|
|
553
|
+
// The provider's own text may quote the credential, so it isn't logged.
|
|
371
554
|
console.error(
|
|
372
|
-
`[mcpl] server "${config.id}": access provider failed (${err
|
|
555
|
+
`[mcpl] server "${config.id}": access provider failed (${describeCredentialError(err)}) — dialing with configured fallback`,
|
|
373
556
|
);
|
|
374
557
|
}
|
|
375
558
|
}
|
|
376
559
|
const url = buildWebSocketUrl(config, token);
|
|
560
|
+
// A provider's token is in this url, and the query may be re-encoded:
|
|
561
|
+
// the server's text is recorded with what the dial sent, the token in
|
|
562
|
+
// each form a token is replaced in.
|
|
563
|
+
noteDialSent(config, { url, token: token ?? undefined });
|
|
377
564
|
// Error strings travel: traces, logs, tool results the model reads. They
|
|
378
565
|
// get the endpoint, never the credential.
|
|
379
|
-
const redacted =
|
|
566
|
+
const redacted = redactUrl(config.url);
|
|
380
567
|
const ws = new WebSocket(url);
|
|
381
568
|
|
|
382
569
|
// A failed dial can emit 'error' MORE THAN ONCE on the raw socket (seen
|
|
@@ -390,31 +577,36 @@ export class WebSocketTransport extends McplTransport {
|
|
|
390
577
|
|
|
391
578
|
return new Promise<WebSocketTransport>((resolve, reject) => {
|
|
392
579
|
let settled = false;
|
|
393
|
-
const
|
|
580
|
+
const abandon = (error: Error): void => {
|
|
394
581
|
if (settled) return;
|
|
395
582
|
settled = true;
|
|
583
|
+
clearTimeout(timer);
|
|
584
|
+
signal?.removeEventListener('abort', onAbort);
|
|
396
585
|
ws.removeAllListeners();
|
|
397
586
|
ws.on('error', swallowLateErrors);
|
|
398
587
|
try { ws.terminate(); } catch { /* already gone */ }
|
|
399
|
-
reject(
|
|
588
|
+
reject(error);
|
|
589
|
+
};
|
|
590
|
+
const timer = setTimeout(() => {
|
|
591
|
+
abandon(new Error(`MCPL server "${config.id}" WebSocket connect timed out after ${WS_OPEN_TIMEOUT_MS}ms (${redacted})`));
|
|
400
592
|
}, WS_OPEN_TIMEOUT_MS);
|
|
593
|
+
const onAbort = (): void => {
|
|
594
|
+
abandon(new Error(`MCPL server "${config.id}" WebSocket connect abandoned: the connection was closed (${redacted})`));
|
|
595
|
+
};
|
|
596
|
+
if (signal?.aborted) onAbort();
|
|
597
|
+
else signal?.addEventListener('abort', onAbort, { once: true });
|
|
401
598
|
|
|
402
599
|
ws.once('open', () => {
|
|
403
600
|
if (settled) return;
|
|
404
601
|
settled = true;
|
|
405
602
|
clearTimeout(timer);
|
|
603
|
+
signal?.removeEventListener('abort', onAbort);
|
|
406
604
|
ws.removeAllListeners('error'); // the instance re-attaches its own handlers
|
|
407
|
-
resolve(new WebSocketTransport(ws));
|
|
605
|
+
resolve(new WebSocketTransport(ws, config.id));
|
|
408
606
|
});
|
|
409
607
|
|
|
410
608
|
ws.once('error', (err: Error) => {
|
|
411
|
-
|
|
412
|
-
settled = true;
|
|
413
|
-
clearTimeout(timer);
|
|
414
|
-
ws.removeAllListeners();
|
|
415
|
-
ws.on('error', swallowLateErrors);
|
|
416
|
-
try { ws.terminate(); } catch { /* already gone */ }
|
|
417
|
-
reject(new Error(`MCPL server "${config.id}" WebSocket connect failed: ${err.message} (${redacted})`));
|
|
609
|
+
abandon(new Error(`MCPL server "${config.id}" WebSocket connect failed: ${err.message} (${redacted})`));
|
|
418
610
|
});
|
|
419
611
|
});
|
|
420
612
|
}
|
|
@@ -444,8 +636,9 @@ export class WebSocketTransport extends McplTransport {
|
|
|
444
636
|
}
|
|
445
637
|
|
|
446
638
|
/**
|
|
447
|
-
* Build the dial URL: validate it's a ws(s):// URL
|
|
448
|
-
* a
|
|
639
|
+
* Build the dial URL: validate it's a ws(s):// URL the ws library will dial,
|
|
640
|
+
* which refuses one with a fragment, and append the auth token as a `token`
|
|
641
|
+
* query param when provided (preserving any existing query).
|
|
449
642
|
*/
|
|
450
643
|
export function buildWebSocketUrl(config: McplServerConfig, tokenOverride?: string | null): string {
|
|
451
644
|
if (!config.url) {
|
|
@@ -455,40 +648,91 @@ export function buildWebSocketUrl(config: McplServerConfig, tokenOverride?: stri
|
|
|
455
648
|
try {
|
|
456
649
|
parsed = new URL(config.url);
|
|
457
650
|
} catch {
|
|
458
|
-
|
|
651
|
+
// Not echoed: a url that doesn't parse can't be redacted.
|
|
652
|
+
throw new Error(`MCPL server "${config.id}": invalid WebSocket url (it isn't shown, since it may carry a credential)`);
|
|
459
653
|
}
|
|
460
654
|
if (parsed.protocol !== 'ws:' && parsed.protocol !== 'wss:') {
|
|
461
655
|
throw new Error(
|
|
462
656
|
`MCPL server "${config.id}": websocket url must be ws:// or wss://, got "${parsed.protocol}"`,
|
|
463
657
|
);
|
|
464
658
|
}
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
parsed.searchParams.set('token', token);
|
|
659
|
+
if (parsed.hash) {
|
|
660
|
+
throw new Error(`MCPL server "${config.id}": websocket url must not have a fragment, got "${parsed.hash}"`);
|
|
468
661
|
}
|
|
469
|
-
|
|
662
|
+
const token = tokenOverride !== undefined ? tokenOverride : config.token;
|
|
663
|
+
return urlAsDialed(parsed, token).toString();
|
|
470
664
|
}
|
|
471
665
|
|
|
472
666
|
// ---------------------------------------------------------------------------
|
|
473
667
|
// Factory
|
|
474
668
|
// ---------------------------------------------------------------------------
|
|
475
669
|
|
|
476
|
-
/** True when the config selects the WebSocket transport
|
|
477
|
-
*
|
|
670
|
+
/** True when the config selects the WebSocket transport, as
|
|
671
|
+
* {@link resolveServerBinding} decides it; false for any other transport and
|
|
672
|
+
* for a configuration it refuses. */
|
|
478
673
|
export function isWebSocketTransport(config: McplServerConfig): boolean {
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
674
|
+
try {
|
|
675
|
+
return resolveServerBinding(config).transport === 'websocket';
|
|
676
|
+
} catch {
|
|
677
|
+
return false;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/** Whether a server's binding dials it, over WebSocket or HTTP. False for a
|
|
682
|
+
* stdio launch, and for a configuration whose binding can't be resolved,
|
|
683
|
+
* which the family check refuses. */
|
|
684
|
+
function dialsNetwork(config: McplServerConfig): boolean {
|
|
685
|
+
try {
|
|
686
|
+
return resolveServerBinding(config).transport !== 'stdio';
|
|
687
|
+
} catch {
|
|
688
|
+
return false;
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
/** The settings of McplServerConfig whose type is boolean. */
|
|
693
|
+
type BooleanSetting = {
|
|
694
|
+
[K in keyof McplServerConfig]-?: NonNullable<McplServerConfig[K]> extends boolean ? K : never;
|
|
695
|
+
}[keyof McplServerConfig];
|
|
696
|
+
|
|
697
|
+
/** What `true` does for each boolean setting, as its refusal says it. A
|
|
698
|
+
* boolean setting added to McplServerConfig doesn't compile until it has
|
|
699
|
+
* an entry here, so the check below covers it too. */
|
|
700
|
+
const SERVER_CONFIG_BOOLEANS: Record<BooleanSetting, string> = {
|
|
701
|
+
inheritEnv: 'true passes the server the host\'s whole environment, and false or leaving it out passes only the allowlisted and LC_* host variables',
|
|
702
|
+
reconnect: 'true retries in the background when the server can\'t be reached or its connection drops, and false or leaving it out doesn\'t',
|
|
703
|
+
allowHostCommands: 'true lets the server run the host\'s admin commands, such as undo, hide, unstick and quiesce, and false or leaving it out refuses them',
|
|
704
|
+
};
|
|
705
|
+
|
|
706
|
+
/**
|
|
707
|
+
* Refuse a server config whose `inheritEnv`, `reconnect` or `allowHostCommands`
|
|
708
|
+
* holds anything but true or false. A config read from JSON can carry a quoted
|
|
709
|
+
* "false" where the type says boolean, and every reader of these settings takes
|
|
710
|
+
* only `true` as on, so the quotes would hide what the value does. null counts
|
|
711
|
+
* as not set, so a generated config that writes an unset setting as null
|
|
712
|
+
* keeps working. `inheritEnv` is checked only for a stdio server, since a
|
|
713
|
+
* network server, WebSocket or HTTP, never reads it. The error names the
|
|
714
|
+
* server, the setting and the value's kind, not the value, which could be a
|
|
715
|
+
* secret pasted into the wrong field.
|
|
716
|
+
*/
|
|
717
|
+
export function assertServerConfigBooleans(config: McplServerConfig): void {
|
|
718
|
+
for (const [setting, whatTrueDoes] of Object.entries(SERVER_CONFIG_BOOLEANS) as Array<[BooleanSetting, string]>) {
|
|
719
|
+
if (setting === 'inheritEnv' && dialsNetwork(config)) continue;
|
|
720
|
+
assertBooleanSetting(`MCPL server "${config.id}" ${setting}`, config[setting], whatTrueDoes);
|
|
721
|
+
}
|
|
482
722
|
}
|
|
483
723
|
|
|
484
724
|
/**
|
|
485
|
-
* Open the transport
|
|
486
|
-
*
|
|
487
|
-
*
|
|
725
|
+
* Open the legacy transport `config` selects, as {@link resolveServerBinding}
|
|
726
|
+
* decides it: stdio for a `command`, MCPL's WebSocket binding for a ws(s)://
|
|
727
|
+
* url. A configuration it refuses, or one for the modern family (an http(s)
|
|
728
|
+
* url, or `protocol: 'modern'`), throws before anything is spawned or dialed.
|
|
729
|
+
* The returned transport is connected at the byte level but has NOT
|
|
730
|
+
* performed the MCPL handshake.
|
|
488
731
|
*/
|
|
489
|
-
export async function openTransport(config: McplServerConfig): Promise<McplTransport> {
|
|
490
|
-
|
|
491
|
-
|
|
732
|
+
export async function openTransport(config: McplServerConfig, signal?: AbortSignal): Promise<McplTransport> {
|
|
733
|
+
const binding = resolveServerBinding(config);
|
|
734
|
+
if (binding.family !== 'legacy') {
|
|
735
|
+
throw new Error(`MCP server "${config.id}" is configured for modern MCP; the legacy transports can't open it`);
|
|
492
736
|
}
|
|
493
|
-
return StdioTransport.spawn(config);
|
|
737
|
+
return binding.transport === 'websocket' ? WebSocketTransport.open(config, signal) : StdioTransport.spawn(config);
|
|
494
738
|
}
|