@animalabs/agent-framework 0.22.2 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -4
- package/dist/src/agent.d.ts +108 -17
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +207 -67
- package/dist/src/agent.js.map +1 -1
- package/dist/src/api/mcp-server-core.js +1 -1
- package/dist/src/api/mcp-server-core.js.map +1 -1
- package/dist/src/api/server.d.ts.map +1 -1
- package/dist/src/api/server.js +5 -1
- package/dist/src/api/server.js.map +1 -1
- package/dist/src/api/types.d.ts +1 -1
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/branch-names.d.ts +14 -0
- package/dist/src/branch-names.d.ts.map +1 -0
- package/dist/src/branch-names.js +22 -0
- package/dist/src/branch-names.js.map +1 -0
- package/dist/src/closest-names.d.ts +28 -0
- package/dist/src/closest-names.d.ts.map +1 -0
- package/dist/src/closest-names.js +98 -0
- package/dist/src/closest-names.js.map +1 -0
- package/dist/src/code-execution/index.d.ts +1 -1
- package/dist/src/code-execution/index.d.ts.map +1 -1
- package/dist/src/code-execution/index.js.map +1 -1
- package/dist/src/code-execution/py-runner.d.ts +50 -7
- package/dist/src/code-execution/py-runner.d.ts.map +1 -1
- package/dist/src/code-execution/py-runner.js +258 -90
- package/dist/src/code-execution/py-runner.js.map +1 -1
- package/dist/src/code-execution/runtime-py.d.ts +3 -2
- package/dist/src/code-execution/runtime-py.d.ts.map +1 -1
- package/dist/src/code-execution/runtime-py.js +94 -8
- package/dist/src/code-execution/runtime-py.js.map +1 -1
- package/dist/src/code-execution/tool-definition.d.ts +17 -1
- package/dist/src/code-execution/tool-definition.d.ts.map +1 -1
- package/dist/src/code-execution/tool-definition.js +72 -6
- package/dist/src/code-execution/tool-definition.js.map +1 -1
- package/dist/src/config-checks.d.ts +28 -0
- package/dist/src/config-checks.d.ts.map +1 -0
- package/dist/src/config-checks.js +56 -0
- package/dist/src/config-checks.js.map +1 -0
- package/dist/src/deadline-timer.d.ts +21 -0
- package/dist/src/deadline-timer.d.ts.map +1 -0
- package/dist/src/deadline-timer.js +43 -0
- package/dist/src/deadline-timer.js.map +1 -0
- package/dist/src/error-message.d.ts +30 -0
- package/dist/src/error-message.d.ts.map +1 -0
- package/dist/src/error-message.js +50 -0
- package/dist/src/error-message.js.map +1 -0
- package/dist/src/framework.d.ts +1529 -165
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +8264 -1939
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +8 -0
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +36 -5
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/held-writes.d.ts +16 -0
- package/dist/src/held-writes.d.ts.map +1 -0
- package/dist/src/held-writes.js +56 -0
- package/dist/src/held-writes.js.map +1 -0
- package/dist/src/index.d.ts +10 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +11 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/capability-grant.d.ts +4 -0
- package/dist/src/mcpl/capability-grant.d.ts.map +1 -1
- package/dist/src/mcpl/capability-grant.js +1 -1
- package/dist/src/mcpl/capability-grant.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +233 -18
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +975 -386
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/checkpoint-manager.d.ts +21 -1
- package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -1
- package/dist/src/mcpl/checkpoint-manager.js +91 -30
- package/dist/src/mcpl/checkpoint-manager.js.map +1 -1
- package/dist/src/mcpl/conversation-router.d.ts +19 -3
- package/dist/src/mcpl/conversation-router.d.ts.map +1 -1
- package/dist/src/mcpl/conversation-router.js +23 -8
- package/dist/src/mcpl/conversation-router.js.map +1 -1
- package/dist/src/mcpl/convert-block.d.ts +20 -0
- package/dist/src/mcpl/convert-block.d.ts.map +1 -0
- package/dist/src/mcpl/convert-block.js +88 -0
- package/dist/src/mcpl/convert-block.js.map +1 -0
- package/dist/src/mcpl/errors.d.ts +13 -0
- package/dist/src/mcpl/errors.d.ts.map +1 -1
- package/dist/src/mcpl/errors.js +28 -0
- package/dist/src/mcpl/errors.js.map +1 -1
- package/dist/src/mcpl/hook-orchestrator.d.ts +23 -0
- package/dist/src/mcpl/hook-orchestrator.d.ts.map +1 -1
- package/dist/src/mcpl/hook-orchestrator.js +83 -72
- package/dist/src/mcpl/hook-orchestrator.js.map +1 -1
- package/dist/src/mcpl/inbound-source.d.ts +114 -0
- package/dist/src/mcpl/inbound-source.d.ts.map +1 -0
- package/dist/src/mcpl/inbound-source.js +83 -0
- package/dist/src/mcpl/inbound-source.js.map +1 -0
- package/dist/src/mcpl/index.d.ts +7 -1
- package/dist/src/mcpl/index.d.ts.map +1 -1
- package/dist/src/mcpl/index.js +5 -1
- package/dist/src/mcpl/index.js.map +1 -1
- package/dist/src/mcpl/inference-router.d.ts +19 -13
- package/dist/src/mcpl/inference-router.d.ts.map +1 -1
- package/dist/src/mcpl/inference-router.js +155 -87
- package/dist/src/mcpl/inference-router.js.map +1 -1
- package/dist/src/mcpl/log-value.d.ts +7 -0
- package/dist/src/mcpl/log-value.d.ts.map +1 -1
- package/dist/src/mcpl/log-value.js +9 -0
- package/dist/src/mcpl/log-value.js.map +1 -1
- package/dist/src/mcpl/modern-connection.d.ts +227 -0
- package/dist/src/mcpl/modern-connection.d.ts.map +1 -0
- package/dist/src/mcpl/modern-connection.js +1088 -0
- package/dist/src/mcpl/modern-connection.js.map +1 -0
- package/dist/src/mcpl/prefix-rule.d.ts +18 -0
- package/dist/src/mcpl/prefix-rule.d.ts.map +1 -0
- package/dist/src/mcpl/prefix-rule.js +25 -0
- package/dist/src/mcpl/prefix-rule.js.map +1 -0
- package/dist/src/mcpl/protocol-family.d.ts +179 -0
- package/dist/src/mcpl/protocol-family.d.ts.map +1 -0
- package/dist/src/mcpl/protocol-family.js +697 -0
- package/dist/src/mcpl/protocol-family.js.map +1 -0
- package/dist/src/mcpl/push-coalescer.d.ts +58 -17
- package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
- package/dist/src/mcpl/push-coalescer.js +93 -32
- package/dist/src/mcpl/push-coalescer.js.map +1 -1
- package/dist/src/mcpl/push-handler.d.ts +16 -9
- package/dist/src/mcpl/push-handler.d.ts.map +1 -1
- package/dist/src/mcpl/push-handler.js +18 -83
- package/dist/src/mcpl/push-handler.js.map +1 -1
- package/dist/src/mcpl/reference-fetcher.d.ts +76 -13
- package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
- package/dist/src/mcpl/reference-fetcher.js +275 -66
- package/dist/src/mcpl/reference-fetcher.js.map +1 -1
- package/dist/src/mcpl/references.d.ts +98 -18
- package/dist/src/mcpl/references.d.ts.map +1 -1
- package/dist/src/mcpl/references.js +170 -32
- package/dist/src/mcpl/references.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +406 -31
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +1331 -272
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/mcpl/server-registry.d.ts +35 -6
- package/dist/src/mcpl/server-registry.d.ts.map +1 -1
- package/dist/src/mcpl/server-registry.js +63 -13
- package/dist/src/mcpl/server-registry.js.map +1 -1
- package/dist/src/mcpl/skip-reply-wake.d.ts +36 -0
- package/dist/src/mcpl/skip-reply-wake.d.ts.map +1 -0
- package/dist/src/mcpl/skip-reply-wake.js +55 -0
- package/dist/src/mcpl/skip-reply-wake.js.map +1 -0
- package/dist/src/mcpl/tool-result-normalize.d.ts +54 -0
- package/dist/src/mcpl/tool-result-normalize.d.ts.map +1 -0
- package/dist/src/mcpl/tool-result-normalize.js +232 -0
- package/dist/src/mcpl/tool-result-normalize.js.map +1 -0
- package/dist/src/mcpl/transport.d.ts +104 -12
- package/dist/src/mcpl/transport.d.ts.map +1 -1
- package/dist/src/mcpl/transport.js +315 -85
- package/dist/src/mcpl/transport.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +76 -19
- package/dist/src/mcpl/types.d.ts.map +1 -1
- package/dist/src/mcpl/types.js.map +1 -1
- package/dist/src/mcpl/visible-content.d.ts +16 -0
- package/dist/src/mcpl/visible-content.d.ts.map +1 -1
- package/dist/src/mcpl/visible-content.js +26 -0
- package/dist/src/mcpl/visible-content.js.map +1 -1
- package/dist/src/module-registry.d.ts +34 -6
- package/dist/src/module-registry.d.ts.map +1 -1
- package/dist/src/module-registry.js +119 -31
- package/dist/src/module-registry.js.map +1 -1
- package/dist/src/modules/api/index.d.ts +1 -1
- package/dist/src/modules/api/index.d.ts.map +1 -1
- package/dist/src/modules/api/index.js +3 -2
- package/dist/src/modules/api/index.js.map +1 -1
- package/dist/src/modules/discord/discord-js-client.d.ts +43 -2
- package/dist/src/modules/discord/discord-js-client.d.ts.map +1 -1
- package/dist/src/modules/discord/discord-js-client.js +286 -67
- package/dist/src/modules/discord/discord-js-client.js.map +1 -1
- package/dist/src/modules/discord/index.d.ts +53 -5
- package/dist/src/modules/discord/index.d.ts.map +1 -1
- package/dist/src/modules/discord/index.js +712 -186
- package/dist/src/modules/discord/index.js.map +1 -1
- package/dist/src/modules/discord/refusal.d.ts +14 -0
- package/dist/src/modules/discord/refusal.d.ts.map +1 -0
- package/dist/src/modules/discord/refusal.js +14 -0
- package/dist/src/modules/discord/refusal.js.map +1 -0
- package/dist/src/modules/discord/types.d.ts +27 -4
- package/dist/src/modules/discord/types.d.ts.map +1 -1
- package/dist/src/modules/health/index.d.ts.map +1 -1
- package/dist/src/modules/health/index.js +8 -3
- package/dist/src/modules/health/index.js.map +1 -1
- package/dist/src/modules/history/index.d.ts +3 -1
- package/dist/src/modules/history/index.d.ts.map +1 -1
- package/dist/src/modules/history/index.js +359 -127
- package/dist/src/modules/history/index.js.map +1 -1
- package/dist/src/modules/history/semantic.d.ts +28 -1
- package/dist/src/modules/history/semantic.d.ts.map +1 -1
- package/dist/src/modules/history/semantic.js +177 -32
- package/dist/src/modules/history/semantic.js.map +1 -1
- package/dist/src/modules/index.d.ts +1 -1
- package/dist/src/modules/index.d.ts.map +1 -1
- package/dist/src/modules/index.js +1 -1
- package/dist/src/modules/index.js.map +1 -1
- package/dist/src/modules/unknown-tool.d.ts +10 -0
- package/dist/src/modules/unknown-tool.d.ts.map +1 -0
- package/dist/src/modules/unknown-tool.js +17 -0
- package/dist/src/modules/unknown-tool.js.map +1 -0
- package/dist/src/modules/workspace/disk-agreement.d.ts +57 -4
- package/dist/src/modules/workspace/disk-agreement.d.ts.map +1 -1
- package/dist/src/modules/workspace/disk-agreement.js +75 -7
- package/dist/src/modules/workspace/disk-agreement.js.map +1 -1
- package/dist/src/modules/workspace/effects.d.ts +66 -7
- package/dist/src/modules/workspace/effects.d.ts.map +1 -1
- package/dist/src/modules/workspace/effects.js +303 -46
- package/dist/src/modules/workspace/effects.js.map +1 -1
- package/dist/src/modules/workspace/index.d.ts +313 -45
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +1404 -304
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/observe.d.ts +315 -16
- package/dist/src/modules/workspace/observe.d.ts.map +1 -1
- package/dist/src/modules/workspace/observe.js +727 -37
- package/dist/src/modules/workspace/observe.js.map +1 -1
- package/dist/src/modules/workspace/reconcile.d.ts +58 -7
- package/dist/src/modules/workspace/reconcile.d.ts.map +1 -1
- package/dist/src/modules/workspace/reconcile.js +521 -56
- package/dist/src/modules/workspace/reconcile.js.map +1 -1
- package/dist/src/modules/workspace/types.d.ts +28 -5
- package/dist/src/modules/workspace/types.d.ts.map +1 -1
- package/dist/src/modules/workspace/types.js.map +1 -1
- package/dist/src/modules/workspace/watcher.d.ts +49 -2
- package/dist/src/modules/workspace/watcher.d.ts.map +1 -1
- package/dist/src/modules/workspace/watcher.js +158 -29
- package/dist/src/modules/workspace/watcher.js.map +1 -1
- package/dist/src/prose-drafts.d.ts +240 -0
- package/dist/src/prose-drafts.d.ts.map +1 -0
- package/dist/src/prose-drafts.js +362 -0
- package/dist/src/prose-drafts.js.map +1 -0
- package/dist/src/prose-segments.d.ts +21 -2
- package/dist/src/prose-segments.d.ts.map +1 -1
- package/dist/src/prose-segments.js +46 -9
- package/dist/src/prose-segments.js.map +1 -1
- package/dist/src/recovery/offline-branch.d.ts +1 -0
- package/dist/src/recovery/offline-branch.d.ts.map +1 -1
- package/dist/src/recovery/offline-branch.js +3 -1
- package/dist/src/recovery/offline-branch.js.map +1 -1
- package/dist/src/safe-slice.d.ts +5 -1
- package/dist/src/safe-slice.d.ts.map +1 -1
- package/dist/src/safe-slice.js +9 -1
- package/dist/src/safe-slice.js.map +1 -1
- package/dist/src/silent-heartbeat.d.ts +112 -39
- package/dist/src/silent-heartbeat.d.ts.map +1 -1
- package/dist/src/silent-heartbeat.js +100 -29
- package/dist/src/silent-heartbeat.js.map +1 -1
- package/dist/src/tool-args.d.ts +40 -0
- package/dist/src/tool-args.d.ts.map +1 -0
- package/dist/src/tool-args.js +207 -0
- package/dist/src/tool-args.js.map +1 -0
- package/dist/src/tool-image-ledger.d.ts +87 -19
- package/dist/src/tool-image-ledger.d.ts.map +1 -1
- package/dist/src/tool-image-ledger.js +135 -32
- package/dist/src/tool-image-ledger.js.map +1 -1
- package/dist/src/tool-presentation.d.ts +9 -0
- package/dist/src/tool-presentation.d.ts.map +1 -1
- package/dist/src/tool-presentation.js +266 -62
- package/dist/src/tool-presentation.js.map +1 -1
- package/dist/src/tool-result-guard.d.ts.map +1 -1
- package/dist/src/tool-result-guard.js +7 -10
- package/dist/src/tool-result-guard.js.map +1 -1
- package/dist/src/tool-result-history.d.ts +32 -3
- package/dist/src/tool-result-history.d.ts.map +1 -1
- package/dist/src/tool-result-history.js +106 -19
- package/dist/src/tool-result-history.js.map +1 -1
- package/dist/src/tune-out/coordinator.d.ts +25 -1
- package/dist/src/tune-out/coordinator.d.ts.map +1 -1
- package/dist/src/tune-out/coordinator.js +260 -65
- package/dist/src/tune-out/coordinator.js.map +1 -1
- package/dist/src/types/agent.d.ts +44 -22
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/events.d.ts +25 -0
- package/dist/src/types/events.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +38 -7
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/inference-log.d.ts +1 -1
- package/dist/src/types/inference-log.d.ts.map +1 -1
- package/dist/src/types/module.d.ts +77 -14
- package/dist/src/types/module.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +97 -8
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/src/usage/usage-tracker.d.ts +5 -0
- package/dist/src/usage/usage-tracker.d.ts.map +1 -1
- package/dist/src/usage/usage-tracker.js +35 -8
- package/dist/src/usage/usage-tracker.js.map +1 -1
- package/package.json +5 -4
- package/src/agent.ts +257 -72
- package/src/api/mcp-server-core.ts +1 -1
- package/src/api/server.ts +4 -1
- package/src/api/types.ts +1 -1
- package/src/branch-names.ts +19 -0
- package/src/closest-names.ts +94 -0
- package/src/code-execution/index.ts +1 -0
- package/src/code-execution/py-runner.ts +304 -93
- package/src/code-execution/runtime-py.ts +94 -8
- package/src/code-execution/tool-definition.ts +85 -7
- package/src/config-checks.ts +50 -0
- package/src/deadline-timer.ts +44 -0
- package/src/error-message.ts +48 -0
- package/src/framework.ts +8625 -1984
- package/src/gate/event-gate.ts +38 -5
- package/src/held-writes.ts +59 -0
- package/src/index.ts +29 -5
- package/src/mcpl/capability-grant.ts +1 -1
- package/src/mcpl/channel-registry.ts +1095 -411
- package/src/mcpl/checkpoint-manager.ts +104 -29
- package/src/mcpl/conversation-router.ts +28 -8
- package/src/mcpl/convert-block.ts +105 -0
- package/src/mcpl/errors.ts +28 -0
- package/src/mcpl/hook-orchestrator.ts +84 -77
- package/src/mcpl/inbound-source.ts +156 -0
- package/src/mcpl/index.ts +23 -1
- package/src/mcpl/inference-router.ts +179 -103
- package/src/mcpl/log-value.ts +10 -0
- package/src/mcpl/modern-connection.ts +1182 -0
- package/src/mcpl/prefix-rule.ts +32 -0
- package/src/mcpl/protocol-family.ts +691 -0
- package/src/mcpl/push-coalescer.ts +110 -36
- package/src/mcpl/push-handler.ts +20 -90
- package/src/mcpl/reference-fetcher.ts +318 -67
- package/src/mcpl/references.ts +183 -34
- package/src/mcpl/server-connection.ts +1404 -280
- package/src/mcpl/server-registry.ts +63 -14
- package/src/mcpl/skip-reply-wake.ts +73 -0
- package/src/mcpl/tool-result-normalize.ts +294 -0
- package/src/mcpl/transport.ts +320 -76
- package/src/mcpl/types.ts +77 -19
- package/src/mcpl/visible-content.ts +28 -0
- package/src/module-registry.ts +126 -36
- package/src/modules/api/index.ts +3 -2
- package/src/modules/discord/discord-js-client.ts +306 -74
- package/src/modules/discord/index.ts +737 -201
- package/src/modules/discord/refusal.ts +13 -0
- package/src/modules/discord/types.ts +27 -6
- package/src/modules/health/index.ts +8 -3
- package/src/modules/history/index.ts +410 -120
- package/src/modules/history/semantic.ts +189 -32
- package/src/modules/index.ts +1 -1
- package/src/modules/unknown-tool.ts +16 -0
- package/src/modules/workspace/disk-agreement.ts +97 -8
- package/src/modules/workspace/effects.ts +291 -36
- package/src/modules/workspace/index.ts +1469 -321
- package/src/modules/workspace/observe.ts +784 -41
- package/src/modules/workspace/reconcile.ts +619 -64
- package/src/modules/workspace/types.ts +28 -5
- package/src/modules/workspace/watcher.ts +154 -30
- package/src/prose-drafts.ts +481 -0
- package/src/prose-segments.ts +51 -8
- package/src/recovery/offline-branch.ts +4 -1
- package/src/safe-slice.ts +9 -1
- package/src/silent-heartbeat.ts +184 -59
- package/src/tool-args.ts +213 -0
- package/src/tool-image-ledger.ts +153 -34
- package/src/tool-presentation.ts +233 -42
- package/src/tool-result-guard.ts +7 -8
- package/src/tool-result-history.ts +124 -20
- package/src/tune-out/coordinator.ts +259 -65
- package/src/types/agent.ts +44 -24
- package/src/types/events.ts +25 -0
- package/src/types/framework.ts +38 -7
- package/src/types/inference-log.ts +1 -1
- package/src/types/module.ts +79 -14
- package/src/types/trace.ts +103 -8
- package/src/usage/usage-tracker.ts +32 -8
- package/dist/test/activation-request-sanitize.test.d.ts +0 -2
- package/dist/test/activation-request-sanitize.test.d.ts.map +0 -1
- package/dist/test/activation-request-sanitize.test.js +0 -89
- package/dist/test/activation-request-sanitize.test.js.map +0 -1
- package/dist/test/agent-cache-ttl.test.d.ts +0 -2
- package/dist/test/agent-cache-ttl.test.d.ts.map +0 -1
- package/dist/test/agent-cache-ttl.test.js +0 -41
- package/dist/test/agent-cache-ttl.test.js.map +0 -1
- package/dist/test/agent-runtime-settings.test.d.ts +0 -2
- package/dist/test/agent-runtime-settings.test.d.ts.map +0 -1
- package/dist/test/agent-runtime-settings.test.js +0 -1598
- package/dist/test/agent-runtime-settings.test.js.map +0 -1
- package/dist/test/api-admin-gate.test.d.ts +0 -2
- package/dist/test/api-admin-gate.test.d.ts.map +0 -1
- package/dist/test/api-admin-gate.test.js +0 -116
- package/dist/test/api-admin-gate.test.js.map +0 -1
- package/dist/test/assistant-persist-refusal.test.d.ts +0 -2
- package/dist/test/assistant-persist-refusal.test.d.ts.map +0 -1
- package/dist/test/assistant-persist-refusal.test.js +0 -63
- package/dist/test/assistant-persist-refusal.test.js.map +0 -1
- package/dist/test/batched-wake-locus.test.d.ts +0 -2
- package/dist/test/batched-wake-locus.test.d.ts.map +0 -1
- package/dist/test/batched-wake-locus.test.js +0 -166
- package/dist/test/batched-wake-locus.test.js.map +0 -1
- package/dist/test/busy-agent-scheduler.test.d.ts +0 -2
- package/dist/test/busy-agent-scheduler.test.d.ts.map +0 -1
- package/dist/test/busy-agent-scheduler.test.js +0 -92
- package/dist/test/busy-agent-scheduler.test.js.map +0 -1
- package/dist/test/channel-incoming-targeting.test.d.ts +0 -2
- package/dist/test/channel-incoming-targeting.test.d.ts.map +0 -1
- package/dist/test/channel-incoming-targeting.test.js +0 -81
- package/dist/test/channel-incoming-targeting.test.js.map +0 -1
- package/dist/test/channel-label-history.test.d.ts +0 -2
- package/dist/test/channel-label-history.test.d.ts.map +0 -1
- package/dist/test/channel-label-history.test.js +0 -424
- package/dist/test/channel-label-history.test.js.map +0 -1
- package/dist/test/channel-lifecycle-provenance.test.d.ts +0 -2
- package/dist/test/channel-lifecycle-provenance.test.d.ts.map +0 -1
- package/dist/test/channel-lifecycle-provenance.test.js +0 -47
- package/dist/test/channel-lifecycle-provenance.test.js.map +0 -1
- package/dist/test/channel-registry-routing.test.d.ts +0 -2
- package/dist/test/channel-registry-routing.test.d.ts.map +0 -1
- package/dist/test/channel-registry-routing.test.js +0 -446
- package/dist/test/channel-registry-routing.test.js.map +0 -1
- package/dist/test/channel-registry-typing.test.d.ts +0 -2
- package/dist/test/channel-registry-typing.test.d.ts.map +0 -1
- package/dist/test/channel-registry-typing.test.js +0 -91
- package/dist/test/channel-registry-typing.test.js.map +0 -1
- package/dist/test/channels-changed-respond-first.test.d.ts +0 -2
- package/dist/test/channels-changed-respond-first.test.d.ts.map +0 -1
- package/dist/test/channels-changed-respond-first.test.js +0 -74
- package/dist/test/channels-changed-respond-first.test.js.map +0 -1
- package/dist/test/checkpoint-attribution.test.d.ts +0 -2
- package/dist/test/checkpoint-attribution.test.d.ts.map +0 -1
- package/dist/test/checkpoint-attribution.test.js +0 -200
- package/dist/test/checkpoint-attribution.test.js.map +0 -1
- package/dist/test/code-execution.test.d.ts +0 -11
- package/dist/test/code-execution.test.d.ts.map +0 -1
- package/dist/test/code-execution.test.js +0 -1272
- package/dist/test/code-execution.test.js.map +0 -1
- package/dist/test/component-defaults.test.d.ts +0 -2
- package/dist/test/component-defaults.test.d.ts.map +0 -1
- package/dist/test/component-defaults.test.js +0 -54
- package/dist/test/component-defaults.test.js.map +0 -1
- package/dist/test/conversation-fork-injection-scoping.test.d.ts +0 -2
- package/dist/test/conversation-fork-injection-scoping.test.d.ts.map +0 -1
- package/dist/test/conversation-fork-injection-scoping.test.js +0 -200
- package/dist/test/conversation-fork-injection-scoping.test.js.map +0 -1
- package/dist/test/conversation-router.test.d.ts +0 -2
- package/dist/test/conversation-router.test.d.ts.map +0 -1
- package/dist/test/conversation-router.test.js +0 -174
- package/dist/test/conversation-router.test.js.map +0 -1
- package/dist/test/conversation-routing.test.d.ts +0 -7
- package/dist/test/conversation-routing.test.d.ts.map +0 -1
- package/dist/test/conversation-routing.test.js +0 -621
- package/dist/test/conversation-routing.test.js.map +0 -1
- package/dist/test/deferred-wake-integrity.test.d.ts +0 -29
- package/dist/test/deferred-wake-integrity.test.d.ts.map +0 -1
- package/dist/test/deferred-wake-integrity.test.js +0 -320
- package/dist/test/deferred-wake-integrity.test.js.map +0 -1
- package/dist/test/discord-awareness-outbox.test.d.ts +0 -2
- package/dist/test/discord-awareness-outbox.test.d.ts.map +0 -1
- package/dist/test/discord-awareness-outbox.test.js +0 -371
- package/dist/test/discord-awareness-outbox.test.js.map +0 -1
- package/dist/test/discord-history-delete-window.test.d.ts +0 -2
- package/dist/test/discord-history-delete-window.test.d.ts.map +0 -1
- package/dist/test/discord-history-delete-window.test.js +0 -81
- package/dist/test/discord-history-delete-window.test.js.map +0 -1
- package/dist/test/discord-history-sync.test.d.ts +0 -2
- package/dist/test/discord-history-sync.test.d.ts.map +0 -1
- package/dist/test/discord-history-sync.test.js +0 -56
- package/dist/test/discord-history-sync.test.js.map +0 -1
- package/dist/test/discord-typing-keepalive.test.d.ts +0 -2
- package/dist/test/discord-typing-keepalive.test.d.ts.map +0 -1
- package/dist/test/discord-typing-keepalive.test.js +0 -77
- package/dist/test/discord-typing-keepalive.test.js.map +0 -1
- package/dist/test/ephemeral-settle.test.d.ts +0 -2
- package/dist/test/ephemeral-settle.test.d.ts.map +0 -1
- package/dist/test/ephemeral-settle.test.js +0 -354
- package/dist/test/ephemeral-settle.test.js.map +0 -1
- package/dist/test/event-gate-passthrough.test.d.ts +0 -15
- package/dist/test/event-gate-passthrough.test.d.ts.map +0 -1
- package/dist/test/event-gate-passthrough.test.js +0 -289
- package/dist/test/event-gate-passthrough.test.js.map +0 -1
- package/dist/test/event-gate-policy-mutation.test.d.ts +0 -2
- package/dist/test/event-gate-policy-mutation.test.d.ts.map +0 -1
- package/dist/test/event-gate-policy-mutation.test.js +0 -137
- package/dist/test/event-gate-policy-mutation.test.js.map +0 -1
- package/dist/test/event-gate-rate-limit.test.d.ts +0 -2
- package/dist/test/event-gate-rate-limit.test.d.ts.map +0 -1
- package/dist/test/event-gate-rate-limit.test.js +0 -627
- package/dist/test/event-gate-rate-limit.test.js.map +0 -1
- package/dist/test/event-gate-script.test.d.ts +0 -2
- package/dist/test/event-gate-script.test.d.ts.map +0 -1
- package/dist/test/event-gate-script.test.js +0 -95
- package/dist/test/event-gate-script.test.js.map +0 -1
- package/dist/test/event-gate-selfwake.test.d.ts +0 -15
- package/dist/test/event-gate-selfwake.test.d.ts.map +0 -1
- package/dist/test/event-gate-selfwake.test.js +0 -125
- package/dist/test/event-gate-selfwake.test.js.map +0 -1
- package/dist/test/event-gate-tags.test.d.ts +0 -2
- package/dist/test/event-gate-tags.test.d.ts.map +0 -1
- package/dist/test/event-gate-tags.test.js +0 -76
- package/dist/test/event-gate-tags.test.js.map +0 -1
- package/dist/test/event-gate.test.d.ts +0 -2
- package/dist/test/event-gate.test.d.ts.map +0 -1
- package/dist/test/event-gate.test.js +0 -919
- package/dist/test/event-gate.test.js.map +0 -1
- package/dist/test/explicit-prose-routing.test.d.ts +0 -11
- package/dist/test/explicit-prose-routing.test.d.ts.map +0 -1
- package/dist/test/explicit-prose-routing.test.js +0 -1715
- package/dist/test/explicit-prose-routing.test.js.map +0 -1
- package/dist/test/framework.test.d.ts +0 -5
- package/dist/test/framework.test.d.ts.map +0 -1
- package/dist/test/framework.test.js +0 -1048
- package/dist/test/framework.test.js.map +0 -1
- package/dist/test/gather-context-timeout.test.d.ts +0 -2
- package/dist/test/gather-context-timeout.test.d.ts.map +0 -1
- package/dist/test/gather-context-timeout.test.js +0 -120
- package/dist/test/gather-context-timeout.test.js.map +0 -1
- package/dist/test/health-snapshot.test.d.ts +0 -2
- package/dist/test/health-snapshot.test.d.ts.map +0 -1
- package/dist/test/health-snapshot.test.js +0 -74
- package/dist/test/health-snapshot.test.js.map +0 -1
- package/dist/test/helpers/coalescing-fixture.d.ts +0 -74
- package/dist/test/helpers/coalescing-fixture.d.ts.map +0 -1
- package/dist/test/helpers/coalescing-fixture.js +0 -152
- package/dist/test/helpers/coalescing-fixture.js.map +0 -1
- package/dist/test/helpers/coalescing-kill-child.d.ts +0 -2
- package/dist/test/helpers/coalescing-kill-child.d.ts.map +0 -1
- package/dist/test/helpers/coalescing-kill-child.js +0 -24
- package/dist/test/helpers/coalescing-kill-child.js.map +0 -1
- package/dist/test/helpers/mock-membrane.d.ts +0 -53
- package/dist/test/helpers/mock-membrane.d.ts.map +0 -1
- package/dist/test/helpers/mock-membrane.js +0 -168
- package/dist/test/helpers/mock-membrane.js.map +0 -1
- package/dist/test/helpers/pytc-stop-rows.d.ts +0 -11
- package/dist/test/helpers/pytc-stop-rows.d.ts.map +0 -1
- package/dist/test/helpers/pytc-stop-rows.js +0 -143
- package/dist/test/helpers/pytc-stop-rows.js.map +0 -1
- package/dist/test/helpers/quiesce-crash-child.d.ts +0 -2
- package/dist/test/helpers/quiesce-crash-child.d.ts.map +0 -1
- package/dist/test/helpers/quiesce-crash-child.js +0 -156
- package/dist/test/helpers/quiesce-crash-child.js.map +0 -1
- package/dist/test/hide-then-turn.test.d.ts +0 -2
- package/dist/test/hide-then-turn.test.d.ts.map +0 -1
- package/dist/test/hide-then-turn.test.js +0 -101
- package/dist/test/hide-then-turn.test.js.map +0 -1
- package/dist/test/history-module-overview.test.d.ts +0 -2
- package/dist/test/history-module-overview.test.d.ts.map +0 -1
- package/dist/test/history-module-overview.test.js +0 -711
- package/dist/test/history-module-overview.test.js.map +0 -1
- package/dist/test/history-module-realstore.test.d.ts +0 -2
- package/dist/test/history-module-realstore.test.d.ts.map +0 -1
- package/dist/test/history-module-realstore.test.js +0 -363
- package/dist/test/history-module-realstore.test.js.map +0 -1
- package/dist/test/history-module-semantic.test.d.ts +0 -2
- package/dist/test/history-module-semantic.test.d.ts.map +0 -1
- package/dist/test/history-module-semantic.test.js +0 -213
- package/dist/test/history-module-semantic.test.js.map +0 -1
- package/dist/test/history-module-ux.test.d.ts +0 -2
- package/dist/test/history-module-ux.test.d.ts.map +0 -1
- package/dist/test/history-module-ux.test.js +0 -304
- package/dist/test/history-module-ux.test.js.map +0 -1
- package/dist/test/history-module.test.d.ts +0 -2
- package/dist/test/history-module.test.d.ts.map +0 -1
- package/dist/test/history-module.test.js +0 -619
- package/dist/test/history-module.test.js.map +0 -1
- package/dist/test/history-semantic-review-findings.test.d.ts +0 -2
- package/dist/test/history-semantic-review-findings.test.d.ts.map +0 -1
- package/dist/test/history-semantic-review-findings.test.js +0 -338
- package/dist/test/history-semantic-review-findings.test.js.map +0 -1
- package/dist/test/history-semantic-sync-converges.test.d.ts +0 -2
- package/dist/test/history-semantic-sync-converges.test.d.ts.map +0 -1
- package/dist/test/history-semantic-sync-converges.test.js +0 -109
- package/dist/test/history-semantic-sync-converges.test.js.map +0 -1
- package/dist/test/host-quiesce.test.d.ts +0 -2
- package/dist/test/host-quiesce.test.d.ts.map +0 -1
- package/dist/test/host-quiesce.test.js +0 -988
- package/dist/test/host-quiesce.test.js.map +0 -1
- package/dist/test/inference-exhaustion-rewind.test.d.ts +0 -2
- package/dist/test/inference-exhaustion-rewind.test.d.ts.map +0 -1
- package/dist/test/inference-exhaustion-rewind.test.js +0 -387
- package/dist/test/inference-exhaustion-rewind.test.js.map +0 -1
- package/dist/test/inference-failure-bounds.test.d.ts +0 -2
- package/dist/test/inference-failure-bounds.test.d.ts.map +0 -1
- package/dist/test/inference-failure-bounds.test.js +0 -1202
- package/dist/test/inference-failure-bounds.test.js.map +0 -1
- package/dist/test/inference-failure-observability.test.d.ts +0 -2
- package/dist/test/inference-failure-observability.test.d.ts.map +0 -1
- package/dist/test/inference-failure-observability.test.js +0 -84
- package/dist/test/inference-failure-observability.test.js.map +0 -1
- package/dist/test/journal-tool.test.d.ts +0 -2
- package/dist/test/journal-tool.test.d.ts.map +0 -1
- package/dist/test/journal-tool.test.js +0 -33
- package/dist/test/journal-tool.test.js.map +0 -1
- package/dist/test/kv-unified-open-flight-retry.test.d.ts +0 -2
- package/dist/test/kv-unified-open-flight-retry.test.d.ts.map +0 -1
- package/dist/test/kv-unified-open-flight-retry.test.js +0 -189
- package/dist/test/kv-unified-open-flight-retry.test.js.map +0 -1
- package/dist/test/kv-unified-wiring.test.d.ts +0 -2
- package/dist/test/kv-unified-wiring.test.d.ts.map +0 -1
- package/dist/test/kv-unified-wiring.test.js +0 -95
- package/dist/test/kv-unified-wiring.test.js.map +0 -1
- package/dist/test/late-events-after-stop.test.d.ts +0 -2
- package/dist/test/late-events-after-stop.test.d.ts.map +0 -1
- package/dist/test/late-events-after-stop.test.js +0 -122
- package/dist/test/late-events-after-stop.test.js.map +0 -1
- package/dist/test/liveness-watchdog.test.d.ts +0 -2
- package/dist/test/liveness-watchdog.test.d.ts.map +0 -1
- package/dist/test/liveness-watchdog.test.js +0 -94
- package/dist/test/liveness-watchdog.test.js.map +0 -1
- package/dist/test/machine-close-provenance.test.d.ts +0 -2
- package/dist/test/machine-close-provenance.test.d.ts.map +0 -1
- package/dist/test/machine-close-provenance.test.js +0 -116
- package/dist/test/machine-close-provenance.test.js.map +0 -1
- package/dist/test/maintenance-timer.test.d.ts +0 -2
- package/dist/test/maintenance-timer.test.d.ts.map +0 -1
- package/dist/test/maintenance-timer.test.js +0 -1827
- package/dist/test/maintenance-timer.test.js.map +0 -1
- package/dist/test/mcp-server-bin.test.d.ts +0 -2
- package/dist/test/mcp-server-bin.test.d.ts.map +0 -1
- package/dist/test/mcp-server-bin.test.js +0 -142
- package/dist/test/mcp-server-bin.test.js.map +0 -1
- package/dist/test/mcpl-access-provider.test.d.ts +0 -2
- package/dist/test/mcpl-access-provider.test.d.ts.map +0 -1
- package/dist/test/mcpl-access-provider.test.js +0 -20
- package/dist/test/mcpl-access-provider.test.js.map +0 -1
- package/dist/test/mcpl-awareness-barrier.test.d.ts +0 -2
- package/dist/test/mcpl-awareness-barrier.test.d.ts.map +0 -1
- package/dist/test/mcpl-awareness-barrier.test.js +0 -769
- package/dist/test/mcpl-awareness-barrier.test.js.map +0 -1
- package/dist/test/mcpl-capability-grant.test.d.ts +0 -10
- package/dist/test/mcpl-capability-grant.test.d.ts.map +0 -1
- package/dist/test/mcpl-capability-grant.test.js +0 -111
- package/dist/test/mcpl-capability-grant.test.js.map +0 -1
- package/dist/test/mcpl-capability-scoping.test.d.ts +0 -2
- package/dist/test/mcpl-capability-scoping.test.d.ts.map +0 -1
- package/dist/test/mcpl-capability-scoping.test.js +0 -266
- package/dist/test/mcpl-capability-scoping.test.js.map +0 -1
- package/dist/test/mcpl-child-env.test.d.ts +0 -2
- package/dist/test/mcpl-child-env.test.d.ts.map +0 -1
- package/dist/test/mcpl-child-env.test.js +0 -158
- package/dist/test/mcpl-child-env.test.js.map +0 -1
- package/dist/test/mcpl-coalesced-content-parity.test.d.ts +0 -2
- package/dist/test/mcpl-coalesced-content-parity.test.d.ts.map +0 -1
- package/dist/test/mcpl-coalesced-content-parity.test.js +0 -532
- package/dist/test/mcpl-coalesced-content-parity.test.js.map +0 -1
- package/dist/test/mcpl-coalescing.test.d.ts +0 -2
- package/dist/test/mcpl-coalescing.test.d.ts.map +0 -1
- package/dist/test/mcpl-coalescing.test.js +0 -1125
- package/dist/test/mcpl-coalescing.test.js.map +0 -1
- package/dist/test/mcpl-config-diagnostics.test.d.ts +0 -2
- package/dist/test/mcpl-config-diagnostics.test.d.ts.map +0 -1
- package/dist/test/mcpl-config-diagnostics.test.js +0 -452
- package/dist/test/mcpl-config-diagnostics.test.js.map +0 -1
- package/dist/test/mcpl-empty-content.test.d.ts +0 -2
- package/dist/test/mcpl-empty-content.test.d.ts.map +0 -1
- package/dist/test/mcpl-empty-content.test.js +0 -368
- package/dist/test/mcpl-empty-content.test.js.map +0 -1
- package/dist/test/mcpl-gate-roundtrip.test.d.ts +0 -2
- package/dist/test/mcpl-gate-roundtrip.test.d.ts.map +0 -1
- package/dist/test/mcpl-gate-roundtrip.test.js +0 -285
- package/dist/test/mcpl-gate-roundtrip.test.js.map +0 -1
- package/dist/test/mcpl-list-status.test.d.ts +0 -2
- package/dist/test/mcpl-list-status.test.d.ts.map +0 -1
- package/dist/test/mcpl-list-status.test.js +0 -82
- package/dist/test/mcpl-list-status.test.js.map +0 -1
- package/dist/test/mcpl-manifest-changed.test.d.ts +0 -2
- package/dist/test/mcpl-manifest-changed.test.d.ts.map +0 -1
- package/dist/test/mcpl-manifest-changed.test.js +0 -178
- package/dist/test/mcpl-manifest-changed.test.js.map +0 -1
- package/dist/test/mcpl-push-convert.test.d.ts +0 -2
- package/dist/test/mcpl-push-convert.test.d.ts.map +0 -1
- package/dist/test/mcpl-push-convert.test.js +0 -42
- package/dist/test/mcpl-push-convert.test.js.map +0 -1
- package/dist/test/mcpl-reconnect-events.test.d.ts +0 -2
- package/dist/test/mcpl-reconnect-events.test.d.ts.map +0 -1
- package/dist/test/mcpl-reconnect-events.test.js +0 -144
- package/dist/test/mcpl-reconnect-events.test.js.map +0 -1
- package/dist/test/mcpl-reconnect-reregistration.test.d.ts +0 -2
- package/dist/test/mcpl-reconnect-reregistration.test.d.ts.map +0 -1
- package/dist/test/mcpl-reconnect-reregistration.test.js +0 -238
- package/dist/test/mcpl-reconnect-reregistration.test.js.map +0 -1
- package/dist/test/mcpl-reference-fetcher.test.d.ts +0 -2
- package/dist/test/mcpl-reference-fetcher.test.d.ts.map +0 -1
- package/dist/test/mcpl-reference-fetcher.test.js +0 -427
- package/dist/test/mcpl-reference-fetcher.test.js.map +0 -1
- package/dist/test/mcpl-reference-fields.test.d.ts +0 -2
- package/dist/test/mcpl-reference-fields.test.d.ts.map +0 -1
- package/dist/test/mcpl-reference-fields.test.js +0 -149
- package/dist/test/mcpl-reference-fields.test.js.map +0 -1
- package/dist/test/mcpl-rejection-log-lines.test.d.ts +0 -2
- package/dist/test/mcpl-rejection-log-lines.test.d.ts.map +0 -1
- package/dist/test/mcpl-rejection-log-lines.test.js +0 -349
- package/dist/test/mcpl-rejection-log-lines.test.js.map +0 -1
- package/dist/test/mcpl-request-timeout.test.d.ts +0 -2
- package/dist/test/mcpl-request-timeout.test.d.ts.map +0 -1
- package/dist/test/mcpl-request-timeout.test.js +0 -138
- package/dist/test/mcpl-request-timeout.test.js.map +0 -1
- package/dist/test/mcpl-runtime-lifecycle.test.d.ts +0 -7
- package/dist/test/mcpl-runtime-lifecycle.test.d.ts.map +0 -1
- package/dist/test/mcpl-runtime-lifecycle.test.js +0 -142
- package/dist/test/mcpl-runtime-lifecycle.test.js.map +0 -1
- package/dist/test/mcpl-stderr-tail.test.d.ts +0 -2
- package/dist/test/mcpl-stderr-tail.test.d.ts.map +0 -1
- package/dist/test/mcpl-stderr-tail.test.js +0 -210
- package/dist/test/mcpl-stderr-tail.test.js.map +0 -1
- package/dist/test/mcpl-tool-class-listing.test.d.ts +0 -2
- package/dist/test/mcpl-tool-class-listing.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-class-listing.test.js +0 -147
- package/dist/test/mcpl-tool-class-listing.test.js.map +0 -1
- package/dist/test/mcpl-tool-classes.test.d.ts +0 -7
- package/dist/test/mcpl-tool-classes.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-classes.test.js +0 -80
- package/dist/test/mcpl-tool-classes.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts +0 -2
- package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-e2e.test.js +0 -237
- package/dist/test/mcpl-tool-lifecycle-e2e.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts +0 -11
- package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-emitter.test.js +0 -412
- package/dist/test/mcpl-tool-lifecycle-emitter.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-script.test.d.ts +0 -2
- package/dist/test/mcpl-tool-lifecycle-script.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-script.test.js +0 -288
- package/dist/test/mcpl-tool-lifecycle-script.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle.test.d.ts +0 -11
- package/dist/test/mcpl-tool-lifecycle.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle.test.js +0 -270
- package/dist/test/mcpl-tool-lifecycle.test.js.map +0 -1
- package/dist/test/mcpl-transport-close.test.d.ts +0 -2
- package/dist/test/mcpl-transport-close.test.d.ts.map +0 -1
- package/dist/test/mcpl-transport-close.test.js +0 -373
- package/dist/test/mcpl-transport-close.test.js.map +0 -1
- package/dist/test/mcpl-transport-spawn.test.d.ts +0 -2
- package/dist/test/mcpl-transport-spawn.test.d.ts.map +0 -1
- package/dist/test/mcpl-transport-spawn.test.js +0 -58
- package/dist/test/mcpl-transport-spawn.test.js.map +0 -1
- package/dist/test/mcpl-ws-transport.test.d.ts +0 -2
- package/dist/test/mcpl-ws-transport.test.d.ts.map +0 -1
- package/dist/test/mcpl-ws-transport.test.js +0 -259
- package/dist/test/mcpl-ws-transport.test.js.map +0 -1
- package/dist/test/module-context-integration.test.d.ts +0 -18
- package/dist/test/module-context-integration.test.d.ts.map +0 -1
- package/dist/test/module-context-integration.test.js +0 -181
- package/dist/test/module-context-integration.test.js.map +0 -1
- package/dist/test/offline-recovery-branch.test.d.ts +0 -2
- package/dist/test/offline-recovery-branch.test.d.ts.map +0 -1
- package/dist/test/offline-recovery-branch.test.js +0 -570
- package/dist/test/offline-recovery-branch.test.js.map +0 -1
- package/dist/test/operator-surgery.test.d.ts +0 -2
- package/dist/test/operator-surgery.test.d.ts.map +0 -1
- package/dist/test/operator-surgery.test.js +0 -595
- package/dist/test/operator-surgery.test.js.map +0 -1
- package/dist/test/ops-alert.test.d.ts +0 -2
- package/dist/test/ops-alert.test.d.ts.map +0 -1
- package/dist/test/ops-alert.test.js +0 -153
- package/dist/test/ops-alert.test.js.map +0 -1
- package/dist/test/overbudget-drain-breaker.test.d.ts +0 -2
- package/dist/test/overbudget-drain-breaker.test.d.ts.map +0 -1
- package/dist/test/overbudget-drain-breaker.test.js +0 -198
- package/dist/test/overbudget-drain-breaker.test.js.map +0 -1
- package/dist/test/pack-installs-alone.test.d.ts +0 -2
- package/dist/test/pack-installs-alone.test.d.ts.map +0 -1
- package/dist/test/pack-installs-alone.test.js +0 -284
- package/dist/test/pack-installs-alone.test.js.map +0 -1
- package/dist/test/per-agent-delivery.test.d.ts +0 -2
- package/dist/test/per-agent-delivery.test.d.ts.map +0 -1
- package/dist/test/per-agent-delivery.test.js +0 -108
- package/dist/test/per-agent-delivery.test.js.map +0 -1
- package/dist/test/physical-window-restart.test.d.ts +0 -16
- package/dist/test/physical-window-restart.test.d.ts.map +0 -1
- package/dist/test/physical-window-restart.test.js +0 -487
- package/dist/test/physical-window-restart.test.js.map +0 -1
- package/dist/test/placed-reaction-baseline.test.d.ts +0 -2
- package/dist/test/placed-reaction-baseline.test.d.ts.map +0 -1
- package/dist/test/placed-reaction-baseline.test.js +0 -312
- package/dist/test/placed-reaction-baseline.test.js.map +0 -1
- package/dist/test/present-while-acting.test.d.ts +0 -19
- package/dist/test/present-while-acting.test.d.ts.map +0 -1
- package/dist/test/present-while-acting.test.js +0 -1649
- package/dist/test/present-while-acting.test.js.map +0 -1
- package/dist/test/prose-segments.test.d.ts +0 -2
- package/dist/test/prose-segments.test.d.ts.map +0 -1
- package/dist/test/prose-segments.test.js +0 -52
- package/dist/test/prose-segments.test.js.map +0 -1
- package/dist/test/prose-stream-router.test.d.ts +0 -2
- package/dist/test/prose-stream-router.test.d.ts.map +0 -1
- package/dist/test/prose-stream-router.test.js +0 -171
- package/dist/test/prose-stream-router.test.js.map +0 -1
- package/dist/test/provider-acceleration-cooldown.test.d.ts +0 -2
- package/dist/test/provider-acceleration-cooldown.test.d.ts.map +0 -1
- package/dist/test/provider-acceleration-cooldown.test.js +0 -435
- package/dist/test/provider-acceleration-cooldown.test.js.map +0 -1
- package/dist/test/provider-waits.test.d.ts +0 -2
- package/dist/test/provider-waits.test.d.ts.map +0 -1
- package/dist/test/provider-waits.test.js +0 -2259
- package/dist/test/provider-waits.test.js.map +0 -1
- package/dist/test/puppet-tool-call.test.d.ts +0 -2
- package/dist/test/puppet-tool-call.test.d.ts.map +0 -1
- package/dist/test/puppet-tool-call.test.js +0 -226
- package/dist/test/puppet-tool-call.test.js.map +0 -1
- package/dist/test/puppet-turn-reservation.test.d.ts +0 -2
- package/dist/test/puppet-turn-reservation.test.d.ts.map +0 -1
- package/dist/test/puppet-turn-reservation.test.js +0 -139
- package/dist/test/puppet-turn-reservation.test.js.map +0 -1
- package/dist/test/reaction-baseline-platform.test.d.ts +0 -2
- package/dist/test/reaction-baseline-platform.test.d.ts.map +0 -1
- package/dist/test/reaction-baseline-platform.test.js +0 -124
- package/dist/test/reaction-baseline-platform.test.js.map +0 -1
- package/dist/test/record-journal.test.d.ts +0 -6
- package/dist/test/record-journal.test.d.ts.map +0 -1
- package/dist/test/record-journal.test.js +0 -269
- package/dist/test/record-journal.test.js.map +0 -1
- package/dist/test/refusal-reaction-baseline.test.d.ts +0 -2
- package/dist/test/refusal-reaction-baseline.test.d.ts.map +0 -1
- package/dist/test/refusal-reaction-baseline.test.js +0 -81
- package/dist/test/refusal-reaction-baseline.test.js.map +0 -1
- package/dist/test/refusal-rewind.test.d.ts +0 -2
- package/dist/test/refusal-rewind.test.d.ts.map +0 -1
- package/dist/test/refusal-rewind.test.js +0 -117
- package/dist/test/refusal-rewind.test.js.map +0 -1
- package/dist/test/refusal-single-call.test.d.ts +0 -2
- package/dist/test/refusal-single-call.test.d.ts.map +0 -1
- package/dist/test/refusal-single-call.test.js +0 -177
- package/dist/test/refusal-single-call.test.js.map +0 -1
- package/dist/test/release-bump.test.d.ts +0 -2
- package/dist/test/release-bump.test.d.ts.map +0 -1
- package/dist/test/release-bump.test.js +0 -248
- package/dist/test/release-bump.test.js.map +0 -1
- package/dist/test/release-changelog.test.d.ts +0 -2
- package/dist/test/release-changelog.test.d.ts.map +0 -1
- package/dist/test/release-changelog.test.js +0 -159
- package/dist/test/release-changelog.test.js.map +0 -1
- package/dist/test/release-holds.test.d.ts +0 -2
- package/dist/test/release-holds.test.d.ts.map +0 -1
- package/dist/test/release-holds.test.js +0 -456
- package/dist/test/release-holds.test.js.map +0 -1
- package/dist/test/same-round-think-policy.test.d.ts +0 -2
- package/dist/test/same-round-think-policy.test.d.ts.map +0 -1
- package/dist/test/same-round-think-policy.test.js +0 -853
- package/dist/test/same-round-think-policy.test.js.map +0 -1
- package/dist/test/save-recent-image.test.d.ts +0 -26
- package/dist/test/save-recent-image.test.d.ts.map +0 -1
- package/dist/test/save-recent-image.test.js +0 -974
- package/dist/test/save-recent-image.test.js.map +0 -1
- package/dist/test/shutdown-errors.test.d.ts +0 -2
- package/dist/test/shutdown-errors.test.d.ts.map +0 -1
- package/dist/test/shutdown-errors.test.js +0 -662
- package/dist/test/shutdown-errors.test.js.map +0 -1
- package/dist/test/silent-heartbeat-rows.test.d.ts +0 -2
- package/dist/test/silent-heartbeat-rows.test.d.ts.map +0 -1
- package/dist/test/silent-heartbeat-rows.test.js +0 -451
- package/dist/test/silent-heartbeat-rows.test.js.map +0 -1
- package/dist/test/silent-heartbeat.test.d.ts +0 -2
- package/dist/test/silent-heartbeat.test.d.ts.map +0 -1
- package/dist/test/silent-heartbeat.test.js +0 -165
- package/dist/test/silent-heartbeat.test.js.map +0 -1
- package/dist/test/state-scaling-e2e.test.d.ts +0 -22
- package/dist/test/state-scaling-e2e.test.d.ts.map +0 -1
- package/dist/test/state-scaling-e2e.test.js +0 -206
- package/dist/test/state-scaling-e2e.test.js.map +0 -1
- package/dist/test/state-scaling.test.d.ts +0 -12
- package/dist/test/state-scaling.test.d.ts.map +0 -1
- package/dist/test/state-scaling.test.js +0 -251
- package/dist/test/state-scaling.test.js.map +0 -1
- package/dist/test/stop-with-host-operations.test.d.ts +0 -20
- package/dist/test/stop-with-host-operations.test.d.ts.map +0 -1
- package/dist/test/stop-with-host-operations.test.js +0 -1174
- package/dist/test/stop-with-host-operations.test.js.map +0 -1
- package/dist/test/stop-with-work-in-flight.test.d.ts +0 -23
- package/dist/test/stop-with-work-in-flight.test.d.ts.map +0 -1
- package/dist/test/stop-with-work-in-flight.test.js +0 -784
- package/dist/test/stop-with-work-in-flight.test.js.map +0 -1
- package/dist/test/surgery-marks-receipt.test.d.ts +0 -2
- package/dist/test/surgery-marks-receipt.test.d.ts.map +0 -1
- package/dist/test/surgery-marks-receipt.test.js +0 -540
- package/dist/test/surgery-marks-receipt.test.js.map +0 -1
- package/dist/test/thinking-token-stamp.test.d.ts +0 -12
- package/dist/test/thinking-token-stamp.test.d.ts.map +0 -1
- package/dist/test/thinking-token-stamp.test.js +0 -129
- package/dist/test/thinking-token-stamp.test.js.map +0 -1
- package/dist/test/timezone.test.d.ts +0 -2
- package/dist/test/timezone.test.d.ts.map +0 -1
- package/dist/test/timezone.test.js +0 -18
- package/dist/test/timezone.test.js.map +0 -1
- package/dist/test/tool-batch-hook.test.d.ts +0 -8
- package/dist/test/tool-batch-hook.test.d.ts.map +0 -1
- package/dist/test/tool-batch-hook.test.js +0 -275
- package/dist/test/tool-batch-hook.test.js.map +0 -1
- package/dist/test/tool-policy.test.d.ts +0 -2
- package/dist/test/tool-policy.test.d.ts.map +0 -1
- package/dist/test/tool-policy.test.js +0 -51
- package/dist/test/tool-policy.test.js.map +0 -1
- package/dist/test/tool-presentation.test.d.ts +0 -2
- package/dist/test/tool-presentation.test.d.ts.map +0 -1
- package/dist/test/tool-presentation.test.js +0 -268
- package/dist/test/tool-presentation.test.js.map +0 -1
- package/dist/test/tool-result-content.test.d.ts +0 -2
- package/dist/test/tool-result-content.test.d.ts.map +0 -1
- package/dist/test/tool-result-content.test.js +0 -37
- package/dist/test/tool-result-content.test.js.map +0 -1
- package/dist/test/tool-result-guard.test.d.ts +0 -2
- package/dist/test/tool-result-guard.test.d.ts.map +0 -1
- package/dist/test/tool-result-guard.test.js +0 -3729
- package/dist/test/tool-result-guard.test.js.map +0 -1
- package/dist/test/tool-result-history.test.d.ts +0 -7
- package/dist/test/tool-result-history.test.d.ts.map +0 -1
- package/dist/test/tool-result-history.test.js +0 -156
- package/dist/test/tool-result-history.test.js.map +0 -1
- package/dist/test/tool-result-spill.test.d.ts +0 -13
- package/dist/test/tool-result-spill.test.d.ts.map +0 -1
- package/dist/test/tool-result-spill.test.js +0 -586
- package/dist/test/tool-result-spill.test.js.map +0 -1
- package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts +0 -2
- package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts.map +0 -1
- package/dist/test/tool-wrapper-prose-guard-integration.test.js +0 -485
- package/dist/test/tool-wrapper-prose-guard-integration.test.js.map +0 -1
- package/dist/test/tool-wrapper-prose-guard.test.d.ts +0 -2
- package/dist/test/tool-wrapper-prose-guard.test.d.ts.map +0 -1
- package/dist/test/tool-wrapper-prose-guard.test.js +0 -34
- package/dist/test/tool-wrapper-prose-guard.test.js.map +0 -1
- package/dist/test/tools-observe-parser-conformance.test.d.ts +0 -2
- package/dist/test/tools-observe-parser-conformance.test.d.ts.map +0 -1
- package/dist/test/tools-observe-parser-conformance.test.js +0 -129
- package/dist/test/tools-observe-parser-conformance.test.js.map +0 -1
- package/dist/test/trunk-channel-routing.test.d.ts +0 -19
- package/dist/test/trunk-channel-routing.test.d.ts.map +0 -1
- package/dist/test/trunk-channel-routing.test.js +0 -652
- package/dist/test/trunk-channel-routing.test.js.map +0 -1
- package/dist/test/tune-out-e2e.test.d.ts +0 -2
- package/dist/test/tune-out-e2e.test.d.ts.map +0 -1
- package/dist/test/tune-out-e2e.test.js +0 -142
- package/dist/test/tune-out-e2e.test.js.map +0 -1
- package/dist/test/tune-out-gate-composition.test.d.ts +0 -2
- package/dist/test/tune-out-gate-composition.test.d.ts.map +0 -1
- package/dist/test/tune-out-gate-composition.test.js +0 -221
- package/dist/test/tune-out-gate-composition.test.js.map +0 -1
- package/dist/test/tune-out-lifecycle.test.d.ts +0 -2
- package/dist/test/tune-out-lifecycle.test.d.ts.map +0 -1
- package/dist/test/tune-out-lifecycle.test.js +0 -121
- package/dist/test/tune-out-lifecycle.test.js.map +0 -1
- package/dist/test/turn-trigger-provenance.test.d.ts +0 -2
- package/dist/test/turn-trigger-provenance.test.d.ts.map +0 -1
- package/dist/test/turn-trigger-provenance.test.js +0 -137
- package/dist/test/turn-trigger-provenance.test.js.map +0 -1
- package/dist/test/unconvertible-tool-result.test.d.ts +0 -2
- package/dist/test/unconvertible-tool-result.test.d.ts.map +0 -1
- package/dist/test/unconvertible-tool-result.test.js +0 -358
- package/dist/test/unconvertible-tool-result.test.js.map +0 -1
- package/dist/test/unsent-compiles.test.d.ts +0 -2
- package/dist/test/unsent-compiles.test.d.ts.map +0 -1
- package/dist/test/unsent-compiles.test.js +0 -139
- package/dist/test/unsent-compiles.test.js.map +0 -1
- package/dist/test/usage-accounting.test.d.ts +0 -2
- package/dist/test/usage-accounting.test.d.ts.map +0 -1
- package/dist/test/usage-accounting.test.js +0 -13
- package/dist/test/usage-accounting.test.js.map +0 -1
- package/dist/test/usage-tracker.test.d.ts +0 -2
- package/dist/test/usage-tracker.test.d.ts.map +0 -1
- package/dist/test/usage-tracker.test.js +0 -129
- package/dist/test/usage-tracker.test.js.map +0 -1
- package/dist/test/utils-surface.test.d.ts +0 -2
- package/dist/test/utils-surface.test.d.ts.map +0 -1
- package/dist/test/utils-surface.test.js +0 -145
- package/dist/test/utils-surface.test.js.map +0 -1
- package/dist/test/workspace-branch-continuation.test.d.ts +0 -15
- package/dist/test/workspace-branch-continuation.test.d.ts.map +0 -1
- package/dist/test/workspace-branch-continuation.test.js +0 -183
- package/dist/test/workspace-branch-continuation.test.js.map +0 -1
- package/dist/test/workspace-materialize-freshness.test.d.ts +0 -16
- package/dist/test/workspace-materialize-freshness.test.d.ts.map +0 -1
- package/dist/test/workspace-materialize-freshness.test.js +0 -252
- package/dist/test/workspace-materialize-freshness.test.js.map +0 -1
- package/dist/test/workspace-path-containment.test.d.ts +0 -19
- package/dist/test/workspace-path-containment.test.d.ts.map +0 -1
- package/dist/test/workspace-path-containment.test.js +0 -91
- package/dist/test/workspace-path-containment.test.js.map +0 -1
- package/dist/test/workspace-read-file-from-disk.test.d.ts +0 -17
- package/dist/test/workspace-read-file-from-disk.test.d.ts.map +0 -1
- package/dist/test/workspace-read-file-from-disk.test.js +0 -174
- package/dist/test/workspace-read-file-from-disk.test.js.map +0 -1
- package/dist/test/workspace-read-image.test.d.ts +0 -2
- package/dist/test/workspace-read-image.test.d.ts.map +0 -1
- package/dist/test/workspace-read-image.test.js +0 -597
- package/dist/test/workspace-read-image.test.js.map +0 -1
- package/dist/test/workspace-read-text.test.d.ts +0 -2
- package/dist/test/workspace-read-text.test.d.ts.map +0 -1
- package/dist/test/workspace-read-text.test.js +0 -101
- package/dist/test/workspace-read-text.test.js.map +0 -1
- package/dist/test/workspace-restore-order.test.d.ts +0 -16
- package/dist/test/workspace-restore-order.test.d.ts.map +0 -1
- package/dist/test/workspace-restore-order.test.js +0 -140
- package/dist/test/workspace-restore-order.test.js.map +0 -1
- package/dist/test/workspace-three-way.test.d.ts +0 -12
- package/dist/test/workspace-three-way.test.d.ts.map +0 -1
- package/dist/test/workspace-three-way.test.js +0 -4094
- package/dist/test/workspace-three-way.test.js.map +0 -1
- package/dist/test/workspace-watcher.test.d.ts +0 -2
- package/dist/test/workspace-watcher.test.d.ts.map +0 -1
- package/dist/test/workspace-watcher.test.js +0 -281
- package/dist/test/workspace-watcher.test.js.map +0 -1
- package/dist/test/xml-round-persist.test.d.ts +0 -19
- package/dist/test/xml-round-persist.test.d.ts.map +0 -1
- package/dist/test/xml-round-persist.test.js +0 -235
- package/dist/test/xml-round-persist.test.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -1,652 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Item-3 redux: single-TRUNK output routing.
|
|
3
|
-
*
|
|
4
|
-
* These tests cover the FRAMEWORK-side plumbing that feeds the ChannelRegistry's
|
|
5
|
-
* `activeChannelResolver` (the routing DECISION itself is covered in
|
|
6
|
-
* channel-registry-routing.test.ts):
|
|
7
|
-
* - derivePushEventChannel() reconstructs the MCPL composite channel for a
|
|
8
|
-
* push event (Discord DMs arrive this way), preferring an explicit
|
|
9
|
-
* origin.mcplChannelId.
|
|
10
|
-
* - a channel-incoming turn records its triggering channel per-agent.
|
|
11
|
-
* - a DM push-event turn records the reconstructed DM channel per-agent.
|
|
12
|
-
* - a batched wake picks the MOST-RECENT triggering channel.
|
|
13
|
-
*
|
|
14
|
-
* connectome-host runs every agent as a single trunk (it never sets
|
|
15
|
-
* `conversations`), so no fork/home exists — the active triggering channel is
|
|
16
|
-
* the only thing that keeps a reply in the channel it is answering.
|
|
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
|
-
import { MembraneError } from '@animalabs/membrane';
|
|
26
|
-
/** Reach the private per-turn routing state (its triggering channel) + the pure channel-deriver. */
|
|
27
|
-
function internals(framework) {
|
|
28
|
-
return framework;
|
|
29
|
-
}
|
|
30
|
-
function channelIncoming(channelId, text) {
|
|
31
|
-
return {
|
|
32
|
-
type: 'mcpl:channel-incoming',
|
|
33
|
-
serverId: 'discord',
|
|
34
|
-
channelId,
|
|
35
|
-
messageId: `m-${Math.random().toString(36).slice(2)}`,
|
|
36
|
-
author: { id: 'U1', name: 'antra' },
|
|
37
|
-
content: [{ type: 'text', text }],
|
|
38
|
-
timestamp: new Date().toISOString(),
|
|
39
|
-
metadata: {},
|
|
40
|
-
triggerInference: true,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
/** A Discord DM as discord-mcpl forwards it: a push/event whose origin carries
|
|
44
|
-
* the raw channel (guildId null) — no channels/incoming, no open channel. */
|
|
45
|
-
function dmPushEvent(rawChannelId, text) {
|
|
46
|
-
return {
|
|
47
|
-
type: 'mcpl:push-event',
|
|
48
|
-
serverId: 'discord',
|
|
49
|
-
featureSet: 'discord.messaging',
|
|
50
|
-
eventId: `discord_msg_${Math.random().toString(36).slice(2)}`,
|
|
51
|
-
content: [{ type: 'text', text }],
|
|
52
|
-
origin: {
|
|
53
|
-
source: 'discord',
|
|
54
|
-
channelId: rawChannelId,
|
|
55
|
-
guildId: null,
|
|
56
|
-
channelName: undefined,
|
|
57
|
-
isDM: true,
|
|
58
|
-
},
|
|
59
|
-
timestamp: new Date().toISOString(),
|
|
60
|
-
inferenceId: `inf-${Math.random().toString(36).slice(2)}`,
|
|
61
|
-
triggerInference: true,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
describe('Trunk channel routing (item-3 redux)', () => {
|
|
65
|
-
let tempDir;
|
|
66
|
-
let membrane;
|
|
67
|
-
beforeEach(() => {
|
|
68
|
-
tempDir = mkdtempSync(join(tmpdir(), 'trunk-routing-test-'));
|
|
69
|
-
membrane = new MockMembrane();
|
|
70
|
-
});
|
|
71
|
-
afterEach(() => {
|
|
72
|
-
rmSync(tempDir, { recursive: true, force: true });
|
|
73
|
-
});
|
|
74
|
-
async function makeFramework() {
|
|
75
|
-
// NO `conversations` — this is connectome-host's single-trunk mode.
|
|
76
|
-
return AgentFramework.create({
|
|
77
|
-
storePath: join(tempDir, 'test.chronicle'),
|
|
78
|
-
membrane: membrane.asMembrane(),
|
|
79
|
-
agents: [{ name: 'scout', model: 'test-model', systemPrompt: 'You are scout.' }],
|
|
80
|
-
modules: [],
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
it('derivePushEventChannel prefers an explicit origin.mcplChannelId', async () => {
|
|
84
|
-
const framework = await makeFramework();
|
|
85
|
-
const got = internals(framework).derivePushEventChannel({
|
|
86
|
-
source: 'discord',
|
|
87
|
-
mcplChannelId: 'discord:dm:999',
|
|
88
|
-
channelName: 'DM with Antra',
|
|
89
|
-
channelId: '999',
|
|
90
|
-
});
|
|
91
|
-
assert.deepEqual(got, { channelId: 'discord:dm:999', label: 'DM with Antra' });
|
|
92
|
-
await framework.stop();
|
|
93
|
-
});
|
|
94
|
-
it('derivePushEventChannel reconstructs a Discord DM composite (guildId null -> dm)', async () => {
|
|
95
|
-
const framework = await makeFramework();
|
|
96
|
-
const got = internals(framework).derivePushEventChannel({
|
|
97
|
-
source: 'discord',
|
|
98
|
-
channelId: '42',
|
|
99
|
-
guildId: null,
|
|
100
|
-
isDM: true,
|
|
101
|
-
});
|
|
102
|
-
assert.deepEqual(got, { channelId: 'discord:dm:42' });
|
|
103
|
-
await framework.stop();
|
|
104
|
-
});
|
|
105
|
-
it('derivePushEventChannel reconstructs a non-open guild channel composite', async () => {
|
|
106
|
-
const framework = await makeFramework();
|
|
107
|
-
const got = internals(framework).derivePushEventChannel({
|
|
108
|
-
source: 'discord',
|
|
109
|
-
channelId: 'C7',
|
|
110
|
-
guildId: 'G1',
|
|
111
|
-
});
|
|
112
|
-
assert.deepEqual(got, { channelId: 'discord:G1:C7' });
|
|
113
|
-
await framework.stop();
|
|
114
|
-
});
|
|
115
|
-
it('derivePushEventChannel returns undefined for a channel-less push (heartbeat)', async () => {
|
|
116
|
-
const framework = await makeFramework();
|
|
117
|
-
const i = internals(framework);
|
|
118
|
-
assert.equal(i.derivePushEventChannel(undefined), undefined);
|
|
119
|
-
assert.equal(i.derivePushEventChannel({ source: 'heartbeat', kind: 'tick' }), undefined);
|
|
120
|
-
await framework.stop();
|
|
121
|
-
});
|
|
122
|
-
it('adds an actionable invitation when addressed in a closed channel', async () => {
|
|
123
|
-
const framework = await makeFramework();
|
|
124
|
-
const i = internals(framework);
|
|
125
|
-
i.channelRegistry = {
|
|
126
|
-
ensureChannelRegistered: () => { },
|
|
127
|
-
isChannelOpen: () => false,
|
|
128
|
-
getDescriptor: () => ({ capabilities: { history: { maxMessages: 80 } } }),
|
|
129
|
-
stopAll: () => { },
|
|
130
|
-
};
|
|
131
|
-
i.handleMcplPushEvent({
|
|
132
|
-
type: 'mcpl:push-event',
|
|
133
|
-
serverId: 'discord',
|
|
134
|
-
featureSet: 'discord.messaging',
|
|
135
|
-
eventId: 'discord_msg_m1',
|
|
136
|
-
content: [{ type: 'text', text: 'Antra: can you look at this?' }],
|
|
137
|
-
origin: {
|
|
138
|
-
source: 'discord',
|
|
139
|
-
messageId: 'm1',
|
|
140
|
-
mcplChannelId: 'discord:G1:C7',
|
|
141
|
-
channelName: 'portables',
|
|
142
|
-
},
|
|
143
|
-
tags: ['chat:mention', 'chat:addressed'],
|
|
144
|
-
timestamp: new Date().toISOString(),
|
|
145
|
-
inferenceId: 'i1',
|
|
146
|
-
triggerInference: false,
|
|
147
|
-
});
|
|
148
|
-
const messages = framework.getAgent('scout').getContextManager().queryMessages({}).messages;
|
|
149
|
-
const text = messages.at(-1)?.content
|
|
150
|
-
.filter((block) => block.type === 'text')
|
|
151
|
-
.map((block) => block.text)
|
|
152
|
-
.join('\n') ?? '';
|
|
153
|
-
assert.match(text, /Channel invitation/);
|
|
154
|
-
assert.match(text, /channel_open/);
|
|
155
|
-
// 2026-07-21 rewrite: names resolved, numbered options, backscroll hint
|
|
156
|
-
// phrased as "a number up to N", explicit permission to do nothing.
|
|
157
|
-
assert.match(text, /#portables/);
|
|
158
|
-
assert.match(text, /backscroll \(a number up to 80\)/);
|
|
159
|
-
assert.match(text, /channel_decline/);
|
|
160
|
-
assert.match(text, /optionally set acknowledge/);
|
|
161
|
-
assert.match(text, /Doing nothing is also fine\./);
|
|
162
|
-
// 2026-08-05 accuracy pass: the delivery model must be stated correctly —
|
|
163
|
-
// direct addresses still arrive; un-@'d follow-ups to a reply do not.
|
|
164
|
-
assert.match(text, /address you directly/);
|
|
165
|
-
assert.match(text, /follow-ups to your reply will NOT reach you/);
|
|
166
|
-
// No surface-tracked tally on this event → no missed-count sentence.
|
|
167
|
-
assert.doesNotMatch(text, /passed there without you/);
|
|
168
|
-
await framework.stop();
|
|
169
|
-
});
|
|
170
|
-
it('surfaces the missed-ambient tally in the closed-channel invitation', async () => {
|
|
171
|
-
const framework = await makeFramework();
|
|
172
|
-
const i = internals(framework);
|
|
173
|
-
i.channelRegistry = {
|
|
174
|
-
ensureChannelRegistered: () => { },
|
|
175
|
-
isChannelOpen: () => false,
|
|
176
|
-
getDescriptor: () => ({ capabilities: { history: { maxMessages: 80 } } }),
|
|
177
|
-
stopAll: () => { },
|
|
178
|
-
};
|
|
179
|
-
i.handleMcplPushEvent({
|
|
180
|
-
type: 'mcpl:push-event',
|
|
181
|
-
serverId: 'discord',
|
|
182
|
-
featureSet: 'discord.messaging',
|
|
183
|
-
eventId: 'discord_msg_m2',
|
|
184
|
-
content: [{ type: 'text', text: 'Antra: still there?' }],
|
|
185
|
-
origin: {
|
|
186
|
-
source: 'discord',
|
|
187
|
-
messageId: 'm2',
|
|
188
|
-
mcplChannelId: 'discord:G1:C7',
|
|
189
|
-
channelName: 'portables',
|
|
190
|
-
// discord-mcpl attaches the missed-ambient tally for closed, tracked
|
|
191
|
-
// channels so the agent sees the cost of staying out at decision time.
|
|
192
|
-
missedMessages: 3,
|
|
193
|
-
missedCharacters: 2729,
|
|
194
|
-
},
|
|
195
|
-
tags: ['chat:mention', 'chat:addressed'],
|
|
196
|
-
timestamp: new Date().toISOString(),
|
|
197
|
-
inferenceId: 'i2',
|
|
198
|
-
triggerInference: false,
|
|
199
|
-
});
|
|
200
|
-
const messages = framework.getAgent('scout').getContextManager().queryMessages({}).messages;
|
|
201
|
-
const text = messages.at(-1)?.content
|
|
202
|
-
.filter((block) => block.type === 'text')
|
|
203
|
-
.map((block) => block.text)
|
|
204
|
-
.join('\n') ?? '';
|
|
205
|
-
assert.match(text, /Channel invitation/);
|
|
206
|
-
assert.match(text, /While closed, 3 messages \(~2729 chars\) have passed there without you\./);
|
|
207
|
-
await framework.stop();
|
|
208
|
-
});
|
|
209
|
-
it('the invitation\'s reply prefix is a single resolvable token, not a label with spaces', async () => {
|
|
210
|
-
// Live bug (2026-10-02): a first DM arrived on a closed channel labelled "DM: _reim0n"; the
|
|
211
|
-
// invitation said to prefix ">>#DM: _reim0n", which parses as target "#DM:" + body "_reim0n …":
|
|
212
|
-
// the reply bounced, and the retained text later went out with a stray "_reim0n" line.
|
|
213
|
-
const textOf = (framework) => framework.getAgent('scout').getContextManager().queryMessages({}).messages.at(-1)?.content
|
|
214
|
-
.filter((block) => block.type === 'text')
|
|
215
|
-
.map((block) => block.text)
|
|
216
|
-
.join('\n') ?? '';
|
|
217
|
-
const dmEvent = (id) => ({
|
|
218
|
-
type: 'mcpl:push-event',
|
|
219
|
-
serverId: 'discord',
|
|
220
|
-
featureSet: 'discord.messaging',
|
|
221
|
-
eventId: `discord_msg_${id}`,
|
|
222
|
-
content: [{ type: 'text', text: '_reim0n: hey, I have THE gossip' }],
|
|
223
|
-
origin: { source: 'discord', messageId: id, mcplChannelId: 'discord:dm:1555', channelName: 'DM: _reim0n' },
|
|
224
|
-
tags: ['chat:addressed'],
|
|
225
|
-
timestamp: new Date().toISOString(),
|
|
226
|
-
inferenceId: `i-${id}`,
|
|
227
|
-
triggerInference: false,
|
|
228
|
-
});
|
|
229
|
-
// The registry knows the channel: its round-trip target is used.
|
|
230
|
-
const framework = await makeFramework();
|
|
231
|
-
const i = internals(framework);
|
|
232
|
-
const asked = [];
|
|
233
|
-
i.channelRegistry = {
|
|
234
|
-
ensureChannelRegistered: () => { },
|
|
235
|
-
isChannelOpen: () => false,
|
|
236
|
-
getDescriptor: () => ({ label: 'DM: _reim0n', capabilities: { history: { maxMessages: 80 } } }),
|
|
237
|
-
proseTargetFor: (id, serverId) => { asked.push(`${serverId}/${id}`); return '@_reim0n'; },
|
|
238
|
-
stopAll: () => { },
|
|
239
|
-
};
|
|
240
|
-
i.handleMcplPushEvent(dmEvent('m3'));
|
|
241
|
-
const text = textOf(framework);
|
|
242
|
-
assert.deepEqual(asked, ['discord/discord:dm:1555'], 'asked for this channel on the server it came from');
|
|
243
|
-
assert.match(text, /prefixed with ">>@_reim0n"/);
|
|
244
|
-
assert.doesNotMatch(text, />>#DM:/);
|
|
245
|
-
assert.match(text, /#DM: _reim0n/, 'the readable label still names the place');
|
|
246
|
-
await framework.stop();
|
|
247
|
-
// The registry finds no safe token (shared id, whitespace): no prefix is offered at all.
|
|
248
|
-
const fw2 = await makeFramework();
|
|
249
|
-
const i2 = internals(fw2);
|
|
250
|
-
i2.channelRegistry = {
|
|
251
|
-
ensureChannelRegistered: () => { },
|
|
252
|
-
isChannelOpen: () => false,
|
|
253
|
-
getDescriptor: () => ({ label: 'DM: _reim0n', capabilities: { history: { maxMessages: 80 } } }),
|
|
254
|
-
proseTargetFor: () => undefined,
|
|
255
|
-
stopAll: () => { },
|
|
256
|
-
};
|
|
257
|
-
i2.handleMcplPushEvent(dmEvent('m4'));
|
|
258
|
-
const t2 = textOf(fw2);
|
|
259
|
-
assert.doesNotMatch(t2, /prefixed with ">>/);
|
|
260
|
-
assert.match(t2, /Reply without joining isn't available here/);
|
|
261
|
-
assert.match(t2, /channel_open with channelId "discord:dm:1555"/, 'joining stays available');
|
|
262
|
-
await fw2.stop();
|
|
263
|
-
// A registry stand-in without proseTargetFor: a whitespace-free guess, never the spaced label.
|
|
264
|
-
const fw3 = await makeFramework();
|
|
265
|
-
const i3 = internals(fw3);
|
|
266
|
-
i3.channelRegistry = {
|
|
267
|
-
ensureChannelRegistered: () => { },
|
|
268
|
-
isChannelOpen: () => false,
|
|
269
|
-
getDescriptor: () => undefined,
|
|
270
|
-
stopAll: () => { },
|
|
271
|
-
};
|
|
272
|
-
i3.handleMcplPushEvent(dmEvent('m5'));
|
|
273
|
-
assert.match(textOf(fw3), /prefixed with ">>discord:dm:1555"/);
|
|
274
|
-
await fw3.stop();
|
|
275
|
-
});
|
|
276
|
-
it('a channel-incoming trunk turn records its triggering channel', async () => {
|
|
277
|
-
membrane.pushResponse(createMockResponse([{ type: 'text', text: 'the date is ...' }]));
|
|
278
|
-
const framework = await makeFramework();
|
|
279
|
-
framework.pushEvent(channelIncoming('discord:guild:chanA', 'A: sleep && date'));
|
|
280
|
-
await framework.runUntilIdle();
|
|
281
|
-
assert.equal(membrane.calls.length, 1, 'the trunk should have run one turn');
|
|
282
|
-
assert.equal(internals(framework).turnRouting.get('scout')?.triggerChannel, 'discord:guild:chanA', 'the turn must be routed to the channel that triggered it');
|
|
283
|
-
await framework.stop();
|
|
284
|
-
});
|
|
285
|
-
it('a DM push-event turn records the reconstructed DM channel (item-3 redux DM sub-case)', async () => {
|
|
286
|
-
membrane.pushResponse(createMockResponse([{ type: 'text', text: 'hi in the DM' }]));
|
|
287
|
-
const framework = await makeFramework();
|
|
288
|
-
framework.pushEvent(dmPushEvent('42', 'hey scout, ping'));
|
|
289
|
-
await framework.runUntilIdle();
|
|
290
|
-
assert.equal(membrane.calls.length, 1, 'the trunk should wake for the DM');
|
|
291
|
-
assert.equal(internals(framework).turnRouting.get('scout')?.triggerChannel, 'discord:dm:42', 'the DM reply must route to the DM channel, not the global locus');
|
|
292
|
-
await framework.stop();
|
|
293
|
-
});
|
|
294
|
-
it('the triggering channel tracks the CURRENT turn, never a stale one', async () => {
|
|
295
|
-
const framework = await makeFramework();
|
|
296
|
-
const i = internals(framework);
|
|
297
|
-
// A channel-A turn sets the active channel... (push the response right before
|
|
298
|
-
// each turn: MockMembrane's stream consumes ALL queued responses at once.)
|
|
299
|
-
membrane.pushResponse(createMockResponse([{ type: 'text', text: 'ans A' }]));
|
|
300
|
-
framework.pushEvent(channelIncoming('discord:guild:chanA', 'A: hi'));
|
|
301
|
-
await framework.runUntilIdle();
|
|
302
|
-
assert.equal(i.turnRouting.get('scout')?.triggerChannel, 'discord:guild:chanA');
|
|
303
|
-
// ...then a DM turn OVERWRITES it — the next turn's reply must never inherit
|
|
304
|
-
// the previous turn's channel (the concurrency hazard this fix removes).
|
|
305
|
-
membrane.pushResponse(createMockResponse([{ type: 'text', text: 'ans DM' }]));
|
|
306
|
-
framework.pushEvent(dmPushEvent('42', 'now in a DM'));
|
|
307
|
-
await framework.runUntilIdle();
|
|
308
|
-
assert.equal(membrane.calls.length, 2, 'both turns should have run');
|
|
309
|
-
assert.equal(i.turnRouting.get('scout')?.triggerChannel, 'discord:dm:42', 'the routing state must reflect the CURRENT turn’s channel, not chanA');
|
|
310
|
-
await framework.stop();
|
|
311
|
-
});
|
|
312
|
-
it("the channel registry resolves and reports the current turn's trigger channel, then its locus", async () => {
|
|
313
|
-
const framework = await makeFramework();
|
|
314
|
-
const i = framework;
|
|
315
|
-
// The real registry, with no servers: its resolver reads the framework's turn state.
|
|
316
|
-
await i.initializeMcpl([]);
|
|
317
|
-
i.turnRouting.set('scout', { triggerChannel: 'discord:guild:chanA' });
|
|
318
|
-
assert.equal(i.channelRegistry.resolveLocus('scout'), 'discord:guild:chanA', 'the locus a turn freezes comes from its trigger channel');
|
|
319
|
-
assert.equal(i.channelRegistry.buildChannelContext('scout')?.defaultOutgoing?.channelId, 'discord:guild:chanA', 'and the agent is told the same channel');
|
|
320
|
-
// A re-pin moved the turn's locus: a later start of the turn tells the
|
|
321
|
-
// agent where its speech now lands.
|
|
322
|
-
i.turnRouting.set('scout', { triggerChannel: 'discord:guild:chanA', locus: 'discord:dm:42' });
|
|
323
|
-
assert.equal(i.channelRegistry.buildChannelContext('scout')?.defaultOutgoing?.channelId, 'discord:dm:42');
|
|
324
|
-
await framework.stop();
|
|
325
|
-
});
|
|
326
|
-
it("the compile a capacity hold defers a turn to keeps the turn's trigger channel", async () => {
|
|
327
|
-
// The first stream ends with an organization acceleration 429, which
|
|
328
|
-
// holds the turn; a message from another channel arrives during the hold.
|
|
329
|
-
membrane.pushResponse(createMockResponse([]));
|
|
330
|
-
const framework = await makeFramework();
|
|
331
|
-
const makeStream = membrane.streamYielding.bind(membrane);
|
|
332
|
-
let streams = 0;
|
|
333
|
-
membrane.streamYielding = (request, options) => {
|
|
334
|
-
const stream = makeStream(request, options);
|
|
335
|
-
const n = ++streams;
|
|
336
|
-
const iterate = stream[Symbol.asyncIterator].bind(stream);
|
|
337
|
-
stream[Symbol.asyncIterator] = async function* () {
|
|
338
|
-
for await (const event of { [Symbol.asyncIterator]: iterate }) {
|
|
339
|
-
if (event.type === 'complete' && n === 1) {
|
|
340
|
-
yield {
|
|
341
|
-
type: 'error',
|
|
342
|
-
error: new MembraneError({
|
|
343
|
-
type: 'rate_limit', retryable: true, httpStatus: 429,
|
|
344
|
-
message: "This request would exceed your organization's maximum usage increase rate for input tokens per minute",
|
|
345
|
-
rawError: { status: 429 }, rawRequest: request,
|
|
346
|
-
}),
|
|
347
|
-
};
|
|
348
|
-
return;
|
|
349
|
-
}
|
|
350
|
-
yield event;
|
|
351
|
-
}
|
|
352
|
-
};
|
|
353
|
-
return stream;
|
|
354
|
-
};
|
|
355
|
-
const held = framework;
|
|
356
|
-
const triggerAtStart = [];
|
|
357
|
-
framework.onTrace((event) => {
|
|
358
|
-
if (event.type !== 'inference:started')
|
|
359
|
-
return;
|
|
360
|
-
triggerAtStart.push(internals(framework).turnRouting.get('scout')?.triggerChannel);
|
|
361
|
-
if (triggerAtStart.length === 2)
|
|
362
|
-
membrane.pushResponse(createMockResponse([{ type: 'text', text: 'back' }]));
|
|
363
|
-
});
|
|
364
|
-
framework.pushEvent(channelIncoming('discord:guild:chanA', 'A: what time is it'));
|
|
365
|
-
await framework.runUntilIdle();
|
|
366
|
-
assert.ok(held.providerAccelerationCooldowns.has('scout'), 'the turn is held');
|
|
367
|
-
framework.pushEvent(channelIncoming('discord:guild:chanB', 'B: unrelated chatter'));
|
|
368
|
-
await framework.runUntilIdle();
|
|
369
|
-
const hold = held.providerAccelerationCooldowns.get('scout');
|
|
370
|
-
assert.ok(hold.heldRequests.some((r) => r.channelId === 'discord:guild:chanB'), "chanB's wake waits in the hold with the turn's");
|
|
371
|
-
// What the hold's timer does when it fires, at the hold's deadline.
|
|
372
|
-
hold.until = Date.now();
|
|
373
|
-
held.releaseProviderAccelerationCooldown('scout');
|
|
374
|
-
await framework.runUntilIdle();
|
|
375
|
-
assert.deepEqual(triggerAtStart, ['discord:guild:chanA', 'discord:guild:chanA'], "the deferred compile's batch names chanB, and the turn keeps chanA");
|
|
376
|
-
await framework.stop();
|
|
377
|
-
});
|
|
378
|
-
it('startAgentStream clears the triggering channel for a no-channel (heartbeat) turn', async () => {
|
|
379
|
-
membrane.pushResponse(createMockResponse([{ type: 'text', text: 'tick' }]));
|
|
380
|
-
const framework = await makeFramework();
|
|
381
|
-
const i = internals(framework);
|
|
382
|
-
// Simulate a stale channel left by a prior turn, then run a heartbeat/timer
|
|
383
|
-
// turn (an InferenceRequest with no channelId). startAgentStream must clear
|
|
384
|
-
// the entry up front so routeSpeech falls back to the global locus rather
|
|
385
|
-
// than replaying the stale channel.
|
|
386
|
-
i.turnRouting.set('scout', { triggerChannel: 'discord:guild:stale' });
|
|
387
|
-
const scout = framework.getAgent('scout');
|
|
388
|
-
await framework.startAgentStream(scout, {
|
|
389
|
-
agentName: 'scout', reason: 'heartbeat', source: 'timer', timestamp: Date.now(),
|
|
390
|
-
});
|
|
391
|
-
await framework.runUntilIdle();
|
|
392
|
-
assert.equal(i.turnRouting.get('scout')?.triggerChannel, undefined, 'a no-trigger turn must clear any stale triggering channel');
|
|
393
|
-
await framework.stop();
|
|
394
|
-
});
|
|
395
|
-
});
|
|
396
|
-
// ---------------------------------------------------------------------------
|
|
397
|
-
// Residents read one message slot
|
|
398
|
-
// ---------------------------------------------------------------------------
|
|
399
|
-
// Every ordinary resident reads the same message slot, and a tool boundary
|
|
400
|
-
// weighs only the messages drained for its own agent. So each resident's open
|
|
401
|
-
// turn weighs what lands in the slot by its own rule (an addressed message,
|
|
402
|
-
// or a follow-up in a channel the turn engaged), whichever agent it was
|
|
403
|
-
// stored for: by addMessage, by a boundary's drain, or by a start's own flush.
|
|
404
|
-
/** A channel message as a channel server forwards it, waking only `target`. */
|
|
405
|
-
function residentIncoming(channelId, text, target, addressed) {
|
|
406
|
-
return {
|
|
407
|
-
type: 'mcpl:channel-incoming',
|
|
408
|
-
serverId: 'discord',
|
|
409
|
-
channelId,
|
|
410
|
-
messageId: `m-${Math.random().toString(36).slice(2)}`,
|
|
411
|
-
author: { id: 'U1', name: 'antra' },
|
|
412
|
-
content: [{ type: 'text', text }],
|
|
413
|
-
timestamp: new Date().toISOString(),
|
|
414
|
-
metadata: addressed ? { mentioned: true } : {},
|
|
415
|
-
tags: addressed ? ['chat:addressed'] : ['chat:ambient', 'chat:from-human'],
|
|
416
|
-
triggerInference: true,
|
|
417
|
-
targetAgents: [target],
|
|
418
|
-
};
|
|
419
|
-
}
|
|
420
|
-
/** A module whose `pause` tool runs `during` before it returns, and whose
|
|
421
|
-
* context gathering runs `startHook` once, in the named agent's next start. */
|
|
422
|
-
class PauseModule {
|
|
423
|
-
name = 'pause';
|
|
424
|
-
during = null;
|
|
425
|
-
startHook = null;
|
|
426
|
-
async start(_ctx) { }
|
|
427
|
-
async stop() { }
|
|
428
|
-
async gatherContext(agentName) {
|
|
429
|
-
const hook = this.startHook;
|
|
430
|
-
if (hook?.agent === agentName) {
|
|
431
|
-
this.startHook = null;
|
|
432
|
-
hook.run();
|
|
433
|
-
}
|
|
434
|
-
return [];
|
|
435
|
-
}
|
|
436
|
-
getTools() {
|
|
437
|
-
return [{ name: 'pause', description: 'Pause briefly', inputSchema: { type: 'object', properties: {} } }];
|
|
438
|
-
}
|
|
439
|
-
async handleToolCall(_call) {
|
|
440
|
-
const during = this.during;
|
|
441
|
-
this.during = null;
|
|
442
|
-
if (during)
|
|
443
|
-
await during();
|
|
444
|
-
return { success: true, data: { ok: true } };
|
|
445
|
-
}
|
|
446
|
-
async onProcess() {
|
|
447
|
-
return {};
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
describe('Residents read one message slot', () => {
|
|
451
|
-
let tempDir;
|
|
452
|
-
let membrane;
|
|
453
|
-
let pause;
|
|
454
|
-
beforeEach(() => {
|
|
455
|
-
tempDir = mkdtempSync(join(tmpdir(), 'resident-slot-test-'));
|
|
456
|
-
membrane = new MockMembrane();
|
|
457
|
-
pause = new PauseModule();
|
|
458
|
-
});
|
|
459
|
-
afterEach(() => {
|
|
460
|
-
rmSync(tempDir, { recursive: true, force: true });
|
|
461
|
-
});
|
|
462
|
-
/** Two residents, scout the primary and shade. A registry stand-in
|
|
463
|
-
* resolves a fresh locus to the turn's trigger channel and records where
|
|
464
|
-
* each agent's speech is routed. `held`'s first stream ends with an
|
|
465
|
-
* organization acceleration 429, which holds its turn for a later
|
|
466
|
-
* compile. `first` is that stream's rounds, and `responses[n]` feeds the
|
|
467
|
-
* nth start (1-based) as it begins. */
|
|
468
|
-
async function residents(held, responses, first = [[]]) {
|
|
469
|
-
const framework = await AgentFramework.create({
|
|
470
|
-
storePath: join(tempDir, 'test.chronicle'),
|
|
471
|
-
membrane: membrane.asMembrane(),
|
|
472
|
-
agents: [
|
|
473
|
-
{ name: 'scout', model: 'test-model', systemPrompt: 'You are scout.' },
|
|
474
|
-
{ name: 'shade', model: 'test-model', systemPrompt: 'You are shade.' },
|
|
475
|
-
],
|
|
476
|
-
modules: [pause],
|
|
477
|
-
});
|
|
478
|
-
const i = framework;
|
|
479
|
-
const routed = [];
|
|
480
|
-
const registry = {
|
|
481
|
-
resolveLocus: (name) => i.turnRouting.get(name)?.triggerChannel ?? 'chan-default',
|
|
482
|
-
routeSpeech: async (agent, text, locus) => {
|
|
483
|
-
routed.push({ agent, text, locus: locus ?? null });
|
|
484
|
-
return locus ? { delivered: true, channelId: locus } : null;
|
|
485
|
-
},
|
|
486
|
-
getDefaultPublishChannel: () => null,
|
|
487
|
-
isChannelOpen: () => true,
|
|
488
|
-
getDescriptor: () => undefined,
|
|
489
|
-
getChannelTools: () => [],
|
|
490
|
-
};
|
|
491
|
-
i.channelRegistry = new Proxy(registry, {
|
|
492
|
-
get: (target, prop) => (prop in target ? target[prop] : () => undefined),
|
|
493
|
-
});
|
|
494
|
-
first.forEach((blocks, n) => membrane.pushResponse(createMockResponse(blocks, n < first.length - 1 ? 'tool_use' : undefined)));
|
|
495
|
-
const makeStream = membrane.streamYielding.bind(membrane);
|
|
496
|
-
const firstStreamOf = new Set();
|
|
497
|
-
membrane.streamYielding = (request, options) => {
|
|
498
|
-
const stream = makeStream(request, options);
|
|
499
|
-
const system = JSON.stringify(request.system ?? '');
|
|
500
|
-
const agent = system.includes('You are shade.') ? 'shade' : 'scout';
|
|
501
|
-
const first = !firstStreamOf.has(agent);
|
|
502
|
-
firstStreamOf.add(agent);
|
|
503
|
-
const iterate = stream[Symbol.asyncIterator].bind(stream);
|
|
504
|
-
stream[Symbol.asyncIterator] = async function* () {
|
|
505
|
-
for await (const event of { [Symbol.asyncIterator]: iterate }) {
|
|
506
|
-
if (event.type === 'complete' && first && agent === held) {
|
|
507
|
-
yield {
|
|
508
|
-
type: 'error',
|
|
509
|
-
error: new MembraneError({
|
|
510
|
-
type: 'rate_limit', retryable: true, httpStatus: 429,
|
|
511
|
-
message: "This request would exceed your organization's maximum usage increase rate for input tokens per minute",
|
|
512
|
-
rawError: { status: 429 }, rawRequest: request,
|
|
513
|
-
}),
|
|
514
|
-
};
|
|
515
|
-
return;
|
|
516
|
-
}
|
|
517
|
-
yield event;
|
|
518
|
-
}
|
|
519
|
-
};
|
|
520
|
-
return stream;
|
|
521
|
-
};
|
|
522
|
-
let starts = 0;
|
|
523
|
-
framework.onTrace((event) => {
|
|
524
|
-
if (event.type !== 'inference:started')
|
|
525
|
-
return;
|
|
526
|
-
const feed = responses[++starts];
|
|
527
|
-
feed?.forEach((blocks, n) => membrane.pushResponse(createMockResponse(blocks, n < feed.length - 1 ? 'tool_use' : undefined)));
|
|
528
|
-
});
|
|
529
|
-
/** Bring `name`'s hold to its deadline and release it, as its timer does then. */
|
|
530
|
-
const release = async (name) => {
|
|
531
|
-
const hold = i.providerAccelerationCooldowns.get(name);
|
|
532
|
-
assert.ok(hold, `${name}'s turn is held`);
|
|
533
|
-
hold.until = Date.now();
|
|
534
|
-
i.releaseProviderAccelerationCooldown(name);
|
|
535
|
-
await framework.runUntilIdle();
|
|
536
|
-
};
|
|
537
|
-
return { framework, i, routed, release };
|
|
538
|
-
}
|
|
539
|
-
const hereIAm = [[{ type: 'text', text: 'Here I am.' }]];
|
|
540
|
-
// Each row is also what main does, by re-resolving the held turn's locus
|
|
541
|
-
// from its batch's addressed wake.
|
|
542
|
-
for (const [held, role] of [['scout', 'the primary'], ['shade', 'a second resident']]) {
|
|
543
|
-
it(`${role}, held by a capacity hold, moves its locus to an addressed message from another channel`, async () => {
|
|
544
|
-
const { framework, i, routed, release } = await residents(held, { 2: hereIAm });
|
|
545
|
-
framework.pushEvent(residentIncoming('discord:guild:chanA', `${held}, take a look`, held, false));
|
|
546
|
-
await framework.runUntilIdle();
|
|
547
|
-
assert.ok(i.providerAccelerationCooldowns.has(held), 'the turn is held');
|
|
548
|
-
framework.pushEvent(residentIncoming('discord:dm:antra', `${held}, over here please`, held, true));
|
|
549
|
-
await framework.runUntilIdle();
|
|
550
|
-
await release(held);
|
|
551
|
-
assert.deepEqual(routed, [{ agent: held, text: 'Here I am.', locus: 'discord:dm:antra' }]);
|
|
552
|
-
await framework.stop();
|
|
553
|
-
});
|
|
554
|
-
}
|
|
555
|
-
it('a second resident, held by a capacity hold, keeps its locus for ambient traffic in another channel', async () => {
|
|
556
|
-
const { framework, routed, release } = await residents('shade', { 2: hereIAm });
|
|
557
|
-
framework.pushEvent(residentIncoming('discord:guild:chanA', 'shade, take a look', 'shade', false));
|
|
558
|
-
await framework.runUntilIdle();
|
|
559
|
-
framework.pushEvent(residentIncoming('discord:guild:lounge', 'unrelated chatter', 'shade', false));
|
|
560
|
-
await framework.runUntilIdle();
|
|
561
|
-
assert.ok(framework.getAgent('shade').getContextManager().getAllMessages()
|
|
562
|
-
.some((m) => m.content.some((b) => b.type === 'text' && b.text === 'unrelated chatter')), 'shade reads the ambient message in the slot');
|
|
563
|
-
await release('shade');
|
|
564
|
-
assert.deepEqual(routed, [{ agent: 'shade', text: 'Here I am.', locus: 'discord:guild:chanA' }]);
|
|
565
|
-
await framework.stop();
|
|
566
|
-
});
|
|
567
|
-
it("a second resident's turn weighs a message stored while it runs, at the turn's next start", async () => {
|
|
568
|
-
const { framework, i, routed, release } = await residents('shade', { 2: hereIAm });
|
|
569
|
-
// While shade's start gathers its context, its turn is alive and no tool
|
|
570
|
-
// cycle is open, so an addressed message for the idle primary is stored
|
|
571
|
-
// at once. Shade's start has weighed its arrivals by then, and no
|
|
572
|
-
// boundary of shade's turn weighs it.
|
|
573
|
-
pause.startHook = {
|
|
574
|
-
agent: 'shade',
|
|
575
|
-
run: () => {
|
|
576
|
-
i.addMessage('Antra', [{ type: 'text', text: 'shade, over here please' }], { channelId: 'discord:dm:antra', tags: ['chat:addressed'] });
|
|
577
|
-
},
|
|
578
|
-
};
|
|
579
|
-
framework.pushEvent(residentIncoming('discord:guild:chanA', 'shade, take a look', 'shade', false));
|
|
580
|
-
await framework.runUntilIdle();
|
|
581
|
-
assert.equal(pause.startHook, null, "shade's start stored the message");
|
|
582
|
-
await release('shade');
|
|
583
|
-
assert.deepEqual(routed, [{ agent: 'shade', text: 'Here I am.', locus: 'discord:dm:antra' }]);
|
|
584
|
-
await framework.stop();
|
|
585
|
-
});
|
|
586
|
-
it("a second resident's held turn weighs a message the primary's own start stores", async () => {
|
|
587
|
-
const { framework, i, routed, release } = await residents('shade', {
|
|
588
|
-
2: [[{ type: 'text', text: 'scout here' }]],
|
|
589
|
-
3: hereIAm,
|
|
590
|
-
});
|
|
591
|
-
framework.pushEvent(residentIncoming('discord:guild:chanA', 'shade, take a look', 'shade', false));
|
|
592
|
-
await framework.runUntilIdle();
|
|
593
|
-
// While scout's turn is alive, a message for the primary waits in its
|
|
594
|
-
// queue, and scout's next start stores it.
|
|
595
|
-
i.activeTurnTokens.set('scout', 999);
|
|
596
|
-
framework.pushEvent(residentIncoming('discord:dm:antra', 'shade, over here please', 'shade', true));
|
|
597
|
-
await framework.runUntilIdle();
|
|
598
|
-
assert.equal(i.deferredMessages.length, 1, 'the message waits for scout');
|
|
599
|
-
i.activeTurnTokens.delete('scout');
|
|
600
|
-
framework.pushEvent(residentIncoming('discord:guild:chanC', 'scout, a word', 'scout', false));
|
|
601
|
-
await framework.runUntilIdle();
|
|
602
|
-
assert.equal(i.deferredMessages.length, 0, "scout's start stored it");
|
|
603
|
-
await release('shade');
|
|
604
|
-
assert.deepEqual(routed.filter((r) => r.agent === 'shade'), [{ agent: 'shade', text: 'Here I am.', locus: 'discord:dm:antra' }]);
|
|
605
|
-
await framework.stop();
|
|
606
|
-
});
|
|
607
|
-
it("a boundary that re-pins supersedes an arrival from another resident's store", async () => {
|
|
608
|
-
const { framework, i, routed, release } = await residents('scout', { 2: hereIAm }, [
|
|
609
|
-
[{ type: 'tool_use', id: 'p1', name: 'pause--pause', input: {} }],
|
|
610
|
-
[],
|
|
611
|
-
]);
|
|
612
|
-
// While scout's tool runs, a message for shade is stored at once, an
|
|
613
|
-
// arrival for scout's turn. Then one for scout waits in its queue, and
|
|
614
|
-
// scout's boundary stores it after, re-pinning the turn there.
|
|
615
|
-
pause.during = async () => {
|
|
616
|
-
i.addMessage('Antra', [{ type: 'text', text: 'shade, a word' }], { channelId: 'discord:dm:xenia', tags: ['chat:addressed'] }, { forAgent: 'shade' });
|
|
617
|
-
i.addMessage('Antra', [{ type: 'text', text: 'scout, over here please' }], { channelId: 'discord:dm:antra', tags: ['chat:addressed'] });
|
|
618
|
-
};
|
|
619
|
-
framework.pushEvent(residentIncoming('discord:guild:chanA', 'scout, take a look', 'scout', false));
|
|
620
|
-
await framework.runUntilIdle();
|
|
621
|
-
assert.equal(pause.during, null, "scout's tool ran");
|
|
622
|
-
await release('scout');
|
|
623
|
-
assert.deepEqual(routed, [{ agent: 'scout', text: 'Here I am.', locus: 'discord:dm:antra' }], "the boundary's re-pin stands at the turn's next start");
|
|
624
|
-
await framework.stop();
|
|
625
|
-
});
|
|
626
|
-
it("a second resident's held turn weighs a message the primary's tool boundary drains", async () => {
|
|
627
|
-
const { framework, i, routed, release } = await residents('shade', {
|
|
628
|
-
2: [
|
|
629
|
-
[{ type: 'tool_use', id: 'p1', name: 'pause--pause', input: {} }],
|
|
630
|
-
[{ type: 'text', text: 'scout done' }],
|
|
631
|
-
],
|
|
632
|
-
3: hereIAm,
|
|
633
|
-
});
|
|
634
|
-
framework.pushEvent(residentIncoming('discord:guild:chanA', 'shade, take a look', 'shade', false));
|
|
635
|
-
await framework.runUntilIdle();
|
|
636
|
-
// The message comes while scout's tool runs, so it waits in scout's queue
|
|
637
|
-
// until scout's boundary stores it.
|
|
638
|
-
let queued = -1;
|
|
639
|
-
pause.during = async () => {
|
|
640
|
-
i.addMessage('Antra', [{ type: 'text', text: 'shade, over here please' }], { channelId: 'discord:dm:antra', tags: ['chat:addressed'] });
|
|
641
|
-
queued = i.deferredMessages.length;
|
|
642
|
-
};
|
|
643
|
-
framework.pushEvent(residentIncoming('discord:guild:chanC', 'scout, a word', 'scout', false));
|
|
644
|
-
await framework.runUntilIdle();
|
|
645
|
-
assert.equal(queued, 1, "the message waited in scout's queue while its tool ran");
|
|
646
|
-
assert.equal(i.deferredMessages.length, 0, "scout's boundary stored it");
|
|
647
|
-
await release('shade');
|
|
648
|
-
assert.deepEqual(routed.filter((r) => r.agent === 'shade'), [{ agent: 'shade', text: 'Here I am.', locus: 'discord:dm:antra' }]);
|
|
649
|
-
await framework.stop();
|
|
650
|
-
});
|
|
651
|
-
});
|
|
652
|
-
//# sourceMappingURL=trunk-channel-routing.test.js.map
|