@animalabs/agent-framework 0.22.1 → 0.22.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/src/agent.d.ts +266 -28
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +539 -104
- package/dist/src/agent.js.map +1 -1
- package/dist/src/api/mcp-server-core.d.ts +41 -0
- package/dist/src/api/mcp-server-core.d.ts.map +1 -0
- package/dist/src/api/mcp-server-core.js +593 -0
- package/dist/src/api/mcp-server-core.js.map +1 -0
- package/dist/src/api/mcp-server.d.ts +2 -36
- package/dist/src/api/mcp-server.d.ts.map +1 -1
- package/dist/src/api/mcp-server.js +15 -595
- package/dist/src/api/mcp-server.js.map +1 -1
- package/dist/src/api/server.d.ts +9 -1
- package/dist/src/api/server.d.ts.map +1 -1
- package/dist/src/api/server.js +55 -27
- package/dist/src/api/server.js.map +1 -1
- package/dist/src/api/types.d.ts +10 -2
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/branch-names.d.ts +14 -0
- package/dist/src/branch-names.d.ts.map +1 -0
- package/dist/src/branch-names.js +22 -0
- package/dist/src/branch-names.js.map +1 -0
- package/dist/src/closest-names.d.ts +28 -0
- package/dist/src/closest-names.d.ts.map +1 -0
- package/dist/src/closest-names.js +98 -0
- package/dist/src/closest-names.js.map +1 -0
- package/dist/src/code-execution/py-runner.d.ts +16 -5
- package/dist/src/code-execution/py-runner.d.ts.map +1 -1
- package/dist/src/code-execution/py-runner.js +186 -74
- package/dist/src/code-execution/py-runner.js.map +1 -1
- package/dist/src/code-execution/runtime-py.d.ts.map +1 -1
- package/dist/src/code-execution/runtime-py.js +49 -3
- package/dist/src/code-execution/runtime-py.js.map +1 -1
- package/dist/src/code-execution/tool-definition.d.ts +12 -1
- package/dist/src/code-execution/tool-definition.d.ts.map +1 -1
- package/dist/src/code-execution/tool-definition.js +21 -3
- package/dist/src/code-execution/tool-definition.js.map +1 -1
- package/dist/src/config-checks.d.ts +28 -0
- package/dist/src/config-checks.d.ts.map +1 -0
- package/dist/src/config-checks.js +52 -0
- package/dist/src/config-checks.js.map +1 -0
- package/dist/src/deadline-timer.d.ts +21 -0
- package/dist/src/deadline-timer.d.ts.map +1 -0
- package/dist/src/deadline-timer.js +43 -0
- package/dist/src/deadline-timer.js.map +1 -0
- package/dist/src/error-message.d.ts +30 -0
- package/dist/src/error-message.d.ts.map +1 -0
- package/dist/src/error-message.js +50 -0
- package/dist/src/error-message.js.map +1 -0
- package/dist/src/framework.d.ts +1212 -192
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +6686 -1835
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +8 -0
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +27 -3
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/gate/gate-script.d.ts.map +1 -1
- package/dist/src/gate/gate-script.js.map +1 -1
- package/dist/src/index.d.ts +5 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/capability-grant.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +170 -13
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +499 -258
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/checkpoint-manager.d.ts +21 -1
- package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -1
- package/dist/src/mcpl/checkpoint-manager.js +91 -30
- package/dist/src/mcpl/checkpoint-manager.js.map +1 -1
- package/dist/src/mcpl/conversation-router.d.ts +19 -3
- package/dist/src/mcpl/conversation-router.d.ts.map +1 -1
- package/dist/src/mcpl/conversation-router.js +23 -8
- package/dist/src/mcpl/conversation-router.js.map +1 -1
- package/dist/src/mcpl/convert-block.d.ts +20 -0
- package/dist/src/mcpl/convert-block.d.ts.map +1 -0
- package/dist/src/mcpl/convert-block.js +89 -0
- package/dist/src/mcpl/convert-block.js.map +1 -0
- package/dist/src/mcpl/errors.d.ts +13 -0
- package/dist/src/mcpl/errors.d.ts.map +1 -1
- package/dist/src/mcpl/errors.js +28 -0
- package/dist/src/mcpl/errors.js.map +1 -1
- package/dist/src/mcpl/feature-set-manager.d.ts.map +1 -1
- package/dist/src/mcpl/feature-set-manager.js +4 -3
- package/dist/src/mcpl/feature-set-manager.js.map +1 -1
- package/dist/src/mcpl/hook-orchestrator.d.ts +23 -0
- package/dist/src/mcpl/hook-orchestrator.d.ts.map +1 -1
- package/dist/src/mcpl/hook-orchestrator.js +83 -72
- package/dist/src/mcpl/hook-orchestrator.js.map +1 -1
- package/dist/src/mcpl/inbound-source.d.ts +114 -0
- package/dist/src/mcpl/inbound-source.d.ts.map +1 -0
- package/dist/src/mcpl/inbound-source.js +83 -0
- package/dist/src/mcpl/inbound-source.js.map +1 -0
- package/dist/src/mcpl/index.d.ts +3 -1
- package/dist/src/mcpl/index.d.ts.map +1 -1
- package/dist/src/mcpl/index.js +3 -1
- package/dist/src/mcpl/index.js.map +1 -1
- package/dist/src/mcpl/inference-router.d.ts +15 -11
- package/dist/src/mcpl/inference-router.d.ts.map +1 -1
- package/dist/src/mcpl/inference-router.js +153 -84
- package/dist/src/mcpl/inference-router.js.map +1 -1
- package/dist/src/mcpl/log-value.d.ts +54 -0
- package/dist/src/mcpl/log-value.d.ts.map +1 -0
- package/dist/src/mcpl/log-value.js +109 -0
- package/dist/src/mcpl/log-value.js.map +1 -0
- package/dist/src/mcpl/prose-stream-router.d.ts +6 -6
- package/dist/src/mcpl/prose-stream-router.d.ts.map +1 -1
- package/dist/src/mcpl/prose-stream-router.js +4 -4
- package/dist/src/mcpl/prose-stream-router.js.map +1 -1
- package/dist/src/mcpl/push-coalescer.d.ts +64 -7
- package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
- package/dist/src/mcpl/push-coalescer.js +121 -24
- package/dist/src/mcpl/push-coalescer.js.map +1 -1
- package/dist/src/mcpl/push-handler.d.ts +38 -8
- package/dist/src/mcpl/push-handler.d.ts.map +1 -1
- package/dist/src/mcpl/push-handler.js +77 -78
- package/dist/src/mcpl/push-handler.js.map +1 -1
- package/dist/src/mcpl/reference-fetcher.d.ts +14 -2
- package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
- package/dist/src/mcpl/reference-fetcher.js +72 -30
- package/dist/src/mcpl/reference-fetcher.js.map +1 -1
- package/dist/src/mcpl/references.d.ts +49 -14
- package/dist/src/mcpl/references.d.ts.map +1 -1
- package/dist/src/mcpl/references.js +74 -21
- package/dist/src/mcpl/references.js.map +1 -1
- package/dist/src/mcpl/refusal-lines.d.ts +37 -0
- package/dist/src/mcpl/refusal-lines.d.ts.map +1 -0
- package/dist/src/mcpl/refusal-lines.js +61 -0
- package/dist/src/mcpl/refusal-lines.js.map +1 -0
- package/dist/src/mcpl/scope-manager.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +107 -12
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +470 -139
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/mcpl/server-registry.d.ts +10 -1
- package/dist/src/mcpl/server-registry.d.ts.map +1 -1
- package/dist/src/mcpl/server-registry.js +14 -3
- package/dist/src/mcpl/server-registry.js.map +1 -1
- package/dist/src/mcpl/skip-reply-wake.d.ts +36 -0
- package/dist/src/mcpl/skip-reply-wake.d.ts.map +1 -0
- package/dist/src/mcpl/skip-reply-wake.js +55 -0
- package/dist/src/mcpl/skip-reply-wake.js.map +1 -0
- package/dist/src/mcpl/tool-classes.d.ts +1 -1
- package/dist/src/mcpl/tool-classes.d.ts.map +1 -1
- package/dist/src/mcpl/tool-classes.js +3 -2
- package/dist/src/mcpl/tool-classes.js.map +1 -1
- package/dist/src/mcpl/tool-lifecycle.d.ts.map +1 -1
- package/dist/src/mcpl/tool-lifecycle.js.map +1 -1
- package/dist/src/mcpl/transport.d.ts +74 -7
- package/dist/src/mcpl/transport.d.ts.map +1 -1
- package/dist/src/mcpl/transport.js +209 -22
- package/dist/src/mcpl/transport.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +43 -28
- package/dist/src/mcpl/types.d.ts.map +1 -1
- package/dist/src/mcpl/types.js.map +1 -1
- package/dist/src/mcpl/visible-content.d.ts +15 -0
- package/dist/src/mcpl/visible-content.d.ts.map +1 -1
- package/dist/src/mcpl/visible-content.js +25 -0
- package/dist/src/mcpl/visible-content.js.map +1 -1
- package/dist/src/module-registry.d.ts +19 -1
- package/dist/src/module-registry.d.ts.map +1 -1
- package/dist/src/module-registry.js +54 -25
- package/dist/src/module-registry.js.map +1 -1
- package/dist/src/modules/api/index.d.ts.map +1 -1
- package/dist/src/modules/api/index.js +1 -1
- package/dist/src/modules/api/index.js.map +1 -1
- package/dist/src/modules/discord/discord-js-client.d.ts +1 -0
- package/dist/src/modules/discord/discord-js-client.d.ts.map +1 -1
- package/dist/src/modules/discord/discord-js-client.js +25 -9
- package/dist/src/modules/discord/discord-js-client.js.map +1 -1
- package/dist/src/modules/discord/index.d.ts +29 -3
- package/dist/src/modules/discord/index.d.ts.map +1 -1
- package/dist/src/modules/discord/index.js +383 -145
- package/dist/src/modules/discord/index.js.map +1 -1
- package/dist/src/modules/discord/types.d.ts +14 -1
- package/dist/src/modules/discord/types.d.ts.map +1 -1
- package/dist/src/modules/health/index.d.ts.map +1 -1
- package/dist/src/modules/health/index.js +2 -1
- package/dist/src/modules/health/index.js.map +1 -1
- package/dist/src/modules/history/index.d.ts +3 -1
- package/dist/src/modules/history/index.d.ts.map +1 -1
- package/dist/src/modules/history/index.js +359 -127
- package/dist/src/modules/history/index.js.map +1 -1
- package/dist/src/modules/history/semantic.d.ts +28 -1
- package/dist/src/modules/history/semantic.d.ts.map +1 -1
- package/dist/src/modules/history/semantic.js +177 -32
- package/dist/src/modules/history/semantic.js.map +1 -1
- package/dist/src/modules/unknown-tool.d.ts +10 -0
- package/dist/src/modules/unknown-tool.d.ts.map +1 -0
- package/dist/src/modules/unknown-tool.js +17 -0
- package/dist/src/modules/unknown-tool.js.map +1 -0
- package/dist/src/modules/workspace/branch-intent.d.ts.map +1 -1
- package/dist/src/modules/workspace/branch-intent.js.map +1 -1
- package/dist/src/modules/workspace/disk-agreement.d.ts +54 -6
- package/dist/src/modules/workspace/disk-agreement.d.ts.map +1 -1
- package/dist/src/modules/workspace/disk-agreement.js +93 -27
- package/dist/src/modules/workspace/disk-agreement.js.map +1 -1
- package/dist/src/modules/workspace/effects.d.ts +64 -6
- package/dist/src/modules/workspace/effects.d.ts.map +1 -1
- package/dist/src/modules/workspace/effects.js +291 -44
- package/dist/src/modules/workspace/effects.js.map +1 -1
- package/dist/src/modules/workspace/index.d.ts +127 -27
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +821 -248
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/observe.d.ts +117 -15
- package/dist/src/modules/workspace/observe.d.ts.map +1 -1
- package/dist/src/modules/workspace/observe.js +436 -51
- package/dist/src/modules/workspace/observe.js.map +1 -1
- package/dist/src/modules/workspace/reconcile.d.ts +75 -8
- package/dist/src/modules/workspace/reconcile.d.ts.map +1 -1
- package/dist/src/modules/workspace/reconcile.js +576 -68
- package/dist/src/modules/workspace/reconcile.js.map +1 -1
- package/dist/src/modules/workspace/types.d.ts +42 -3
- package/dist/src/modules/workspace/types.d.ts.map +1 -1
- package/dist/src/modules/workspace/types.js.map +1 -1
- package/dist/src/modules/workspace/watcher.d.ts +7 -2
- package/dist/src/modules/workspace/watcher.d.ts.map +1 -1
- package/dist/src/modules/workspace/watcher.js +28 -4
- package/dist/src/modules/workspace/watcher.js.map +1 -1
- package/dist/src/operator-log.d.ts.map +1 -1
- package/dist/src/operator-log.js.map +1 -1
- package/dist/src/prose-drafts.d.ts +240 -0
- package/dist/src/prose-drafts.d.ts.map +1 -0
- package/dist/src/prose-drafts.js +362 -0
- package/dist/src/prose-drafts.js.map +1 -0
- package/dist/src/prose-segments.d.ts +21 -2
- package/dist/src/prose-segments.d.ts.map +1 -1
- package/dist/src/prose-segments.js +46 -9
- package/dist/src/prose-segments.js.map +1 -1
- package/dist/src/provider-waits.d.ts.map +1 -1
- package/dist/src/provider-waits.js.map +1 -1
- package/dist/src/queue.d.ts.map +1 -1
- package/dist/src/record-journal.d.ts.map +1 -1
- package/dist/src/record-journal.js.map +1 -1
- package/dist/src/recovery/discord-awareness-outbox.d.ts.map +1 -1
- package/dist/src/recovery/discord-awareness-outbox.js.map +1 -1
- package/dist/src/recovery/offline-branch.d.ts +1 -0
- package/dist/src/recovery/offline-branch.d.ts.map +1 -1
- package/dist/src/recovery/offline-branch.js +32 -25
- package/dist/src/recovery/offline-branch.js.map +1 -1
- package/dist/src/recovery/recover-cli.js.map +1 -1
- package/dist/src/runtime/liveness-watchdog.d.ts.map +1 -1
- package/dist/src/runtime/liveness-watchdog.js.map +1 -1
- package/dist/src/safe-slice.d.ts +5 -1
- package/dist/src/safe-slice.d.ts.map +1 -1
- package/dist/src/safe-slice.js +9 -1
- package/dist/src/safe-slice.js.map +1 -1
- package/dist/src/shutdown.d.ts.map +1 -1
- package/dist/src/shutdown.js.map +1 -1
- package/dist/src/stored-removal.d.ts +73 -0
- package/dist/src/stored-removal.d.ts.map +1 -0
- package/dist/src/stored-removal.js +100 -0
- package/dist/src/stored-removal.js.map +1 -0
- package/dist/src/thinking-token-stamp.js.map +1 -1
- package/dist/src/tool-image-ledger.d.ts +87 -19
- package/dist/src/tool-image-ledger.d.ts.map +1 -1
- package/dist/src/tool-image-ledger.js +135 -32
- package/dist/src/tool-image-ledger.js.map +1 -1
- package/dist/src/tool-presentation.d.ts +9 -0
- package/dist/src/tool-presentation.d.ts.map +1 -1
- package/dist/src/tool-presentation.js +257 -60
- package/dist/src/tool-presentation.js.map +1 -1
- package/dist/src/tool-result-guard.d.ts.map +1 -1
- package/dist/src/tool-result-guard.js +7 -10
- package/dist/src/tool-result-guard.js.map +1 -1
- package/dist/src/tool-result-history.d.ts +32 -3
- package/dist/src/tool-result-history.d.ts.map +1 -1
- package/dist/src/tool-result-history.js +106 -19
- package/dist/src/tool-result-history.js.map +1 -1
- package/dist/src/tune-out/coordinator.d.ts +25 -1
- package/dist/src/tune-out/coordinator.d.ts.map +1 -1
- package/dist/src/tune-out/coordinator.js +260 -65
- package/dist/src/tune-out/coordinator.js.map +1 -1
- package/dist/src/tune-out/tools.d.ts +1 -1
- package/dist/src/tune-out/tools.d.ts.map +1 -1
- package/dist/src/types/agent.d.ts +59 -11
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/events.d.ts +17 -0
- package/dist/src/types/events.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +31 -5
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/inference-log.d.ts +1 -1
- package/dist/src/types/inference-log.d.ts.map +1 -1
- package/dist/src/types/module.d.ts +30 -7
- package/dist/src/types/module.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +151 -11
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/src/usage/usage-tracker.d.ts +5 -0
- package/dist/src/usage/usage-tracker.d.ts.map +1 -1
- package/dist/src/usage/usage-tracker.js +35 -8
- package/dist/src/usage/usage-tracker.js.map +1 -1
- package/package.json +10 -9
- package/src/agent.ts +572 -105
- package/src/api/mcp-server-core.ts +681 -0
- package/src/api/mcp-server.ts +16 -685
- package/src/api/server.ts +55 -30
- package/src/api/types.ts +10 -2
- package/src/branch-names.ts +19 -0
- package/src/closest-names.ts +94 -0
- package/src/code-execution/py-runner.ts +200 -76
- package/src/code-execution/runtime-py.ts +49 -3
- package/src/code-execution/tool-definition.ts +28 -4
- package/src/config-checks.ts +48 -0
- package/src/deadline-timer.ts +44 -0
- package/src/error-message.ts +48 -0
- package/src/framework.ts +7158 -1936
- package/src/gate/event-gate.ts +28 -3
- package/src/index.ts +12 -3
- package/src/mcpl/channel-registry.ts +615 -289
- package/src/mcpl/checkpoint-manager.ts +104 -29
- package/src/mcpl/conversation-router.ts +28 -8
- package/src/mcpl/convert-block.ts +97 -0
- package/src/mcpl/errors.ts +28 -0
- package/src/mcpl/feature-set-manager.ts +4 -3
- package/src/mcpl/hook-orchestrator.ts +84 -77
- package/src/mcpl/inbound-source.ts +156 -0
- package/src/mcpl/index.ts +10 -1
- package/src/mcpl/inference-router.ts +174 -99
- package/src/mcpl/log-value.ts +116 -0
- package/src/mcpl/prose-stream-router.ts +6 -6
- package/src/mcpl/push-coalescer.ts +124 -24
- package/src/mcpl/push-handler.ts +86 -84
- package/src/mcpl/reference-fetcher.ts +71 -26
- package/src/mcpl/references.ts +81 -22
- package/src/mcpl/refusal-lines.ts +59 -0
- package/src/mcpl/server-connection.ts +496 -142
- package/src/mcpl/server-registry.ts +15 -4
- package/src/mcpl/skip-reply-wake.ts +73 -0
- package/src/mcpl/tool-classes.ts +3 -2
- package/src/mcpl/transport.ts +219 -26
- package/src/mcpl/types.ts +18 -3
- package/src/mcpl/visible-content.ts +27 -0
- package/src/module-registry.ts +58 -23
- package/src/modules/api/index.ts +1 -1
- package/src/modules/discord/discord-js-client.ts +26 -10
- package/src/modules/discord/index.ts +395 -160
- package/src/modules/discord/types.ts +15 -2
- package/src/modules/health/index.ts +2 -1
- package/src/modules/history/index.ts +410 -120
- package/src/modules/history/semantic.ts +189 -32
- package/src/modules/unknown-tool.ts +16 -0
- package/src/modules/workspace/disk-agreement.ts +125 -21
- package/src/modules/workspace/effects.ts +279 -35
- package/src/modules/workspace/index.ts +841 -261
- package/src/modules/workspace/observe.ts +456 -56
- package/src/modules/workspace/reconcile.ts +688 -76
- package/src/modules/workspace/types.ts +41 -2
- package/src/modules/workspace/watcher.ts +27 -4
- package/src/prose-drafts.ts +481 -0
- package/src/prose-segments.ts +51 -8
- package/src/recovery/offline-branch.ts +36 -29
- package/src/safe-slice.ts +9 -1
- package/src/stored-removal.ts +126 -0
- package/src/tool-image-ledger.ts +153 -34
- package/src/tool-presentation.ts +224 -40
- package/src/tool-result-guard.ts +7 -8
- package/src/tool-result-history.ts +124 -20
- package/src/tune-out/coordinator.ts +259 -65
- package/src/types/agent.ts +59 -13
- package/src/types/events.ts +17 -0
- package/src/types/framework.ts +31 -5
- package/src/types/inference-log.ts +1 -1
- package/src/types/module.ts +31 -7
- package/src/types/trace.ts +158 -12
- package/src/usage/usage-tracker.ts +32 -8
- package/dist/test/activation-request-sanitize.test.d.ts +0 -2
- package/dist/test/activation-request-sanitize.test.d.ts.map +0 -1
- package/dist/test/activation-request-sanitize.test.js +0 -89
- package/dist/test/activation-request-sanitize.test.js.map +0 -1
- package/dist/test/agent-cache-ttl.test.d.ts +0 -2
- package/dist/test/agent-cache-ttl.test.d.ts.map +0 -1
- package/dist/test/agent-cache-ttl.test.js +0 -41
- package/dist/test/agent-cache-ttl.test.js.map +0 -1
- package/dist/test/agent-runtime-settings.test.d.ts +0 -2
- package/dist/test/agent-runtime-settings.test.d.ts.map +0 -1
- package/dist/test/agent-runtime-settings.test.js +0 -462
- package/dist/test/agent-runtime-settings.test.js.map +0 -1
- package/dist/test/api-admin-gate.test.d.ts +0 -2
- package/dist/test/api-admin-gate.test.d.ts.map +0 -1
- package/dist/test/api-admin-gate.test.js +0 -116
- package/dist/test/api-admin-gate.test.js.map +0 -1
- package/dist/test/assistant-persist-refusal.test.d.ts +0 -2
- package/dist/test/assistant-persist-refusal.test.d.ts.map +0 -1
- package/dist/test/assistant-persist-refusal.test.js +0 -63
- package/dist/test/assistant-persist-refusal.test.js.map +0 -1
- package/dist/test/batched-wake-locus.test.d.ts +0 -2
- package/dist/test/batched-wake-locus.test.d.ts.map +0 -1
- package/dist/test/batched-wake-locus.test.js +0 -166
- package/dist/test/batched-wake-locus.test.js.map +0 -1
- package/dist/test/busy-agent-scheduler.test.d.ts +0 -2
- package/dist/test/busy-agent-scheduler.test.d.ts.map +0 -1
- package/dist/test/busy-agent-scheduler.test.js +0 -92
- package/dist/test/busy-agent-scheduler.test.js.map +0 -1
- package/dist/test/channel-incoming-targeting.test.d.ts +0 -2
- package/dist/test/channel-incoming-targeting.test.d.ts.map +0 -1
- package/dist/test/channel-incoming-targeting.test.js +0 -81
- package/dist/test/channel-incoming-targeting.test.js.map +0 -1
- package/dist/test/channel-label-history.test.d.ts +0 -2
- package/dist/test/channel-label-history.test.d.ts.map +0 -1
- package/dist/test/channel-label-history.test.js +0 -424
- package/dist/test/channel-label-history.test.js.map +0 -1
- package/dist/test/channel-lifecycle-provenance.test.d.ts +0 -2
- package/dist/test/channel-lifecycle-provenance.test.d.ts.map +0 -1
- package/dist/test/channel-lifecycle-provenance.test.js +0 -47
- package/dist/test/channel-lifecycle-provenance.test.js.map +0 -1
- package/dist/test/channel-registry-routing.test.d.ts +0 -2
- package/dist/test/channel-registry-routing.test.d.ts.map +0 -1
- package/dist/test/channel-registry-routing.test.js +0 -446
- package/dist/test/channel-registry-routing.test.js.map +0 -1
- package/dist/test/channel-registry-typing.test.d.ts +0 -2
- package/dist/test/channel-registry-typing.test.d.ts.map +0 -1
- package/dist/test/channel-registry-typing.test.js +0 -91
- package/dist/test/channel-registry-typing.test.js.map +0 -1
- package/dist/test/channels-changed-respond-first.test.d.ts +0 -2
- package/dist/test/channels-changed-respond-first.test.d.ts.map +0 -1
- package/dist/test/channels-changed-respond-first.test.js +0 -74
- package/dist/test/channels-changed-respond-first.test.js.map +0 -1
- package/dist/test/checkpoint-attribution.test.d.ts +0 -2
- package/dist/test/checkpoint-attribution.test.d.ts.map +0 -1
- package/dist/test/checkpoint-attribution.test.js +0 -200
- package/dist/test/checkpoint-attribution.test.js.map +0 -1
- package/dist/test/code-execution.test.d.ts +0 -11
- package/dist/test/code-execution.test.d.ts.map +0 -1
- package/dist/test/code-execution.test.js +0 -1272
- package/dist/test/code-execution.test.js.map +0 -1
- package/dist/test/component-defaults.test.d.ts +0 -2
- package/dist/test/component-defaults.test.d.ts.map +0 -1
- package/dist/test/component-defaults.test.js +0 -54
- package/dist/test/component-defaults.test.js.map +0 -1
- package/dist/test/conversation-fork-injection-scoping.test.d.ts +0 -2
- package/dist/test/conversation-fork-injection-scoping.test.d.ts.map +0 -1
- package/dist/test/conversation-fork-injection-scoping.test.js +0 -200
- package/dist/test/conversation-fork-injection-scoping.test.js.map +0 -1
- package/dist/test/conversation-router.test.d.ts +0 -2
- package/dist/test/conversation-router.test.d.ts.map +0 -1
- package/dist/test/conversation-router.test.js +0 -174
- package/dist/test/conversation-router.test.js.map +0 -1
- package/dist/test/conversation-routing.test.d.ts +0 -7
- package/dist/test/conversation-routing.test.d.ts.map +0 -1
- package/dist/test/conversation-routing.test.js +0 -387
- package/dist/test/conversation-routing.test.js.map +0 -1
- package/dist/test/deferred-wake-integrity.test.d.ts +0 -29
- package/dist/test/deferred-wake-integrity.test.d.ts.map +0 -1
- package/dist/test/deferred-wake-integrity.test.js +0 -320
- package/dist/test/deferred-wake-integrity.test.js.map +0 -1
- package/dist/test/discord-awareness-outbox.test.d.ts +0 -2
- package/dist/test/discord-awareness-outbox.test.d.ts.map +0 -1
- package/dist/test/discord-awareness-outbox.test.js +0 -267
- package/dist/test/discord-awareness-outbox.test.js.map +0 -1
- package/dist/test/discord-history-delete-window.test.d.ts +0 -2
- package/dist/test/discord-history-delete-window.test.d.ts.map +0 -1
- package/dist/test/discord-history-delete-window.test.js +0 -81
- package/dist/test/discord-history-delete-window.test.js.map +0 -1
- package/dist/test/discord-history-sync.test.d.ts +0 -2
- package/dist/test/discord-history-sync.test.d.ts.map +0 -1
- package/dist/test/discord-history-sync.test.js +0 -56
- package/dist/test/discord-history-sync.test.js.map +0 -1
- package/dist/test/ephemeral-settle.test.d.ts +0 -2
- package/dist/test/ephemeral-settle.test.d.ts.map +0 -1
- package/dist/test/ephemeral-settle.test.js +0 -354
- package/dist/test/ephemeral-settle.test.js.map +0 -1
- package/dist/test/event-gate-passthrough.test.d.ts +0 -15
- package/dist/test/event-gate-passthrough.test.d.ts.map +0 -1
- package/dist/test/event-gate-passthrough.test.js +0 -289
- package/dist/test/event-gate-passthrough.test.js.map +0 -1
- package/dist/test/event-gate-policy-mutation.test.d.ts +0 -2
- package/dist/test/event-gate-policy-mutation.test.d.ts.map +0 -1
- package/dist/test/event-gate-policy-mutation.test.js +0 -137
- package/dist/test/event-gate-policy-mutation.test.js.map +0 -1
- package/dist/test/event-gate-rate-limit.test.d.ts +0 -2
- package/dist/test/event-gate-rate-limit.test.d.ts.map +0 -1
- package/dist/test/event-gate-rate-limit.test.js +0 -627
- package/dist/test/event-gate-rate-limit.test.js.map +0 -1
- package/dist/test/event-gate-script.test.d.ts +0 -2
- package/dist/test/event-gate-script.test.d.ts.map +0 -1
- package/dist/test/event-gate-script.test.js +0 -95
- package/dist/test/event-gate-script.test.js.map +0 -1
- package/dist/test/event-gate-selfwake.test.d.ts +0 -15
- package/dist/test/event-gate-selfwake.test.d.ts.map +0 -1
- package/dist/test/event-gate-selfwake.test.js +0 -125
- package/dist/test/event-gate-selfwake.test.js.map +0 -1
- package/dist/test/event-gate-tags.test.d.ts +0 -2
- package/dist/test/event-gate-tags.test.d.ts.map +0 -1
- package/dist/test/event-gate-tags.test.js +0 -76
- package/dist/test/event-gate-tags.test.js.map +0 -1
- package/dist/test/event-gate.test.d.ts +0 -2
- package/dist/test/event-gate.test.d.ts.map +0 -1
- package/dist/test/event-gate.test.js +0 -919
- package/dist/test/event-gate.test.js.map +0 -1
- package/dist/test/explicit-prose-routing.test.d.ts +0 -11
- package/dist/test/explicit-prose-routing.test.d.ts.map +0 -1
- package/dist/test/explicit-prose-routing.test.js +0 -1394
- package/dist/test/explicit-prose-routing.test.js.map +0 -1
- package/dist/test/framework.test.d.ts +0 -5
- package/dist/test/framework.test.d.ts.map +0 -1
- package/dist/test/framework.test.js +0 -1048
- package/dist/test/framework.test.js.map +0 -1
- package/dist/test/gather-context-timeout.test.d.ts +0 -2
- package/dist/test/gather-context-timeout.test.d.ts.map +0 -1
- package/dist/test/gather-context-timeout.test.js +0 -120
- package/dist/test/gather-context-timeout.test.js.map +0 -1
- package/dist/test/health-snapshot.test.d.ts +0 -2
- package/dist/test/health-snapshot.test.d.ts.map +0 -1
- package/dist/test/health-snapshot.test.js +0 -74
- package/dist/test/health-snapshot.test.js.map +0 -1
- package/dist/test/helpers/coalescing-fixture.d.ts +0 -72
- package/dist/test/helpers/coalescing-fixture.d.ts.map +0 -1
- package/dist/test/helpers/coalescing-fixture.js +0 -146
- package/dist/test/helpers/coalescing-fixture.js.map +0 -1
- package/dist/test/helpers/coalescing-kill-child.d.ts +0 -2
- package/dist/test/helpers/coalescing-kill-child.d.ts.map +0 -1
- package/dist/test/helpers/coalescing-kill-child.js +0 -24
- package/dist/test/helpers/coalescing-kill-child.js.map +0 -1
- package/dist/test/helpers/mock-membrane.d.ts +0 -53
- package/dist/test/helpers/mock-membrane.d.ts.map +0 -1
- package/dist/test/helpers/mock-membrane.js +0 -168
- package/dist/test/helpers/mock-membrane.js.map +0 -1
- package/dist/test/helpers/pytc-stop-rows.d.ts +0 -11
- package/dist/test/helpers/pytc-stop-rows.d.ts.map +0 -1
- package/dist/test/helpers/pytc-stop-rows.js +0 -143
- package/dist/test/helpers/pytc-stop-rows.js.map +0 -1
- package/dist/test/helpers/quiesce-crash-child.d.ts +0 -2
- package/dist/test/helpers/quiesce-crash-child.d.ts.map +0 -1
- package/dist/test/helpers/quiesce-crash-child.js +0 -156
- package/dist/test/helpers/quiesce-crash-child.js.map +0 -1
- package/dist/test/history-module-overview.test.d.ts +0 -2
- package/dist/test/history-module-overview.test.d.ts.map +0 -1
- package/dist/test/history-module-overview.test.js +0 -711
- package/dist/test/history-module-overview.test.js.map +0 -1
- package/dist/test/history-module-realstore.test.d.ts +0 -2
- package/dist/test/history-module-realstore.test.d.ts.map +0 -1
- package/dist/test/history-module-realstore.test.js +0 -363
- package/dist/test/history-module-realstore.test.js.map +0 -1
- package/dist/test/history-module-semantic.test.d.ts +0 -2
- package/dist/test/history-module-semantic.test.d.ts.map +0 -1
- package/dist/test/history-module-semantic.test.js +0 -213
- package/dist/test/history-module-semantic.test.js.map +0 -1
- package/dist/test/history-module-ux.test.d.ts +0 -2
- package/dist/test/history-module-ux.test.d.ts.map +0 -1
- package/dist/test/history-module-ux.test.js +0 -304
- package/dist/test/history-module-ux.test.js.map +0 -1
- package/dist/test/history-module.test.d.ts +0 -2
- package/dist/test/history-module.test.d.ts.map +0 -1
- package/dist/test/history-module.test.js +0 -619
- package/dist/test/history-module.test.js.map +0 -1
- package/dist/test/history-semantic-review-findings.test.d.ts +0 -2
- package/dist/test/history-semantic-review-findings.test.d.ts.map +0 -1
- package/dist/test/history-semantic-review-findings.test.js +0 -338
- package/dist/test/history-semantic-review-findings.test.js.map +0 -1
- package/dist/test/history-semantic-sync-converges.test.d.ts +0 -2
- package/dist/test/history-semantic-sync-converges.test.d.ts.map +0 -1
- package/dist/test/history-semantic-sync-converges.test.js +0 -109
- package/dist/test/history-semantic-sync-converges.test.js.map +0 -1
- package/dist/test/host-quiesce.test.d.ts +0 -2
- package/dist/test/host-quiesce.test.d.ts.map +0 -1
- package/dist/test/host-quiesce.test.js +0 -863
- package/dist/test/host-quiesce.test.js.map +0 -1
- package/dist/test/inference-exhaustion-rewind.test.d.ts +0 -2
- package/dist/test/inference-exhaustion-rewind.test.d.ts.map +0 -1
- package/dist/test/inference-exhaustion-rewind.test.js +0 -309
- package/dist/test/inference-exhaustion-rewind.test.js.map +0 -1
- package/dist/test/inference-failure-bounds.test.d.ts +0 -2
- package/dist/test/inference-failure-bounds.test.d.ts.map +0 -1
- package/dist/test/inference-failure-bounds.test.js +0 -1201
- package/dist/test/inference-failure-bounds.test.js.map +0 -1
- package/dist/test/inference-failure-observability.test.d.ts +0 -2
- package/dist/test/inference-failure-observability.test.d.ts.map +0 -1
- package/dist/test/inference-failure-observability.test.js +0 -84
- package/dist/test/inference-failure-observability.test.js.map +0 -1
- package/dist/test/journal-tool.test.d.ts +0 -2
- package/dist/test/journal-tool.test.d.ts.map +0 -1
- package/dist/test/journal-tool.test.js +0 -33
- package/dist/test/journal-tool.test.js.map +0 -1
- package/dist/test/kv-unified-open-flight-retry.test.d.ts +0 -2
- package/dist/test/kv-unified-open-flight-retry.test.d.ts.map +0 -1
- package/dist/test/kv-unified-open-flight-retry.test.js +0 -189
- package/dist/test/kv-unified-open-flight-retry.test.js.map +0 -1
- package/dist/test/kv-unified-wiring.test.d.ts +0 -2
- package/dist/test/kv-unified-wiring.test.d.ts.map +0 -1
- package/dist/test/kv-unified-wiring.test.js +0 -95
- package/dist/test/kv-unified-wiring.test.js.map +0 -1
- package/dist/test/late-events-after-stop.test.d.ts +0 -2
- package/dist/test/late-events-after-stop.test.d.ts.map +0 -1
- package/dist/test/late-events-after-stop.test.js +0 -122
- package/dist/test/late-events-after-stop.test.js.map +0 -1
- package/dist/test/liveness-watchdog.test.d.ts +0 -2
- package/dist/test/liveness-watchdog.test.d.ts.map +0 -1
- package/dist/test/liveness-watchdog.test.js +0 -94
- package/dist/test/liveness-watchdog.test.js.map +0 -1
- package/dist/test/machine-close-provenance.test.d.ts +0 -2
- package/dist/test/machine-close-provenance.test.d.ts.map +0 -1
- package/dist/test/machine-close-provenance.test.js +0 -116
- package/dist/test/machine-close-provenance.test.js.map +0 -1
- package/dist/test/maintenance-timer.test.d.ts +0 -2
- package/dist/test/maintenance-timer.test.d.ts.map +0 -1
- package/dist/test/maintenance-timer.test.js +0 -265
- package/dist/test/maintenance-timer.test.js.map +0 -1
- package/dist/test/mcpl-access-provider.test.d.ts +0 -2
- package/dist/test/mcpl-access-provider.test.d.ts.map +0 -1
- package/dist/test/mcpl-access-provider.test.js +0 -20
- package/dist/test/mcpl-access-provider.test.js.map +0 -1
- package/dist/test/mcpl-awareness-barrier.test.d.ts +0 -2
- package/dist/test/mcpl-awareness-barrier.test.d.ts.map +0 -1
- package/dist/test/mcpl-awareness-barrier.test.js +0 -769
- package/dist/test/mcpl-awareness-barrier.test.js.map +0 -1
- package/dist/test/mcpl-capability-grant.test.d.ts +0 -10
- package/dist/test/mcpl-capability-grant.test.d.ts.map +0 -1
- package/dist/test/mcpl-capability-grant.test.js +0 -111
- package/dist/test/mcpl-capability-grant.test.js.map +0 -1
- package/dist/test/mcpl-capability-scoping.test.d.ts +0 -2
- package/dist/test/mcpl-capability-scoping.test.d.ts.map +0 -1
- package/dist/test/mcpl-capability-scoping.test.js +0 -266
- package/dist/test/mcpl-capability-scoping.test.js.map +0 -1
- package/dist/test/mcpl-child-env.test.d.ts +0 -2
- package/dist/test/mcpl-child-env.test.d.ts.map +0 -1
- package/dist/test/mcpl-child-env.test.js +0 -158
- package/dist/test/mcpl-child-env.test.js.map +0 -1
- package/dist/test/mcpl-coalescing.test.d.ts +0 -2
- package/dist/test/mcpl-coalescing.test.d.ts.map +0 -1
- package/dist/test/mcpl-coalescing.test.js +0 -1125
- package/dist/test/mcpl-coalescing.test.js.map +0 -1
- package/dist/test/mcpl-config-diagnostics.test.d.ts +0 -2
- package/dist/test/mcpl-config-diagnostics.test.d.ts.map +0 -1
- package/dist/test/mcpl-config-diagnostics.test.js +0 -452
- package/dist/test/mcpl-config-diagnostics.test.js.map +0 -1
- package/dist/test/mcpl-empty-content.test.d.ts +0 -2
- package/dist/test/mcpl-empty-content.test.d.ts.map +0 -1
- package/dist/test/mcpl-empty-content.test.js +0 -368
- package/dist/test/mcpl-empty-content.test.js.map +0 -1
- package/dist/test/mcpl-gate-roundtrip.test.d.ts +0 -2
- package/dist/test/mcpl-gate-roundtrip.test.d.ts.map +0 -1
- package/dist/test/mcpl-gate-roundtrip.test.js +0 -285
- package/dist/test/mcpl-gate-roundtrip.test.js.map +0 -1
- package/dist/test/mcpl-list-status.test.d.ts +0 -2
- package/dist/test/mcpl-list-status.test.d.ts.map +0 -1
- package/dist/test/mcpl-list-status.test.js +0 -82
- package/dist/test/mcpl-list-status.test.js.map +0 -1
- package/dist/test/mcpl-manifest-changed.test.d.ts +0 -2
- package/dist/test/mcpl-manifest-changed.test.d.ts.map +0 -1
- package/dist/test/mcpl-manifest-changed.test.js +0 -178
- package/dist/test/mcpl-manifest-changed.test.js.map +0 -1
- package/dist/test/mcpl-push-convert.test.d.ts +0 -2
- package/dist/test/mcpl-push-convert.test.d.ts.map +0 -1
- package/dist/test/mcpl-push-convert.test.js +0 -42
- package/dist/test/mcpl-push-convert.test.js.map +0 -1
- package/dist/test/mcpl-reconnect-events.test.d.ts +0 -2
- package/dist/test/mcpl-reconnect-events.test.d.ts.map +0 -1
- package/dist/test/mcpl-reconnect-events.test.js +0 -144
- package/dist/test/mcpl-reconnect-events.test.js.map +0 -1
- package/dist/test/mcpl-reconnect-reregistration.test.d.ts +0 -2
- package/dist/test/mcpl-reconnect-reregistration.test.d.ts.map +0 -1
- package/dist/test/mcpl-reconnect-reregistration.test.js +0 -236
- package/dist/test/mcpl-reconnect-reregistration.test.js.map +0 -1
- package/dist/test/mcpl-reference-fetcher.test.d.ts +0 -2
- package/dist/test/mcpl-reference-fetcher.test.d.ts.map +0 -1
- package/dist/test/mcpl-reference-fetcher.test.js +0 -427
- package/dist/test/mcpl-reference-fetcher.test.js.map +0 -1
- package/dist/test/mcpl-reference-fields.test.d.ts +0 -2
- package/dist/test/mcpl-reference-fields.test.d.ts.map +0 -1
- package/dist/test/mcpl-reference-fields.test.js +0 -149
- package/dist/test/mcpl-reference-fields.test.js.map +0 -1
- package/dist/test/mcpl-request-timeout.test.d.ts +0 -2
- package/dist/test/mcpl-request-timeout.test.d.ts.map +0 -1
- package/dist/test/mcpl-request-timeout.test.js +0 -138
- package/dist/test/mcpl-request-timeout.test.js.map +0 -1
- package/dist/test/mcpl-runtime-lifecycle.test.d.ts +0 -7
- package/dist/test/mcpl-runtime-lifecycle.test.d.ts.map +0 -1
- package/dist/test/mcpl-runtime-lifecycle.test.js +0 -142
- package/dist/test/mcpl-runtime-lifecycle.test.js.map +0 -1
- package/dist/test/mcpl-tool-class-listing.test.d.ts +0 -2
- package/dist/test/mcpl-tool-class-listing.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-class-listing.test.js +0 -147
- package/dist/test/mcpl-tool-class-listing.test.js.map +0 -1
- package/dist/test/mcpl-tool-classes.test.d.ts +0 -7
- package/dist/test/mcpl-tool-classes.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-classes.test.js +0 -80
- package/dist/test/mcpl-tool-classes.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts +0 -2
- package/dist/test/mcpl-tool-lifecycle-e2e.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-e2e.test.js +0 -237
- package/dist/test/mcpl-tool-lifecycle-e2e.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts +0 -11
- package/dist/test/mcpl-tool-lifecycle-emitter.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-emitter.test.js +0 -412
- package/dist/test/mcpl-tool-lifecycle-emitter.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-script.test.d.ts +0 -2
- package/dist/test/mcpl-tool-lifecycle-script.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle-script.test.js +0 -288
- package/dist/test/mcpl-tool-lifecycle-script.test.js.map +0 -1
- package/dist/test/mcpl-tool-lifecycle.test.d.ts +0 -11
- package/dist/test/mcpl-tool-lifecycle.test.d.ts.map +0 -1
- package/dist/test/mcpl-tool-lifecycle.test.js +0 -270
- package/dist/test/mcpl-tool-lifecycle.test.js.map +0 -1
- package/dist/test/mcpl-ws-transport.test.d.ts +0 -2
- package/dist/test/mcpl-ws-transport.test.d.ts.map +0 -1
- package/dist/test/mcpl-ws-transport.test.js +0 -258
- package/dist/test/mcpl-ws-transport.test.js.map +0 -1
- package/dist/test/module-context-integration.test.d.ts +0 -18
- package/dist/test/module-context-integration.test.d.ts.map +0 -1
- package/dist/test/module-context-integration.test.js +0 -181
- package/dist/test/module-context-integration.test.js.map +0 -1
- package/dist/test/offline-recovery-branch.test.d.ts +0 -2
- package/dist/test/offline-recovery-branch.test.d.ts.map +0 -1
- package/dist/test/offline-recovery-branch.test.js +0 -226
- package/dist/test/offline-recovery-branch.test.js.map +0 -1
- package/dist/test/operator-surgery.test.d.ts +0 -2
- package/dist/test/operator-surgery.test.d.ts.map +0 -1
- package/dist/test/operator-surgery.test.js +0 -398
- package/dist/test/operator-surgery.test.js.map +0 -1
- package/dist/test/ops-alert.test.d.ts +0 -2
- package/dist/test/ops-alert.test.d.ts.map +0 -1
- package/dist/test/ops-alert.test.js +0 -153
- package/dist/test/ops-alert.test.js.map +0 -1
- package/dist/test/overbudget-drain-breaker.test.d.ts +0 -2
- package/dist/test/overbudget-drain-breaker.test.d.ts.map +0 -1
- package/dist/test/overbudget-drain-breaker.test.js +0 -197
- package/dist/test/overbudget-drain-breaker.test.js.map +0 -1
- package/dist/test/per-agent-delivery.test.d.ts +0 -2
- package/dist/test/per-agent-delivery.test.d.ts.map +0 -1
- package/dist/test/per-agent-delivery.test.js +0 -108
- package/dist/test/per-agent-delivery.test.js.map +0 -1
- package/dist/test/physical-window-restart.test.d.ts +0 -14
- package/dist/test/physical-window-restart.test.d.ts.map +0 -1
- package/dist/test/physical-window-restart.test.js +0 -222
- package/dist/test/physical-window-restart.test.js.map +0 -1
- package/dist/test/placed-reaction-baseline.test.d.ts +0 -2
- package/dist/test/placed-reaction-baseline.test.d.ts.map +0 -1
- package/dist/test/placed-reaction-baseline.test.js +0 -312
- package/dist/test/placed-reaction-baseline.test.js.map +0 -1
- package/dist/test/present-while-acting.test.d.ts +0 -19
- package/dist/test/present-while-acting.test.d.ts.map +0 -1
- package/dist/test/present-while-acting.test.js +0 -706
- package/dist/test/present-while-acting.test.js.map +0 -1
- package/dist/test/prose-segments.test.d.ts +0 -2
- package/dist/test/prose-segments.test.d.ts.map +0 -1
- package/dist/test/prose-segments.test.js +0 -52
- package/dist/test/prose-segments.test.js.map +0 -1
- package/dist/test/prose-stream-router.test.d.ts +0 -2
- package/dist/test/prose-stream-router.test.d.ts.map +0 -1
- package/dist/test/prose-stream-router.test.js +0 -171
- package/dist/test/prose-stream-router.test.js.map +0 -1
- package/dist/test/provider-acceleration-cooldown.test.d.ts +0 -2
- package/dist/test/provider-acceleration-cooldown.test.d.ts.map +0 -1
- package/dist/test/provider-acceleration-cooldown.test.js +0 -435
- package/dist/test/provider-acceleration-cooldown.test.js.map +0 -1
- package/dist/test/provider-waits.test.d.ts +0 -2
- package/dist/test/provider-waits.test.d.ts.map +0 -1
- package/dist/test/provider-waits.test.js +0 -2196
- package/dist/test/provider-waits.test.js.map +0 -1
- package/dist/test/puppet-tool-call.test.d.ts +0 -2
- package/dist/test/puppet-tool-call.test.d.ts.map +0 -1
- package/dist/test/puppet-tool-call.test.js +0 -224
- package/dist/test/puppet-tool-call.test.js.map +0 -1
- package/dist/test/puppet-turn-reservation.test.d.ts +0 -2
- package/dist/test/puppet-turn-reservation.test.d.ts.map +0 -1
- package/dist/test/puppet-turn-reservation.test.js +0 -139
- package/dist/test/puppet-turn-reservation.test.js.map +0 -1
- package/dist/test/reaction-baseline-platform.test.d.ts +0 -2
- package/dist/test/reaction-baseline-platform.test.d.ts.map +0 -1
- package/dist/test/reaction-baseline-platform.test.js +0 -124
- package/dist/test/reaction-baseline-platform.test.js.map +0 -1
- package/dist/test/record-journal.test.d.ts +0 -6
- package/dist/test/record-journal.test.d.ts.map +0 -1
- package/dist/test/record-journal.test.js +0 -269
- package/dist/test/record-journal.test.js.map +0 -1
- package/dist/test/refusal-reaction-baseline.test.d.ts +0 -2
- package/dist/test/refusal-reaction-baseline.test.d.ts.map +0 -1
- package/dist/test/refusal-reaction-baseline.test.js +0 -81
- package/dist/test/refusal-reaction-baseline.test.js.map +0 -1
- package/dist/test/refusal-rewind.test.d.ts +0 -2
- package/dist/test/refusal-rewind.test.d.ts.map +0 -1
- package/dist/test/refusal-rewind.test.js +0 -108
- package/dist/test/refusal-rewind.test.js.map +0 -1
- package/dist/test/refusal-single-call.test.d.ts +0 -2
- package/dist/test/refusal-single-call.test.d.ts.map +0 -1
- package/dist/test/refusal-single-call.test.js +0 -177
- package/dist/test/refusal-single-call.test.js.map +0 -1
- package/dist/test/release-changelog.test.d.ts +0 -2
- package/dist/test/release-changelog.test.d.ts.map +0 -1
- package/dist/test/release-changelog.test.js +0 -159
- package/dist/test/release-changelog.test.js.map +0 -1
- package/dist/test/same-round-think-policy.test.d.ts +0 -2
- package/dist/test/same-round-think-policy.test.d.ts.map +0 -1
- package/dist/test/same-round-think-policy.test.js +0 -853
- package/dist/test/same-round-think-policy.test.js.map +0 -1
- package/dist/test/save-recent-image.test.d.ts +0 -26
- package/dist/test/save-recent-image.test.d.ts.map +0 -1
- package/dist/test/save-recent-image.test.js +0 -974
- package/dist/test/save-recent-image.test.js.map +0 -1
- package/dist/test/shutdown-errors.test.d.ts +0 -2
- package/dist/test/shutdown-errors.test.d.ts.map +0 -1
- package/dist/test/shutdown-errors.test.js +0 -662
- package/dist/test/shutdown-errors.test.js.map +0 -1
- package/dist/test/silent-heartbeat-rows.test.d.ts +0 -2
- package/dist/test/silent-heartbeat-rows.test.d.ts.map +0 -1
- package/dist/test/silent-heartbeat-rows.test.js +0 -451
- package/dist/test/silent-heartbeat-rows.test.js.map +0 -1
- package/dist/test/silent-heartbeat.test.d.ts +0 -2
- package/dist/test/silent-heartbeat.test.d.ts.map +0 -1
- package/dist/test/silent-heartbeat.test.js +0 -165
- package/dist/test/silent-heartbeat.test.js.map +0 -1
- package/dist/test/state-scaling-e2e.test.d.ts +0 -22
- package/dist/test/state-scaling-e2e.test.d.ts.map +0 -1
- package/dist/test/state-scaling-e2e.test.js +0 -206
- package/dist/test/state-scaling-e2e.test.js.map +0 -1
- package/dist/test/state-scaling.test.d.ts +0 -12
- package/dist/test/state-scaling.test.d.ts.map +0 -1
- package/dist/test/state-scaling.test.js +0 -251
- package/dist/test/state-scaling.test.js.map +0 -1
- package/dist/test/stop-with-work-in-flight.test.d.ts +0 -23
- package/dist/test/stop-with-work-in-flight.test.d.ts.map +0 -1
- package/dist/test/stop-with-work-in-flight.test.js +0 -672
- package/dist/test/stop-with-work-in-flight.test.js.map +0 -1
- package/dist/test/surgery-marks-receipt.test.d.ts +0 -2
- package/dist/test/surgery-marks-receipt.test.d.ts.map +0 -1
- package/dist/test/surgery-marks-receipt.test.js +0 -540
- package/dist/test/surgery-marks-receipt.test.js.map +0 -1
- package/dist/test/thinking-token-stamp.test.d.ts +0 -12
- package/dist/test/thinking-token-stamp.test.d.ts.map +0 -1
- package/dist/test/thinking-token-stamp.test.js +0 -129
- package/dist/test/thinking-token-stamp.test.js.map +0 -1
- package/dist/test/timezone.test.d.ts +0 -2
- package/dist/test/timezone.test.d.ts.map +0 -1
- package/dist/test/timezone.test.js +0 -18
- package/dist/test/timezone.test.js.map +0 -1
- package/dist/test/tool-batch-hook.test.d.ts +0 -8
- package/dist/test/tool-batch-hook.test.d.ts.map +0 -1
- package/dist/test/tool-batch-hook.test.js +0 -275
- package/dist/test/tool-batch-hook.test.js.map +0 -1
- package/dist/test/tool-policy.test.d.ts +0 -2
- package/dist/test/tool-policy.test.d.ts.map +0 -1
- package/dist/test/tool-policy.test.js +0 -51
- package/dist/test/tool-policy.test.js.map +0 -1
- package/dist/test/tool-presentation.test.d.ts +0 -2
- package/dist/test/tool-presentation.test.d.ts.map +0 -1
- package/dist/test/tool-presentation.test.js +0 -268
- package/dist/test/tool-presentation.test.js.map +0 -1
- package/dist/test/tool-result-content.test.d.ts +0 -2
- package/dist/test/tool-result-content.test.d.ts.map +0 -1
- package/dist/test/tool-result-content.test.js +0 -37
- package/dist/test/tool-result-content.test.js.map +0 -1
- package/dist/test/tool-result-guard.test.d.ts +0 -2
- package/dist/test/tool-result-guard.test.d.ts.map +0 -1
- package/dist/test/tool-result-guard.test.js +0 -3607
- package/dist/test/tool-result-guard.test.js.map +0 -1
- package/dist/test/tool-result-history.test.d.ts +0 -7
- package/dist/test/tool-result-history.test.d.ts.map +0 -1
- package/dist/test/tool-result-history.test.js +0 -156
- package/dist/test/tool-result-history.test.js.map +0 -1
- package/dist/test/tool-result-spill.test.d.ts +0 -13
- package/dist/test/tool-result-spill.test.d.ts.map +0 -1
- package/dist/test/tool-result-spill.test.js +0 -586
- package/dist/test/tool-result-spill.test.js.map +0 -1
- package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts +0 -2
- package/dist/test/tool-wrapper-prose-guard-integration.test.d.ts.map +0 -1
- package/dist/test/tool-wrapper-prose-guard-integration.test.js +0 -485
- package/dist/test/tool-wrapper-prose-guard-integration.test.js.map +0 -1
- package/dist/test/tool-wrapper-prose-guard.test.d.ts +0 -2
- package/dist/test/tool-wrapper-prose-guard.test.d.ts.map +0 -1
- package/dist/test/tool-wrapper-prose-guard.test.js +0 -34
- package/dist/test/tool-wrapper-prose-guard.test.js.map +0 -1
- package/dist/test/tools-observe-parser-conformance.test.d.ts +0 -2
- package/dist/test/tools-observe-parser-conformance.test.d.ts.map +0 -1
- package/dist/test/tools-observe-parser-conformance.test.js +0 -129
- package/dist/test/tools-observe-parser-conformance.test.js.map +0 -1
- package/dist/test/trunk-channel-routing.test.d.ts +0 -19
- package/dist/test/trunk-channel-routing.test.d.ts.map +0 -1
- package/dist/test/trunk-channel-routing.test.js +0 -329
- package/dist/test/trunk-channel-routing.test.js.map +0 -1
- package/dist/test/tune-out-e2e.test.d.ts +0 -2
- package/dist/test/tune-out-e2e.test.d.ts.map +0 -1
- package/dist/test/tune-out-e2e.test.js +0 -142
- package/dist/test/tune-out-e2e.test.js.map +0 -1
- package/dist/test/tune-out-gate-composition.test.d.ts +0 -2
- package/dist/test/tune-out-gate-composition.test.d.ts.map +0 -1
- package/dist/test/tune-out-gate-composition.test.js +0 -221
- package/dist/test/tune-out-gate-composition.test.js.map +0 -1
- package/dist/test/tune-out-lifecycle.test.d.ts +0 -2
- package/dist/test/tune-out-lifecycle.test.d.ts.map +0 -1
- package/dist/test/tune-out-lifecycle.test.js +0 -121
- package/dist/test/tune-out-lifecycle.test.js.map +0 -1
- package/dist/test/turn-trigger-provenance.test.d.ts +0 -2
- package/dist/test/turn-trigger-provenance.test.d.ts.map +0 -1
- package/dist/test/turn-trigger-provenance.test.js +0 -137
- package/dist/test/turn-trigger-provenance.test.js.map +0 -1
- package/dist/test/unconvertible-tool-result.test.d.ts +0 -2
- package/dist/test/unconvertible-tool-result.test.d.ts.map +0 -1
- package/dist/test/unconvertible-tool-result.test.js +0 -358
- package/dist/test/unconvertible-tool-result.test.js.map +0 -1
- package/dist/test/usage-accounting.test.d.ts +0 -2
- package/dist/test/usage-accounting.test.d.ts.map +0 -1
- package/dist/test/usage-accounting.test.js +0 -13
- package/dist/test/usage-accounting.test.js.map +0 -1
- package/dist/test/usage-tracker.test.d.ts +0 -2
- package/dist/test/usage-tracker.test.d.ts.map +0 -1
- package/dist/test/usage-tracker.test.js +0 -129
- package/dist/test/usage-tracker.test.js.map +0 -1
- package/dist/test/utils-surface.test.d.ts +0 -2
- package/dist/test/utils-surface.test.d.ts.map +0 -1
- package/dist/test/utils-surface.test.js +0 -145
- package/dist/test/utils-surface.test.js.map +0 -1
- package/dist/test/workspace-branch-continuation.test.d.ts +0 -15
- package/dist/test/workspace-branch-continuation.test.d.ts.map +0 -1
- package/dist/test/workspace-branch-continuation.test.js +0 -183
- package/dist/test/workspace-branch-continuation.test.js.map +0 -1
- package/dist/test/workspace-materialize-freshness.test.d.ts +0 -16
- package/dist/test/workspace-materialize-freshness.test.d.ts.map +0 -1
- package/dist/test/workspace-materialize-freshness.test.js +0 -252
- package/dist/test/workspace-materialize-freshness.test.js.map +0 -1
- package/dist/test/workspace-path-containment.test.d.ts +0 -19
- package/dist/test/workspace-path-containment.test.d.ts.map +0 -1
- package/dist/test/workspace-path-containment.test.js +0 -91
- package/dist/test/workspace-path-containment.test.js.map +0 -1
- package/dist/test/workspace-read-file-from-disk.test.d.ts +0 -17
- package/dist/test/workspace-read-file-from-disk.test.d.ts.map +0 -1
- package/dist/test/workspace-read-file-from-disk.test.js +0 -174
- package/dist/test/workspace-read-file-from-disk.test.js.map +0 -1
- package/dist/test/workspace-read-image.test.d.ts +0 -2
- package/dist/test/workspace-read-image.test.d.ts.map +0 -1
- package/dist/test/workspace-read-image.test.js +0 -597
- package/dist/test/workspace-read-image.test.js.map +0 -1
- package/dist/test/workspace-read-text.test.d.ts +0 -2
- package/dist/test/workspace-read-text.test.d.ts.map +0 -1
- package/dist/test/workspace-read-text.test.js +0 -101
- package/dist/test/workspace-read-text.test.js.map +0 -1
- package/dist/test/workspace-restore-order.test.d.ts +0 -16
- package/dist/test/workspace-restore-order.test.d.ts.map +0 -1
- package/dist/test/workspace-restore-order.test.js +0 -140
- package/dist/test/workspace-restore-order.test.js.map +0 -1
- package/dist/test/workspace-three-way.test.d.ts +0 -12
- package/dist/test/workspace-three-way.test.d.ts.map +0 -1
- package/dist/test/workspace-three-way.test.js +0 -3194
- package/dist/test/workspace-three-way.test.js.map +0 -1
- package/dist/test/workspace-watcher.test.d.ts +0 -2
- package/dist/test/workspace-watcher.test.d.ts.map +0 -1
- package/dist/test/workspace-watcher.test.js +0 -281
- package/dist/test/workspace-watcher.test.js.map +0 -1
- package/dist/test/xml-round-persist.test.d.ts +0 -19
- package/dist/test/xml-round-persist.test.d.ts.map +0 -1
- package/dist/test/xml-round-persist.test.js +0 -235
- package/dist/test/xml-round-persist.test.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
package/src/prose-segments.ts
CHANGED
|
@@ -10,26 +10,40 @@
|
|
|
10
10
|
* collapsing those distinct messages into one (item 4). This helper instead
|
|
11
11
|
* yields each contiguous run of text — the segments a surface should deliver as
|
|
12
12
|
* separate, ordered messages. Contiguous text blocks merge into one segment;
|
|
13
|
-
* `tool_use` / `tool_result` blocks are segment boundaries
|
|
13
|
+
* `tool_use` / `tool_result` blocks are segment boundaries, as are XML tool
|
|
14
|
+
* mode's `tool_attempt` / `tool_notice` (a refused attempt and the harness's
|
|
15
|
+
* notice end a round just as a call and its results do); empty or
|
|
14
16
|
* whitespace-only runs are dropped.
|
|
15
17
|
*/
|
|
16
18
|
|
|
17
19
|
import type { ContentBlock } from '@animalabs/membrane';
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
/**
|
|
22
|
+
* The runs exactly as written: contiguous text blocks joined with a newline,
|
|
23
|
+
* nothing trimmed. Whitespace-only runs are dropped. Held drafts keep these,
|
|
24
|
+
* so a draft's words (indentation included) are the resident's own, byte for
|
|
25
|
+
* byte; speech routes each run trimmed of surrounding whitespace.
|
|
26
|
+
*/
|
|
27
|
+
export function splitProseRuns(content: readonly ContentBlock[]): string[] {
|
|
28
|
+
const runs: string[] = [];
|
|
21
29
|
let buf: string[] = [];
|
|
22
30
|
|
|
23
31
|
const flush = (): void => {
|
|
24
|
-
const
|
|
25
|
-
if (
|
|
32
|
+
const run = buf.join('\n');
|
|
33
|
+
if (run.trim()) runs.push(run);
|
|
26
34
|
buf = [];
|
|
27
35
|
};
|
|
28
36
|
|
|
29
37
|
for (const block of content) {
|
|
30
|
-
|
|
38
|
+
const type = block.type as string;
|
|
39
|
+
if (type === 'text') {
|
|
31
40
|
buf.push((block as ContentBlock & { type: 'text' }).text);
|
|
32
|
-
} else if (
|
|
41
|
+
} else if (
|
|
42
|
+
type === 'tool_use' ||
|
|
43
|
+
type === 'tool_result' ||
|
|
44
|
+
type === 'tool_attempt' ||
|
|
45
|
+
type === 'tool_notice'
|
|
46
|
+
) {
|
|
33
47
|
flush();
|
|
34
48
|
}
|
|
35
49
|
// Other block types (thinking, redacted_thinking, image, …) are neither
|
|
@@ -38,5 +52,34 @@ export function splitProseSegments(content: readonly ContentBlock[]): string[] {
|
|
|
38
52
|
}
|
|
39
53
|
flush();
|
|
40
54
|
|
|
41
|
-
return
|
|
55
|
+
return runs;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* A turn's content without the prose of some of its tool rounds, the turn's
|
|
60
|
+
* rounds counted from 0 in order. A round's prose is its text
|
|
61
|
+
* before its calls, and a round starts at the first block after the previous
|
|
62
|
+
* round's `tool_result` blocks. So a round with no prose still counts, two
|
|
63
|
+
* calls of one round (their `tool_use` blocks come before any result) stay
|
|
64
|
+
* one round, and a round is found by its place, whatever its text holds.
|
|
65
|
+
* Other rounds' text, every non-text block and the text after the last round
|
|
66
|
+
* stay.
|
|
67
|
+
*/
|
|
68
|
+
export function withoutRoundsProse(
|
|
69
|
+
content: readonly ContentBlock[],
|
|
70
|
+
rounds: ReadonlySet<number>,
|
|
71
|
+
): ContentBlock[] {
|
|
72
|
+
let round = 0;
|
|
73
|
+
let afterResults = false;
|
|
74
|
+
return content.filter((block) => {
|
|
75
|
+
if (block.type === 'tool_result') {
|
|
76
|
+
afterResults = true;
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
if (afterResults) {
|
|
80
|
+
round++;
|
|
81
|
+
afterResults = false;
|
|
82
|
+
}
|
|
83
|
+
return !(block.type === 'text' && rounds.has(round));
|
|
84
|
+
});
|
|
42
85
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { JsStore } from '@animalabs/chronicle';
|
|
2
|
-
import { ContextManager } from '@animalabs/context-manager';
|
|
2
|
+
import { ContextManager, continuesBody, type BodyShard } from '@animalabs/context-manager';
|
|
3
|
+
import { removeStoredInterval } from '../stored-removal.js';
|
|
4
|
+
import { firstFreeBranchName } from '../branch-names.js';
|
|
3
5
|
import {
|
|
4
6
|
DEFAULT_DISCORD_AWARENESS_EMOJI,
|
|
5
7
|
DiscordAwarenessOutbox,
|
|
@@ -21,6 +23,7 @@ export interface OfflineRecoveryBranchOptions {
|
|
|
21
23
|
suppressMessageIds?: string[];
|
|
22
24
|
/** Inclusive context-order ranges between Discord message endpoints. */
|
|
23
25
|
suppressRanges?: Array<{ fromMessageId: string; toMessageId: string }>;
|
|
26
|
+
/** Defaults to `recovery/{agentName}/{ms}`, or with `-2`, `-3`, … appended when the store already holds that name. */
|
|
24
27
|
branchName?: string;
|
|
25
28
|
/** Defaults to the primary-agent namespace `agents/{agentName}`. */
|
|
26
29
|
namespace?: string;
|
|
@@ -160,8 +163,9 @@ export async function createOfflineRecoveryBranch(
|
|
|
160
163
|
refs = dedupeDiscordRefs([...refs, ...suppression.refs]);
|
|
161
164
|
|
|
162
165
|
const sourceBranch = store.currentBranch().name;
|
|
166
|
+
const held = new Set(store.listBranches().map((branch) => branch.name));
|
|
163
167
|
const targetBranch = options.branchName
|
|
164
|
-
?? `recovery/${options.agentName}/${Date.now()}
|
|
168
|
+
?? firstFreeBranchName(`recovery/${options.agentName}/${Date.now()}`, (name) => held.has(name));
|
|
165
169
|
if (targetBranch === sourceBranch) {
|
|
166
170
|
throw new Error('Recovery branch name must differ from the active source branch');
|
|
167
171
|
}
|
|
@@ -202,11 +206,12 @@ export async function createOfflineRecoveryBranch(
|
|
|
202
206
|
const createdBranch = contextManager.branchAt(target.id, targetBranch);
|
|
203
207
|
try {
|
|
204
208
|
await contextManager.switchBranch(createdBranch);
|
|
205
|
-
//
|
|
206
|
-
//
|
|
209
|
+
// Each interval is removed by its messages' ids, so the order doesn't
|
|
210
|
+
// change the result. removeStoredInterval takes a single message outside
|
|
211
|
+
// any body through removeMessage, and a shard or a longer interval as a
|
|
212
|
+
// range, which refuses one that splits a body.
|
|
207
213
|
for (const interval of [...suppression.intervals].reverse()) {
|
|
208
|
-
|
|
209
|
-
else contextManager.removeMessages(interval.fromId, interval.toId);
|
|
214
|
+
removeStoredInterval(contextManager, interval.fromId, interval.toId);
|
|
210
215
|
}
|
|
211
216
|
if (batch) outbox.activate(batch.id);
|
|
212
217
|
} catch (error) {
|
|
@@ -238,9 +243,7 @@ interface SuppressionInterval {
|
|
|
238
243
|
|
|
239
244
|
interface MessageLocation {
|
|
240
245
|
first: number;
|
|
241
|
-
last: number;
|
|
242
246
|
firstId: StoredWindowMessage['id'];
|
|
243
|
-
lastId: StoredWindowMessage['id'];
|
|
244
247
|
/** Usually one run; multiple runs tolerate duplicate external metadata. */
|
|
245
248
|
runs: SuppressionInterval[];
|
|
246
249
|
}
|
|
@@ -299,14 +302,15 @@ function validateAnchorBoundary(
|
|
|
299
302
|
total: number,
|
|
300
303
|
target: StoredWindowMessage,
|
|
301
304
|
): void {
|
|
302
|
-
|
|
303
|
-
if (!groupId || targetIndex + 1 >= total) return;
|
|
305
|
+
if (targetIndex + 1 >= total) return;
|
|
304
306
|
const next = contextManager.getMessageWindow(targetIndex + 1, 1, {
|
|
305
307
|
resolveBlobs: false,
|
|
306
|
-
}).messages[0]
|
|
307
|
-
|
|
308
|
+
}).messages[0];
|
|
309
|
+
// A body continues only into a later shard of the same ingestion: a
|
|
310
|
+
// reposted document shares its group id but starts a body of its own.
|
|
311
|
+
if (continuesBody(target as BodyShard, next as BodyShard | undefined)) {
|
|
308
312
|
throw new Error(
|
|
309
|
-
`Recovery anchor ${String(target.id)} splits body group ${
|
|
313
|
+
`Recovery anchor ${String(target.id)} splits body group ${(target as BodyShard).bodyGroupId}; choose its final shard.`,
|
|
310
314
|
);
|
|
311
315
|
}
|
|
312
316
|
}
|
|
@@ -321,7 +325,9 @@ function validateRemovalIntegrity(
|
|
|
321
325
|
index >= interval.start && index <= interval.end);
|
|
322
326
|
const toolUses = new Map<string, boolean>();
|
|
323
327
|
const toolResults = new Map<string, boolean>();
|
|
324
|
-
|
|
328
|
+
// The message before, in store order: a selection splits a body when a
|
|
329
|
+
// message continuing the one before it lands on the other side.
|
|
330
|
+
let previous: { message: BodyShard; removed: boolean } | null = null;
|
|
325
331
|
|
|
326
332
|
for (let offset = 0; offset < total; offset += RECOVERY_SCAN_WINDOW) {
|
|
327
333
|
const messages = contextManager.getMessageWindow(
|
|
@@ -332,16 +338,14 @@ function validateRemovalIntegrity(
|
|
|
332
338
|
for (let i = 0; i < messages.length; i++) {
|
|
333
339
|
const index = offset + i;
|
|
334
340
|
const isRemoved = removed(index);
|
|
335
|
-
const message = messages[i]
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
);
|
|
342
|
-
}
|
|
343
|
-
groupMembership.set(message.bodyGroupId, isRemoved);
|
|
341
|
+
const message = messages[i];
|
|
342
|
+
const shard = message as BodyShard;
|
|
343
|
+
if (previous && previous.removed !== isRemoved && continuesBody(previous.message, shard)) {
|
|
344
|
+
throw new Error(
|
|
345
|
+
`Recovery selection splits body group ${shard.bodyGroupId}; adjust the anchor or suppression boundary.`,
|
|
346
|
+
);
|
|
344
347
|
}
|
|
348
|
+
previous = { message: shard, removed: isRemoved };
|
|
345
349
|
for (const rawBlock of message.content) {
|
|
346
350
|
const block = rawBlock as { type?: unknown; id?: unknown; toolUseId?: unknown };
|
|
347
351
|
if (block.type === 'tool_use' && typeof block.id === 'string') {
|
|
@@ -402,9 +406,7 @@ function buildSuppressionPlan(
|
|
|
402
406
|
};
|
|
403
407
|
locations.set(externalId, {
|
|
404
408
|
first: index,
|
|
405
|
-
last: index,
|
|
406
409
|
firstId: messages[i].id,
|
|
407
|
-
lastId: messages[i].id,
|
|
408
410
|
runs: [run],
|
|
409
411
|
});
|
|
410
412
|
} else {
|
|
@@ -420,8 +422,6 @@ function buildSuppressionPlan(
|
|
|
420
422
|
toId: messages[i].id,
|
|
421
423
|
});
|
|
422
424
|
}
|
|
423
|
-
location.last = index;
|
|
424
|
-
location.lastId = messages[i].id;
|
|
425
425
|
}
|
|
426
426
|
}
|
|
427
427
|
}
|
|
@@ -444,12 +444,19 @@ function buildSuppressionPlan(
|
|
|
444
444
|
const to = locations.get(range.toMessageId)!;
|
|
445
445
|
const earlier = from.first <= to.first ? from : to;
|
|
446
446
|
const later = from.first <= to.first ? to : from;
|
|
447
|
+
// What's between the two messages, after the earlier one began and
|
|
448
|
+
// before the later one began: from the earlier one's first stored copy
|
|
449
|
+
// through the later one's first. Each end is every copy of it besides,
|
|
450
|
+
// as a single suppression is, so a copy stored outside that span (a
|
|
451
|
+
// write cut short and retried later) is taken on its own, and nothing
|
|
452
|
+
// else stored after the later one began is taken.
|
|
447
453
|
intervals.push({
|
|
448
454
|
start: earlier.first,
|
|
449
|
-
end: later.
|
|
455
|
+
end: later.first,
|
|
450
456
|
fromId: earlier.firstId,
|
|
451
|
-
toId: later.
|
|
457
|
+
toId: later.firstId,
|
|
452
458
|
});
|
|
459
|
+
for (const end of [from, to]) intervals.push(...end.runs.map((run) => ({ ...run })));
|
|
453
460
|
}
|
|
454
461
|
|
|
455
462
|
intervals.sort((a, b) => a.start - b.start || a.end - b.end);
|
package/src/safe-slice.ts
CHANGED
|
@@ -2,9 +2,17 @@
|
|
|
2
2
|
* Slice a string without splitting surrogate pairs.
|
|
3
3
|
*
|
|
4
4
|
* Regular String.prototype.slice can cut in the middle of a surrogate pair,
|
|
5
|
-
* producing invalid UTF-16.
|
|
5
|
+
* producing invalid UTF-16. Here no half of a pair faces a cut: a start on a
|
|
6
|
+
* low surrogate moves forward past it, and an end just after a high surrogate
|
|
7
|
+
* moves back before it, whether or not the other half is there. A start of 0
|
|
8
|
+
* and an end at or past the length cut nothing, so the string's own first and
|
|
9
|
+
* last units stay as they are.
|
|
6
10
|
*/
|
|
7
11
|
export function safeSlice(str: string, start: number, end: number): string {
|
|
12
|
+
// A low surrogate where the start cuts is a pair's second half, or a lone half: either way, skip it
|
|
13
|
+
const first = str.charCodeAt(start);
|
|
14
|
+
if (start > 0 && first >= 0xdc00 && first <= 0xdfff) start += 1;
|
|
15
|
+
|
|
8
16
|
if (end >= str.length) return str.slice(start);
|
|
9
17
|
|
|
10
18
|
// If we're about to cut between a high and low surrogate, back up one char
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { bodyBoundsIn, type BodyShard, type ContextManager, type MessageId } from '@animalabs/context-manager';
|
|
2
|
+
|
|
3
|
+
type StoredLike = BodyShard & { id: MessageId };
|
|
4
|
+
type Removals = Pick<ContextManager, 'removeMessage' | 'removeMessages'>;
|
|
5
|
+
|
|
6
|
+
/** Minimal read surface the live-surgery helpers need from a ContextManager. */
|
|
7
|
+
export interface SurgeryReadableCm {
|
|
8
|
+
getMessageCount(): number;
|
|
9
|
+
getMessageWindow(
|
|
10
|
+
offset: number,
|
|
11
|
+
limit: number,
|
|
12
|
+
opts?: { resolveBlobs?: boolean; alignToBodyGroups?: boolean },
|
|
13
|
+
): { messages: Array<{ id: unknown; bodyGroupId?: string }>; startIndex: number };
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const SURGERY_SCAN_WINDOW = 500;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Slot index of `messageId` on the active branch, or -1. Scans from the tail
|
|
20
|
+
* in blob-free windows: operator targets are almost always recent, and a
|
|
21
|
+
* full `getAllMessages()` re-inflates every attachment on the branch.
|
|
22
|
+
*/
|
|
23
|
+
export function locateMessageIndex(cm: SurgeryReadableCm, messageId: string): number {
|
|
24
|
+
const hit = locateMessageIndices(cm, new Set([messageId])).get(messageId);
|
|
25
|
+
return hit ? hit.index : -1;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Tail-first scan resolving many ids at once; stops as soon as all are found. */
|
|
29
|
+
export function locateMessageIndices(
|
|
30
|
+
cm: SurgeryReadableCm,
|
|
31
|
+
ids: Set<string>,
|
|
32
|
+
): Map<string, { index: number; bodyGroupId?: string }> {
|
|
33
|
+
const found = new Map<string, { index: number; bodyGroupId?: string }>();
|
|
34
|
+
const total = cm.getMessageCount();
|
|
35
|
+
for (let end = total; end > 0 && found.size < ids.size; end -= SURGERY_SCAN_WINDOW) {
|
|
36
|
+
const start = Math.max(0, end - SURGERY_SCAN_WINDOW);
|
|
37
|
+
const { messages, startIndex } = cm.getMessageWindow(start, end - start, { resolveBlobs: false });
|
|
38
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
39
|
+
const id = String(messages[i].id);
|
|
40
|
+
if (ids.has(id) && !found.has(id)) {
|
|
41
|
+
found.set(id, {
|
|
42
|
+
index: startIndex + i,
|
|
43
|
+
...(messages[i].bodyGroupId ? { bodyGroupId: messages[i].bodyGroupId } : {}),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return found;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Inclusive slot range of the body-group run containing `index` (the slot
|
|
53
|
+
* itself when it is not sharded). Delegates to the store's own
|
|
54
|
+
* `alignToBodyGroups` edge walk — one contiguity assumption, not two.
|
|
55
|
+
*/
|
|
56
|
+
export function bodyGroupRun(
|
|
57
|
+
cm: SurgeryReadableCm,
|
|
58
|
+
index: number,
|
|
59
|
+
): { from: number; to: number; fromId: string; toId: string; group: boolean } {
|
|
60
|
+
const win = cm.getMessageWindow(index, 1, { alignToBodyGroups: true, resolveBlobs: false });
|
|
61
|
+
const from = win.startIndex;
|
|
62
|
+
const to = win.startIndex + win.messages.length - 1;
|
|
63
|
+
return {
|
|
64
|
+
from,
|
|
65
|
+
to,
|
|
66
|
+
fromId: String(win.messages[0].id),
|
|
67
|
+
toId: String(win.messages[win.messages.length - 1].id),
|
|
68
|
+
group: win.messages[0].bodyGroupId !== undefined,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Remove the stored messages `first`..`last` (inclusive, in store order).
|
|
74
|
+
*
|
|
75
|
+
* A single message outside any body goes through `removeMessage`.
|
|
76
|
+
* context-manager's `removeMessage` refuses any message that carries a body
|
|
77
|
+
* group id, a one-shard body's included, so a shard, and any longer interval,
|
|
78
|
+
* goes through `removeMessages`, which refuses an interval that splits a
|
|
79
|
+
* body.
|
|
80
|
+
*/
|
|
81
|
+
export function removeStoredMessages(cm: Removals, first: StoredLike, last: StoredLike): void {
|
|
82
|
+
if (first.id === last.id && !first.bodyGroupId) {
|
|
83
|
+
cm.removeMessage(first.id);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
cm.removeMessages(first.id, last.id);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Remove one stored message by its id, with the rest of its body when it's
|
|
91
|
+
* in one: a module or a coalescer removes a message it added by the id
|
|
92
|
+
* `addMessage` returned, which for a long message stored in shards is its
|
|
93
|
+
* first shard's.
|
|
94
|
+
*/
|
|
95
|
+
export function removeStoredMessage(cm: ContextManager, id: MessageId): void {
|
|
96
|
+
const message = cm.getMessage(id) as StoredLike | null;
|
|
97
|
+
if (!message?.bodyGroupId) {
|
|
98
|
+
cm.removeMessage(id);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// Found in blob-free windows: a full read of the branch would inflate every
|
|
102
|
+
// attachment on it, once for each message a sweep removes.
|
|
103
|
+
const index = locateMessageIndex(cm, String(id));
|
|
104
|
+
if (index < 0) {
|
|
105
|
+
cm.removeMessage(id);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const run = bodyGroupRun(cm, index);
|
|
109
|
+
cm.removeMessages(run.fromId as MessageId, run.toId as MessageId);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** removeStoredMessages for an interval known by its ids. */
|
|
113
|
+
export function removeStoredInterval(cm: ContextManager, fromId: MessageId, toId: MessageId): void {
|
|
114
|
+
const first = cm.getMessage(fromId) as StoredLike | null;
|
|
115
|
+
removeStoredMessages(cm, first ?? { id: fromId }, { id: toId });
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* The first and last positions (inclusive) of the body that holds
|
|
120
|
+
* `messages[index]`, read the way context-manager 0.14.0 reads bodies
|
|
121
|
+
* (`continuesBody`, pairwise in store order). A message outside any body is a
|
|
122
|
+
* body of its own.
|
|
123
|
+
*/
|
|
124
|
+
export function bodyRangeIn(messages: readonly unknown[], index: number): { from: number; to: number } {
|
|
125
|
+
return bodyBoundsIn(messages as readonly (BodyShard | null | undefined)[], index);
|
|
126
|
+
}
|
package/src/tool-image-ledger.ts
CHANGED
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
29
|
import { createHash, randomBytes } from 'node:crypto';
|
|
30
|
+
import { REFERENCE_STUB_MAX_CHARS, referenceTypeLabel } from './mcpl/references.js';
|
|
30
31
|
import { safeSlice } from './safe-slice.js';
|
|
31
32
|
|
|
32
33
|
export interface RetainedToolImage {
|
|
@@ -189,8 +190,9 @@ function mintLedgerNonce(): string {
|
|
|
189
190
|
/** Grammar of a ref this module mints: `img_<ledger nonce>_<sequence>`. */
|
|
190
191
|
export const TOOL_IMAGE_REF_RE = /^img_[0-9a-z]+_\d+$/;
|
|
191
192
|
|
|
192
|
-
/** RFC 6838 type/subtype token characters (lowercased)
|
|
193
|
-
|
|
193
|
+
/** RFC 6838 type/subtype token characters (lowercased), each name at most
|
|
194
|
+
* 127 characters (its section 4.2); no parameters. */
|
|
195
|
+
const MEDIA_TYPE_ESSENCE_RE = /^[a-z0-9!#$&^_.+-]{1,127}\/[a-z0-9!#$&^_.+-]{1,127}$/;
|
|
194
196
|
export const FALLBACK_MEDIA_TYPE = 'application/octet-stream';
|
|
195
197
|
|
|
196
198
|
/**
|
|
@@ -228,21 +230,32 @@ export type ParsedImagePlaceholder =
|
|
|
228
230
|
/** The placeholder exactly as it appears in the text. */
|
|
229
231
|
text: string;
|
|
230
232
|
}
|
|
231
|
-
/** An RFC-005 reference stub whose
|
|
233
|
+
/** An RFC-005 reference stub whose text shows an image type — bytes live
|
|
232
234
|
* behind fetch_reference, never in this ledger. Occupies a slot so the
|
|
233
235
|
* index cannot slide past it. */
|
|
234
236
|
| {
|
|
235
237
|
kind: 'reference';
|
|
236
238
|
refId: string;
|
|
237
|
-
/**
|
|
238
|
-
|
|
239
|
+
/** The image type the stub shows, as a stub shows a type (sanitized and
|
|
240
|
+
* bounded), lowercased: the first `image/` token in its text, which can
|
|
241
|
+
* come from its name. */
|
|
242
|
+
mediaType: string;
|
|
239
243
|
offset: number;
|
|
240
244
|
/** The stub line exactly as it appears in the text. */
|
|
241
245
|
text: string;
|
|
242
246
|
};
|
|
243
247
|
|
|
244
|
-
|
|
245
|
-
|
|
248
|
+
/**
|
|
249
|
+
* `[image: image/png, ~691KB, ref img_k7x3q2_7]`. Each part is bounded by
|
|
250
|
+
* what formatToolImagePlaceholder writes, so text shaped like a placeholder
|
|
251
|
+
* but longer is no slot: a type and a subtype name at RFC 6838's 127
|
|
252
|
+
* characters each (normalizeMediaType writes none longer), and a size's
|
|
253
|
+
* number, a ledger nonce and a sequence at 16 characters each, a safe
|
|
254
|
+
* integer's digits.
|
|
255
|
+
*/
|
|
256
|
+
const PLACEHOLDER_RE = /\[image: ([a-z0-9!#$&^_.+-]{1,127}\/[a-z0-9!#$&^_.+-]{1,127}), (~?[\d.]{1,16}(?:B|KB|MB))(?:, ref (img_[0-9a-z]{1,16}_\d{1,16}))?\]/g;
|
|
257
|
+
/** `[ref_1_ab3d] cam.png — image/png, 1.2MB claimed — from tool result — …`
|
|
258
|
+
* (one line, at most REFERENCE_STUB_MAX_CHARS long: see parseImagePlaceholders). */
|
|
246
259
|
const REFERENCE_STUB_RE = /^\[(ref_[0-9a-z]+_[0-9a-z]+)\] ([^\n]*)$/gm;
|
|
247
260
|
const IMAGE_MIME_RE = /\bimage\/[a-z0-9!#$&^_.+-]+/i;
|
|
248
261
|
|
|
@@ -252,6 +265,13 @@ const IMAGE_MIME_RE = /\bimage\/[a-z0-9!#$&^_.+-]+/i;
|
|
|
252
265
|
* untrusted — a tool result can quote someone else's placeholder verbatim —
|
|
253
266
|
* so the caller MUST cross-check a resolved ref's provenance against the
|
|
254
267
|
* tool_result block it was found in before handing out bytes.
|
|
268
|
+
*
|
|
269
|
+
* Decided from the text alone, so a stored result counts the same however
|
|
270
|
+
* long ago it was written, across restarts and registry evictions. A
|
|
271
|
+
* reference stub is a slot when its text shows an image type, and a
|
|
272
|
+
* non-image reference is no slot. A line shaped like a stub but longer than
|
|
273
|
+
* buildReferenceStub writes (REFERENCE_STUB_MAX_CHARS) is quoted text and no
|
|
274
|
+
* slot either, so a slot's text is bounded wherever it is kept.
|
|
255
275
|
*/
|
|
256
276
|
export function parseImagePlaceholders(text: string): ParsedImagePlaceholder[] {
|
|
257
277
|
const out: ParsedImagePlaceholder[] = [];
|
|
@@ -259,43 +279,142 @@ export function parseImagePlaceholders(text: string): ParsedImagePlaceholder[] {
|
|
|
259
279
|
out.push({ kind: 'inline', mediaType: m[1]!, sizeLabel: m[2]!, ref: m[3] ?? null, offset: m.index ?? 0, text: m[0] });
|
|
260
280
|
}
|
|
261
281
|
for (const m of text.matchAll(REFERENCE_STUB_RE)) {
|
|
262
|
-
|
|
263
|
-
|
|
282
|
+
if (m[0].length > REFERENCE_STUB_MAX_CHARS) continue;
|
|
283
|
+
const shown = m[2]!.match(IMAGE_MIME_RE);
|
|
284
|
+
if (!shown) continue;
|
|
285
|
+
out.push({ kind: 'reference', refId: m[1]!, mediaType: referenceTypeLabel(shown[0]).toLowerCase(), offset: m.index ?? 0, text: m[0] });
|
|
264
286
|
}
|
|
265
287
|
out.sort((a, b) => a.offset - b.offset);
|
|
266
288
|
return out;
|
|
267
289
|
}
|
|
268
290
|
|
|
269
291
|
/**
|
|
270
|
-
*
|
|
271
|
-
*
|
|
272
|
-
*
|
|
273
|
-
*
|
|
274
|
-
*
|
|
275
|
-
*
|
|
276
|
-
*
|
|
277
|
-
*
|
|
278
|
-
*
|
|
279
|
-
*
|
|
292
|
+
* The most image slots a stored copy keeps past its cut: a bound on what it
|
|
293
|
+
* carries there, set at the ledger's entry limit, the most images it holds
|
|
294
|
+
* bytes for. Serializing a result retains its images in order before their
|
|
295
|
+
* placeholders are written, and every agent's ledger is built with the
|
|
296
|
+
* defaults, so once a result is stored a save can reach bytes for at most
|
|
297
|
+
* its newest DEFAULT_TOOL_IMAGE_LEDGER_MAX_ENTRIES images, fewer when the
|
|
298
|
+
* ledger's limit on held characters binds first, and an inline image older
|
|
299
|
+
* than those can only fail. Image stubs and quoted placeholders count toward
|
|
300
|
+
* the bound too, so where they follow a result's images past the cut, the
|
|
301
|
+
* newest slots kept can leave out an image whose bytes the ledger still
|
|
302
|
+
* holds.
|
|
303
|
+
*/
|
|
304
|
+
export const MAX_KEPT_IMAGE_SLOTS = DEFAULT_TOOL_IMAGE_LEDGER_MAX_ENTRIES;
|
|
305
|
+
|
|
306
|
+
/** The ranges `[start, end)` of a tool result's text that its live copy
|
|
307
|
+
* showed beside its images: each text block up to where the live copy cut it
|
|
308
|
+
* at the inline cap (toolResultCutAt), and every other block whole. They
|
|
309
|
+
* come in text order and never overlap, as the blocks do, and
|
|
310
|
+
* cutStoredToolResult relies on that. */
|
|
311
|
+
export type ShownRanges = ReadonlyArray<readonly [number, number]>;
|
|
312
|
+
|
|
313
|
+
/** A tool result's stored copy, cut at its inline cap. */
|
|
314
|
+
export interface StoredCut {
|
|
315
|
+
/** The text before the cut. */
|
|
316
|
+
head: string;
|
|
317
|
+
/** The image slots past the cut that the stored copy re-appends after its
|
|
318
|
+
* truncation notice, in text order: the newest MAX_KEPT_IMAGE_SLOTS of
|
|
319
|
+
* those the live copy showed. */
|
|
320
|
+
kept: string[];
|
|
321
|
+
/** How many image slots past the cut the live copy showed. */
|
|
322
|
+
fell: number;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Where a tool result's text longer than `cap` is cut: by its stored copy
|
|
327
|
+
* (cutStoredToolResult), by history's own truncation (truncateForHistory),
|
|
328
|
+
* and by its live copy, for each text block beside an image
|
|
329
|
+
* (tryNativeToolResultContent, framework.ts), so the stored copy and the live
|
|
330
|
+
* copy cut alike. The text's length when it isn't longer than `cap`.
|
|
331
|
+
*
|
|
332
|
+
* The cut is made at the cap, or before it when the cap would split a
|
|
333
|
+
* surrogate pair (safeSlice's rule), and that is where the moves back are
|
|
334
|
+
* measured from. It moves back to the start of a placeholder it would split,
|
|
335
|
+
* and then to the start of a stub-shaped line it would split when at most
|
|
336
|
+
* REFERENCE_STUB_MAX_CHARS of the line lie before it, since that part could
|
|
337
|
+
* still read as a slot. So no slot straddles the cut, and the text before it
|
|
338
|
+
* never ends in part of one. A longer part, which can't parse as a slot,
|
|
339
|
+
* stays before the cut. Each move back lands on a `[`, so it splits no pair.
|
|
280
340
|
*/
|
|
281
|
-
export function
|
|
282
|
-
|
|
283
|
-
let cutAt = cap;
|
|
284
|
-
|
|
285
|
-
|
|
341
|
+
export function toolResultCutAt(text: string, cap: number): number {
|
|
342
|
+
if (text.length <= cap) return text.length;
|
|
343
|
+
let cutAt = safeSlice(text, 0, cap).length;
|
|
344
|
+
// Neither grammar crosses a newline, so only the line holding the cut can
|
|
345
|
+
// be split; it is read whole, as the parser reads it.
|
|
346
|
+
const lineStart = text.lastIndexOf('\n', cutAt - 1) + 1;
|
|
347
|
+
const newline = text.indexOf('\n', cutAt);
|
|
348
|
+
const line = text.slice(lineStart, newline === -1 ? text.length : newline);
|
|
349
|
+
for (const m of line.matchAll(PLACEHOLDER_RE)) {
|
|
350
|
+
const start = lineStart + (m.index ?? 0);
|
|
351
|
+
if (start < cutAt && start + m[0].length > cutAt) cutAt = start;
|
|
286
352
|
}
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
}
|
|
353
|
+
for (const m of line.matchAll(REFERENCE_STUB_RE)) {
|
|
354
|
+
const start = lineStart + (m.index ?? 0);
|
|
355
|
+
if (start < cutAt && start + m[0].length > cutAt && cutAt - start <= REFERENCE_STUB_MAX_CHARS) cutAt = start;
|
|
356
|
+
}
|
|
357
|
+
return cutAt;
|
|
291
358
|
}
|
|
292
359
|
|
|
293
|
-
/**
|
|
294
|
-
*
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
360
|
+
/**
|
|
361
|
+
* Cut a tool result's text at its inline `cap` as its stored copy keeps it
|
|
362
|
+
* (toolResultCutAt): the stored copy keeps what the live copy showed. A text
|
|
363
|
+
* within the cap is all head, with nothing kept after it.
|
|
364
|
+
*
|
|
365
|
+
* `shown` is what the live copy showed beside the stored text: null when the
|
|
366
|
+
* live copy was the text itself, as for every result that carried no inline
|
|
367
|
+
* image. Then what the cut keeps is exactly what the resident saw, and
|
|
368
|
+
* nothing past it is kept (#403). A result that carried an inline image went
|
|
369
|
+
* to the model as native blocks (tryNativeToolResultContent, framework.ts),
|
|
370
|
+
* every image whatever the text's length, so its stored text is the only
|
|
371
|
+
* place save_recent_image's inventory finds them, and a slot dropped by the
|
|
372
|
+
* cut would be an image the resident saw that the index slides past (#104).
|
|
373
|
+
* The image slots past the cut that lie wholly within what the live copy
|
|
374
|
+
* showed are kept, the newest MAX_KEPT_IMAGE_SLOTS of them, since the
|
|
375
|
+
* inventory counts from the end.
|
|
376
|
+
*/
|
|
377
|
+
export function cutStoredToolResult(text: string, cap: number, shown: ShownRanges | null): StoredCut {
|
|
378
|
+
const cutAt = toolResultCutAt(text, cap);
|
|
379
|
+
const head = text.slice(0, cutAt);
|
|
380
|
+
if (shown === null) return { head, kept: [], fell: 0 };
|
|
381
|
+
// The slots and the ranges both come in text order, so one pass walks
|
|
382
|
+
// them together: a range that ends where a slot starts, or before, holds
|
|
383
|
+
// no later slot either.
|
|
384
|
+
const past: ParsedImagePlaceholder[] = [];
|
|
385
|
+
let r = 0;
|
|
386
|
+
for (const slot of parseImagePlaceholders(text)) {
|
|
387
|
+
if (slot.offset < cutAt) continue;
|
|
388
|
+
while (r < shown.length && shown[r]![1] <= slot.offset) r++;
|
|
389
|
+
const range = shown[r];
|
|
390
|
+
if (range && slot.offset >= range[0] && slot.offset + slot.text.length <= range[1]) past.push(slot);
|
|
391
|
+
}
|
|
392
|
+
return { head, kept: past.slice(-MAX_KEPT_IMAGE_SLOTS).map((slot) => slot.text), fell: past.length };
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/** What a stored copy re-appends after its truncation notice: the kept
|
|
396
|
+
* slots, each on its own line so a reference stub stays parseable, under a
|
|
397
|
+
* note saying how many fell past the cut, and how many of those were left
|
|
398
|
+
* out and aren't counted. Empty when none fell past the cut. */
|
|
399
|
+
export function formatKeptImageSlots(cut: StoredCut): string {
|
|
400
|
+
if (cut.fell === 0) return '';
|
|
401
|
+
const leftOut = cut.fell - cut.kept.length;
|
|
402
|
+
const note = leftOut === 0
|
|
403
|
+
? `${cut.fell} image slot(s) fell past the cut; kept here in order so save_recent_image still counts them:`
|
|
404
|
+
: `${cut.fell} image slot(s) fell past the cut. The last ${cut.kept.length} are kept here in order so `
|
|
405
|
+
+ `save_recent_image still counts them; the ${leftOut} before them are left out, and it doesn't count them:`;
|
|
406
|
+
return `\n[${note}]\n${cut.kept.join('\n')}`;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* The image slots a tool result's stored copy holds: its text's, or, when the
|
|
411
|
+
* text is longer than `cap`, those the cut keeps, in head and after the
|
|
412
|
+
* notice (cutStoredToolResult). The notice itself holds none. For counting a
|
|
413
|
+
* result before its stored copy is written, as it will count after.
|
|
414
|
+
*/
|
|
415
|
+
export function storedImageSlots(text: string, cap: number, shown: ShownRanges | null): ParsedImagePlaceholder[] {
|
|
416
|
+
const cut = cutStoredToolResult(text, cap, shown);
|
|
417
|
+
return parseImagePlaceholders(cut.head + formatKeptImageSlots(cut));
|
|
299
418
|
}
|
|
300
419
|
|
|
301
420
|
export function sha256Hex(bytes: Buffer): string {
|