@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
|
@@ -1,706 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* "Present while acting": the two halves that keep an agent conversationally
|
|
3
|
-
* alive during a long tool-using turn.
|
|
4
|
-
*
|
|
5
|
-
* SPEAK-while-acting — each round's prose is routed to the locus LIVE when
|
|
6
|
-
* the round yields its tool calls. Explicit-send suppression lasts until new
|
|
7
|
-
* external input begins another conversational round; the 'complete' case
|
|
8
|
-
* routes only trailing prose.
|
|
9
|
-
* Previously all segments were batched to the end of the turn.
|
|
10
|
-
*
|
|
11
|
-
* HEAR-while-acting — messages arriving mid-turn (deferred by addMessage
|
|
12
|
-
* while tool_use blocks are pending) are flushed to the context window at
|
|
13
|
-
* the tool-result boundary AND injected into the live stream via
|
|
14
|
-
* provideToolResults(results, { injectedMessages }) (membrane ≥0.5.72), so
|
|
15
|
-
* the next round of the SAME turn sees them instead of the agent staying
|
|
16
|
-
* deaf until the turn ends.
|
|
17
|
-
*/
|
|
18
|
-
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
19
|
-
import assert from 'node:assert/strict';
|
|
20
|
-
import { tmpdir } from 'node:os';
|
|
21
|
-
import { mkdtempSync, rmSync } from 'node:fs';
|
|
22
|
-
import { join } from 'node:path';
|
|
23
|
-
import { AgentFramework } from '../src/index.js';
|
|
24
|
-
import { MockMembrane, createMockResponse } from './helpers/mock-membrane.js';
|
|
25
|
-
// ---------------------------------------------------------------------------
|
|
26
|
-
// Test module: tools that optionally emit a mid-turn external message
|
|
27
|
-
// ---------------------------------------------------------------------------
|
|
28
|
-
class RobotModule {
|
|
29
|
-
name = 'robot';
|
|
30
|
-
framework = null;
|
|
31
|
-
/** When set, the next `move` call pushes this text as an external message
|
|
32
|
-
* BEFORE returning its result (simulating a chat reply arriving while the
|
|
33
|
-
* tool executes). */
|
|
34
|
-
interjection = null;
|
|
35
|
-
/** Optional routing locus attached to the interjected message. */
|
|
36
|
-
interjectionChannelId = null;
|
|
37
|
-
/** Full metadata override for the interjected message (wins over
|
|
38
|
-
* interjectionChannelId when set) — e.g. reaction tags. */
|
|
39
|
-
interjectionMetadata = null;
|
|
40
|
-
/** Delay tool completion so live routing deterministically precedes it. */
|
|
41
|
-
toolDelayMs = 0;
|
|
42
|
-
async start(_ctx) { }
|
|
43
|
-
async stop() { }
|
|
44
|
-
getTools() {
|
|
45
|
-
return [
|
|
46
|
-
{
|
|
47
|
-
name: 'move',
|
|
48
|
-
description: 'Move the robot',
|
|
49
|
-
inputSchema: { type: 'object', properties: { dir: { type: 'string' } } },
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
name: 'send_message',
|
|
53
|
-
description: 'Explicitly send a message',
|
|
54
|
-
inputSchema: { type: 'object', properties: { text: { type: 'string' } } },
|
|
55
|
-
},
|
|
56
|
-
// World-surface publication verbs (Eidoverse). Bare names matter: the
|
|
57
|
-
// framework strips the `robot--` prefix before consulting its sets.
|
|
58
|
-
{
|
|
59
|
-
name: 'say',
|
|
60
|
-
description: 'Say something aloud in the world',
|
|
61
|
-
inputSchema: { type: 'object', properties: { text: { type: 'string' } } },
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
name: 'whisper',
|
|
65
|
-
description: 'Whisper to someone in the world',
|
|
66
|
-
inputSchema: { type: 'object', properties: { to: { type: 'string' }, text: { type: 'string' } } },
|
|
67
|
-
},
|
|
68
|
-
];
|
|
69
|
-
}
|
|
70
|
-
async handleToolCall(call) {
|
|
71
|
-
if (this.toolDelayMs > 0) {
|
|
72
|
-
await new Promise((r) => setTimeout(r, this.toolDelayMs));
|
|
73
|
-
}
|
|
74
|
-
if (this.interjection) {
|
|
75
|
-
const text = this.interjection;
|
|
76
|
-
this.interjection = null;
|
|
77
|
-
this.framework.pushEvent({
|
|
78
|
-
type: 'external-message',
|
|
79
|
-
source: 'test',
|
|
80
|
-
content: text,
|
|
81
|
-
metadata: this.interjectionMetadata
|
|
82
|
-
?? (this.interjectionChannelId
|
|
83
|
-
? { channelId: this.interjectionChannelId }
|
|
84
|
-
: {}),
|
|
85
|
-
});
|
|
86
|
-
// Give the run loop a beat to process the queued message while this
|
|
87
|
-
// tool round is still pending (pendingAssistantBlocks non-empty), so
|
|
88
|
-
// it lands in deferredMessages before the tool-result event.
|
|
89
|
-
await new Promise((r) => setTimeout(r, 30));
|
|
90
|
-
}
|
|
91
|
-
return { success: true, data: { ok: true, tool: call.name } };
|
|
92
|
-
}
|
|
93
|
-
async onProcess(event, _state) {
|
|
94
|
-
if (event.type === 'external-message') {
|
|
95
|
-
const text = String(event.content);
|
|
96
|
-
const metadata = event.metadata;
|
|
97
|
-
return {
|
|
98
|
-
addMessages: [
|
|
99
|
-
{
|
|
100
|
-
participant: 'Antra',
|
|
101
|
-
content: [{ type: 'text', text }],
|
|
102
|
-
...(metadata ? { metadata } : {}),
|
|
103
|
-
},
|
|
104
|
-
],
|
|
105
|
-
// Only the initial 'go' starts a turn. Mid-turn interjections must
|
|
106
|
-
// NOT request inference — we're testing mid-turn delivery, not wakes.
|
|
107
|
-
requestInference: text === 'go',
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
return {};
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
/** Minimal ChannelRegistry stub covering everything driveStream touches. */
|
|
114
|
-
function stubChannelRegistry(framework) {
|
|
115
|
-
const routed = [];
|
|
116
|
-
let locusCalls = 0;
|
|
117
|
-
const explicit = {
|
|
118
|
-
resolveLocus: () => {
|
|
119
|
-
locusCalls++;
|
|
120
|
-
return `chan-live-${locusCalls}`;
|
|
121
|
-
},
|
|
122
|
-
routeSpeech: async (_agent, text, locus) => {
|
|
123
|
-
routed.push({ text, locus: locus ?? null });
|
|
124
|
-
// Mirror the real registry's outcome shape (delivery receipts read it).
|
|
125
|
-
return locus ? { delivered: true, channelId: locus } : null;
|
|
126
|
-
},
|
|
127
|
-
getDefaultPublishChannel: () => null,
|
|
128
|
-
isChannelOpen: () => true,
|
|
129
|
-
getDescriptor: () => undefined,
|
|
130
|
-
getChannelTools: () => [],
|
|
131
|
-
};
|
|
132
|
-
// Everything else driveStream/stop touches (startTyping, stopTyping,
|
|
133
|
-
// stopAll, ensureChannelRegistered, ...) becomes a no-op via Proxy so the
|
|
134
|
-
// stub doesn't chase the real registry's surface.
|
|
135
|
-
framework.channelRegistry = new Proxy(explicit, {
|
|
136
|
-
get: (target, prop) => (prop in target ? target[prop] : () => undefined),
|
|
137
|
-
});
|
|
138
|
-
return routed;
|
|
139
|
-
}
|
|
140
|
-
// ---------------------------------------------------------------------------
|
|
141
|
-
describe('present while acting', () => {
|
|
142
|
-
let tempDir;
|
|
143
|
-
let membrane;
|
|
144
|
-
let module;
|
|
145
|
-
beforeEach(() => {
|
|
146
|
-
tempDir = mkdtempSync(join(tmpdir(), 'pwa-test-'));
|
|
147
|
-
membrane = new MockMembrane();
|
|
148
|
-
module = new RobotModule();
|
|
149
|
-
});
|
|
150
|
-
afterEach(() => {
|
|
151
|
-
rmSync(tempDir, { recursive: true, force: true });
|
|
152
|
-
});
|
|
153
|
-
async function createFramework() {
|
|
154
|
-
const framework = await AgentFramework.create({
|
|
155
|
-
storePath: join(tempDir, 'test.chronicle'),
|
|
156
|
-
membrane: membrane.asMembrane(),
|
|
157
|
-
agents: [
|
|
158
|
-
{ name: 'assistant', model: 'test-model', systemPrompt: 'You are a robot pilot.' },
|
|
159
|
-
],
|
|
160
|
-
modules: [module],
|
|
161
|
-
});
|
|
162
|
-
module.framework = framework;
|
|
163
|
-
return framework;
|
|
164
|
-
}
|
|
165
|
-
function trigger(framework) {
|
|
166
|
-
framework.pushEvent({
|
|
167
|
-
type: 'external-message',
|
|
168
|
-
source: 'test',
|
|
169
|
-
content: 'go',
|
|
170
|
-
metadata: {},
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
// -------------------------------------------------------------------------
|
|
174
|
-
// Speak-while-acting
|
|
175
|
-
// -------------------------------------------------------------------------
|
|
176
|
-
it('routes each round\'s prose live and only trailing prose at complete', async () => {
|
|
177
|
-
// Round 1: narration + move; Round 2: more narration + move; final: postscript
|
|
178
|
-
membrane.pushResponse(createMockResponse([
|
|
179
|
-
{ type: 'text', text: 'Heading to the door now!' },
|
|
180
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
181
|
-
], 'tool_use'));
|
|
182
|
-
membrane.pushResponse(createMockResponse([
|
|
183
|
-
{ type: 'text', text: 'Door reached, opening it.' },
|
|
184
|
-
{ type: 'tool_use', id: 'c2', name: 'robot--move', input: { dir: 'east' } },
|
|
185
|
-
], 'tool_use'));
|
|
186
|
-
membrane.pushResponse(createMockResponse([
|
|
187
|
-
{ type: 'text', text: 'Arrived.' },
|
|
188
|
-
]));
|
|
189
|
-
const framework = await createFramework();
|
|
190
|
-
const routed = stubChannelRegistry(framework);
|
|
191
|
-
module.toolDelayMs = 25;
|
|
192
|
-
// Track live ordering: when the first segment routes, no tool results
|
|
193
|
-
// may have been provided yet (i.e. delivery happened DURING the round).
|
|
194
|
-
const resultsAtRouteTime = [];
|
|
195
|
-
const registry = framework.channelRegistry;
|
|
196
|
-
const origRoute = registry.routeSpeech;
|
|
197
|
-
registry.routeSpeech = async (a, t, l) => {
|
|
198
|
-
resultsAtRouteTime.push(membrane.lastStream.receivedToolResults.length);
|
|
199
|
-
return origRoute(a, t, l);
|
|
200
|
-
};
|
|
201
|
-
trigger(framework);
|
|
202
|
-
await framework.runUntilIdle();
|
|
203
|
-
assert.deepEqual(routed.map((r) => r.text), ['Heading to the door now!', 'Door reached, opening it.', 'Arrived.'], 'all three segments delivered, in order');
|
|
204
|
-
// Live: segment N routed before round N's tool results were provided
|
|
205
|
-
assert.equal(resultsAtRouteTime[0], 0, 'round-1 prose routed before round-1 results');
|
|
206
|
-
assert.equal(resultsAtRouteTime[1], 1, 'round-2 prose routed before round-2 results');
|
|
207
|
-
// Locus resolved ONCE and pinned for the whole turn (incl. trailing prose)
|
|
208
|
-
assert.deepEqual(routed.map((r) => r.locus), ['chan-live-1', 'chan-live-1', 'chan-live-1'], 'one locus resolution, pinned across the turn');
|
|
209
|
-
await framework.stop();
|
|
210
|
-
});
|
|
211
|
-
it('sticky silencing: a silencing round suppresses its own and all later prose', async () => {
|
|
212
|
-
membrane.pushResponse(createMockResponse([
|
|
213
|
-
{ type: 'text', text: 'sending it directly' },
|
|
214
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--send_message', input: { text: 'hi' } },
|
|
215
|
-
], 'tool_use'));
|
|
216
|
-
membrane.pushResponse(createMockResponse([
|
|
217
|
-
{ type: 'text', text: 'Narrating round two.' },
|
|
218
|
-
{ type: 'tool_use', id: 'c2', name: 'robot--move', input: { dir: 'up' } },
|
|
219
|
-
], 'tool_use'));
|
|
220
|
-
membrane.pushResponse(createMockResponse([]));
|
|
221
|
-
const framework = await createFramework();
|
|
222
|
-
const routed = stubChannelRegistry(framework);
|
|
223
|
-
trigger(framework);
|
|
224
|
-
await framework.runUntilIdle();
|
|
225
|
-
assert.deepEqual(routed.map((r) => r.text), [], 'explicit send in round 1 silences the turn from that round onward');
|
|
226
|
-
await framework.stop();
|
|
227
|
-
});
|
|
228
|
-
it('sticky silencing is forward-only: earlier rounds\' prose still routes', async () => {
|
|
229
|
-
membrane.pushResponse(createMockResponse([
|
|
230
|
-
{ type: 'text', text: 'Round one narration.' },
|
|
231
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'up' } },
|
|
232
|
-
], 'tool_use'));
|
|
233
|
-
membrane.pushResponse(createMockResponse([
|
|
234
|
-
{ type: 'text', text: 'private planning' },
|
|
235
|
-
{ type: 'tool_use', id: 'c2', name: 'robot--send_message', input: { text: 'hi' } },
|
|
236
|
-
], 'tool_use'));
|
|
237
|
-
membrane.pushResponse(createMockResponse([
|
|
238
|
-
{ type: 'text', text: 'trailing postscript' },
|
|
239
|
-
]));
|
|
240
|
-
const framework = await createFramework();
|
|
241
|
-
const routed = stubChannelRegistry(framework);
|
|
242
|
-
trigger(framework);
|
|
243
|
-
await framework.runUntilIdle();
|
|
244
|
-
assert.deepEqual(routed.map((r) => r.text), ['Round one narration.'], 'round-1 prose delivered live; round-2 (silencing) and trailing suppressed');
|
|
245
|
-
await framework.stop();
|
|
246
|
-
});
|
|
247
|
-
it('new injected channel input resets send suppression but the turn locus stays frozen', async () => {
|
|
248
|
-
// While handling one channel, the agent explicitly sends that response; a
|
|
249
|
-
// message from another channel arrives during the send, and the terminal
|
|
250
|
-
// prose answers the new message. The suppression is cleared (the prose IS
|
|
251
|
-
// delivered) — but it lands in the TURN's frozen locus, not the injected
|
|
252
|
-
// message's channel: ambient input must never capture the agent's voice
|
|
253
|
-
// mid-turn (2026-07-21 Cairn lounge misroute). A cross-channel reply
|
|
254
|
-
// needs an explicit send.
|
|
255
|
-
membrane.pushResponse(createMockResponse([
|
|
256
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--send_message', input: { text: 'reply to room4' } },
|
|
257
|
-
], 'tool_use'));
|
|
258
|
-
membrane.pushResponse(createMockResponse([
|
|
259
|
-
{ type: 'text', text: 'Yes, I want to try the VR space.' },
|
|
260
|
-
]));
|
|
261
|
-
const framework = await createFramework();
|
|
262
|
-
const routed = stubChannelRegistry(framework);
|
|
263
|
-
module.interjection = 'Want to try a VR space?';
|
|
264
|
-
module.interjectionChannelId = 'discord:guild:fable';
|
|
265
|
-
trigger(framework);
|
|
266
|
-
await framework.runUntilIdle();
|
|
267
|
-
assert.deepEqual(routed, [
|
|
268
|
-
{ text: 'Yes, I want to try the VR space.', locus: 'chan-live-1' },
|
|
269
|
-
]);
|
|
270
|
-
await framework.stop();
|
|
271
|
-
});
|
|
272
|
-
it('an ADDRESSED mid-turn injection re-pins the locus for subsequent prose', async () => {
|
|
273
|
-
// 2026-07-31 Mythos misroutes (n=6): someone explicitly addresses the
|
|
274
|
-
// agent from another channel mid-turn (mention / reply / DM); the
|
|
275
|
-
// agent's trailing prose answers THEM but the frozen pin delivered it
|
|
276
|
-
// to the stale locus (the hospital scene into antra's DM, and its
|
|
277
|
-
// mirror). Addressed conversational injections — the chat:addressed
|
|
278
|
-
// signal turn-START batching already prefers — now move the pin, with a
|
|
279
|
-
// one-line [routing] notice riding the same injection batch so window
|
|
280
|
-
// and wire agree. Ambient injections still cannot (previous test).
|
|
281
|
-
membrane.pushResponse(createMockResponse([
|
|
282
|
-
{ type: 'text', text: 'Station four, proceeding.' },
|
|
283
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
284
|
-
], 'tool_use'));
|
|
285
|
-
membrane.pushResponse(createMockResponse([
|
|
286
|
-
{ type: 'text', text: 'Answering the person who addressed me.' },
|
|
287
|
-
]));
|
|
288
|
-
const framework = await createFramework();
|
|
289
|
-
const routed = stubChannelRegistry(framework);
|
|
290
|
-
module.toolDelayMs = 25;
|
|
291
|
-
module.interjection = 'hey, quick question over here?';
|
|
292
|
-
module.interjectionMetadata = { channelId: 'discord:dm:antra', tags: ['chat:addressed'] };
|
|
293
|
-
const notices = [];
|
|
294
|
-
framework.onTrace((event) => {
|
|
295
|
-
const e = event;
|
|
296
|
-
if (e.type === 'message:added' && e.source === 'routing-notice')
|
|
297
|
-
notices.push(e.source);
|
|
298
|
-
});
|
|
299
|
-
trigger(framework);
|
|
300
|
-
await framework.runUntilIdle();
|
|
301
|
-
// Round-1 prose predates the injection and belongs to the old pin;
|
|
302
|
-
// trailing prose follows the addressed speaker.
|
|
303
|
-
assert.deepEqual(routed, [
|
|
304
|
-
{ text: 'Station four, proceeding.', locus: 'chan-live-1' },
|
|
305
|
-
{ text: 'Answering the person who addressed me.', locus: 'discord:dm:antra' },
|
|
306
|
-
]);
|
|
307
|
-
// Boot-baseline announcement + the mid-turn re-pin notice.
|
|
308
|
-
assert.equal(notices.length, 2, 'the re-pin produced exactly one routing notice');
|
|
309
|
-
// The notice rode the injection batch to the live stream (window == wire).
|
|
310
|
-
const injectedBatches = membrane.lastStream.receivedToolResultOptions
|
|
311
|
-
.map((o) => o?.injectedMessages ?? []);
|
|
312
|
-
const wired = injectedBatches.flat().map((m) => JSON.stringify(m.content));
|
|
313
|
-
assert.ok(wired.some((s) => s.includes('quick question')), 'the addressed message itself was injected');
|
|
314
|
-
assert.ok(wired.some((s) => s.includes('[routing] The conversation moved to discord:dm:antra')), 'the re-pin notice was injected alongside it');
|
|
315
|
-
await framework.stop();
|
|
316
|
-
});
|
|
317
|
-
it('a follow-up in a channel the agent explicitly engaged this turn re-pins', async () => {
|
|
318
|
-
// 2026-07-31 n=7 (q's #portables reply): the agent explicitly sent into
|
|
319
|
-
// a channel this turn; someone replies there WITHOUT a mention (ambient
|
|
320
|
-
// by tag, addressed by context). The engaged-channel leg moves the pin;
|
|
321
|
-
// trailing prose answering them follows.
|
|
322
|
-
membrane.pushResponse(createMockResponse([
|
|
323
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
324
|
-
], 'tool_use'));
|
|
325
|
-
membrane.pushResponse(createMockResponse([
|
|
326
|
-
{ type: 'text', text: 'Good plan on both counts.' },
|
|
327
|
-
]));
|
|
328
|
-
const framework = await createFramework();
|
|
329
|
-
const routed = stubChannelRegistry(framework);
|
|
330
|
-
module.toolDelayMs = 25;
|
|
331
|
-
module.interjection = 'I need to swap out this eye screen';
|
|
332
|
-
module.interjectionMetadata = {
|
|
333
|
-
channelId: 'discord:guild:portables',
|
|
334
|
-
tags: ['chat:ambient', 'chat:from-human'],
|
|
335
|
-
};
|
|
336
|
-
// Simulate an explicit send into #portables earlier in THIS turn (the
|
|
337
|
-
// production record happens on the MCPL send path; the harness module's
|
|
338
|
-
// tools are not MCPL, so seed the turn-scoped set mid-turn — after the
|
|
339
|
-
// turn-start clear, before the injection boundary).
|
|
340
|
-
const origHandle = module.handleToolCall.bind(module);
|
|
341
|
-
module.handleToolCall = async (call) => {
|
|
342
|
-
framework.turnEngagedChannels.set('assistant', new Set(['discord:guild:portables']));
|
|
343
|
-
return origHandle(call);
|
|
344
|
-
};
|
|
345
|
-
trigger(framework);
|
|
346
|
-
await framework.runUntilIdle();
|
|
347
|
-
assert.deepEqual(routed, [
|
|
348
|
-
{ text: 'Good plan on both counts.', locus: 'discord:guild:portables' },
|
|
349
|
-
], 'trailing prose followed the human reply into the engaged channel');
|
|
350
|
-
await framework.stop();
|
|
351
|
-
});
|
|
352
|
-
it('an agent-resident follow-up in an engaged channel re-pins too (no author-kind filter)', async () => {
|
|
353
|
-
// Fleet participants include agent-residents — "bot" by Discord flag,
|
|
354
|
-
// full conversational participants in fact. Their in-flow replies in a
|
|
355
|
-
// channel the agent just engaged move the pin exactly like anyone
|
|
356
|
-
// else's (antra, 2026-07-31: the author-kind distinction is fragile and
|
|
357
|
-
// wrong for this fleet).
|
|
358
|
-
membrane.pushResponse(createMockResponse([
|
|
359
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
360
|
-
], 'tool_use'));
|
|
361
|
-
membrane.pushResponse(createMockResponse([
|
|
362
|
-
{ type: 'text', text: 'Continuing with the colleague.' },
|
|
363
|
-
]));
|
|
364
|
-
const framework = await createFramework();
|
|
365
|
-
const routed = stubChannelRegistry(framework);
|
|
366
|
-
module.toolDelayMs = 25;
|
|
367
|
-
module.interjection = '*from the table* one receipt for the case, since I have a dated instance';
|
|
368
|
-
module.interjectionMetadata = {
|
|
369
|
-
channelId: 'discord:guild:hospital',
|
|
370
|
-
tags: ['chat:ambient', 'chat:from-bot'],
|
|
371
|
-
};
|
|
372
|
-
const origHandle = module.handleToolCall.bind(module);
|
|
373
|
-
module.handleToolCall = async (call) => {
|
|
374
|
-
framework.turnEngagedChannels.set('assistant', new Set(['discord:guild:hospital']));
|
|
375
|
-
return origHandle(call);
|
|
376
|
-
};
|
|
377
|
-
trigger(framework);
|
|
378
|
-
await framework.runUntilIdle();
|
|
379
|
-
assert.deepEqual(routed, [
|
|
380
|
-
{ text: 'Continuing with the colleague.', locus: 'discord:guild:hospital' },
|
|
381
|
-
], 'the agent-resident follow-up moved the pin like any participant');
|
|
382
|
-
await framework.stop();
|
|
383
|
-
});
|
|
384
|
-
it('ambient chatter in a channel the agent did NOT engage still cannot move the pin', async () => {
|
|
385
|
-
// The Cairn-protection boundary, restated for the engaged-channel era:
|
|
386
|
-
// no mention, no engagement this turn → the pin holds.
|
|
387
|
-
membrane.pushResponse(createMockResponse([
|
|
388
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
389
|
-
], 'tool_use'));
|
|
390
|
-
membrane.pushResponse(createMockResponse([
|
|
391
|
-
{ type: 'text', text: 'Continuing my report.' },
|
|
392
|
-
]));
|
|
393
|
-
const framework = await createFramework();
|
|
394
|
-
const routed = stubChannelRegistry(framework);
|
|
395
|
-
module.toolDelayMs = 25;
|
|
396
|
-
module.interjection = 'unrelated lounge chatter';
|
|
397
|
-
module.interjectionMetadata = {
|
|
398
|
-
channelId: 'discord:guild:lounge',
|
|
399
|
-
tags: ['chat:ambient', 'chat:from-human'],
|
|
400
|
-
};
|
|
401
|
-
trigger(framework);
|
|
402
|
-
await framework.runUntilIdle();
|
|
403
|
-
assert.deepEqual(routed, [
|
|
404
|
-
{ text: 'Continuing my report.', locus: 'chan-live-1' },
|
|
405
|
-
], 'un-engaged ambient left the pin alone');
|
|
406
|
-
await framework.stop();
|
|
407
|
-
});
|
|
408
|
-
it('an addressed injection from the CURRENT locus does not chatter a notice', async () => {
|
|
409
|
-
// Same-channel addressed input is the ordinary case (the person the
|
|
410
|
-
// agent is already talking to sends another message mid-turn): the pin
|
|
411
|
-
// is already right, so no re-pin and — critically for KV — no notice.
|
|
412
|
-
membrane.pushResponse(createMockResponse([
|
|
413
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
414
|
-
], 'tool_use'));
|
|
415
|
-
membrane.pushResponse(createMockResponse([
|
|
416
|
-
{ type: 'text', text: 'Continuing right here.' },
|
|
417
|
-
]));
|
|
418
|
-
const framework = await createFramework();
|
|
419
|
-
const routed = stubChannelRegistry(framework);
|
|
420
|
-
module.toolDelayMs = 25;
|
|
421
|
-
module.interjection = 'and one more thing';
|
|
422
|
-
module.interjectionMetadata = { channelId: 'chan-live-1', tags: ['chat:addressed'] };
|
|
423
|
-
const notices = [];
|
|
424
|
-
framework.onTrace((event) => {
|
|
425
|
-
const e = event;
|
|
426
|
-
if (e.type === 'message:added' && e.source === 'routing-notice')
|
|
427
|
-
notices.push(e.source);
|
|
428
|
-
});
|
|
429
|
-
trigger(framework);
|
|
430
|
-
await framework.runUntilIdle();
|
|
431
|
-
assert.deepEqual(routed, [{ text: 'Continuing right here.', locus: 'chan-live-1' }]);
|
|
432
|
-
assert.equal(notices.length, 1, 'only the boot-baseline announcement — no re-pin chatter');
|
|
433
|
-
await framework.stop();
|
|
434
|
-
});
|
|
435
|
-
it('a prose turn ends with a [delivered] receipt naming where the prose landed', async () => {
|
|
436
|
-
// Explicit sends receipt themselves via tool_result; auto-routed prose
|
|
437
|
-
// previously vanished with no in-window trace — the agent could never
|
|
438
|
-
// see where its own words went (2026-07-31 misroute series). One compact
|
|
439
|
-
// system message at logical turn end, channels deduped in delivery order.
|
|
440
|
-
membrane.pushResponse(createMockResponse([
|
|
441
|
-
{ type: 'text', text: 'A quiet reply with no tools.' },
|
|
442
|
-
]));
|
|
443
|
-
const framework = await createFramework();
|
|
444
|
-
stubChannelRegistry(framework);
|
|
445
|
-
trigger(framework);
|
|
446
|
-
await framework.runUntilIdle();
|
|
447
|
-
const cm = framework.agents.get('assistant').getContextManager();
|
|
448
|
-
const texts = cm.getAllMessages()
|
|
449
|
-
.flatMap((m) => m.content)
|
|
450
|
-
.filter((b) => b.type === 'text')
|
|
451
|
-
.map((b) => b.text ?? '');
|
|
452
|
-
const receipts = texts.filter((t) => t.startsWith('[delivered]'));
|
|
453
|
-
assert.deepEqual(receipts, ['[delivered] plain speech → chan-live-1']);
|
|
454
|
-
// The receipt is the LAST window message — after the assistant blocks.
|
|
455
|
-
assert.ok(texts[texts.length - 1].startsWith('[delivered]'), 'receipt sits at the settled tail');
|
|
456
|
-
await framework.stop();
|
|
457
|
-
});
|
|
458
|
-
it('a re-pinned turn\'s receipt names both channels in delivery order', async () => {
|
|
459
|
-
membrane.pushResponse(createMockResponse([
|
|
460
|
-
{ type: 'text', text: 'Station four, proceeding.' },
|
|
461
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
462
|
-
], 'tool_use'));
|
|
463
|
-
membrane.pushResponse(createMockResponse([
|
|
464
|
-
{ type: 'text', text: 'Answering the person who addressed me.' },
|
|
465
|
-
]));
|
|
466
|
-
const framework = await createFramework();
|
|
467
|
-
stubChannelRegistry(framework);
|
|
468
|
-
module.toolDelayMs = 25;
|
|
469
|
-
module.interjection = 'quick question over here?';
|
|
470
|
-
module.interjectionMetadata = { channelId: 'discord:dm:antra', tags: ['chat:addressed'] };
|
|
471
|
-
trigger(framework);
|
|
472
|
-
await framework.runUntilIdle();
|
|
473
|
-
const cm = framework.agents.get('assistant').getContextManager();
|
|
474
|
-
const receipts = cm.getAllMessages()
|
|
475
|
-
.flatMap((m) => m.content)
|
|
476
|
-
.filter((b) => b.type === 'text')
|
|
477
|
-
.map((b) => b.text ?? '')
|
|
478
|
-
.filter((t) => t.startsWith('[delivered]'));
|
|
479
|
-
assert.deepEqual(receipts, ['[delivered] plain speech → chan-live-1 · discord:dm:antra']);
|
|
480
|
-
await framework.stop();
|
|
481
|
-
});
|
|
482
|
-
it('suppressed prose is visible in the receipt (silencing is never a silent black hole)', async () => {
|
|
483
|
-
// n=8 (2026-07-31 ~22:46): one round multiplexing two threads — prose
|
|
484
|
-
// for the lane + an explicit send for another channel, textbook per the
|
|
485
|
-
// routing doc. Sticky silencing ate the prose reply and nothing told
|
|
486
|
-
// the author; their own record believed it delivered. The rule stands
|
|
487
|
-
// (antra: visibility is enough) — but the turn-end receipt now reports
|
|
488
|
-
// the suppression, so the segment's fate is visible one turn later.
|
|
489
|
-
membrane.pushResponse(createMockResponse([
|
|
490
|
-
{ type: 'text', text: 'the reply that silencing will eat' },
|
|
491
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--send_message', input: { text: 'explicit send to the other thread' } },
|
|
492
|
-
], 'tool_use'));
|
|
493
|
-
membrane.pushResponse(createMockResponse([
|
|
494
|
-
{ type: 'text', text: 'trailing prose, also suppressed (sticky)' },
|
|
495
|
-
]));
|
|
496
|
-
const framework = await createFramework();
|
|
497
|
-
const routed = stubChannelRegistry(framework);
|
|
498
|
-
trigger(framework);
|
|
499
|
-
await framework.runUntilIdle();
|
|
500
|
-
assert.deepEqual(routed, [], 'silencing semantics unchanged: nothing auto-routed');
|
|
501
|
-
const cm = framework.agents.get('assistant').getContextManager();
|
|
502
|
-
const receipts = cm.getAllMessages()
|
|
503
|
-
.flatMap((m) => m.content)
|
|
504
|
-
.filter((b) => b.type === 'text')
|
|
505
|
-
.map((b) => b.text ?? '')
|
|
506
|
-
.filter((t) => t.startsWith('[delivered]'));
|
|
507
|
-
assert.deepEqual(receipts, [
|
|
508
|
-
'[delivered] nothing — 2 plain-speech segment(s) suppressed (explicit send in the same round — resend with a send tool if it was meant to be heard)',
|
|
509
|
-
]);
|
|
510
|
-
await framework.stop();
|
|
511
|
-
});
|
|
512
|
-
for (const verb of ['say', 'whisper']) {
|
|
513
|
-
it(`world \`${verb}\` silences adjacent auto-routed prose in locus mode (no double-publish)`, async () => {
|
|
514
|
-
// 2026-09-01 (Cairn, locus mode): a round of ordinary text + explicit
|
|
515
|
-
// world `say` published TWICE — seq 15146 was the say text, seq 15147
|
|
516
|
-
// the adjacent prose auto-routed to the same world locus, byte-for-byte.
|
|
517
|
-
// World publication verbs silenced only in hybrid mode; Discord sends
|
|
518
|
-
// silenced everywhere. An explicit world utterance is the resident's
|
|
519
|
-
// chosen speech for the round in every mode.
|
|
520
|
-
const input = verb === 'say'
|
|
521
|
-
? { text: 'the intended utterance' }
|
|
522
|
-
: { to: 'sill', text: 'the intended utterance' };
|
|
523
|
-
membrane.pushResponse(createMockResponse([
|
|
524
|
-
{ type: 'text', text: 'adjacent prose that must NOT auto-publish' },
|
|
525
|
-
{ type: 'tool_use', id: 'c1', name: `robot--${verb}`, input },
|
|
526
|
-
], 'tool_use'));
|
|
527
|
-
membrane.pushResponse(createMockResponse([
|
|
528
|
-
{ type: 'text', text: 'trailing prose, also suppressed (sticky)' },
|
|
529
|
-
]));
|
|
530
|
-
const framework = await createFramework();
|
|
531
|
-
const routed = stubChannelRegistry(framework);
|
|
532
|
-
trigger(framework);
|
|
533
|
-
await framework.runUntilIdle();
|
|
534
|
-
assert.deepEqual(routed, [], `${verb}: nothing auto-routed beside the explicit world utterance`);
|
|
535
|
-
const cm = framework.agents.get('assistant').getContextManager();
|
|
536
|
-
const receipts = cm.getAllMessages()
|
|
537
|
-
.flatMap((m) => m.content)
|
|
538
|
-
.filter((b) => b.type === 'text')
|
|
539
|
-
.map((b) => b.text ?? '')
|
|
540
|
-
.filter((t) => t.startsWith('[delivered]'));
|
|
541
|
-
assert.deepEqual(receipts, [
|
|
542
|
-
'[delivered] nothing — 2 plain-speech segment(s) suppressed (explicit send in the same round — resend with a send tool if it was meant to be heard)',
|
|
543
|
-
], `${verb}: suppression is visible in the receipt`);
|
|
544
|
-
await framework.stop();
|
|
545
|
-
});
|
|
546
|
-
}
|
|
547
|
-
it('a non-publishing world tool (move) does not silence — speak-while-acting unchanged', async () => {
|
|
548
|
-
// Negative control for the world-verb silencing: only publication verbs
|
|
549
|
-
// silence. Ordinary acting tools still narrate live to the locus.
|
|
550
|
-
membrane.pushResponse(createMockResponse([
|
|
551
|
-
{ type: 'text', text: 'walking over' },
|
|
552
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
553
|
-
], 'tool_use'));
|
|
554
|
-
membrane.pushResponse(createMockResponse([
|
|
555
|
-
{ type: 'text', text: 'there' },
|
|
556
|
-
]));
|
|
557
|
-
const framework = await createFramework();
|
|
558
|
-
const routed = stubChannelRegistry(framework);
|
|
559
|
-
trigger(framework);
|
|
560
|
-
await framework.runUntilIdle();
|
|
561
|
-
assert.deepEqual(routed.map((r) => r.text), ['walking over', 'there']);
|
|
562
|
-
await framework.stop();
|
|
563
|
-
});
|
|
564
|
-
it('channel_open moves the pin mid-turn and announces in its own tool result', async () => {
|
|
565
|
-
// The agent's own deliberate open is the strongest "my next words go
|
|
566
|
-
// here" signal — stronger than any injection. The original 2026-07-21
|
|
567
|
-
// Aria fix only set next-turn trigger state; the turn-frozen refactor
|
|
568
|
-
// silently regressed the reply-right-after-opening case. Now the pin
|
|
569
|
-
// moves immediately and the announcement rides the tool result itself
|
|
570
|
-
// (model-requested content: distance zero, safest role).
|
|
571
|
-
membrane.pushResponse(createMockResponse([
|
|
572
|
-
{ type: 'tool_use', id: 'c1', name: 'channel_open', input: { channelId: 'discord:guild:observatory' } },
|
|
573
|
-
], 'tool_use'));
|
|
574
|
-
membrane.pushResponse(createMockResponse([
|
|
575
|
-
{ type: 'text', text: 'Hello, observatory.' },
|
|
576
|
-
]));
|
|
577
|
-
const framework = await createFramework();
|
|
578
|
-
const routed = stubChannelRegistry(framework);
|
|
579
|
-
const registry = framework.channelRegistry;
|
|
580
|
-
registry.handleChannelToolCall =
|
|
581
|
-
async () => ({ success: true, data: { channelId: 'discord:guild:observatory', opened: true } });
|
|
582
|
-
trigger(framework);
|
|
583
|
-
await framework.runUntilIdle();
|
|
584
|
-
assert.deepEqual(routed, [
|
|
585
|
-
{ text: 'Hello, observatory.', locus: 'discord:guild:observatory' },
|
|
586
|
-
], 'prose right after channel_open lands in the opened channel');
|
|
587
|
-
// The announcement rode the tool result the model saw.
|
|
588
|
-
const results = membrane.lastStream.receivedToolResults.flat();
|
|
589
|
-
assert.ok(JSON.stringify(results).includes('plain speech now lands in this channel'), 'routing note present in the channel_open tool result');
|
|
590
|
-
await framework.stop();
|
|
591
|
-
});
|
|
592
|
-
it('reactions and system markers injected mid-turn do not clear send suppression', async () => {
|
|
593
|
-
// A reaction (`chat:reaction` tag) or a `system: true` marker is not
|
|
594
|
-
// conversational input: prose following an explicit send stays suppressed,
|
|
595
|
-
// so a stray reaction can't make the agent double-post a "sent it"
|
|
596
|
-
// postscript — and (with the frozen locus) can't move routing either.
|
|
597
|
-
membrane.pushResponse(createMockResponse([
|
|
598
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--send_message', input: { text: 'reply to room4' } },
|
|
599
|
-
], 'tool_use'));
|
|
600
|
-
membrane.pushResponse(createMockResponse([
|
|
601
|
-
{ type: 'text', text: 'Sent it.' },
|
|
602
|
-
]));
|
|
603
|
-
const framework = await createFramework();
|
|
604
|
-
const routed = stubChannelRegistry(framework);
|
|
605
|
-
module.interjection = '[reaction] @someone reacted 👍';
|
|
606
|
-
module.interjectionChannelId = null;
|
|
607
|
-
module.interjectionMetadata = { channelId: '999888777', tags: ['chat:reaction'] };
|
|
608
|
-
trigger(framework);
|
|
609
|
-
await framework.runUntilIdle();
|
|
610
|
-
assert.deepEqual(routed, [], 'post-send prose stayed suppressed after a reaction');
|
|
611
|
-
await framework.stop();
|
|
612
|
-
});
|
|
613
|
-
it('text-only turns route to the turn-frozen locus, not a live re-resolution', async () => {
|
|
614
|
-
// The text-only dispatch runs after the agent is idle; a live resolution
|
|
615
|
-
// there can read the NEXT turn's trigger state or a post-restart cleared
|
|
616
|
-
// one (2026-07-22 Sol DM misroute). The stub increments its locus per
|
|
617
|
-
// resolveLocus() call: the turn-start freeze consumes chan-live-1, so a
|
|
618
|
-
// live re-resolution at dispatch would return chan-live-2. The frozen
|
|
619
|
-
// path must deliver to chan-live-1.
|
|
620
|
-
membrane.pushResponse(createMockResponse([
|
|
621
|
-
{ type: 'text', text: 'A quiet reply with no tools.' },
|
|
622
|
-
]));
|
|
623
|
-
const framework = await createFramework();
|
|
624
|
-
const routed = stubChannelRegistry(framework);
|
|
625
|
-
trigger(framework);
|
|
626
|
-
await framework.runUntilIdle();
|
|
627
|
-
assert.deepEqual(routed, [
|
|
628
|
-
{ text: 'A quiet reply with no tools.', locus: 'chan-live-1' },
|
|
629
|
-
]);
|
|
630
|
-
await framework.stop();
|
|
631
|
-
});
|
|
632
|
-
it('announces the outbound locus in the window only when it changes', async () => {
|
|
633
|
-
// Turn 1 (locus chan-live-1, e2e): one durable [routing] notice — the
|
|
634
|
-
// boot baseline. Then the announce-on-change logic directly (MockMembrane
|
|
635
|
-
// supports one turn per test): same locus → silence (steady state must
|
|
636
|
-
// not chatter — KV); new locus → exactly one more notice.
|
|
637
|
-
membrane.pushResponse(createMockResponse([{ type: 'text', text: 'one' }]));
|
|
638
|
-
const framework = await createFramework();
|
|
639
|
-
stubChannelRegistry(framework);
|
|
640
|
-
const notices = [];
|
|
641
|
-
framework.onTrace((event) => {
|
|
642
|
-
const e = event;
|
|
643
|
-
if (e.type === 'message:added' && e.source === 'routing-notice') {
|
|
644
|
-
notices.push(e.source);
|
|
645
|
-
}
|
|
646
|
-
});
|
|
647
|
-
trigger(framework);
|
|
648
|
-
await framework.runUntilIdle();
|
|
649
|
-
assert.equal(notices.length, 1, 'first turn announced the boot-baseline locus');
|
|
650
|
-
const announce = framework.announceLocusIfChanged.bind(framework);
|
|
651
|
-
announce('assistant', 'chan-live-1');
|
|
652
|
-
assert.equal(notices.length, 1, 'unchanged locus announced nothing');
|
|
653
|
-
announce('assistant', 'chan-B');
|
|
654
|
-
assert.equal(notices.length, 2, 'changed locus announced exactly once');
|
|
655
|
-
announce('assistant', 'chan-B');
|
|
656
|
-
assert.equal(notices.length, 2, 'steady state on the new locus stays silent');
|
|
657
|
-
announce('assistant', null);
|
|
658
|
-
assert.equal(notices.length, 3, 'losing the locus is announced too');
|
|
659
|
-
await framework.stop();
|
|
660
|
-
});
|
|
661
|
-
// -------------------------------------------------------------------------
|
|
662
|
-
// Hear-while-acting
|
|
663
|
-
// -------------------------------------------------------------------------
|
|
664
|
-
it('injects a mid-turn message into the resumed stream at the tool boundary', async () => {
|
|
665
|
-
membrane.pushResponse(createMockResponse([
|
|
666
|
-
{ type: 'text', text: 'Moving.' },
|
|
667
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
668
|
-
], 'tool_use'));
|
|
669
|
-
membrane.pushResponse(createMockResponse([
|
|
670
|
-
{ type: 'text', text: 'Heard you!' },
|
|
671
|
-
]));
|
|
672
|
-
const framework = await createFramework();
|
|
673
|
-
module.interjection = 'look left!';
|
|
674
|
-
trigger(framework);
|
|
675
|
-
await framework.runUntilIdle();
|
|
676
|
-
const stream = membrane.lastStream;
|
|
677
|
-
assert.equal(stream.receivedToolResults.length, 1);
|
|
678
|
-
const options = stream.receivedToolResultOptions[0];
|
|
679
|
-
assert.ok(options?.injectedMessages, 'tool-result resume carried injected messages');
|
|
680
|
-
assert.equal(options.injectedMessages.length, 1);
|
|
681
|
-
const injected = options.injectedMessages[0];
|
|
682
|
-
assert.equal(injected.participant, 'Antra');
|
|
683
|
-
const text = injected.content
|
|
684
|
-
.filter((b) => b.type === 'text')
|
|
685
|
-
.map((b) => b.text)
|
|
686
|
-
.join('\n');
|
|
687
|
-
assert.equal(text, 'look left!');
|
|
688
|
-
await framework.stop();
|
|
689
|
-
});
|
|
690
|
-
it('passes no injection options when nothing arrived mid-turn', async () => {
|
|
691
|
-
membrane.pushResponse(createMockResponse([
|
|
692
|
-
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
693
|
-
], 'tool_use'));
|
|
694
|
-
membrane.pushResponse(createMockResponse([
|
|
695
|
-
{ type: 'text', text: 'done' },
|
|
696
|
-
]));
|
|
697
|
-
const framework = await createFramework();
|
|
698
|
-
trigger(framework);
|
|
699
|
-
await framework.runUntilIdle();
|
|
700
|
-
const stream = membrane.lastStream;
|
|
701
|
-
assert.equal(stream.receivedToolResults.length, 1);
|
|
702
|
-
assert.equal(stream.receivedToolResultOptions[0], undefined);
|
|
703
|
-
await framework.stop();
|
|
704
|
-
});
|
|
705
|
-
});
|
|
706
|
-
//# sourceMappingURL=present-while-acting.test.js.map
|