@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
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
import type { ContextManager, StoredMessage } from '@animalabs/context-manager';
|
|
28
28
|
import type { ContentBlock } from '@animalabs/membrane';
|
|
29
|
+
import { safeSlice } from '../../safe-slice.js';
|
|
29
30
|
|
|
30
31
|
export interface SemanticIndexConfig {
|
|
31
32
|
/** Base URL of the embed-service, e.g. `http://100.90.161.34:8804`. */
|
|
@@ -104,6 +105,35 @@ export interface SearchResponse {
|
|
|
104
105
|
|
|
105
106
|
const PRIVATE_PROSE_TOOLS = new Set(['think', 'journal', 'skip_reply', 'private_note']);
|
|
106
107
|
|
|
108
|
+
/**
|
|
109
|
+
* The semantic index service's failure, said of the service alone: it didn't
|
|
110
|
+
* answer in time, couldn't be reached, cut its answer off, answered without
|
|
111
|
+
* what its request's caller reads, or answered with an HTTP error. `status` is
|
|
112
|
+
* the answer's HTTP status, and null where no whole answer came. Each caller
|
|
113
|
+
* says what that meant for its own work, a search or the background sync.
|
|
114
|
+
*/
|
|
115
|
+
export class EmbedServiceError extends Error {
|
|
116
|
+
constructor(message: string, readonly status: number | null) {
|
|
117
|
+
super(message);
|
|
118
|
+
this.name = 'EmbedServiceError';
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* What stopped a request reaching the service: fetch's cause, such as a
|
|
124
|
+
* refused connection. When several addresses were tried, as for a name like
|
|
125
|
+
* localhost with both an IPv6 and an IPv4 address, the cause is an
|
|
126
|
+
* AggregateError with no message of its own, and each address's error says it.
|
|
127
|
+
*/
|
|
128
|
+
function unreachedReason(e: unknown): string {
|
|
129
|
+
const cause = (e as { cause?: unknown } | null)?.cause;
|
|
130
|
+
if (cause instanceof AggregateError && !cause.message) {
|
|
131
|
+
const each = cause.errors.map((err) => (err instanceof Error ? err.message : String(err))).filter(Boolean);
|
|
132
|
+
if (each.length > 0) return each.join('; ');
|
|
133
|
+
}
|
|
134
|
+
return (cause instanceof Error && cause.message) || (e instanceof Error ? e.message : String(e));
|
|
135
|
+
}
|
|
136
|
+
|
|
107
137
|
export class SemanticIndexClient {
|
|
108
138
|
private readonly base: string;
|
|
109
139
|
private readonly ns: string;
|
|
@@ -114,21 +144,69 @@ export class SemanticIndexClient {
|
|
|
114
144
|
this.timeoutMs = cfg.requestTimeoutMs ?? 30_000;
|
|
115
145
|
}
|
|
116
146
|
|
|
117
|
-
|
|
147
|
+
/**
|
|
148
|
+
* A request's answer, as JSON. `expect` is what the caller reads of it: an
|
|
149
|
+
* answer without that, such as a web page at a wrong address, fails as
|
|
150
|
+
* one, with its status, since the service did answer.
|
|
151
|
+
*/
|
|
152
|
+
private async call<T>(
|
|
153
|
+
method: 'GET' | 'POST', path: string, body?: unknown, expect?: { what: string; is: (json: unknown) => boolean },
|
|
154
|
+
): Promise<T> {
|
|
118
155
|
const headers: Record<string, string> = { 'content-type': 'application/json' };
|
|
119
156
|
if (this.cfg.token) headers.authorization = `Bearer ${this.cfg.token}`;
|
|
120
157
|
const ctrl = new AbortController();
|
|
121
158
|
const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);
|
|
159
|
+
// The request's kind, for a message: search, upsert, delete or stats.
|
|
160
|
+
const request = path.slice(path.lastIndexOf('/') + 1);
|
|
161
|
+
// The timeout as the client used it: whole seconds, or else milliseconds.
|
|
162
|
+
const within = this.timeoutMs % 1000 === 0 ? `${this.timeoutMs / 1000} s` : `${this.timeoutMs} ms`;
|
|
122
163
|
try {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
164
|
+
let res: Response;
|
|
165
|
+
let text: string;
|
|
166
|
+
let answered = false;
|
|
167
|
+
try {
|
|
168
|
+
res = await fetch(`${this.base}${path}`, {
|
|
169
|
+
method, headers, body: body === undefined ? undefined : JSON.stringify(body), signal: ctrl.signal,
|
|
170
|
+
});
|
|
171
|
+
answered = true;
|
|
172
|
+
// An answer cut off after its status, or not finished within the
|
|
173
|
+
// timeout, counts as no answer. That's rare, and a stats or delete
|
|
174
|
+
// request that misses its 404 this way is made again on a later pass
|
|
175
|
+
// of the sync.
|
|
176
|
+
text = await res.text();
|
|
177
|
+
} catch (e) {
|
|
178
|
+
throw new EmbedServiceError(
|
|
179
|
+
answered
|
|
180
|
+
? ctrl.signal.aborted
|
|
181
|
+
? `the semantic index service's answer to the ${request} request didn't finish within ${within}`
|
|
182
|
+
: `the semantic index service's answer to the ${request} request was cut off (${unreachedReason(e)})`
|
|
183
|
+
: ctrl.signal.aborted
|
|
184
|
+
? `the semantic index service didn't answer the ${request} request within ${within}`
|
|
185
|
+
: `the semantic index service couldn't be reached for the ${request} request (${unreachedReason(e)})`,
|
|
186
|
+
null,
|
|
187
|
+
);
|
|
188
|
+
}
|
|
127
189
|
let json: unknown;
|
|
128
190
|
try { json = JSON.parse(text); } catch { json = undefined; }
|
|
129
191
|
if (!res.ok) {
|
|
130
|
-
|
|
131
|
-
|
|
192
|
+
// The service's message, or any other body, is quoted to at most its
|
|
193
|
+
// first 200 UTF-16 units, one fewer rather than end on half of a
|
|
194
|
+
// surrogate pair, and a quote that's cut ends in "…". A message that
|
|
195
|
+
// isn't text quotes the body instead.
|
|
196
|
+
const given = (json as { error?: { message?: unknown } } | undefined)?.error?.message;
|
|
197
|
+
const quoted = typeof given === 'string' ? given : text;
|
|
198
|
+
const cut = safeSlice(quoted, 0, 200);
|
|
199
|
+
const msg = cut.length < quoted.length ? `${cut}…` : cut;
|
|
200
|
+
throw new EmbedServiceError(
|
|
201
|
+
`the semantic index service answered the ${request} request with an error (HTTP ${res.status}${msg ? `: ${msg}` : ''})`,
|
|
202
|
+
res.status,
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
if (expect && !expect.is(json)) {
|
|
206
|
+
throw new EmbedServiceError(
|
|
207
|
+
`the semantic index service answered the ${request} request without ${expect.what} (HTTP ${res.status})`,
|
|
208
|
+
res.status,
|
|
209
|
+
);
|
|
132
210
|
}
|
|
133
211
|
return json as T;
|
|
134
212
|
} finally {
|
|
@@ -139,15 +217,17 @@ export class SemanticIndexClient {
|
|
|
139
217
|
/** Stats for this namespace; `null` when the namespace does not exist yet. */
|
|
140
218
|
async stats(): Promise<IndexStats | null> {
|
|
141
219
|
try {
|
|
142
|
-
return await this.call<IndexStats>('GET', `/v1/index/${this.ns}/stats
|
|
220
|
+
return await this.call<IndexStats>('GET', `/v1/index/${this.ns}/stats`, undefined, {
|
|
221
|
+
what: 'stats by kind', is: (json) => isObject((json as { by_kind?: unknown } | undefined)?.by_kind),
|
|
222
|
+
});
|
|
143
223
|
} catch (e) {
|
|
144
|
-
if (e instanceof
|
|
224
|
+
if (e instanceof EmbedServiceError && e.status === 404) return null;
|
|
145
225
|
throw e;
|
|
146
226
|
}
|
|
147
227
|
}
|
|
148
228
|
|
|
149
229
|
async upsert(items: IndexItem[]): Promise<{ inserted: number; updated: number; unchanged: number; count: number }> {
|
|
150
|
-
return this.call('POST', `/v1/index/${this.ns}/upsert`, { items });
|
|
230
|
+
return this.call('POST', `/v1/index/${this.ns}/upsert`, { items }, { what: 'a JSON object', is: isObject });
|
|
151
231
|
}
|
|
152
232
|
|
|
153
233
|
async delete(ids: string[]): Promise<{ deleted: number }> {
|
|
@@ -155,10 +235,29 @@ export class SemanticIndexClient {
|
|
|
155
235
|
}
|
|
156
236
|
|
|
157
237
|
async search(req: SearchRequest): Promise<SearchResponse> {
|
|
158
|
-
return this.call
|
|
238
|
+
return this.call('POST', `/v1/index/${this.ns}/search`, req, {
|
|
239
|
+
what: 'a list of hits, each with an id', is: (json) => {
|
|
240
|
+
const hits = (json as { hits?: unknown } | undefined)?.hits;
|
|
241
|
+
return Array.isArray(hits) && hits.every(isHit);
|
|
242
|
+
},
|
|
243
|
+
});
|
|
159
244
|
}
|
|
160
245
|
}
|
|
161
246
|
|
|
247
|
+
/** A JSON object: not null, and not a list. */
|
|
248
|
+
function isObject(json: unknown): boolean {
|
|
249
|
+
return typeof json === 'object' && json !== null && !Array.isArray(json);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* A hit as semantic_search needs one: an object with a string id, which it
|
|
254
|
+
* reads of every hit. Its ts and meta are read only for the hits it returns,
|
|
255
|
+
* and as far as they can be read.
|
|
256
|
+
*/
|
|
257
|
+
function isHit(hit: unknown): boolean {
|
|
258
|
+
return isObject(hit) && typeof (hit as { id?: unknown }).id === 'string';
|
|
259
|
+
}
|
|
260
|
+
|
|
162
261
|
/** Text to embed for one message, or '' when there is nothing worth indexing. */
|
|
163
262
|
export function messageIndexText(msg: StoredMessage, includePrivateTools = true): string {
|
|
164
263
|
const parts: string[] = [];
|
|
@@ -194,7 +293,7 @@ export function messageToItem(msg: StoredMessage, cfg: { includePrivateTools?: b
|
|
|
194
293
|
const tsMs = msg.timestamp.getTime();
|
|
195
294
|
return {
|
|
196
295
|
id: `msg:${String(msg.id)}`,
|
|
197
|
-
text: text
|
|
296
|
+
text: safeSlice(text, 0, cfg.maxChars ?? 32_000),
|
|
198
297
|
ts: tsMs / 1000,
|
|
199
298
|
channel: channelOf(msg),
|
|
200
299
|
kind: 'message',
|
|
@@ -221,7 +320,7 @@ export function summaryToItem(s: SummaryLike, cfg: { maxChars?: number }): Index
|
|
|
221
320
|
if (!text) return null;
|
|
222
321
|
return {
|
|
223
322
|
id: `sum:${s.id}`,
|
|
224
|
-
text: text
|
|
323
|
+
text: safeSlice(text, 0, cfg.maxChars ?? 32_000),
|
|
225
324
|
ts: s.startMs / 1000,
|
|
226
325
|
kind: 'summary',
|
|
227
326
|
level: s.level,
|
|
@@ -258,6 +357,11 @@ export class SemanticIndexer {
|
|
|
258
357
|
private readonly log: (msg: string) => void = () => {},
|
|
259
358
|
) {}
|
|
260
359
|
|
|
360
|
+
/** A line for the host's log, naming this indexer's index first, since a host can keep several. */
|
|
361
|
+
warn(line: string): void {
|
|
362
|
+
this.log(`[history/semantic] index ${JSON.stringify(this.cfg.namespace)}: ${line}`);
|
|
363
|
+
}
|
|
364
|
+
|
|
261
365
|
/**
|
|
262
366
|
* Edits and removals since the last successful sync. The time-cursor walk
|
|
263
367
|
* only revisits the overlap window, so an edit to an older message (its
|
|
@@ -271,7 +375,16 @@ export class SemanticIndexer {
|
|
|
271
375
|
private readonly editedIds = new Set<string>();
|
|
272
376
|
private readonly removedIds = new Set<string>();
|
|
273
377
|
private detach: (() => void) | null = null;
|
|
274
|
-
/**
|
|
378
|
+
/**
|
|
379
|
+
* Set once the service answers 404 to /delete in a pass whose /stats
|
|
380
|
+
* answered with stats, which shows the index is made, so the 404 means a
|
|
381
|
+
* build without the route. From then on, removals are dropped as they come
|
|
382
|
+
* and no pass calls /delete, until the host restarts or binds the module
|
|
383
|
+
* again, which makes a new indexer. A pass whose /stats answers 404 has no
|
|
384
|
+
* index to remove from and makes no /delete call; a /delete 404 in a pass
|
|
385
|
+
* whose /stats answered with something that isn't stats is re-queued like
|
|
386
|
+
* any other failure, since that answer doesn't show the index is made.
|
|
387
|
+
*/
|
|
275
388
|
private deleteUnsupported = false;
|
|
276
389
|
/** Called whenever the pending edit/remove sets change. */
|
|
277
390
|
onPendingChange: ((p: PendingChanges) => void) | null = null;
|
|
@@ -290,7 +403,7 @@ export class SemanticIndexer {
|
|
|
290
403
|
if (this.detach) return;
|
|
291
404
|
const on = (this.cm as { onMessage?: ContextManager['onMessage'] }).onMessage;
|
|
292
405
|
if (typeof on !== 'function') {
|
|
293
|
-
this.
|
|
406
|
+
this.warn("the context-manager has no onMessage, so edits and removals won't reach the index");
|
|
294
407
|
return;
|
|
295
408
|
}
|
|
296
409
|
this.detach = on.call(this.cm, (e) => {
|
|
@@ -323,8 +436,27 @@ export class SemanticIndexer {
|
|
|
323
436
|
const report: SyncReport = { pushed: 0, inserted: 0, updated: 0, unchanged: 0, more: false, messagesScanned: 0, summariesScanned: 0 };
|
|
324
437
|
if (this.backingOff) { report.more = true; return report; }
|
|
325
438
|
const batchSize = Math.min(256, Math.max(1, this.cfg.syncBatch ?? 128));
|
|
439
|
+
// Failures of the edits and removals phase, which don't end the pass, and a
|
|
440
|
+
// stats answer that isn't stats: lastError names each, ended or not.
|
|
441
|
+
const phaseErrors: string[] = [];
|
|
442
|
+
let notStats: EmbedServiceError | null = null;
|
|
326
443
|
try {
|
|
327
|
-
|
|
444
|
+
// A 2xx that isn't stats, such as a web page from a wrong route, gives no
|
|
445
|
+
// watermark: the pass walks from the start, as for a namespace that
|
|
446
|
+
// doesn't exist yet, and lastError names the answer. Every pass then
|
|
447
|
+
// starts over, and a history longer than a pass's budget is never
|
|
448
|
+
// walked to its end, so a pass whose budget runs out fails on that
|
|
449
|
+
// answer.
|
|
450
|
+
let stats: IndexStats | null = null;
|
|
451
|
+
try {
|
|
452
|
+
stats = await this.client.stats();
|
|
453
|
+
} catch (e) {
|
|
454
|
+
if (!(e instanceof EmbedServiceError && e.status !== null && e.status >= 200 && e.status < 300)) throw e;
|
|
455
|
+
notStats = e;
|
|
456
|
+
}
|
|
457
|
+
// /stats answered 404, which stats() reads as a namespace that doesn't
|
|
458
|
+
// exist: there's no index to remove from.
|
|
459
|
+
const noIndex = stats === null && notStats === null;
|
|
328
460
|
const msgWm = stats?.by_kind.message?.max_cursor ?? null;
|
|
329
461
|
const sumWm = stats?.by_kind.summary?.max_cursor ?? null;
|
|
330
462
|
let budget = maxItems;
|
|
@@ -340,14 +472,14 @@ export class SemanticIndexer {
|
|
|
340
472
|
// This phase fails on its own: a failure re-queues its ids, is logged
|
|
341
473
|
// and reported via lastError, and the tick falls through to summaries
|
|
342
474
|
// and the time walk, so one bad delete/upsert cannot freeze indexing.
|
|
343
|
-
let phaseError: string | null = null;
|
|
344
475
|
if (this.removedIds.size > 0 || this.editedIds.size > 0) {
|
|
345
476
|
const removed = [...this.removedIds];
|
|
346
477
|
// Edits spend the budget like any other upsert, so a large queue left
|
|
347
478
|
// by an outage cannot make a search's bounded catch-up unbounded; the
|
|
348
479
|
// rest stay queued for the next pass.
|
|
349
|
-
//
|
|
350
|
-
//
|
|
480
|
+
// An edit whose message is on the branch spends it, one edited down to
|
|
481
|
+
// nothing indexable too, even in a pass that makes no /delete call; one
|
|
482
|
+
// whose message left the branch is dropped for free.
|
|
351
483
|
this.removedIds.clear();
|
|
352
484
|
const edited: string[] = [];
|
|
353
485
|
const toDelete = removed.map((id) => `msg:${id}`);
|
|
@@ -367,22 +499,40 @@ export class SemanticIndexer {
|
|
|
367
499
|
if (item) toUpsert.push(item); else { toDelete.push(`msg:${id}`); blanked.push(id); }
|
|
368
500
|
}
|
|
369
501
|
if (this.editedIds.size > 0) report.more = true;
|
|
370
|
-
|
|
502
|
+
// The removals and blanked edits are dropped with no /delete call in
|
|
503
|
+
// two cases. With no index (/stats answered 404), there's nothing to
|
|
504
|
+
// remove, and the index this pass makes takes only what the store
|
|
505
|
+
// holds and can index, which leaves them out. Once the service is known
|
|
506
|
+
// to lack the route (deleteUnsupported), the index keeps them, and
|
|
507
|
+
// search-time checks (on-branch, still indexable) keep them out of
|
|
508
|
+
// results.
|
|
509
|
+
if (toDelete.length > 0 && !noIndex && !this.deleteUnsupported) {
|
|
371
510
|
try {
|
|
372
511
|
await this.client.delete(toDelete);
|
|
373
512
|
} catch (e) {
|
|
374
513
|
const msg = e instanceof Error ? e.message : String(e);
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
514
|
+
// What the delete held, by kind, for the warning.
|
|
515
|
+
const what = [
|
|
516
|
+
removed.length > 0 ? `${removed.length} removal(s)` : null,
|
|
517
|
+
blanked.length > 0 ? `${blanked.length} edit(s) down to nothing indexable` : null,
|
|
518
|
+
].filter((s): s is string => s !== null).join(' and ');
|
|
519
|
+
if (e instanceof EmbedServiceError && e.status === 404 && stats !== null) {
|
|
520
|
+
// This pass's /stats answered with stats, so the index is made
|
|
521
|
+
// and the 404 is the route's: a service build without /delete.
|
|
379
522
|
this.deleteUnsupported = true;
|
|
380
|
-
this.
|
|
523
|
+
this.warn(
|
|
524
|
+
`/delete answered 404, so the service lacks that route; dropping ${what}. Later removals and edits `
|
|
525
|
+
+ `down to nothing indexable are dropped too, until the host restarts or binds the history module `
|
|
526
|
+
+ `again: ${msg}`,
|
|
527
|
+
);
|
|
381
528
|
} else {
|
|
529
|
+
// Any other failure, and a 404 in a pass whose /stats answered
|
|
530
|
+
// with something that isn't stats, which doesn't show the index
|
|
531
|
+
// is made: re-queued, for a later pass.
|
|
382
532
|
for (const id of removed) this.removedIds.add(id);
|
|
383
533
|
for (const id of blanked) if (!this.removedIds.has(id)) this.editedIds.add(id);
|
|
384
|
-
|
|
385
|
-
this.
|
|
534
|
+
phaseErrors.push(msg);
|
|
535
|
+
this.warn(`delete failed, ${what} re-queued: ${msg}`);
|
|
386
536
|
}
|
|
387
537
|
}
|
|
388
538
|
}
|
|
@@ -395,8 +545,8 @@ export class SemanticIndexer {
|
|
|
395
545
|
} catch (e) {
|
|
396
546
|
const msg = e instanceof Error ? e.message : String(e);
|
|
397
547
|
for (const id of edited) if (!this.removedIds.has(id)) this.editedIds.add(id);
|
|
398
|
-
|
|
399
|
-
this.
|
|
548
|
+
phaseErrors.push(msg);
|
|
549
|
+
this.warn(`edit re-upsert failed, ${edited.length} edit(s) re-queued: ${msg}`);
|
|
400
550
|
}
|
|
401
551
|
this.pendingChanged();
|
|
402
552
|
}
|
|
@@ -458,16 +608,23 @@ export class SemanticIndexer {
|
|
|
458
608
|
fromMs = lastMs;
|
|
459
609
|
}
|
|
460
610
|
await flush();
|
|
461
|
-
|
|
611
|
+
if (notStats && report.more) throw notStats;
|
|
612
|
+
this.consecutiveFailures = 0; this.lastError = named(notStats?.message ?? null, ...phaseErrors); this.lastSyncAt = Date.now();
|
|
462
613
|
return report;
|
|
463
614
|
} catch (e) {
|
|
464
615
|
this.consecutiveFailures++;
|
|
465
616
|
const delay = Math.min(15 * 60_000, 5_000 * 2 ** Math.min(8, this.consecutiveFailures - 1));
|
|
466
617
|
this.backoffUntil = Date.now() + delay;
|
|
467
|
-
|
|
468
|
-
this.
|
|
618
|
+
const failure = e instanceof Error ? e.message : String(e);
|
|
619
|
+
this.lastError = named(failure, notStats?.message ?? null, ...phaseErrors);
|
|
620
|
+
this.warn(`sync failed (${this.consecutiveFailures}×, retry in ${Math.round(delay / 1000)}s): ${failure}`);
|
|
469
621
|
report.more = true;
|
|
470
622
|
return report;
|
|
471
623
|
}
|
|
472
624
|
}
|
|
473
625
|
}
|
|
626
|
+
|
|
627
|
+
/** Each failure a sync pass met, once, in the order given, for its lastError: null if none. */
|
|
628
|
+
function named(...failures: (string | null)[]): string | null {
|
|
629
|
+
return [...new Set(failures.filter((f): f is string => f !== null))].join('; ') || null;
|
|
630
|
+
}
|
package/src/modules/index.ts
CHANGED
|
@@ -30,7 +30,7 @@ export type {
|
|
|
30
30
|
SyncInput,
|
|
31
31
|
} from './workspace/index.js';
|
|
32
32
|
|
|
33
|
-
export { DiscordModule, DiscordJsClient } from './discord/index.js';
|
|
33
|
+
export { DiscordModule, DiscordJsClient, DiscordRefusal } from './discord/index.js';
|
|
34
34
|
export type { DiscordJsClientConfig } from './discord/index.js';
|
|
35
35
|
export type {
|
|
36
36
|
DiscordModuleConfig,
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../types/events.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* What a module answers for a tool name it doesn't route: there's no such
|
|
5
|
+
* tool, so nothing ran, and which tools the module has, read from its own
|
|
6
|
+
* getTools() so the list can't drift. The registry hands every `module--name`
|
|
7
|
+
* to its module, even one the module doesn't declare, since some modules route
|
|
8
|
+
* undeclared names on purpose, so this answer is the module's to give.
|
|
9
|
+
*/
|
|
10
|
+
export function unknownToolMessage(module: string, name: string, tools: readonly Pick<ToolDefinition, 'name'>[]): string {
|
|
11
|
+
const missing = `There's no tool "${module}--${name}", so nothing ran.`;
|
|
12
|
+
const names = tools.map((tool) => `${module}--${tool.name}`);
|
|
13
|
+
if (names.length === 0) return `${missing} The ${module} module has no tools of its own: every tool you can call is in your tool list.`;
|
|
14
|
+
if (names.length === 1) return `${missing} The ${module} module's one tool is ${names[0]}.`;
|
|
15
|
+
return `${missing} The ${module} module's tools are ${names.slice(0, -1).join(', ')} and ${names[names.length - 1]}.`;
|
|
16
|
+
}
|
|
@@ -48,9 +48,15 @@ export interface Fingerprint {
|
|
|
48
48
|
hashedAt: number;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
/**
|
|
52
|
+
* `mode`: the permission bits disk held (`st_mode & 0o777`). Evidence from
|
|
53
|
+
* before modes were recorded, or recorded after the kernel refused a
|
|
54
|
+
* widening of the workspace's own change, has none: a sync takes disk's mode
|
|
55
|
+
* in.
|
|
56
|
+
*/
|
|
51
57
|
export type Agreed =
|
|
52
58
|
| { kind: 'absent' }
|
|
53
|
-
| { kind: 'content'; hash: string; size: number; fp?: Fingerprint };
|
|
59
|
+
| { kind: 'content'; hash: string; size: number; fp?: Fingerprint; mode?: number };
|
|
54
60
|
|
|
55
61
|
export type Candidate = { kind: 'absent' } | { kind: 'content'; hash: string };
|
|
56
62
|
|
|
@@ -63,6 +69,21 @@ export interface Pending {
|
|
|
63
69
|
expect: Candidate;
|
|
64
70
|
/** Branch the intent was recorded on (an adoption's meaning is branch-relative). */
|
|
65
71
|
branchId: string;
|
|
72
|
+
/**
|
|
73
|
+
* For a write whose plan gives the file a mode: the mode it saw (`from`)
|
|
74
|
+
* and the one it gives (`to`); a write that creates the file records `to`
|
|
75
|
+
* for both. A push that goes on as our own narrowing push, stopped before
|
|
76
|
+
* its bytes, records that push's `from`, the old bytes' own mode, and the
|
|
77
|
+
* store's mode now, or where the store records none, the mode the stopped
|
|
78
|
+
* push narrowed to, whether or not it gives a mode itself. It narrows to
|
|
79
|
+
* `from & to` before the bytes and widens to `to` after them, so a stop
|
|
80
|
+
* leaves disk at one of those three, with the old bytes or the new, and
|
|
81
|
+
* those are the push's own. A file that has setuid or setgid
|
|
82
|
+
* when the write checks it loses them before the bytes too, a chmod that
|
|
83
|
+
* keeps the permission bits it has then, so a stop after that chmod alone
|
|
84
|
+
* leaves disk at the mode the write saw, less those bits.
|
|
85
|
+
*/
|
|
86
|
+
modes?: { from: number; to: number };
|
|
66
87
|
}
|
|
67
88
|
|
|
68
89
|
export interface Interrupted {
|
|
@@ -133,6 +154,21 @@ export function sameCandidate(a: Candidate, b: Candidate): boolean {
|
|
|
133
154
|
return a.kind === b.kind && (a.kind === 'absent' || a.hash === (b as { hash: string }).hash);
|
|
134
155
|
}
|
|
135
156
|
|
|
157
|
+
/** A record with no mode claimed: a content record's, and a pending intent's own modes and its prior's. */
|
|
158
|
+
function withoutModes(value: Physical): Physical {
|
|
159
|
+
if (value.kind === 'content' && value.mode !== undefined) {
|
|
160
|
+
const { mode: _mode, ...rest } = value;
|
|
161
|
+
return rest;
|
|
162
|
+
}
|
|
163
|
+
if (value.kind === 'pending') {
|
|
164
|
+
const { modes: _modes, ...intent } = value;
|
|
165
|
+
if (intent.prior?.kind !== 'content' || intent.prior.mode === undefined) return intent;
|
|
166
|
+
const { mode: _mode, ...prior } = intent.prior;
|
|
167
|
+
return { ...intent, prior };
|
|
168
|
+
}
|
|
169
|
+
return value;
|
|
170
|
+
}
|
|
171
|
+
|
|
136
172
|
export class DiskAgreement {
|
|
137
173
|
private readonly store: JsStore;
|
|
138
174
|
private readonly journal: RecordJournal<JournalEntry, Snapshot>;
|
|
@@ -145,10 +181,19 @@ export class DiskAgreement {
|
|
|
145
181
|
* place owes none (recordWalk).
|
|
146
182
|
*/
|
|
147
183
|
private unsynced = false;
|
|
184
|
+
/**
|
|
185
|
+
* Whether memory holds a whole state: false until a rebuild first runs to
|
|
186
|
+
* its end. A rebuild fills a new map and swaps it in only at its end, so
|
|
187
|
+
* one that throws partway leaves whatever whole state came before it.
|
|
188
|
+
*/
|
|
189
|
+
private whole = false;
|
|
190
|
+
/** Whether this host observes file modes (not on Windows): where it doesn't, no record it writes claims one. */
|
|
191
|
+
private readonly modesObserved: () => boolean;
|
|
148
192
|
|
|
149
|
-
constructor(store: JsStore) {
|
|
193
|
+
constructor(store: JsStore, opts: { modesObserved?: () => boolean } = {}) {
|
|
150
194
|
this.store = store;
|
|
151
195
|
this.journal = new RecordJournal<JournalEntry, Snapshot>(store, { type: DISK_AGREEMENT_RECORD_TYPE });
|
|
196
|
+
this.modesObserved = opts.modesObserved ?? (() => true);
|
|
152
197
|
}
|
|
153
198
|
|
|
154
199
|
/**
|
|
@@ -167,8 +212,10 @@ export class DiskAgreement {
|
|
|
167
212
|
* recorded (the store may hold it where this process can't read it back),
|
|
168
213
|
* and a decision from stale P can record what reopening contradicts, such
|
|
169
214
|
* as a conflict that stays after the right evidence is back. So until the
|
|
170
|
-
* store is reopened, no evidence is read
|
|
171
|
-
* every pass and tool call
|
|
215
|
+
* store is reopened, no evidence is read (but for rootIdentityForRead's
|
|
216
|
+
* one exception), written or checkpointed, and every pass and tool call
|
|
217
|
+
* that needs it fails. The same holds, the exception included, when the
|
|
218
|
+
* open's rebuild threw: there is no whole evidence to read.
|
|
172
219
|
*/
|
|
173
220
|
ensureReconciled(): void {
|
|
174
221
|
if (this.journal.needsReopen) {
|
|
@@ -177,6 +224,12 @@ export class DiskAgreement {
|
|
|
177
224
|
'an append to its journal failed inside the store, and the evidence may lack what it recorded',
|
|
178
225
|
);
|
|
179
226
|
}
|
|
227
|
+
if (!this.whole) {
|
|
228
|
+
throw new Error(
|
|
229
|
+
'Disk-agreement evidence is unavailable until the store is reopened, as at the next start: ' +
|
|
230
|
+
'reading it back from the store failed',
|
|
231
|
+
);
|
|
232
|
+
}
|
|
180
233
|
if (this.journal.needsReconcile) this.rebuild();
|
|
181
234
|
}
|
|
182
235
|
|
|
@@ -214,16 +267,24 @@ export class DiskAgreement {
|
|
|
214
267
|
const mount = replayed.get(entry.mount);
|
|
215
268
|
if (mount) apply(mount, entry);
|
|
216
269
|
}
|
|
217
|
-
|
|
270
|
+
// Filled apart and swapped in at the end, so an append that throws here
|
|
271
|
+
// leaves memory as it was, whole, rather than with the mounts after it
|
|
272
|
+
// missing. Nothing reaches that today: only an open with a moved mount
|
|
273
|
+
// appends here, the workspace opens each agreement once, and after the
|
|
274
|
+
// open a rebuild finds every mount's record and appends none.
|
|
275
|
+
const rebuilt = new Map<string, MountEvidence>();
|
|
218
276
|
for (const { name, root } of this.configured) {
|
|
219
277
|
const found = replayed.get(name);
|
|
220
278
|
if (found && sameRootPath(found.root, root)) {
|
|
221
|
-
|
|
279
|
+
rebuilt.set(name, found);
|
|
222
280
|
} else {
|
|
223
|
-
|
|
281
|
+
rebuilt.set(name, { root, paths: new Map(), walks: new Map() });
|
|
224
282
|
this.journal.append({ t: 'mount', mount: name, root });
|
|
225
283
|
}
|
|
226
284
|
}
|
|
285
|
+
this.mounts.clear();
|
|
286
|
+
for (const [name, mount] of rebuilt) this.mounts.set(name, mount);
|
|
287
|
+
this.whole = true;
|
|
227
288
|
}
|
|
228
289
|
|
|
229
290
|
/** The identity of the root this mount's evidence was gathered under, once any was. */
|
|
@@ -232,6 +293,25 @@ export class DiskAgreement {
|
|
|
232
293
|
return this.mounts.get(mount)?.identity;
|
|
233
294
|
}
|
|
234
295
|
|
|
296
|
+
/**
|
|
297
|
+
* The identity a disk read checks the mount's root against: the one in
|
|
298
|
+
* memory once memory is whole, in every state of the journal, and an error
|
|
299
|
+
* until then. It is the last identity whose append succeeded, since write()
|
|
300
|
+
* appends before it applies, and no reconcile can change it, since root
|
|
301
|
+
* entries are written without a sync; were one made durable, its failed
|
|
302
|
+
* sync would leave the identity from before it: an old one, which refuses
|
|
303
|
+
* the new root, or none, as for a mount with no recorded identity. This
|
|
304
|
+
* is the one exception to ensureReconciled's "no evidence is read": the
|
|
305
|
+
* layer stops reading so that a decision from stale evidence can't record
|
|
306
|
+
* what reopening contradicts, and a read records nothing. Refusing reads
|
|
307
|
+
* instead would stop every host read of the workspace's disk until a
|
|
308
|
+
* restart.
|
|
309
|
+
*/
|
|
310
|
+
rootIdentityForRead(mount: string): RootIdentity | undefined {
|
|
311
|
+
if (!this.whole) this.ensureReconciled(); // throws: there's no whole state to read
|
|
312
|
+
return this.mounts.get(mount)?.identity;
|
|
313
|
+
}
|
|
314
|
+
|
|
235
315
|
/**
|
|
236
316
|
* Record the root's identity just before the first evidence a mount gains:
|
|
237
317
|
* the caller saw it as the root while gathering that evidence. A no-op once
|
|
@@ -315,7 +395,8 @@ export class DiskAgreement {
|
|
|
315
395
|
/**
|
|
316
396
|
* Put back exactly the evidence a path had before an intent whose effect
|
|
317
397
|
* never touched it — whatever kind it was (agreed, pending, interrupted, or
|
|
318
|
-
* unknown) — so the intent leaves no trace in what P says
|
|
398
|
+
* unknown) — so the intent leaves no trace in what P says; where modes go
|
|
399
|
+
* unobserved, less any mode it carried, as every record written there.
|
|
319
400
|
*/
|
|
320
401
|
restore(mount: string, path: string, value: Physical | undefined): void {
|
|
321
402
|
if (value === undefined) this.forget(mount, path);
|
|
@@ -324,6 +405,14 @@ export class DiskAgreement {
|
|
|
324
405
|
|
|
325
406
|
private write(entry: JournalEntry, opts: { durable?: boolean; afterCommittedState?: boolean }): void {
|
|
326
407
|
this.ensureReconciled();
|
|
408
|
+
// A host that doesn't observe modes has none that's true to record: a
|
|
409
|
+
// record it writes carries no mode, and a host that observes them reads
|
|
410
|
+
// the path's mode as unknown, as for evidence from before modes were
|
|
411
|
+
// recorded. This holds whatever built the record: disk, the store's
|
|
412
|
+
// entry, or an earlier record a POSIX host wrote, put back by a restore.
|
|
413
|
+
// (A checkpoint re-serializes the evidence as it stands, other hosts'
|
|
414
|
+
// records included, as replaying the journal would.)
|
|
415
|
+
if (entry.t === 'set' && !this.modesObserved()) entry = { ...entry, value: withoutModes(entry.value) };
|
|
327
416
|
// Evidence is owed a barrier until proven durable: a failed append may
|
|
328
417
|
// still have landed. A place isn't (recordWalk).
|
|
329
418
|
if (entry.t !== 'walk') this.unsynced = true;
|