@animalabs/agent-framework 0.22.1 → 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 +4 -2
- package/dist/src/agent.d.ts +266 -28
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +539 -104
- package/dist/src/agent.js.map +1 -1
- package/dist/src/api/mcp-server-core.d.ts +41 -0
- package/dist/src/api/mcp-server-core.d.ts.map +1 -0
- package/dist/src/api/mcp-server-core.js +593 -0
- package/dist/src/api/mcp-server-core.js.map +1 -0
- package/dist/src/api/mcp-server.d.ts +2 -36
- package/dist/src/api/mcp-server.d.ts.map +1 -1
- package/dist/src/api/mcp-server.js +15 -595
- package/dist/src/api/mcp-server.js.map +1 -1
- package/dist/src/api/server.d.ts +9 -1
- package/dist/src/api/server.d.ts.map +1 -1
- package/dist/src/api/server.js +55 -27
- package/dist/src/api/server.js.map +1 -1
- package/dist/src/api/types.d.ts +10 -2
- 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 +1212 -192
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +6686 -1835
- 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/gate/gate-script.d.ts.map +1 -1
- package/dist/src/gate/gate-script.js.map +1 -1
- package/dist/src/index.d.ts +5 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/capability-grant.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +170 -13
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +499 -258
- 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/feature-set-manager.d.ts.map +1 -1
- package/dist/src/mcpl/feature-set-manager.js +4 -3
- package/dist/src/mcpl/feature-set-manager.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/log-value.d.ts +54 -0
- package/dist/src/mcpl/log-value.d.ts.map +1 -0
- package/dist/src/mcpl/log-value.js +109 -0
- package/dist/src/mcpl/log-value.js.map +1 -0
- package/dist/src/mcpl/prose-stream-router.d.ts +6 -6
- package/dist/src/mcpl/prose-stream-router.d.ts.map +1 -1
- package/dist/src/mcpl/prose-stream-router.js +4 -4
- package/dist/src/mcpl/prose-stream-router.js.map +1 -1
- package/dist/src/mcpl/push-coalescer.d.ts +64 -7
- package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
- package/dist/src/mcpl/push-coalescer.js +121 -24
- package/dist/src/mcpl/push-coalescer.js.map +1 -1
- package/dist/src/mcpl/push-handler.d.ts +38 -8
- package/dist/src/mcpl/push-handler.d.ts.map +1 -1
- package/dist/src/mcpl/push-handler.js +77 -78
- 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 +49 -14
- 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/refusal-lines.d.ts +37 -0
- package/dist/src/mcpl/refusal-lines.d.ts.map +1 -0
- package/dist/src/mcpl/refusal-lines.js +61 -0
- package/dist/src/mcpl/refusal-lines.js.map +1 -0
- package/dist/src/mcpl/scope-manager.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +107 -12
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +470 -139
- 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/tool-classes.d.ts +1 -1
- package/dist/src/mcpl/tool-classes.d.ts.map +1 -1
- package/dist/src/mcpl/tool-classes.js +3 -2
- package/dist/src/mcpl/tool-classes.js.map +1 -1
- package/dist/src/mcpl/tool-lifecycle.d.ts.map +1 -1
- package/dist/src/mcpl/tool-lifecycle.js.map +1 -1
- package/dist/src/mcpl/transport.d.ts +74 -7
- package/dist/src/mcpl/transport.d.ts.map +1 -1
- package/dist/src/mcpl/transport.js +209 -22
- package/dist/src/mcpl/transport.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +43 -28
- 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.d.ts.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 +383 -145
- 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/branch-intent.d.ts.map +1 -1
- package/dist/src/modules/workspace/branch-intent.js.map +1 -1
- package/dist/src/modules/workspace/disk-agreement.d.ts +54 -6
- package/dist/src/modules/workspace/disk-agreement.d.ts.map +1 -1
- package/dist/src/modules/workspace/disk-agreement.js +93 -27
- 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 +127 -27
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +821 -248
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/observe.d.ts +117 -15
- package/dist/src/modules/workspace/observe.d.ts.map +1 -1
- package/dist/src/modules/workspace/observe.js +436 -51
- package/dist/src/modules/workspace/observe.js.map +1 -1
- package/dist/src/modules/workspace/reconcile.d.ts +75 -8
- package/dist/src/modules/workspace/reconcile.d.ts.map +1 -1
- package/dist/src/modules/workspace/reconcile.js +576 -68
- package/dist/src/modules/workspace/reconcile.js.map +1 -1
- package/dist/src/modules/workspace/types.d.ts +42 -3
- 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/operator-log.d.ts.map +1 -1
- package/dist/src/operator-log.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/provider-waits.d.ts.map +1 -1
- package/dist/src/provider-waits.js.map +1 -1
- package/dist/src/queue.d.ts.map +1 -1
- package/dist/src/record-journal.d.ts.map +1 -1
- package/dist/src/record-journal.js.map +1 -1
- package/dist/src/recovery/discord-awareness-outbox.d.ts.map +1 -1
- package/dist/src/recovery/discord-awareness-outbox.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 +32 -25
- package/dist/src/recovery/offline-branch.js.map +1 -1
- package/dist/src/recovery/recover-cli.js.map +1 -1
- package/dist/src/runtime/liveness-watchdog.d.ts.map +1 -1
- package/dist/src/runtime/liveness-watchdog.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/shutdown.d.ts.map +1 -1
- package/dist/src/shutdown.js.map +1 -1
- package/dist/src/stored-removal.d.ts +73 -0
- package/dist/src/stored-removal.d.ts.map +1 -0
- package/dist/src/stored-removal.js +100 -0
- package/dist/src/stored-removal.js.map +1 -0
- package/dist/src/thinking-token-stamp.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/tune-out/tools.d.ts +1 -1
- package/dist/src/tune-out/tools.d.ts.map +1 -1
- package/dist/src/types/agent.d.ts +59 -11
- 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 +31 -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 +30 -7
- package/dist/src/types/module.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +151 -11
- 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 +10 -9
- package/src/agent.ts +572 -105
- package/src/api/mcp-server-core.ts +681 -0
- package/src/api/mcp-server.ts +16 -685
- package/src/api/server.ts +55 -30
- package/src/api/types.ts +10 -2
- 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 +7158 -1936
- package/src/gate/event-gate.ts +28 -3
- package/src/index.ts +12 -3
- package/src/mcpl/channel-registry.ts +615 -289
- 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/feature-set-manager.ts +4 -3
- 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/log-value.ts +116 -0
- package/src/mcpl/prose-stream-router.ts +6 -6
- package/src/mcpl/push-coalescer.ts +124 -24
- package/src/mcpl/push-handler.ts +86 -84
- package/src/mcpl/reference-fetcher.ts +71 -26
- package/src/mcpl/references.ts +81 -22
- package/src/mcpl/refusal-lines.ts +59 -0
- package/src/mcpl/server-connection.ts +496 -142
- package/src/mcpl/server-registry.ts +15 -4
- package/src/mcpl/skip-reply-wake.ts +73 -0
- package/src/mcpl/tool-classes.ts +3 -2
- package/src/mcpl/transport.ts +219 -26
- package/src/mcpl/types.ts +18 -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 +395 -160
- 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 +125 -21
- package/src/modules/workspace/effects.ts +279 -35
- package/src/modules/workspace/index.ts +841 -261
- package/src/modules/workspace/observe.ts +456 -56
- package/src/modules/workspace/reconcile.ts +688 -76
- package/src/modules/workspace/types.ts +41 -2
- 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 +36 -29
- package/src/safe-slice.ts +9 -1
- package/src/stored-removal.ts +126 -0
- 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 +59 -13
- package/src/types/events.ts +17 -0
- package/src/types/framework.ts +31 -5
- package/src/types/inference-log.ts +1 -1
- package/src/types/module.ts +31 -7
- package/src/types/trace.ts +158 -12
- 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 -462
- 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 -387
- 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 -267
- 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/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 -1394
- 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 -72
- package/dist/test/helpers/coalescing-fixture.d.ts.map +0 -1
- package/dist/test/helpers/coalescing-fixture.js +0 -146
- 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/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 -863
- 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 -309
- 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 -1201
- 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 -265
- package/dist/test/maintenance-timer.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-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 -236
- 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-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-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-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 -258
- 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 -226
- 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 -398
- 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 -197
- package/dist/test/overbudget-drain-breaker.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 -14
- package/dist/test/physical-window-restart.test.d.ts.map +0 -1
- package/dist/test/physical-window-restart.test.js +0 -222
- 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 -706
- 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 -2196
- 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 -224
- 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 -108
- 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-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/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-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 -672
- 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 -3607
- 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 -329
- 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/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 -3194
- 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
|
@@ -7,8 +7,9 @@
|
|
|
7
7
|
* Spec reference: Section 9 (Push Events).
|
|
8
8
|
*/
|
|
9
9
|
import type { ContentBlock } from '@animalabs/membrane';
|
|
10
|
-
import type {
|
|
10
|
+
import type { PushEventParams, PushEventResult } from './types.js';
|
|
11
11
|
import type { FeatureSetManager } from './feature-set-manager.js';
|
|
12
|
+
import type { InboundSource } from './inbound-source.js';
|
|
12
13
|
/**
|
|
13
14
|
* A push event converted for the framework processing queue.
|
|
14
15
|
*
|
|
@@ -32,12 +33,12 @@ export interface McplPushEvent {
|
|
|
32
33
|
coalescingSubject?: string;
|
|
33
34
|
/** RFC-006 assembly: materialized for this agent's turn (store directly). */
|
|
34
35
|
assemblingFor?: string;
|
|
36
|
+
/** Host acceptance time (epoch ms), stamped where the push is admitted. */
|
|
37
|
+
acceptedAt?: number;
|
|
38
|
+
/** Framework-owned source envelope, frozen at a coalesced occurrence's
|
|
39
|
+
* acceptance so its later delivery cannot restamp it (inbound-source.ts). */
|
|
40
|
+
inboundSource?: InboundSource;
|
|
35
41
|
}
|
|
36
|
-
/**
|
|
37
|
-
* Convert a single MCPL wire-format content block to a membrane ContentBlock.
|
|
38
|
-
* Same logic as hook-orchestrator.ts.
|
|
39
|
-
*/
|
|
40
|
-
export declare function convertBlock(block: McplContentBlock): ContentBlock;
|
|
41
42
|
/** Minimal responder interface for sending JSON-RPC results back. */
|
|
42
43
|
interface Responder {
|
|
43
44
|
respond(result: PushEventResult): void;
|
|
@@ -45,15 +46,26 @@ interface Responder {
|
|
|
45
46
|
}
|
|
46
47
|
export declare class PushHandler {
|
|
47
48
|
private readonly handleCoalesced?;
|
|
49
|
+
/** An ordinary (uncoalesced) push was just admitted, before it is queued
|
|
50
|
+
* or acknowledged: return its source envelope, frozen now
|
|
51
|
+
* (mcpl/inbound-source.ts). Coalesced work is stamped by its own path. */
|
|
52
|
+
private readonly acceptInbound?;
|
|
48
53
|
private featureSetManager;
|
|
49
54
|
private pushEventFn;
|
|
50
55
|
private emitTraceFn;
|
|
51
56
|
private shouldTriggerInference?;
|
|
52
57
|
private dedup;
|
|
58
|
+
/** Holds back repeats of the line for a channel-scoped push refused because
|
|
59
|
+
* its channel isn't declared (-32023) or may not be used (-32017). */
|
|
60
|
+
private channelRefusalLines;
|
|
53
61
|
constructor(featureSetManager: FeatureSetManager, pushEventFn: (event: McplPushEvent) => void, emitTraceFn: (event: {
|
|
54
62
|
type: string;
|
|
55
63
|
[key: string]: unknown;
|
|
56
|
-
}) => void, shouldTriggerInference?: (content: string, metadata: Record<string, unknown>) => boolean, handleCoalesced?: ((serverId: string, params: PushEventParams, event: McplPushEvent) => Promise<PushEventResult>) | undefined
|
|
64
|
+
}) => void, shouldTriggerInference?: (content: string, metadata: Record<string, unknown>) => boolean, handleCoalesced?: ((serverId: string, params: PushEventParams, event: McplPushEvent) => Promise<PushEventResult>) | undefined,
|
|
65
|
+
/** An ordinary (uncoalesced) push was just admitted, before it is queued
|
|
66
|
+
* or acknowledged: return its source envelope, frozen now
|
|
67
|
+
* (mcpl/inbound-source.ts). Coalesced work is stamped by its own path. */
|
|
68
|
+
acceptInbound?: ((event: McplPushEvent) => InboundSource | undefined) | undefined);
|
|
57
69
|
/**
|
|
58
70
|
* Handle a push/event message from an MCPL server.
|
|
59
71
|
*
|
|
@@ -66,7 +78,25 @@ export declare class PushHandler {
|
|
|
66
78
|
* 7. Respond with accepted + inferenceId
|
|
67
79
|
*/
|
|
68
80
|
handlePushEvent(serverId: string, params: PushEventParams, responder?: Responder): Promise<void>;
|
|
69
|
-
/**
|
|
81
|
+
/**
|
|
82
|
+
* A coalesced occurrence the host refused, as loud as every other push
|
|
83
|
+
* rejection: its producer is told on the wire, and until now the host said
|
|
84
|
+
* nothing, so a dropped message left no trace where operators look
|
|
85
|
+
* (agent-framework#266). The producer gets the wire answer this lane gives
|
|
86
|
+
* (`answered`): the thrown error's code and message, or -32602 for a
|
|
87
|
+
* malformed occurrence without one. The reason follows that answer
|
|
88
|
+
* (coalesceRejectionReason): `coalesce-failed` when the host itself failed,
|
|
89
|
+
* `coalesce-invalid` when the producer's occurrence was refused, with the
|
|
90
|
+
* failing `field` and the error's message as `detail`. A missing eventId
|
|
91
|
+
* prints as `""` and traces as `''`, as the channel lane's missing id does.
|
|
92
|
+
* A channel-scoped push refused because its channel isn't declared or may
|
|
93
|
+
* not be used names the channel on its line and its trace, and is refused
|
|
94
|
+
* for as long as that lasts, so its line prints at most once a minute per
|
|
95
|
+
* channel (RefusalLines); every refusal is traced.
|
|
96
|
+
*/
|
|
97
|
+
private traceCoalesceRejection;
|
|
98
|
+
/** Loud, like every other push rejection: the producer's wake went nowhere.
|
|
99
|
+
* A missing eventId prints as `""` and traces as `''`, as on every push line. */
|
|
70
100
|
private traceEmptyRejection;
|
|
71
101
|
}
|
|
72
102
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-handler.d.ts","sourceRoot":"","sources":["../../../src/mcpl/push-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"push-handler.d.ts","sourceRoot":"","sources":["../../../src/mcpl/push-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAIlE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AASzD;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;kFAC8E;IAC9E,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAsCD,qEAAqE;AACrE,UAAU,SAAS;IACjB,OAAO,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IACvC,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACpE;AAMD,qBAAa,WAAW;IAepB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IACjC;;+EAE2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAlBjC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,WAAW,CAA4D;IAC/E,OAAO,CAAC,sBAAsB,CAAC,CAAkE;IACjG,OAAO,CAAC,KAAK,CAAsB;IACnC;2EACuE;IACvE,OAAO,CAAC,mBAAmB,CAAsB;IAEjD,YACE,iBAAiB,EAAE,iBAAiB,EACpC,WAAW,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,EAC3C,WAAW,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,KAAK,IAAI,EACtE,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,EACvE,eAAe,CAAC,GAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,eAAe,CAAC,aAAA;IAChI;;+EAE2E;IAC1D,aAAa,CAAC,GAAE,CAAC,KAAK,EAAE,aAAa,KAAK,aAAa,GAAG,SAAS,aAAA,EAMrF;IAED;;;;;;;;;;OAUG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,eAAe,EACvB,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,IAAI,CAAC,CA6If;IAED;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,sBAAsB;IA+B9B;sFACkF;IAClF,OAAO,CAAC,mBAAmB;CAU5B"}
|
|
@@ -6,74 +6,13 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Spec reference: Section 9 (Push Events).
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
9
|
+
import { convertBlock } from './convert-block.js';
|
|
10
10
|
import { McplFeatureSetError } from './feature-set-manager.js';
|
|
11
11
|
import { expandCoreTags } from './tags.js';
|
|
12
|
-
import { EmptyContentError, validateCoalescedContent } from './push-coalescer.js';
|
|
13
|
-
import { isSilentHeartbeatMarker,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
// ============================================================================
|
|
17
|
-
/**
|
|
18
|
-
* Convert a single MCPL wire-format content block to a membrane ContentBlock.
|
|
19
|
-
* Same logic as hook-orchestrator.ts.
|
|
20
|
-
*/
|
|
21
|
-
export function convertBlock(block) {
|
|
22
|
-
switch (block.type) {
|
|
23
|
-
case 'text':
|
|
24
|
-
return { type: 'text', text: block.text };
|
|
25
|
-
case 'image':
|
|
26
|
-
if (isInlineContradiction(block)) {
|
|
27
|
-
// RFC-005 vector 2: inline data claiming bulk disposition — fail
|
|
28
|
-
// closed, withhold the data (checked BEFORE the data branch).
|
|
29
|
-
return { type: 'text', text: INLINE_WITHHELD_TEXT };
|
|
30
|
-
}
|
|
31
|
-
if (block.uri && block.disposition) {
|
|
32
|
-
// RFC-005 uri-form media with a disposition claim: stub, do not
|
|
33
|
-
// hand the URI to the provider or inline it.
|
|
34
|
-
return { type: 'text', text: referenceStubOrNull(block, 'attachment on push event') ?? '[reference]' };
|
|
35
|
-
}
|
|
36
|
-
if (block.data && block.mimeType) {
|
|
37
|
-
return {
|
|
38
|
-
type: 'image',
|
|
39
|
-
source: { type: 'base64', data: block.data, mediaType: block.mimeType },
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
if (block.uri) {
|
|
43
|
-
return {
|
|
44
|
-
type: 'image',
|
|
45
|
-
source: { type: 'url', url: block.uri },
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
return { type: 'text', text: '[Image: no data]' };
|
|
49
|
-
case 'audio':
|
|
50
|
-
if (isInlineContradiction(block)) {
|
|
51
|
-
// RFC-005 vector 2: inline data claiming bulk disposition — fail
|
|
52
|
-
// closed, withhold the data (checked BEFORE the data branch).
|
|
53
|
-
return { type: 'text', text: INLINE_WITHHELD_TEXT };
|
|
54
|
-
}
|
|
55
|
-
if (block.uri && block.disposition) {
|
|
56
|
-
// RFC-005 uri-form media with a disposition claim: stub, do not
|
|
57
|
-
// hand the URI to the provider or inline it.
|
|
58
|
-
return { type: 'text', text: referenceStubOrNull(block, 'attachment on push event') ?? '[reference]' };
|
|
59
|
-
}
|
|
60
|
-
if (block.data && block.mimeType) {
|
|
61
|
-
return {
|
|
62
|
-
type: 'audio',
|
|
63
|
-
source: { type: 'base64', data: block.data, mediaType: block.mimeType },
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
return { type: 'text', text: '[Audio: no data]' };
|
|
67
|
-
case 'resource':
|
|
68
|
-
// RFC-005: reference blocks become bounded stubs — never raw URIs
|
|
69
|
-
// (a signed URL is a bearer credential that looks like a location).
|
|
70
|
-
return { type: 'text', text: referenceStubOrNull(block, 'attachment on push event') ?? '[reference]' };
|
|
71
|
-
default:
|
|
72
|
-
// Unknown wire block types previously fell off the exhaustive switch
|
|
73
|
-
// and propagated `undefined` into ContentBlock[]. Fail visibly.
|
|
74
|
-
return { type: 'text', text: `[unrecognized content block: ${block.type ?? 'untyped'}]` };
|
|
75
|
-
}
|
|
76
|
-
}
|
|
12
|
+
import { coalesceRejectionReason, EmptyContentError, validateCoalescedContent } from './push-coalescer.js';
|
|
13
|
+
import { isSilentHeartbeatMarker, isVisiblyEmptyConversion } from './visible-content.js';
|
|
14
|
+
import { logDetail, logValue } from './log-value.js';
|
|
15
|
+
import { RefusalLines } from './refusal-lines.js';
|
|
77
16
|
// ============================================================================
|
|
78
17
|
// LRU Dedup Set
|
|
79
18
|
// ============================================================================
|
|
@@ -107,13 +46,22 @@ class DedupSet {
|
|
|
107
46
|
// ============================================================================
|
|
108
47
|
export class PushHandler {
|
|
109
48
|
handleCoalesced;
|
|
49
|
+
acceptInbound;
|
|
110
50
|
featureSetManager;
|
|
111
51
|
pushEventFn;
|
|
112
52
|
emitTraceFn;
|
|
113
53
|
shouldTriggerInference;
|
|
114
54
|
dedup = new DedupSet(1000);
|
|
115
|
-
|
|
55
|
+
/** Holds back repeats of the line for a channel-scoped push refused because
|
|
56
|
+
* its channel isn't declared (-32023) or may not be used (-32017). */
|
|
57
|
+
channelRefusalLines = new RefusalLines();
|
|
58
|
+
constructor(featureSetManager, pushEventFn, emitTraceFn, shouldTriggerInference, handleCoalesced,
|
|
59
|
+
/** An ordinary (uncoalesced) push was just admitted, before it is queued
|
|
60
|
+
* or acknowledged: return its source envelope, frozen now
|
|
61
|
+
* (mcpl/inbound-source.ts). Coalesced work is stamped by its own path. */
|
|
62
|
+
acceptInbound) {
|
|
116
63
|
this.handleCoalesced = handleCoalesced;
|
|
64
|
+
this.acceptInbound = acceptInbound;
|
|
117
65
|
this.featureSetManager = featureSetManager;
|
|
118
66
|
this.pushEventFn = pushEventFn;
|
|
119
67
|
this.emitTraceFn = emitTraceFn;
|
|
@@ -153,7 +101,7 @@ export class PushHandler {
|
|
|
153
101
|
: 'Feature set validation failed';
|
|
154
102
|
// Loud rejection — a rejected push event is an agent that silently
|
|
155
103
|
// never hears the message. (2026-07-09 diagnosability pass.)
|
|
156
|
-
console.error(`[push-event-rejected] server=${serverId} eventId=${params.eventId} reason=${reason}`);
|
|
104
|
+
console.error(`[push-event-rejected] server=${serverId} eventId=${logValue(params.eventId ?? '')} reason=${logValue(reason)}`);
|
|
157
105
|
if (err instanceof McplFeatureSetError && responder?.respondError) {
|
|
158
106
|
responder.respondError(err.code, reason, { featureSet: err.featureSet });
|
|
159
107
|
}
|
|
@@ -172,14 +120,17 @@ export class PushHandler {
|
|
|
172
120
|
if (coalesced) {
|
|
173
121
|
// RFC-006 §13: malformed content is a -32602, checked before conversion.
|
|
174
122
|
try {
|
|
175
|
-
validateCoalescedContent(params.payload?.content,
|
|
123
|
+
validateCoalescedContent(params.payload?.content, { allowEmpty: emptyAllowed });
|
|
176
124
|
}
|
|
177
125
|
catch (error) {
|
|
178
126
|
const err = error;
|
|
127
|
+
const code = err.code ?? -32602;
|
|
179
128
|
if (err instanceof EmptyContentError)
|
|
180
129
|
this.traceEmptyRejection(serverId, params);
|
|
130
|
+
else
|
|
131
|
+
this.traceCoalesceRejection(serverId, params, err, code);
|
|
181
132
|
if (responder?.respondError)
|
|
182
|
-
responder.respondError(
|
|
133
|
+
responder.respondError(code, err.message, { field: err.field });
|
|
183
134
|
else
|
|
184
135
|
responder?.respond({ accepted: false, reason: err instanceof EmptyContentError ? err.reason : err.message });
|
|
185
136
|
return;
|
|
@@ -187,8 +138,8 @@ export class PushHandler {
|
|
|
187
138
|
}
|
|
188
139
|
// 2. Convert content blocks, and refuse content with nothing visible in
|
|
189
140
|
// it — before dedup, so a refused eventId is not burned for a retry.
|
|
190
|
-
const content = params.payload.content.map(convertBlock);
|
|
191
|
-
if (!emptyAllowed &&
|
|
141
|
+
const content = params.payload.content.map((block) => convertBlock(block, 'attachment on push event', serverId));
|
|
142
|
+
if (!emptyAllowed && isVisiblyEmptyConversion(params.payload.content, content)) {
|
|
192
143
|
const err = new EmptyContentError();
|
|
193
144
|
this.traceEmptyRejection(serverId, params);
|
|
194
145
|
if (responder?.respondError)
|
|
@@ -201,7 +152,7 @@ export class PushHandler {
|
|
|
201
152
|
// coalescer's receipts instead (RFC-006 §3.1: a retry within the window
|
|
202
153
|
// gets its original result, which this set could not return).
|
|
203
154
|
if (!coalesced && this.dedup.checkAndAdd(params.eventId)) {
|
|
204
|
-
console.error(`[push-event-rejected] server=${serverId} eventId=${params.eventId} reason=duplicate`);
|
|
155
|
+
console.error(`[push-event-rejected] server=${serverId} eventId=${logValue(params.eventId ?? '')} reason=duplicate`);
|
|
205
156
|
responder?.respond({ accepted: false, reason: 'duplicate' });
|
|
206
157
|
return;
|
|
207
158
|
}
|
|
@@ -236,6 +187,7 @@ export class PushHandler {
|
|
|
236
187
|
timestamp: params.timestamp,
|
|
237
188
|
inferenceId,
|
|
238
189
|
triggerInference,
|
|
190
|
+
acceptedAt: Date.now(),
|
|
239
191
|
};
|
|
240
192
|
if (coalesced) {
|
|
241
193
|
// RFC-006: the coalescer decides whether this occurrence replaces an
|
|
@@ -248,14 +200,21 @@ export class PushHandler {
|
|
|
248
200
|
}
|
|
249
201
|
catch (error) {
|
|
250
202
|
const err = error;
|
|
251
|
-
|
|
203
|
+
const code = typeof err.code === 'number' ? err.code : -32603;
|
|
204
|
+
this.traceCoalesceRejection(serverId, params, err, code);
|
|
252
205
|
if (responder?.respondError)
|
|
253
|
-
responder.respondError(
|
|
206
|
+
responder.respondError(code, err.message, { field: err.field });
|
|
254
207
|
else
|
|
255
208
|
responder?.respond({ accepted: false, reason: err.message });
|
|
256
209
|
}
|
|
257
210
|
return;
|
|
258
211
|
}
|
|
212
|
+
// The source envelope is frozen at admission, before queueing or the
|
|
213
|
+
// acknowledgement: nothing that changes while the push waits in the
|
|
214
|
+
// queue can rewrite where it came from.
|
|
215
|
+
const inboundSource = this.acceptInbound?.(pushEvent);
|
|
216
|
+
if (inboundSource)
|
|
217
|
+
pushEvent.inboundSource = inboundSource;
|
|
259
218
|
this.pushEventFn(pushEvent);
|
|
260
219
|
// 7. Emit trace
|
|
261
220
|
this.emitTraceFn({
|
|
@@ -267,13 +226,53 @@ export class PushHandler {
|
|
|
267
226
|
// 8. Respond
|
|
268
227
|
responder?.respond({ accepted: true, inferenceId });
|
|
269
228
|
}
|
|
270
|
-
/**
|
|
229
|
+
/**
|
|
230
|
+
* A coalesced occurrence the host refused, as loud as every other push
|
|
231
|
+
* rejection: its producer is told on the wire, and until now the host said
|
|
232
|
+
* nothing, so a dropped message left no trace where operators look
|
|
233
|
+
* (agent-framework#266). The producer gets the wire answer this lane gives
|
|
234
|
+
* (`answered`): the thrown error's code and message, or -32602 for a
|
|
235
|
+
* malformed occurrence without one. The reason follows that answer
|
|
236
|
+
* (coalesceRejectionReason): `coalesce-failed` when the host itself failed,
|
|
237
|
+
* `coalesce-invalid` when the producer's occurrence was refused, with the
|
|
238
|
+
* failing `field` and the error's message as `detail`. A missing eventId
|
|
239
|
+
* prints as `""` and traces as `''`, as the channel lane's missing id does.
|
|
240
|
+
* A channel-scoped push refused because its channel isn't declared or may
|
|
241
|
+
* not be used names the channel on its line and its trace, and is refused
|
|
242
|
+
* for as long as that lasts, so its line prints at most once a minute per
|
|
243
|
+
* channel (RefusalLines); every refusal is traced.
|
|
244
|
+
*/
|
|
245
|
+
traceCoalesceRejection(serverId, params, error, answered) {
|
|
246
|
+
const reason = coalesceRejectionReason(answered);
|
|
247
|
+
const field = typeof error.field === 'string' && error.field ? error.field : undefined;
|
|
248
|
+
const scoped = params.coalesce?.channelId;
|
|
249
|
+
const channelId = (answered === -32023 || answered === -32017) && typeof scoped === 'string' ? scoped : undefined;
|
|
250
|
+
const held = channelId === undefined ? 0 : this.channelRefusalLines.admit(serverId, channelId);
|
|
251
|
+
if (held !== null) {
|
|
252
|
+
console.error(`[push-event-rejected] server=${serverId} featureSet=${logValue(params.featureSet ?? '')} eventId=${logValue(params.eventId ?? '')} ` +
|
|
253
|
+
(channelId === undefined ? '' : `channel=${logValue(channelId)} `) +
|
|
254
|
+
`reason=${reason}${field ? ` field=${logValue(field)}` : ''}: ${logDetail(error.message)}` +
|
|
255
|
+
(held ? ` (${held} more since the last line)` : ''));
|
|
256
|
+
}
|
|
257
|
+
this.emitTraceFn({
|
|
258
|
+
type: 'mcpl:push-event-rejected',
|
|
259
|
+
serverId,
|
|
260
|
+
eventId: typeof params.eventId === 'string' ? params.eventId : '',
|
|
261
|
+
featureSet: params.featureSet,
|
|
262
|
+
reason,
|
|
263
|
+
...(field ? { field } : {}),
|
|
264
|
+
...(channelId === undefined ? {} : { channelId }),
|
|
265
|
+
detail: error.message,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
/** Loud, like every other push rejection: the producer's wake went nowhere.
|
|
269
|
+
* A missing eventId prints as `""` and traces as `''`, as on every push line. */
|
|
271
270
|
traceEmptyRejection(serverId, params) {
|
|
272
|
-
console.error(`[push-event-rejected] server=${serverId} eventId=${params.eventId} reason=empty-content`);
|
|
271
|
+
console.error(`[push-event-rejected] server=${serverId} eventId=${logValue(params.eventId ?? '')} reason=empty-content`);
|
|
273
272
|
this.emitTraceFn({
|
|
274
273
|
type: 'mcpl:push-event-rejected',
|
|
275
274
|
serverId,
|
|
276
|
-
eventId: params.eventId,
|
|
275
|
+
eventId: typeof params.eventId === 'string' ? params.eventId : '',
|
|
277
276
|
featureSet: params.featureSet,
|
|
278
277
|
reason: 'empty-content',
|
|
279
278
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-handler.js","sourceRoot":"","sources":["../../../src/mcpl/push-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"push-handler.js","sourceRoot":"","sources":["../../../src/mcpl/push-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,9 @@ import type { ReferenceRecord } from './references.js';
|
|
|
3
3
|
export declare const DEFAULT_FETCH_MAX_BYTES: number;
|
|
4
4
|
/** Eager (autofetch) threshold: at most what could have shipped inline. */
|
|
5
5
|
export declare const DEFAULT_EAGER_FETCH_MAX_BYTES: number;
|
|
6
|
-
/** Cumulative per-server budget for this process
|
|
6
|
+
/** Cumulative per-server budget for this process: every byte a fetch dialed
|
|
7
|
+
* through a server reads counts against that server's, whether or not it's
|
|
8
|
+
* kept. */
|
|
7
9
|
export declare const DEFAULT_MAX_TOTAL_BYTES: number;
|
|
8
10
|
declare const EAGER_FETCH_TIMEOUT_MS = 10000;
|
|
9
11
|
export interface ResolvedServerBinding {
|
|
@@ -37,6 +39,10 @@ export declare class ReferenceFetcher {
|
|
|
37
39
|
/** Persist the payload; returns a mount-prefixed path or null when no
|
|
38
40
|
* writable workspace exists. File name is host-generated (§7.3). */
|
|
39
41
|
private readonly saveFile;
|
|
42
|
+
/** Bytes read through each server in this process, charged to the server a
|
|
43
|
+
* fetch dials through as each chunk is read, kept or not. Concurrent
|
|
44
|
+
* fetches through one server share the total, so each checks what the
|
|
45
|
+
* others have taken. */
|
|
40
46
|
private totals;
|
|
41
47
|
private inFlight;
|
|
42
48
|
constructor(resolveServer: (serverId: string) => ResolvedServerBinding | undefined,
|
|
@@ -44,8 +50,14 @@ export declare class ReferenceFetcher {
|
|
|
44
50
|
* writable workspace exists. File name is host-generated (§7.3). */
|
|
45
51
|
saveFile: (fileName: string, data: Buffer, mimeType: string) => Promise<string | null>);
|
|
46
52
|
/** Would the eager (autofetch) default fetch this record? Not one the
|
|
47
|
-
* fetcher refuses as expired, which would only take an eager slot.
|
|
53
|
+
* fetcher refuses as expired, which would only take an eager slot. It
|
|
54
|
+
* takes the eager limit of the server the fetch would dial. */
|
|
48
55
|
isEagerEligible(record: ReferenceRecord): boolean;
|
|
56
|
+
/** The server to dial for a record (§6.2): the first, in the order they
|
|
57
|
+
* delivered it, whose address is on the uri's origin. When none is, the
|
|
58
|
+
* first server's refusal (unknown to this host, or the origin check's),
|
|
59
|
+
* and for a record no server delivered, that it's unbound. */
|
|
60
|
+
private serverFor;
|
|
49
61
|
/** §6.1/§7.1 policy check; returns a refusal reason or null. */
|
|
50
62
|
private originCheck;
|
|
51
63
|
/** Fetch a reference to workspace storage. Idempotent per record; concurrent
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reference-fetcher.d.ts","sourceRoot":"","sources":["../../../src/mcpl/reference-fetcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reference-fetcher.d.ts","sourceRoot":"","sources":["../../../src/mcpl/reference-fetcher.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,8EAA8E;AAC9E,eAAO,MAAM,uBAAuB,QAAoB,CAAC;AACzD,2EAA2E;AAC3E,eAAO,MAAM,6BAA6B,QAAa,CAAC;AACxD;;YAEY;AACZ,eAAO,MAAM,uBAAuB,QAAqB,CAAC;AAO1D,QAAA,MAAM,sBAAsB,QAAS,CAAC;AAEtC,MAAM,WAAW,qBAAqB;IACpC,gEAAgE;IAChE,GAAG,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;yDAGyD;AACzD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAerD;AAWD,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU3D;AAED,qBAAa,gBAAgB;IASzB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B;yEACqE;IACrE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAX3B;;;6BAGyB;IACzB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,QAAQ,CAA4C;IAE5D,YACmB,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,qBAAqB,GAAG,SAAS;IACvF;yEACqE;IACpD,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EACrG;IAEJ;;oEAEgE;IAChE,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAOhD;IAED;;;mEAG+D;IAC/D,OAAO,CAAC,SAAS;IAejB,gEAAgE;IAChE,OAAO,CAAC,WAAW;IAgBnB;6CACyC;IACzC,KAAK,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAUtG;YAEa,OAAO;CAwGtB;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* dereferences a reference, and it fails closed on every axis the RFC names:
|
|
4
4
|
*
|
|
5
5
|
* - **origin binding (§6.1, revision 3):** authenticated fetches go only to
|
|
6
|
-
* the origin
|
|
6
|
+
* the origin a server's connection was dialed to, for a reference that
|
|
7
|
+
* server delivered, with that server's credential. This v1 does
|
|
7
8
|
* not fetch third-party origins at all (deferred with declared reference
|
|
8
9
|
* origins); the connection credential is applied as an Authorization
|
|
9
10
|
* header by this code alone and never surfaces to model, script, or URI.
|
|
@@ -28,14 +29,21 @@
|
|
|
28
29
|
* that the bytes are wanted). Per-server budgets cap cumulative appetite.
|
|
29
30
|
*/
|
|
30
31
|
import { createHash } from 'node:crypto';
|
|
31
|
-
import { EXPIRY_REASON, isReferenceExpired, referenceExpiry, REFERENCE_LIMITS, sanitizeLabel } from './references.js';
|
|
32
|
+
import { EXPIRY_REASON, isReferenceExpired, referenceExpiry, REFERENCE_LIMITS, sanitizeLabel, UNBOUND_REASON } from './references.js';
|
|
32
33
|
/** Per-fetch hard ceiling on actual bytes (overridable per server / call). */
|
|
33
34
|
export const DEFAULT_FETCH_MAX_BYTES = 256 * 1024 * 1024;
|
|
34
35
|
/** Eager (autofetch) threshold: at most what could have shipped inline. */
|
|
35
36
|
export const DEFAULT_EAGER_FETCH_MAX_BYTES = 256 * 1024;
|
|
36
|
-
/** Cumulative per-server budget for this process
|
|
37
|
+
/** Cumulative per-server budget for this process: every byte a fetch dialed
|
|
38
|
+
* through a server reads counts against that server's, whether or not it's
|
|
39
|
+
* kept. */
|
|
37
40
|
export const DEFAULT_MAX_TOTAL_BYTES = 1024 * 1024 * 1024;
|
|
38
41
|
const FETCH_TIMEOUT_MS = 60_000;
|
|
42
|
+
/** What a refusal by the per-server budget adds. The total lives as long as
|
|
43
|
+
* this fetcher, one per framework, so only someone running the host renews
|
|
44
|
+
* it, by starting a new one, or raises the budget (the server's config's
|
|
45
|
+
* autofetch.maxTotalBytes, which each fetch reads afresh). */
|
|
46
|
+
const BUDGET_LASTS = "the budget doesn't renew on its own, so calling again won't change that unless whoever runs this host raises or renews it";
|
|
39
47
|
const EAGER_FETCH_TIMEOUT_MS = 10_000;
|
|
40
48
|
/** Magic-byte sniff for the formats this pipeline actually moves. The
|
|
41
49
|
* header is testimony too (vector 13): sniffed type wins for the storage
|
|
@@ -94,6 +102,10 @@ export function normalizedOrigin(url) {
|
|
|
94
102
|
export class ReferenceFetcher {
|
|
95
103
|
resolveServer;
|
|
96
104
|
saveFile;
|
|
105
|
+
/** Bytes read through each server in this process, charged to the server a
|
|
106
|
+
* fetch dials through as each chunk is read, kept or not. Concurrent
|
|
107
|
+
* fetches through one server share the total, so each checks what the
|
|
108
|
+
* others have taken. */
|
|
97
109
|
totals = new Map();
|
|
98
110
|
inFlight = new Map();
|
|
99
111
|
constructor(resolveServer,
|
|
@@ -104,21 +116,37 @@ export class ReferenceFetcher {
|
|
|
104
116
|
this.saveFile = saveFile;
|
|
105
117
|
}
|
|
106
118
|
/** Would the eager (autofetch) default fetch this record? Not one the
|
|
107
|
-
* fetcher refuses as expired, which would only take an eager slot.
|
|
119
|
+
* fetcher refuses as expired, which would only take an eager slot. It
|
|
120
|
+
* takes the eager limit of the server the fetch would dial. */
|
|
108
121
|
isEagerEligible(record) {
|
|
109
122
|
if (record.fetchedPath)
|
|
110
123
|
return false;
|
|
111
124
|
if (isReferenceExpired(record.testimony))
|
|
112
125
|
return false;
|
|
113
|
-
|
|
126
|
+
const server = this.serverFor(record);
|
|
127
|
+
if ('refusal' in server)
|
|
114
128
|
return false;
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
129
|
+
const cap = server.binding.autofetch?.maxBytes ?? DEFAULT_EAGER_FETCH_MAX_BYTES;
|
|
130
|
+
return record.testimony.sizeBytes !== undefined && record.testimony.sizeBytes <= cap;
|
|
131
|
+
}
|
|
132
|
+
/** The server to dial for a record (§6.2): the first, in the order they
|
|
133
|
+
* delivered it, whose address is on the uri's origin. When none is, the
|
|
134
|
+
* first server's refusal (unknown to this host, or the origin check's),
|
|
135
|
+
* and for a record no server delivered, that it's unbound. */
|
|
136
|
+
serverFor(record) {
|
|
137
|
+
let refusal;
|
|
138
|
+
for (const serverId of record.serverIds) {
|
|
139
|
+
const binding = this.resolveServer(serverId);
|
|
140
|
+
if (!binding) {
|
|
141
|
+
refusal ??= `unknown server: ${serverId}`;
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const offOrigin = this.originCheck(record, binding);
|
|
145
|
+
if (offOrigin === null)
|
|
146
|
+
return { serverId, binding };
|
|
147
|
+
refusal ??= offOrigin;
|
|
148
|
+
}
|
|
149
|
+
return { refusal: refusal ?? `reference ${UNBOUND_REASON}` };
|
|
122
150
|
}
|
|
123
151
|
/** §6.1/§7.1 policy check; returns a refusal reason or null. */
|
|
124
152
|
originCheck(record, binding) {
|
|
@@ -155,26 +183,34 @@ export class ReferenceFetcher {
|
|
|
155
183
|
}
|
|
156
184
|
async doFetch(record, opts) {
|
|
157
185
|
const t = record.testimony;
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
return { ok: false, error: `unknown server: ${record.serverId}` };
|
|
163
|
-
const refusal = this.originCheck(record, binding);
|
|
164
|
-
if (refusal)
|
|
165
|
-
return { ok: false, error: refusal };
|
|
186
|
+
const server = this.serverFor(record);
|
|
187
|
+
if ('refusal' in server)
|
|
188
|
+
return { ok: false, error: server.refusal };
|
|
189
|
+
const { serverId, binding } = server;
|
|
166
190
|
const expiry = referenceExpiry(t);
|
|
167
191
|
if (expiry)
|
|
168
192
|
return { ok: false, error: `reference ${EXPIRY_REASON[expiry]}` };
|
|
169
193
|
const ceiling = opts?.maxBytes ?? DEFAULT_FETCH_MAX_BYTES;
|
|
170
|
-
//
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
}
|
|
194
|
+
// The budget is checked before the ceiling, here and while reading: a
|
|
195
|
+
// larger max_bytes lifts the ceiling, and nothing the caller does lifts
|
|
196
|
+
// the budget, so a fetch past both is told about the budget.
|
|
174
197
|
const budget = binding.autofetch?.maxTotalBytes ?? DEFAULT_MAX_TOTAL_BYTES;
|
|
175
|
-
const used = this.totals.get(
|
|
198
|
+
const used = this.totals.get(serverId) ?? 0;
|
|
176
199
|
if (used >= budget) {
|
|
177
|
-
return { ok: false, error: `per-server fetch budget exhausted (${used}/${budget} bytes)` };
|
|
200
|
+
return { ok: false, error: `per-server fetch budget exhausted (${used}/${budget} bytes); ${BUDGET_LASTS}` };
|
|
201
|
+
}
|
|
202
|
+
// Vector 4: a claim already over the ceiling refuses without dialing. One
|
|
203
|
+
// that's also over what's left of the budget is told about the budget,
|
|
204
|
+
// which no max_bytes lifts. A claim over what's left but within the
|
|
205
|
+
// ceiling still dials, and the budget stops it at its first chunk past.
|
|
206
|
+
if (t.sizeBytes !== undefined && t.sizeBytes > ceiling) {
|
|
207
|
+
if (t.sizeBytes > budget - used) {
|
|
208
|
+
return {
|
|
209
|
+
ok: false,
|
|
210
|
+
error: `claimed ${t.sizeBytes} bytes exceeds what's left of the per-server fetch budget (${used}/${budget} bytes); ${BUDGET_LASTS}`,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
return { ok: false, error: `claimed ${t.sizeBytes} bytes exceeds fetch ceiling ${ceiling}` };
|
|
178
214
|
}
|
|
179
215
|
const controller = new AbortController();
|
|
180
216
|
const timer = setTimeout(() => controller.abort(), opts?.timeoutMs ?? FETCH_TIMEOUT_MS);
|
|
@@ -199,10 +235,17 @@ export class ReferenceFetcher {
|
|
|
199
235
|
if (done)
|
|
200
236
|
break;
|
|
201
237
|
received += value.byteLength;
|
|
202
|
-
|
|
238
|
+
// What's read is charged at once, kept or not: other fetches from
|
|
239
|
+
// this server read the same total, so none spends what another took.
|
|
240
|
+
const total = (this.totals.get(serverId) ?? 0) + value.byteLength;
|
|
241
|
+
this.totals.set(serverId, total);
|
|
242
|
+
if (total > budget) {
|
|
243
|
+
controller.abort();
|
|
244
|
+
return { ok: false, error: `aborted: per-server fetch budget exhausted (${total}/${budget} bytes); ${BUDGET_LASTS}` };
|
|
245
|
+
}
|
|
246
|
+
if (received > ceiling) {
|
|
203
247
|
controller.abort();
|
|
204
|
-
|
|
205
|
-
return { ok: false, error: `aborted: actual bytes exceeded ${which} at ${received}` };
|
|
248
|
+
return { ok: false, error: `aborted: actual bytes exceeded ceiling at ${received}` };
|
|
206
249
|
}
|
|
207
250
|
const buf = Buffer.from(value);
|
|
208
251
|
hash.update(buf);
|
|
@@ -231,7 +274,6 @@ export class ReferenceFetcher {
|
|
|
231
274
|
const path = await this.saveFile(`${record.refId}.${ext}`, data, observedMime);
|
|
232
275
|
if (path === null)
|
|
233
276
|
return { ok: false, error: 'no writable workspace mount to store the payload' };
|
|
234
|
-
this.totals.set(record.serverId, used + data.length);
|
|
235
277
|
record.fetchedPath = path;
|
|
236
278
|
record.verifiedBytes = data.length;
|
|
237
279
|
record.verifiedMimeType = observedMime;
|