harnery 0.34.1 → 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 -94
- package/dist/commands/agents.d.ts +37 -6
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +466 -371
- 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 +31 -6
- 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/decision.d.ts.map +1 -1
- package/dist/commands/decision.js +2 -2
- 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/events.d.ts.map +1 -1
- package/dist/commands/events.js +18 -1
- 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/presence.d.ts.map +1 -1
- package/dist/commands/presence.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 +4 -0
- package/dist/commands/semantic.d.ts.map +1 -0
- package/dist/commands/semantic.js +199 -0
- 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 +84 -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/canonical-emit.d.ts +3 -0
- package/dist/core/agents/canonical-emit.d.ts.map +1 -1
- package/dist/core/agents/canonical-emit.js +12 -0
- package/dist/core/agents/claim-path.d.ts +11 -0
- package/dist/core/agents/claim-path.d.ts.map +1 -0
- package/dist/core/agents/claim-path.js +22 -0
- package/dist/core/agents/cli.js +209 -39
- package/dist/core/agents/coord-client.d.ts +29 -3
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/coord-client.js +88 -9
- 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 +245 -13
- package/dist/core/agents/live-lifecycle-v3.js +9 -4
- package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
- package/dist/core/agents/live-observation-v3.js +8 -3
- 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 +36 -17
- 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 +115 -22
- 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/session-name-display.d.ts +1 -0
- package/dist/core/agents/session-name-display.d.ts.map +1 -1
- package/dist/core/agents/session-name-display.js +8 -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-reader.d.ts +46 -0
- package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -0
- package/dist/core/agents/state/heartbeat-reader.js +25 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts +9 -48
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +34 -34
- package/dist/core/agents/state/live-coordination-view.d.ts +6 -8
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +16 -67
- 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/agents/state/names.d.ts +9 -1
- package/dist/core/agents/state/names.d.ts.map +1 -1
- package/dist/core/agents/state/names.js +190 -182
- package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
- package/dist/core/agents/state/stale-sweep.js +23 -5
- package/dist/core/artifacts/constants.d.ts +5 -0
- package/dist/core/artifacts/constants.d.ts.map +1 -0
- package/dist/core/artifacts/constants.js +4 -0
- package/dist/core/artifacts/index.d.ts +24 -3
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +96 -8
- 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 +851 -16
- package/dist/core/events/v3/base-contract.d.ts.map +1 -1
- package/dist/core/events/v3/base-contract.js +50 -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.d.ts +11 -0
- package/dist/core/events/v3/capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/capabilities.js +26 -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 +8 -5
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +7 -4
- package/dist/core/events/v3/latency.d.ts +31 -1
- package/dist/core/events/v3/latency.d.ts.map +1 -1
- package/dist/core/events/v3/latency.js +127 -3
- 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 +42 -20
- package/dist/core/events/v3/live-routing.d.ts.map +1 -1
- package/dist/core/events/v3/live-routing.js +153 -41
- package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/command-recorder.js +10 -1
- 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 +90 -13
- 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.d.ts +17 -1
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook-base.js +83 -2
- package/dist/core/events/v3/producers/intake.d.ts +13 -0
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
- package/dist/core/events/v3/producers/intake.js +36 -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 +117 -1
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +992 -27
- 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 +52 -0
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -0
- package/dist/core/events/v3/runtime-telemetry-capabilities.js +54 -0
- 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 +21 -6
- 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/parse.d.ts +3 -0
- package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
- package/dist/core/hooks/adapter/parse.js +14 -0
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts +142 -0
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -0
- package/dist/core/hooks/adapter/runtime-telemetry.js +869 -0
- package/dist/core/hooks/cli.js +318 -61
- 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 +39 -0
- package/dist/core/hooks/remediation-cap.d.ts.map +1 -0
- package/dist/core/hooks/remediation-cap.js +63 -0
- 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 +33 -9
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
- package/dist/core/hooks/resolve/transcript.js +33 -10
- 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 +37 -0
- package/dist/core/semantic/adapters.d.ts.map +1 -0
- package/dist/core/semantic/adapters.js +360 -0
- package/dist/core/semantic/contract.d.ts +1072 -0
- package/dist/core/semantic/contract.d.ts.map +1 -0
- package/dist/core/semantic/contract.js +331 -0
- package/dist/core/semantic/evidence.d.ts +11 -0
- package/dist/core/semantic/evidence.d.ts.map +1 -0
- package/dist/core/semantic/evidence.js +262 -0
- package/dist/core/semantic/index.d.ts +14 -0
- package/dist/core/semantic/index.d.ts.map +1 -0
- package/dist/core/semantic/index.js +13 -0
- package/dist/core/semantic/once.d.ts +38 -0
- package/dist/core/semantic/once.d.ts.map +1 -0
- package/dist/core/semantic/once.js +364 -0
- package/dist/core/semantic/prompt.d.ts +12 -0
- package/dist/core/semantic/prompt.d.ts.map +1 -0
- package/dist/core/semantic/prompt.js +83 -0
- 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 +27 -0
- package/dist/core/semantic/scheduler.d.ts.map +1 -0
- package/dist/core/semantic/scheduler.js +91 -0
- package/dist/core/semantic/service-status.d.ts +51 -0
- package/dist/core/semantic/service-status.d.ts.map +1 -0
- package/dist/core/semantic/service-status.js +140 -0
- package/dist/core/semantic/service.d.ts +52 -0
- package/dist/core/semantic/service.d.ts.map +1 -0
- package/dist/core/semantic/service.js +559 -0
- 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 +81 -0
- package/dist/core/semantic/storage.d.ts.map +1 -0
- package/dist/core/semantic/storage.js +180 -0
- 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 +18 -0
- package/dist/core/semantic/validate.d.ts.map +1 -0
- package/dist/core/semantic/validate.js +207 -0
- 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/browser/client.d.ts +11 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +13 -0
- package/dist/lib/browser/index.d.ts +1 -0
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/standalone-html.d.ts +25 -0
- package/dist/lib/browser/standalone-html.d.ts.map +1 -0
- package/dist/lib/browser/standalone-html.js +284 -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/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +1 -0
- package/dist/lib/instructions/templates.d.ts +2 -0
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +149 -4
- 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 +34 -2
- package/schemas/config.schema.json +58 -0
- package/schemas/event-v3.schema.json +3073 -581
- package/src/commander.ts +462 -93
- package/src/commands/agents.ts +617 -355
- package/src/commands/backup.ts +18 -14
- package/src/commands/browse-session.ts +12 -0
- package/src/commands/browse.ts +31 -9
- package/src/commands/conversations.ts +279 -0
- package/src/commands/decision.ts +8 -2
- package/src/commands/deinit.ts +6 -0
- package/src/commands/docs.ts +25 -6
- package/src/commands/doctor.ts +75 -9
- package/src/commands/events.ts +21 -1
- 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/presence.ts +7 -2
- package/src/commands/read.ts +6 -2
- package/src/commands/semantic.ts +244 -0
- package/src/commands/storage.ts +310 -0
- package/src/commands/tunnel.ts +66 -52
- package/src/commands/web.ts +92 -7
- package/src/commands/work.ts +3 -3
- package/src/commands/workflow.ts +13 -13
- package/src/core/agents/canonical-emit.ts +15 -0
- package/src/core/agents/claim-path.ts +23 -0
- package/src/core/agents/cli.ts +259 -53
- package/src/core/agents/coord-client.ts +92 -8
- package/src/core/agents/live-authority-v3.ts +342 -14
- package/src/core/agents/live-lifecycle-v3.ts +14 -4
- package/src/core/agents/live-observation-v3.ts +13 -3
- package/src/core/agents/render/prompt-context.ts +40 -16
- package/src/core/agents/rules/stop-hook.ts +129 -25
- 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/session-name-display.ts +9 -1
- package/src/core/agents/state/activity-log.ts +7 -2
- package/src/core/agents/state/heartbeat-reader.ts +69 -0
- package/src/core/agents/state/heartbeat-writer.ts +47 -84
- package/src/core/agents/state/live-coordination-view.ts +17 -81
- package/src/core/agents/state/live-coordination-writer.ts +141 -0
- package/src/core/agents/state/names.ts +190 -182
- package/src/core/agents/state/stale-sweep.ts +25 -5
- package/src/core/artifacts/constants.ts +4 -0
- package/src/core/artifacts/index.ts +113 -8
- 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 +56 -7
- package/src/core/events/v3/bootstrap.ts +195 -2
- package/src/core/events/v3/capabilities.ts +37 -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 +26 -2
- package/src/core/events/v3/latency.ts +213 -2
- package/src/core/events/v3/live-route-observer.ts +80 -0
- package/src/core/events/v3/live-routing.ts +182 -45
- package/src/core/events/v3/producers/command-recorder.ts +10 -1
- package/src/core/events/v3/producers/coordination-recorder.ts +112 -15
- package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
- package/src/core/events/v3/producers/hook-base.ts +116 -2
- package/src/core/events/v3/producers/intake.ts +48 -2
- package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
- package/src/core/events/v3/producers/recorder.ts +1403 -30
- 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 +143 -0
- 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 +66 -5
- 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/parse.ts +16 -0
- package/src/core/hooks/adapter/runtime-telemetry.ts +1200 -0
- package/src/core/hooks/cli.ts +342 -64
- package/src/core/hooks/effects/image-capture.ts +4 -1
- package/src/core/hooks/remediation-cap.ts +83 -0
- 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 +55 -11
- 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 +452 -0
- package/src/core/semantic/contract.ts +430 -0
- package/src/core/semantic/evidence.ts +336 -0
- package/src/core/semantic/index.ts +201 -0
- package/src/core/semantic/once.ts +496 -0
- package/src/core/semantic/prompt.ts +96 -0
- package/src/core/semantic/review.ts +803 -0
- package/src/core/semantic/routes.ts +30 -0
- package/src/core/semantic/scheduler.ts +151 -0
- package/src/core/semantic/service-status.ts +212 -0
- package/src/core/semantic/service.ts +681 -0
- package/src/core/semantic/soak.ts +638 -0
- package/src/core/semantic/storage.ts +300 -0
- package/src/core/semantic/usage.ts +272 -0
- package/src/core/semantic/validate.ts +243 -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/browser/client.ts +21 -0
- package/src/lib/browser/index.ts +4 -0
- package/src/lib/browser/standalone-html.ts +312 -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/apply.ts +1 -0
- package/src/lib/instructions/templates.ts +154 -4
- 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)
|
|
@@ -78,17 +86,27 @@ export function evaluateStopHookV3Events(coordRoot, req, events) {
|
|
|
78
86
|
const taskSet = inTurn.some((event) => event.event_type === "coord.task_changed" && event.payload.subject_instance_id === owner);
|
|
79
87
|
const turnTerminals = inTurn.filter((event) => event.event_type === "turn.completed");
|
|
80
88
|
const latestTerminal = turnTerminals.at(-1);
|
|
81
|
-
const latestBox = observedBoolean(latestTerminal?.payload.ritual?.
|
|
82
|
-
|
|
83
|
-
|
|
89
|
+
const latestBox = observedBoolean(latestTerminal?.payload.ritual?.status_box_present_strict);
|
|
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) {
|
|
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"
|
|
86
|
-
|
|
97
|
+
const ackPresent = req.adapter === "cursor"
|
|
98
|
+
? requiredStatusChecked
|
|
99
|
+
: claudeContinuation
|
|
100
|
+
? strictBoxObservations.includes(true) || currentStrictBox === true
|
|
101
|
+
: latestBox === true;
|
|
102
|
+
const ackBlock = req.adapter === "cursor"
|
|
103
|
+
? () => rule13Block(coordRoot, req.session_id)
|
|
104
|
+
: () => rule23Block(coordRoot, req.session_id);
|
|
87
105
|
// Pure prose turns keep the human-visible acknowledgement but do not require
|
|
88
106
|
// task or final-status mutations. This preserves the pre-V3 policy exactly.
|
|
89
107
|
if (!usedTool) {
|
|
90
108
|
if (!ackPresent)
|
|
91
|
-
return ackBlock();
|
|
109
|
+
return withCycleAnchor(ackBlock(), cycleAnchor);
|
|
92
110
|
return {
|
|
93
111
|
allow: true,
|
|
94
112
|
exit_code: 0,
|
|
@@ -96,12 +114,17 @@ export function evaluateStopHookV3Events(coordRoot, req, events) {
|
|
|
96
114
|
reason: "no tool calls this turn; task and final-status mutations were not required",
|
|
97
115
|
};
|
|
98
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 = [];
|
|
99
122
|
if (!requiredStatusChecked)
|
|
100
|
-
|
|
123
|
+
pending.push(rule13Block(coordRoot, req.session_id));
|
|
101
124
|
if (!ackPresent)
|
|
102
|
-
|
|
125
|
+
pending.push(ackBlock());
|
|
103
126
|
if (!taskSet)
|
|
104
|
-
|
|
127
|
+
pending.push(rule33Block(coordRoot, req.session_id));
|
|
105
128
|
// Claude Code can prove session-name presentation from assistant-only text.
|
|
106
129
|
// Cursor cannot expose that text and Codex returned observe-only above.
|
|
107
130
|
if (req.adapter !== "cursor") {
|
|
@@ -111,9 +134,12 @@ export function evaluateStopHookV3Events(coordRoot, req, events) {
|
|
|
111
134
|
if (naming.some(({ required }) => required) &&
|
|
112
135
|
!naming.some(({ present }) => present) &&
|
|
113
136
|
!sessionNameSeenStamped(coordRoot, req.instance_id)) {
|
|
114
|
-
|
|
137
|
+
pending.push(sessionNameBlock(coordRoot, req.instance_id));
|
|
115
138
|
}
|
|
116
139
|
}
|
|
140
|
+
const blocked = mergeStopBlocks(pending);
|
|
141
|
+
if (blocked)
|
|
142
|
+
return withCycleAnchor(blocked, cycleAnchor);
|
|
117
143
|
return { allow: true, exit_code: 0, rule: "stop-hook.pass" };
|
|
118
144
|
}
|
|
119
145
|
function unconditionalVerdict(req) {
|
|
@@ -143,22 +169,48 @@ function unconditionalVerdict(req) {
|
|
|
143
169
|
}
|
|
144
170
|
return undefined;
|
|
145
171
|
}
|
|
146
|
-
function
|
|
172
|
+
function resolveTurnStart(ownerEvents, nowMs, claudeContinuation) {
|
|
147
173
|
const turns = ownerEvents.filter((event) => event.event_type === "turn.started" && eventTimeMs(event) <= nowMs);
|
|
148
174
|
if (turns.length === 0)
|
|
149
|
-
return
|
|
175
|
+
return undefined;
|
|
150
176
|
let index = turns.length - 1;
|
|
151
177
|
let hops = 0;
|
|
152
178
|
while (index > 0 && hops < MAX_REMEDIATION_WALK_BACK) {
|
|
153
179
|
const turn = turns[index];
|
|
154
|
-
|
|
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)
|
|
155
185
|
break;
|
|
156
186
|
index -= 1;
|
|
157
187
|
hops += 1;
|
|
158
188
|
}
|
|
159
|
-
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 };
|
|
160
210
|
}
|
|
161
211
|
function eventTimeMs(event) {
|
|
212
|
+
if (!event)
|
|
213
|
+
return Number.NaN;
|
|
162
214
|
return Date.parse(event.time.observed_at);
|
|
163
215
|
}
|
|
164
216
|
function observedBoolean(value) {
|
|
@@ -192,7 +244,48 @@ function evidenceUnavailable(reason) {
|
|
|
192
244
|
reason,
|
|
193
245
|
};
|
|
194
246
|
}
|
|
195
|
-
|
|
247
|
+
/**
|
|
248
|
+
* Remediation commands carry `--session-id` when the session id is known: the
|
|
249
|
+
* remediating tool call may not descend from a pid-map-registered anchor
|
|
250
|
+
* (headless children, Cursor shells), and a ppid-walk that resolves to a
|
|
251
|
+
* DIFFERENT owner records evidence this verdict will never see — the block
|
|
252
|
+
* then repeats forever while the agent complies every time.
|
|
253
|
+
*/
|
|
254
|
+
function sessionIdSuffix(sessionId) {
|
|
255
|
+
return sessionId ? ` --session-id ${sessionId}` : "";
|
|
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
|
+
}
|
|
288
|
+
function rule13Block(coordRoot, sessionId) {
|
|
196
289
|
const missingEvidence = agentsRequireGitFinalization(coordRoot)
|
|
197
290
|
? "no end_turn_checked coord.status_observed event found in this turn"
|
|
198
291
|
: "no coord.status_observed event found in this turn";
|
|
@@ -200,15 +293,15 @@ function rule13Block(coordRoot) {
|
|
|
200
293
|
allow: false,
|
|
201
294
|
exit_code: 2,
|
|
202
295
|
rule: "stop-hook.rule_1_3",
|
|
203
|
-
reason: `End-of-turn rule (1/3): ${missingEvidence}; run \`${endOfTurnStatusCommand(coordRoot)}\` as your last tool call.`,
|
|
296
|
+
reason: `End-of-turn rule (1/3): ${missingEvidence}; run \`${endOfTurnStatusCommand(coordRoot)}${sessionIdSuffix(sessionId)}\` as your last tool call.`,
|
|
204
297
|
};
|
|
205
298
|
}
|
|
206
|
-
function rule23Block(coordRoot) {
|
|
299
|
+
function rule23Block(coordRoot, sessionId) {
|
|
207
300
|
return {
|
|
208
301
|
allow: false,
|
|
209
302
|
exit_code: 2,
|
|
210
303
|
rule: "stop-hook.rule_2_3",
|
|
211
|
-
reason: `End-of-turn rule (2/3): turn.completed did not observe the agent-status box in your reply text. Paste the \`${endOfTurnStatusCommand(coordRoot)}\` output verbatim as a fenced code block (the \`┌─ agent-\` prefix is the detection signal).`,
|
|
304
|
+
reason: `End-of-turn rule (2/3): turn.completed did not observe the agent-status box in your reply text. Paste the \`${endOfTurnStatusCommand(coordRoot)}${sessionIdSuffix(sessionId)}\` output verbatim as a fenced code block (the \`┌─ agent-\` prefix is the detection signal).`,
|
|
212
305
|
};
|
|
213
306
|
}
|
|
214
307
|
/**
|
|
@@ -252,11 +345,11 @@ function sessionNameBlock(coordRoot, instanceId) {
|
|
|
252
345
|
reason: `Session-naming rule: V3 observed that the current session name was required but absent. ${instruction}`,
|
|
253
346
|
};
|
|
254
347
|
}
|
|
255
|
-
function rule33Block(coordRoot) {
|
|
348
|
+
function rule33Block(coordRoot, sessionId) {
|
|
256
349
|
return {
|
|
257
350
|
allow: false,
|
|
258
351
|
exit_code: 2,
|
|
259
352
|
rule: "stop-hook.rule_3_3",
|
|
260
|
-
reason: `End-of-turn rule (3/3): no coord.task_changed event found in this turn; run \`${resolveBinName(coordRoot)} agents set-task "<short focus>"\` to declare what you're working on. Pass an empty string if the turn was purely conversational.`,
|
|
353
|
+
reason: `End-of-turn rule (3/3): no coord.task_changed event found in this turn; run \`${resolveBinName(coordRoot)} agents set-task${sessionIdSuffix(sessionId)} "<short focus>"\` to declare what you're working on. Pass an empty string if the turn was purely conversational.`,
|
|
261
354
|
};
|
|
262
355
|
}
|
|
@@ -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
|
}
|
|
@@ -12,6 +12,7 @@ export declare const SESSION_NAME_DISPLAY_NOTE = "Next, before any prose or anot
|
|
|
12
12
|
export declare function sessionNameDisplayPending(row: SessionNameDisplayState | null | undefined): string | null;
|
|
13
13
|
export declare function sessionNameDisplayBlock(name: string): string;
|
|
14
14
|
export declare function sessionNameDisplayInstruction(name: string): string;
|
|
15
|
+
export declare function sessionNameDisplayRecoveryInstruction(name: string, binName: string): string;
|
|
15
16
|
/**
|
|
16
17
|
* A PostToolUse result should announce the display protocol only when that
|
|
17
18
|
* exact tool call minted or retried the current suggestion. The coordination row keeps
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-name-display.d.ts","sourceRoot":"","sources":["../../../src/core/agents/session-name-display.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,uBAAuB;IACtC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,yBAAyB,wHACiF,CAAC;AAExH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,uBAAuB,GAAG,IAAI,GAAG,SAAS,GAC9C,MAAM,GAAG,IAAI,CAIf;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASlE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtF;AAgDD;;;;GAIG;AACH,wBAAgB,uCAAuC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK3F;AAUD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,MAAM,GACd,OAAO,CAmBT"}
|
|
1
|
+
{"version":3,"file":"session-name-display.d.ts","sourceRoot":"","sources":["../../../src/core/agents/session-name-display.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,uBAAuB;IACtC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,yBAAyB,wHACiF,CAAC;AAExH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,uBAAuB,GAAG,IAAI,GAAG,SAAS,GAC9C,MAAM,GAAG,IAAI,CAIf;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASlE;AAED,wBAAgB,qCAAqC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAM3F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtF;AAgDD;;;;GAIG;AACH,wBAAgB,uCAAuC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK3F;AAUD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,MAAM,GACd,OAAO,CAmBT"}
|
|
@@ -24,6 +24,13 @@ export function sessionNameDisplayInstruction(name) {
|
|
|
24
24
|
"Do not put commentary before the block. Harnery will reject tool calls until it is shown.",
|
|
25
25
|
].join("\n");
|
|
26
26
|
}
|
|
27
|
+
export function sessionNameDisplayRecoveryInstruction(name, binName) {
|
|
28
|
+
return [
|
|
29
|
+
sessionNameDisplayInstruction(name),
|
|
30
|
+
"",
|
|
31
|
+
`If that exact block was already shown but the gate still rejects tools, run \`${binName} agents suggest-name --json\` as the only tool call. That read-only command is exempt and creates a fresh verification boundary.`,
|
|
32
|
+
].join("\n");
|
|
33
|
+
}
|
|
27
34
|
/**
|
|
28
35
|
* A PostToolUse result should announce the display protocol only when that
|
|
29
36
|
* exact tool call minted or retried the current suggestion. The coordination row keeps
|
|
@@ -114,6 +121,6 @@ export function isSessionNameRemediationCommand(command, binName) {
|
|
|
114
121
|
if (!body || /[\n;&|<>`$]/.test(body))
|
|
115
122
|
return false;
|
|
116
123
|
const escapedBin = binName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
117
|
-
const pattern = new RegExp(`^(?:codex-wsl\\s+--\\s+)?${escapedBin}\\s+agents\\s+(?:set-task|status)(?:\\s+.*)?$`);
|
|
124
|
+
const pattern = new RegExp(`^(?:codex-wsl\\s+--\\s+)?${escapedBin}\\s+agents\\s+(?:set-task|status|suggest-name)(?:\\s+.*)?$`);
|
|
118
125
|
return pattern.test(body);
|
|
119
126
|
}
|
|
@@ -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
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Read-only access to the generation-bound heartbeat cache. */
|
|
2
|
+
import type { AgentActivity, TaskState } from "./session-state.js";
|
|
3
|
+
export interface Heartbeat {
|
|
4
|
+
schema_version?: number;
|
|
5
|
+
instance_id: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
kind?: string;
|
|
8
|
+
agent_id?: string;
|
|
9
|
+
session_id: string;
|
|
10
|
+
/** Native adapter session ID retained only in a generation-bound local projection. */
|
|
11
|
+
native_session_id?: string;
|
|
12
|
+
subagent_call_id?: string;
|
|
13
|
+
model?: string;
|
|
14
|
+
platform?: string;
|
|
15
|
+
started_at?: string;
|
|
16
|
+
last_heartbeat: string;
|
|
17
|
+
files_touched: string[];
|
|
18
|
+
task?: string;
|
|
19
|
+
task_updated_at?: string | null;
|
|
20
|
+
activity?: AgentActivity;
|
|
21
|
+
activity_updated_at?: string;
|
|
22
|
+
activity_source?: string;
|
|
23
|
+
task_state?: TaskState;
|
|
24
|
+
task_state_updated_at?: string;
|
|
25
|
+
task_state_reason?: string;
|
|
26
|
+
/** Session name built on the first non-empty set-task (never rebuilt). */
|
|
27
|
+
suggested_session_name?: string;
|
|
28
|
+
/** Stamped once the suggested name is seen in assistant reply text. */
|
|
29
|
+
session_name_seen_at?: string;
|
|
30
|
+
/** The specific suggested name proven present by the sighting stamp. */
|
|
31
|
+
session_name_seen_for?: string;
|
|
32
|
+
last_status_at?: string;
|
|
33
|
+
current_turn_id?: string;
|
|
34
|
+
parent_instance_id?: string;
|
|
35
|
+
workflow_run_id?: string;
|
|
36
|
+
workflow_agent_id?: string;
|
|
37
|
+
/** Disposable-cache bindings that prove a row belongs to the current V3 generation. */
|
|
38
|
+
v3_instance_id?: `inst_${string}`;
|
|
39
|
+
v3_generation_id?: `gen_${string}`;
|
|
40
|
+
v3_projection_event_id?: string;
|
|
41
|
+
v3_task_state?: "set" | "cleared";
|
|
42
|
+
[extra: string]: unknown;
|
|
43
|
+
}
|
|
44
|
+
export declare function heartbeatPath(coordRoot: string, instanceId: string): string;
|
|
45
|
+
export declare function readHeartbeat(coordRoot: string, instanceId: string): Heartbeat | null;
|
|
46
|
+
//# sourceMappingURL=heartbeat-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat-reader.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/heartbeat-reader.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAIhE,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEnE,MAAM,WAAW,SAAS;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,uEAAuE;IACvE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wEAAwE;IACxE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uFAAuF;IACvF,cAAc,CAAC,EAAE,QAAQ,MAAM,EAAE,CAAC;IAClC,gBAAgB,CAAC,EAAE,OAAO,MAAM,EAAE,CAAC;IACnC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IAClC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAU3E;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAQrF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Read-only access to the generation-bound heartbeat cache. */
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { dirname, resolve, sep } from "node:path";
|
|
4
|
+
export function heartbeatPath(coordRoot, instanceId) {
|
|
5
|
+
if (!/^[A-Za-z0-9_-]{1,128}$/.test(instanceId)) {
|
|
6
|
+
throw new Error("instance_id must be 1-128 ASCII letters, digits, hyphens, or underscores");
|
|
7
|
+
}
|
|
8
|
+
const root = resolve(coordRoot, ".harnery", "active");
|
|
9
|
+
const candidate = resolve(root, `${instanceId}.json`);
|
|
10
|
+
if (!candidate.startsWith(`${root}${sep}`) || dirname(candidate) !== root) {
|
|
11
|
+
throw new Error("coordination filename must resolve directly beneath its root");
|
|
12
|
+
}
|
|
13
|
+
return candidate;
|
|
14
|
+
}
|
|
15
|
+
export function readHeartbeat(coordRoot, instanceId) {
|
|
16
|
+
const path = heartbeatPath(coordRoot, instanceId);
|
|
17
|
+
if (!existsSync(path))
|
|
18
|
+
return null;
|
|
19
|
+
try {
|
|
20
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -13,59 +13,20 @@
|
|
|
13
13
|
* `.harnery/active/<instance_id>.json`; the canonical V3 ledger remains authoritative.
|
|
14
14
|
* (the file IS the heartbeat). No mutations happen elsewhere.
|
|
15
15
|
*/
|
|
16
|
-
import
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
instance_id: string;
|
|
20
|
-
name?: string;
|
|
21
|
-
kind?: string;
|
|
22
|
-
agent_id?: string;
|
|
23
|
-
session_id: string;
|
|
24
|
-
/** Native adapter session ID retained only in a generation-bound local projection. */
|
|
25
|
-
native_session_id?: string;
|
|
26
|
-
subagent_call_id?: string;
|
|
27
|
-
model?: string;
|
|
28
|
-
platform?: string;
|
|
29
|
-
started_at?: string;
|
|
30
|
-
last_heartbeat: string;
|
|
31
|
-
files_touched: string[];
|
|
32
|
-
task?: string;
|
|
33
|
-
task_updated_at?: string | null;
|
|
34
|
-
activity?: AgentActivity;
|
|
35
|
-
activity_updated_at?: string;
|
|
36
|
-
activity_source?: string;
|
|
37
|
-
task_state?: TaskState;
|
|
38
|
-
task_state_updated_at?: string;
|
|
39
|
-
task_state_reason?: string;
|
|
40
|
-
/** Session name built on the first non-empty set-task (never rebuilt). Its
|
|
41
|
-
* presence is the "this session has been named" signal the prompt-context
|
|
42
|
-
* nudge and the Stop-hook naming rule key on. */
|
|
43
|
-
suggested_session_name?: string;
|
|
44
|
-
/** Stamped by turn.completed once the suggested name is seen in assistant reply
|
|
45
|
-
* text, ending the per-turn transcript scan. */
|
|
46
|
-
session_name_seen_at?: string;
|
|
47
|
-
/** WHICH name that sighting was for. The scan is skipped only while this
|
|
48
|
-
* matches the current suggested name, so a re-minted name is detectable
|
|
49
|
-
* again rather than being suppressed by the earlier sighting. */
|
|
50
|
-
session_name_seen_for?: string;
|
|
51
|
-
last_status_at?: string;
|
|
52
|
-
current_turn_id?: string;
|
|
53
|
-
parent_instance_id?: string;
|
|
54
|
-
workflow_run_id?: string;
|
|
55
|
-
workflow_agent_id?: string;
|
|
56
|
-
/** Disposable-cache bindings that prove a row belongs to the current V3 generation. */
|
|
57
|
-
v3_instance_id?: `inst_${string}`;
|
|
58
|
-
v3_generation_id?: `gen_${string}`;
|
|
59
|
-
v3_projection_event_id?: string;
|
|
60
|
-
v3_task_state?: "set" | "cleared";
|
|
61
|
-
[extra: string]: unknown;
|
|
62
|
-
}
|
|
63
|
-
export declare function readHeartbeat(coordRoot: string, instanceId: string): Heartbeat | null;
|
|
16
|
+
import { type Heartbeat } from "./heartbeat-reader.js";
|
|
17
|
+
import type { TaskState } from "./session-state.js";
|
|
18
|
+
export { type Heartbeat, readHeartbeat } from "./heartbeat-reader.js";
|
|
64
19
|
/** Persist operator-facing lifecycle prose in the generation-bound cache only. */
|
|
65
20
|
export declare function setLifecycleCache(coordRoot: string, instanceId: string, state: TaskState, reason?: string, suggestedSessionName?: string): Heartbeat | null;
|
|
66
21
|
export declare function setTask(coordRoot: string, instanceId: string, task: string): Heartbeat | null;
|
|
67
22
|
/** Update the disposable identity cache after a canonical V3 attestation. */
|
|
68
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;
|
|
69
30
|
/**
|
|
70
31
|
* Build the copy-pasteable session name from the coord identity + the agent's
|
|
71
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,
|
|
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"}
|
|
@@ -14,16 +14,10 @@
|
|
|
14
14
|
* (the file IS the heartbeat). No mutations happen elsewhere.
|
|
15
15
|
*/
|
|
16
16
|
import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const safeInstanceId = basename(instanceId);
|
|
22
|
-
if (safeInstanceId !== instanceId) {
|
|
23
|
-
throw new Error("instance_id must be a direct-child coordination basename");
|
|
24
|
-
}
|
|
25
|
-
return resolveContainedFile(join(coordRoot, ".harnery", "active"), `${safeInstanceId}.json`);
|
|
26
|
-
}
|
|
17
|
+
import { dirname, join } from "node:path";
|
|
18
|
+
import { canonicalClaimPath } from "../claim-path.js";
|
|
19
|
+
import { heartbeatPath, readHeartbeat } from "./heartbeat-reader.js";
|
|
20
|
+
export { readHeartbeat } from "./heartbeat-reader.js";
|
|
27
21
|
function nowIsoSeconds() {
|
|
28
22
|
return new Date().toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
29
23
|
}
|
|
@@ -33,17 +27,6 @@ function atomicWrite(path, content) {
|
|
|
33
27
|
writeFileSync(tmp, content, "utf8");
|
|
34
28
|
renameSync(tmp, path);
|
|
35
29
|
}
|
|
36
|
-
export function readHeartbeat(coordRoot, instanceId) {
|
|
37
|
-
const path = heartbeatPath(coordRoot, instanceId);
|
|
38
|
-
if (!existsSync(path))
|
|
39
|
-
return null;
|
|
40
|
-
try {
|
|
41
|
-
return JSON.parse(readFileSync(path, "utf8"));
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
30
|
/** Persist operator-facing lifecycle prose in the generation-bound cache only. */
|
|
48
31
|
export function setLifecycleCache(coordRoot, instanceId, state, reason, suggestedSessionName) {
|
|
49
32
|
return mutate(coordRoot, instanceId, (heartbeat) => ({
|
|
@@ -93,6 +76,24 @@ export function setIdentityCache(coordRoot, instanceId, name, agentId) {
|
|
|
93
76
|
atomicWrite(heartbeatPath(coordRoot, instanceId), JSON.stringify(heartbeat, null, 2));
|
|
94
77
|
return heartbeat;
|
|
95
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
|
+
}
|
|
96
97
|
/**
|
|
97
98
|
* Build the copy-pasteable session name from the coord identity + the agent's
|
|
98
99
|
* description parts. Pure (no coord-state reads) so it's unit-testable; collapses
|
|
@@ -128,24 +129,23 @@ export function stampSessionNameSeen(coordRoot, instanceId, name) {
|
|
|
128
129
|
}));
|
|
129
130
|
}
|
|
130
131
|
export function releaseClaim(coordRoot, instanceId, path) {
|
|
131
|
-
|
|
132
|
-
// monorepo-relative entries; normalize both sides so release matches
|
|
133
|
-
// regardless of the form the caller passes (the old exact-string filter
|
|
134
|
-
// silently no-op'd on a form mismatch).
|
|
135
|
-
const norm = (p) => p.startsWith(`${coordRoot}/`) ? p.slice(coordRoot.length + 1) : p;
|
|
136
|
-
const target = norm(path);
|
|
132
|
+
const target = canonicalClaimPath(coordRoot, path);
|
|
137
133
|
return mutate(coordRoot, instanceId, (hb) => ({
|
|
138
134
|
...hb,
|
|
139
|
-
files_touched: (hb.files_touched ?? []).filter((
|
|
135
|
+
files_touched: (hb.files_touched ?? []).filter((candidate) => canonicalClaimPath(coordRoot, candidate) !== target),
|
|
140
136
|
}));
|
|
141
137
|
}
|
|
142
138
|
/** Materialize one V3 write-claim authority transition into the heartbeat cache. */
|
|
143
139
|
export function acquireClaim(coordRoot, instanceId, path) {
|
|
144
|
-
const
|
|
145
|
-
const target = norm(path);
|
|
140
|
+
const target = canonicalClaimPath(coordRoot, path);
|
|
146
141
|
return mutate(coordRoot, instanceId, (hb) => ({
|
|
147
142
|
...hb,
|
|
148
|
-
files_touched: [
|
|
143
|
+
files_touched: [
|
|
144
|
+
...new Set([
|
|
145
|
+
...(hb.files_touched ?? []).map((candidate) => canonicalClaimPath(coordRoot, candidate)),
|
|
146
|
+
target,
|
|
147
|
+
]),
|
|
148
|
+
].sort(),
|
|
149
149
|
}));
|
|
150
150
|
}
|
|
151
151
|
/**
|
|
@@ -172,8 +172,7 @@ export function findGroupClaims(coordRoot, groupId, path) {
|
|
|
172
172
|
const activeDir = join(coordRoot, ".harnery", "active");
|
|
173
173
|
if (!existsSync(activeDir))
|
|
174
174
|
return hits;
|
|
175
|
-
const
|
|
176
|
-
const target = norm(path);
|
|
175
|
+
const target = canonicalClaimPath(coordRoot, path);
|
|
177
176
|
for (const f of readdirSync(activeDir)) {
|
|
178
177
|
if (!f.endsWith(".json"))
|
|
179
178
|
continue;
|
|
@@ -189,8 +188,9 @@ export function findGroupClaims(coordRoot, groupId, path) {
|
|
|
189
188
|
if (peerSession !== groupId)
|
|
190
189
|
continue;
|
|
191
190
|
const files = body.files_touched ?? [];
|
|
192
|
-
if (!files.some((candidate) =>
|
|
191
|
+
if (!files.some((candidate) => canonicalClaimPath(coordRoot, candidate) === target)) {
|
|
193
192
|
continue;
|
|
193
|
+
}
|
|
194
194
|
hits.push({
|
|
195
195
|
instance_id: body.instance_id ?? f.replace(/\.json$/, ""),
|
|
196
196
|
session_id: body.session_id,
|