@animalabs/agent-framework 0.22.1 → 0.22.2
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 +1 -1
- package/dist/src/agent.d.ts +192 -19
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +404 -65
- 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 +50 -26
- package/dist/src/api/server.js.map +1 -1
- package/dist/src/api/types.d.ts +9 -1
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/code-execution/py-runner.d.ts.map +1 -1
- package/dist/src/code-execution/py-runner.js.map +1 -1
- package/dist/src/framework.d.ts +393 -113
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +1748 -582
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts.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 +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- 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 +26 -7
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +102 -22
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -1
- package/dist/src/mcpl/checkpoint-manager.js.map +1 -1
- package/dist/src/mcpl/conversation-router.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/src/mcpl/inference-router.d.ts.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 +38 -3
- package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
- package/dist/src/mcpl/push-coalescer.js +81 -16
- package/dist/src/mcpl/push-coalescer.js.map +1 -1
- package/dist/src/mcpl/push-handler.d.ts +26 -3
- package/dist/src/mcpl/push-handler.d.ts.map +1 -1
- package/dist/src/mcpl/push-handler.js +87 -23
- package/dist/src/mcpl/push-handler.js.map +1 -1
- package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
- package/dist/src/mcpl/reference-fetcher.js.map +1 -1
- package/dist/src/mcpl/references.d.ts +2 -2
- package/dist/src/mcpl/references.d.ts.map +1 -1
- 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 +18 -2
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +66 -11
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/mcpl/server-registry.d.ts.map +1 -1
- 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 +23 -5
- package/dist/src/mcpl/transport.d.ts.map +1 -1
- package/dist/src/mcpl/transport.js +103 -10
- package/dist/src/mcpl/transport.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +30 -26
- package/dist/src/mcpl/types.d.ts.map +1 -1
- package/dist/src/mcpl/types.js.map +1 -1
- package/dist/src/module-registry.d.ts.map +1 -1
- package/dist/src/module-registry.js.map +1 -1
- package/dist/src/modules/api/index.d.ts.map +1 -1
- package/dist/src/modules/discord/discord-js-client.d.ts.map +1 -1
- package/dist/src/modules/discord/discord-js-client.js.map +1 -1
- package/dist/src/modules/discord/index.d.ts.map +1 -1
- package/dist/src/modules/discord/index.js +4 -2
- package/dist/src/modules/discord/index.js.map +1 -1
- package/dist/src/modules/health/index.d.ts.map +1 -1
- package/dist/src/modules/health/index.js.map +1 -1
- package/dist/src/modules/history/index.d.ts.map +1 -1
- package/dist/src/modules/history/index.js.map +1 -1
- package/dist/src/modules/history/semantic.d.ts.map +1 -1
- package/dist/src/modules/history/semantic.js.map +1 -1
- 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 +22 -4
- package/dist/src/modules/workspace/disk-agreement.d.ts.map +1 -1
- package/dist/src/modules/workspace/disk-agreement.js +63 -25
- package/dist/src/modules/workspace/disk-agreement.js.map +1 -1
- package/dist/src/modules/workspace/effects.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.d.ts +8 -4
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +39 -12
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/observe.d.ts +43 -8
- package/dist/src/modules/workspace/observe.d.ts.map +1 -1
- package/dist/src/modules/workspace/observe.js +264 -39
- package/dist/src/modules/workspace/observe.js.map +1 -1
- package/dist/src/modules/workspace/reconcile.d.ts +17 -1
- package/dist/src/modules/workspace/reconcile.d.ts.map +1 -1
- package/dist/src/modules/workspace/reconcile.js +57 -14
- package/dist/src/modules/workspace/reconcile.js.map +1 -1
- package/dist/src/modules/workspace/types.d.ts +27 -2
- 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.map +1 -1
- 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/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.map +1 -1
- package/dist/src/recovery/offline-branch.js +29 -24
- 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/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.map +1 -1
- package/dist/src/tool-image-ledger.js.map +1 -1
- package/dist/src/tool-presentation.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/src/tune-out/coordinator.d.ts.map +1 -1
- 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 +42 -6
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +10 -0
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/module.d.ts +8 -4
- package/dist/src/types/module.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +61 -10
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/src/usage/usage-tracker.d.ts.map +1 -1
- package/dist/test/agent-runtime-settings.test.js +1139 -3
- package/dist/test/agent-runtime-settings.test.js.map +1 -1
- package/dist/test/batched-wake-locus.test.js.map +1 -1
- package/dist/test/channel-label-history.test.js.map +1 -1
- package/dist/test/code-execution.test.js.map +1 -1
- package/dist/test/conversation-fork-injection-scoping.test.js.map +1 -1
- package/dist/test/conversation-router.test.js.map +1 -1
- package/dist/test/conversation-routing.test.js +240 -6
- package/dist/test/conversation-routing.test.js.map +1 -1
- package/dist/test/discord-awareness-outbox.test.js +104 -0
- package/dist/test/discord-awareness-outbox.test.js.map +1 -1
- package/dist/test/discord-typing-keepalive.test.d.ts +2 -0
- package/dist/test/discord-typing-keepalive.test.d.ts.map +1 -0
- package/dist/test/discord-typing-keepalive.test.js +77 -0
- package/dist/test/discord-typing-keepalive.test.js.map +1 -0
- package/dist/test/ephemeral-settle.test.js.map +1 -1
- package/dist/test/event-gate-passthrough.test.js.map +1 -1
- package/dist/test/event-gate-policy-mutation.test.js.map +1 -1
- package/dist/test/event-gate-rate-limit.test.js.map +1 -1
- package/dist/test/event-gate-script.test.js.map +1 -1
- package/dist/test/event-gate-selfwake.test.js.map +1 -1
- package/dist/test/event-gate-tags.test.js.map +1 -1
- package/dist/test/event-gate.test.js.map +1 -1
- package/dist/test/explicit-prose-routing.test.js +363 -42
- package/dist/test/explicit-prose-routing.test.js.map +1 -1
- package/dist/test/framework.test.js.map +1 -1
- package/dist/test/helpers/coalescing-fixture.d.ts +2 -0
- package/dist/test/helpers/coalescing-fixture.d.ts.map +1 -1
- package/dist/test/helpers/coalescing-fixture.js +8 -2
- package/dist/test/helpers/coalescing-fixture.js.map +1 -1
- package/dist/test/helpers/mock-membrane.d.ts.map +1 -1
- package/dist/test/helpers/mock-membrane.js.map +1 -1
- package/dist/test/hide-then-turn.test.d.ts +2 -0
- package/dist/test/hide-then-turn.test.d.ts.map +1 -0
- package/dist/test/hide-then-turn.test.js +101 -0
- package/dist/test/hide-then-turn.test.js.map +1 -0
- package/dist/test/history-module-overview.test.js.map +1 -1
- package/dist/test/history-module-semantic.test.js.map +1 -1
- package/dist/test/history-module.test.js.map +1 -1
- package/dist/test/history-semantic-review-findings.test.js.map +1 -1
- package/dist/test/host-quiesce.test.js +125 -0
- package/dist/test/host-quiesce.test.js.map +1 -1
- package/dist/test/inference-exhaustion-rewind.test.js +81 -3
- package/dist/test/inference-exhaustion-rewind.test.js.map +1 -1
- package/dist/test/inference-failure-bounds.test.js +1 -0
- package/dist/test/inference-failure-bounds.test.js.map +1 -1
- package/dist/test/kv-unified-open-flight-retry.test.js.map +1 -1
- package/dist/test/liveness-watchdog.test.js.map +1 -1
- package/dist/test/maintenance-timer.test.js +1564 -2
- package/dist/test/maintenance-timer.test.js.map +1 -1
- package/dist/test/mcp-server-bin.test.d.ts +2 -0
- package/dist/test/mcp-server-bin.test.d.ts.map +1 -0
- package/dist/test/mcp-server-bin.test.js +142 -0
- package/dist/test/mcp-server-bin.test.js.map +1 -0
- package/dist/test/mcpl-awareness-barrier.test.js.map +1 -1
- package/dist/test/mcpl-child-env.test.js +1 -1
- package/dist/test/mcpl-child-env.test.js.map +1 -1
- package/dist/test/mcpl-coalesced-content-parity.test.d.ts +2 -0
- package/dist/test/mcpl-coalesced-content-parity.test.d.ts.map +1 -0
- package/dist/test/mcpl-coalesced-content-parity.test.js +532 -0
- package/dist/test/mcpl-coalesced-content-parity.test.js.map +1 -0
- package/dist/test/mcpl-coalescing.test.js.map +1 -1
- package/dist/test/mcpl-config-diagnostics.test.js.map +1 -1
- package/dist/test/mcpl-gate-roundtrip.test.js.map +1 -1
- package/dist/test/mcpl-manifest-changed.test.js.map +1 -1
- package/dist/test/mcpl-reconnect-events.test.js.map +1 -1
- package/dist/test/mcpl-reconnect-reregistration.test.js +2 -0
- package/dist/test/mcpl-reconnect-reregistration.test.js.map +1 -1
- package/dist/test/mcpl-reference-fetcher.test.js.map +1 -1
- package/dist/test/mcpl-reference-fields.test.js.map +1 -1
- package/dist/test/mcpl-rejection-log-lines.test.d.ts +2 -0
- package/dist/test/mcpl-rejection-log-lines.test.d.ts.map +1 -0
- package/dist/test/mcpl-rejection-log-lines.test.js +349 -0
- package/dist/test/mcpl-rejection-log-lines.test.js.map +1 -0
- package/dist/test/mcpl-stderr-tail.test.d.ts +2 -0
- package/dist/test/mcpl-stderr-tail.test.d.ts.map +1 -0
- package/dist/test/mcpl-stderr-tail.test.js +210 -0
- package/dist/test/mcpl-stderr-tail.test.js.map +1 -0
- package/dist/test/mcpl-tool-lifecycle-e2e.test.js.map +1 -1
- package/dist/test/mcpl-tool-lifecycle-emitter.test.js.map +1 -1
- package/dist/test/mcpl-tool-lifecycle-script.test.js.map +1 -1
- package/dist/test/mcpl-tool-lifecycle.test.js.map +1 -1
- package/dist/test/mcpl-transport-close.test.d.ts +2 -0
- package/dist/test/mcpl-transport-close.test.d.ts.map +1 -0
- package/dist/test/mcpl-transport-close.test.js +373 -0
- package/dist/test/mcpl-transport-close.test.js.map +1 -0
- package/dist/test/mcpl-transport-spawn.test.d.ts +2 -0
- package/dist/test/mcpl-transport-spawn.test.d.ts.map +1 -0
- package/dist/test/mcpl-transport-spawn.test.js +58 -0
- package/dist/test/mcpl-transport-spawn.test.js.map +1 -0
- package/dist/test/mcpl-ws-transport.test.js +1 -0
- package/dist/test/mcpl-ws-transport.test.js.map +1 -1
- package/dist/test/offline-recovery-branch.test.js +344 -0
- package/dist/test/offline-recovery-branch.test.js.map +1 -1
- package/dist/test/operator-surgery.test.js +197 -0
- package/dist/test/operator-surgery.test.js.map +1 -1
- package/dist/test/overbudget-drain-breaker.test.js +1 -0
- package/dist/test/overbudget-drain-breaker.test.js.map +1 -1
- package/dist/test/pack-installs-alone.test.d.ts +2 -0
- package/dist/test/pack-installs-alone.test.d.ts.map +1 -0
- package/dist/test/pack-installs-alone.test.js +284 -0
- package/dist/test/pack-installs-alone.test.js.map +1 -0
- package/dist/test/physical-window-restart.test.d.ts +6 -4
- package/dist/test/physical-window-restart.test.d.ts.map +1 -1
- package/dist/test/physical-window-restart.test.js +275 -10
- package/dist/test/physical-window-restart.test.js.map +1 -1
- package/dist/test/placed-reaction-baseline.test.js.map +1 -1
- package/dist/test/present-while-acting.test.js +949 -6
- package/dist/test/present-while-acting.test.js.map +1 -1
- package/dist/test/provider-acceleration-cooldown.test.js.map +1 -1
- package/dist/test/provider-waits.test.js +67 -4
- package/dist/test/provider-waits.test.js.map +1 -1
- package/dist/test/puppet-tool-call.test.js +2 -0
- package/dist/test/puppet-tool-call.test.js.map +1 -1
- package/dist/test/reaction-baseline-platform.test.js.map +1 -1
- package/dist/test/record-journal.test.js.map +1 -1
- package/dist/test/refusal-rewind.test.js +9 -0
- package/dist/test/refusal-rewind.test.js.map +1 -1
- package/dist/test/refusal-single-call.test.js.map +1 -1
- package/dist/test/release-bump.test.d.ts +2 -0
- package/dist/test/release-bump.test.d.ts.map +1 -0
- package/dist/test/release-bump.test.js +248 -0
- package/dist/test/release-bump.test.js.map +1 -0
- package/dist/test/release-changelog.test.js.map +1 -1
- package/dist/test/release-holds.test.d.ts +2 -0
- package/dist/test/release-holds.test.d.ts.map +1 -0
- package/dist/test/release-holds.test.js +456 -0
- package/dist/test/release-holds.test.js.map +1 -0
- package/dist/test/same-round-think-policy.test.js.map +1 -1
- package/dist/test/shutdown-errors.test.js.map +1 -1
- package/dist/test/silent-heartbeat-rows.test.js.map +1 -1
- package/dist/test/stop-with-host-operations.test.d.ts +20 -0
- package/dist/test/stop-with-host-operations.test.d.ts.map +1 -0
- package/dist/test/stop-with-host-operations.test.js +1174 -0
- package/dist/test/stop-with-host-operations.test.js.map +1 -0
- package/dist/test/stop-with-work-in-flight.test.js +162 -50
- package/dist/test/stop-with-work-in-flight.test.js.map +1 -1
- package/dist/test/surgery-marks-receipt.test.js.map +1 -1
- package/dist/test/tool-batch-hook.test.js.map +1 -1
- package/dist/test/tool-result-guard.test.js +131 -9
- package/dist/test/tool-result-guard.test.js.map +1 -1
- package/dist/test/tool-result-spill.test.js.map +1 -1
- package/dist/test/tool-wrapper-prose-guard-integration.test.js.map +1 -1
- package/dist/test/trunk-channel-routing.test.js +330 -7
- package/dist/test/trunk-channel-routing.test.js.map +1 -1
- package/dist/test/tune-out-e2e.test.js.map +1 -1
- package/dist/test/unconvertible-tool-result.test.js.map +1 -1
- package/dist/test/unsent-compiles.test.d.ts +2 -0
- package/dist/test/unsent-compiles.test.d.ts.map +1 -0
- package/dist/test/unsent-compiles.test.js +139 -0
- package/dist/test/unsent-compiles.test.js.map +1 -0
- package/dist/test/workspace-branch-continuation.test.js.map +1 -1
- package/dist/test/workspace-materialize-freshness.test.js.map +1 -1
- package/dist/test/workspace-read-text.test.js.map +1 -1
- package/dist/test/workspace-three-way.test.js +907 -7
- package/dist/test/workspace-three-way.test.js.map +1 -1
- package/dist/test/workspace-watcher.test.js.map +1 -1
- package/dist/test/xml-round-persist.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -6
- package/src/agent.ts +411 -66
- package/src/api/mcp-server-core.ts +681 -0
- package/src/api/mcp-server.ts +16 -685
- package/src/api/server.ts +51 -29
- package/src/api/types.ts +9 -1
- package/src/framework.ts +1899 -641
- package/src/index.ts +2 -2
- package/src/mcpl/channel-registry.ts +126 -31
- package/src/mcpl/feature-set-manager.ts +4 -3
- package/src/mcpl/log-value.ts +116 -0
- package/src/mcpl/prose-stream-router.ts +6 -6
- package/src/mcpl/push-coalescer.ts +76 -12
- package/src/mcpl/push-handler.ts +95 -23
- package/src/mcpl/refusal-lines.ts +59 -0
- package/src/mcpl/server-connection.ts +70 -11
- package/src/mcpl/tool-classes.ts +3 -2
- package/src/mcpl/transport.ts +105 -14
- package/src/mcpl/types.ts +5 -1
- package/src/modules/discord/index.ts +4 -2
- package/src/modules/workspace/disk-agreement.ts +74 -18
- package/src/modules/workspace/index.ts +41 -11
- package/src/modules/workspace/observe.ts +265 -39
- package/src/modules/workspace/reconcile.ts +71 -14
- package/src/modules/workspace/types.ts +26 -1
- package/src/recovery/offline-branch.ts +32 -28
- package/src/stored-removal.ts +126 -0
- package/src/types/agent.ts +42 -6
- package/src/types/framework.ts +10 -0
- package/src/types/module.ts +8 -4
- package/src/types/trace.ts +62 -11
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
* that isn't that directory any more (an unmounted drive whose mountpoint is
|
|
16
16
|
* now empty, a replaced directory) is an unavailable mount, never a disk on
|
|
17
17
|
* which every file was deleted; only an explicit acceptance takes it, and
|
|
18
|
-
* that starts its evidence afresh.
|
|
18
|
+
* that starts its evidence afresh. A place, where a walk stopped (`walks`),
|
|
19
|
+
* binds no root: it only says where the next walk starts, in whatever
|
|
20
|
+
* directory the root is by then.
|
|
19
21
|
*
|
|
20
22
|
* Every transition is write-ahead (see reconcile.ts): an `intent` entry
|
|
21
23
|
* (`pending`, with the prior value and the expected one) is durable before the
|
|
@@ -55,9 +57,10 @@ export class DiskAgreement {
|
|
|
55
57
|
mounts = new Map();
|
|
56
58
|
configured = [];
|
|
57
59
|
/**
|
|
58
|
-
* An append (or a rebuild) not yet made durable. Cleared only
|
|
59
|
-
* barrier that succeeds, so a failed barrier stays owed: a later pass
|
|
60
|
-
* nothing new to record still settles it before deciding anything.
|
|
60
|
+
* An append of evidence (or a rebuild) not yet made durable. Cleared only
|
|
61
|
+
* by a barrier that succeeds, so a failed barrier stays owed: a later pass
|
|
62
|
+
* with nothing new to record still settles it before deciding anything. A
|
|
63
|
+
* place owes none (recordWalk).
|
|
61
64
|
*/
|
|
62
65
|
unsynced = false;
|
|
63
66
|
constructor(store) {
|
|
@@ -109,24 +112,20 @@ export class DiskAgreement {
|
|
|
109
112
|
root: mount.root,
|
|
110
113
|
...(mount.identity ? { identity: mount.identity } : {}),
|
|
111
114
|
paths: new Map(Object.entries(mount.paths)),
|
|
115
|
+
walks: new Map(Object.entries(mount.walks ?? {})),
|
|
112
116
|
});
|
|
113
117
|
}
|
|
114
118
|
for (const { entry } of entries) {
|
|
115
119
|
if (entry.t === 'mount') {
|
|
116
120
|
const existing = replayed.get(entry.mount);
|
|
117
|
-
if (!existing || !sameRootPath(existing.root, entry.root))
|
|
118
|
-
replayed.set(entry.mount, { root: entry.root, paths: new Map() });
|
|
121
|
+
if (!existing || !sameRootPath(existing.root, entry.root)) {
|
|
122
|
+
replayed.set(entry.mount, { root: entry.root, paths: new Map(), walks: new Map() });
|
|
123
|
+
}
|
|
119
124
|
continue;
|
|
120
125
|
}
|
|
121
126
|
const mount = replayed.get(entry.mount);
|
|
122
|
-
if (
|
|
123
|
-
|
|
124
|
-
if (entry.t === 'root')
|
|
125
|
-
applyRoot(mount, entry);
|
|
126
|
-
else if (entry.t === 'set')
|
|
127
|
-
mount.paths.set(entry.path, entry.value);
|
|
128
|
-
else
|
|
129
|
-
mount.paths.delete(entry.path);
|
|
127
|
+
if (mount)
|
|
128
|
+
apply(mount, entry);
|
|
130
129
|
}
|
|
131
130
|
this.mounts.clear();
|
|
132
131
|
for (const { name, root } of this.configured) {
|
|
@@ -135,7 +134,7 @@ export class DiskAgreement {
|
|
|
135
134
|
this.mounts.set(name, found);
|
|
136
135
|
}
|
|
137
136
|
else {
|
|
138
|
-
this.mounts.set(name, { root, paths: new Map() });
|
|
137
|
+
this.mounts.set(name, { root, paths: new Map(), walks: new Map() });
|
|
139
138
|
this.journal.append({ t: 'mount', mount: name, root });
|
|
140
139
|
}
|
|
141
140
|
}
|
|
@@ -179,6 +178,28 @@ export class DiskAgreement {
|
|
|
179
178
|
}
|
|
180
179
|
return out;
|
|
181
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* Where the next walk of `scope` ('' for the mount root) resumes: the last
|
|
183
|
+
* entry a walk of it took before its cap stopped it, if one did.
|
|
184
|
+
*/
|
|
185
|
+
walkResumesAfter(mount, scope) {
|
|
186
|
+
this.ensureReconciled();
|
|
187
|
+
return this.mounts.get(mount)?.walks.get(scope);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Record where a walk of `scope` stopped (`after`), or that one covered it
|
|
191
|
+
* (null). Kept with the evidence so a restart resumes there too. A place
|
|
192
|
+
* that's lost costs coverage, never a decision: an append that didn't land
|
|
193
|
+
* loses one, and a checkpoint written by a version that doesn't keep them
|
|
194
|
+
* (0.22) loses them all, and each scope's walks start at its top again.
|
|
195
|
+
* So recording one owes no barrier: a pass that moves only its place makes
|
|
196
|
+
* no store sync, and the place becomes durable with the next one.
|
|
197
|
+
*/
|
|
198
|
+
recordWalk(mount, scope, after) {
|
|
199
|
+
if ((this.walkResumesAfter(mount, scope) ?? null) === after)
|
|
200
|
+
return;
|
|
201
|
+
this.write({ t: 'walk', mount, scope, after }, {});
|
|
202
|
+
}
|
|
182
203
|
/**
|
|
183
204
|
* Record an intent. `durable` makes it (and every append before it) stable
|
|
184
205
|
* before the caller performs the effect; batches pass it on their last one.
|
|
@@ -212,19 +233,16 @@ export class DiskAgreement {
|
|
|
212
233
|
}
|
|
213
234
|
write(entry, opts) {
|
|
214
235
|
this.ensureReconciled();
|
|
215
|
-
|
|
236
|
+
// Evidence is owed a barrier until proven durable: a failed append may
|
|
237
|
+
// still have landed. A place isn't (recordWalk).
|
|
238
|
+
if (entry.t !== 'walk')
|
|
239
|
+
this.unsynced = true;
|
|
216
240
|
this.journal.append(entry, opts);
|
|
217
241
|
if (opts.durable)
|
|
218
242
|
this.unsynced = false; // synced after this append, and so everything before it
|
|
219
243
|
const mount = this.mounts.get(entry.mount);
|
|
220
|
-
if (
|
|
221
|
-
|
|
222
|
-
if (entry.t === 'root')
|
|
223
|
-
applyRoot(mount, entry);
|
|
224
|
-
else if (entry.t === 'set')
|
|
225
|
-
mount.paths.set(entry.path, entry.value);
|
|
226
|
-
else if (entry.t === 'forget')
|
|
227
|
-
mount.paths.delete(entry.path);
|
|
244
|
+
if (mount)
|
|
245
|
+
apply(mount, entry);
|
|
228
246
|
}
|
|
229
247
|
/** Checkpoint when the tail has outgrown the live evidence. */
|
|
230
248
|
maybeCheckpoint() {
|
|
@@ -241,6 +259,7 @@ export class DiskAgreement {
|
|
|
241
259
|
root: mount.root,
|
|
242
260
|
...(mount.identity ? { identity: mount.identity } : {}),
|
|
243
261
|
paths: Object.fromEntries(mount.paths),
|
|
262
|
+
...(mount.walks.size > 0 ? { walks: Object.fromEntries(mount.walks) } : {}),
|
|
244
263
|
};
|
|
245
264
|
}
|
|
246
265
|
this.journal.checkpoint(snapshot);
|
|
@@ -251,9 +270,28 @@ export class DiskAgreement {
|
|
|
251
270
|
this.unsynced = false;
|
|
252
271
|
}
|
|
253
272
|
}
|
|
273
|
+
/** Apply one entry to a mount's evidence; one of a kind this version doesn't know changes nothing. */
|
|
274
|
+
function apply(mount, entry) {
|
|
275
|
+
if (entry.t === 'root')
|
|
276
|
+
applyRoot(mount, entry);
|
|
277
|
+
else if (entry.t === 'set')
|
|
278
|
+
mount.paths.set(entry.path, entry.value);
|
|
279
|
+
else if (entry.t === 'forget')
|
|
280
|
+
mount.paths.delete(entry.path);
|
|
281
|
+
else if (entry.t === 'walk') {
|
|
282
|
+
if (entry.after === null)
|
|
283
|
+
mount.walks.delete(entry.scope);
|
|
284
|
+
else
|
|
285
|
+
mount.walks.set(entry.scope, entry.after);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
254
288
|
function applyRoot(mount, entry) {
|
|
255
289
|
mount.identity = entry.identity;
|
|
256
|
-
if (entry.reset)
|
|
290
|
+
if (entry.reset) {
|
|
291
|
+
// Evidence about another directory says nothing about this one, and the
|
|
292
|
+
// accepted root's walks start at its top.
|
|
257
293
|
mount.paths.clear();
|
|
294
|
+
mount.walks.clear();
|
|
295
|
+
}
|
|
258
296
|
}
|
|
259
297
|
//# sourceMappingURL=disk-agreement.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disk-agreement.js","sourceRoot":"","sources":["../../../../src/modules/workspace/disk-agreement.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"disk-agreement.js","sourceRoot":"","sources":["../../../../src/modules/workspace/disk-agreement.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../../../../src/modules/workspace/effects.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAMH,OAAO,EAEL,KAAK,SAAS,EAWf,MAAM,cAAc,CAAC;AAEtB,gEAAgE;AAChE,MAAM,MAAM,MAAM,GACd;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE;AACpB,8CAA8C;GAC5C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACnC,sEAAsE;GACpE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAKpB,qBAAa,YAAa,SAAQ,KAAK;IACrC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../../../../src/modules/workspace/effects.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAMH,OAAO,EAEL,KAAK,SAAS,EAWf,MAAM,cAAc,CAAC;AAEtB,gEAAgE;AAChE,MAAM,MAAM,MAAM,GACd;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE;AACpB,8CAA8C;GAC5C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACnC,sEAAsE;GACpE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAKpB,qBAAa,YAAa,SAAQ,KAAK;IACrC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAG5C;CACF;AAmFD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFjI;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0DrH;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA0B7H;AAED,oGAAoG;AACpG,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAM7C"}
|
|
@@ -389,10 +389,14 @@ export declare class WorkspaceModule implements Module {
|
|
|
389
389
|
* After an agent's completed tool batch, before anything continues its turn:
|
|
390
390
|
* scan every `watch: 'on-agent-action'` mount, so what the batch's tools did
|
|
391
391
|
* on disk (a shell command's files, a deletion) is in the workspace when the
|
|
392
|
-
* agent next looks.
|
|
393
|
-
*
|
|
394
|
-
*
|
|
395
|
-
*
|
|
392
|
+
* agent next looks. On a mount over its walkCap, that holds for the first
|
|
393
|
+
* walkCap entries in the walk's order, which every batch's scan takes; files
|
|
394
|
+
* past them come in through syncs and the listings that reach them, while a
|
|
395
|
+
* read takes in only a file the workspace doesn't hold yet. A scan that
|
|
396
|
+
* outlasts the deadline stops holding the round: the miss is recorded on
|
|
397
|
+
* the mount's status and pushed as a `workspace:agent-action-scan-incomplete`
|
|
398
|
+
* event, and the scan continues, deciding on the branch selected when it
|
|
399
|
+
* applies.
|
|
396
400
|
*/
|
|
397
401
|
onToolBatchComplete(_agentName?: string): Promise<void>;
|
|
398
402
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/workspace/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,KAAK,EAEV,eAAe,EAmBhB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/workspace/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@ import { DiskAgreement, sameRootIdentity } from './disk-agreement.js';
|
|
|
14
14
|
import { BranchIntents } from './branch-intent.js';
|
|
15
15
|
import { coveredByIgnore, filesystemTrustsCtime, locateRoot } from './observe.js';
|
|
16
16
|
import { TOOL_BATCH_HOOK_TIMEOUT_MS } from '../../module-registry.js';
|
|
17
|
-
import { pushPaths, reconcilePass, settleAdoptionBeforeMutation, } from './reconcile.js';
|
|
17
|
+
import { WALK_CAP, pushPaths, reconcilePass, settleAdoptionBeforeMutation, } from './reconcile.js';
|
|
18
18
|
/** Default for how long the after-batch scan may hold the agent's next inference. */
|
|
19
19
|
const AGENT_ACTION_SCAN_DEADLINE_MS = 20_000;
|
|
20
20
|
/** Why a call is refused once the module has stopped. */
|
|
@@ -471,6 +471,14 @@ export class WorkspaceModule {
|
|
|
471
471
|
* startup already is (issue #72). Cleared after application. */
|
|
472
472
|
savedState = null;
|
|
473
473
|
constructor(config) {
|
|
474
|
+
for (const mount of config.mounts) {
|
|
475
|
+
const cap = mount.walkCap;
|
|
476
|
+
if (cap !== undefined && !(Number.isSafeInteger(cap) && cap > 0)) {
|
|
477
|
+
// Numbers as JavaScript writes them (JSON would say null for NaN), anything else as JSON.
|
|
478
|
+
const shown = typeof cap === 'number' ? String(cap) : typeof cap === 'bigint' ? `${cap}n` : JSON.stringify(cap) ?? String(cap);
|
|
479
|
+
throw new Error(`[workspace] Mount "${mount.name}": walkCap must be a positive integer no larger than ${Number.MAX_SAFE_INTEGER}, not ${shown}`);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
474
482
|
// Detect overlapping mount paths: if mount A contains mount B,
|
|
475
483
|
// auto-add an ignore rule on A for B's path to prevent syncing
|
|
476
484
|
// the sub-mount's directory through the super-mount.
|
|
@@ -591,6 +599,8 @@ export class WorkspaceModule {
|
|
|
591
599
|
treeStateId: mount.treeStateId,
|
|
592
600
|
intents: this.intents.get(mount.config.name),
|
|
593
601
|
readOnly: mount.config.mode === 'read-only',
|
|
602
|
+
walkCap: mount.config.walkCap ?? WALK_CAP,
|
|
603
|
+
catchUpScan: (mount.config.watch ?? 'always') === 'always',
|
|
594
604
|
};
|
|
595
605
|
}
|
|
596
606
|
/** One disk→store pass; the caller holds the mount's turn. Emits its events. */
|
|
@@ -777,9 +787,12 @@ export class WorkspaceModule {
|
|
|
777
787
|
watcher.start();
|
|
778
788
|
this.watchers.set(name, watcher);
|
|
779
789
|
// Chokidar is started with ignoreInitial:true, so changes made while
|
|
780
|
-
// the session was down would be invisible.
|
|
781
|
-
// under the three-way rule: only real differences produce tree
|
|
782
|
-
// changes and events.
|
|
790
|
+
// the session was down would be invisible. A catch-up pass takes them
|
|
791
|
+
// in under the three-way rule: only real differences produce tree
|
|
792
|
+
// changes and events. It takes its turn with the mount's bare syncs,
|
|
793
|
+
// so on a mount over its walkCap it covers the walkCap entries after
|
|
794
|
+
// where the last turn stopped, and a change elsewhere waits for the
|
|
795
|
+
// rotation to reach it, or for a sync of its path.
|
|
783
796
|
void this.initialScan(name);
|
|
784
797
|
}
|
|
785
798
|
this.ctx.pushEvent({
|
|
@@ -797,7 +810,7 @@ export class WorkspaceModule {
|
|
|
797
810
|
try {
|
|
798
811
|
// A full pass under the three-way rule: deletions on disk are confirmed
|
|
799
812
|
// where nothing newer is pending, and nothing unvisited is touched.
|
|
800
|
-
await this.withMount(mount, () => this.passUnlocked(mount, { kind: 'dir', dir: '', recursive: true }));
|
|
813
|
+
await this.withMount(mount, () => this.passUnlocked(mount, { kind: 'dir', dir: '', recursive: true }, { resume: true }));
|
|
801
814
|
}
|
|
802
815
|
catch (err) {
|
|
803
816
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -1001,7 +1014,12 @@ export class WorkspaceModule {
|
|
|
1001
1014
|
{
|
|
1002
1015
|
name: 'sync',
|
|
1003
1016
|
description: 'Bring disk changes into the workspace. Without a path, every mount (or the given one) is '
|
|
1004
|
-
+ 'rechecked
|
|
1017
|
+
+ 'rechecked and nothing pending in the workspace is discarded. A sync takes up to the mount\'s walk '
|
|
1018
|
+
+ 'cap of entries, files, links and the like (5000 unless configured). Past it, what this one didn\'t reach is listed under '
|
|
1019
|
+
+ '`incomplete`, and the walk takes turns: the next sync of the same mount or directory picks up where '
|
|
1020
|
+
+ 'the last turn stopped, so repeated syncs cover it all. On a mount watched continuously, its own catch-up '
|
|
1021
|
+
+ 'scan, at start and when its watcher reattaches, takes turns with its whole-mount syncs. With a '
|
|
1022
|
+
+ 'path (file or directory), '
|
|
1005
1023
|
+ 'the workspace takes disk\'s state there explicitly: it restores a workspace-deleted file, resolves '
|
|
1006
1024
|
+ 'conflicts toward disk, replaces a workspace draft, and removes a workspace file disk does not have. '
|
|
1007
1025
|
+ 'Each workspace change it gives up is listed under `discarded`, with the state it had and, as `op`, '
|
|
@@ -2562,7 +2580,8 @@ export class WorkspaceModule {
|
|
|
2562
2580
|
rootsAccepted.push(name);
|
|
2563
2581
|
if (!relativePath) {
|
|
2564
2582
|
// A full recheck: every file rehashed, nothing pending discarded.
|
|
2565
|
-
|
|
2583
|
+
// Past the mount's walkCap, it resumes where the last one stopped.
|
|
2584
|
+
return this.passUnlocked(mount, { kind: 'dir', dir: '', recursive: true }, { rehash: true, resume: true });
|
|
2566
2585
|
}
|
|
2567
2586
|
// An explicit path: the workspace takes disk's state there.
|
|
2568
2587
|
const prefix = relativePath + '/';
|
|
@@ -2575,7 +2594,7 @@ export class WorkspaceModule {
|
|
|
2575
2594
|
const opts = { rehash: true, adopt: () => true, branchId: askedOn, named: true };
|
|
2576
2595
|
if (!isDir)
|
|
2577
2596
|
return this.passUnlocked(mount, { kind: 'paths', paths: [relativePath] }, opts);
|
|
2578
|
-
const beneath = await this.passUnlocked(mount, { kind: 'dir', dir: relativePath, recursive: true }, opts);
|
|
2597
|
+
const beneath = await this.passUnlocked(mount, { kind: 'dir', dir: relativePath, recursive: true }, { ...opts, resume: true });
|
|
2579
2598
|
// Something at the path itself is no part of a directory scope: a file
|
|
2580
2599
|
// disk has where the workspace holds a directory, or a workspace file
|
|
2581
2600
|
// where disk has a directory. Its own pass takes disk's state there
|
|
@@ -2704,10 +2723,14 @@ export class WorkspaceModule {
|
|
|
2704
2723
|
* After an agent's completed tool batch, before anything continues its turn:
|
|
2705
2724
|
* scan every `watch: 'on-agent-action'` mount, so what the batch's tools did
|
|
2706
2725
|
* on disk (a shell command's files, a deletion) is in the workspace when the
|
|
2707
|
-
* agent next looks.
|
|
2708
|
-
*
|
|
2709
|
-
*
|
|
2710
|
-
*
|
|
2726
|
+
* agent next looks. On a mount over its walkCap, that holds for the first
|
|
2727
|
+
* walkCap entries in the walk's order, which every batch's scan takes; files
|
|
2728
|
+
* past them come in through syncs and the listings that reach them, while a
|
|
2729
|
+
* read takes in only a file the workspace doesn't hold yet. A scan that
|
|
2730
|
+
* outlasts the deadline stops holding the round: the miss is recorded on
|
|
2731
|
+
* the mount's status and pushed as a `workspace:agent-action-scan-incomplete`
|
|
2732
|
+
* event, and the scan continues, deciding on the branch selected when it
|
|
2733
|
+
* applies.
|
|
2711
2734
|
*/
|
|
2712
2735
|
async onToolBatchComplete(_agentName) {
|
|
2713
2736
|
// Every agent's workspace is the store's current branch, so the agent
|
|
@@ -2774,6 +2797,10 @@ export class WorkspaceModule {
|
|
|
2774
2797
|
const pass = this.withMount(mount, () => {
|
|
2775
2798
|
if (mount.agentActionScanWaiting === scan)
|
|
2776
2799
|
mount.agentActionScanWaiting = undefined;
|
|
2800
|
+
// From the mount's start, as a listing walks, keeping no place: on a
|
|
2801
|
+
// mount over its walkCap, every batch's scan takes the first walkCap
|
|
2802
|
+
// entries in the walk's order, and the place that syncs and catch-up
|
|
2803
|
+
// scans resume from stays theirs.
|
|
2777
2804
|
return this.passUnlocked(mount, { kind: 'dir', dir: '', recursive: true });
|
|
2778
2805
|
});
|
|
2779
2806
|
scan.settled = pass.then((result) => {
|