harnery 0.35.0 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commander.d.ts +30 -5
- package/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +124 -96
- package/dist/commands/agents.d.ts +23 -3
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +379 -198
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +10 -10
- package/dist/commands/browse-session.d.ts.map +1 -1
- package/dist/commands/browse-session.js +12 -0
- package/dist/commands/browse.d.ts +1 -1
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +5 -4
- package/dist/commands/conversations.d.ts +10 -0
- package/dist/commands/conversations.d.ts.map +1 -0
- package/dist/commands/conversations.js +201 -0
- package/dist/commands/deinit.d.ts.map +1 -1
- package/dist/commands/deinit.js +5 -0
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +13 -2
- package/dist/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +51 -7
- package/dist/commands/fetch.js +6 -5
- package/dist/commands/files.d.ts +22 -0
- package/dist/commands/files.d.ts.map +1 -0
- package/dist/commands/files.js +113 -0
- package/dist/commands/governor.js +14 -12
- package/dist/commands/inbox.d.ts +5 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +57 -0
- package/dist/commands/init.d.ts +4 -5
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +63 -13
- package/dist/commands/ledger-v3.d.ts.map +1 -1
- package/dist/commands/ledger-v3.js +347 -1
- package/dist/commands/logs.d.ts +4 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +169 -0
- package/dist/commands/messages.d.ts +5 -0
- package/dist/commands/messages.d.ts.map +1 -0
- package/dist/commands/messages.js +45 -0
- package/dist/commands/outline.d.ts +1 -1
- package/dist/commands/outline.d.ts.map +1 -1
- package/dist/commands/outline.js +2 -2
- package/dist/commands/read.d.ts +1 -1
- package/dist/commands/read.d.ts.map +1 -1
- package/dist/commands/read.js +2 -2
- package/dist/commands/semantic.d.ts.map +1 -1
- package/dist/commands/semantic.js +54 -2
- package/dist/commands/storage.d.ts +4 -0
- package/dist/commands/storage.d.ts.map +1 -0
- package/dist/commands/storage.js +238 -0
- package/dist/commands/tunnel.d.ts +5 -1
- package/dist/commands/tunnel.d.ts.map +1 -1
- package/dist/commands/tunnel.js +44 -31
- package/dist/commands/web.d.ts +3 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +67 -7
- package/dist/commands/work.js +3 -3
- package/dist/commands/workflow.js +13 -13
- package/dist/core/adapters/profiles.d.ts +1 -1
- package/dist/core/agents/cli.js +209 -39
- package/dist/core/agents/live-authority-v3.d.ts +47 -1
- package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
- package/dist/core/agents/live-authority-v3.js +244 -10
- package/dist/core/agents/live-lifecycle-v3.js +6 -1
- package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
- package/dist/core/agents/live-observation-v3.js +6 -1
- package/dist/core/agents/render/prompt-context.d.ts +9 -3
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +24 -7
- package/dist/core/agents/rules/stop-hook.d.ts +2 -0
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +94 -13
- package/dist/core/agents/rules/verdict.d.ts +1 -0
- package/dist/core/agents/rules/verdict.d.ts.map +1 -1
- package/dist/core/agents/session-events.d.ts.map +1 -1
- package/dist/core/agents/session-events.js +4 -0
- package/dist/core/agents/session-finalization-state-v3.js +1 -1
- package/dist/core/agents/session-finalizer-v3.js +5 -1
- package/dist/core/agents/state/activity-log.d.ts +3 -0
- package/dist/core/agents/state/activity-log.d.ts.map +1 -1
- package/dist/core/agents/state/activity-log.js +6 -3
- package/dist/core/agents/state/heartbeat-writer.d.ts +6 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +18 -0
- package/dist/core/agents/state/live-coordination-view.d.ts +5 -7
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +15 -90
- package/dist/core/agents/state/live-coordination-writer.d.ts +12 -0
- package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -0
- package/dist/core/agents/state/live-coordination-writer.js +92 -0
- package/dist/core/artifacts/index.d.ts +21 -0
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +46 -1
- package/dist/core/config.d.ts +62 -4
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +98 -4
- package/dist/core/conversations/archive.d.ts +49 -0
- package/dist/core/conversations/archive.d.ts.map +1 -0
- package/dist/core/conversations/archive.js +136 -0
- package/dist/core/conversations/catalog.d.ts +10 -0
- package/dist/core/conversations/catalog.d.ts.map +1 -0
- package/dist/core/conversations/catalog.js +72 -0
- package/dist/core/conversations/context-pack.d.ts +6 -0
- package/dist/core/conversations/context-pack.d.ts.map +1 -0
- package/dist/core/conversations/context-pack.js +60 -0
- package/dist/core/conversations/contract.d.ts +155 -0
- package/dist/core/conversations/contract.d.ts.map +1 -0
- package/dist/core/conversations/contract.js +1 -0
- package/dist/core/conversations/evaluation.d.ts +16 -0
- package/dist/core/conversations/evaluation.d.ts.map +1 -0
- package/dist/core/conversations/evaluation.js +9 -0
- package/dist/core/conversations/index.d.ts +10 -0
- package/dist/core/conversations/index.d.ts.map +1 -0
- package/dist/core/conversations/index.js +9 -0
- package/dist/core/conversations/lifecycle.d.ts +28 -0
- package/dist/core/conversations/lifecycle.d.ts.map +1 -0
- package/dist/core/conversations/lifecycle.js +29 -0
- package/dist/core/conversations/normalize.d.ts +14 -0
- package/dist/core/conversations/normalize.d.ts.map +1 -0
- package/dist/core/conversations/normalize.js +82 -0
- package/dist/core/conversations/query.d.ts +8 -0
- package/dist/core/conversations/query.d.ts.map +1 -0
- package/dist/core/conversations/query.js +280 -0
- package/dist/core/conversations/search-index.d.ts +9 -0
- package/dist/core/conversations/search-index.d.ts.map +1 -0
- package/dist/core/conversations/search-index.js +29 -0
- package/dist/core/events/legacy-storage/canary.d.ts +18 -0
- package/dist/core/events/legacy-storage/canary.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/canary.js +150 -0
- package/dist/core/events/legacy-storage/fence.d.ts +15 -0
- package/dist/core/events/legacy-storage/fence.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/fence.js +115 -0
- package/dist/core/events/legacy-storage/index.d.ts +6 -0
- package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/index.js +5 -0
- package/dist/core/events/legacy-storage/inventory.d.ts +10 -0
- package/dist/core/events/legacy-storage/inventory.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/inventory.js +40 -0
- package/dist/core/events/legacy-storage/manifest.d.ts +23 -0
- package/dist/core/events/legacy-storage/manifest.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/manifest.js +108 -0
- package/dist/core/events/legacy-storage/reader.d.ts +15 -0
- package/dist/core/events/legacy-storage/reader.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/reader.js +154 -0
- package/dist/core/events/v3/authority-outbox.d.ts +7 -2
- package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
- package/dist/core/events/v3/authority-outbox.js +16 -3
- package/dist/core/events/v3/base-contract.d.ts +81 -41
- package/dist/core/events/v3/base-contract.d.ts.map +1 -1
- package/dist/core/events/v3/base-contract.js +17 -7
- package/dist/core/events/v3/bootstrap.d.ts +39 -0
- package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
- package/dist/core/events/v3/bootstrap.js +167 -3
- package/dist/core/events/v3/capabilities.js +3 -3
- package/dist/core/events/v3/control-witness.d.ts +44 -0
- package/dist/core/events/v3/control-witness.d.ts.map +1 -0
- package/dist/core/events/v3/control-witness.js +233 -0
- package/dist/core/events/v3/control-writer.d.ts +4 -0
- package/dist/core/events/v3/control-writer.d.ts.map +1 -0
- package/dist/core/events/v3/control-writer.js +16 -0
- package/dist/core/events/v3/control.d.ts +8 -2
- package/dist/core/events/v3/control.d.ts.map +1 -1
- package/dist/core/events/v3/control.js +46 -18
- package/dist/core/events/v3/coordination-transaction-recovery.d.ts +42 -0
- package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -0
- package/dist/core/events/v3/coordination-transaction-recovery.js +342 -0
- package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
- package/dist/core/events/v3/coordination-view.js +16 -1
- package/dist/core/events/v3/generated.d.ts +1 -1
- package/dist/core/events/v3/generated.js +1 -1
- package/dist/core/events/v3/index.d.ts +4 -2
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +3 -1
- package/dist/core/events/v3/live-route-observer.d.ts +31 -0
- package/dist/core/events/v3/live-route-observer.d.ts.map +1 -0
- package/dist/core/events/v3/live-route-observer.js +58 -0
- package/dist/core/events/v3/live-routing.d.ts +13 -21
- package/dist/core/events/v3/live-routing.d.ts.map +1 -1
- package/dist/core/events/v3/live-routing.js +45 -41
- package/dist/core/events/v3/producers/coordination-recorder.d.ts +11 -1
- package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/coordination-recorder.js +76 -10
- package/dist/core/events/v3/producers/diagnostic-summaries.d.ts +129 -0
- package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -0
- package/dist/core/events/v3/producers/diagnostic-summaries.js +499 -0
- package/dist/core/events/v3/producers/hook-base.js +1 -1
- package/dist/core/events/v3/producers/intake.d.ts +7 -0
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
- package/dist/core/events/v3/producers/intake.js +25 -2
- package/dist/core/events/v3/producers/producer-state-observer.d.ts +8 -0
- package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -0
- package/dist/core/events/v3/producers/producer-state-observer.js +45 -0
- package/dist/core/events/v3/producers/recorder.d.ts +55 -1
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +353 -24
- package/dist/core/events/v3/reader.d.ts +51 -0
- package/dist/core/events/v3/reader.d.ts.map +1 -1
- package/dist/core/events/v3/reader.js +181 -1
- package/dist/core/events/v3/rotation-config.d.ts +9 -0
- package/dist/core/events/v3/rotation-config.d.ts.map +1 -0
- package/dist/core/events/v3/rotation-config.js +91 -0
- package/dist/core/events/v3/runtime-build.d.ts +11 -0
- package/dist/core/events/v3/runtime-build.d.ts.map +1 -0
- package/dist/core/events/v3/runtime-build.js +39 -0
- package/dist/core/events/v3/runtime-identity.d.ts +5 -0
- package/dist/core/events/v3/runtime-identity.d.ts.map +1 -0
- package/dist/core/events/v3/runtime-identity.js +18 -0
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +6 -5
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/runtime-telemetry-capabilities.js +1 -1
- package/dist/core/events/v3/support-storage/classify.d.ts +46 -0
- package/dist/core/events/v3/support-storage/classify.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/classify.js +149 -0
- package/dist/core/events/v3/support-storage/eligibility.d.ts +29 -0
- package/dist/core/events/v3/support-storage/eligibility.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/eligibility.js +35 -0
- package/dist/core/events/v3/support-storage/index.d.ts +10 -0
- package/dist/core/events/v3/support-storage/index.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/index.js +9 -0
- package/dist/core/events/v3/support-storage/inventory.d.ts +30 -0
- package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/inventory.js +94 -0
- package/dist/core/events/v3/support-storage/logical-authority.d.ts +14 -0
- package/dist/core/events/v3/support-storage/logical-authority.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/logical-authority.js +104 -0
- package/dist/core/events/v3/support-storage/maintenance.d.ts +98 -0
- package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/maintenance.js +352 -0
- package/dist/core/events/v3/support-storage/pack-contract.d.ts +59 -0
- package/dist/core/events/v3/support-storage/pack-contract.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-contract.js +249 -0
- package/dist/core/events/v3/support-storage/pack-reader.d.ts +34 -0
- package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-reader.js +258 -0
- package/dist/core/events/v3/support-storage/pack-writer.d.ts +30 -0
- package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-writer.js +268 -0
- package/dist/core/events/v3/support-storage/recovery.d.ts +15 -0
- package/dist/core/events/v3/support-storage/recovery.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/recovery.js +22 -0
- package/dist/core/events/v3/turn-telemetry.d.ts +14 -8
- package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
- package/dist/core/events/v3/turn-telemetry.js +32 -2
- package/dist/core/events/v3/writer.d.ts +13 -1
- package/dist/core/events/v3/writer.d.ts.map +1 -1
- package/dist/core/events/v3/writer.js +126 -12
- package/dist/core/governor/plan-read.d.ts.map +1 -1
- package/dist/core/governor/plan-read.js +5 -21
- package/dist/core/governor/planning.js +6 -8
- package/dist/core/governor/service-read.d.ts +12 -0
- package/dist/core/governor/service-read.d.ts.map +1 -1
- package/dist/core/governor/service-read.js +266 -2
- package/dist/core/governor/service.d.ts +1 -0
- package/dist/core/governor/service.d.ts.map +1 -1
- package/dist/core/governor/service.js +53 -18
- package/dist/core/guard/evidence-v3.d.ts.map +1 -1
- package/dist/core/guard/evidence-v3.js +2 -0
- package/dist/core/hooks/adapter/events.d.ts.map +1 -1
- package/dist/core/hooks/adapter/events.js +1 -0
- package/dist/core/hooks/adapter/output.d.ts +4 -2
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/output.js +13 -5
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts +27 -4
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -1
- package/dist/core/hooks/adapter/runtime-telemetry.js +307 -6
- package/dist/core/hooks/cli.js +212 -30
- package/dist/core/hooks/effects/image-capture.d.ts +1 -1
- package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
- package/dist/core/hooks/effects/image-capture.js +4 -2
- package/dist/core/hooks/remediation-cap.d.ts +8 -3
- package/dist/core/hooks/remediation-cap.d.ts.map +1 -1
- package/dist/core/hooks/remediation-cap.js +3 -11
- package/dist/core/hooks/resolve/coord-root.d.ts +22 -9
- package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
- package/dist/core/hooks/resolve/coord-root.js +92 -11
- package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
- package/dist/core/hooks/resolve/owner.js +5 -0
- package/dist/core/hooks/resolve/transcript.d.ts +8 -0
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
- package/dist/core/hooks/resolve/transcript.js +11 -0
- package/dist/core/inbox/contract.d.ts +64 -0
- package/dist/core/inbox/contract.d.ts.map +1 -0
- package/dist/core/inbox/contract.js +13 -0
- package/dist/core/inbox/index.d.ts +5 -0
- package/dist/core/inbox/index.d.ts.map +1 -0
- package/dist/core/inbox/index.js +4 -0
- package/dist/core/inbox/lifecycle.d.ts +22 -0
- package/dist/core/inbox/lifecycle.d.ts.map +1 -0
- package/dist/core/inbox/lifecycle.js +41 -0
- package/dist/core/inbox/service.d.ts +36 -0
- package/dist/core/inbox/service.d.ts.map +1 -0
- package/dist/core/inbox/service.js +210 -0
- package/dist/core/inbox/watcher.d.ts +7 -0
- package/dist/core/inbox/watcher.d.ts.map +1 -0
- package/dist/core/inbox/watcher.js +26 -0
- package/dist/core/presence/codec-digest.d.ts.map +1 -1
- package/dist/core/presence/codec-digest.js +14 -3
- package/dist/core/presence/relay-client.d.ts +1 -0
- package/dist/core/presence/relay-client.d.ts.map +1 -1
- package/dist/core/presence/relay-client.js +52 -8
- package/dist/core/semantic/adapters.d.ts +11 -8
- package/dist/core/semantic/adapters.d.ts.map +1 -1
- package/dist/core/semantic/adapters.js +169 -31
- package/dist/core/semantic/contract.d.ts +532 -48
- package/dist/core/semantic/contract.d.ts.map +1 -1
- package/dist/core/semantic/contract.js +104 -3
- package/dist/core/semantic/index.d.ts +7 -3
- package/dist/core/semantic/index.d.ts.map +1 -1
- package/dist/core/semantic/index.js +7 -3
- package/dist/core/semantic/once.d.ts +6 -1
- package/dist/core/semantic/once.d.ts.map +1 -1
- package/dist/core/semantic/once.js +80 -9
- package/dist/core/semantic/prompt.d.ts.map +1 -1
- package/dist/core/semantic/prompt.js +14 -1
- package/dist/core/semantic/review.d.ts +144 -0
- package/dist/core/semantic/review.d.ts.map +1 -0
- package/dist/core/semantic/review.js +544 -0
- package/dist/core/semantic/routes.d.ts +10 -0
- package/dist/core/semantic/routes.d.ts.map +1 -0
- package/dist/core/semantic/routes.js +21 -0
- package/dist/core/semantic/scheduler.d.ts +14 -3
- package/dist/core/semantic/scheduler.d.ts.map +1 -1
- package/dist/core/semantic/scheduler.js +30 -6
- package/dist/core/semantic/service-status.d.ts +20 -0
- package/dist/core/semantic/service-status.d.ts.map +1 -1
- package/dist/core/semantic/service-status.js +60 -4
- package/dist/core/semantic/service.d.ts +1 -0
- package/dist/core/semantic/service.d.ts.map +1 -1
- package/dist/core/semantic/service.js +104 -15
- package/dist/core/semantic/soak.d.ts +75 -0
- package/dist/core/semantic/soak.d.ts.map +1 -0
- package/dist/core/semantic/soak.js +476 -0
- package/dist/core/semantic/storage.d.ts +11 -1
- package/dist/core/semantic/storage.d.ts.map +1 -1
- package/dist/core/semantic/storage.js +4 -3
- package/dist/core/semantic/usage.d.ts +43 -0
- package/dist/core/semantic/usage.d.ts.map +1 -0
- package/dist/core/semantic/usage.js +193 -0
- package/dist/core/semantic/validate.d.ts +3 -1
- package/dist/core/semantic/validate.d.ts.map +1 -1
- package/dist/core/semantic/validate.js +34 -1
- package/dist/core/storage/buffer.d.ts +28 -0
- package/dist/core/storage/buffer.d.ts.map +1 -0
- package/dist/core/storage/buffer.js +101 -0
- package/dist/core/storage/builtins.d.ts +3 -0
- package/dist/core/storage/builtins.d.ts.map +1 -0
- package/dist/core/storage/builtins.js +683 -0
- package/dist/core/storage/catalog.d.ts +19 -0
- package/dist/core/storage/catalog.d.ts.map +1 -0
- package/dist/core/storage/catalog.js +365 -0
- package/dist/core/storage/config.d.ts +16 -0
- package/dist/core/storage/config.d.ts.map +1 -0
- package/dist/core/storage/config.js +311 -0
- package/dist/core/storage/contract.d.ts +275 -0
- package/dist/core/storage/contract.d.ts.map +1 -0
- package/dist/core/storage/contract.js +3 -0
- package/dist/core/storage/durable-history.d.ts +36 -0
- package/dist/core/storage/durable-history.d.ts.map +1 -0
- package/dist/core/storage/durable-history.js +606 -0
- package/dist/core/storage/health.d.ts +4 -0
- package/dist/core/storage/health.d.ts.map +1 -0
- package/dist/core/storage/health.js +65 -0
- package/dist/core/storage/index.d.ts +16 -0
- package/dist/core/storage/index.d.ts.map +1 -0
- package/dist/core/storage/index.js +15 -0
- package/dist/core/storage/inventory.d.ts +25 -0
- package/dist/core/storage/inventory.d.ts.map +1 -0
- package/dist/core/storage/inventory.js +666 -0
- package/dist/core/storage/jsonl.d.ts +52 -0
- package/dist/core/storage/jsonl.d.ts.map +1 -0
- package/dist/core/storage/jsonl.js +156 -0
- package/dist/core/storage/log-retention.d.ts +52 -0
- package/dist/core/storage/log-retention.d.ts.map +1 -0
- package/dist/core/storage/log-retention.js +419 -0
- package/dist/core/storage/logger.d.ts +82 -0
- package/dist/core/storage/logger.d.ts.map +1 -0
- package/dist/core/storage/logger.js +411 -0
- package/dist/core/storage/maintenance-providers.d.ts +26 -0
- package/dist/core/storage/maintenance-providers.d.ts.map +1 -0
- package/dist/core/storage/maintenance-providers.js +141 -0
- package/dist/core/storage/maintenance.d.ts +125 -0
- package/dist/core/storage/maintenance.d.ts.map +1 -0
- package/dist/core/storage/maintenance.js +609 -0
- package/dist/core/storage/metrics.d.ts +60 -0
- package/dist/core/storage/metrics.d.ts.map +1 -0
- package/dist/core/storage/metrics.js +134 -0
- package/dist/core/storage/policy.d.ts +7 -0
- package/dist/core/storage/policy.d.ts.map +1 -0
- package/dist/core/storage/policy.js +110 -0
- package/dist/core/storage/process-log.d.ts +38 -0
- package/dist/core/storage/process-log.d.ts.map +1 -0
- package/dist/core/storage/process-log.js +165 -0
- package/dist/core/storage/query.d.ts +34 -0
- package/dist/core/storage/query.d.ts.map +1 -0
- package/dist/core/storage/query.js +295 -0
- package/dist/core/storage/receipts.d.ts +23 -0
- package/dist/core/storage/receipts.d.ts.map +1 -0
- package/dist/core/storage/receipts.js +117 -0
- package/dist/core/storage/segments.d.ts +84 -0
- package/dist/core/storage/segments.d.ts.map +1 -0
- package/dist/core/storage/segments.js +542 -0
- package/dist/core/storage/sink-graph.d.ts +65 -0
- package/dist/core/storage/sink-graph.d.ts.map +1 -0
- package/dist/core/storage/sink-graph.js +213 -0
- package/dist/core/storage/storm-control.d.ts +23 -0
- package/dist/core/storage/storm-control.d.ts.map +1 -0
- package/dist/core/storage/storm-control.js +59 -0
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +10 -14
- package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
- package/dist/core/workflow/live-session-v3.js +2 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/lazy-commands.d.ts +26 -0
- package/dist/lazy-commands.d.ts.map +1 -0
- package/dist/lazy-commands.js +210 -0
- package/dist/lib/docs-lint.d.ts +2 -0
- package/dist/lib/docs-lint.d.ts.map +1 -1
- package/dist/lib/docs-lint.js +45 -80
- package/dist/lib/docs-metadata-audit.d.ts +3 -0
- package/dist/lib/docs-metadata-audit.d.ts.map +1 -1
- package/dist/lib/docs-metadata-audit.js +13 -23
- package/dist/lib/docs-metadata-sync.d.ts +1 -0
- package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
- package/dist/lib/docs-metadata-sync.js +28 -10
- package/dist/lib/docs-repository-view.d.ts +22 -0
- package/dist/lib/docs-repository-view.d.ts.map +1 -0
- package/dist/lib/docs-repository-view.js +185 -0
- package/dist/lib/http/client.d.ts +11 -5
- package/dist/lib/http/client.d.ts.map +1 -1
- package/dist/lib/http/client.js +22 -4
- package/dist/lib/http/index.d.ts +1 -1
- package/dist/lib/http/index.d.ts.map +1 -1
- package/dist/lib/http/index.js +1 -1
- package/dist/lib/indexer-exclusions.d.ts +27 -0
- package/dist/lib/indexer-exclusions.d.ts.map +1 -0
- package/dist/lib/indexer-exclusions.js +176 -0
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +5 -0
- package/dist/lib/local-file-url.d.ts +9 -0
- package/dist/lib/local-file-url.d.ts.map +1 -0
- package/dist/lib/local-file-url.js +20 -0
- package/dist/lib/web-performance.d.ts +118 -0
- package/dist/lib/web-performance.d.ts.map +1 -0
- package/dist/lib/web-performance.js +192 -0
- package/package.json +29 -2
- package/schemas/config.schema.json +58 -0
- package/schemas/event-v3.schema.json +324 -112
- package/src/commander.ts +462 -95
- package/src/commands/agents.ts +517 -190
- package/src/commands/backup.ts +18 -14
- package/src/commands/browse-session.ts +12 -0
- package/src/commands/browse.ts +6 -7
- package/src/commands/conversations.ts +279 -0
- package/src/commands/deinit.ts +6 -0
- package/src/commands/docs.ts +25 -6
- package/src/commands/doctor.ts +75 -9
- package/src/commands/fetch.ts +7 -6
- package/src/commands/files.ts +143 -0
- package/src/commands/governor.ts +13 -12
- package/src/commands/inbox.ts +61 -0
- package/src/commands/init.ts +78 -16
- package/src/commands/ledger-v3.ts +421 -1
- package/src/commands/logs.ts +224 -0
- package/src/commands/messages.ts +61 -0
- package/src/commands/outline.ts +6 -2
- package/src/commands/read.ts +6 -2
- package/src/commands/semantic.ts +66 -1
- package/src/commands/storage.ts +310 -0
- package/src/commands/tunnel.ts +66 -52
- package/src/commands/web.ts +77 -7
- package/src/commands/work.ts +3 -3
- package/src/commands/workflow.ts +13 -13
- package/src/core/agents/cli.ts +259 -53
- package/src/core/agents/live-authority-v3.ts +341 -10
- package/src/core/agents/live-lifecycle-v3.ts +6 -1
- package/src/core/agents/live-observation-v3.ts +6 -1
- package/src/core/agents/render/prompt-context.ts +27 -6
- package/src/core/agents/rules/stop-hook.ts +107 -16
- package/src/core/agents/rules/verdict.ts +1 -0
- package/src/core/agents/session-events.ts +4 -0
- package/src/core/agents/session-finalization-state-v3.ts +1 -1
- package/src/core/agents/session-finalizer-v3.ts +4 -1
- package/src/core/agents/state/activity-log.ts +7 -2
- package/src/core/agents/state/heartbeat-writer.ts +27 -0
- package/src/core/agents/state/live-coordination-view.ts +16 -105
- package/src/core/agents/state/live-coordination-writer.ts +141 -0
- package/src/core/artifacts/index.ts +64 -1
- package/src/core/config.ts +126 -5
- package/src/core/conversations/archive.ts +237 -0
- package/src/core/conversations/catalog.ts +79 -0
- package/src/core/conversations/context-pack.ts +72 -0
- package/src/core/conversations/contract.ts +178 -0
- package/src/core/conversations/evaluation.ts +30 -0
- package/src/core/conversations/index.ts +9 -0
- package/src/core/conversations/lifecycle.ts +63 -0
- package/src/core/conversations/normalize.ts +105 -0
- package/src/core/conversations/query.ts +318 -0
- package/src/core/conversations/search-index.ts +48 -0
- package/src/core/events/legacy-storage/canary.ts +177 -0
- package/src/core/events/legacy-storage/fence.ts +129 -0
- package/src/core/events/legacy-storage/index.ts +5 -0
- package/src/core/events/legacy-storage/inventory.ts +51 -0
- package/src/core/events/legacy-storage/manifest.ts +136 -0
- package/src/core/events/legacy-storage/reader.ts +178 -0
- package/src/core/events/v3/authority-outbox.ts +22 -1
- package/src/core/events/v3/base-contract.ts +17 -7
- package/src/core/events/v3/bootstrap.ts +195 -2
- package/src/core/events/v3/capabilities.ts +3 -3
- package/src/core/events/v3/control-witness.ts +339 -0
- package/src/core/events/v3/control-writer.ts +16 -0
- package/src/core/events/v3/control.ts +54 -18
- package/src/core/events/v3/coordination-transaction-recovery.ts +477 -0
- package/src/core/events/v3/coordination-view.ts +17 -1
- package/src/core/events/v3/generated.ts +1 -1
- package/src/core/events/v3/index.ts +5 -2
- package/src/core/events/v3/live-route-observer.ts +80 -0
- package/src/core/events/v3/live-routing.ts +64 -46
- package/src/core/events/v3/producers/coordination-recorder.ts +95 -10
- package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
- package/src/core/events/v3/producers/hook-base.ts +1 -1
- package/src/core/events/v3/producers/intake.ts +30 -2
- package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
- package/src/core/events/v3/producers/recorder.ts +571 -33
- package/src/core/events/v3/reader.ts +243 -2
- package/src/core/events/v3/rotation-config.ts +98 -0
- package/src/core/events/v3/runtime-build.ts +41 -0
- package/src/core/events/v3/runtime-identity.ts +16 -0
- package/src/core/events/v3/runtime-telemetry-capabilities.ts +14 -8
- package/src/core/events/v3/support-storage/classify.ts +209 -0
- package/src/core/events/v3/support-storage/eligibility.ts +58 -0
- package/src/core/events/v3/support-storage/index.ts +9 -0
- package/src/core/events/v3/support-storage/inventory.ts +135 -0
- package/src/core/events/v3/support-storage/logical-authority.ts +117 -0
- package/src/core/events/v3/support-storage/maintenance.ts +501 -0
- package/src/core/events/v3/support-storage/pack-contract.ts +337 -0
- package/src/core/events/v3/support-storage/pack-reader.ts +346 -0
- package/src/core/events/v3/support-storage/pack-writer.ts +352 -0
- package/src/core/events/v3/support-storage/recovery.ts +43 -0
- package/src/core/events/v3/turn-telemetry.ts +58 -7
- package/src/core/events/v3/writer.ts +168 -16
- package/src/core/governor/plan-read.ts +5 -18
- package/src/core/governor/planning.ts +5 -8
- package/src/core/governor/service-read.ts +320 -2
- package/src/core/governor/service.ts +49 -22
- package/src/core/guard/evidence-v3.ts +1 -0
- package/src/core/hooks/adapter/events.ts +1 -0
- package/src/core/hooks/adapter/output.ts +12 -5
- package/src/core/hooks/adapter/runtime-telemetry.ts +408 -13
- package/src/core/hooks/cli.ts +226 -32
- package/src/core/hooks/effects/image-capture.ts +4 -1
- package/src/core/hooks/remediation-cap.ts +12 -6
- package/src/core/hooks/resolve/coord-root.ts +91 -11
- package/src/core/hooks/resolve/owner.ts +4 -0
- package/src/core/hooks/resolve/transcript.ts +18 -0
- package/src/core/inbox/contract.ts +81 -0
- package/src/core/inbox/index.ts +4 -0
- package/src/core/inbox/lifecycle.ts +104 -0
- package/src/core/inbox/service.ts +305 -0
- package/src/core/inbox/watcher.ts +36 -0
- package/src/core/presence/codec-digest.ts +15 -9
- package/src/core/presence/relay-client.ts +55 -7
- package/src/core/semantic/adapters.ts +200 -41
- package/src/core/semantic/contract.ts +135 -3
- package/src/core/semantic/index.ts +76 -2
- package/src/core/semantic/once.ts +93 -7
- package/src/core/semantic/prompt.ts +13 -1
- package/src/core/semantic/review.ts +803 -0
- package/src/core/semantic/routes.ts +30 -0
- package/src/core/semantic/scheduler.ts +49 -5
- package/src/core/semantic/service-status.ts +99 -5
- package/src/core/semantic/service.ts +116 -15
- package/src/core/semantic/soak.ts +638 -0
- package/src/core/semantic/storage.ts +20 -6
- package/src/core/semantic/usage.ts +272 -0
- package/src/core/semantic/validate.ts +31 -0
- package/src/core/storage/buffer.ts +124 -0
- package/src/core/storage/builtins.ts +916 -0
- package/src/core/storage/catalog.ts +467 -0
- package/src/core/storage/config.ts +423 -0
- package/src/core/storage/contract.ts +342 -0
- package/src/core/storage/durable-history.ts +738 -0
- package/src/core/storage/health.ts +76 -0
- package/src/core/storage/index.ts +15 -0
- package/src/core/storage/inventory.ts +859 -0
- package/src/core/storage/jsonl.ts +213 -0
- package/src/core/storage/log-retention.ts +555 -0
- package/src/core/storage/logger.ts +546 -0
- package/src/core/storage/maintenance-providers.ts +200 -0
- package/src/core/storage/maintenance.ts +929 -0
- package/src/core/storage/metrics.ts +199 -0
- package/src/core/storage/policy.ts +141 -0
- package/src/core/storage/process-log.ts +203 -0
- package/src/core/storage/query.ts +360 -0
- package/src/core/storage/receipts.ts +162 -0
- package/src/core/storage/segments.ts +721 -0
- package/src/core/storage/sink-graph.ts +343 -0
- package/src/core/storage/storm-control.ts +91 -0
- package/src/core/work/state.ts +12 -21
- package/src/core/workflow/live-session-v3.ts +2 -4
- package/src/index.ts +2 -0
- package/src/lazy-commands.ts +294 -0
- package/src/lib/docs-lint.ts +58 -77
- package/src/lib/docs-metadata-audit.ts +26 -21
- package/src/lib/docs-metadata-sync.ts +32 -9
- package/src/lib/docs-repository-view.ts +220 -0
- package/src/lib/http/client.ts +44 -8
- package/src/lib/http/index.ts +6 -1
- package/src/lib/indexer-exclusions.ts +173 -0
- package/src/lib/instructions/templates.ts +5 -0
- package/src/lib/local-file-url.ts +31 -0
- package/src/lib/web-performance.ts +335 -0
|
@@ -62,13 +62,21 @@ export function evaluateStopHookV3Events(coordRoot, req, events) {
|
|
|
62
62
|
const ownerEvents = events.filter((event) => event.scope.instance_id === owner &&
|
|
63
63
|
"generation_id" in event.scope &&
|
|
64
64
|
event.scope.generation_id === generationId);
|
|
65
|
+
const fallbackStartMs = Math.max(0, endMs - 5 * 60 * 1000);
|
|
66
|
+
const claudeContinuation = req.adapter === "claude-code" && req.stop_hook_active === true;
|
|
67
|
+
const resolvedStart = resolveTurnStart(ownerEvents, endMs, claudeContinuation);
|
|
68
|
+
const resolvedStartMs = eventTimeMs(resolvedStart);
|
|
65
69
|
const startMs = req.turn_window?.start_ms ??
|
|
66
|
-
|
|
70
|
+
(Number.isFinite(resolvedStartMs) ? resolvedStartMs : fallbackStartMs);
|
|
67
71
|
const inTurn = ownerEvents.filter((event) => {
|
|
68
72
|
const time = eventTimeMs(event);
|
|
69
73
|
return Number.isFinite(time) && time >= startMs && time <= endMs;
|
|
70
74
|
});
|
|
71
|
-
const
|
|
75
|
+
const policyEvents = claudeContinuation && resolvedStart
|
|
76
|
+
? originalTurnEvents(ownerEvents, resolvedStart, endMs)
|
|
77
|
+
: inTurn;
|
|
78
|
+
const usedTool = policyEvents.some((event) => event.event_type === "tool.requested");
|
|
79
|
+
const cycleAnchor = remediationCycleAnchor(resolvedStart, startMs);
|
|
72
80
|
const statusEvents = inTurn.filter((event) => event.event_type === "coord.status_observed" && event.payload.subject_instance_id === owner);
|
|
73
81
|
const statusChecked = statusEvents.length > 0;
|
|
74
82
|
const requiredStatusChecked = agentsRequireGitFinalization(coordRoot)
|
|
@@ -79,10 +87,18 @@ export function evaluateStopHookV3Events(coordRoot, req, events) {
|
|
|
79
87
|
const turnTerminals = inTurn.filter((event) => event.event_type === "turn.completed");
|
|
80
88
|
const latestTerminal = turnTerminals.at(-1);
|
|
81
89
|
const latestBox = observedBoolean(latestTerminal?.payload.ritual?.status_box_present_strict);
|
|
82
|
-
|
|
90
|
+
const strictBoxObservations = turnTerminals
|
|
91
|
+
.map((event) => observedBoolean(event.payload.ritual?.status_box_present_strict))
|
|
92
|
+
.filter((value) => value !== undefined);
|
|
93
|
+
const currentStrictBox = claudeContinuation ? req.status_box_present_strict : undefined;
|
|
94
|
+
if (req.adapter !== "cursor" && latestBox === undefined && currentStrictBox === undefined) {
|
|
83
95
|
return evidenceUnavailable("turn.completed has no observed V3 assistant-text status-box result; Stop remains fail-open");
|
|
84
96
|
}
|
|
85
|
-
const ackPresent = req.adapter === "cursor"
|
|
97
|
+
const ackPresent = req.adapter === "cursor"
|
|
98
|
+
? requiredStatusChecked
|
|
99
|
+
: claudeContinuation
|
|
100
|
+
? strictBoxObservations.includes(true) || currentStrictBox === true
|
|
101
|
+
: latestBox === true;
|
|
86
102
|
const ackBlock = req.adapter === "cursor"
|
|
87
103
|
? () => rule13Block(coordRoot, req.session_id)
|
|
88
104
|
: () => rule23Block(coordRoot, req.session_id);
|
|
@@ -90,7 +106,7 @@ export function evaluateStopHookV3Events(coordRoot, req, events) {
|
|
|
90
106
|
// task or final-status mutations. This preserves the pre-V3 policy exactly.
|
|
91
107
|
if (!usedTool) {
|
|
92
108
|
if (!ackPresent)
|
|
93
|
-
return ackBlock();
|
|
109
|
+
return withCycleAnchor(ackBlock(), cycleAnchor);
|
|
94
110
|
return {
|
|
95
111
|
allow: true,
|
|
96
112
|
exit_code: 0,
|
|
@@ -98,12 +114,17 @@ export function evaluateStopHookV3Events(coordRoot, req, events) {
|
|
|
98
114
|
reason: "no tool calls this turn; task and final-status mutations were not required",
|
|
99
115
|
};
|
|
100
116
|
}
|
|
117
|
+
// Collect EVERY missing signal before returning. Reporting them one at a
|
|
118
|
+
// time made each additional missing signal cost a whole continuation, and
|
|
119
|
+
// every continuation forks a fresh hook process: on a busy multi-agent host
|
|
120
|
+
// the ritual's own enforcement became part of the hook load it polices.
|
|
121
|
+
const pending = [];
|
|
101
122
|
if (!requiredStatusChecked)
|
|
102
|
-
|
|
123
|
+
pending.push(rule13Block(coordRoot, req.session_id));
|
|
103
124
|
if (!ackPresent)
|
|
104
|
-
|
|
125
|
+
pending.push(ackBlock());
|
|
105
126
|
if (!taskSet)
|
|
106
|
-
|
|
127
|
+
pending.push(rule33Block(coordRoot, req.session_id));
|
|
107
128
|
// Claude Code can prove session-name presentation from assistant-only text.
|
|
108
129
|
// Cursor cannot expose that text and Codex returned observe-only above.
|
|
109
130
|
if (req.adapter !== "cursor") {
|
|
@@ -113,9 +134,12 @@ export function evaluateStopHookV3Events(coordRoot, req, events) {
|
|
|
113
134
|
if (naming.some(({ required }) => required) &&
|
|
114
135
|
!naming.some(({ present }) => present) &&
|
|
115
136
|
!sessionNameSeenStamped(coordRoot, req.instance_id)) {
|
|
116
|
-
|
|
137
|
+
pending.push(sessionNameBlock(coordRoot, req.instance_id));
|
|
117
138
|
}
|
|
118
139
|
}
|
|
140
|
+
const blocked = mergeStopBlocks(pending);
|
|
141
|
+
if (blocked)
|
|
142
|
+
return withCycleAnchor(blocked, cycleAnchor);
|
|
119
143
|
return { allow: true, exit_code: 0, rule: "stop-hook.pass" };
|
|
120
144
|
}
|
|
121
145
|
function unconditionalVerdict(req) {
|
|
@@ -145,22 +169,48 @@ function unconditionalVerdict(req) {
|
|
|
145
169
|
}
|
|
146
170
|
return undefined;
|
|
147
171
|
}
|
|
148
|
-
function
|
|
172
|
+
function resolveTurnStart(ownerEvents, nowMs, claudeContinuation) {
|
|
149
173
|
const turns = ownerEvents.filter((event) => event.event_type === "turn.started" && eventTimeMs(event) <= nowMs);
|
|
150
174
|
if (turns.length === 0)
|
|
151
|
-
return
|
|
175
|
+
return undefined;
|
|
152
176
|
let index = turns.length - 1;
|
|
153
177
|
let hops = 0;
|
|
154
178
|
while (index > 0 && hops < MAX_REMEDIATION_WALK_BACK) {
|
|
155
179
|
const turn = turns[index];
|
|
156
|
-
|
|
180
|
+
const continuesCycle = claudeContinuation
|
|
181
|
+
? turn?.provenance.source_event === "claude-code.recovery" &&
|
|
182
|
+
turn.provenance.attestation === "derived"
|
|
183
|
+
: turn?.payload.stop_remediation === true;
|
|
184
|
+
if (!continuesCycle)
|
|
157
185
|
break;
|
|
158
186
|
index -= 1;
|
|
159
187
|
hops += 1;
|
|
160
188
|
}
|
|
161
|
-
return
|
|
189
|
+
return turns[index];
|
|
190
|
+
}
|
|
191
|
+
function originalTurnEvents(ownerEvents, turnStart, endMs) {
|
|
192
|
+
if (!turnStart)
|
|
193
|
+
return [];
|
|
194
|
+
const startMs = eventTimeMs(turnStart);
|
|
195
|
+
const terminal = ownerEvents.find((event) => event.event_type === "turn.completed" && eventTimeMs(event) >= startMs);
|
|
196
|
+
const policyEndMs = terminal ? eventTimeMs(terminal) : endMs;
|
|
197
|
+
return ownerEvents.filter((event) => {
|
|
198
|
+
const time = eventTimeMs(event);
|
|
199
|
+
return time >= startMs && time <= policyEndMs;
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
function remediationCycleAnchor(turnStart, startMs) {
|
|
203
|
+
if (turnStart && "turn_id" in turnStart.scope && turnStart.scope.turn_id) {
|
|
204
|
+
return turnStart.scope.turn_id;
|
|
205
|
+
}
|
|
206
|
+
return new Date(startMs).toISOString();
|
|
207
|
+
}
|
|
208
|
+
function withCycleAnchor(verdict, anchor) {
|
|
209
|
+
return { ...verdict, remediation_cycle_anchor: anchor };
|
|
162
210
|
}
|
|
163
211
|
function eventTimeMs(event) {
|
|
212
|
+
if (!event)
|
|
213
|
+
return Number.NaN;
|
|
164
214
|
return Date.parse(event.time.observed_at);
|
|
165
215
|
}
|
|
166
216
|
function observedBoolean(value) {
|
|
@@ -204,6 +254,37 @@ function evidenceUnavailable(reason) {
|
|
|
204
254
|
function sessionIdSuffix(sessionId) {
|
|
205
255
|
return sessionId ? ` --session-id ${sessionId}` : "";
|
|
206
256
|
}
|
|
257
|
+
/**
|
|
258
|
+
* Fold every failing end-of-turn signal into ONE verdict.
|
|
259
|
+
*
|
|
260
|
+
* The verdict keeps the first failure's rule id, so the `blocked_rule`
|
|
261
|
+
* telemetry and the adapter's `rule=` stderr contract are unchanged; the
|
|
262
|
+
* reason enumerates the rest so a single continuation can repair all of them.
|
|
263
|
+
* Cursor maps the acknowledgement onto rule 1/3, so identical rules dedupe.
|
|
264
|
+
*/
|
|
265
|
+
function mergeStopBlocks(blocks) {
|
|
266
|
+
let primary;
|
|
267
|
+
const seen = new Set();
|
|
268
|
+
const reasons = [];
|
|
269
|
+
for (const block of blocks) {
|
|
270
|
+
if (seen.has(block.rule))
|
|
271
|
+
continue;
|
|
272
|
+
seen.add(block.rule);
|
|
273
|
+
if (!primary)
|
|
274
|
+
primary = block;
|
|
275
|
+
if (block.reason)
|
|
276
|
+
reasons.push(block.reason);
|
|
277
|
+
}
|
|
278
|
+
if (!primary)
|
|
279
|
+
return undefined;
|
|
280
|
+
if (reasons.length < 2)
|
|
281
|
+
return primary;
|
|
282
|
+
const numbered = reasons.map((reason, index) => `${index + 1}. ${reason}`).join("\n");
|
|
283
|
+
return {
|
|
284
|
+
...primary,
|
|
285
|
+
reason: `End-of-turn ritual: ${reasons.length} signals are missing from this turn. Repair ALL of them in this continuation, then stop.\n${numbered}`,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
207
288
|
function rule13Block(coordRoot, sessionId) {
|
|
208
289
|
const missingEvidence = agentsRequireGitFinalization(coordRoot)
|
|
209
290
|
? "no end_turn_checked coord.status_observed event found in this turn"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/verdict.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/verdict.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-events.d.ts","sourceRoot":"","sources":["../../../src/core/agents/session-events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,mDAAmD;AACnD,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,yBAAyB,GAAG,mBAAmB,CAAC;AAEnG;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAG7C;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBjE;
|
|
1
|
+
{"version":3,"file":"session-events.d.ts","sourceRoot":"","sources":["../../../src/core/agents/session-events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,mDAAmD;AACnD,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,yBAAyB,GAAG,mBAAmB,CAAC;AAEnG;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAG7C;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBjE;AAsID;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,gBAAgB,EACtB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,IAAI,CAEN;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,SAAO,GAAG,MAAM,CAGxD"}
|
|
@@ -95,6 +95,10 @@ function recordCommandObservation(type, fields) {
|
|
|
95
95
|
monotonic_ns: process.hrtime.bigint().toString(),
|
|
96
96
|
});
|
|
97
97
|
if (result.state === "generation_unavailable") {
|
|
98
|
+
const expectedLifecycleReopenGap = result.reason === "turn_not_started" &&
|
|
99
|
+
hook.session_start_derivation === "approved_lifecycle_reopen";
|
|
100
|
+
if (expectedLifecycleReopenGap)
|
|
101
|
+
return;
|
|
98
102
|
writeProducerDiagnosticV3(coordRoot, "command_emit_unjoinable", {
|
|
99
103
|
type,
|
|
100
104
|
instance_id: instanceId,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync, lstatSync, readdirSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join, resolve } from "node:path";
|
|
3
|
-
import { EVENT_V3_LEDGER_RELATIVE_ROOT } from "../events/v3/
|
|
3
|
+
import { EVENT_V3_LEDGER_RELATIVE_ROOT } from "../events/v3/reader.js";
|
|
4
4
|
export const SESSION_FINALIZATION_REQUEST_FORMAT_V3 = "harnery-v3-session-finalization-request";
|
|
5
5
|
export const SESSION_FINALIZATION_REQUEST_VERSION_V3 = 1;
|
|
6
6
|
export function sessionFinalizationRequestDirectoryV3(coordRoot) {
|
|
@@ -526,7 +526,11 @@ function ensureRequest(coordRoot, record, input) {
|
|
|
526
526
|
};
|
|
527
527
|
const observation = buildObservationEvent(coordRoot, record, request, input);
|
|
528
528
|
request.observation_event_id = observation.event_id;
|
|
529
|
-
writeEventV3(coordRoot, observation
|
|
529
|
+
const durability = writeEventV3(coordRoot, observation, {
|
|
530
|
+
expectedGenesisId: input.route.genesis_id,
|
|
531
|
+
});
|
|
532
|
+
if (durability.state === "epoch_replaced")
|
|
533
|
+
return null;
|
|
530
534
|
writeRequest(coordRoot, request, true);
|
|
531
535
|
return request;
|
|
532
536
|
}
|
|
@@ -15,4 +15,7 @@
|
|
|
15
15
|
* coord_owner_short). Returns `agent-unknown` when instanceId is null.
|
|
16
16
|
*/
|
|
17
17
|
export declare function resolveShortName(coordRoot: string, instanceId: string | null): string;
|
|
18
|
+
/** Build a collision-resistant agent label even when identity onboarding has
|
|
19
|
+
* not produced a usable display name yet. */
|
|
20
|
+
export declare function agentDisplayName(instanceId: string, name?: string | null): string;
|
|
18
21
|
//# sourceMappingURL=activity-log.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity-log.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/activity-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"activity-log.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/activity-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAIrF;AAED;6CAC6C;AAC7C,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEjF"}
|
|
@@ -19,7 +19,10 @@ export function resolveShortName(coordRoot, instanceId) {
|
|
|
19
19
|
if (!instanceId)
|
|
20
20
|
return "agent-unknown";
|
|
21
21
|
const row = readLiveCoordinationRow(coordRoot, instanceId);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
return agentDisplayName(instanceId, row?.name);
|
|
23
|
+
}
|
|
24
|
+
/** Build a collision-resistant agent label even when identity onboarding has
|
|
25
|
+
* not produced a usable display name yet. */
|
|
26
|
+
export function agentDisplayName(instanceId, name) {
|
|
27
|
+
return `agent-${name?.trim() || instanceId.slice(0, 8) || "unknown"}`;
|
|
25
28
|
}
|
|
@@ -21,6 +21,12 @@ export declare function setLifecycleCache(coordRoot: string, instanceId: string,
|
|
|
21
21
|
export declare function setTask(coordRoot: string, instanceId: string, task: string): Heartbeat | null;
|
|
22
22
|
/** Update the disposable identity cache after a canonical V3 attestation. */
|
|
23
23
|
export declare function setIdentityCache(coordRoot: string, instanceId: string, name: string, agentId: string): Heartbeat | null;
|
|
24
|
+
/** Restore the pool-assigned display name on a generation that was
|
|
25
|
+
* materialized before the adapter's normal SessionStart naming path ran.
|
|
26
|
+
* The durable assignment lives in `.name-history`; this only repairs the
|
|
27
|
+
* disposable generation cache and deliberately leaves durable persona state
|
|
28
|
+
* (`agent_id`) untouched. */
|
|
29
|
+
export declare function setAssignedNameCache(coordRoot: string, instanceId: string, name: string, kind?: "session" | "subagent" | "transient"): Heartbeat | null;
|
|
24
30
|
/**
|
|
25
31
|
* Build the copy-pasteable session name from the coord identity + the agent's
|
|
26
32
|
* description parts. Pure (no coord-state reads) so it's unit-testable; collapses
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat-writer.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/heartbeat-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAaH,OAAO,EAAE,KAAK,SAAS,EAAgC,MAAM,uBAAuB,CAAC;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAatE,kFAAkF;AAClF,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,SAAS,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,oBAAoB,CAAC,EAAE,MAAM,GAC5B,SAAS,GAAG,IAAI,CAQlB;AAeD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAoB7F;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,SAAS,GAAG,IAAI,CAOlB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EAAE,GACzB;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKvD;AAED,2EAA2E;AAC3E,wBAAgB,2BAA2B,CACzC,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,KAAK,EAAE,SAAS,GACf,MAAM,GAAG,IAAI,CAOf;AAED;;;;4EAI4E;AAC5E,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,SAAS,GAAG,IAAI,CAMlB;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,IAAI,CAQlB;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,IAAI,CAWlB;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,eAAe,EAAE,CA6BnB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CASrF;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAiBnF"}
|
|
1
|
+
{"version":3,"file":"heartbeat-writer.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/heartbeat-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAaH,OAAO,EAAE,KAAK,SAAS,EAAgC,MAAM,uBAAuB,CAAC;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAatE,kFAAkF;AAClF,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,SAAS,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,oBAAoB,CAAC,EAAE,MAAM,GAC5B,SAAS,GAAG,IAAI,CAQlB;AAeD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAoB7F;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,SAAS,GAAG,IAAI,CAOlB;AAED;;;;6BAI6B;AAC7B,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,SAAS,GAAG,UAAU,GAAG,WAAuB,GACrD,SAAS,GAAG,IAAI,CAelB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EAAE,GACzB;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKvD;AAED,2EAA2E;AAC3E,wBAAgB,2BAA2B,CACzC,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,KAAK,EAAE,SAAS,GACf,MAAM,GAAG,IAAI,CAOf;AAED;;;;4EAI4E;AAC5E,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,SAAS,GAAG,IAAI,CAMlB;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,IAAI,CAQlB;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,IAAI,CAWlB;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,eAAe,EAAE,CA6BnB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CASrF;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAiBnF"}
|
|
@@ -76,6 +76,24 @@ export function setIdentityCache(coordRoot, instanceId, name, agentId) {
|
|
|
76
76
|
atomicWrite(heartbeatPath(coordRoot, instanceId), JSON.stringify(heartbeat, null, 2));
|
|
77
77
|
return heartbeat;
|
|
78
78
|
}
|
|
79
|
+
/** Restore the pool-assigned display name on a generation that was
|
|
80
|
+
* materialized before the adapter's normal SessionStart naming path ran.
|
|
81
|
+
* The durable assignment lives in `.name-history`; this only repairs the
|
|
82
|
+
* disposable generation cache and deliberately leaves durable persona state
|
|
83
|
+
* (`agent_id`) untouched. */
|
|
84
|
+
export function setAssignedNameCache(coordRoot, instanceId, name, kind = "session") {
|
|
85
|
+
return mutate(coordRoot, instanceId, (heartbeat) => {
|
|
86
|
+
const suggestedSessionName = heartbeat.suggested_session_name?.replace(/^(\[DONE\]\s+)?Agent unknown( - .+)$/, `$1Agent ${name}$2`);
|
|
87
|
+
return {
|
|
88
|
+
...heartbeat,
|
|
89
|
+
name,
|
|
90
|
+
kind: heartbeat.kind ?? kind,
|
|
91
|
+
...(suggestedSessionName && suggestedSessionName !== heartbeat.suggested_session_name
|
|
92
|
+
? { suggested_session_name: suggestedSessionName }
|
|
93
|
+
: {}),
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
}
|
|
79
97
|
/**
|
|
80
98
|
* Build the copy-pasteable session name from the coord identity + the agent's
|
|
81
99
|
* description parts. Pure (no coord-state reads) so it's unit-testable; collapses
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Adapter } from "../../adapter.js";
|
|
2
|
+
import { type CoordinationGenerationViewV3 } from "../../events/v3/coordination-view.js";
|
|
2
3
|
import { type Heartbeat } from "./heartbeat-reader.js";
|
|
3
4
|
/**
|
|
4
5
|
* Heartbeat files are disposable V3 caches. These bindings prevent a stale
|
|
@@ -21,11 +22,8 @@ export declare function readLiveCoordinationRow(coordRoot: string, nativeInstanc
|
|
|
21
22
|
* callers must never substitute another adapter when this function succeeds.
|
|
22
23
|
*/
|
|
23
24
|
export declare function liveCoordinationAdapterV3(coordRoot: string, nativeInstanceId: string): Adapter | null;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
* state to reconcile.
|
|
29
|
-
*/
|
|
30
|
-
export declare function ensureLiveCoordinationHeartbeat(coordRoot: string, nativeInstanceId: string, nativeSessionId: string, _adapter: Adapter, model?: string): Heartbeat | null;
|
|
25
|
+
export declare function isCurrentV3HeartbeatCache(cache: Heartbeat | null | undefined, generation: CoordinationGenerationViewV3): cache is Heartbeat;
|
|
26
|
+
export declare function projectHeartbeatV3(coordRoot: string, generation: CoordinationGenerationViewV3, cache: Heartbeat | undefined, nativeInstanceId: string | undefined, parent?: CoordinationGenerationViewV3): V3HeartbeatMaterialization;
|
|
27
|
+
export declare function observedAdapterV3(generation: CoordinationGenerationViewV3): string | undefined;
|
|
28
|
+
export declare function isAdapterV3(value: string | undefined): value is Adapter;
|
|
31
29
|
//# sourceMappingURL=live-coordination-view.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-coordination-view.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/live-coordination-view.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"live-coordination-view.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/live-coordination-view.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EACL,KAAK,4BAA4B,EAIlC,MAAM,sCAAsC,CAAC;AAM9C,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,uBAAuB,CAAC;AAGtE;;;GAGG;AACH,MAAM,WAAW,0BAA2B,SAAQ,SAAS;IAC3D,cAAc,EAAE,CAAC,CAAC;IAClB,cAAc,EAAE,QAAQ,MAAM,EAAE,CAAC;IACjC,gBAAgB,EAAE,OAAO,MAAM,EAAE,CAAC;IAClC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,aAAa,EAAE,KAAK,GAAG,SAAS,CAAC;CAClC;AAED,yEAAyE;AACzE,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,0BAA0B,EAAE,CA2BxF;AAED,kEAAkE;AAClE,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,GACvB,0BAA0B,GAAG,IAAI,CAuBnC;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,GACvB,OAAO,GAAG,IAAI,CAWhB;AA8BD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EACnC,UAAU,EAAE,4BAA4B,GACvC,KAAK,IAAI,SAAS,CAMpB;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,4BAA4B,EACxC,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,MAAM,CAAC,EAAE,4BAA4B,GACpC,0BAA0B,CAqD5B;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,4BAA4B,GAAG,MAAM,GAAG,SAAS,CAG9F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,OAAO,CAEvE"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { existsSync,
|
|
2
|
-
import {
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
3
|
import { readCoordinationViewV3, requireAuthoritySafeCoordinationViewV3, } from "../../events/v3/coordination-view.js";
|
|
4
|
-
import { liveInstanceIdV3, nativeInstanceIdV3,
|
|
4
|
+
import { liveInstanceIdV3, nativeInstanceIdV3, observeLiveEventLedgerRouteV3, } from "../../events/v3/live-route-observer.js";
|
|
5
5
|
import { readHeartbeat } from "./heartbeat-reader.js";
|
|
6
6
|
import { resolveName } from "./names.js";
|
|
7
7
|
/** Read the live coordination rows through the hard-cut ledger route. */
|
|
8
8
|
export function readLiveCoordinationRows(coordRoot) {
|
|
9
|
-
const route =
|
|
9
|
+
const route = observeLiveEventLedgerRouteV3(coordRoot);
|
|
10
10
|
if (route.state === "blocked")
|
|
11
11
|
return [];
|
|
12
12
|
let view;
|
|
@@ -29,7 +29,7 @@ export function readLiveCoordinationRows(coordRoot) {
|
|
|
29
29
|
}
|
|
30
30
|
/** Read one current row from the authority-safe V3 projection. */
|
|
31
31
|
export function readLiveCoordinationRow(coordRoot, nativeInstanceId) {
|
|
32
|
-
const route =
|
|
32
|
+
const route = observeLiveEventLedgerRouteV3(coordRoot);
|
|
33
33
|
if (route.state === "blocked")
|
|
34
34
|
return null;
|
|
35
35
|
try {
|
|
@@ -41,7 +41,7 @@ export function readLiveCoordinationRow(coordRoot, nativeInstanceId) {
|
|
|
41
41
|
const parent = generation.parent_generation_id
|
|
42
42
|
? Object.values(view.instances).find((candidate) => candidate.generation_id === generation.parent_generation_id)
|
|
43
43
|
: undefined;
|
|
44
|
-
return projectHeartbeatV3(coordRoot, generation,
|
|
44
|
+
return projectHeartbeatV3(coordRoot, generation, isCurrentV3HeartbeatCache(cache, generation) ? cache : undefined, nativeInstanceId, parent);
|
|
45
45
|
}
|
|
46
46
|
catch {
|
|
47
47
|
return null;
|
|
@@ -53,84 +53,19 @@ export function readLiveCoordinationRow(coordRoot, nativeInstanceId) {
|
|
|
53
53
|
* callers must never substitute another adapter when this function succeeds.
|
|
54
54
|
*/
|
|
55
55
|
export function liveCoordinationAdapterV3(coordRoot, nativeInstanceId) {
|
|
56
|
-
const route =
|
|
56
|
+
const route = observeLiveEventLedgerRouteV3(coordRoot);
|
|
57
57
|
if (route.state === "blocked")
|
|
58
58
|
throw new Error(`event_v3_coordination_view:${route.reason}`);
|
|
59
59
|
const view = requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(coordRoot));
|
|
60
60
|
const generation = view.instances[liveInstanceIdV3(nativeInstanceId)];
|
|
61
61
|
if (!generation?.authority_eligible)
|
|
62
62
|
return null;
|
|
63
|
-
const adapter =
|
|
64
|
-
if (!
|
|
63
|
+
const adapter = observedAdapterV3(generation);
|
|
64
|
+
if (!isAdapterV3(adapter)) {
|
|
65
65
|
throw new Error("event_v3_coordination_view:adapter_not_observed");
|
|
66
66
|
}
|
|
67
67
|
return adapter;
|
|
68
68
|
}
|
|
69
|
-
/**
|
|
70
|
-
* Ensure the current V3 generation has a mutation target. The resulting file
|
|
71
|
-
* is explicitly generation-bound and disposable: V3 remains the source of
|
|
72
|
-
* truth, while the cache gives the crash-safe authority outbox an atomic local
|
|
73
|
-
* state to reconcile.
|
|
74
|
-
*/
|
|
75
|
-
export function ensureLiveCoordinationHeartbeat(coordRoot, nativeInstanceId, nativeSessionId, _adapter, model) {
|
|
76
|
-
const route = resolveLiveEventLedgerRouteV3(coordRoot);
|
|
77
|
-
if (route.state === "blocked")
|
|
78
|
-
throw new Error(`event_v3_coordination_view:${route.reason}`);
|
|
79
|
-
const view = requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(coordRoot));
|
|
80
|
-
const generation = view.instances[liveInstanceIdV3(nativeInstanceId)];
|
|
81
|
-
if (!generation?.authority_eligible)
|
|
82
|
-
return null;
|
|
83
|
-
const generationAdapter = observedAdapter(generation);
|
|
84
|
-
if (!isAdapter(generationAdapter)) {
|
|
85
|
-
throw new Error("event_v3_coordination_view:adapter_not_observed");
|
|
86
|
-
}
|
|
87
|
-
const current = readHeartbeat(coordRoot, nativeInstanceId);
|
|
88
|
-
if (isCurrentCache(current, generation) && current.platform === generationAdapter)
|
|
89
|
-
return current;
|
|
90
|
-
const resolved = resolveName(coordRoot, nativeInstanceId, nativeSessionId);
|
|
91
|
-
const projected = projectHeartbeatV3(coordRoot, generation, undefined, nativeInstanceId);
|
|
92
|
-
// A generation reopen (resume, mid-flight onboarding) discards the stale
|
|
93
|
-
// cache, but the adapter tab it names is unchanged: same native session,
|
|
94
|
-
// same agent identity. Rebuilding without the naming evidence re-mints a
|
|
95
|
-
// fresh suggested name on the next set-task, so a multi-day session
|
|
96
|
-
// accumulates titles it is asked to display over and over. Carry the
|
|
97
|
-
// naming evidence across generations; everything else re-projects from V3.
|
|
98
|
-
// Same native session id means the same adapter tab; drop the carry only
|
|
99
|
-
// when the durable identity observably changed (a reassumed name would make
|
|
100
|
-
// the old "Agent <name> - …" block wrong for the new owner).
|
|
101
|
-
const identityUnchanged = !resolved?.name || !current?.name || resolved.name === current.name;
|
|
102
|
-
const carriedNaming = current && current.session_id === nativeSessionId && identityUnchanged
|
|
103
|
-
? {
|
|
104
|
-
...(current.suggested_session_name
|
|
105
|
-
? { suggested_session_name: current.suggested_session_name }
|
|
106
|
-
: {}),
|
|
107
|
-
...(current.session_name_seen_for
|
|
108
|
-
? { session_name_seen_for: current.session_name_seen_for }
|
|
109
|
-
: {}),
|
|
110
|
-
...(current.session_name_seen_at
|
|
111
|
-
? { session_name_seen_at: current.session_name_seen_at }
|
|
112
|
-
: {}),
|
|
113
|
-
}
|
|
114
|
-
: {};
|
|
115
|
-
const materialized = {
|
|
116
|
-
...projected,
|
|
117
|
-
...carriedNaming,
|
|
118
|
-
schema_version: 2,
|
|
119
|
-
instance_id: nativeInstanceId,
|
|
120
|
-
session_id: nativeSessionId,
|
|
121
|
-
name: resolved?.name ?? "",
|
|
122
|
-
kind: resolved?.kind ?? projected.kind,
|
|
123
|
-
agent_id: resolved?.agent_id ?? (resolved?.kind === "subagent" ? nativeInstanceId : ""),
|
|
124
|
-
model: projected.model ?? model ?? "",
|
|
125
|
-
platform: generationAdapter,
|
|
126
|
-
v3_instance_id: generation.instance_id,
|
|
127
|
-
v3_generation_id: generation.generation_id,
|
|
128
|
-
v3_projection_event_id: generation.last_event_id,
|
|
129
|
-
v3_task_state: generation.task_state === "set" ? "set" : "cleared",
|
|
130
|
-
};
|
|
131
|
-
writeHeartbeatCache(coordRoot, nativeInstanceId, materialized);
|
|
132
|
-
return materialized;
|
|
133
|
-
}
|
|
134
69
|
function readCacheRows(coordRoot) {
|
|
135
70
|
const dir = join(coordRoot, ".harnery", "active");
|
|
136
71
|
if (!existsSync(dir))
|
|
@@ -152,15 +87,15 @@ function readV3Caches(coordRoot) {
|
|
|
152
87
|
return readCacheRows(coordRoot).filter((row) => row.schema_version === 2 && typeof row.v3_generation_id === "string");
|
|
153
88
|
}
|
|
154
89
|
function matchingCache(caches, generation) {
|
|
155
|
-
return caches.find((cache) =>
|
|
90
|
+
return caches.find((cache) => isCurrentV3HeartbeatCache(cache, generation));
|
|
156
91
|
}
|
|
157
|
-
function
|
|
92
|
+
export function isCurrentV3HeartbeatCache(cache, generation) {
|
|
158
93
|
return (cache?.schema_version === 2 &&
|
|
159
94
|
cache.v3_instance_id === generation.instance_id &&
|
|
160
95
|
cache.v3_generation_id === generation.generation_id);
|
|
161
96
|
}
|
|
162
|
-
function projectHeartbeatV3(coordRoot, generation, cache, nativeInstanceId, parent) {
|
|
163
|
-
const adapter =
|
|
97
|
+
export function projectHeartbeatV3(coordRoot, generation, cache, nativeInstanceId, parent) {
|
|
98
|
+
const adapter = observedAdapterV3(generation) ?? cache?.platform ?? "unknown";
|
|
164
99
|
const model = observedModel(generation) ?? cache?.model ?? "";
|
|
165
100
|
const instanceId = nativeInstanceId ?? cache?.instance_id ?? nativeInstanceIdV3(generation.instance_id);
|
|
166
101
|
const durableIdentity = resolveName(coordRoot, instanceId, cache?.session_id ?? generation.session_id);
|
|
@@ -207,11 +142,11 @@ function projectHeartbeatV3(coordRoot, generation, cache, nativeInstanceId, pare
|
|
|
207
142
|
v3_task_state: taskIsSet ? "set" : "cleared",
|
|
208
143
|
};
|
|
209
144
|
}
|
|
210
|
-
function
|
|
145
|
+
export function observedAdapterV3(generation) {
|
|
211
146
|
const observation = generation.runtime_attestation.adapter;
|
|
212
147
|
return observation.state === "observed" ? observation.value.id : undefined;
|
|
213
148
|
}
|
|
214
|
-
function
|
|
149
|
+
export function isAdapterV3(value) {
|
|
215
150
|
return value === "claude-code" || value === "cursor" || value === "codex";
|
|
216
151
|
}
|
|
217
152
|
function observedModel(generation) {
|
|
@@ -221,13 +156,3 @@ function observedModel(generation) {
|
|
|
221
156
|
function isLifecycleState(value) {
|
|
222
157
|
return value === "active" || value === "blocked" || value === "done";
|
|
223
158
|
}
|
|
224
|
-
function writeHeartbeatCache(coordRoot, instanceId, heartbeat) {
|
|
225
|
-
if (!/^[a-zA-Z0-9._-]{1,128}$/.test(instanceId)) {
|
|
226
|
-
throw new Error("instance_id is unsafe for heartbeat materialization");
|
|
227
|
-
}
|
|
228
|
-
const path = join(coordRoot, ".harnery", "active", `${instanceId}.json`);
|
|
229
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
230
|
-
const temporary = `${path}.tmp.${process.pid}`;
|
|
231
|
-
writeFileSync(temporary, JSON.stringify(heartbeat, null, 2), "utf8");
|
|
232
|
-
renameSync(temporary, path);
|
|
233
|
-
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Adapter } from "../../adapter.js";
|
|
2
|
+
import { type Heartbeat } from "./heartbeat-reader.js";
|
|
3
|
+
/**
|
|
4
|
+
* Ensure the current V3 generation has a mutation target. The resulting file
|
|
5
|
+
* is explicitly generation-bound and disposable: V3 remains the source of
|
|
6
|
+
* truth, while the cache gives the crash-safe authority outbox an atomic local
|
|
7
|
+
* state to reconcile.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ensureLiveCoordinationHeartbeat(coordRoot: string, nativeInstanceId: string, nativeSessionId: string, _adapter: Adapter, model?: string): Heartbeat | null;
|
|
10
|
+
/** Rebuild a disposable cache from V3 even when its generation markers look current. */
|
|
11
|
+
export declare function repairLiveCoordinationHeartbeat(coordRoot: string, nativeInstanceId: string, nativeSessionId: string, adapter: Adapter, model?: string): Heartbeat | null;
|
|
12
|
+
//# sourceMappingURL=live-coordination-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-coordination-writer.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/live-coordination-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAMhD,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,uBAAuB,CAAC;AAUtE;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,OAAO,EACjB,KAAK,CAAC,EAAE,MAAM,GACb,SAAS,GAAG,IAAI,CASlB;AAED,wFAAwF;AACxF,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,SAAS,GAAG,IAAI,CASlB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { mkdirSync, renameSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { readCoordinationViewV3, requireAuthoritySafeCoordinationViewV3, } from "../../events/v3/coordination-view.js";
|
|
4
|
+
import { liveInstanceIdV3, resolveLiveEventLedgerRouteV3 } from "../../events/v3/live-routing.js";
|
|
5
|
+
import { readHeartbeat } from "./heartbeat-reader.js";
|
|
6
|
+
import { isAdapterV3, isCurrentV3HeartbeatCache, observedAdapterV3, projectHeartbeatV3, } from "./live-coordination-view.js";
|
|
7
|
+
import { resolveName } from "./names.js";
|
|
8
|
+
/**
|
|
9
|
+
* Ensure the current V3 generation has a mutation target. The resulting file
|
|
10
|
+
* is explicitly generation-bound and disposable: V3 remains the source of
|
|
11
|
+
* truth, while the cache gives the crash-safe authority outbox an atomic local
|
|
12
|
+
* state to reconcile.
|
|
13
|
+
*/
|
|
14
|
+
export function ensureLiveCoordinationHeartbeat(coordRoot, nativeInstanceId, nativeSessionId, _adapter, model) {
|
|
15
|
+
return materializeLiveCoordinationHeartbeat(coordRoot, nativeInstanceId, nativeSessionId, _adapter, model, false);
|
|
16
|
+
}
|
|
17
|
+
/** Rebuild a disposable cache from V3 even when its generation markers look current. */
|
|
18
|
+
export function repairLiveCoordinationHeartbeat(coordRoot, nativeInstanceId, nativeSessionId, adapter, model) {
|
|
19
|
+
return materializeLiveCoordinationHeartbeat(coordRoot, nativeInstanceId, nativeSessionId, adapter, model, true);
|
|
20
|
+
}
|
|
21
|
+
function materializeLiveCoordinationHeartbeat(coordRoot, nativeInstanceId, nativeSessionId, _adapter, model, force) {
|
|
22
|
+
const route = resolveLiveEventLedgerRouteV3(coordRoot);
|
|
23
|
+
if (route.state === "blocked")
|
|
24
|
+
throw new Error(`event_v3_coordination_view:${route.reason}`);
|
|
25
|
+
const view = requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(coordRoot));
|
|
26
|
+
const generation = view.instances[liveInstanceIdV3(nativeInstanceId)];
|
|
27
|
+
if (!generation?.authority_eligible)
|
|
28
|
+
return null;
|
|
29
|
+
const generationAdapter = observedAdapterV3(generation);
|
|
30
|
+
if (!isAdapterV3(generationAdapter)) {
|
|
31
|
+
throw new Error("event_v3_coordination_view:adapter_not_observed");
|
|
32
|
+
}
|
|
33
|
+
const current = readHeartbeat(coordRoot, nativeInstanceId);
|
|
34
|
+
if (!force &&
|
|
35
|
+
isCurrentV3HeartbeatCache(current, generation) &&
|
|
36
|
+
current.platform === generationAdapter) {
|
|
37
|
+
return current;
|
|
38
|
+
}
|
|
39
|
+
const resolved = resolveName(coordRoot, nativeInstanceId, nativeSessionId);
|
|
40
|
+
const projected = projectHeartbeatV3(coordRoot, generation, undefined, nativeInstanceId);
|
|
41
|
+
// A generation reopen (resume, mid-flight onboarding) discards the stale
|
|
42
|
+
// cache, but the adapter tab it names is unchanged: same native session,
|
|
43
|
+
// same agent identity. Rebuilding without the naming evidence re-mints a
|
|
44
|
+
// fresh suggested name on the next set-task, so a multi-day session
|
|
45
|
+
// accumulates titles it is asked to display over and over. Carry the
|
|
46
|
+
// naming evidence across generations; everything else re-projects from V3.
|
|
47
|
+
// Same native session id means the same adapter tab; drop the carry only
|
|
48
|
+
// when the durable identity observably changed (a reassumed name would make
|
|
49
|
+
// the old "Agent <name> - …" block wrong for the new owner).
|
|
50
|
+
const identityUnchanged = !resolved?.name || !current?.name || resolved.name === current.name;
|
|
51
|
+
const carriedNaming = current && current.session_id === nativeSessionId && identityUnchanged
|
|
52
|
+
? {
|
|
53
|
+
...(current.suggested_session_name
|
|
54
|
+
? { suggested_session_name: current.suggested_session_name }
|
|
55
|
+
: {}),
|
|
56
|
+
...(current.session_name_seen_for
|
|
57
|
+
? { session_name_seen_for: current.session_name_seen_for }
|
|
58
|
+
: {}),
|
|
59
|
+
...(current.session_name_seen_at
|
|
60
|
+
? { session_name_seen_at: current.session_name_seen_at }
|
|
61
|
+
: {}),
|
|
62
|
+
}
|
|
63
|
+
: {};
|
|
64
|
+
const materialized = {
|
|
65
|
+
...projected,
|
|
66
|
+
...carriedNaming,
|
|
67
|
+
schema_version: 2,
|
|
68
|
+
instance_id: nativeInstanceId,
|
|
69
|
+
session_id: nativeSessionId,
|
|
70
|
+
name: resolved?.name ?? "",
|
|
71
|
+
kind: resolved?.kind ?? projected.kind,
|
|
72
|
+
agent_id: resolved?.agent_id ?? (resolved?.kind === "subagent" ? nativeInstanceId : ""),
|
|
73
|
+
model: projected.model ?? model ?? "",
|
|
74
|
+
platform: generationAdapter,
|
|
75
|
+
v3_instance_id: generation.instance_id,
|
|
76
|
+
v3_generation_id: generation.generation_id,
|
|
77
|
+
v3_projection_event_id: generation.last_event_id,
|
|
78
|
+
v3_task_state: generation.task_state === "set" ? "set" : "cleared",
|
|
79
|
+
};
|
|
80
|
+
writeHeartbeatCache(coordRoot, nativeInstanceId, materialized);
|
|
81
|
+
return materialized;
|
|
82
|
+
}
|
|
83
|
+
function writeHeartbeatCache(coordRoot, instanceId, heartbeat) {
|
|
84
|
+
if (!/^[a-zA-Z0-9._-]{1,128}$/.test(instanceId)) {
|
|
85
|
+
throw new Error("instance_id is unsafe for heartbeat materialization");
|
|
86
|
+
}
|
|
87
|
+
const path = join(coordRoot, ".harnery", "active", `${instanceId}.json`);
|
|
88
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
89
|
+
const temporary = `${path}.tmp.${process.pid}`;
|
|
90
|
+
writeFileSync(temporary, JSON.stringify(heartbeat, null, 2), "utf8");
|
|
91
|
+
renameSync(temporary, path);
|
|
92
|
+
}
|