@animalabs/agent-framework 0.22.0 → 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 +12 -5
- package/dist/src/agent.d.ts +192 -19
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +407 -66
- 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 +84 -23
- 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 +682 -103
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +3202 -718
- 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 +4 -4
- 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/index.d.ts +2 -0
- package/dist/src/mcpl/index.d.ts.map +1 -1
- package/dist/src/mcpl/index.js.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 +2 -1
- package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
- package/dist/src/mcpl/reference-fetcher.js +20 -9
- package/dist/src/mcpl/reference-fetcher.js.map +1 -1
- package/dist/src/mcpl/references.d.ts +29 -6
- package/dist/src/mcpl/references.d.ts.map +1 -1
- package/dist/src/mcpl/references.js +57 -16
- 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 +46 -3
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +98 -15
- 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 +9 -3
- package/dist/src/module-registry.d.ts.map +1 -1
- package/dist/src/module-registry.js +3 -2
- 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 +85 -16
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/observe.d.ts +56 -11
- package/dist/src/modules/workspace/observe.d.ts.map +1 -1
- package/dist/src/modules/workspace/observe.js +288 -43
- package/dist/src/modules/workspace/observe.js.map +1 -1
- package/dist/src/modules/workspace/reconcile.d.ts +31 -1
- package/dist/src/modules/workspace/reconcile.d.ts.map +1 -1
- package/dist/src/modules/workspace/reconcile.js +63 -12
- 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 +41 -0
- 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 +216 -0
- package/dist/src/provider-waits.d.ts.map +1 -0
- package/dist/src/provider-waits.js +482 -0
- package/dist/src/provider-waits.js.map +1 -0
- 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/refusal-reactions.d.ts +14 -12
- package/dist/src/refusal-reactions.d.ts.map +1 -1
- package/dist/src/refusal-reactions.js +14 -12
- package/dist/src/refusal-reactions.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 +30 -13
- package/dist/src/tool-result-guard.d.ts.map +1 -1
- package/dist/src/tool-result-guard.js +71 -25
- 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/events.d.ts +12 -0
- package/dist/src/types/events.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 +20 -8
- package/dist/src/types/module.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +75 -13
- 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 +107 -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 -44
- package/dist/test/explicit-prose-routing.test.js.map +1 -1
- package/dist/test/framework.test.js +160 -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 +11 -4
- 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 +220 -14
- package/dist/test/inference-exhaustion-rewind.test.js.map +1 -1
- package/dist/test/inference-failure-bounds.test.d.ts +2 -0
- package/dist/test/inference-failure-bounds.test.d.ts.map +1 -0
- package/dist/test/inference-failure-bounds.test.js +1202 -0
- package/dist/test/inference-failure-bounds.test.js.map +1 -0
- package/dist/test/kv-unified-open-flight-retry.test.js.map +1 -1
- package/dist/test/late-events-after-stop.test.d.ts +2 -0
- package/dist/test/late-events-after-stop.test.d.ts.map +1 -0
- package/dist/test/late-events-after-stop.test.js +122 -0
- package/dist/test/late-events-after-stop.test.js.map +1 -0
- 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 +141 -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 +78 -16
- package/dist/test/mcpl-coalescing.test.js.map +1 -1
- package/dist/test/mcpl-config-diagnostics.test.js +6 -3
- 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 +2 -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 +232 -4
- package/dist/test/mcpl-reference-fetcher.test.js.map +1 -1
- package/dist/test/mcpl-reference-fields.test.js +69 -2
- 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 +104 -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/ops-alert.test.js +2 -1
- package/dist/test/ops-alert.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.d.ts +2 -0
- package/dist/test/placed-reaction-baseline.test.d.ts.map +1 -0
- package/dist/test/placed-reaction-baseline.test.js +312 -0
- package/dist/test/placed-reaction-baseline.test.js.map +1 -0
- 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 +5 -1
- package/dist/test/provider-acceleration-cooldown.test.js.map +1 -1
- package/dist/test/provider-waits.test.d.ts +2 -0
- package/dist/test/provider-waits.test.d.ts.map +1 -0
- package/dist/test/provider-waits.test.js +2259 -0
- package/dist/test/provider-waits.test.js.map +1 -0
- 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.d.ts +2 -0
- package/dist/test/reaction-baseline-platform.test.d.ts.map +1 -0
- package/dist/test/reaction-baseline-platform.test.js +124 -0
- package/dist/test/reaction-baseline-platform.test.js.map +1 -0
- package/dist/test/record-journal.test.js.map +1 -1
- package/dist/test/refusal-reaction-baseline.test.js +10 -3
- package/dist/test/refusal-reaction-baseline.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/save-recent-image.test.js +138 -2
- package/dist/test/save-recent-image.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.d.ts +2 -0
- package/dist/test/surgery-marks-receipt.test.d.ts.map +1 -0
- package/dist/test/surgery-marks-receipt.test.js +540 -0
- package/dist/test/surgery-marks-receipt.test.js.map +1 -0
- package/dist/test/tool-batch-hook.test.js.map +1 -1
- package/dist/test/tool-result-guard.test.js +352 -16
- 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 +1022 -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 +415 -67
- package/src/api/mcp-server-core.ts +681 -0
- package/src/api/mcp-server.ts +16 -685
- package/src/api/server.ts +87 -26
- package/src/api/types.ts +9 -1
- package/src/framework.ts +3389 -782
- package/src/index.ts +9 -4
- package/src/mcpl/channel-registry.ts +126 -31
- package/src/mcpl/feature-set-manager.ts +4 -3
- package/src/mcpl/index.ts +2 -0
- 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/reference-fetcher.ts +18 -8
- package/src/mcpl/references.ts +57 -13
- package/src/mcpl/refusal-lines.ts +59 -0
- package/src/mcpl/server-connection.ts +125 -15
- package/src/mcpl/tool-classes.ts +3 -2
- package/src/mcpl/transport.ts +105 -14
- package/src/mcpl/types.ts +5 -1
- package/src/module-registry.ts +17 -9
- package/src/modules/discord/index.ts +4 -2
- package/src/modules/workspace/disk-agreement.ts +74 -18
- package/src/modules/workspace/index.ts +85 -15
- package/src/modules/workspace/observe.ts +295 -43
- package/src/modules/workspace/reconcile.ts +90 -12
- package/src/modules/workspace/types.ts +26 -1
- package/src/operator-log.ts +30 -0
- package/src/provider-waits.ts +523 -0
- package/src/recovery/offline-branch.ts +32 -28
- package/src/refusal-reactions.ts +14 -12
- package/src/stored-removal.ts +126 -0
- package/src/tool-result-guard.ts +72 -24
- package/src/types/agent.ts +42 -6
- package/src/types/events.ts +12 -0
- package/src/types/framework.ts +10 -0
- package/src/types/module.ts +20 -8
- package/src/types/trace.ts +76 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-batch-hook.test.js","sourceRoot":"","sources":["../../test/tool-batch-hook.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAYjC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAElG,MAAM,UAAU;IACL,IAAI,GAAG,OAAO,CAAC;IACxB,QAAQ,CAAe;IACvB,SAAS,GAAgE,EAAE,CAAC;IAC5E,MAAM,GAAkD,IAAI,CAAC;IAC7D,MAAM,GAAsC,IAAI,CAAC;IAEjD,YAAY,QAAsB;QAChC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAmB,IAAkB,CAAC;IAClD,KAAK,CAAC,IAAI,KAAmB,CAAC;IAE9B,QAAQ;QACN,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACvH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAc;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAmB,EAAE,MAAoB;QACvD,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB;YAAE,OAAO,EAAE,CAAC;QACjD,OAAO;YACL,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAE,KAA+B,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3H,gBAAgB,EAAE,IAAI;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,SAAiB;QACzC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,qBAAqB,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;QACrH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF;AAED,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,IAAI,OAAe,CAAC;IACpB,IAAI,QAAsB,CAAC;IAC3B,IAAI,KAAiB,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;QACrD,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;QAC9B,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,eAAe,CAAC,QAAkB,EAAE;QACjD,OAAO,cAAc,CAAC,MAAM,CAAC;YAC3B,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC;YAC1C,QAAQ,EAAE,QAAQ,CAAC,UAAU,EAAE;YAC/B,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;YAC9E,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,iEAAiE;IACjE,SAAS,kBAAkB;QACzB,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACnE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;SAClD,EAAE,UAAU,CAAC,CAAC,CAAC;QAClC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAmB,CAAC,CAAC,CAAC;IAChG,CAAC;IAED,SAAS,OAAO,CAAC,SAAyB;QACxC,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAA6B,CAAC,CAAC;IAC5H,CAAC;IAED,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,kBAAkB,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;QAC1C,OAAO,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;QAE/B,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,EACtF,+DAA+D,CAAC,CAAC;QACnE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAW,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,EAAE,yCAAyC,CAAC,CAAC;QAC5G,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,kBAAkB,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAI,SAAqH,CAAC,cAAc,CAAC;QACvJ,MAAM,MAAM,GAAG,QAAQ,CAAC,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/D,QAAQ,CAAC,uBAAuB,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAChF,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAO,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB;QAElE,OAAO,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,0BAA0B,CACH,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,MAAO,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAW,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,EAAE,oCAAoC,CAAC,CAAC;QACvG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kGAAkG,EAAE,KAAK,IAAI,EAAE;QAChH,0EAA0E;QAC1E,yDAAyD;QACzD,MAAM,OAAO,GAAW;YACtB,IAAI,EAAE,SAAS;YACf,KAAK,CAAC,KAAK,KAAI,CAAC;YAChB,KAAK,CAAC,IAAI,KAAI,CAAC;YACf,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE;YAClB,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC/C,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC3B,mBAAmB;gBACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;SACF,CAAC;QACF,kBAAkB,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC;YAC5C,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC;YAC1C,QAAQ,EAAE,QAAQ,CAAC,UAAU,EAAE;YAC/B,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;YAC9E,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;SAC1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzC,OAAO,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,0BAA0B,CACtB,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,MAAO,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,mCAAmC,CAAC,CAAC;QAC7E,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAW,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,EAAE,oCAAoC,CAAC,CAAC;QACvG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,kBAAkB,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,SAAS,EAAE,EAAE;YACjC,SAAS,CAAC,cAAc,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;QACzE,CAAC,CAAC;QAEF,OAAO,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;QAE/B,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAW,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,EAAE,6CAA6C,CAAC,CAAC;QAChH,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAC,EAAE,8BAA8B,CAAC,CAAC;QAChG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kGAAkG,EAAE,KAAK,IAAI,EAAE;QAChH,kBAAkB,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;QACpC,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,SAAS,EAAE,EAAE;YACjC,uEAAuE;YACvE,gCAAgC;YAChC,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS,CAA6E,CAAC;YACxH,KAAK,CAAC,MAAM,GAAG;gBACb,GAAG,KAAK,CAAC,MAAM;gBACf,MAAM,EAAE,mBAAmB;gBAC3B,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;aACrG,CAAC;YACF,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,SAAS,EAAE,wBAAwB,CAAC,EAAE,EAAE,CAAC,CAAC;QACtF,CAAC,CAAC;QACF,IAAI,CAAC;YACH,OAAO,CAAC,SAAS,CAAC,CAAC;YACnB,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC;QAChC,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAmC,CAAC;QACvG,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,uCAAuC,CAAC,CAAC;QAC5D,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACzF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAW,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,EAAE,4CAA4C,CAAC,CAAC;QAC/G,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,kBAAkB,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,SAAS,EAAE,EAAE;YACjC,wEAAwE;YACxE,yEAAyE;YACzE,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAoF,CAAC;YAC/H,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9C,KAAK,CAAC,MAAM,GAAG;gBACb,GAAG,KAAK,CAAC,MAAM;gBACf,MAAM,EAAE,mBAAmB;gBAC3B,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,EAAG,EAAE,EAAE,EAAE,EAAE,EAAG,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAA+B,CAAC,CAAC,CAAC;aACzI,CAAC;YACF,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,SAAS,EAAE,wBAAwB,CAAC,EAAE,EAAE,CAAC,CAAC;QACtF,CAAC,CAAC;QACF,OAAO,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;QAC/B,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAC,EAAE,uCAAuC,CAAC,CAAC;QACzG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAW,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,EAAE,6CAA6C,CAAC,CAAC;QAChH,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,oEAAoE;QACpE,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;SAClD,EAAE,UAAU,CAAC,CAAC,CAAC;QAClC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAmB,CAAC,CAAC,CAAC;QAC9F,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;QAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;QACpC,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;QACzB,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE;YAClB,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAA6B,CAAC,CAAC;QACnK,CAAC,CAAC;QACF,IAAI,CAAC;YACH,OAAO,CAAC,SAAS,CAAC,CAAC;YACnB,qEAAqE;YACrE,oCAAoC;YACpC,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,0BAA0B,CAAC,CAAC;YACjF,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC;QAChC,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,iDAAiD,CAAC,CAAC;QAC3F,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAW,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACjE,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;QACtG,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAI,SAAsJ,CAAC,cAAc,CAAC;QACxL,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,OAAO,IAAI,OAAO,CAAO,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB;QACvF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,uBAAuB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,uBAAuB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC1E,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,KAAK,EAAE,+BAA+B,CAAC,CAAC;QACzE,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC,CAAC,CAAC;QAC9F,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,iCAAiC,CAAC,CAAC;QAC1D,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;QACnG,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC;YACpC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;SACrF,CAAC,CAAC;QACH,+DAA+D;QAC/D,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC;QAC3F,kBAAkB,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACrD,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,cAAc;QAEzD,MAAM,YAAY,GAAyB,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,kBAAkB,CAAC,SAAS,CAAC,kBAAkB,CAAC;QAChE,kBAAkB,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAoC,GAAG,IAAI;YAC3F,MAAM,KAAK,GAAI,SAAsG,CAAC,KAAK,CAAC;YAC5H,KAAK,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;gBAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACzH,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC;QACF,IAAI,CAAC;YACH,OAAO,CAAC,SAAS,CAAC,CAAC;YACnB,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC;gBAAS,CAAC;YACT,kBAAkB,CAAC,SAAS,CAAC,kBAAkB,GAAG,OAAO,CAAC;QAC5D,CAAC;QAED,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,yDAAyD,CAAC,CAAC;QACxG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"tool-batch-hook.test.js","sourceRoot":"","sources":["../../test/tool-batch-hook.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,9 +6,10 @@ import { join } from 'node:path';
|
|
|
6
6
|
import { PassthroughStrategy } from '@animalabs/context-manager';
|
|
7
7
|
import { Membrane as RealMembrane, NativeFormatter } from '@animalabs/membrane';
|
|
8
8
|
import { AgentFramework } from '../src/index.js';
|
|
9
|
-
import { TOOL_RESULT_GUARD_AUDIT_STATE, TOOL_RESULT_GUARD_NOTICE, withheldResultNotice } from '../src/tool-result-guard.js';
|
|
9
|
+
import { TOOL_RESULT_GUARD_AUDIT_STATE, TOOL_RESULT_GUARD_NOTICE, keptWhenWithheld, withheldResultNotice } from '../src/tool-result-guard.js';
|
|
10
10
|
import { MockYieldingStream, createMockResponse } from './helpers/mock-membrane.js';
|
|
11
11
|
import { WorkspaceModule } from '../src/modules/workspace/index.js';
|
|
12
|
+
import { DEFAULT_TOOL_RESULT_INLINE_MAX_CHARS } from '../src/tool-result-history.js';
|
|
12
13
|
import { JsStore } from '@animalabs/chronicle';
|
|
13
14
|
// What a withheld result settles to with no writable workspace (#277): the
|
|
14
15
|
// neutral notice, then where the original is kept. Written out, not computed
|
|
@@ -955,7 +956,7 @@ test("explicit: a restarted turn whose last response is empty checks for its ' !
|
|
|
955
956
|
const check = internals.requestProseContinuation.bind(h.framework);
|
|
956
957
|
const seen = [];
|
|
957
958
|
internals.requestProseContinuation = (agent, routing) => {
|
|
958
|
-
seen.push(routing.
|
|
959
|
+
seen.push(routing.continuation);
|
|
959
960
|
check(agent, routing);
|
|
960
961
|
};
|
|
961
962
|
try {
|
|
@@ -1034,8 +1035,10 @@ test("a fresh turn starts new routing state in every mode, and leaves the earlie
|
|
|
1034
1035
|
for (const mode of ['explicit', 'hybrid', 'locus']) {
|
|
1035
1036
|
const h = await harness([[answer()]], { proseRouting: mode });
|
|
1036
1037
|
const internals = h.framework;
|
|
1037
|
-
const
|
|
1038
|
-
|
|
1038
|
+
const earlierFields = () => ({ pin: 'chan-earlier', destination: 'chan-earlier', hybridHold: true,
|
|
1039
|
+
continuation: true, deliveries: ['chan-earlier'], suppressed: 2,
|
|
1040
|
+
triggerChannel: 'chan-earlier', locus: 'chan-earlier', engaged: new Set(['chan-earlier']), arrivals: [{ messageId: 'earlier-message', channelId: 'chan-earlier' }] });
|
|
1041
|
+
const earlier = earlierFields();
|
|
1039
1042
|
internals.turnRouting.set('assistant', earlier);
|
|
1040
1043
|
try {
|
|
1041
1044
|
await h.run();
|
|
@@ -1044,12 +1047,14 @@ test("a fresh turn starts new routing state in every mode, and leaves the earlie
|
|
|
1044
1047
|
assert.equal(now?.pin, undefined, `${mode}: no sticky destination`);
|
|
1045
1048
|
assert.equal(now?.destination, null, `${mode}: no turn destination`);
|
|
1046
1049
|
assert.equal(now?.hybridHold, false, `${mode}: no hybrid hold`);
|
|
1047
|
-
assert.equal(now?.
|
|
1048
|
-
assert.
|
|
1049
|
-
assert.
|
|
1050
|
-
assert.equal(now?.
|
|
1051
|
-
assert.
|
|
1052
|
-
|
|
1050
|
+
assert.equal(now?.continuation, false, `${mode}: no continuation`);
|
|
1051
|
+
assert.deepEqual(now?.deliveries, [], `${mode}: no deliveries carried into the new turn`);
|
|
1052
|
+
assert.equal(now?.suppressed, 0, `${mode}: no suppression carried into the new turn`);
|
|
1053
|
+
assert.equal(now?.triggerChannel, undefined, `${mode}: no trigger channel carried into the new turn`);
|
|
1054
|
+
assert.notEqual(now?.locus, 'chan-earlier', `${mode}: no locus carried into the new turn`);
|
|
1055
|
+
assert.deepEqual([...(now?.engaged ?? [])], [], `${mode}: no engaged channels carried into the new turn`);
|
|
1056
|
+
assert.deepEqual(now?.arrivals, [], `${mode}: no arrival carried into the new turn`);
|
|
1057
|
+
assert.deepEqual(earlier, earlierFields(), `${mode}: all earlier-turn routing and receipt state stays with its queued prose`);
|
|
1053
1058
|
}
|
|
1054
1059
|
finally {
|
|
1055
1060
|
await h.framework.stop();
|
|
@@ -1503,7 +1508,7 @@ async function compressionRig() {
|
|
|
1503
1508
|
const guard = new ToolResultGuard('Claude', cm, true);
|
|
1504
1509
|
const REAL = 'REAL-ACCEPTED-TOOL-OUTPUT';
|
|
1505
1510
|
const content = [{ type: 'tool_result', toolUseId: 'tu-1', content: REAL }];
|
|
1506
|
-
const messageId = guard.storeResults(content, [{ toolUseId: 'tu-1', content: REAL }], []);
|
|
1511
|
+
const messageId = guard.storeResults(content, [{ toolUseId: 'tu-1', content: REAL }], [], undefined, undefined);
|
|
1507
1512
|
// Deferred messages flushed right behind the staged batch push it out of
|
|
1508
1513
|
// the protected tail.
|
|
1509
1514
|
for (let i = 0; i < 6; i++)
|
|
@@ -2561,7 +2566,7 @@ test('#281: a compile waits for an annotation that began while it waited for ano
|
|
|
2561
2566
|
const compiled = r.guard.afterAnnotations(async () => { reads++; return [stub(r.messageId), stub(secondId)]; });
|
|
2562
2567
|
// A second batch settles while the compile waits for the first annotation.
|
|
2563
2568
|
r.cm.addMessage('Claude', [{ type: 'tool_use', id: 'tu-2', name: 'search', input: {} }]);
|
|
2564
|
-
secondId = r.guard.storeResults([{ type: 'tool_result', toolUseId: 'tu-2', content: 'SECOND' }], [{ toolUseId: 'tu-2', content: 'SECOND' }], []);
|
|
2569
|
+
secondId = r.guard.storeResults([{ type: 'tool_result', toolUseId: 'tu-2', content: 'SECOND' }], [{ toolUseId: 'tu-2', content: 'SECOND' }], [], undefined, undefined);
|
|
2565
2570
|
r.guard.submissionResults([{ toolUseId: 'tu-2', content: 'SECOND' }]);
|
|
2566
2571
|
assert.ok(r.guard.withhold('test-category'));
|
|
2567
2572
|
first.open();
|
|
@@ -2947,7 +2952,7 @@ test('#281: an annotation that starts while modules stop writes no file, and is
|
|
|
2947
2952
|
const stopModule = h.module.stop.bind(h.module);
|
|
2948
2953
|
h.module.stop = async () => {
|
|
2949
2954
|
// A settlement during shutdown, as a direct-API call that stop doesn't cancel can make.
|
|
2950
|
-
agent.toolResultGuard.storeResults([{ type: 'tool_result', toolUseId: 'late', content: 'late-original' }], [{ toolUseId: 'late', content: 'late-original' }], []);
|
|
2955
|
+
agent.toolResultGuard.storeResults([{ type: 'tool_result', toolUseId: 'late', content: 'late-original' }], [{ toolUseId: 'late', content: 'late-original' }], [], undefined, undefined);
|
|
2951
2956
|
agent.toolResultGuard.abandon('stopping');
|
|
2952
2957
|
await stopModule();
|
|
2953
2958
|
};
|
|
@@ -2965,6 +2970,219 @@ test('#281: an annotation that starts while modules stop writes no file, and is
|
|
|
2965
2970
|
await restarted.stop();
|
|
2966
2971
|
}
|
|
2967
2972
|
});
|
|
2973
|
+
test('#277: a write for a branch that waits for its mount while the branch changes is refused, and neither branch gets it', async () => {
|
|
2974
|
+
const dir = mkdtempSync(join(tmpdir(), 'af-guard-write-binary-'));
|
|
2975
|
+
dirs.push(dir);
|
|
2976
|
+
mkdirSync(join(dir, 'mount'));
|
|
2977
|
+
const store = JsStore.openOrCreate({ path: join(dir, 'store') });
|
|
2978
|
+
const workspace = new WorkspaceModule({ mounts: [{ name: 'work', path: join(dir, 'mount'), mode: 'read-write', watch: 'never' }] });
|
|
2979
|
+
workspace.initStore(store);
|
|
2980
|
+
try {
|
|
2981
|
+
const tree = 'workspace/work/tree';
|
|
2982
|
+
const source = store.currentBranch().name;
|
|
2983
|
+
const before = store.currentSequence();
|
|
2984
|
+
// Hold the mount's turn, as a pass on it would: the write queues behind it.
|
|
2985
|
+
const internals = workspace;
|
|
2986
|
+
let release;
|
|
2987
|
+
const gate = new Promise((resolve) => { release = resolve; });
|
|
2988
|
+
const held = internals.withMount(internals.mounts.get('work'), () => gate);
|
|
2989
|
+
const writing = workspace.writeBinary('work/tool-results/late.txt', Buffer.from('late'), 'text/plain', { branch: source });
|
|
2990
|
+
store.createBranchAt('elsewhere', source, before);
|
|
2991
|
+
store.switchBranch('elsewhere');
|
|
2992
|
+
release();
|
|
2993
|
+
await held;
|
|
2994
|
+
assert.deepEqual(await writing, { success: false, error: 'the workspace had left the branch this file is for', isError: true,
|
|
2995
|
+
data: { branchLeft: true } });
|
|
2996
|
+
assert.equal(store.treeGet(tree, 'tool-results/late.txt'), null, 'nothing lands on the branch switched to');
|
|
2997
|
+
store.switchBranch(source);
|
|
2998
|
+
assert.equal(store.treeGet(tree, 'tool-results/late.txt'), null, 'nor on the branch the write named');
|
|
2999
|
+
}
|
|
3000
|
+
finally {
|
|
3001
|
+
store.close();
|
|
3002
|
+
}
|
|
3003
|
+
});
|
|
3004
|
+
// ---------------------------------------------------------------------------
|
|
3005
|
+
// #277's second half: a withheld result keeps the file lists its tool marked
|
|
3006
|
+
// (ToolResult.keepWhenWithheld) inline in its stub. materialize, sync and
|
|
3007
|
+
// delete mark theirs; nothing else does.
|
|
3008
|
+
// ---------------------------------------------------------------------------
|
|
3009
|
+
const LISTS = ' Kept from its result: ';
|
|
3010
|
+
/** The file lists a stub kept, parsed; undefined when it kept none. */
|
|
3011
|
+
const keptLists = (stub) => stub.includes(LISTS) ? JSON.parse(stub.slice(stub.indexOf(LISTS) + LISTS.length)) : undefined;
|
|
3012
|
+
const toolUse = (id, name, input = {}) => createMockResponse([{ type: 'tool_use', id, name, input }], 'tool_use');
|
|
3013
|
+
test('#277: a stub keeps the file lists after where the original is, for each place it can be', () => {
|
|
3014
|
+
const notice = 'Tool result withheld by the guard. The tool has already executed.';
|
|
3015
|
+
const lists = '{"materialized":[{"mount":"work","path":"LOG.md"}]}';
|
|
3016
|
+
assert.equal(withheldResultNotice({ path: 'work/tool-results/x.txt' }, true, lists), `${notice} Its result is in workspace file work/tool-results/x.txt. Kept from its result: ${lists}`);
|
|
3017
|
+
assert.equal(withheldResultNotice({ path: 'work/tool-results/x.txt', error: 'disk full' }, true, lists), `${notice} Writing its result to workspace file work/tool-results/x.txt failed, ` +
|
|
3018
|
+
`so it is kept only in the guard's audit record (framework/tool-result-guard), for an operator. Kept from its result: ${lists}`);
|
|
3019
|
+
assert.equal(withheldResultNotice({ path: 'work/tool-results/y.txt', unfinished: true }, true, lists), `${notice} Its result was still being written to workspace file work/tool-results/y.txt when this note was made; ` +
|
|
3020
|
+
`if that file is missing, it is kept in the guard's audit record (framework/tool-result-guard), for an operator. ` +
|
|
3021
|
+
`Kept from its result: ${lists}`);
|
|
3022
|
+
assert.equal(withheldResultNotice(null, false, lists), `${notice} Its result went to the guard's audit record (framework/tool-result-guard), for an operator, ` +
|
|
3023
|
+
`though saving that record had failed when the result arrived. Kept from its result: ${lists}`);
|
|
3024
|
+
assert.equal(withheldResultNotice(null, true, undefined), AUDIT_STUB, 'nothing kept: the stub is as before');
|
|
3025
|
+
});
|
|
3026
|
+
test('#277: a result keeps the fields its tool marked, in the order marked, cut at the inline cap', () => {
|
|
3027
|
+
const data = { materialized: [{ mount: 'work', path: 'LOG.md' }], count: 1, deleted: [{ mount: 'work', path: 'old.txt' }],
|
|
3028
|
+
skipped: [{ mount: 'work', reason: 'a.txt: divergent' }] };
|
|
3029
|
+
assert.equal(keptWhenWithheld({ success: true, data, keepWhenWithheld: ['deleted', 'materialized'] }, undefined), '{"deleted":[{"mount":"work","path":"old.txt"}],"materialized":[{"mount":"work","path":"LOG.md"}]}');
|
|
3030
|
+
assert.equal(keptWhenWithheld({ success: true, data: { materialized: [], count: 0 }, keepWhenWithheld: ['deleted', 'materialized'] }, undefined), '{"materialized":[]}', 'a marked field the result lacks is left out; an empty list is kept');
|
|
3031
|
+
for (const result of [
|
|
3032
|
+
{ success: true, data },
|
|
3033
|
+
{ success: true, data, keepWhenWithheld: [] },
|
|
3034
|
+
{ success: true, data, keepWhenWithheld: ['absent'] },
|
|
3035
|
+
{ success: true, data: 'text', keepWhenWithheld: ['length'] },
|
|
3036
|
+
{ success: true, data: [{ path: 'a' }], keepWhenWithheld: ['0'] },
|
|
3037
|
+
{ success: false, isError: true, error: 'failed', data: { path: 'work/a.txt' }, keepWhenWithheld: ['path'] },
|
|
3038
|
+
// A failure is success false, whatever isError says.
|
|
3039
|
+
{ success: false, isError: false, error: 'failed', data: { path: 'work/a.txt' }, keepWhenWithheld: ['path'] },
|
|
3040
|
+
// No data at all, with marks.
|
|
3041
|
+
{ success: true, data: null, keepWhenWithheld: ['path'] },
|
|
3042
|
+
{ success: true, keepWhenWithheld: ['path'] },
|
|
3043
|
+
])
|
|
3044
|
+
assert.equal(keptWhenWithheld(result, undefined), undefined, `keeps nothing: ${JSON.stringify(result)}`);
|
|
3045
|
+
const long = { written: Array.from({ length: 200 }, (_, i) => `file-${i}.txt`) };
|
|
3046
|
+
const cut = keptWhenWithheld({ success: true, data: long, keepWhenWithheld: ['written'] }, 1000);
|
|
3047
|
+
const whole = JSON.stringify(long);
|
|
3048
|
+
assert.ok(whole.length > 1000);
|
|
3049
|
+
// The note says what was cut and where the rest is, not "original was N",
|
|
3050
|
+
// which would read as the whole result's size.
|
|
3051
|
+
assert.equal(cut, `${whole.slice(0, 1000)} [cut at the inline cap: 1000 of these fields' ${whole.length} characters; ` +
|
|
3052
|
+
'the whole result is where this note says]');
|
|
3053
|
+
// A cut never leaves half a surrogate pair.
|
|
3054
|
+
// '{"name":"' is 9 characters and each emoji 2, so a cap of 14 falls inside the third.
|
|
3055
|
+
const emoji = keptWhenWithheld({ success: true, data: { name: '\u{1F600}'.repeat(10) }, keepWhenWithheld: ['name'] }, 14);
|
|
3056
|
+
const loneSurrogate = /[\ud800-\udbff](?![\udc00-\udfff])|(?<![\ud800-\udbff])[\udc00-\udfff]/;
|
|
3057
|
+
assert.doesNotMatch(emoji, loneSurrogate, `well-formed: ${JSON.stringify(emoji)}`);
|
|
3058
|
+
assert.match(emoji, /^\{"name":"\u{1F600}\u{1F600} \[cut at the inline cap: 13 of these fields' 31 characters;/u);
|
|
3059
|
+
});
|
|
3060
|
+
test('#277: a withheld batch keeps what each marked result listed; an unmarked one keeps nothing, and its file has everything', async () => {
|
|
3061
|
+
const h = await workspaceHarness([[calls('marked', 'plain'), refused()], [answer()]]);
|
|
3062
|
+
h.module.results.marked = { success: true, data: { written: ['LOG.md'], detail: 'payload-marked' }, keepWhenWithheld: ['written'] };
|
|
3063
|
+
try {
|
|
3064
|
+
await h.run();
|
|
3065
|
+
const [marked, plain] = toolResults(h.framework).map((block) => String(block.content));
|
|
3066
|
+
assert.deepEqual(keptLists(marked), { written: ['LOG.md'] });
|
|
3067
|
+
assert.doesNotMatch(marked, /payload-marked/, 'only the marked field is kept');
|
|
3068
|
+
assert.match(marked, /^Tool result withheld by the guard\. The tool has already executed\. Its result is in workspace file work\/tool-results\/\S+-0-marked\.txt\. Kept from its result: /);
|
|
3069
|
+
assert.equal(keptLists(plain), undefined);
|
|
3070
|
+
assert.match(plain, /Its result is in workspace file work\/tool-results\/\S+-1-plain\.txt\.$/);
|
|
3071
|
+
const file = await h.workspace.readBinary(/workspace file (\S+\.txt)\./.exec(marked)[1]);
|
|
3072
|
+
assert.match(file.data.toString('utf8'), /payload-marked/, 'the file holds the whole result');
|
|
3073
|
+
const retried = h.membrane.requests[1].messages.flatMap((m) => m.content).filter((b) => b.type === 'tool_result');
|
|
3074
|
+
assert.deepEqual(retried.map((b) => b.content), [marked, plain], 'the retry already carries the lists');
|
|
3075
|
+
assert.doesNotMatch(marked, /refus|test-category/, "#159's line: no refusal or category in the context");
|
|
3076
|
+
}
|
|
3077
|
+
finally {
|
|
3078
|
+
await h.framework.stop();
|
|
3079
|
+
}
|
|
3080
|
+
});
|
|
3081
|
+
test('#277: a marked result skipped for a branch change keeps its fields in the stub that names the audit record', async () => {
|
|
3082
|
+
const h = await workspaceHarness([[calls('marked', 'plain'), refused()], [answer()]]);
|
|
3083
|
+
h.module.results.marked = { success: true, data: { written: ['LOG.md'], detail: 'payload-marked' }, keepWhenWithheld: ['written'] };
|
|
3084
|
+
// Declined where it commits, and the store is back on the batch's branch by
|
|
3085
|
+
// the edit, as after an undo and a redo.
|
|
3086
|
+
h.framework.writeToolResultFile = async () => ({ path: 'work/tool-results/declined.txt', branchLeft: true });
|
|
3087
|
+
try {
|
|
3088
|
+
await bounded(h.run(), 'the run');
|
|
3089
|
+
const [marked, plain] = toolResults(h.framework).map((block) => String(block.content));
|
|
3090
|
+
assert.equal(plain, AUDIT_STUB);
|
|
3091
|
+
assert.ok(marked.startsWith(`${AUDIT_STUB} Kept from its result: `), marked);
|
|
3092
|
+
assert.deepEqual(keptLists(marked), { written: ['LOG.md'] });
|
|
3093
|
+
}
|
|
3094
|
+
finally {
|
|
3095
|
+
await h.framework.stop();
|
|
3096
|
+
}
|
|
3097
|
+
});
|
|
3098
|
+
test('#277: with no writable workspace the stub still keeps the file lists, cut at the agent\'s inline cap', async () => {
|
|
3099
|
+
const written = Array.from({ length: 200 }, (_, i) => `file-${i}.txt`);
|
|
3100
|
+
const h = await harness([[calls('marked'), refused()], [answer()]], { toolResultGuard: true }, { marked: { success: true, data: { written }, keepWhenWithheld: ['written'] } });
|
|
3101
|
+
try {
|
|
3102
|
+
const spill = [...h.framework.collectAgentSettingsExtensions().values()].find((ext) => ext.keys.includes('tool_result_inline_max_chars'));
|
|
3103
|
+
spill.update('assistant', { tool_result_inline_max_chars: 1000 });
|
|
3104
|
+
await h.run();
|
|
3105
|
+
const stub = String(toolResults(h.framework)[0].content);
|
|
3106
|
+
const whole = JSON.stringify({ written });
|
|
3107
|
+
assert.equal(stub, `${AUDIT_STUB}${LISTS}${whole.slice(0, 1000)} [cut at the inline cap: 1000 of these fields' ` +
|
|
3108
|
+
`${whole.length} characters; the whole result is where this note says]`);
|
|
3109
|
+
}
|
|
3110
|
+
finally {
|
|
3111
|
+
await h.framework.stop();
|
|
3112
|
+
}
|
|
3113
|
+
});
|
|
3114
|
+
test('#277: direct API: a withheld result keeps its file lists, cut at the house default cap it was stored under', async () => {
|
|
3115
|
+
const h = await harness([], { toolResultGuard: true });
|
|
3116
|
+
const responses = [calls('marked'), refused(), answer()];
|
|
3117
|
+
h.membrane.stream = async () => {
|
|
3118
|
+
const response = responses.shift();
|
|
3119
|
+
assert.ok(response);
|
|
3120
|
+
return response;
|
|
3121
|
+
};
|
|
3122
|
+
try {
|
|
3123
|
+
const agent = h.framework.getAgent('assistant');
|
|
3124
|
+
agent.getContextManager().addMessage('user', [{ type: 'text', text: 'read' }]);
|
|
3125
|
+
await agent.runInference(h.framework.getAllTools());
|
|
3126
|
+
const written = Array.from({ length: 3000 }, (_, i) => `file-${i}.txt`);
|
|
3127
|
+
agent.provideToolResult('marked', { success: true, data: { written }, keepWhenWithheld: ['written'] });
|
|
3128
|
+
await agent.runInference(h.framework.getAllTools());
|
|
3129
|
+
const stub = String(toolResults(h.framework)[0].content);
|
|
3130
|
+
const whole = JSON.stringify({ written });
|
|
3131
|
+
assert.ok(whole.length > DEFAULT_TOOL_RESULT_INLINE_MAX_CHARS);
|
|
3132
|
+
assert.equal(stub, `${AUDIT_STUB}${LISTS}${whole.slice(0, DEFAULT_TOOL_RESULT_INLINE_MAX_CHARS)}` +
|
|
3133
|
+
` [cut at the inline cap: ${DEFAULT_TOOL_RESULT_INLINE_MAX_CHARS} of these fields' ${whole.length} characters; ` +
|
|
3134
|
+
'the whole result is where this note says]');
|
|
3135
|
+
}
|
|
3136
|
+
finally {
|
|
3137
|
+
await h.framework.stop();
|
|
3138
|
+
}
|
|
3139
|
+
});
|
|
3140
|
+
test('#283: a withheld materialize keeps the deletions it made; sync keeps a root it accepted ahead of its results', async () => {
|
|
3141
|
+
const h = await workspaceHarness([[toolUse('m', 'workspace--materialize', { applyDeletions: true }), refused()], [answer()]]);
|
|
3142
|
+
const call = (name, input = {}) => h.workspace.handleToolCall({ id: name, name, input });
|
|
3143
|
+
try {
|
|
3144
|
+
// A file on disk that the workspace then deletes: the agent's materialize removes it.
|
|
3145
|
+
assert.equal((await h.workspace.writeBinary('work/old.txt', Buffer.from('old'), 'text/plain')).success, true);
|
|
3146
|
+
assert.equal((await call('materialize')).success, true);
|
|
3147
|
+
assert.equal((await call('delete', { path: 'work/old.txt' })).success, true);
|
|
3148
|
+
await h.run();
|
|
3149
|
+
const [materialize] = toolResults(h.framework).map((block) => String(block.content));
|
|
3150
|
+
assert.deepEqual(keptLists(materialize), { deleted: [{ mount: 'work', path: 'old.txt' }], materialized: [] }, materialize);
|
|
3151
|
+
// sync marks a root it accepted first, so a long results list can't cut it away.
|
|
3152
|
+
const synced = await call('sync');
|
|
3153
|
+
assert.deepEqual(synced.keepWhenWithheld, ['rootsAccepted', 'results']);
|
|
3154
|
+
}
|
|
3155
|
+
finally {
|
|
3156
|
+
await h.framework.stop();
|
|
3157
|
+
}
|
|
3158
|
+
});
|
|
3159
|
+
test('#277: withheld materialize, sync and delete keep the files they acted on in their stubs', async () => {
|
|
3160
|
+
const h = await workspaceHarness([
|
|
3161
|
+
[toolUse('m', 'workspace--materialize'), refused()], [answer()],
|
|
3162
|
+
[toolUse('s', 'workspace--sync'), refused()], [answer()],
|
|
3163
|
+
[toolUse('d', 'workspace--delete', { path: 'work/LOG.md' }), refused()], [answer()],
|
|
3164
|
+
]);
|
|
3165
|
+
try {
|
|
3166
|
+
// A workspace draft disk doesn't have yet: the materialize writes it.
|
|
3167
|
+
assert.equal((await h.workspace.writeBinary('work/LOG.md', Buffer.from('log'), 'text/plain')).success, true);
|
|
3168
|
+
await h.run();
|
|
3169
|
+
// A file disk has and the workspace doesn't: the sync takes it in.
|
|
3170
|
+
const mountDir = /^(.*)\/LOG\.md$/.exec(h.workspace.resolveAbsolutePath('work/LOG.md'))[1];
|
|
3171
|
+
writeFileSync(join(mountDir, 'disk.txt'), 'from disk');
|
|
3172
|
+
await h.run();
|
|
3173
|
+
await h.run();
|
|
3174
|
+
const [materialize, sync, del] = toolResults(h.framework).map((block) => String(block.content));
|
|
3175
|
+
assert.deepEqual(keptLists(materialize), { materialized: [{ mount: 'work', path: 'LOG.md' }] }, materialize);
|
|
3176
|
+
const synced = keptLists(sync);
|
|
3177
|
+
assert.deepEqual(synced.results.map((r) => [r.mount, r.synced]), [['work', ['disk.txt']]], sync);
|
|
3178
|
+
assert.deepEqual(keptLists(del), { path: 'work/LOG.md', deleted: true }, del);
|
|
3179
|
+
for (const stub of [materialize, sync, del])
|
|
3180
|
+
assert.match(stub, /^Tool result withheld by the guard\. The tool has already executed\. Its result is in workspace file /);
|
|
3181
|
+
}
|
|
3182
|
+
finally {
|
|
3183
|
+
await h.framework.stop();
|
|
3184
|
+
}
|
|
3185
|
+
});
|
|
2968
3186
|
test('an unexpected annotation exception releases its compression hold', async () => {
|
|
2969
3187
|
const r = await compressionRig();
|
|
2970
3188
|
const branch = r.cm.currentBranch.bind(r.cm);
|
|
@@ -3099,7 +3317,7 @@ test("a batch's deadline is taken when it is queued, not when the batches ahead
|
|
|
3099
3317
|
await until(() => entered === 1, 'the first annotation is writing');
|
|
3100
3318
|
// A second batch queued behind the first, still writing.
|
|
3101
3319
|
r.cm.addMessage('Claude', [{ type: 'tool_use', id: 'tu-2', name: 'search', input: {} }]);
|
|
3102
|
-
r.guard.storeResults([{ type: 'tool_result', toolUseId: 'tu-2', content: 'SECOND' }], [{ toolUseId: 'tu-2', content: 'SECOND' }], []);
|
|
3320
|
+
r.guard.storeResults([{ type: 'tool_result', toolUseId: 'tu-2', content: 'SECOND' }], [{ toolUseId: 'tu-2', content: 'SECOND' }], [], undefined, undefined);
|
|
3103
3321
|
r.guard.submissionResults([{ toolUseId: 'tu-2', content: 'SECOND' }]);
|
|
3104
3322
|
assert.ok(r.guard.withhold('test-category'));
|
|
3105
3323
|
assert.equal(taken, 2, "the second batch's deadline was taken when it was queued");
|
|
@@ -3196,7 +3414,7 @@ test('stop then start reopens withheld spills', async () => {
|
|
|
3196
3414
|
await framework.stop();
|
|
3197
3415
|
framework.start();
|
|
3198
3416
|
const guard = framework.getAgent('assistant').toolResultGuard;
|
|
3199
|
-
guard.storeResults([{ type: 'tool_result', toolUseId: 'one', content: 'original' }], [{ toolUseId: 'one', content: 'original' }], []);
|
|
3417
|
+
guard.storeResults([{ type: 'tool_result', toolUseId: 'one', content: 'original' }], [{ toolUseId: 'one', content: 'original' }], [], undefined, undefined);
|
|
3200
3418
|
guard.abandon('test');
|
|
3201
3419
|
await guard.whenAnnotated();
|
|
3202
3420
|
assert.equal(writes, 1);
|
|
@@ -3230,6 +3448,13 @@ test('a framework compile from before stop cannot drive after restart', async ()
|
|
|
3230
3448
|
return result;
|
|
3231
3449
|
};
|
|
3232
3450
|
let starting;
|
|
3451
|
+
// The dropped turn's inference:* events, as a module's trace listener sees them.
|
|
3452
|
+
const turnEvents = [];
|
|
3453
|
+
const unsubscribe = framework.onTrace((event) => {
|
|
3454
|
+
if (event.type.startsWith('inference:') && event.agentName === 'assistant') {
|
|
3455
|
+
turnEvents.push({ type: event.type, ...('reason' in event ? { reason: String(event.reason) } : {}) });
|
|
3456
|
+
}
|
|
3457
|
+
});
|
|
3233
3458
|
try {
|
|
3234
3459
|
const lines = [];
|
|
3235
3460
|
const error = console.error;
|
|
@@ -3247,6 +3472,11 @@ test('a framework compile from before stop cannot drive after restart', async ()
|
|
|
3247
3472
|
}
|
|
3248
3473
|
assert.equal(driven, 0);
|
|
3249
3474
|
assert.ok(lines.some((line) => /stopped and started again/.test(line) && /dropped before it sends anything/.test(line)), lines.join('\n'));
|
|
3475
|
+
// The turn emitted inference:started before its compile, so it gets one
|
|
3476
|
+
// terminal event: a listener's bracket (a typing loop) closes.
|
|
3477
|
+
assert.deepEqual(turnEvents.map((event) => event.type), ['inference:started', 'inference:aborted']);
|
|
3478
|
+
assert.match(turnEvents[1]?.reason ?? '', /stopped and started again.*dropped before it sends anything/);
|
|
3479
|
+
unsubscribe();
|
|
3250
3480
|
// A turn begun after the restart is admitted and drives its stream.
|
|
3251
3481
|
await framework.startAgentStream(agent);
|
|
3252
3482
|
await until(() => driven === 1, 'the turn begun after the restart drives');
|
|
@@ -3258,6 +3488,112 @@ test('a framework compile from before stop cannot drive after restart', async ()
|
|
|
3258
3488
|
store.close();
|
|
3259
3489
|
}
|
|
3260
3490
|
});
|
|
3491
|
+
// A turn dropped before it sends anything, at either check: before its
|
|
3492
|
+
// compile (it waits in a module's gatherContext) or after it (it waits in its
|
|
3493
|
+
// compile). Each way it can lose its place: the framework stops, the agent is
|
|
3494
|
+
// removed, the agent object is replaced under its name, or the replacement's
|
|
3495
|
+
// own turn already holds the name's turn token.
|
|
3496
|
+
for (const phase of ['before', 'after']) {
|
|
3497
|
+
for (const how of ['stopping', 'removed', 'disposed', 'replaced', 'superseded']) {
|
|
3498
|
+
const title = { stopping: 'the framework stopping', removed: 'its agent removed',
|
|
3499
|
+
disposed: 'its run disposed with its record', replaced: 'its agent replaced',
|
|
3500
|
+
superseded: "a newer turn of its agent's name running" }[how];
|
|
3501
|
+
test(`a turn dropped ${phase} its compile, with ${title}, ${how === 'superseded' ? "leaves the newer turn's bracket alone" : 'ends with inference:aborted'}`, async () => {
|
|
3502
|
+
const dir = mkdtempSync(join(tmpdir(), `guard-drop-${phase}-compile-`));
|
|
3503
|
+
dirs.push(dir);
|
|
3504
|
+
const store = JsStore.openOrCreate({ path: join(dir, 'store') });
|
|
3505
|
+
const membrane = new ScriptMembrane([[answer()]]);
|
|
3506
|
+
const framework = await AgentFramework.create({ store, membrane: membrane.asMembrane(),
|
|
3507
|
+
agents: [{ name: 'assistant', model: 'test', systemPrompt: 'system' }],
|
|
3508
|
+
modules: [], syncIntervalMs: 0, maintenanceIntervalMs: 0 });
|
|
3509
|
+
const agent = framework.getAgent('assistant');
|
|
3510
|
+
const internal = framework;
|
|
3511
|
+
const held = gate();
|
|
3512
|
+
const entered = gate();
|
|
3513
|
+
if (phase === 'before') {
|
|
3514
|
+
internal.moduleRegistry.gatherContext = async () => { entered.open(); await held.opened; return []; };
|
|
3515
|
+
}
|
|
3516
|
+
else {
|
|
3517
|
+
const build = agent.buildActivationRequest.bind(agent);
|
|
3518
|
+
agent.buildActivationRequest = async (...args) => { entered.open(); await held.opened; return build(...args); };
|
|
3519
|
+
}
|
|
3520
|
+
const turnEvents = [];
|
|
3521
|
+
framework.onTrace((event) => {
|
|
3522
|
+
if (event.type.startsWith('inference:') && event.agentName === 'assistant') {
|
|
3523
|
+
turnEvents.push({ type: event.type,
|
|
3524
|
+
...('reason' in event ? { reason: String(event.reason) } : {}),
|
|
3525
|
+
...('durationMs' in event ? { durationMs: Number(event.durationMs) } : {}) });
|
|
3526
|
+
}
|
|
3527
|
+
});
|
|
3528
|
+
const lines = [];
|
|
3529
|
+
const error = console.error;
|
|
3530
|
+
console.error = (...args) => { lines.push(args.map(String).join(' ')); };
|
|
3531
|
+
const heldMs = 25;
|
|
3532
|
+
let starting;
|
|
3533
|
+
try {
|
|
3534
|
+
starting = framework.startAgentStream(agent);
|
|
3535
|
+
await entered.opened;
|
|
3536
|
+
if (how === 'stopping')
|
|
3537
|
+
await framework.stop();
|
|
3538
|
+
else if (how === 'removed')
|
|
3539
|
+
internal.agents.delete('assistant');
|
|
3540
|
+
else if (how === 'disposed') {
|
|
3541
|
+
// As runEphemeralToCompletion's disposal does: the agent, its record and its token go.
|
|
3542
|
+
internal.agents.delete('assistant');
|
|
3543
|
+
internal.lastInferenceAt.delete('assistant');
|
|
3544
|
+
internal.activeTurnTokens.delete('assistant');
|
|
3545
|
+
}
|
|
3546
|
+
else {
|
|
3547
|
+
internal.agents.set('assistant', Object.create(agent));
|
|
3548
|
+
if (how === 'superseded')
|
|
3549
|
+
internal.activeTurnTokens.set('assistant', -1);
|
|
3550
|
+
}
|
|
3551
|
+
await new Promise((resolve) => setTimeout(resolve, heldMs));
|
|
3552
|
+
held.open();
|
|
3553
|
+
await starting;
|
|
3554
|
+
}
|
|
3555
|
+
finally {
|
|
3556
|
+
console.error = error;
|
|
3557
|
+
held.open();
|
|
3558
|
+
await starting;
|
|
3559
|
+
}
|
|
3560
|
+
try {
|
|
3561
|
+
const why = how === 'stopping' ? 'the framework was stopping' : 'the agent was replaced or removed';
|
|
3562
|
+
const reason = `a turn ${phase === 'before' ? 'assembled' : 'compiled'} while ${why} is dropped before it sends anything`;
|
|
3563
|
+
assert.ok(lines.some((line) => line.includes(reason)), lines.join('\n'));
|
|
3564
|
+
const last = internal.lastInferenceAt.get('assistant');
|
|
3565
|
+
if (how === 'superseded') {
|
|
3566
|
+
// The terminal event and lastInference carry only the name, so they
|
|
3567
|
+
// would end the newer turn: the dropped frame emits and records nothing.
|
|
3568
|
+
assert.deepEqual(turnEvents.map((event) => event.type), ['inference:started']);
|
|
3569
|
+
assert.equal(last?.endedAt, undefined);
|
|
3570
|
+
}
|
|
3571
|
+
else {
|
|
3572
|
+
assert.deepEqual(turnEvents.map((event) => event.type), ['inference:started', 'inference:aborted']);
|
|
3573
|
+
assert.equal(turnEvents[1]?.reason, reason);
|
|
3574
|
+
const durationMs = turnEvents[1]?.durationMs ?? NaN;
|
|
3575
|
+
assert.ok(Number.isFinite(durationMs) && durationMs >= heldMs - 5 && durationMs < 60_000, `durationMs ${durationMs}`);
|
|
3576
|
+
if (how === 'disposed') {
|
|
3577
|
+
// The terminal event still closes a listener's bracket, but the
|
|
3578
|
+
// disposed name gets no record back.
|
|
3579
|
+
assert.equal(internal.lastInferenceAt.has('assistant'), false, JSON.stringify(last));
|
|
3580
|
+
}
|
|
3581
|
+
else {
|
|
3582
|
+
assert.ok(last?.endedAt !== undefined && last.endedAt >= (last.startedAt ?? Infinity), JSON.stringify(last));
|
|
3583
|
+
}
|
|
3584
|
+
}
|
|
3585
|
+
}
|
|
3586
|
+
finally {
|
|
3587
|
+
if (how === 'superseded')
|
|
3588
|
+
internal.activeTurnTokens.delete('assistant');
|
|
3589
|
+
if (how !== 'stopping')
|
|
3590
|
+
internal.agents.set('assistant', agent);
|
|
3591
|
+
await framework.stop();
|
|
3592
|
+
store.close();
|
|
3593
|
+
}
|
|
3594
|
+
});
|
|
3595
|
+
}
|
|
3596
|
+
}
|
|
3261
3597
|
// Drain async storage/annotation continuations without advancing deadline time.
|
|
3262
3598
|
async function flushAsync() {
|
|
3263
3599
|
for (let i = 0; i < 8; i++)
|
|
@@ -3278,7 +3614,7 @@ test('slow successful writes share one batch deadline', async (t) => {
|
|
|
3278
3614
|
const guard = h.framework.getAgent('assistant').toolResultGuard;
|
|
3279
3615
|
try {
|
|
3280
3616
|
t.mock.timers.enable({ apis: ['Date', 'setTimeout'], now: Date.now() });
|
|
3281
|
-
guard.storeResults(['one', 'two', 'three'].map((id) => ({ type: 'tool_result', toolUseId: id, content: id })), ['one', 'two', 'three'].map((id) => ({ toolUseId: id, content: id })), []);
|
|
3617
|
+
guard.storeResults(['one', 'two', 'three'].map((id) => ({ type: 'tool_result', toolUseId: id, content: id })), ['one', 'two', 'three'].map((id) => ({ toolUseId: id, content: id })), [], undefined, undefined);
|
|
3282
3618
|
guard.abandon('test');
|
|
3283
3619
|
let annotated = false;
|
|
3284
3620
|
void guard.whenAnnotated().then(() => { annotated = true; });
|