@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
|
@@ -20,6 +20,9 @@ import { createInterface } from 'node:readline';
|
|
|
20
20
|
import { EventEmitter } from 'node:events';
|
|
21
21
|
import { StringDecoder } from 'node:string_decoder';
|
|
22
22
|
import WebSocket from 'ws';
|
|
23
|
+
import { describeCredentialError, noteDialSent, redactUrl, resolveServerBinding, urlAsDialed } from './protocol-family.js';
|
|
24
|
+
import { assertBooleanSetting } from '../config-checks.js';
|
|
25
|
+
import { logDetail } from './log-value.js';
|
|
23
26
|
/**
|
|
24
27
|
* A line-oriented duplex transport to an MCPL server.
|
|
25
28
|
*
|
|
@@ -28,17 +31,25 @@ import WebSocket from 'ws';
|
|
|
28
31
|
* - `'stderr'` `(line: string)` diagnostic line (stdio child stderr; never WS)
|
|
29
32
|
* - `'error'` `(err: Error)` transport-level error
|
|
30
33
|
* - `'close'` `(info: TransportCloseInfo)` transport closed (once)
|
|
34
|
+
* - `'unreaped'` `(failure: Error)` a stdio child whose pipe failed
|
|
35
|
+
* outlived SIGKILL too: the transport stays open, owning the child, and
|
|
36
|
+
* close() retries the reap (never WS)
|
|
31
37
|
*
|
|
32
38
|
* Inbound `'line'`/`'stderr'` events are buffered until the first matching
|
|
33
39
|
* listener attaches (and re-buffered whenever there are none), so no message is
|
|
34
40
|
* lost across the handshake→routing handoff regardless of attach timing.
|
|
35
41
|
*/
|
|
36
42
|
export class McplTransport extends EventEmitter {
|
|
43
|
+
serverId;
|
|
37
44
|
_closed = false;
|
|
38
45
|
lineBuffer = [];
|
|
39
46
|
stderrBuffer = [];
|
|
40
|
-
|
|
47
|
+
/** The server's id from its config, so a line the transport logs names it.
|
|
48
|
+
* The stdio and WebSocket transports always give it; a test's stand-in
|
|
49
|
+
* transport may leave it out. */
|
|
50
|
+
constructor(serverId) {
|
|
41
51
|
super();
|
|
52
|
+
this.serverId = serverId;
|
|
42
53
|
// Flush buffered inbound lines the moment a consumer subscribes.
|
|
43
54
|
this.on('newListener', (event) => {
|
|
44
55
|
if (event === 'line' && this.lineBuffer.length > 0) {
|
|
@@ -67,6 +78,24 @@ export class McplTransport extends EventEmitter {
|
|
|
67
78
|
get stderrTail() {
|
|
68
79
|
return '';
|
|
69
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* The error a stdio child's stdin or stdout failed with, once one has. The
|
|
83
|
+
* transport is ending the child then, and stays open until it exits, but
|
|
84
|
+
* writes nothing more to it: writeLine drops each line, and both engines
|
|
85
|
+
* refuse a request as not sent. Undefined while writes go out, and always
|
|
86
|
+
* for a transport that has no pipes.
|
|
87
|
+
*/
|
|
88
|
+
get pipeFailure() {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Resolves once the server's diagnostic stream has ended or closed, so that
|
|
93
|
+
* {@link stderrTail} holds what arrived on it, or once `ms` have passed while
|
|
94
|
+
* it hasn't. At once for a transport that has none.
|
|
95
|
+
*/
|
|
96
|
+
stderrEnded(_ms) {
|
|
97
|
+
return Promise.resolve();
|
|
98
|
+
}
|
|
70
99
|
/** Deliver an inbound line, buffering it if nobody is listening yet. */
|
|
71
100
|
pushLine(line) {
|
|
72
101
|
if (this.listenerCount('line') > 0)
|
|
@@ -81,6 +110,23 @@ export class McplTransport extends EventEmitter {
|
|
|
81
110
|
else
|
|
82
111
|
this.stderrBuffer.push(line);
|
|
83
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Report a transport error: to the 'error' listeners if there are any, else
|
|
115
|
+
* as a log line. EventEmitter throws an 'error' that nothing listens for,
|
|
116
|
+
* and a transport reports its errors from I/O callbacks, where nothing
|
|
117
|
+
* catches that throw, so it would end the process. A transport has no
|
|
118
|
+
* listener from its creation until the handshake attaches one, and a
|
|
119
|
+
* WebSocket server that sends a malformed frame with its upgrade response
|
|
120
|
+
* makes ws raise an 'error' in that window.
|
|
121
|
+
*/
|
|
122
|
+
reportError(err) {
|
|
123
|
+
if (this.listenerCount('error') > 0)
|
|
124
|
+
this.emit('error', err);
|
|
125
|
+
else {
|
|
126
|
+
const server = this.serverId === undefined ? '' : `${this.serverId}: `;
|
|
127
|
+
console.error(`[mcpl] ${server}a ${this.kind} transport error, with nothing listening for it: ${logDetail(err.message)}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
84
130
|
/** Emit 'close' exactly once. */
|
|
85
131
|
markClosed(info) {
|
|
86
132
|
if (this._closed)
|
|
@@ -113,15 +159,18 @@ export const CHILD_ENV_ALLOWLIST = [
|
|
|
113
159
|
'http_proxy', 'https_proxy', 'no_proxy',
|
|
114
160
|
'__CF_USER_TEXT_ENCODING',
|
|
115
161
|
// Windows equivalents, harmless elsewhere.
|
|
116
|
-
|
|
162
|
+
// USERNAME is Windows' USER, which Python's getpass.getuser() reads there.
|
|
163
|
+
'SYSTEMROOT', 'WINDIR', 'COMSPEC', 'PATHEXT', 'APPDATA', 'LOCALAPPDATA', 'USERPROFILE', 'USERNAME',
|
|
117
164
|
];
|
|
118
165
|
/** Environment for a stdio child: allowlisted host vars (+ LC_*), then the
|
|
119
166
|
* server's declared `env` on top. Windows names merge case-insensitively;
|
|
120
|
-
* POSIX names remain case-sensitive. `inheritEnv: true` restores full inheritance
|
|
167
|
+
* POSIX names remain case-sensitive. `inheritEnv: true` restores full inheritance,
|
|
168
|
+
* and only `true` does: a direct caller can pass any value, unchecked. */
|
|
121
169
|
export function buildChildEnv(config, hostEnv = process.env, platform = process.platform) {
|
|
122
170
|
const win = platform === 'win32';
|
|
123
|
-
const
|
|
124
|
-
|
|
171
|
+
const inherit = config.inheritEnv === true;
|
|
172
|
+
const env = inherit ? { ...hostEnv } : {};
|
|
173
|
+
if (!inherit) {
|
|
125
174
|
for (const [key, value] of Object.entries(hostEnv)) {
|
|
126
175
|
if (value === undefined)
|
|
127
176
|
continue;
|
|
@@ -158,6 +207,19 @@ export function buildChildEnv(config, hostEnv = process.env, platform = process.
|
|
|
158
207
|
}
|
|
159
208
|
/** The most of a stdio child's stderr a transport keeps for {@link McplTransport.stderrTail}. */
|
|
160
209
|
export const STDERR_TAIL_CHARS = 2_048;
|
|
210
|
+
/**
|
|
211
|
+
* How long a refusal at a stdio child's exit waits for the child's stderr to
|
|
212
|
+
* end, so that its `stderrTail` holds what the child wrote. Node can emit a
|
|
213
|
+
* child's `exit` before it has read the last of the child's stderr. When the
|
|
214
|
+
* child held the stream alone, the stream ends with it, and the wait is short.
|
|
215
|
+
* The bound binds when another process still holds the stream, such as one the
|
|
216
|
+
* server started that inherited it, or when the host's loop stalls past it
|
|
217
|
+
* before reading an end that is waiting. The tail then holds what had arrived.
|
|
218
|
+
* A process that keeps the stream open, such as one the server started and
|
|
219
|
+
* left running, holds the refusal up by the bound, a fifth of the reconnect's
|
|
220
|
+
* default first interval.
|
|
221
|
+
*/
|
|
222
|
+
export const STDERR_END_WAIT_MS = 1_000;
|
|
161
223
|
export class StdioTransport extends McplTransport {
|
|
162
224
|
child;
|
|
163
225
|
rl;
|
|
@@ -166,11 +228,38 @@ export class StdioTransport extends McplTransport {
|
|
|
166
228
|
pipeError;
|
|
167
229
|
stderrEnd = '';
|
|
168
230
|
stderrCut = false;
|
|
231
|
+
/** True once the child's stderr has ended or closed. */
|
|
232
|
+
stderrDone = false;
|
|
169
233
|
get stderrTail() {
|
|
170
234
|
return (this.stderrCut ? '…' : '') + this.stderrEnd;
|
|
171
235
|
}
|
|
172
|
-
|
|
173
|
-
|
|
236
|
+
get pipeFailure() {
|
|
237
|
+
return this.pipeError;
|
|
238
|
+
}
|
|
239
|
+
stderrEnded(ms) {
|
|
240
|
+
const stderr = this.child.stderr;
|
|
241
|
+
if (!stderr || this.stderrDone)
|
|
242
|
+
return Promise.resolve();
|
|
243
|
+
return new Promise((resolve) => {
|
|
244
|
+
let timer;
|
|
245
|
+
const done = () => {
|
|
246
|
+
clearTimeout(timer);
|
|
247
|
+
stderr.off('end', done);
|
|
248
|
+
stderr.off('close', done);
|
|
249
|
+
resolve();
|
|
250
|
+
};
|
|
251
|
+
// Added after the constructor's listeners, so the tail already holds the
|
|
252
|
+
// stream's last characters when these run.
|
|
253
|
+
stderr.once('end', done);
|
|
254
|
+
stderr.once('close', done);
|
|
255
|
+
timer = setTimeout(done, ms);
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
constructor(child, rl,
|
|
259
|
+
/** The server this child serves, named in its stderr lines and in what
|
|
260
|
+
* its reaping reports. */
|
|
261
|
+
serverId) {
|
|
262
|
+
super(serverId);
|
|
174
263
|
this.child = child;
|
|
175
264
|
this.rl = rl;
|
|
176
265
|
this.rl.on('line', (line) => this.pushLine(line));
|
|
@@ -199,21 +288,35 @@ export class StdioTransport extends McplTransport {
|
|
|
199
288
|
received(decoder.end());
|
|
200
289
|
if (carry.length > 0)
|
|
201
290
|
this.pushStderr(carry);
|
|
291
|
+
this.stderrDone = true;
|
|
202
292
|
});
|
|
203
|
-
|
|
293
|
+
// A stream destroyed by an error closes without ending: nothing more comes.
|
|
294
|
+
this.child.stderr?.on('close', () => { this.stderrDone = true; });
|
|
295
|
+
this.child.on('error', (err) => this.reportError(err));
|
|
204
296
|
// The child's stdin and stdout carry the protocol, so after an error on
|
|
205
297
|
// either, a write's EPIPE or a read error, this transport can't reach the
|
|
206
|
-
// child even if it's still running. The handler
|
|
207
|
-
//
|
|
208
|
-
//
|
|
209
|
-
//
|
|
210
|
-
//
|
|
211
|
-
//
|
|
212
|
-
//
|
|
298
|
+
// child even if it's still running. The handler ends the child as close()
|
|
299
|
+
// does, SIGTERM and then SIGKILL, in the one attempt close() shares, and
|
|
300
|
+
// the exit's close names the error, so the connection handles it as any
|
|
301
|
+
// other exit. The close is the report: no 'error' is emitted, nothing is
|
|
302
|
+
// thrown, and nothing more is written meanwhile (pipeFailure). The first
|
|
303
|
+
// error starts that one attempt, and a later one, from either pipe, adds
|
|
304
|
+
// nothing to it. A child that outlives SIGKILL too stays this
|
|
305
|
+
// transport's: 'unreaped' says so, unless the host is closing it, whose
|
|
306
|
+
// close() reports the failure itself. A child that stops reading without
|
|
307
|
+
// closing its stdin raises no error: the writes are buffered, and only
|
|
308
|
+
// request timeouts bound it (McplServerConfig.requestTimeoutMs). Under
|
|
309
|
+
// Bun a child that closes its stdin isn't reported either: Bun emits no
|
|
310
|
+
// 'error' for the writes to it (checked on 1.3.10, 1.4.3 and 1.4.4's
|
|
311
|
+
// canary), so request timeouts are its only bound too.
|
|
213
312
|
const endOnPipeError = (err) => {
|
|
214
|
-
this.pipeError
|
|
215
|
-
|
|
216
|
-
|
|
313
|
+
if (this.pipeError)
|
|
314
|
+
return;
|
|
315
|
+
this.pipeError = err;
|
|
316
|
+
void this.terminate().catch((failure) => {
|
|
317
|
+
if (!this.closed)
|
|
318
|
+
this.emit('unreaped', failure instanceof Error ? failure : new Error(String(failure)));
|
|
319
|
+
});
|
|
217
320
|
};
|
|
218
321
|
this.child.stdin?.on('error', endOnPipeError);
|
|
219
322
|
// On the stream itself, since close() closes readline, which takes its own
|
|
@@ -222,14 +325,11 @@ export class StdioTransport extends McplTransport {
|
|
|
222
325
|
// listener absorbs that copy.
|
|
223
326
|
this.child.stdout?.on('error', endOnPipeError);
|
|
224
327
|
this.rl.on('error', () => { });
|
|
225
|
-
// stderr carries diagnostics only: a read error on it is reported
|
|
226
|
-
//
|
|
227
|
-
// is wired; during a handshake the listener is the
|
|
228
|
-
// fails it.
|
|
229
|
-
this.child.stderr?.on('error', (err) =>
|
|
230
|
-
if (this.listenerCount('error') > 0)
|
|
231
|
-
this.emit('error', err);
|
|
232
|
-
});
|
|
328
|
+
// stderr carries diagnostics only: a read error on it is reported, to the
|
|
329
|
+
// listeners or else in the log, and never thrown. It ends nothing once
|
|
330
|
+
// the connection is wired; during a handshake the listener is the
|
|
331
|
+
// handshake's, which fails it.
|
|
332
|
+
this.child.stderr?.on('error', (err) => this.reportError(err));
|
|
233
333
|
this.child.on('exit', (code, signal) => this.markClosed({
|
|
234
334
|
code,
|
|
235
335
|
signal,
|
|
@@ -266,43 +366,109 @@ export class StdioTransport extends McplTransport {
|
|
|
266
366
|
});
|
|
267
367
|
});
|
|
268
368
|
const rl = createInterface({ input: child.stdout });
|
|
269
|
-
return new StdioTransport(child, rl);
|
|
369
|
+
return new StdioTransport(child, rl, config.id);
|
|
270
370
|
}
|
|
271
371
|
writeLine(json) {
|
|
372
|
+
// Nothing more goes to a child whose stdin or stdout has failed: this
|
|
373
|
+
// transport is ending it.
|
|
374
|
+
if (this.pipeError)
|
|
375
|
+
return;
|
|
272
376
|
// stdin may be gone if the child died between the closed-check and here.
|
|
273
377
|
this.child.stdin?.write(json + '\n');
|
|
274
378
|
}
|
|
275
|
-
|
|
379
|
+
closing = null;
|
|
380
|
+
/**
|
|
381
|
+
* Close and reap: resolves once the child has actually exited, not merely
|
|
382
|
+
* been signalled (`child.killed` is true as soon as a signal is sent). A
|
|
383
|
+
* child that outlives SIGTERM by {@link STDIO_EXIT_GRACE_MS} gets SIGKILL.
|
|
384
|
+
* If it still hasn't exited after that bound again, close rejects: an
|
|
385
|
+
* explicit cleanup failure, rather than waiting forever or claiming an
|
|
386
|
+
* exit that wasn't seen. Calls share one attempt, and so does a pipe
|
|
387
|
+
* failure that is already ending the child; a later call succeeds if the
|
|
388
|
+
* child has exited since.
|
|
389
|
+
*/
|
|
390
|
+
close() {
|
|
391
|
+
if (!this.closing) {
|
|
392
|
+
this.closing = this.reap();
|
|
393
|
+
return this.closing;
|
|
394
|
+
}
|
|
395
|
+
// A later call re-checks a failed verdict: a child that has exited since
|
|
396
|
+
// is reaped now. No new signals are sent.
|
|
397
|
+
return this.closing.catch((error) => {
|
|
398
|
+
if (this.exited())
|
|
399
|
+
return;
|
|
400
|
+
throw error;
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
async reap() {
|
|
276
404
|
this.markClosed({ reason: 'closed by host' });
|
|
277
405
|
this.rl.close();
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
406
|
+
await this.terminate();
|
|
407
|
+
}
|
|
408
|
+
/** Whether the child has exited, or never started (a spawn error). */
|
|
409
|
+
exited() {
|
|
410
|
+
return this.child.pid === undefined || this.child.exitCode !== null || this.child.signalCode !== null;
|
|
411
|
+
}
|
|
412
|
+
terminating = null;
|
|
413
|
+
/**
|
|
414
|
+
* End the child: SIGTERM, then SIGKILL once it has outlived SIGTERM by
|
|
415
|
+
* {@link STDIO_EXIT_GRACE_MS}. Resolves once it has exited; rejects if it
|
|
416
|
+
* still hasn't that long after SIGKILL. close() and a pipe failure share
|
|
417
|
+
* one attempt, so no second signal or timer goes out. A failed attempt is
|
|
418
|
+
* re-checked, not repeated: a child that has exited since resolves it.
|
|
419
|
+
*/
|
|
420
|
+
terminate() {
|
|
421
|
+
this.terminating ??= this.escalate();
|
|
422
|
+
return this.terminating.catch((error) => {
|
|
423
|
+
if (this.exited())
|
|
424
|
+
return;
|
|
425
|
+
throw error;
|
|
293
426
|
});
|
|
294
427
|
}
|
|
428
|
+
async escalate() {
|
|
429
|
+
const child = this.child;
|
|
430
|
+
if (this.exited())
|
|
431
|
+
return;
|
|
432
|
+
const exited = new Promise((resolve) => child.once('exit', () => resolve()));
|
|
433
|
+
const exitWithin = (ms) => new Promise((resolve) => {
|
|
434
|
+
const timer = setTimeout(() => resolve(false), ms);
|
|
435
|
+
void exited.then(() => { clearTimeout(timer); resolve(true); });
|
|
436
|
+
});
|
|
437
|
+
child.kill('SIGTERM');
|
|
438
|
+
if (await exitWithin(STDIO_EXIT_GRACE_MS))
|
|
439
|
+
return;
|
|
440
|
+
const named = `stdio child ${child.pid} of MCP server "${this.serverId}"`;
|
|
441
|
+
console.error(`[mcpl] ${named} ignored SIGTERM for ${STDIO_EXIT_GRACE_MS}ms — sending SIGKILL`);
|
|
442
|
+
child.kill('SIGKILL');
|
|
443
|
+
if (await exitWithin(STDIO_EXIT_GRACE_MS))
|
|
444
|
+
return;
|
|
445
|
+
throw new Error(`${named} did not exit within ${STDIO_EXIT_GRACE_MS}ms of SIGKILL; it could not be reaped`);
|
|
446
|
+
}
|
|
295
447
|
}
|
|
448
|
+
/** How long a stdio child gets to exit after SIGTERM, and again after SIGKILL. */
|
|
449
|
+
const STDIO_EXIT_GRACE_MS = 2_000;
|
|
296
450
|
// ---------------------------------------------------------------------------
|
|
297
451
|
// WebSocket
|
|
298
452
|
// ---------------------------------------------------------------------------
|
|
299
453
|
/** Timeout for the WebSocket to reach OPEN before we give up (ms). */
|
|
300
454
|
const WS_OPEN_TIMEOUT_MS = 15_000;
|
|
455
|
+
/** `work`, or `signal`'s reason once it aborts, whichever comes first. The
|
|
456
|
+
* listener comes off the signal when `work` settles, so a long-lived signal,
|
|
457
|
+
* such as a reconnect loop's, doesn't gather one per dial. */
|
|
458
|
+
function raceAbort(work, signal) {
|
|
459
|
+
if (signal.aborted)
|
|
460
|
+
return Promise.reject(signal.reason);
|
|
461
|
+
return new Promise((resolve, reject) => {
|
|
462
|
+
const onAbort = () => reject(signal.reason);
|
|
463
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
464
|
+
work.then(resolve, reject).finally(() => signal.removeEventListener('abort', onAbort));
|
|
465
|
+
});
|
|
466
|
+
}
|
|
301
467
|
export class WebSocketTransport extends McplTransport {
|
|
302
468
|
ws;
|
|
303
469
|
kind = 'websocket';
|
|
304
|
-
constructor(ws) {
|
|
305
|
-
super();
|
|
470
|
+
constructor(ws, serverId) {
|
|
471
|
+
super(serverId);
|
|
306
472
|
this.ws = ws;
|
|
307
473
|
this.ws.on('message', (data, isBinary) => {
|
|
308
474
|
// MCPL frames are UTF-8 JSON text. A frame MAY contain multiple
|
|
@@ -314,7 +480,7 @@ export class WebSocketTransport extends McplTransport {
|
|
|
314
480
|
this.pushLine(trimmed);
|
|
315
481
|
}
|
|
316
482
|
});
|
|
317
|
-
this.ws.on('error', (err) => this.
|
|
483
|
+
this.ws.on('error', (err) => this.reportError(err));
|
|
318
484
|
this.ws.on('close', (code, reason) => {
|
|
319
485
|
const text = reason?.toString('utf8');
|
|
320
486
|
this.markClosed(text ? { code, reason: text, reasonFromPeer: true } : { code, reason: 'websocket closed' });
|
|
@@ -323,27 +489,43 @@ export class WebSocketTransport extends McplTransport {
|
|
|
323
489
|
/**
|
|
324
490
|
* Dial `config.url` and resolve once the socket is OPEN. Appends `?token=`
|
|
325
491
|
* when `config.token` is set. Rejects on connect error / timeout (and tears
|
|
326
|
-
* the socket down) so a failed dial never leaks an open handle.
|
|
492
|
+
* the socket down) so a failed dial never leaks an open handle. `signal`
|
|
493
|
+
* ends a dial whose connection is closed meanwhile, at once, rather than
|
|
494
|
+
* at the open timeout.
|
|
327
495
|
*/
|
|
328
|
-
static async open(config) {
|
|
496
|
+
static async open(config, signal) {
|
|
329
497
|
// Resolve the per-dial credential first: the provider runs on every
|
|
330
498
|
// connect AND reconnect, so rotation happens at the transport layer and
|
|
331
499
|
// nothing above it ever holds a credential.
|
|
332
500
|
let token = config.token ?? null;
|
|
501
|
+
const abandoned = () => new Error(`MCPL server "${config.id}" WebSocket connect abandoned: the connection was closed (${redactUrl(config.url)})`);
|
|
333
502
|
if (config.accessProvider) {
|
|
503
|
+
if (signal?.aborted)
|
|
504
|
+
throw abandoned();
|
|
334
505
|
try {
|
|
335
|
-
|
|
506
|
+
// A dial whose connection is closed meanwhile stops waiting for the
|
|
507
|
+
// provider; whatever the provider does later is ignored.
|
|
508
|
+
const provided = Promise.resolve(config.accessProvider());
|
|
509
|
+
provided.catch(() => { });
|
|
510
|
+
token = (signal ? await raceAbort(provided, signal) : await provided) ?? token;
|
|
336
511
|
}
|
|
337
512
|
catch (err) {
|
|
513
|
+
if (signal?.aborted)
|
|
514
|
+
throw abandoned();
|
|
338
515
|
// Fall back to the static token (if any) rather than failing the dial
|
|
339
516
|
// outright — the server will refuse a stale credential loudly anyway.
|
|
340
|
-
|
|
517
|
+
// The provider's own text may quote the credential, so it isn't logged.
|
|
518
|
+
console.error(`[mcpl] server "${config.id}": access provider failed (${describeCredentialError(err)}) — dialing with configured fallback`);
|
|
341
519
|
}
|
|
342
520
|
}
|
|
343
521
|
const url = buildWebSocketUrl(config, token);
|
|
522
|
+
// A provider's token is in this url, and the query may be re-encoded:
|
|
523
|
+
// the server's text is recorded with what the dial sent, the token in
|
|
524
|
+
// each form a token is replaced in.
|
|
525
|
+
noteDialSent(config, { url, token: token ?? undefined });
|
|
344
526
|
// Error strings travel: traces, logs, tool results the model reads. They
|
|
345
527
|
// get the endpoint, never the credential.
|
|
346
|
-
const redacted =
|
|
528
|
+
const redacted = redactUrl(config.url);
|
|
347
529
|
const ws = new WebSocket(url);
|
|
348
530
|
// A failed dial can emit 'error' MORE THAN ONCE on the raw socket (seen
|
|
349
531
|
// live 2026-08-03: an HTTP 502 upgrade-reject emits the "Expected 101"
|
|
@@ -355,38 +537,41 @@ export class WebSocketTransport extends McplTransport {
|
|
|
355
537
|
const swallowLateErrors = () => { };
|
|
356
538
|
return new Promise((resolve, reject) => {
|
|
357
539
|
let settled = false;
|
|
358
|
-
const
|
|
540
|
+
const abandon = (error) => {
|
|
359
541
|
if (settled)
|
|
360
542
|
return;
|
|
361
543
|
settled = true;
|
|
544
|
+
clearTimeout(timer);
|
|
545
|
+
signal?.removeEventListener('abort', onAbort);
|
|
362
546
|
ws.removeAllListeners();
|
|
363
547
|
ws.on('error', swallowLateErrors);
|
|
364
548
|
try {
|
|
365
549
|
ws.terminate();
|
|
366
550
|
}
|
|
367
551
|
catch { /* already gone */ }
|
|
368
|
-
reject(
|
|
552
|
+
reject(error);
|
|
553
|
+
};
|
|
554
|
+
const timer = setTimeout(() => {
|
|
555
|
+
abandon(new Error(`MCPL server "${config.id}" WebSocket connect timed out after ${WS_OPEN_TIMEOUT_MS}ms (${redacted})`));
|
|
369
556
|
}, WS_OPEN_TIMEOUT_MS);
|
|
557
|
+
const onAbort = () => {
|
|
558
|
+
abandon(new Error(`MCPL server "${config.id}" WebSocket connect abandoned: the connection was closed (${redacted})`));
|
|
559
|
+
};
|
|
560
|
+
if (signal?.aborted)
|
|
561
|
+
onAbort();
|
|
562
|
+
else
|
|
563
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
370
564
|
ws.once('open', () => {
|
|
371
565
|
if (settled)
|
|
372
566
|
return;
|
|
373
567
|
settled = true;
|
|
374
568
|
clearTimeout(timer);
|
|
569
|
+
signal?.removeEventListener('abort', onAbort);
|
|
375
570
|
ws.removeAllListeners('error'); // the instance re-attaches its own handlers
|
|
376
|
-
resolve(new WebSocketTransport(ws));
|
|
571
|
+
resolve(new WebSocketTransport(ws, config.id));
|
|
377
572
|
});
|
|
378
573
|
ws.once('error', (err) => {
|
|
379
|
-
|
|
380
|
-
return;
|
|
381
|
-
settled = true;
|
|
382
|
-
clearTimeout(timer);
|
|
383
|
-
ws.removeAllListeners();
|
|
384
|
-
ws.on('error', swallowLateErrors);
|
|
385
|
-
try {
|
|
386
|
-
ws.terminate();
|
|
387
|
-
}
|
|
388
|
-
catch { /* already gone */ }
|
|
389
|
-
reject(new Error(`MCPL server "${config.id}" WebSocket connect failed: ${err.message} (${redacted})`));
|
|
574
|
+
abandon(new Error(`MCPL server "${config.id}" WebSocket connect failed: ${err.message} (${redacted})`));
|
|
390
575
|
});
|
|
391
576
|
});
|
|
392
577
|
}
|
|
@@ -417,8 +602,9 @@ export class WebSocketTransport extends McplTransport {
|
|
|
417
602
|
}
|
|
418
603
|
}
|
|
419
604
|
/**
|
|
420
|
-
* Build the dial URL: validate it's a ws(s):// URL
|
|
421
|
-
* a
|
|
605
|
+
* Build the dial URL: validate it's a ws(s):// URL the ws library will dial,
|
|
606
|
+
* which refuses one with a fragment, and append the auth token as a `token`
|
|
607
|
+
* query param when provided (preserving any existing query).
|
|
422
608
|
*/
|
|
423
609
|
export function buildWebSocketUrl(config, tokenOverride) {
|
|
424
610
|
if (!config.url) {
|
|
@@ -429,38 +615,82 @@ export function buildWebSocketUrl(config, tokenOverride) {
|
|
|
429
615
|
parsed = new URL(config.url);
|
|
430
616
|
}
|
|
431
617
|
catch {
|
|
432
|
-
|
|
618
|
+
// Not echoed: a url that doesn't parse can't be redacted.
|
|
619
|
+
throw new Error(`MCPL server "${config.id}": invalid WebSocket url (it isn't shown, since it may carry a credential)`);
|
|
433
620
|
}
|
|
434
621
|
if (parsed.protocol !== 'ws:' && parsed.protocol !== 'wss:') {
|
|
435
622
|
throw new Error(`MCPL server "${config.id}": websocket url must be ws:// or wss://, got "${parsed.protocol}"`);
|
|
436
623
|
}
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
parsed.searchParams.set('token', token);
|
|
624
|
+
if (parsed.hash) {
|
|
625
|
+
throw new Error(`MCPL server "${config.id}": websocket url must not have a fragment, got "${parsed.hash}"`);
|
|
440
626
|
}
|
|
441
|
-
|
|
627
|
+
const token = tokenOverride !== undefined ? tokenOverride : config.token;
|
|
628
|
+
return urlAsDialed(parsed, token).toString();
|
|
442
629
|
}
|
|
443
630
|
// ---------------------------------------------------------------------------
|
|
444
631
|
// Factory
|
|
445
632
|
// ---------------------------------------------------------------------------
|
|
446
|
-
/** True when the config selects the WebSocket transport
|
|
447
|
-
*
|
|
633
|
+
/** True when the config selects the WebSocket transport, as
|
|
634
|
+
* {@link resolveServerBinding} decides it; false for any other transport and
|
|
635
|
+
* for a configuration it refuses. */
|
|
448
636
|
export function isWebSocketTransport(config) {
|
|
449
|
-
|
|
450
|
-
return
|
|
451
|
-
|
|
637
|
+
try {
|
|
638
|
+
return resolveServerBinding(config).transport === 'websocket';
|
|
639
|
+
}
|
|
640
|
+
catch {
|
|
452
641
|
return false;
|
|
453
|
-
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
/** Whether a server's binding dials it, over WebSocket or HTTP. False for a
|
|
645
|
+
* stdio launch, and for a configuration whose binding can't be resolved,
|
|
646
|
+
* which the family check refuses. */
|
|
647
|
+
function dialsNetwork(config) {
|
|
648
|
+
try {
|
|
649
|
+
return resolveServerBinding(config).transport !== 'stdio';
|
|
650
|
+
}
|
|
651
|
+
catch {
|
|
652
|
+
return false;
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
/** What `true` does for each boolean setting, as its refusal says it. A
|
|
656
|
+
* boolean setting added to McplServerConfig doesn't compile until it has
|
|
657
|
+
* an entry here, so the check below covers it too. */
|
|
658
|
+
const SERVER_CONFIG_BOOLEANS = {
|
|
659
|
+
inheritEnv: 'true passes the server the host\'s whole environment, and false or leaving it out passes only the allowlisted and LC_* host variables',
|
|
660
|
+
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',
|
|
661
|
+
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',
|
|
662
|
+
};
|
|
663
|
+
/**
|
|
664
|
+
* Refuse a server config whose `inheritEnv`, `reconnect` or `allowHostCommands`
|
|
665
|
+
* holds anything but true or false. A config read from JSON can carry a quoted
|
|
666
|
+
* "false" where the type says boolean, and every reader of these settings takes
|
|
667
|
+
* only `true` as on, so the quotes would hide what the value does. null counts
|
|
668
|
+
* as not set, so a generated config that writes an unset setting as null
|
|
669
|
+
* keeps working. `inheritEnv` is checked only for a stdio server, since a
|
|
670
|
+
* network server, WebSocket or HTTP, never reads it. The error names the
|
|
671
|
+
* server, the setting and the value's kind, not the value, which could be a
|
|
672
|
+
* secret pasted into the wrong field.
|
|
673
|
+
*/
|
|
674
|
+
export function assertServerConfigBooleans(config) {
|
|
675
|
+
for (const [setting, whatTrueDoes] of Object.entries(SERVER_CONFIG_BOOLEANS)) {
|
|
676
|
+
if (setting === 'inheritEnv' && dialsNetwork(config))
|
|
677
|
+
continue;
|
|
678
|
+
assertBooleanSetting(`MCPL server "${config.id}" ${setting}`, config[setting], whatTrueDoes);
|
|
679
|
+
}
|
|
454
680
|
}
|
|
455
681
|
/**
|
|
456
|
-
* Open the transport
|
|
457
|
-
*
|
|
458
|
-
*
|
|
682
|
+
* Open the legacy transport `config` selects, as {@link resolveServerBinding}
|
|
683
|
+
* decides it: stdio for a `command`, MCPL's WebSocket binding for a ws(s)://
|
|
684
|
+
* url. A configuration it refuses, or one for the modern family (an http(s)
|
|
685
|
+
* url, or `protocol: 'modern'`), throws before anything is spawned or dialed.
|
|
686
|
+
* The returned transport is connected at the byte level but has NOT
|
|
687
|
+
* performed the MCPL handshake.
|
|
459
688
|
*/
|
|
460
|
-
export async function openTransport(config) {
|
|
461
|
-
|
|
462
|
-
|
|
689
|
+
export async function openTransport(config, signal) {
|
|
690
|
+
const binding = resolveServerBinding(config);
|
|
691
|
+
if (binding.family !== 'legacy') {
|
|
692
|
+
throw new Error(`MCP server "${config.id}" is configured for modern MCP; the legacy transports can't open it`);
|
|
463
693
|
}
|
|
464
|
-
return StdioTransport.spawn(config);
|
|
694
|
+
return binding.transport === 'websocket' ? WebSocketTransport.open(config, signal) : StdioTransport.spawn(config);
|
|
465
695
|
}
|
|
466
696
|
//# sourceMappingURL=transport.js.map
|