harnery 0.35.0 → 0.37.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 +128 -96
- package/dist/commands/agents.d.ts +23 -3
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +464 -242
- package/dist/commands/artifacts.d.ts.map +1 -1
- package/dist/commands/artifacts.js +26 -1
- 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 +16 -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/diagnostics.d.ts +4 -0
- package/dist/commands/diagnostics.d.ts.map +1 -0
- package/dist/commands/diagnostics.js +229 -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 +34 -0
- package/dist/commands/files.d.ts.map +1 -0
- package/dist/commands/files.js +166 -0
- package/dist/commands/governor.d.ts.map +1 -1
- package/dist/commands/governor.js +18 -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 +417 -2
- 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/qa-run.d.ts +4 -0
- package/dist/commands/qa-run.d.ts.map +1 -0
- package/dist/commands/qa-run.js +141 -0
- 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/resources.d.ts +4 -0
- package/dist/commands/resources.d.ts.map +1 -0
- package/dist/commands/resources.js +29 -0
- 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/supervisor.d.ts +4 -0
- package/dist/commands/supervisor.d.ts.map +1 -0
- package/dist/commands/supervisor.js +101 -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.d.ts.map +1 -1
- package/dist/commands/workflow.js +17 -13
- package/dist/core/adapters/profiles.d.ts +1 -1
- package/dist/core/agents/cli.js +215 -41
- package/dist/core/agents/health.d.ts +17 -0
- package/dist/core/agents/health.d.ts.map +1 -0
- package/dist/core/agents/health.js +109 -0
- 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/mailbox.d.ts +92 -0
- package/dist/core/agents/mailbox.d.ts.map +1 -0
- package/dist/core/agents/mailbox.js +325 -0
- package/dist/core/agents/reconcile-coordination-v3.d.ts +44 -0
- package/dist/core/agents/reconcile-coordination-v3.d.ts.map +1 -0
- package/dist/core/agents/reconcile-coordination-v3.js +58 -0
- package/dist/core/agents/render/prompt-context.d.ts +14 -3
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +54 -16
- package/dist/core/agents/render/session-context.d.ts +8 -0
- package/dist/core/agents/render/session-context.d.ts.map +1 -1
- package/dist/core/agents/render/session-context.js +34 -3
- package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/commit-conflict.js +50 -1
- 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 +93 -16
- 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 +9 -2
- 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 +47 -1
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +191 -6
- package/dist/core/config.d.ts +74 -4
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +141 -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/diagnostics/advice.d.ts +9 -0
- package/dist/core/diagnostics/advice.d.ts.map +1 -0
- package/dist/core/diagnostics/advice.js +112 -0
- package/dist/core/diagnostics/bundle.d.ts +35 -0
- package/dist/core/diagnostics/bundle.d.ts.map +1 -0
- package/dist/core/diagnostics/bundle.js +874 -0
- package/dist/core/diagnostics/comparison.d.ts +5 -0
- package/dist/core/diagnostics/comparison.d.ts.map +1 -0
- package/dist/core/diagnostics/comparison.js +444 -0
- package/dist/core/diagnostics/contract.d.ts +245 -0
- package/dist/core/diagnostics/contract.d.ts.map +1 -0
- package/dist/core/diagnostics/contract.js +18 -0
- package/dist/core/diagnostics/identity.d.ts +3 -0
- package/dist/core/diagnostics/identity.d.ts.map +1 -0
- package/dist/core/diagnostics/identity.js +10 -0
- package/dist/core/diagnostics/index.d.ts +8 -0
- package/dist/core/diagnostics/index.d.ts.map +1 -0
- package/dist/core/diagnostics/index.js +7 -0
- package/dist/core/diagnostics/replay.d.ts +8 -0
- package/dist/core/diagnostics/replay.d.ts.map +1 -0
- package/dist/core/diagnostics/replay.js +213 -0
- package/dist/core/diagnostics/sanitize.d.ts +9 -0
- package/dist/core/diagnostics/sanitize.d.ts.map +1 -0
- package/dist/core/diagnostics/sanitize.js +84 -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/compression.d.ts +13 -0
- package/dist/core/events/legacy-storage/compression.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/compression.js +107 -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 +7 -0
- package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/index.js +6 -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/archive-retention.d.ts +33 -0
- package/dist/core/events/v3/archive-retention.d.ts.map +1 -0
- package/dist/core/events/v3/archive-retention.js +195 -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.d.ts +1 -1
- package/dist/core/events/v3/capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/capabilities.js +4 -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 +5 -2
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +4 -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 +46 -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.d.ts +1 -1
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook-base.js +14 -3
- 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 +26 -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 +71 -1
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +441 -25
- 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 +12 -2
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/output.js +23 -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 +380 -207
- 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/health.d.ts +59 -0
- package/dist/core/hooks/health.d.ts.map +1 -0
- package/dist/core/hooks/health.js +84 -0
- 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/resources/contract.d.ts +90 -0
- package/dist/core/resources/contract.d.ts.map +1 -0
- package/dist/core/resources/contract.js +2 -0
- package/dist/core/resources/index.d.ts +6 -0
- package/dist/core/resources/index.d.ts.map +1 -0
- package/dist/core/resources/index.js +5 -0
- package/dist/core/resources/sampler.d.ts +27 -0
- package/dist/core/resources/sampler.d.ts.map +1 -0
- package/dist/core/resources/sampler.js +357 -0
- package/dist/core/resources/service-status.d.ts +3 -0
- package/dist/core/resources/service-status.d.ts.map +1 -0
- package/dist/core/resources/service-status.js +48 -0
- package/dist/core/resources/service.d.ts +26 -0
- package/dist/core/resources/service.d.ts.map +1 -0
- package/dist/core/resources/service.js +292 -0
- package/dist/core/resources/storage.d.ts +13 -0
- package/dist/core/resources/storage.d.ts.map +1 -0
- package/dist/core/resources/storage.js +30 -0
- 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/atomic-json.d.ts +3 -0
- package/dist/core/storage/atomic-json.d.ts.map +1 -0
- package/dist/core/storage/atomic-json.js +15 -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 +722 -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 +84 -0
- package/dist/core/storage/logger.d.ts.map +1 -0
- package/dist/core/storage/logger.js +413 -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 +48 -0
- package/dist/core/storage/query.d.ts.map +1 -0
- package/dist/core/storage/query.js +346 -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/supervisor/activity.d.ts +4 -0
- package/dist/core/supervisor/activity.d.ts.map +1 -0
- package/dist/core/supervisor/activity.js +141 -0
- package/dist/core/supervisor/contract.d.ts +268 -0
- package/dist/core/supervisor/contract.d.ts.map +1 -0
- package/dist/core/supervisor/contract.js +35 -0
- package/dist/core/supervisor/explanations.d.ts +4 -0
- package/dist/core/supervisor/explanations.d.ts.map +1 -0
- package/dist/core/supervisor/explanations.js +71 -0
- package/dist/core/supervisor/findings.d.ts +20 -0
- package/dist/core/supervisor/findings.d.ts.map +1 -0
- package/dist/core/supervisor/findings.js +399 -0
- package/dist/core/supervisor/history.d.ts +9 -0
- package/dist/core/supervisor/history.d.ts.map +1 -0
- package/dist/core/supervisor/history.js +46 -0
- package/dist/core/supervisor/hook-health-alerts.d.ts +14 -0
- package/dist/core/supervisor/hook-health-alerts.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health-alerts.js +70 -0
- package/dist/core/supervisor/hook-health-storage.d.ts +5 -0
- package/dist/core/supervisor/hook-health-storage.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health-storage.js +24 -0
- package/dist/core/supervisor/hook-health.d.ts +72 -0
- package/dist/core/supervisor/hook-health.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health.js +203 -0
- package/dist/core/supervisor/hooks.d.ts +10 -0
- package/dist/core/supervisor/hooks.d.ts.map +1 -0
- package/dist/core/supervisor/hooks.js +28 -0
- package/dist/core/supervisor/index.d.ts +15 -0
- package/dist/core/supervisor/index.d.ts.map +1 -0
- package/dist/core/supervisor/index.js +14 -0
- package/dist/core/supervisor/log-feed.d.ts +9 -0
- package/dist/core/supervisor/log-feed.d.ts.map +1 -0
- package/dist/core/supervisor/log-feed.js +103 -0
- package/dist/core/supervisor/service.d.ts +29 -0
- package/dist/core/supervisor/service.d.ts.map +1 -0
- package/dist/core/supervisor/service.js +450 -0
- package/dist/core/supervisor/services.d.ts +11 -0
- package/dist/core/supervisor/services.d.ts.map +1 -0
- package/dist/core/supervisor/services.js +155 -0
- package/dist/core/supervisor/status.d.ts +3 -0
- package/dist/core/supervisor/status.d.ts.map +1 -0
- package/dist/core/supervisor/status.js +48 -0
- package/dist/core/supervisor/storage.d.ts +30 -0
- package/dist/core/supervisor/storage.d.ts.map +1 -0
- package/dist/core/supervisor/storage.js +73 -0
- package/dist/core/supervisor/timeline.d.ts +3 -0
- package/dist/core/supervisor/timeline.d.ts.map +1 -0
- package/dist/core/supervisor/timeline.js +87 -0
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +10 -14
- package/dist/core/workflow/admission.d.ts +23 -0
- package/dist/core/workflow/admission.d.ts.map +1 -0
- package/dist/core/workflow/admission.js +136 -0
- package/dist/core/workflow/engine.d.ts.map +1 -1
- package/dist/core/workflow/engine.js +77 -2
- package/dist/core/workflow/index.d.ts +3 -2
- package/dist/core/workflow/index.d.ts.map +1 -1
- package/dist/core/workflow/index.js +2 -1
- package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
- package/dist/core/workflow/live-session-v3.js +2 -1
- package/dist/core/workflow/proof.d.ts +2 -1
- package/dist/core/workflow/proof.d.ts.map +1 -1
- package/dist/core/workflow/proof.js +39 -1
- package/dist/core/workflow/run-state.d.ts +3 -2
- package/dist/core/workflow/run-state.d.ts.map +1 -1
- package/dist/core/workflow/run-state.js +8 -1
- package/dist/core/workflow/types.d.ts +33 -1
- package/dist/core/workflow/types.d.ts.map +1 -1
- package/dist/core/workflow/types.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 +5 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +1 -0
- package/dist/lib/browser/index.d.ts +2 -0
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +2 -0
- package/dist/lib/browser/qa-run-contracts.d.ts +173 -0
- package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -0
- package/dist/lib/browser/qa-run-contracts.js +226 -0
- package/dist/lib/browser/qa-run.d.ts +51 -0
- package/dist/lib/browser/qa-run.d.ts.map +1 -0
- package/dist/lib/browser/qa-run.js +684 -0
- package/dist/lib/coord-root-id.d.ts +9 -0
- package/dist/lib/coord-root-id.d.ts.map +1 -0
- package/dist/lib/coord-root-id.js +17 -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 +3 -1
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +74 -3
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +11 -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 +40 -2
- package/schemas/config.schema.json +58 -0
- package/schemas/event-v3.schema.json +324 -112
- package/src/commander.ts +488 -95
- package/src/commands/agents.ts +617 -237
- package/src/commands/artifacts.ts +40 -2
- package/src/commands/backup.ts +18 -14
- package/src/commands/browse-session.ts +12 -0
- package/src/commands/browse.ts +21 -7
- package/src/commands/conversations.ts +279 -0
- package/src/commands/deinit.ts +6 -0
- package/src/commands/diagnostics.ts +271 -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 +243 -0
- package/src/commands/governor.ts +21 -12
- package/src/commands/inbox.ts +61 -0
- package/src/commands/init.ts +78 -16
- package/src/commands/ledger-v3.ts +503 -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/qa-run.ts +184 -0
- package/src/commands/read.ts +6 -2
- package/src/commands/resources.ts +38 -0
- package/src/commands/semantic.ts +66 -1
- package/src/commands/storage.ts +310 -0
- package/src/commands/supervisor.ts +141 -0
- package/src/commands/tunnel.ts +66 -52
- package/src/commands/web.ts +96 -7
- package/src/commands/work.ts +3 -3
- package/src/commands/workflow.ts +21 -13
- package/src/core/agents/cli.ts +265 -55
- package/src/core/agents/health.ts +142 -0
- 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/mailbox.ts +373 -0
- package/src/core/agents/reconcile-coordination-v3.ts +77 -0
- package/src/core/agents/render/prompt-context.ts +66 -15
- package/src/core/agents/render/session-context.ts +37 -3
- package/src/core/agents/rules/commit-conflict.ts +58 -1
- package/src/core/agents/rules/stop-hook.ts +105 -20
- 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 +8 -2
- 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 +260 -11
- package/src/core/config.ts +235 -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/diagnostics/advice.ts +147 -0
- package/src/core/diagnostics/bundle.ts +1142 -0
- package/src/core/diagnostics/comparison.ts +565 -0
- package/src/core/diagnostics/contract.ts +311 -0
- package/src/core/diagnostics/identity.ts +11 -0
- package/src/core/diagnostics/index.ts +7 -0
- package/src/core/diagnostics/replay.ts +314 -0
- package/src/core/diagnostics/sanitize.ts +97 -0
- package/src/core/events/legacy-storage/canary.ts +177 -0
- package/src/core/events/legacy-storage/compression.ts +130 -0
- package/src/core/events/legacy-storage/fence.ts +129 -0
- package/src/core/events/legacy-storage/index.ts +6 -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/archive-retention.ts +251 -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 +5 -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 +14 -2
- package/src/core/events/v3/live-route-observer.ts +80 -0
- package/src/core/events/v3/live-routing.ts +65 -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 +15 -3
- package/src/core/events/v3/producers/intake.ts +31 -2
- package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
- package/src/core/events/v3/producers/recorder.ts +681 -34
- 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 +23 -5
- package/src/core/hooks/adapter/runtime-telemetry.ts +408 -13
- package/src/core/hooks/cli.ts +404 -233
- package/src/core/hooks/effects/image-capture.ts +4 -1
- package/src/core/hooks/health.ts +146 -0
- 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/resources/contract.ts +98 -0
- package/src/core/resources/index.ts +5 -0
- package/src/core/resources/sampler.ts +458 -0
- package/src/core/resources/service-status.ts +62 -0
- package/src/core/resources/service.ts +337 -0
- package/src/core/resources/storage.ts +44 -0
- 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/atomic-json.ts +15 -0
- package/src/core/storage/buffer.ts +124 -0
- package/src/core/storage/builtins.ts +972 -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 +548 -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 +418 -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/supervisor/activity.ts +193 -0
- package/src/core/supervisor/contract.ts +312 -0
- package/src/core/supervisor/explanations.ts +104 -0
- package/src/core/supervisor/findings.ts +788 -0
- package/src/core/supervisor/history.ts +61 -0
- package/src/core/supervisor/hook-health-alerts.ts +108 -0
- package/src/core/supervisor/hook-health-storage.ts +25 -0
- package/src/core/supervisor/hook-health.ts +301 -0
- package/src/core/supervisor/hooks.ts +35 -0
- package/src/core/supervisor/index.ts +14 -0
- package/src/core/supervisor/log-feed.ts +131 -0
- package/src/core/supervisor/service.ts +511 -0
- package/src/core/supervisor/services.ts +203 -0
- package/src/core/supervisor/status.ts +59 -0
- package/src/core/supervisor/storage.ts +126 -0
- package/src/core/supervisor/timeline.ts +133 -0
- package/src/core/work/state.ts +12 -21
- package/src/core/workflow/admission.ts +215 -0
- package/src/core/workflow/engine.ts +93 -1
- package/src/core/workflow/index.ts +10 -0
- package/src/core/workflow/live-session-v3.ts +2 -4
- package/src/core/workflow/proof.ts +54 -1
- package/src/core/workflow/run-state.ts +13 -1
- package/src/core/workflow/types.ts +39 -1
- package/src/index.ts +2 -0
- package/src/lazy-commands.ts +294 -0
- package/src/lib/browser/client.ts +6 -0
- package/src/lib/browser/index.ts +29 -0
- package/src/lib/browser/qa-run-contracts.ts +380 -0
- package/src/lib/browser/qa-run.ts +784 -0
- package/src/lib/coord-root-id.ts +23 -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 +81 -2
- package/src/lib/instructions/templates.ts +11 -0
- package/src/lib/local-file-url.ts +31 -0
- package/src/lib/web-performance.ts +335 -0
|
@@ -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
|
+
}
|
|
@@ -28,8 +28,9 @@ export interface ArtifactManifestV1 {
|
|
|
28
28
|
};
|
|
29
29
|
released_at?: string;
|
|
30
30
|
released_by?: ArtifactActor;
|
|
31
|
+
oversize_acknowledged?: boolean;
|
|
31
32
|
}
|
|
32
|
-
export type ArtifactClassification = "managed-active" | "managed-current" | "managed-expired" | "managed-tracked" | "invalid-manifest" | "unmanaged" | "symlink" | "unknown";
|
|
33
|
+
export type ArtifactClassification = "managed-active" | "managed-current" | "managed-expired" | "managed-oversize" | "managed-over-budget" | "managed-tracked" | "invalid-manifest" | "unmanaged" | "symlink" | "unknown";
|
|
33
34
|
export interface ArtifactInventoryEntry {
|
|
34
35
|
name: string;
|
|
35
36
|
path: string;
|
|
@@ -44,6 +45,7 @@ export interface ArtifactInventoryEntry {
|
|
|
44
45
|
last_modified_at: string | null;
|
|
45
46
|
expires_at: string | null;
|
|
46
47
|
owner_instance_id: string | null;
|
|
48
|
+
oversize_acknowledged: boolean;
|
|
47
49
|
}
|
|
48
50
|
export interface ArtifactCreateInput {
|
|
49
51
|
slug: string;
|
|
@@ -52,11 +54,25 @@ export interface ArtifactCreateInput {
|
|
|
52
54
|
actor?: ArtifactActor;
|
|
53
55
|
now?: Date;
|
|
54
56
|
id?: string;
|
|
57
|
+
big?: boolean;
|
|
55
58
|
}
|
|
56
59
|
export interface ArtifactMutationInput {
|
|
57
60
|
actor?: ArtifactActor;
|
|
58
61
|
now?: Date;
|
|
59
62
|
}
|
|
63
|
+
export interface ArtifactAdoptionResult {
|
|
64
|
+
candidates: Array<{
|
|
65
|
+
path: string;
|
|
66
|
+
name: string;
|
|
67
|
+
bytes: number;
|
|
68
|
+
kind: "file" | "directory";
|
|
69
|
+
}>;
|
|
70
|
+
candidate_bytes: number;
|
|
71
|
+
requires_big: boolean;
|
|
72
|
+
adopted_artifact_id: string | null;
|
|
73
|
+
adopted_path: string | null;
|
|
74
|
+
adopted_directories: number;
|
|
75
|
+
}
|
|
60
76
|
export declare function artifactsRoot(repoRoot: string): string;
|
|
61
77
|
/** Public config-aware default for embedding hosts that create artifact units. */
|
|
62
78
|
export declare function configuredArtifactRetentionDays(repoRoot: string): number;
|
|
@@ -77,10 +93,40 @@ export declare function showArtifact(repoRoot: string, ref: string, opts?: {
|
|
|
77
93
|
};
|
|
78
94
|
export declare function renewArtifact(repoRoot: string, ref: string, days: number, reason: string, input?: ArtifactMutationInput): ArtifactManifestV1;
|
|
79
95
|
export declare function releaseArtifact(repoRoot: string, ref: string, input?: ArtifactMutationInput): ArtifactManifestV1;
|
|
96
|
+
/** Adopt untracked loose files and legacy directories without changing directory paths. */
|
|
97
|
+
export declare function adoptUnmanagedArtifactFiles(repoRoot: string, input: {
|
|
98
|
+
yes?: boolean;
|
|
99
|
+
big?: boolean;
|
|
100
|
+
purpose: string;
|
|
101
|
+
retentionDays: number;
|
|
102
|
+
actor?: ArtifactActor;
|
|
103
|
+
now?: Date;
|
|
104
|
+
}): ArtifactAdoptionResult;
|
|
80
105
|
export declare function cleanArtifacts(repoRoot: string, opts?: {
|
|
81
106
|
yes?: boolean;
|
|
82
107
|
now?: Date;
|
|
83
108
|
freshnessSeconds?: number;
|
|
84
109
|
}): ArtifactInventoryEntry[];
|
|
110
|
+
export interface ArtifactAutoCleanResult {
|
|
111
|
+
ran: boolean;
|
|
112
|
+
reason: "swept" | "disabled" | "fresh" | "no-root";
|
|
113
|
+
deleted: number;
|
|
114
|
+
bytes: number;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Throttled expired-artifact sweep, fired as a SessionStart effect.
|
|
118
|
+
*
|
|
119
|
+
* Retention was previously enforced only when someone remembered to run
|
|
120
|
+
* `artifacts clean --yes`, so expired workspaces accumulated indefinitely on
|
|
121
|
+
* busy hosts. This runs the exact same guarded deletion (only
|
|
122
|
+
* `managed-expired` entries, each re-classified immediately before removal;
|
|
123
|
+
* unmanaged and legacy directories are never touched) at most once per
|
|
124
|
+
* interval (default 24h), claim-first via a stamp file so concurrent session
|
|
125
|
+
* starts do not double-sweep. Disable with `artifacts.auto_clean: false` or
|
|
126
|
+
* `HARNERY_ARTIFACT_AUTO_CLEAN=0`.
|
|
127
|
+
*/
|
|
128
|
+
export declare function autoCleanArtifacts(repoRoot: string, opts?: {
|
|
129
|
+
now?: Date;
|
|
130
|
+
}): ArtifactAutoCleanResult;
|
|
85
131
|
export declare function resolveArtifactRef(repoRoot: string, ref: string): string;
|
|
86
132
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/artifacts/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/artifacts/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ import { randomUUID } from "node:crypto";
|
|
|
12
12
|
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
|
|
13
13
|
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
14
14
|
import { readLiveCoordinationRow } from "../agents/state/live-coordination-view.js";
|
|
15
|
-
import { artifactDefaultRetentionDays } from "../config.js";
|
|
15
|
+
import { artifactAutoCleanEnabled, artifactAutoCleanIntervalHours, artifactDefaultRetentionDays, artifactMaxBytes, artifactMaxUnitBytes, } from "../config.js";
|
|
16
16
|
import { ARTIFACT_MANIFEST, ARTIFACT_SCHEMA_VERSION, ARTIFACTS_DIR } from "./constants.js";
|
|
17
17
|
export { ARTIFACT_MANIFEST, ARTIFACT_SCHEMA_VERSION, ARTIFACTS_DIR } from "./constants.js";
|
|
18
18
|
export function artifactsRoot(repoRoot) {
|
|
@@ -51,6 +51,7 @@ export function createArtifact(repoRoot, input) {
|
|
|
51
51
|
retention: {
|
|
52
52
|
expires_at: addDays(now, retentionDays).toISOString(),
|
|
53
53
|
},
|
|
54
|
+
...(input.big ? { oversize_acknowledged: true } : {}),
|
|
54
55
|
};
|
|
55
56
|
atomicWriteManifest(path, manifest);
|
|
56
57
|
return { path, manifest };
|
|
@@ -75,11 +76,13 @@ export function inventoryArtifacts(repoRoot, opts = {}) {
|
|
|
75
76
|
for (const name of names) {
|
|
76
77
|
rows.push(classifyArtifactPath(repoRoot, join(root, name), now, freshnessSeconds));
|
|
77
78
|
}
|
|
78
|
-
return rows;
|
|
79
|
+
return applyArtifactBudgets(repoRoot, rows);
|
|
79
80
|
}
|
|
80
81
|
export function showArtifact(repoRoot, ref, opts = {}) {
|
|
81
82
|
const path = resolveArtifactRef(repoRoot, ref);
|
|
82
|
-
const entry =
|
|
83
|
+
const entry = inventoryArtifacts(repoRoot, opts).find((row) => row.path === path);
|
|
84
|
+
if (!entry)
|
|
85
|
+
throw new Error(`artifact "${ref}" was not found`);
|
|
83
86
|
const parsed = readManifest(path);
|
|
84
87
|
if (!parsed.ok)
|
|
85
88
|
throw new Error(parsed.reason);
|
|
@@ -122,6 +125,98 @@ export function releaseArtifact(repoRoot, ref, input = {}) {
|
|
|
122
125
|
atomicWriteManifest(path, manifest);
|
|
123
126
|
return manifest;
|
|
124
127
|
}
|
|
128
|
+
/** Adopt untracked loose files and legacy directories without changing directory paths. */
|
|
129
|
+
export function adoptUnmanagedArtifactFiles(repoRoot, input) {
|
|
130
|
+
const now = input.now ?? new Date();
|
|
131
|
+
const candidates = [];
|
|
132
|
+
for (const row of inventoryArtifacts(repoRoot, { now })) {
|
|
133
|
+
if (row.classification !== "unmanaged")
|
|
134
|
+
continue;
|
|
135
|
+
try {
|
|
136
|
+
const stat = lstatSync(row.path);
|
|
137
|
+
if (stat.isSymbolicLink() || containsTrackedPath(repoRoot, row.path))
|
|
138
|
+
continue;
|
|
139
|
+
if (stat.isFile()) {
|
|
140
|
+
candidates.push({ path: row.path, name: row.name, bytes: stat.size, kind: "file" });
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (stat.isDirectory() && !existsSync(join(row.path, ARTIFACT_MANIFEST))) {
|
|
144
|
+
const bytes = safeTreeSize(row.path);
|
|
145
|
+
if (bytes !== null && normalizeSlug(row.name)) {
|
|
146
|
+
candidates.push({ path: row.path, name: row.name, bytes, kind: "directory" });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// A racing or unreadable entry stays unmanaged.
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const candidateBytes = candidates.reduce((sum, row) => sum + row.bytes, 0);
|
|
155
|
+
const fileBytes = candidates.reduce((sum, row) => sum + (row.kind === "file" ? row.bytes : 0), 0);
|
|
156
|
+
const maxUnitBytes = artifactMaxUnitBytes(repoRoot);
|
|
157
|
+
const requiresBig = fileBytes > maxUnitBytes ||
|
|
158
|
+
candidates.some((row) => row.kind === "directory" && row.bytes > maxUnitBytes);
|
|
159
|
+
const preview = {
|
|
160
|
+
candidates,
|
|
161
|
+
candidate_bytes: candidateBytes,
|
|
162
|
+
requires_big: requiresBig,
|
|
163
|
+
adopted_artifact_id: null,
|
|
164
|
+
adopted_path: null,
|
|
165
|
+
adopted_directories: 0,
|
|
166
|
+
};
|
|
167
|
+
if (!input.yes || candidates.length === 0)
|
|
168
|
+
return preview;
|
|
169
|
+
if (requiresBig && !input.big) {
|
|
170
|
+
throw new Error("unmanaged adoption exceeds the per-bundle ceiling; repeat with --big");
|
|
171
|
+
}
|
|
172
|
+
// Revalidate every exact source before creating a destination. A changed,
|
|
173
|
+
// tracked, linked, or non-regular entry aborts the whole adoption.
|
|
174
|
+
for (const candidate of candidates) {
|
|
175
|
+
const stat = lstatSync(candidate.path);
|
|
176
|
+
const bytes = stat.isDirectory() ? safeTreeSize(candidate.path) : stat.size;
|
|
177
|
+
if (stat.isSymbolicLink() ||
|
|
178
|
+
bytes !== candidate.bytes ||
|
|
179
|
+
containsTrackedPath(repoRoot, candidate.path)) {
|
|
180
|
+
throw new Error(`unmanaged entry changed before adoption: ${candidate.name}`);
|
|
181
|
+
}
|
|
182
|
+
if (candidate.kind === "file" ? !stat.isFile() : !stat.isDirectory()) {
|
|
183
|
+
throw new Error(`unmanaged entry changed before adoption: ${candidate.name}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const files = candidates.filter((candidate) => candidate.kind === "file");
|
|
187
|
+
const created = files.length
|
|
188
|
+
? createArtifact(repoRoot, {
|
|
189
|
+
slug: "adopted-unmanaged",
|
|
190
|
+
purpose: input.purpose,
|
|
191
|
+
retentionDays: input.retentionDays,
|
|
192
|
+
actor: input.actor,
|
|
193
|
+
now,
|
|
194
|
+
big: input.big,
|
|
195
|
+
})
|
|
196
|
+
: null;
|
|
197
|
+
for (const candidate of files)
|
|
198
|
+
renameSync(candidate.path, join(created.path, candidate.name));
|
|
199
|
+
const retentionDays = positiveDays(input.retentionDays);
|
|
200
|
+
const directories = candidates.filter((candidate) => candidate.kind === "directory");
|
|
201
|
+
for (const candidate of directories) {
|
|
202
|
+
atomicWriteManifest(candidate.path, {
|
|
203
|
+
schema_version: ARTIFACT_SCHEMA_VERSION,
|
|
204
|
+
artifact_id: randomUUID(),
|
|
205
|
+
slug: normalizeSlug(candidate.name),
|
|
206
|
+
purpose: `${input.purpose}: ${candidate.name}`,
|
|
207
|
+
created_at: now.toISOString(),
|
|
208
|
+
created_by: input.actor,
|
|
209
|
+
retention: { expires_at: addDays(now, retentionDays).toISOString() },
|
|
210
|
+
...(input.big ? { oversize_acknowledged: true } : {}),
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
...preview,
|
|
215
|
+
adopted_artifact_id: created?.manifest.artifact_id ?? null,
|
|
216
|
+
adopted_path: created?.path ?? null,
|
|
217
|
+
adopted_directories: directories.length,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
125
220
|
export function cleanArtifacts(repoRoot, opts = {}) {
|
|
126
221
|
const now = opts.now ?? new Date();
|
|
127
222
|
const freshnessSeconds = opts.freshnessSeconds ?? 600;
|
|
@@ -129,13 +224,21 @@ export function cleanArtifacts(repoRoot, opts = {}) {
|
|
|
129
224
|
if (!opts.yes)
|
|
130
225
|
return rows;
|
|
131
226
|
return rows.map((entry) => {
|
|
132
|
-
if (entry.
|
|
227
|
+
if (entry.action !== "would-delete")
|
|
133
228
|
return entry;
|
|
134
229
|
// Reclassify immediately before removal. A renewal, release-state change,
|
|
135
230
|
// heartbeat, symlink swap, or tracked file added since inventory must win.
|
|
136
|
-
const current =
|
|
137
|
-
if (current
|
|
231
|
+
const current = inventoryArtifacts(repoRoot, { now, freshnessSeconds }).find((row) => row.path === entry.path);
|
|
232
|
+
if (!current) {
|
|
233
|
+
return { ...entry, classification: "unknown", reason: "entry disappeared", action: "keep" };
|
|
234
|
+
}
|
|
235
|
+
if (current.action !== "would-delete" ||
|
|
236
|
+
current.artifact_id !== entry.artifact_id ||
|
|
237
|
+
current.bytes !== entry.bytes ||
|
|
238
|
+
current.last_modified_at !== entry.last_modified_at ||
|
|
239
|
+
current.expires_at !== entry.expires_at) {
|
|
138
240
|
return current;
|
|
241
|
+
}
|
|
139
242
|
try {
|
|
140
243
|
const top = lstatSync(current.path);
|
|
141
244
|
if (!top.isDirectory() || top.isSymbolicLink()) {
|
|
@@ -159,6 +262,51 @@ export function cleanArtifacts(repoRoot, opts = {}) {
|
|
|
159
262
|
}
|
|
160
263
|
});
|
|
161
264
|
}
|
|
265
|
+
/** Sibling of the artifacts root so the stamp never appears in the inventory scan. */
|
|
266
|
+
const AUTO_CLEAN_STAMP = ".harnery/artifacts-auto-clean.json";
|
|
267
|
+
/**
|
|
268
|
+
* Throttled expired-artifact sweep, fired as a SessionStart effect.
|
|
269
|
+
*
|
|
270
|
+
* Retention was previously enforced only when someone remembered to run
|
|
271
|
+
* `artifacts clean --yes`, so expired workspaces accumulated indefinitely on
|
|
272
|
+
* busy hosts. This runs the exact same guarded deletion (only
|
|
273
|
+
* `managed-expired` entries, each re-classified immediately before removal;
|
|
274
|
+
* unmanaged and legacy directories are never touched) at most once per
|
|
275
|
+
* interval (default 24h), claim-first via a stamp file so concurrent session
|
|
276
|
+
* starts do not double-sweep. Disable with `artifacts.auto_clean: false` or
|
|
277
|
+
* `HARNERY_ARTIFACT_AUTO_CLEAN=0`.
|
|
278
|
+
*/
|
|
279
|
+
export function autoCleanArtifacts(repoRoot, opts = {}) {
|
|
280
|
+
const now = opts.now ?? new Date();
|
|
281
|
+
assertValidDate(now, "now");
|
|
282
|
+
if (!existsSync(artifactsRoot(repoRoot))) {
|
|
283
|
+
return { ran: false, reason: "no-root", deleted: 0, bytes: 0 };
|
|
284
|
+
}
|
|
285
|
+
if (!artifactAutoCleanEnabled(repoRoot)) {
|
|
286
|
+
return { ran: false, reason: "disabled", deleted: 0, bytes: 0 };
|
|
287
|
+
}
|
|
288
|
+
const stampPath = join(resolve(repoRoot), AUTO_CLEAN_STAMP);
|
|
289
|
+
const intervalMs = artifactAutoCleanIntervalHours() * 60 * 60 * 1000;
|
|
290
|
+
try {
|
|
291
|
+
const stamp = JSON.parse(readFileSync(stampPath, "utf8"));
|
|
292
|
+
const last = Date.parse(stamp.last_run_at ?? "");
|
|
293
|
+
if (Number.isFinite(last) && now.getTime() - last < intervalMs) {
|
|
294
|
+
return { ran: false, reason: "fresh", deleted: 0, bytes: 0 };
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
// Missing or unreadable stamp: sweep now and write a fresh one.
|
|
299
|
+
}
|
|
300
|
+
// Claim first: a crash mid-sweep costs one skipped interval, while claiming
|
|
301
|
+
// after would let two concurrent session starts both walk the store.
|
|
302
|
+
writeFileSync(stampPath, `${JSON.stringify({ last_run_at: now.toISOString() }, null, 2)}\n`);
|
|
303
|
+
const rows = cleanArtifacts(repoRoot, { yes: true, now });
|
|
304
|
+
const deletedRows = rows.filter((row) => row.action === "deleted");
|
|
305
|
+
const deleted = deletedRows.length;
|
|
306
|
+
const bytes = deletedRows.reduce((sum, row) => sum + (row.bytes ?? 0), 0);
|
|
307
|
+
writeFileSync(stampPath, `${JSON.stringify({ last_run_at: now.toISOString(), deleted, bytes }, null, 2)}\n`);
|
|
308
|
+
return { ran: true, reason: "swept", deleted, bytes };
|
|
309
|
+
}
|
|
162
310
|
export function resolveArtifactRef(repoRoot, ref) {
|
|
163
311
|
const root = artifactsRoot(repoRoot);
|
|
164
312
|
const candidate = isAbsolute(ref) ? resolve(ref) : resolve(root, ref);
|
|
@@ -219,6 +367,7 @@ function classifyArtifactPath(repoRoot, path, now, freshnessSeconds) {
|
|
|
219
367
|
last_modified_at: new Date(effectiveLastModifiedMs).toISOString(),
|
|
220
368
|
expires_at: effectiveExpiresAt,
|
|
221
369
|
owner_instance_id: manifest.created_by?.instance_id ?? null,
|
|
370
|
+
oversize_acknowledged: manifest.oversize_acknowledged === true,
|
|
222
371
|
});
|
|
223
372
|
if (base.bytes === null || lastModifiedMs === null) {
|
|
224
373
|
return {
|
|
@@ -264,6 +413,38 @@ function classifyArtifactPath(repoRoot, path, now, freshnessSeconds) {
|
|
|
264
413
|
action: "would-delete",
|
|
265
414
|
};
|
|
266
415
|
}
|
|
416
|
+
function applyArtifactBudgets(repoRoot, inputRows) {
|
|
417
|
+
const maxUnitBytes = artifactMaxUnitBytes(repoRoot);
|
|
418
|
+
const maxBytes = artifactMaxBytes(repoRoot);
|
|
419
|
+
const rows = inputRows.map((row) => ({ ...row }));
|
|
420
|
+
for (const row of rows) {
|
|
421
|
+
if (row.classification === "managed-current" &&
|
|
422
|
+
row.bytes !== null &&
|
|
423
|
+
row.bytes > maxUnitBytes &&
|
|
424
|
+
!row.oversize_acknowledged) {
|
|
425
|
+
row.classification = "managed-oversize";
|
|
426
|
+
row.reason = `bundle uses ${row.bytes} bytes, above the ${maxUnitBytes}-byte ceiling without --big`;
|
|
427
|
+
row.action = "would-delete";
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
const managedBytes = rows.reduce((sum, row) => sum + (row.artifact_id && row.bytes !== null ? row.bytes : 0), 0);
|
|
431
|
+
let retainedBytes = managedBytes -
|
|
432
|
+
rows.reduce((sum, row) => sum + (row.action === "would-delete" && row.bytes !== null ? row.bytes : 0), 0);
|
|
433
|
+
if (retainedBytes <= maxBytes)
|
|
434
|
+
return rows;
|
|
435
|
+
const candidates = rows
|
|
436
|
+
.filter((row) => row.classification === "managed-current" && row.action === "keep" && row.bytes !== null)
|
|
437
|
+
.sort((left, right) => `${left.expires_at ?? ""}\0${left.created_at ?? ""}\0${left.name}`.localeCompare(`${right.expires_at ?? ""}\0${right.created_at ?? ""}\0${right.name}`));
|
|
438
|
+
for (const row of candidates) {
|
|
439
|
+
if (retainedBytes <= maxBytes)
|
|
440
|
+
break;
|
|
441
|
+
row.classification = "managed-over-budget";
|
|
442
|
+
row.reason = `repository artifact budget is ${maxBytes} bytes; earliest-expiring inactive bundles are removed first`;
|
|
443
|
+
row.action = "would-delete";
|
|
444
|
+
retainedBytes -= row.bytes ?? 0;
|
|
445
|
+
}
|
|
446
|
+
return rows;
|
|
447
|
+
}
|
|
267
448
|
function readManifest(path) {
|
|
268
449
|
const manifestPath = join(path, ARTIFACT_MANIFEST);
|
|
269
450
|
if (!existsSync(manifestPath)) {
|
|
@@ -312,6 +493,9 @@ function readManifest(path) {
|
|
|
312
493
|
if (m.released_by !== undefined && !validActor(m.released_by)) {
|
|
313
494
|
return { ok: false, reason: "invalid released_by" };
|
|
314
495
|
}
|
|
496
|
+
if (m.oversize_acknowledged !== undefined && typeof m.oversize_acknowledged !== "boolean") {
|
|
497
|
+
return { ok: false, reason: "invalid oversize_acknowledged" };
|
|
498
|
+
}
|
|
315
499
|
return { ok: true, manifest: m };
|
|
316
500
|
}
|
|
317
501
|
function atomicWriteManifest(path, manifest) {
|
|
@@ -415,6 +599,7 @@ function rowFor(path, name, repoRoot, classification, reason, bytes = safeTreeSi
|
|
|
415
599
|
last_modified_at: null,
|
|
416
600
|
expires_at: null,
|
|
417
601
|
owner_instance_id: null,
|
|
602
|
+
oversize_acknowledged: false,
|
|
418
603
|
};
|
|
419
604
|
}
|
|
420
605
|
function normalizeSlug(value) {
|