@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,619 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
import { HistoryModule } from '../src/modules/history/index.js';
|
|
4
|
-
/**
|
|
5
|
-
* HistoryModule's own logic is dispatch (always via
|
|
6
|
-
* queryMessagesByTimeAndChannel, per context-manager's own test evidence
|
|
7
|
-
* that it already handles "only one filter" and "neither filter"), input
|
|
8
|
-
* validation (ISO dates, regex, limit capping), and presentation (content
|
|
9
|
-
* flattening, snippet extraction, truncation detection). The underlying
|
|
10
|
-
* index-query *correctness* is context-manager's own responsibility and is
|
|
11
|
-
* covered by its test suite (test/message-store-history-index.test.ts) — so
|
|
12
|
-
* this stub implements realistic-but-simple in-memory filtering over a small
|
|
13
|
-
* fixture rather than standing up a real chronicle store, and a `calls` log
|
|
14
|
-
* lets tests assert on exactly what HistoryModule asked for (e.g. the capped
|
|
15
|
-
* limit).
|
|
16
|
-
*/
|
|
17
|
-
function textBlock(text) {
|
|
18
|
-
return { type: 'text', text };
|
|
19
|
-
}
|
|
20
|
-
function metaFor(channelId) {
|
|
21
|
-
return channelId ? { external: { channelId } } : undefined;
|
|
22
|
-
}
|
|
23
|
-
function msg(id, ms, participant, content, channelId) {
|
|
24
|
-
return {
|
|
25
|
-
id,
|
|
26
|
-
sequence: Number(id.replace(/\D/g, '')),
|
|
27
|
-
participant,
|
|
28
|
-
content,
|
|
29
|
-
metadata: metaFor(channelId),
|
|
30
|
-
timestamp: new Date(ms),
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
function channelIdOf(m) {
|
|
34
|
-
return m.metadata?.external?.channelId;
|
|
35
|
-
}
|
|
36
|
-
/** Trivial, deterministic stand-in for real token estimation — tests only
|
|
37
|
-
* assert on shape/filtering, never on the exact number. */
|
|
38
|
-
function estimate(m) {
|
|
39
|
-
return m.content.reduce((n, b) => n + (b.type === 'text' ? b.text.length : 4), 0);
|
|
40
|
-
}
|
|
41
|
-
function buildStub(messages, opts = {}) {
|
|
42
|
-
const calls = [];
|
|
43
|
-
const unsupported = () => {
|
|
44
|
-
throw new Error('Chronicle history index unsupported: native field-index capability absent on this chronicle build.');
|
|
45
|
-
};
|
|
46
|
-
const cm = {
|
|
47
|
-
queryMessagesByTimeAndChannel(args) {
|
|
48
|
-
calls.push({ method: 'queryMessagesByTimeAndChannel', args });
|
|
49
|
-
if (opts.throwUnsupported)
|
|
50
|
-
return unsupported();
|
|
51
|
-
const filtered = messages.filter((m) => {
|
|
52
|
-
const ts = m.timestamp.getTime();
|
|
53
|
-
if (args.fromMs !== undefined && ts < args.fromMs)
|
|
54
|
-
return false;
|
|
55
|
-
if (args.toMs !== undefined && ts > args.toMs)
|
|
56
|
-
return false;
|
|
57
|
-
if (args.channelId !== undefined && channelIdOf(m) !== args.channelId)
|
|
58
|
-
return false;
|
|
59
|
-
return true;
|
|
60
|
-
});
|
|
61
|
-
const matchedCount = filtered.length;
|
|
62
|
-
const offset = args.offset ?? 0;
|
|
63
|
-
const limit = args.limit ?? filtered.length;
|
|
64
|
-
return { messages: filtered.slice(offset, offset + limit), matchedCount };
|
|
65
|
-
},
|
|
66
|
-
// Time-only native query (search's candidate window and extract's
|
|
67
|
-
// aroundId use it for timestamp-ordered edges). Real contract:
|
|
68
|
-
// timestamp-ordered, `reverse` supported, matchedCount = PAGE size.
|
|
69
|
-
queryMessagesByTime(args) {
|
|
70
|
-
calls.push({ method: 'queryMessagesByTime', args });
|
|
71
|
-
if (opts.throwUnsupported)
|
|
72
|
-
return unsupported();
|
|
73
|
-
let filtered = messages
|
|
74
|
-
.filter((m) => {
|
|
75
|
-
const ts = m.timestamp.getTime();
|
|
76
|
-
if (args.fromMs !== undefined && ts < args.fromMs)
|
|
77
|
-
return false;
|
|
78
|
-
if (args.toMs !== undefined && ts > args.toMs)
|
|
79
|
-
return false;
|
|
80
|
-
return true;
|
|
81
|
-
})
|
|
82
|
-
.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
|
|
83
|
-
if (args.reverse)
|
|
84
|
-
filtered = filtered.reverse();
|
|
85
|
-
const offset = args.offset ?? 0;
|
|
86
|
-
const page = filtered.slice(offset, args.limit === undefined ? undefined : offset + args.limit);
|
|
87
|
-
return { messages: page, matchedCount: page.length };
|
|
88
|
-
},
|
|
89
|
-
getChannelMessageCounts() {
|
|
90
|
-
calls.push({ method: 'getChannelMessageCounts', args: undefined });
|
|
91
|
-
if (opts.throwUnsupported)
|
|
92
|
-
return unsupported();
|
|
93
|
-
const counts = new Map();
|
|
94
|
-
for (const m of messages) {
|
|
95
|
-
const c = channelIdOf(m);
|
|
96
|
-
if (c)
|
|
97
|
-
counts.set(c, (counts.get(c) ?? 0) + 1);
|
|
98
|
-
}
|
|
99
|
-
return [...counts.entries()].map(([channelId, count]) => ({ channelId, messages: count }));
|
|
100
|
-
},
|
|
101
|
-
getChannelTokenStats(args) {
|
|
102
|
-
calls.push({ method: 'getChannelTokenStats', args });
|
|
103
|
-
if (opts.throwUnsupported)
|
|
104
|
-
return unsupported();
|
|
105
|
-
const inRange = messages.filter((m) => {
|
|
106
|
-
const ts = m.timestamp.getTime();
|
|
107
|
-
if (args?.fromMs !== undefined && ts < args.fromMs)
|
|
108
|
-
return false;
|
|
109
|
-
if (args?.toMs !== undefined && ts > args.toMs)
|
|
110
|
-
return false;
|
|
111
|
-
return true;
|
|
112
|
-
});
|
|
113
|
-
const byChannel = new Map();
|
|
114
|
-
let totalTokensEstimate = 0;
|
|
115
|
-
for (const m of inRange) {
|
|
116
|
-
const est = estimate(m);
|
|
117
|
-
totalTokensEstimate += est;
|
|
118
|
-
const c = channelIdOf(m);
|
|
119
|
-
if (c) {
|
|
120
|
-
const agg = byChannel.get(c) ?? { messages: 0, tokensEstimate: 0 };
|
|
121
|
-
agg.messages++;
|
|
122
|
-
agg.tokensEstimate += est;
|
|
123
|
-
byChannel.set(c, agg);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return {
|
|
127
|
-
totalMessages: inRange.length,
|
|
128
|
-
totalTokensEstimate,
|
|
129
|
-
byChannel: [...byChannel.entries()].map(([channelId, agg]) => ({ channelId, ...agg })),
|
|
130
|
-
};
|
|
131
|
-
},
|
|
132
|
-
};
|
|
133
|
-
return { cm, calls };
|
|
134
|
-
}
|
|
135
|
-
function call(name, input) {
|
|
136
|
-
return { id: `call-${name}`, name, input };
|
|
137
|
-
}
|
|
138
|
-
// Fixture: two channels (c1, c2), one channel-less message, spread across
|
|
139
|
-
// distinct timestamps so time-range filtering is exercisable.
|
|
140
|
-
const FIXTURE = [
|
|
141
|
-
msg('m1', 1000, 'User', [textBlock('hello world')], 'c1'),
|
|
142
|
-
msg('m2', 2000, 'Claude', [{ type: 'tool_use', id: 't1', name: 'search', input: {} }], 'c1'),
|
|
143
|
-
msg('m3', 3000, 'User', [textBlock('foo BAR baz')], 'c2'),
|
|
144
|
-
msg('m4', 4000, 'Claude', [{ type: 'thinking', thinking: 'hmm' }, textBlock('final answer')], 'c2'),
|
|
145
|
-
msg('m5', 5000, 'User', [textBlock('unchanneled message')]),
|
|
146
|
-
msg('m6', 6000, 'User', [textBlock('another c1 message with searchterm inside')], 'c1'),
|
|
147
|
-
];
|
|
148
|
-
describe('HistoryModule', () => {
|
|
149
|
-
describe('stats', () => {
|
|
150
|
-
it('reports all-time message counts and range-scoped token stats separately', async () => {
|
|
151
|
-
const { cm } = buildStub(FIXTURE);
|
|
152
|
-
const h = new HistoryModule();
|
|
153
|
-
h.bind(cm);
|
|
154
|
-
// Range covers only m3..m5 (3000-5000), but messageCountsAllTime must
|
|
155
|
-
// still reflect the whole store.
|
|
156
|
-
const result = await h.handleToolCall(call('stats', { from: new Date(3000).toISOString(), to: new Date(5000).toISOString() }));
|
|
157
|
-
assert.equal(result.success, true, result.error);
|
|
158
|
-
const data = result.data;
|
|
159
|
-
const allTimeByChannel = new Map(data.messageCountsAllTime.map((c) => [c.channelId, c.messages]));
|
|
160
|
-
assert.equal(allTimeByChannel.get('c1'), 3); // m1, m2, m6 — unaffected by the range
|
|
161
|
-
assert.equal(allTimeByChannel.get('c2'), 2); // m3, m4
|
|
162
|
-
assert.equal(data.tokenStatsForRange.totalMessages, 3); // m3, m4, m5
|
|
163
|
-
const rangeByChannel = new Map(data.tokenStatsForRange.byChannel.map((c) => [c.channelId, c.messages]));
|
|
164
|
-
assert.equal(rangeByChannel.get('c2'), 2); // m3 and m4 both fall in [3000,5000]
|
|
165
|
-
assert.equal(rangeByChannel.has('c1'), false); // no c1 message falls in [3000,5000]
|
|
166
|
-
});
|
|
167
|
-
it('filters both parts of the response to one channelId when given', async () => {
|
|
168
|
-
const { cm } = buildStub(FIXTURE);
|
|
169
|
-
const h = new HistoryModule();
|
|
170
|
-
h.bind(cm);
|
|
171
|
-
const result = await h.handleToolCall(call('stats', { channelId: 'c1' }));
|
|
172
|
-
assert.equal(result.success, true, result.error);
|
|
173
|
-
const data = result.data;
|
|
174
|
-
assert.deepEqual(data.messageCountsAllTime.map((c) => c.channelId), ['c1']);
|
|
175
|
-
assert.deepEqual(data.tokenStatsForRange.byChannel.map((c) => c.channelId), ['c1']);
|
|
176
|
-
});
|
|
177
|
-
it('rejects an invalid ISO date cleanly instead of throwing', async () => {
|
|
178
|
-
const { cm } = buildStub(FIXTURE);
|
|
179
|
-
const h = new HistoryModule();
|
|
180
|
-
h.bind(cm);
|
|
181
|
-
const result = await h.handleToolCall(call('stats', { from: 'not-a-date' }));
|
|
182
|
-
assert.equal(result.success, false);
|
|
183
|
-
assert.equal(result.isError, true);
|
|
184
|
-
assert.match(result.error ?? '', /Invalid ISO 8601 date/);
|
|
185
|
-
});
|
|
186
|
-
it('surfaces the capability-absent error as a clean tool error, not a crash', async () => {
|
|
187
|
-
const { cm } = buildStub(FIXTURE, { throwUnsupported: true });
|
|
188
|
-
const h = new HistoryModule();
|
|
189
|
-
h.bind(cm);
|
|
190
|
-
const result = await h.handleToolCall(call('stats', {}));
|
|
191
|
-
assert.equal(result.success, false);
|
|
192
|
-
assert.equal(result.isError, true);
|
|
193
|
-
assert.match(result.error ?? '', /Chronicle history index unsupported/);
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
describe('extract', () => {
|
|
197
|
-
it('filters by channel and date range', async () => {
|
|
198
|
-
const { cm } = buildStub(FIXTURE);
|
|
199
|
-
const h = new HistoryModule();
|
|
200
|
-
h.bind(cm);
|
|
201
|
-
const result = await h.handleToolCall(call('extract', { channelId: 'c1', from: new Date(1500).toISOString() }));
|
|
202
|
-
assert.equal(result.success, true, result.error);
|
|
203
|
-
const data = result.data;
|
|
204
|
-
// c1 messages at ts >= 1500: m2 (2000), m6 (6000) — m1 (1000) excluded.
|
|
205
|
-
assert.deepEqual(data.messages.map((m) => m.id), ['m2', 'm6']);
|
|
206
|
-
assert.equal(data.returned, 2);
|
|
207
|
-
assert.equal(data.matchedCount, 2);
|
|
208
|
-
});
|
|
209
|
-
it('format:"text" flattens content; format:"raw" returns blocks as-is', async () => {
|
|
210
|
-
const { cm } = buildStub(FIXTURE);
|
|
211
|
-
const h = new HistoryModule();
|
|
212
|
-
h.bind(cm);
|
|
213
|
-
const textResult = await h.handleToolCall(call('extract', { channelId: 'c2', format: 'text' }));
|
|
214
|
-
const textData = textResult.data;
|
|
215
|
-
const m4 = textData.messages.find((m) => m.id === 'm4');
|
|
216
|
-
assert.equal(m4.content, '[thinking] final answer');
|
|
217
|
-
const rawResult = await h.handleToolCall(call('extract', { channelId: 'c2', format: 'raw' }));
|
|
218
|
-
const rawData = rawResult.data;
|
|
219
|
-
const m4Raw = rawData.messages.find((m) => m.id === 'm4');
|
|
220
|
-
assert.ok(Array.isArray(m4Raw.content));
|
|
221
|
-
assert.equal(m4Raw.content.length, 2);
|
|
222
|
-
assert.equal(m4Raw.content[0]?.type, 'thinking');
|
|
223
|
-
});
|
|
224
|
-
it('caps limit at the hard maximum before it reaches context-manager', async () => {
|
|
225
|
-
const { cm, calls } = buildStub(FIXTURE);
|
|
226
|
-
const h = new HistoryModule();
|
|
227
|
-
h.bind(cm);
|
|
228
|
-
await h.handleToolCall(call('extract', { limit: 999999 }));
|
|
229
|
-
const queryCall = calls.find((c) => c.method === 'queryMessagesByTimeAndChannel');
|
|
230
|
-
// 200 = the hard cap; +1 is extract's own "is there another page" probe row.
|
|
231
|
-
assert.equal((queryCall?.args).limit, 201);
|
|
232
|
-
});
|
|
233
|
-
it('clamps an out-of-u32-range offset to the native ceiling instead of passing it through to wrap (reviewer repro)', async () => {
|
|
234
|
-
// Number.MAX_SAFE_INTEGER is not a safe ceiling for a value that
|
|
235
|
-
// eventually crosses into a native u32 argument: 4294967296 (one past
|
|
236
|
-
// u32 max) must be clamped to 4294967295, not passed through as-is —
|
|
237
|
-
// otherwise it wraps/truncates at the N-API boundary into a small
|
|
238
|
-
// offset and silently returns the wrong page instead of an empty one.
|
|
239
|
-
const { cm, calls } = buildStub(FIXTURE);
|
|
240
|
-
const h = new HistoryModule();
|
|
241
|
-
h.bind(cm);
|
|
242
|
-
await h.handleToolCall(call('extract', { offset: 4294967296, limit: 1 }));
|
|
243
|
-
const queryCall = calls.find((c) => c.method === 'queryMessagesByTimeAndChannel');
|
|
244
|
-
assert.equal((queryCall?.args).offset, 4294967295);
|
|
245
|
-
});
|
|
246
|
-
it('surfaces the capability-absent error cleanly', async () => {
|
|
247
|
-
const { cm } = buildStub(FIXTURE, { throwUnsupported: true });
|
|
248
|
-
const h = new HistoryModule();
|
|
249
|
-
h.bind(cm);
|
|
250
|
-
const result = await h.handleToolCall(call('extract', {}));
|
|
251
|
-
assert.equal(result.success, false);
|
|
252
|
-
assert.equal(result.isError, true);
|
|
253
|
-
assert.match(result.error ?? '', /Chronicle history index unsupported/);
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
describe('search', () => {
|
|
257
|
-
it('matches a case-insensitive substring by default', async () => {
|
|
258
|
-
const { cm } = buildStub(FIXTURE);
|
|
259
|
-
const h = new HistoryModule();
|
|
260
|
-
h.bind(cm);
|
|
261
|
-
const result = await h.handleToolCall(call('search', { query: 'bar' }));
|
|
262
|
-
assert.equal(result.success, true, result.error);
|
|
263
|
-
const data = result.data;
|
|
264
|
-
assert.deepEqual(data.matches.map((m) => m.id), ['m3']);
|
|
265
|
-
assert.match(data.matches[0].snippet, /BAR/);
|
|
266
|
-
});
|
|
267
|
-
it('limit:0 (substring) returns zero matches instead of one (reviewer repro)', async () => {
|
|
268
|
-
// clampCount accepts 0 as a valid value (it's >= 0). Both matching
|
|
269
|
-
// loops used to push a match onto the results array BEFORE checking
|
|
270
|
-
// the limit, so with a matching candidate present, limit:0 still
|
|
271
|
-
// returned exactly 1 match.
|
|
272
|
-
const { cm } = buildStub(FIXTURE);
|
|
273
|
-
const h = new HistoryModule();
|
|
274
|
-
h.bind(cm);
|
|
275
|
-
const result = await h.handleToolCall(call('search', { query: 'bar', limit: 0 }));
|
|
276
|
-
assert.equal(result.success, true, result.error);
|
|
277
|
-
const data = result.data;
|
|
278
|
-
assert.equal(data.matches.length, 0);
|
|
279
|
-
});
|
|
280
|
-
it('limit:0 (regex) returns zero matches instead of one (reviewer repro)', async () => {
|
|
281
|
-
// Same bug, independently, in search-regex-worker.ts's own copy of
|
|
282
|
-
// the match loop.
|
|
283
|
-
const { cm } = buildStub(FIXTURE);
|
|
284
|
-
const h = new HistoryModule();
|
|
285
|
-
h.bind(cm);
|
|
286
|
-
const result = await h.handleToolCall(call('search', { query: '\\bworld\\b', regex: true, limit: 0 }));
|
|
287
|
-
assert.equal(result.success, true, result.error);
|
|
288
|
-
const data = result.data;
|
|
289
|
-
assert.equal(data.matches.length, 0);
|
|
290
|
-
});
|
|
291
|
-
it('caseSensitive:true respects case', async () => {
|
|
292
|
-
const { cm } = buildStub(FIXTURE);
|
|
293
|
-
const h = new HistoryModule();
|
|
294
|
-
h.bind(cm);
|
|
295
|
-
const result = await h.handleToolCall(call('search', { query: 'bar', caseSensitive: true }));
|
|
296
|
-
assert.equal(result.success, true, result.error);
|
|
297
|
-
const data = result.data;
|
|
298
|
-
assert.equal(data.matches.length, 0); // fixture only has "BAR", not "bar"
|
|
299
|
-
});
|
|
300
|
-
it('matches a regex', async () => {
|
|
301
|
-
const { cm } = buildStub(FIXTURE);
|
|
302
|
-
const h = new HistoryModule();
|
|
303
|
-
h.bind(cm);
|
|
304
|
-
const result = await h.handleToolCall(call('search', { query: '\\bworld\\b', regex: true }));
|
|
305
|
-
assert.equal(result.success, true, result.error);
|
|
306
|
-
const data = result.data;
|
|
307
|
-
assert.deepEqual(data.matches.map((m) => m.id), ['m1']);
|
|
308
|
-
});
|
|
309
|
-
it('forcibly terminates a catastrophically-backtracking (ReDoS) regex instead of hanging', async () => {
|
|
310
|
-
// Reviewer's repro: 32 'a's followed by a non-matching character, plus
|
|
311
|
-
// a classic exponential-backtracking pattern. `(a+)+$` against this
|
|
312
|
-
// input backtracks exponentially and (verified separately in an
|
|
313
|
-
// isolated child process) has to be force-killed after several
|
|
314
|
-
// seconds; the equivalent linear pattern `^a+$` returns instantly.
|
|
315
|
-
// This must never block the framework's single event loop — matching
|
|
316
|
-
// has to happen off-thread with a real, forcible deadline.
|
|
317
|
-
const evil = 'a'.repeat(32) + '!';
|
|
318
|
-
const { cm } = buildStub([msg('r1', 1000, 'User', [textBlock(evil)], 'c1')]);
|
|
319
|
-
const h = new HistoryModule();
|
|
320
|
-
h.bind(cm);
|
|
321
|
-
const start = Date.now();
|
|
322
|
-
const result = await h.handleToolCall(call('search', { query: '(a+)+$', regex: true, maxScan: 1 }));
|
|
323
|
-
const elapsed = Date.now() - start;
|
|
324
|
-
// Returns well within a bounded time (module deadline is 2s; generous
|
|
325
|
-
// slack here for worker spawn/CI jitter) — proves the test runner
|
|
326
|
-
// itself never hung waiting on this call.
|
|
327
|
-
assert.ok(elapsed < 8000, `search took ${elapsed}ms — should have been forcibly terminated near the deadline`);
|
|
328
|
-
// A cut-short match MUST be a clean, unambiguous failure, never
|
|
329
|
-
// success:true with an empty matches array — that would be
|
|
330
|
-
// indistinguishable from "no matches found", which is a lie.
|
|
331
|
-
assert.equal(result.success, false);
|
|
332
|
-
assert.equal(result.isError, true);
|
|
333
|
-
assert.match(result.error ?? '', /timed out/i);
|
|
334
|
-
});
|
|
335
|
-
it('a normal regex against the same kind of input still matches correctly (worker path is not just failing everything)', async () => {
|
|
336
|
-
const { cm } = buildStub([msg('r1', 1000, 'User', [textBlock('aaaa!')], 'c1')]);
|
|
337
|
-
const h = new HistoryModule();
|
|
338
|
-
h.bind(cm);
|
|
339
|
-
const result = await h.handleToolCall(call('search', { query: '^a+!$', regex: true }));
|
|
340
|
-
assert.equal(result.success, true, result.error);
|
|
341
|
-
const data = result.data;
|
|
342
|
-
assert.deepEqual(data.matches.map((m) => m.id), ['r1']);
|
|
343
|
-
});
|
|
344
|
-
it('returns a clean error for an invalid regex instead of throwing', async () => {
|
|
345
|
-
const { cm } = buildStub(FIXTURE);
|
|
346
|
-
const h = new HistoryModule();
|
|
347
|
-
h.bind(cm);
|
|
348
|
-
const result = await h.handleToolCall(call('search', { query: '(unclosed', regex: true }));
|
|
349
|
-
assert.equal(result.success, false);
|
|
350
|
-
assert.equal(result.isError, true);
|
|
351
|
-
assert.match(result.error ?? '', /Invalid regex/);
|
|
352
|
-
});
|
|
353
|
-
it('reports truncated:true up front when the candidate window exceeds maxScan', async () => {
|
|
354
|
-
const { cm } = buildStub(FIXTURE);
|
|
355
|
-
const h = new HistoryModule();
|
|
356
|
-
h.bind(cm);
|
|
357
|
-
const result = await h.handleToolCall(call('search', { query: 'm', maxScan: 3 }));
|
|
358
|
-
assert.equal(result.success, true, result.error);
|
|
359
|
-
const data = result.data;
|
|
360
|
-
assert.equal(data.truncated, true);
|
|
361
|
-
assert.equal(data.candidatePoolSize, 3);
|
|
362
|
-
assert.ok(data.scanned <= 3);
|
|
363
|
-
});
|
|
364
|
-
it('does not report truncated when the candidate window fits within maxScan', async () => {
|
|
365
|
-
const { cm } = buildStub(FIXTURE);
|
|
366
|
-
const h = new HistoryModule();
|
|
367
|
-
h.bind(cm);
|
|
368
|
-
const result = await h.handleToolCall(call('search', { query: 'searchterm', maxScan: 5000 }));
|
|
369
|
-
assert.equal(result.success, true, result.error);
|
|
370
|
-
const data = result.data;
|
|
371
|
-
assert.equal(data.truncated, false);
|
|
372
|
-
assert.deepEqual(data.matches.map((m) => m.id), ['m6']);
|
|
373
|
-
});
|
|
374
|
-
it('surfaces the capability-absent error cleanly', async () => {
|
|
375
|
-
const { cm } = buildStub(FIXTURE, { throwUnsupported: true });
|
|
376
|
-
const h = new HistoryModule();
|
|
377
|
-
h.bind(cm);
|
|
378
|
-
const result = await h.handleToolCall(call('search', { query: 'x' }));
|
|
379
|
-
assert.equal(result.success, false);
|
|
380
|
-
assert.equal(result.isError, true);
|
|
381
|
-
assert.match(result.error ?? '', /Chronicle history index unsupported/);
|
|
382
|
-
});
|
|
383
|
-
});
|
|
384
|
-
describe('pagination input validation', () => {
|
|
385
|
-
// Math.min(value, max) alone only enforces an UPPER bound —
|
|
386
|
-
// Math.min(-1, 200) is -1, not clamped up to anything — so a negative
|
|
387
|
-
// (or non-integer/non-finite) limit/offset/maxScan would previously
|
|
388
|
-
// reach context-manager's native query unbounded. Each of these must
|
|
389
|
-
// now be rejected before the native call is ever made.
|
|
390
|
-
const badValues = [
|
|
391
|
-
['negative', -1],
|
|
392
|
-
['non-integer', 1.5],
|
|
393
|
-
['NaN', NaN],
|
|
394
|
-
['Infinity', Infinity],
|
|
395
|
-
];
|
|
396
|
-
for (const [label, value] of badValues) {
|
|
397
|
-
it(`extract: rejects a ${label} limit before it reaches context-manager`, async () => {
|
|
398
|
-
const { cm, calls } = buildStub(FIXTURE);
|
|
399
|
-
const h = new HistoryModule();
|
|
400
|
-
h.bind(cm);
|
|
401
|
-
const result = await h.handleToolCall(call('extract', { limit: value }));
|
|
402
|
-
assert.equal(result.success, false);
|
|
403
|
-
assert.equal(result.isError, true);
|
|
404
|
-
assert.equal(calls.length, 0, 'must reject before ever calling context-manager');
|
|
405
|
-
});
|
|
406
|
-
it(`extract: rejects a ${label} offset before it reaches context-manager`, async () => {
|
|
407
|
-
const { cm, calls } = buildStub(FIXTURE);
|
|
408
|
-
const h = new HistoryModule();
|
|
409
|
-
h.bind(cm);
|
|
410
|
-
const result = await h.handleToolCall(call('extract', { offset: value }));
|
|
411
|
-
assert.equal(result.success, false);
|
|
412
|
-
assert.equal(result.isError, true);
|
|
413
|
-
assert.equal(calls.length, 0);
|
|
414
|
-
});
|
|
415
|
-
it(`search: rejects a ${label} limit before it reaches context-manager`, async () => {
|
|
416
|
-
const { cm, calls } = buildStub(FIXTURE);
|
|
417
|
-
const h = new HistoryModule();
|
|
418
|
-
h.bind(cm);
|
|
419
|
-
const result = await h.handleToolCall(call('search', { query: 'm', limit: value }));
|
|
420
|
-
assert.equal(result.success, false);
|
|
421
|
-
assert.equal(result.isError, true);
|
|
422
|
-
assert.equal(calls.length, 0);
|
|
423
|
-
});
|
|
424
|
-
it(`search: rejects a ${label} maxScan before it reaches context-manager`, async () => {
|
|
425
|
-
const { cm, calls } = buildStub(FIXTURE);
|
|
426
|
-
const h = new HistoryModule();
|
|
427
|
-
h.bind(cm);
|
|
428
|
-
const result = await h.handleToolCall(call('search', { query: 'm', maxScan: value }));
|
|
429
|
-
assert.equal(result.success, false);
|
|
430
|
-
assert.equal(result.isError, true);
|
|
431
|
-
assert.equal(calls.length, 0);
|
|
432
|
-
});
|
|
433
|
-
}
|
|
434
|
-
it('extract: a real 250-message store with limit:-1 does NOT return everything (reviewer repro)', async () => {
|
|
435
|
-
// Reviewer's exact repro shape: a store larger than the hard cap, and
|
|
436
|
-
// a negative limit that must not bypass it.
|
|
437
|
-
const many = Array.from({ length: 250 }, (_, i) => msg(`p${i}`, 1000 + i, 'User', [textBlock(`m${i}`)], 'c1'));
|
|
438
|
-
const { cm } = buildStub(many);
|
|
439
|
-
const h = new HistoryModule();
|
|
440
|
-
h.bind(cm);
|
|
441
|
-
const result = await h.handleToolCall(call('extract', { limit: -1 }));
|
|
442
|
-
assert.equal(result.success, false);
|
|
443
|
-
assert.equal(result.isError, true);
|
|
444
|
-
});
|
|
445
|
-
it('search: a real large candidate pool with maxScan:-2 does NOT fetch everything (reviewer repro)', async () => {
|
|
446
|
-
const many = Array.from({ length: 248 }, (_, i) => msg(`q${i}`, 1000 + i, 'User', [textBlock(`m${i}`)], 'c1'));
|
|
447
|
-
const { cm, calls } = buildStub(many);
|
|
448
|
-
const h = new HistoryModule();
|
|
449
|
-
h.bind(cm);
|
|
450
|
-
const result = await h.handleToolCall(call('search', { query: 'm', maxScan: -2 }));
|
|
451
|
-
assert.equal(result.success, false);
|
|
452
|
-
assert.equal(result.isError, true);
|
|
453
|
-
assert.equal(calls.length, 0);
|
|
454
|
-
});
|
|
455
|
-
});
|
|
456
|
-
describe('channel-label retrofit (resolveChannel via ChannelRegistry)', () => {
|
|
457
|
-
/**
|
|
458
|
-
* Minimal ChannelRegistry-shaped stub — HistoryModule's resolveChannel()
|
|
459
|
-
* only ever calls resolveProseTargetDurable(), so that's all this needs
|
|
460
|
-
* to implement. `known` maps a label spec to the raw channelId it
|
|
461
|
-
* resolves to; anything else is an unresolvable miss (mirrors
|
|
462
|
-
* ChannelRegistry's own {error} return).
|
|
463
|
-
*/
|
|
464
|
-
function stubRegistry(known) {
|
|
465
|
-
return {
|
|
466
|
-
resolveProseTargetDurable(spec) {
|
|
467
|
-
const channelId = known[spec];
|
|
468
|
-
return channelId !== undefined ? { channelId } : { error: `no such channel: ${spec}` };
|
|
469
|
-
},
|
|
470
|
-
};
|
|
471
|
-
}
|
|
472
|
-
it('stats: resolves a label to the raw channelId before calling context-manager', async () => {
|
|
473
|
-
const { cm } = buildStub(FIXTURE);
|
|
474
|
-
const h = new HistoryModule();
|
|
475
|
-
h.bind(cm, stubRegistry({ '#c1-label': 'c1' }));
|
|
476
|
-
const result = await h.handleToolCall(call('stats', { channelId: '#c1-label' }));
|
|
477
|
-
assert.equal(result.success, true, result.error);
|
|
478
|
-
const data = result.data;
|
|
479
|
-
// Same result as passing the raw 'c1' id directly (see the plain
|
|
480
|
-
// stats/channelId test above) — proves the label was resolved, not
|
|
481
|
-
// passed through as a literal (nonexistent) channelId.
|
|
482
|
-
assert.deepEqual(data.messageCountsAllTime.map((c) => c.channelId), ['c1']);
|
|
483
|
-
assert.deepEqual(data.tokenStatsForRange.byChannel.map((c) => c.channelId), ['c1']);
|
|
484
|
-
});
|
|
485
|
-
it('extract: resolves a label to the raw channelId before calling context-manager', async () => {
|
|
486
|
-
const { cm, calls } = buildStub(FIXTURE);
|
|
487
|
-
const h = new HistoryModule();
|
|
488
|
-
h.bind(cm, stubRegistry({ '#c1-label': 'c1' }));
|
|
489
|
-
const result = await h.handleToolCall(call('extract', { channelId: '#c1-label', from: new Date(1500).toISOString() }));
|
|
490
|
-
assert.equal(result.success, true, result.error);
|
|
491
|
-
const data = result.data;
|
|
492
|
-
assert.deepEqual(data.messages.map((m) => m.id), ['m2', 'm6']);
|
|
493
|
-
const queryCall = calls.find((c) => c.method === 'queryMessagesByTimeAndChannel');
|
|
494
|
-
assert.equal((queryCall?.args).channelId, 'c1', 'context-manager must see the resolved raw id, not the label');
|
|
495
|
-
});
|
|
496
|
-
it('search: resolves a label to the raw channelId before calling context-manager', async () => {
|
|
497
|
-
const { cm } = buildStub(FIXTURE);
|
|
498
|
-
const h = new HistoryModule();
|
|
499
|
-
h.bind(cm, stubRegistry({ '#c1-label': 'c1' }));
|
|
500
|
-
const result = await h.handleToolCall(call('search', { query: 'searchterm', channelId: '#c1-label' }));
|
|
501
|
-
assert.equal(result.success, true, result.error);
|
|
502
|
-
const data = result.data;
|
|
503
|
-
assert.deepEqual(data.matches.map((m) => m.id), ['m6']);
|
|
504
|
-
});
|
|
505
|
-
it('an unresolvable spec is passed through unchanged (escape hatch for an already-raw channelId)', async () => {
|
|
506
|
-
const { cm, calls } = buildStub(FIXTURE);
|
|
507
|
-
const h = new HistoryModule();
|
|
508
|
-
// Registry is bound but knows nothing about 'c1' as a *label* — only
|
|
509
|
-
// resolveProseTargetDurable would be asked, and it misses.
|
|
510
|
-
h.bind(cm, stubRegistry({}));
|
|
511
|
-
const result = await h.handleToolCall(call('extract', { channelId: 'c1' }));
|
|
512
|
-
assert.equal(result.success, true, result.error);
|
|
513
|
-
const data = result.data;
|
|
514
|
-
assert.deepEqual(data.messages.map((m) => m.id), ['m1', 'm2', 'm6']);
|
|
515
|
-
const queryCall = calls.find((c) => c.method === 'queryMessagesByTimeAndChannel');
|
|
516
|
-
assert.equal((queryCall?.args).channelId, 'c1');
|
|
517
|
-
});
|
|
518
|
-
it('a typo\'d label-shaped spec (starts with # or @) surfaces a clean error with suggestions instead of silently looking empty (finding #8)', async () => {
|
|
519
|
-
const { cm } = buildStub(FIXTURE);
|
|
520
|
-
const h = new HistoryModule();
|
|
521
|
-
h.bind(cm, {
|
|
522
|
-
resolveProseTargetDurable(spec) {
|
|
523
|
-
if (spec === '#c1-label')
|
|
524
|
-
return { channelId: 'c1' };
|
|
525
|
-
// Unresolvable, but the resolver still offers a near-match
|
|
526
|
-
// suggestion — exactly what a real ChannelRegistry miss returns.
|
|
527
|
-
// The underlying error text deliberately mimics
|
|
528
|
-
// resolveProseTarget's SEND-flavored DM wording ("use the
|
|
529
|
-
// send_dm tool") — resolveChannel must not surface it verbatim
|
|
530
|
-
// (see the next test): a read-only history tool needs its own
|
|
531
|
-
// wording, not send-context advice.
|
|
532
|
-
return { error: `no registered DM found for "${spec}" — use the send_dm tool`, candidates: ['#c1-label'] };
|
|
533
|
-
},
|
|
534
|
-
});
|
|
535
|
-
const result = await h.handleToolCall(call('extract', { channelId: '#c1-labl' })); // typo
|
|
536
|
-
assert.equal(result.success, false);
|
|
537
|
-
assert.equal(result.isError, true);
|
|
538
|
-
assert.match(result.error ?? '', /No channel history found/i);
|
|
539
|
-
assert.match(result.error ?? '', /#c1-label/); // the suggestion made it into the error
|
|
540
|
-
});
|
|
541
|
-
it('never reuses the live resolver\'s send_dm-flavored error text — always uses read-only-tool wording (finding: DM error text)', async () => {
|
|
542
|
-
const { cm } = buildStub(FIXTURE);
|
|
543
|
-
const h = new HistoryModule();
|
|
544
|
-
h.bind(cm, {
|
|
545
|
-
resolveProseTargetDurable(_spec) {
|
|
546
|
-
return { error: 'no registered DM found for "@ghost" — for someone without a registered DM channel, use the send_dm tool' };
|
|
547
|
-
},
|
|
548
|
-
});
|
|
549
|
-
const result = await h.handleToolCall(call('extract', { channelId: '@ghost' }));
|
|
550
|
-
assert.equal(result.success, false);
|
|
551
|
-
assert.equal(result.isError, true);
|
|
552
|
-
assert.doesNotMatch(result.error ?? '', /send_dm/, 'send-context advice must never leak into a read-only tool error');
|
|
553
|
-
});
|
|
554
|
-
it('a bare (non-#/@) unresolvable spec still passes through unchanged — the escape hatch is preserved for non-label-shaped input', async () => {
|
|
555
|
-
const { cm, calls } = buildStub(FIXTURE);
|
|
556
|
-
const h = new HistoryModule();
|
|
557
|
-
h.bind(cm, {
|
|
558
|
-
resolveProseTargetDurable(_spec) {
|
|
559
|
-
return { error: 'no such channel', candidates: ['c1'] };
|
|
560
|
-
},
|
|
561
|
-
});
|
|
562
|
-
// 'c1' doesn't start with '#' or '@' — even on a registry miss, this
|
|
563
|
-
// must still be treated as an already-raw id, not an error.
|
|
564
|
-
const result = await h.handleToolCall(call('extract', { channelId: 'c1' }));
|
|
565
|
-
assert.equal(result.success, true, result.error);
|
|
566
|
-
const queryCall = calls.find((c) => c.method === 'queryMessagesByTimeAndChannel');
|
|
567
|
-
assert.equal((queryCall?.args).channelId, 'c1');
|
|
568
|
-
});
|
|
569
|
-
it('an unresolvable <@id>/<@!id> mention form surfaces the clean error on extract/stats/search/overview, not a silent empty result (finding: mention-form escape-hatch gap)', async () => {
|
|
570
|
-
const { cm } = buildStub(FIXTURE);
|
|
571
|
-
const registry = {
|
|
572
|
-
resolveProseTargetDurable(_spec) {
|
|
573
|
-
return { error: 'no registered DM matches the mention <@999>' };
|
|
574
|
-
},
|
|
575
|
-
};
|
|
576
|
-
for (const mention of ['<@999>', '<@!999>']) {
|
|
577
|
-
for (const toolName of ['extract', 'stats', 'search', 'overview']) {
|
|
578
|
-
const h = new HistoryModule();
|
|
579
|
-
h.bind(cm, registry);
|
|
580
|
-
const input = { channelId: mention };
|
|
581
|
-
if (toolName === 'search')
|
|
582
|
-
input.query = 'x';
|
|
583
|
-
const result = await h.handleToolCall(call(toolName, input));
|
|
584
|
-
assert.equal(result.success, false, `${toolName}(${mention}) should error, not silently succeed`);
|
|
585
|
-
assert.equal(result.isError, true);
|
|
586
|
-
assert.match(result.error ?? '', /No channel history found/i, `${toolName}(${mention}) should surface the clean resolution error`);
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
});
|
|
590
|
-
it('regression guard: an unbound module (bind(cm) only, no registry) still accepts a raw id unchanged', async () => {
|
|
591
|
-
const { cm, calls } = buildStub(FIXTURE);
|
|
592
|
-
const h = new HistoryModule();
|
|
593
|
-
h.bind(cm); // no ChannelRegistry passed — today's pre-retrofit call shape.
|
|
594
|
-
const result = await h.handleToolCall(call('extract', { channelId: 'c1' }));
|
|
595
|
-
assert.equal(result.success, true, result.error);
|
|
596
|
-
const data = result.data;
|
|
597
|
-
assert.deepEqual(data.messages.map((m) => m.id), ['m1', 'm2', 'm6']);
|
|
598
|
-
const queryCall = calls.find((c) => c.method === 'queryMessagesByTimeAndChannel');
|
|
599
|
-
assert.equal((queryCall?.args).channelId, 'c1');
|
|
600
|
-
});
|
|
601
|
-
});
|
|
602
|
-
it('rejects tool calls before bind()', async () => {
|
|
603
|
-
const h = new HistoryModule();
|
|
604
|
-
const result = await h.handleToolCall(call('stats', {}));
|
|
605
|
-
assert.equal(result.success, false);
|
|
606
|
-
assert.equal(result.isError, true);
|
|
607
|
-
assert.match(result.error ?? '', /not bound/);
|
|
608
|
-
});
|
|
609
|
-
it('rejects an unknown tool name', async () => {
|
|
610
|
-
const { cm } = buildStub(FIXTURE);
|
|
611
|
-
const h = new HistoryModule();
|
|
612
|
-
h.bind(cm);
|
|
613
|
-
const result = await h.handleToolCall(call('bogus', {}));
|
|
614
|
-
assert.equal(result.success, false);
|
|
615
|
-
assert.equal(result.isError, true);
|
|
616
|
-
assert.match(result.error ?? '', /Unknown tool/);
|
|
617
|
-
});
|
|
618
|
-
});
|
|
619
|
-
//# sourceMappingURL=history-module.test.js.map
|