@animalabs/agent-framework 0.22.2 → 0.22.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/src/agent.d.ts +77 -12
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +136 -40
- 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/py-runner.d.ts +16 -5
- package/dist/src/code-execution/py-runner.d.ts.map +1 -1
- package/dist/src/code-execution/py-runner.js +186 -74
- package/dist/src/code-execution/py-runner.js.map +1 -1
- package/dist/src/code-execution/runtime-py.d.ts.map +1 -1
- package/dist/src/code-execution/runtime-py.js +49 -3
- package/dist/src/code-execution/runtime-py.js.map +1 -1
- package/dist/src/code-execution/tool-definition.d.ts +12 -1
- package/dist/src/code-execution/tool-definition.d.ts.map +1 -1
- package/dist/src/code-execution/tool-definition.js +21 -3
- 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 +52 -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 +828 -88
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +5011 -1326
- 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 +27 -3
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +144 -6
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +424 -263
- 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 +89 -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 +3 -1
- package/dist/src/mcpl/index.d.ts.map +1 -1
- package/dist/src/mcpl/index.js +3 -1
- package/dist/src/mcpl/index.js.map +1 -1
- package/dist/src/mcpl/inference-router.d.ts +15 -11
- package/dist/src/mcpl/inference-router.d.ts.map +1 -1
- package/dist/src/mcpl/inference-router.js +153 -84
- package/dist/src/mcpl/inference-router.js.map +1 -1
- package/dist/src/mcpl/push-coalescer.d.ts +33 -11
- package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
- package/dist/src/mcpl/push-coalescer.js +52 -20
- 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 +14 -2
- package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
- package/dist/src/mcpl/reference-fetcher.js +72 -30
- package/dist/src/mcpl/reference-fetcher.js.map +1 -1
- package/dist/src/mcpl/references.d.ts +47 -12
- package/dist/src/mcpl/references.d.ts.map +1 -1
- package/dist/src/mcpl/references.js +74 -21
- package/dist/src/mcpl/references.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +89 -10
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +405 -129
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/mcpl/server-registry.d.ts +10 -1
- package/dist/src/mcpl/server-registry.d.ts.map +1 -1
- package/dist/src/mcpl/server-registry.js +14 -3
- 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/transport.d.ts +51 -2
- package/dist/src/mcpl/transport.d.ts.map +1 -1
- package/dist/src/mcpl/transport.js +114 -20
- package/dist/src/mcpl/transport.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +14 -3
- 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 +15 -0
- package/dist/src/mcpl/visible-content.d.ts.map +1 -1
- package/dist/src/mcpl/visible-content.js +25 -0
- package/dist/src/mcpl/visible-content.js.map +1 -1
- package/dist/src/module-registry.d.ts +19 -1
- package/dist/src/module-registry.d.ts.map +1 -1
- package/dist/src/module-registry.js +54 -25
- package/dist/src/module-registry.js.map +1 -1
- package/dist/src/modules/api/index.js +1 -1
- package/dist/src/modules/api/index.js.map +1 -1
- package/dist/src/modules/discord/discord-js-client.d.ts +1 -0
- package/dist/src/modules/discord/discord-js-client.d.ts.map +1 -1
- package/dist/src/modules/discord/discord-js-client.js +25 -9
- package/dist/src/modules/discord/discord-js-client.js.map +1 -1
- package/dist/src/modules/discord/index.d.ts +29 -3
- package/dist/src/modules/discord/index.d.ts.map +1 -1
- package/dist/src/modules/discord/index.js +379 -143
- package/dist/src/modules/discord/index.js.map +1 -1
- package/dist/src/modules/discord/types.d.ts +14 -1
- 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 +2 -1
- 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/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 +32 -2
- package/dist/src/modules/workspace/disk-agreement.d.ts.map +1 -1
- package/dist/src/modules/workspace/disk-agreement.js +30 -2
- package/dist/src/modules/workspace/disk-agreement.js.map +1 -1
- package/dist/src/modules/workspace/effects.d.ts +64 -6
- package/dist/src/modules/workspace/effects.d.ts.map +1 -1
- package/dist/src/modules/workspace/effects.js +291 -44
- package/dist/src/modules/workspace/effects.js.map +1 -1
- package/dist/src/modules/workspace/index.d.ts +119 -23
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +793 -247
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/observe.d.ts +75 -8
- package/dist/src/modules/workspace/observe.d.ts.map +1 -1
- package/dist/src/modules/workspace/observe.js +174 -14
- 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 +18 -4
- 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 +7 -2
- package/dist/src/modules/workspace/watcher.d.ts.map +1 -1
- package/dist/src/modules/workspace/watcher.js +28 -4
- 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/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 +257 -60
- 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 +17 -5
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/events.d.ts +17 -0
- package/dist/src/types/events.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +21 -5
- 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 +23 -4
- package/dist/src/types/module.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +95 -6
- 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 +3 -4
- package/src/agent.ts +162 -40
- 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/py-runner.ts +200 -76
- package/src/code-execution/runtime-py.ts +49 -3
- package/src/code-execution/tool-definition.ts +28 -4
- package/src/config-checks.ts +48 -0
- package/src/deadline-timer.ts +44 -0
- package/src/error-message.ts +48 -0
- package/src/framework.ts +5352 -1388
- package/src/gate/event-gate.ts +28 -3
- package/src/index.ts +11 -2
- package/src/mcpl/channel-registry.ts +517 -286
- package/src/mcpl/checkpoint-manager.ts +104 -29
- package/src/mcpl/conversation-router.ts +28 -8
- package/src/mcpl/convert-block.ts +97 -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 +10 -1
- package/src/mcpl/inference-router.ts +174 -99
- package/src/mcpl/push-coalescer.ts +60 -24
- package/src/mcpl/push-handler.ts +20 -90
- package/src/mcpl/reference-fetcher.ts +71 -26
- package/src/mcpl/references.ts +81 -22
- package/src/mcpl/server-connection.ts +427 -132
- package/src/mcpl/server-registry.ts +15 -4
- package/src/mcpl/skip-reply-wake.ts +73 -0
- package/src/mcpl/transport.ts +120 -18
- package/src/mcpl/types.ts +14 -3
- package/src/mcpl/visible-content.ts +27 -0
- package/src/module-registry.ts +58 -23
- package/src/modules/api/index.ts +1 -1
- package/src/modules/discord/discord-js-client.ts +26 -10
- package/src/modules/discord/index.ts +391 -158
- package/src/modules/discord/types.ts +15 -2
- package/src/modules/health/index.ts +2 -1
- package/src/modules/history/index.ts +410 -120
- package/src/modules/history/semantic.ts +189 -32
- package/src/modules/unknown-tool.ts +16 -0
- package/src/modules/workspace/disk-agreement.ts +51 -3
- package/src/modules/workspace/effects.ts +279 -35
- package/src/modules/workspace/index.ts +810 -260
- package/src/modules/workspace/observe.ts +194 -20
- package/src/modules/workspace/reconcile.ts +619 -64
- package/src/modules/workspace/types.ts +18 -4
- package/src/modules/workspace/watcher.ts +27 -4
- 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/tool-image-ledger.ts +153 -34
- package/src/tool-presentation.ts +224 -40
- 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 +17 -7
- package/src/types/events.ts +17 -0
- package/src/types/framework.ts +21 -5
- package/src/types/inference-log.ts +1 -1
- package/src/types/module.ts +24 -4
- package/src/types/trace.ts +101 -6
- 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
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
import type { JsStore } from '@animalabs/chronicle';
|
|
16
|
+
import { ensureStateRegistered } from '../module-registry.js';
|
|
17
|
+
import { boundedErrorMessage as thrownText } from '../error-message.js';
|
|
16
18
|
|
|
17
19
|
import type { StateCheckpoint, JsonPatchOperation } from './types.js';
|
|
18
20
|
|
|
@@ -26,6 +28,23 @@ const CHECKPOINTS_STATE_ID = 'mcpl/checkpoints';
|
|
|
26
28
|
/** Prefix for per-feature-set host-managed state. */
|
|
27
29
|
const STATE_PREFIX = 'mcpl/state';
|
|
28
30
|
|
|
31
|
+
/** What the refusals below say about MCPL when stored trees or state can't be taken. */
|
|
32
|
+
const MCPL_STOPS = `MCPL doesn't start without them, and neither does create() with MCPL servers configured, ` +
|
|
33
|
+
`nor a first connectMcplServer()`;
|
|
34
|
+
|
|
35
|
+
/** A stored JSON value's kind, for a refusal that names what it found without its content. */
|
|
36
|
+
function storedKind(value: unknown): string {
|
|
37
|
+
return value === undefined ? 'missing'
|
|
38
|
+
: value === null ? 'null'
|
|
39
|
+
: Array.isArray(value) ? 'an array'
|
|
40
|
+
: typeof value === 'object' ? 'an object'
|
|
41
|
+
: `a ${typeof value}`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function isObject(value: unknown): value is Record<string, unknown> {
|
|
45
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
46
|
+
}
|
|
47
|
+
|
|
29
48
|
// ============================================================================
|
|
30
49
|
// Internal types
|
|
31
50
|
// ============================================================================
|
|
@@ -190,11 +209,7 @@ export class CheckpointManager {
|
|
|
190
209
|
this.emitTraceFn = emitTraceFn;
|
|
191
210
|
|
|
192
211
|
// Register the checkpoint metadata state slot
|
|
193
|
-
|
|
194
|
-
store.registerState({ id: CHECKPOINTS_STATE_ID, strategy: 'snapshot' });
|
|
195
|
-
} catch {
|
|
196
|
-
// Already registered (e.g. framework restart)
|
|
197
|
-
}
|
|
212
|
+
ensureStateRegistered(store, { id: CHECKPOINTS_STATE_ID, strategy: 'snapshot' });
|
|
198
213
|
|
|
199
214
|
// Load existing tree from Chronicle
|
|
200
215
|
this.loadFromStore();
|
|
@@ -214,31 +229,22 @@ export class CheckpointManager {
|
|
|
214
229
|
opts: { hostState: boolean; rollback: boolean },
|
|
215
230
|
): void {
|
|
216
231
|
const key = this.key(serverId, featureSet);
|
|
217
|
-
|
|
232
|
+
// Already registered, or restored from the store by loadFromStore, whose
|
|
233
|
+
// host-managed state loadHostStates reads before its server connects.
|
|
234
|
+
if (this.trees.has(key)) return;
|
|
218
235
|
|
|
219
|
-
|
|
236
|
+
const tree: FeatureSetState = {
|
|
220
237
|
hostState: opts.hostState,
|
|
221
238
|
rollback: opts.rollback,
|
|
222
239
|
currentCheckpoint: null,
|
|
223
240
|
currentState: undefined,
|
|
224
241
|
nodes: new Map(),
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
//
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
this.store.registerState({ id: stateId, strategy: 'snapshot' });
|
|
232
|
-
} catch {
|
|
233
|
-
// Already registered
|
|
234
|
-
}
|
|
235
|
-
// Load existing state if any
|
|
236
|
-
const existing = this.store.getStateJson(stateId);
|
|
237
|
-
if (existing !== null && existing !== undefined) {
|
|
238
|
-
const tree = this.trees.get(key)!;
|
|
239
|
-
tree.currentState = existing;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
+
};
|
|
243
|
+
// The state's slot is registered, and its stored value read, before the
|
|
244
|
+
// tree is held, so a registration that fails here leaves nothing behind
|
|
245
|
+
// and is made whole by the next one (a reconnect's re-run).
|
|
246
|
+
if (opts.hostState) this.loadHostState(serverId, featureSet, tree, 'registration');
|
|
247
|
+
this.trees.set(key, tree);
|
|
242
248
|
|
|
243
249
|
this.emitTraceFn({
|
|
244
250
|
type: 'mcpl:state_registered',
|
|
@@ -540,12 +546,81 @@ export class CheckpointManager {
|
|
|
540
546
|
this.store.setStateJson(CHECKPOINTS_STATE_ID, serialized);
|
|
541
547
|
}
|
|
542
548
|
|
|
543
|
-
/**
|
|
549
|
+
/** A host-managed feature set's stored state, read into its tree; nothing
|
|
550
|
+
* stored leaves it unset. A registration or read that fails throws,
|
|
551
|
+
* naming the state: taken as nothing stored, the next patch would apply
|
|
552
|
+
* to nothing and store over it. `when` says what the refusal stops: a
|
|
553
|
+
* restored tree's read comes before its server connects, and a feature
|
|
554
|
+
* set with no tree is read when it registers, once its server has
|
|
555
|
+
* connected. */
|
|
556
|
+
private loadHostState(
|
|
557
|
+
serverId: string,
|
|
558
|
+
featureSet: string,
|
|
559
|
+
tree: FeatureSetState,
|
|
560
|
+
when: 'before-connect' | 'registration',
|
|
561
|
+
): void {
|
|
562
|
+
const stateId = this.stateId(serverId, featureSet);
|
|
563
|
+
let existing: unknown;
|
|
564
|
+
try {
|
|
565
|
+
ensureStateRegistered(this.store, { id: stateId, strategy: 'snapshot' });
|
|
566
|
+
existing = this.store.getStateJson(stateId);
|
|
567
|
+
} catch (error) {
|
|
568
|
+
throw new Error(
|
|
569
|
+
`the host-managed state of feature set "${featureSet}" on MCPL server "${serverId}" (${stateId}) could not ` +
|
|
570
|
+
`be registered or read: ${thrownText(error)}. ` +
|
|
571
|
+
(when === 'before-connect'
|
|
572
|
+
? `Neither create() with the server configured nor a connectMcplServer() of it goes on without it, since ` +
|
|
573
|
+
`the feature set's next checkpoint would store over it. It's unchanged, and they go on once it can be read.`
|
|
574
|
+
: `The feature set isn't registered without it, since its next checkpoint would store over it, so the ` +
|
|
575
|
+
`server's connect fails. It's unchanged, and it's read again when the feature set next registers.`),
|
|
576
|
+
{ cause: error },
|
|
577
|
+
);
|
|
578
|
+
}
|
|
579
|
+
if (existing !== null && existing !== undefined) tree.currentState = existing;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
/** Read the stored state of every host-managed tree held for `serverId`
|
|
583
|
+
* with none in memory, whatever its feature sets declare now. The
|
|
584
|
+
* framework calls it at MCPL's start for each configured server and
|
|
585
|
+
* before a runtime connect adds its server, so no server connects with a
|
|
586
|
+
* restored tree whose state its next checkpoint would store over unread.
|
|
587
|
+
* A tree whose state is in memory, as a connected server's is, keeps it.
|
|
588
|
+
* A server's trees are the keys `${serverId}:`, as removeServer finds
|
|
589
|
+
* them. */
|
|
590
|
+
loadHostStates(serverId: string): void {
|
|
591
|
+
const prefix = `${serverId}:`;
|
|
592
|
+
for (const [key, tree] of this.trees) {
|
|
593
|
+
if (!tree.hostState || tree.currentState !== undefined || !key.startsWith(prefix)) continue;
|
|
594
|
+
this.loadHostState(serverId, key.slice(prefix.length), tree, 'before-connect');
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
/** Load checkpoint trees from Chronicle on startup. Nothing stored is no
|
|
599
|
+
* trees. Trees that can't be read, or a stored value that isn't an object
|
|
600
|
+
* whose trees is an object, throw: taken as no trees, the next feature set
|
|
601
|
+
* registered would store over them. */
|
|
544
602
|
private loadFromStore(): void {
|
|
545
|
-
const
|
|
546
|
-
|
|
603
|
+
const what = `the MCPL checkpoint trees (${CHECKPOINTS_STATE_ID})`;
|
|
604
|
+
const stops = `${MCPL_STOPS}, since the next feature set registered would store over them.`;
|
|
605
|
+
let data: unknown;
|
|
606
|
+
try {
|
|
607
|
+
data = this.store.getStateJson(CHECKPOINTS_STATE_ID);
|
|
608
|
+
} catch (error) {
|
|
609
|
+
throw new Error(
|
|
610
|
+
`${what} could not be read: ${thrownText(error)}. ${stops} They're unchanged, and MCPL starts once they can be read.`,
|
|
611
|
+
{ cause: error },
|
|
612
|
+
);
|
|
613
|
+
}
|
|
614
|
+
if (data === null || data === undefined) return;
|
|
615
|
+
const trees = isObject(data) ? data.trees : undefined;
|
|
616
|
+
if (!isObject(trees)) {
|
|
617
|
+
throw new Error(
|
|
618
|
+
`${what} are ${isObject(data) ? `an object whose trees is ${storedKind(trees)}` : storedKind(data)}, not ` +
|
|
619
|
+
`checkpoint trees. ${stops} They're unchanged, and starting again won't help until they're repaired.`,
|
|
620
|
+
);
|
|
621
|
+
}
|
|
547
622
|
|
|
548
|
-
for (const [key, entry] of Object.entries(
|
|
623
|
+
for (const [key, entry] of Object.entries(trees as SerializedTrees['trees'])) {
|
|
549
624
|
const nodes = new Map<string, CheckpointNode>();
|
|
550
625
|
for (const [id, nodeData] of Object.entries(entry.nodes)) {
|
|
551
626
|
nodes.set(id, {
|
|
@@ -561,7 +636,7 @@ export class CheckpointManager {
|
|
|
561
636
|
hostState: entry.hostState,
|
|
562
637
|
rollback: entry.rollback,
|
|
563
638
|
currentCheckpoint: entry.current,
|
|
564
|
-
currentState: undefined, //
|
|
639
|
+
currentState: undefined, // a host-managed tree's state is read by loadHostStates, before its server connects
|
|
565
640
|
nodes,
|
|
566
641
|
});
|
|
567
642
|
}
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
* follow-up.
|
|
35
35
|
*/
|
|
36
36
|
|
|
37
|
+
import { createHash } from 'node:crypto';
|
|
37
38
|
import type { ContextStrategy } from '@animalabs/context-manager';
|
|
38
39
|
import type { ChannelDescriptor } from './types.js';
|
|
39
40
|
|
|
@@ -118,6 +119,10 @@ export interface ConversationBinding {
|
|
|
118
119
|
* framework so the router stays free of event-shape knowledge. */
|
|
119
120
|
export interface IncomingMessageFacts {
|
|
120
121
|
channelId: string;
|
|
122
|
+
/** The MCPL server the channel belongs to. A spawned fork's name hashes it
|
|
123
|
+
* with the channel id (see forkAgentName); left out, `null` stands in for
|
|
124
|
+
* it there. */
|
|
125
|
+
serverId?: string;
|
|
121
126
|
/** Personal mention of the bot (metadata.mentioned from the adapter). */
|
|
122
127
|
mentioned: boolean;
|
|
123
128
|
/** Channel classification (see classifyChannel). */
|
|
@@ -208,7 +213,7 @@ export class ConversationRouter {
|
|
|
208
213
|
const generation = (this.generations.get(facts.channelId) ?? 0) + 1;
|
|
209
214
|
return {
|
|
210
215
|
kind: 'spawn',
|
|
211
|
-
agentName: this.
|
|
216
|
+
agentName: forkAgentName(this.config.agentPrefix ?? 'conversation', facts.serverId, facts.channelId, generation),
|
|
212
217
|
generation,
|
|
213
218
|
trigger: this.shouldTrigger(facts),
|
|
214
219
|
};
|
|
@@ -310,12 +315,27 @@ export class ConversationRouter {
|
|
|
310
315
|
?? (facts.kind === 'dm' ? 'always' : 'mention');
|
|
311
316
|
return rule === 'always' || facts.mentioned;
|
|
312
317
|
}
|
|
318
|
+
}
|
|
313
319
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
320
|
+
/** The readable part of a fork's name stops here: uniqueness rides on the hash. */
|
|
321
|
+
const FORK_NAME_READABLE_MAX = 64;
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* A fork's agent name: `<prefix>-<readable>-g<generation>-<hash>`, such as
|
|
325
|
+
* `conversation-C123-g2-e08e564271867d16` for Slack's channel `C123` on the
|
|
326
|
+
* server `slack`. Agent names double as context-manager namespace components,
|
|
327
|
+
* so the readable part is the channel id with each run of characters other
|
|
328
|
+
* than letters, digits, `_` and `-` replaced by `-`, cut to 64 characters.
|
|
329
|
+
* Different ids can read alike (`foo bar`, `foo-bar`), so the hash is the first
|
|
330
|
+
* 64 bits of a SHA-256 of `JSON.stringify([serverId, channelId])`, where an
|
|
331
|
+
* absent server id is written as `null`: two channels' forks share a name, and
|
|
332
|
+
* with it a namespace, only if those 64 bits collide. The hash is fixed-length
|
|
333
|
+
* and last, so a name's parts read back unambiguously, and a pattern over its
|
|
334
|
+
* readable part and `-g`, such as `conversation-C123-g*`, matches each
|
|
335
|
+
* generation's fork.
|
|
336
|
+
*/
|
|
337
|
+
export function forkAgentName(prefix: string, serverId: string | undefined, channelId: string, generation: number): string {
|
|
338
|
+
const readable = channelId.replace(/[^A-Za-z0-9_-]+/g, '-').slice(0, FORK_NAME_READABLE_MAX);
|
|
339
|
+
const hash = createHash('sha256').update(JSON.stringify([serverId, channelId])).digest('hex').slice(0, 16);
|
|
340
|
+
return `${prefix}-${readable}-g${generation}-${hash}`;
|
|
321
341
|
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCPL wire content to membrane content: the one conversion every lane uses,
|
|
3
|
+
* for pushed events, channel messages and context injections alike, so a rule
|
|
4
|
+
* about a malformed block holds on all three.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { ContentBlock } from '@animalabs/membrane';
|
|
8
|
+
import { INLINE_WITHHELD_TEXT, isInlineContradiction, referenceStubOrNull } from './references.js';
|
|
9
|
+
import { NON_STRING_TEXT_PLACEHOLDER } from './visible-content.js';
|
|
10
|
+
import type { McplContentBlock } from './types.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Convert a single MCPL wire-format content block to a membrane ContentBlock.
|
|
14
|
+
* It takes any block but null or undefined without throwing (those two throw,
|
|
15
|
+
* for the caller to refuse or leave out): a type, data, mimeType or uri that
|
|
16
|
+
* isn't a string counts as absent, and a text block whose text isn't a string
|
|
17
|
+
* shows as NON_STRING_TEXT_PLACEHOLDER. `provenance` is what a reference stub
|
|
18
|
+
* says the reference came on, such as 'attachment on push event'. `serverId`
|
|
19
|
+
* is the server that sent the content: a reference is registered with it, as
|
|
20
|
+
* a tool result's references are, so fetch_reference can fetch it from that
|
|
21
|
+
* server.
|
|
22
|
+
*/
|
|
23
|
+
export function convertBlock(block: McplContentBlock, provenance: string, serverId: string): ContentBlock {
|
|
24
|
+
switch (block.type) {
|
|
25
|
+
case 'text':
|
|
26
|
+
// Text that isn't a string can't be shown, so the agent reads that a
|
|
27
|
+
// block was there; the emptiness checks still count it as no text
|
|
28
|
+
// (isVisiblyEmptyConversion), as the request sanitizer would.
|
|
29
|
+
return { type: 'text', text: typeof block.text === 'string' ? block.text : NON_STRING_TEXT_PLACEHOLDER };
|
|
30
|
+
|
|
31
|
+
case 'image':
|
|
32
|
+
if (isInlineContradiction(block)) {
|
|
33
|
+
// RFC-005 vector 2: inline data claiming bulk disposition — fail
|
|
34
|
+
// closed, withhold the data (checked BEFORE the data branch).
|
|
35
|
+
return { type: 'text', text: INLINE_WITHHELD_TEXT };
|
|
36
|
+
}
|
|
37
|
+
if (isFilledString(block.uri) && block.disposition) {
|
|
38
|
+
// RFC-005 uri-form media with a disposition claim: stub, do not
|
|
39
|
+
// hand the URI to the provider or inline it.
|
|
40
|
+
return { type: 'text', text: referenceStubOrNull(block, provenance, serverId) ?? '[reference]' };
|
|
41
|
+
}
|
|
42
|
+
if (isFilledString(block.data) && isFilledString(block.mimeType)) {
|
|
43
|
+
return {
|
|
44
|
+
type: 'image',
|
|
45
|
+
source: { type: 'base64', data: block.data, mediaType: block.mimeType },
|
|
46
|
+
} as ContentBlock;
|
|
47
|
+
}
|
|
48
|
+
if (isFilledString(block.uri)) {
|
|
49
|
+
return {
|
|
50
|
+
type: 'image',
|
|
51
|
+
source: { type: 'url', url: block.uri },
|
|
52
|
+
} as ContentBlock;
|
|
53
|
+
}
|
|
54
|
+
return { type: 'text', text: isFilledString(block.data) ? '[Image: no media type]' : '[Image: no data]' };
|
|
55
|
+
|
|
56
|
+
case 'audio':
|
|
57
|
+
if (isInlineContradiction(block)) {
|
|
58
|
+
// RFC-005 vector 2: inline data claiming bulk disposition — fail
|
|
59
|
+
// closed, withhold the data (checked BEFORE the data branch).
|
|
60
|
+
return { type: 'text', text: INLINE_WITHHELD_TEXT };
|
|
61
|
+
}
|
|
62
|
+
if (isFilledString(block.uri) && block.disposition) {
|
|
63
|
+
// RFC-005 uri-form media with a disposition claim: stub, do not
|
|
64
|
+
// hand the URI to the provider or inline it.
|
|
65
|
+
return { type: 'text', text: referenceStubOrNull(block, provenance, serverId) ?? '[reference]' };
|
|
66
|
+
}
|
|
67
|
+
if (isFilledString(block.data) && isFilledString(block.mimeType)) {
|
|
68
|
+
return {
|
|
69
|
+
type: 'audio',
|
|
70
|
+
source: { type: 'base64', data: block.data, mediaType: block.mimeType },
|
|
71
|
+
} as ContentBlock;
|
|
72
|
+
}
|
|
73
|
+
return { type: 'text', text: isFilledString(block.data) ? '[Audio: no media type]' : '[Audio: no data]' };
|
|
74
|
+
|
|
75
|
+
case 'resource':
|
|
76
|
+
// RFC-005: reference blocks become bounded stubs — never raw URIs
|
|
77
|
+
// (a signed URL is a bearer credential that looks like a location).
|
|
78
|
+
return { type: 'text', text: referenceStubOrNull(block, provenance, serverId) ?? '[reference]' };
|
|
79
|
+
|
|
80
|
+
default: {
|
|
81
|
+
// Unknown wire block types previously fell off the exhaustive switch
|
|
82
|
+
// and propagated `undefined` into ContentBlock[]. Fail visibly. A type
|
|
83
|
+
// that isn't a string is no type, and is never converted to one: an
|
|
84
|
+
// object can throw when it is.
|
|
85
|
+
const type: unknown = (block as { type?: unknown }).type;
|
|
86
|
+
return { type: 'text', text: `[unrecognized content block: ${typeof type === 'string' ? type : 'untyped'}]` };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** A string with something in it: the only data, mimeType or uri a block's
|
|
92
|
+
* source is built from, and the only uri that makes it a reference. Anything
|
|
93
|
+
* else a sender puts there leaves the block without it, so conversion never
|
|
94
|
+
* throws and never copies a non-string. */
|
|
95
|
+
function isFilledString(value: unknown): value is string {
|
|
96
|
+
return typeof value === 'string' && value !== '';
|
|
97
|
+
}
|
package/src/mcpl/errors.ts
CHANGED
|
@@ -40,6 +40,34 @@ export const CHANNEL_OPEN_FAILED = -32024;
|
|
|
40
40
|
// Error Factories
|
|
41
41
|
// ============================================================================
|
|
42
42
|
|
|
43
|
+
/** The text of any value: anything thrown or rejected, or a value a server
|
|
44
|
+
* sent, such as an error answer's code. Never throws, whatever it is: a
|
|
45
|
+
* null-prototype object, or a message getter or toString that throws. */
|
|
46
|
+
export function describeCause(cause: unknown): string {
|
|
47
|
+
try {
|
|
48
|
+
return cause instanceof Error ? String(cause.message) : String(cause);
|
|
49
|
+
} catch {
|
|
50
|
+
try {
|
|
51
|
+
return Object.prototype.toString.call(cause);
|
|
52
|
+
} catch {
|
|
53
|
+
return 'an error that could not be printed';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Text a server or a handler chose, made fit for an error's message or a
|
|
59
|
+
* trace field: control and format characters replaced (C0 and C1 controls,
|
|
60
|
+
* bidi and other \p{Cf} characters, and the line and paragraph separators
|
|
61
|
+
* some log readers break lines on), and cut after `max` code points, with
|
|
62
|
+
* "…" marking the cut. Those are read as data, by a trace's or an error
|
|
63
|
+
* listener's reader, so the text is bounded rather than escaped. A log line
|
|
64
|
+
* prints text a server or a handler chose through log-value instead
|
|
65
|
+
* (logValue for a field, logDetail for the free text that ends the line). */
|
|
66
|
+
export function boundedForLog(text: string, max = 200): string {
|
|
67
|
+
const points = [...text.replace(/[\p{Cc}\p{Cf}\u2028\u2029]/gu, '?')];
|
|
68
|
+
return points.length > max ? `${points.slice(0, max).join('')}…` : points.join('');
|
|
69
|
+
}
|
|
70
|
+
|
|
43
71
|
/**
|
|
44
72
|
* Create a "feature set not enabled" error.
|
|
45
73
|
* Returned when a server sends a message tagged with a feature set
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
import type { ContentBlock } from '@animalabs/membrane';
|
|
17
|
-
import {
|
|
17
|
+
import { convertBlock } from './convert-block.js';
|
|
18
18
|
import type { ContextInjection } from '@animalabs/context-manager';
|
|
19
19
|
|
|
20
20
|
import type {
|
|
@@ -28,6 +28,7 @@ import type { McplServerRegistry } from './server-registry.js';
|
|
|
28
28
|
import type { McplServerConnection } from './server-connection.js';
|
|
29
29
|
import type { FeatureSetManager } from './feature-set-manager.js';
|
|
30
30
|
import { CapabilityGrant } from './capability-grant.js';
|
|
31
|
+
import { logDetail, logValue } from './log-value.js';
|
|
31
32
|
|
|
32
33
|
/** Timeout for beforeInference per server (fail-open). */
|
|
33
34
|
const BEFORE_INFERENCE_TIMEOUT_MS = 5_000;
|
|
@@ -58,89 +59,25 @@ function withTimeout<T>(promise: Promise<T>, ms: number, label: string): Promise
|
|
|
58
59
|
// ============================================================================
|
|
59
60
|
|
|
60
61
|
/**
|
|
61
|
-
* Convert
|
|
62
|
+
* Convert MCPL injection content (string shorthand or block array), from the
|
|
63
|
+
* server `serverId`, to membrane ContentBlock[].
|
|
62
64
|
*/
|
|
63
|
-
function
|
|
64
|
-
switch (block.type) {
|
|
65
|
-
case 'text':
|
|
66
|
-
return { type: 'text', text: block.text };
|
|
67
|
-
|
|
68
|
-
case 'image':
|
|
69
|
-
if (isInlineContradiction(block)) {
|
|
70
|
-
// RFC-005 vector 2: inline data claiming bulk disposition — fail
|
|
71
|
-
// closed, withhold the data (checked BEFORE the data branch).
|
|
72
|
-
return { type: 'text', text: INLINE_WITHHELD_TEXT };
|
|
73
|
-
}
|
|
74
|
-
if (block.uri && block.disposition) {
|
|
75
|
-
// RFC-005 uri-form media with a disposition claim: stub, do not
|
|
76
|
-
// hand the URI to the provider or inline it.
|
|
77
|
-
return { type: 'text', text: referenceStubOrNull(block, 'attachment on context injection') ?? '[reference]' };
|
|
78
|
-
}
|
|
79
|
-
if (block.data && block.mimeType) {
|
|
80
|
-
return {
|
|
81
|
-
type: 'image',
|
|
82
|
-
source: { type: 'base64', data: block.data, mediaType: block.mimeType },
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
if (block.uri) {
|
|
86
|
-
return {
|
|
87
|
-
type: 'image',
|
|
88
|
-
source: { type: 'url', url: block.uri },
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
// Malformed image block — degrade to text
|
|
92
|
-
return { type: 'text', text: '[Image: missing data]' };
|
|
93
|
-
|
|
94
|
-
case 'audio':
|
|
95
|
-
if (isInlineContradiction(block)) {
|
|
96
|
-
// RFC-005 vector 2: inline data claiming bulk disposition — fail
|
|
97
|
-
// closed, withhold the data (checked BEFORE the data branch).
|
|
98
|
-
return { type: 'text', text: INLINE_WITHHELD_TEXT };
|
|
99
|
-
}
|
|
100
|
-
if (block.uri && block.disposition) {
|
|
101
|
-
// RFC-005 uri-form media with a disposition claim: stub, do not
|
|
102
|
-
// hand the URI to the provider or inline it.
|
|
103
|
-
return { type: 'text', text: referenceStubOrNull(block, 'attachment on context injection') ?? '[reference]' };
|
|
104
|
-
}
|
|
105
|
-
if (block.data && block.mimeType) {
|
|
106
|
-
return {
|
|
107
|
-
type: 'audio',
|
|
108
|
-
source: { type: 'base64', data: block.data, mediaType: block.mimeType },
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
// Audio without inline data — degrade to text
|
|
112
|
-
return { type: 'text', text: `[Audio: ${block.uri ?? 'missing data'}]` };
|
|
113
|
-
|
|
114
|
-
case 'resource':
|
|
115
|
-
// RFC-005: reference blocks become bounded stubs — never raw URIs
|
|
116
|
-
// (a signed URL is a bearer credential that looks like a location).
|
|
117
|
-
return { type: 'text', text: referenceStubOrNull(block, 'attachment on context injection') ?? '[reference]' };
|
|
118
|
-
|
|
119
|
-
default:
|
|
120
|
-
// Unknown wire block types previously fell off the exhaustive switch
|
|
121
|
-
// and propagated `undefined` into ContentBlock[]. Fail visibly.
|
|
122
|
-
return { type: 'text', text: `[unrecognized content block: ${(block as { type?: string }).type ?? 'untyped'}]` };
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Convert MCPL injection content (string shorthand or block array) to membrane ContentBlock[].
|
|
128
|
-
*/
|
|
129
|
-
function convertContent(content: string | McplContentBlock[]): ContentBlock[] {
|
|
65
|
+
function convertContent(content: string | McplContentBlock[], serverId: string): ContentBlock[] {
|
|
130
66
|
if (typeof content === 'string') {
|
|
131
67
|
return [{ type: 'text', text: content }];
|
|
132
68
|
}
|
|
133
|
-
return content.map(convertBlock);
|
|
69
|
+
return content.map((block) => convertBlock(block, 'attachment on context injection', serverId));
|
|
134
70
|
}
|
|
135
71
|
|
|
136
72
|
/**
|
|
137
|
-
* Convert an MCPL wire-format context injection
|
|
73
|
+
* Convert an MCPL wire-format context injection, from the server `serverId`,
|
|
74
|
+
* to a context-manager ContextInjection.
|
|
138
75
|
*/
|
|
139
|
-
function convertMcplInjection(mcplInj: McplContextInjection): ContextInjection {
|
|
76
|
+
function convertMcplInjection(mcplInj: McplContextInjection, serverId: string): ContextInjection {
|
|
140
77
|
return {
|
|
141
78
|
namespace: mcplInj.namespace,
|
|
142
79
|
position: mcplInj.position,
|
|
143
|
-
content: convertContent(mcplInj.content),
|
|
80
|
+
content: convertContent(mcplInj.content, serverId),
|
|
144
81
|
metadata: mcplInj.metadata,
|
|
145
82
|
};
|
|
146
83
|
}
|
|
@@ -153,6 +90,10 @@ export class HookOrchestrator {
|
|
|
153
90
|
private registry: McplServerRegistry;
|
|
154
91
|
private featureSetManager: FeatureSetManager;
|
|
155
92
|
private _isInHook = false;
|
|
93
|
+
/** Servers already told that an injection's namespace wasn't a string. */
|
|
94
|
+
private readonly namespaceWarned = new Set<string>();
|
|
95
|
+
/** Server and namespace pairs already told that a system injection held a block that isn't text. */
|
|
96
|
+
private readonly notShownWarned = new Set<string>();
|
|
156
97
|
|
|
157
98
|
constructor(registry: McplServerRegistry, featureSetManager: FeatureSetManager) {
|
|
158
99
|
this.registry = registry;
|
|
@@ -261,21 +202,42 @@ export class HookOrchestrator {
|
|
|
261
202
|
continue;
|
|
262
203
|
}
|
|
263
204
|
|
|
205
|
+
// One server's malformed answer, or one malformed injection in it, is
|
|
206
|
+
// that server's to fix: it's left out with a line naming the server,
|
|
207
|
+
// and every other injection still arrives. Unguarded, a throw here
|
|
208
|
+
// leaves fanOutBeforeInference, and the framework's catch around the
|
|
209
|
+
// whole hook drops every server's injections for the turn.
|
|
210
|
+
const answered: unknown = result.contextInjections;
|
|
211
|
+
if (answered !== undefined && answered !== null && !Array.isArray(answered)) {
|
|
212
|
+
console.error(`[mcpl] ${server.id}: dropped its beforeInference injections — contextInjections isn't an array`);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
264
215
|
// §5.4/§10.8: authorize EACH injection by its typed position against
|
|
265
216
|
// the grant CURRENT NOW, at response receipt — not when the request
|
|
266
217
|
// was sent. A revocation that landed while the hook was in flight is
|
|
267
218
|
// enforced here without extra machinery.
|
|
268
|
-
|
|
269
|
-
|
|
219
|
+
for (const mcplInj of (answered ?? []) as McplContextInjection[]) {
|
|
220
|
+
try {
|
|
270
221
|
const leaf = INJECT_LEAVES.find((l) => l.position === mcplInj.position);
|
|
271
222
|
if (!leaf || !CapabilityGrant.of(server).has(leaf.path)) {
|
|
272
223
|
console.error(
|
|
273
224
|
`[mcpl] ${server.id}: dropped beforeInference injection at position ` +
|
|
274
|
-
|
|
225
|
+
`${logValue(mcplInj.position)} — not in the effective grant (§10.8)`,
|
|
275
226
|
);
|
|
276
227
|
continue;
|
|
277
228
|
}
|
|
278
|
-
|
|
229
|
+
if (typeof mcplInj.namespace !== 'string') this.readNamespace(server.id, mcplInj.namespace);
|
|
230
|
+
const injection = convertMcplInjection(mcplInj, server.id);
|
|
231
|
+
if (injection.position === 'system') this.noteBlocksNotShown(server.id, mcplInj.namespace, injection.content);
|
|
232
|
+
injections.push(injection);
|
|
233
|
+
} catch (error) {
|
|
234
|
+
// Such as a null block, content that isn't an array, a null
|
|
235
|
+
// injection, or a namespace that can't be read as text.
|
|
236
|
+
const position = (mcplInj as { position?: unknown } | null | undefined)?.position;
|
|
237
|
+
console.error(
|
|
238
|
+
`[mcpl] ${server.id}: dropped beforeInference injection at position ${logValue(position)} ` +
|
|
239
|
+
`— it couldn't be read: ${logDetail(error instanceof Error ? error.message : error)}`,
|
|
240
|
+
);
|
|
279
241
|
}
|
|
280
242
|
}
|
|
281
243
|
}
|
|
@@ -283,4 +245,49 @@ export class HookOrchestrator {
|
|
|
283
245
|
return injections;
|
|
284
246
|
}
|
|
285
247
|
|
|
248
|
+
/**
|
|
249
|
+
* Checks a namespace that isn't a string, which §10.4 doesn't allow. One
|
|
250
|
+
* that can be read as text is kept as it is, and its server's operator is
|
|
251
|
+
* told once: context-manager reads it as its text when it writes a
|
|
252
|
+
* beforeUser or afterUser injection's namespace into a participant's name,
|
|
253
|
+
* as it always has. One with no text form would throw there, after the
|
|
254
|
+
* catch around each injection, and fail the turn, so it throws here, and
|
|
255
|
+
* its injection alone is left out, whatever its position.
|
|
256
|
+
*/
|
|
257
|
+
private readNamespace(serverId: string, namespace: unknown): void {
|
|
258
|
+
let text: string;
|
|
259
|
+
try {
|
|
260
|
+
text = String(namespace);
|
|
261
|
+
} catch {
|
|
262
|
+
throw new Error("its namespace isn't a string and can't be read as text");
|
|
263
|
+
}
|
|
264
|
+
if (this.namespaceWarned.has(serverId)) return;
|
|
265
|
+
this.namespaceWarned.add(serverId);
|
|
266
|
+
console.error(
|
|
267
|
+
`[mcpl] ${serverId}: a beforeInference injection's namespace isn't a string, which §10.4 requires, so it keeps the ` +
|
|
268
|
+
`injection to no channel and every agent gets it; where it names a participant, it's read as its text, ${logValue(text)}; ` +
|
|
269
|
+
'this line prints once per server while the host runs',
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* The system prompt is text, so an agent given a `system` injection reads
|
|
275
|
+
* a line in place of each of its blocks that isn't text (the agent's
|
|
276
|
+
* buildSystemPrompt). The server meant those blocks for the model, so its
|
|
277
|
+
* operator is told, once per server and namespace, as the server's
|
|
278
|
+
* injections are gathered, whichever agents are given them. The namespace
|
|
279
|
+
* is read as its text, which readNamespace has checked it has.
|
|
280
|
+
*/
|
|
281
|
+
private noteBlocksNotShown(serverId: string, namespace: unknown, content: ContentBlock[]): void {
|
|
282
|
+
if (!content.some((block) => block.type !== 'text')) return;
|
|
283
|
+
const key = `${serverId}\u0000${String(namespace)}`;
|
|
284
|
+
if (this.notShownWarned.has(key)) return;
|
|
285
|
+
this.notShownWarned.add(key);
|
|
286
|
+
console.error(
|
|
287
|
+
`[mcpl] ${serverId}: a system injection in namespace ${logValue(namespace)} holds a block that isn't text, ` +
|
|
288
|
+
"which the system prompt can't carry, so an agent given the injection reads a line in place of each such block; " +
|
|
289
|
+
'this line prints once per server and namespace while the host runs',
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
|
|
286
293
|
}
|