harnery 0.35.0 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commander.d.ts +30 -5
- package/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +124 -96
- package/dist/commands/agents.d.ts +23 -3
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +379 -198
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +10 -10
- package/dist/commands/browse-session.d.ts.map +1 -1
- package/dist/commands/browse-session.js +12 -0
- package/dist/commands/browse.d.ts +1 -1
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +5 -4
- package/dist/commands/conversations.d.ts +10 -0
- package/dist/commands/conversations.d.ts.map +1 -0
- package/dist/commands/conversations.js +201 -0
- package/dist/commands/deinit.d.ts.map +1 -1
- package/dist/commands/deinit.js +5 -0
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +13 -2
- package/dist/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +51 -7
- package/dist/commands/fetch.js +6 -5
- package/dist/commands/files.d.ts +22 -0
- package/dist/commands/files.d.ts.map +1 -0
- package/dist/commands/files.js +113 -0
- package/dist/commands/governor.js +14 -12
- package/dist/commands/inbox.d.ts +5 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +57 -0
- package/dist/commands/init.d.ts +4 -5
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +63 -13
- package/dist/commands/ledger-v3.d.ts.map +1 -1
- package/dist/commands/ledger-v3.js +347 -1
- package/dist/commands/logs.d.ts +4 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +169 -0
- package/dist/commands/messages.d.ts +5 -0
- package/dist/commands/messages.d.ts.map +1 -0
- package/dist/commands/messages.js +45 -0
- package/dist/commands/outline.d.ts +1 -1
- package/dist/commands/outline.d.ts.map +1 -1
- package/dist/commands/outline.js +2 -2
- package/dist/commands/read.d.ts +1 -1
- package/dist/commands/read.d.ts.map +1 -1
- package/dist/commands/read.js +2 -2
- package/dist/commands/semantic.d.ts.map +1 -1
- package/dist/commands/semantic.js +54 -2
- package/dist/commands/storage.d.ts +4 -0
- package/dist/commands/storage.d.ts.map +1 -0
- package/dist/commands/storage.js +238 -0
- package/dist/commands/tunnel.d.ts +5 -1
- package/dist/commands/tunnel.d.ts.map +1 -1
- package/dist/commands/tunnel.js +44 -31
- package/dist/commands/web.d.ts +3 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +67 -7
- package/dist/commands/work.js +3 -3
- package/dist/commands/workflow.js +13 -13
- package/dist/core/adapters/profiles.d.ts +1 -1
- package/dist/core/agents/cli.js +209 -39
- package/dist/core/agents/live-authority-v3.d.ts +47 -1
- package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
- package/dist/core/agents/live-authority-v3.js +244 -10
- package/dist/core/agents/live-lifecycle-v3.js +6 -1
- package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
- package/dist/core/agents/live-observation-v3.js +6 -1
- package/dist/core/agents/render/prompt-context.d.ts +9 -3
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +24 -7
- package/dist/core/agents/rules/stop-hook.d.ts +2 -0
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +94 -13
- package/dist/core/agents/rules/verdict.d.ts +1 -0
- package/dist/core/agents/rules/verdict.d.ts.map +1 -1
- package/dist/core/agents/session-events.d.ts.map +1 -1
- package/dist/core/agents/session-events.js +4 -0
- package/dist/core/agents/session-finalization-state-v3.js +1 -1
- package/dist/core/agents/session-finalizer-v3.js +5 -1
- package/dist/core/agents/state/activity-log.d.ts +3 -0
- package/dist/core/agents/state/activity-log.d.ts.map +1 -1
- package/dist/core/agents/state/activity-log.js +6 -3
- package/dist/core/agents/state/heartbeat-writer.d.ts +6 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +18 -0
- package/dist/core/agents/state/live-coordination-view.d.ts +5 -7
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +15 -90
- package/dist/core/agents/state/live-coordination-writer.d.ts +12 -0
- package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -0
- package/dist/core/agents/state/live-coordination-writer.js +92 -0
- package/dist/core/artifacts/index.d.ts +21 -0
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +46 -1
- package/dist/core/config.d.ts +62 -4
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +98 -4
- package/dist/core/conversations/archive.d.ts +49 -0
- package/dist/core/conversations/archive.d.ts.map +1 -0
- package/dist/core/conversations/archive.js +136 -0
- package/dist/core/conversations/catalog.d.ts +10 -0
- package/dist/core/conversations/catalog.d.ts.map +1 -0
- package/dist/core/conversations/catalog.js +72 -0
- package/dist/core/conversations/context-pack.d.ts +6 -0
- package/dist/core/conversations/context-pack.d.ts.map +1 -0
- package/dist/core/conversations/context-pack.js +60 -0
- package/dist/core/conversations/contract.d.ts +155 -0
- package/dist/core/conversations/contract.d.ts.map +1 -0
- package/dist/core/conversations/contract.js +1 -0
- package/dist/core/conversations/evaluation.d.ts +16 -0
- package/dist/core/conversations/evaluation.d.ts.map +1 -0
- package/dist/core/conversations/evaluation.js +9 -0
- package/dist/core/conversations/index.d.ts +10 -0
- package/dist/core/conversations/index.d.ts.map +1 -0
- package/dist/core/conversations/index.js +9 -0
- package/dist/core/conversations/lifecycle.d.ts +28 -0
- package/dist/core/conversations/lifecycle.d.ts.map +1 -0
- package/dist/core/conversations/lifecycle.js +29 -0
- package/dist/core/conversations/normalize.d.ts +14 -0
- package/dist/core/conversations/normalize.d.ts.map +1 -0
- package/dist/core/conversations/normalize.js +82 -0
- package/dist/core/conversations/query.d.ts +8 -0
- package/dist/core/conversations/query.d.ts.map +1 -0
- package/dist/core/conversations/query.js +280 -0
- package/dist/core/conversations/search-index.d.ts +9 -0
- package/dist/core/conversations/search-index.d.ts.map +1 -0
- package/dist/core/conversations/search-index.js +29 -0
- package/dist/core/events/legacy-storage/canary.d.ts +18 -0
- package/dist/core/events/legacy-storage/canary.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/canary.js +150 -0
- package/dist/core/events/legacy-storage/fence.d.ts +15 -0
- package/dist/core/events/legacy-storage/fence.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/fence.js +115 -0
- package/dist/core/events/legacy-storage/index.d.ts +6 -0
- package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/index.js +5 -0
- package/dist/core/events/legacy-storage/inventory.d.ts +10 -0
- package/dist/core/events/legacy-storage/inventory.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/inventory.js +40 -0
- package/dist/core/events/legacy-storage/manifest.d.ts +23 -0
- package/dist/core/events/legacy-storage/manifest.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/manifest.js +108 -0
- package/dist/core/events/legacy-storage/reader.d.ts +15 -0
- package/dist/core/events/legacy-storage/reader.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/reader.js +154 -0
- package/dist/core/events/v3/authority-outbox.d.ts +7 -2
- package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
- package/dist/core/events/v3/authority-outbox.js +16 -3
- package/dist/core/events/v3/base-contract.d.ts +81 -41
- package/dist/core/events/v3/base-contract.d.ts.map +1 -1
- package/dist/core/events/v3/base-contract.js +17 -7
- package/dist/core/events/v3/bootstrap.d.ts +39 -0
- package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
- package/dist/core/events/v3/bootstrap.js +167 -3
- package/dist/core/events/v3/capabilities.js +3 -3
- package/dist/core/events/v3/control-witness.d.ts +44 -0
- package/dist/core/events/v3/control-witness.d.ts.map +1 -0
- package/dist/core/events/v3/control-witness.js +233 -0
- package/dist/core/events/v3/control-writer.d.ts +4 -0
- package/dist/core/events/v3/control-writer.d.ts.map +1 -0
- package/dist/core/events/v3/control-writer.js +16 -0
- package/dist/core/events/v3/control.d.ts +8 -2
- package/dist/core/events/v3/control.d.ts.map +1 -1
- package/dist/core/events/v3/control.js +46 -18
- package/dist/core/events/v3/coordination-transaction-recovery.d.ts +42 -0
- package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -0
- package/dist/core/events/v3/coordination-transaction-recovery.js +342 -0
- package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
- package/dist/core/events/v3/coordination-view.js +16 -1
- package/dist/core/events/v3/generated.d.ts +1 -1
- package/dist/core/events/v3/generated.js +1 -1
- package/dist/core/events/v3/index.d.ts +4 -2
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +3 -1
- package/dist/core/events/v3/live-route-observer.d.ts +31 -0
- package/dist/core/events/v3/live-route-observer.d.ts.map +1 -0
- package/dist/core/events/v3/live-route-observer.js +58 -0
- package/dist/core/events/v3/live-routing.d.ts +13 -21
- package/dist/core/events/v3/live-routing.d.ts.map +1 -1
- package/dist/core/events/v3/live-routing.js +45 -41
- package/dist/core/events/v3/producers/coordination-recorder.d.ts +11 -1
- package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/coordination-recorder.js +76 -10
- package/dist/core/events/v3/producers/diagnostic-summaries.d.ts +129 -0
- package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -0
- package/dist/core/events/v3/producers/diagnostic-summaries.js +499 -0
- package/dist/core/events/v3/producers/hook-base.js +1 -1
- package/dist/core/events/v3/producers/intake.d.ts +7 -0
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
- package/dist/core/events/v3/producers/intake.js +25 -2
- package/dist/core/events/v3/producers/producer-state-observer.d.ts +8 -0
- package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -0
- package/dist/core/events/v3/producers/producer-state-observer.js +45 -0
- package/dist/core/events/v3/producers/recorder.d.ts +55 -1
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +353 -24
- package/dist/core/events/v3/reader.d.ts +51 -0
- package/dist/core/events/v3/reader.d.ts.map +1 -1
- package/dist/core/events/v3/reader.js +181 -1
- package/dist/core/events/v3/rotation-config.d.ts +9 -0
- package/dist/core/events/v3/rotation-config.d.ts.map +1 -0
- package/dist/core/events/v3/rotation-config.js +91 -0
- package/dist/core/events/v3/runtime-build.d.ts +11 -0
- package/dist/core/events/v3/runtime-build.d.ts.map +1 -0
- package/dist/core/events/v3/runtime-build.js +39 -0
- package/dist/core/events/v3/runtime-identity.d.ts +5 -0
- package/dist/core/events/v3/runtime-identity.d.ts.map +1 -0
- package/dist/core/events/v3/runtime-identity.js +18 -0
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +6 -5
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/runtime-telemetry-capabilities.js +1 -1
- package/dist/core/events/v3/support-storage/classify.d.ts +46 -0
- package/dist/core/events/v3/support-storage/classify.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/classify.js +149 -0
- package/dist/core/events/v3/support-storage/eligibility.d.ts +29 -0
- package/dist/core/events/v3/support-storage/eligibility.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/eligibility.js +35 -0
- package/dist/core/events/v3/support-storage/index.d.ts +10 -0
- package/dist/core/events/v3/support-storage/index.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/index.js +9 -0
- package/dist/core/events/v3/support-storage/inventory.d.ts +30 -0
- package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/inventory.js +94 -0
- package/dist/core/events/v3/support-storage/logical-authority.d.ts +14 -0
- package/dist/core/events/v3/support-storage/logical-authority.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/logical-authority.js +104 -0
- package/dist/core/events/v3/support-storage/maintenance.d.ts +98 -0
- package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/maintenance.js +352 -0
- package/dist/core/events/v3/support-storage/pack-contract.d.ts +59 -0
- package/dist/core/events/v3/support-storage/pack-contract.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-contract.js +249 -0
- package/dist/core/events/v3/support-storage/pack-reader.d.ts +34 -0
- package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-reader.js +258 -0
- package/dist/core/events/v3/support-storage/pack-writer.d.ts +30 -0
- package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-writer.js +268 -0
- package/dist/core/events/v3/support-storage/recovery.d.ts +15 -0
- package/dist/core/events/v3/support-storage/recovery.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/recovery.js +22 -0
- package/dist/core/events/v3/turn-telemetry.d.ts +14 -8
- package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
- package/dist/core/events/v3/turn-telemetry.js +32 -2
- package/dist/core/events/v3/writer.d.ts +13 -1
- package/dist/core/events/v3/writer.d.ts.map +1 -1
- package/dist/core/events/v3/writer.js +126 -12
- package/dist/core/governor/plan-read.d.ts.map +1 -1
- package/dist/core/governor/plan-read.js +5 -21
- package/dist/core/governor/planning.js +6 -8
- package/dist/core/governor/service-read.d.ts +12 -0
- package/dist/core/governor/service-read.d.ts.map +1 -1
- package/dist/core/governor/service-read.js +266 -2
- package/dist/core/governor/service.d.ts +1 -0
- package/dist/core/governor/service.d.ts.map +1 -1
- package/dist/core/governor/service.js +53 -18
- package/dist/core/guard/evidence-v3.d.ts.map +1 -1
- package/dist/core/guard/evidence-v3.js +2 -0
- package/dist/core/hooks/adapter/events.d.ts.map +1 -1
- package/dist/core/hooks/adapter/events.js +1 -0
- package/dist/core/hooks/adapter/output.d.ts +4 -2
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/output.js +13 -5
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts +27 -4
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -1
- package/dist/core/hooks/adapter/runtime-telemetry.js +307 -6
- package/dist/core/hooks/cli.js +212 -30
- package/dist/core/hooks/effects/image-capture.d.ts +1 -1
- package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
- package/dist/core/hooks/effects/image-capture.js +4 -2
- package/dist/core/hooks/remediation-cap.d.ts +8 -3
- package/dist/core/hooks/remediation-cap.d.ts.map +1 -1
- package/dist/core/hooks/remediation-cap.js +3 -11
- package/dist/core/hooks/resolve/coord-root.d.ts +22 -9
- package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
- package/dist/core/hooks/resolve/coord-root.js +92 -11
- package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
- package/dist/core/hooks/resolve/owner.js +5 -0
- package/dist/core/hooks/resolve/transcript.d.ts +8 -0
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
- package/dist/core/hooks/resolve/transcript.js +11 -0
- package/dist/core/inbox/contract.d.ts +64 -0
- package/dist/core/inbox/contract.d.ts.map +1 -0
- package/dist/core/inbox/contract.js +13 -0
- package/dist/core/inbox/index.d.ts +5 -0
- package/dist/core/inbox/index.d.ts.map +1 -0
- package/dist/core/inbox/index.js +4 -0
- package/dist/core/inbox/lifecycle.d.ts +22 -0
- package/dist/core/inbox/lifecycle.d.ts.map +1 -0
- package/dist/core/inbox/lifecycle.js +41 -0
- package/dist/core/inbox/service.d.ts +36 -0
- package/dist/core/inbox/service.d.ts.map +1 -0
- package/dist/core/inbox/service.js +210 -0
- package/dist/core/inbox/watcher.d.ts +7 -0
- package/dist/core/inbox/watcher.d.ts.map +1 -0
- package/dist/core/inbox/watcher.js +26 -0
- package/dist/core/presence/codec-digest.d.ts.map +1 -1
- package/dist/core/presence/codec-digest.js +14 -3
- package/dist/core/presence/relay-client.d.ts +1 -0
- package/dist/core/presence/relay-client.d.ts.map +1 -1
- package/dist/core/presence/relay-client.js +52 -8
- package/dist/core/semantic/adapters.d.ts +11 -8
- package/dist/core/semantic/adapters.d.ts.map +1 -1
- package/dist/core/semantic/adapters.js +169 -31
- package/dist/core/semantic/contract.d.ts +532 -48
- package/dist/core/semantic/contract.d.ts.map +1 -1
- package/dist/core/semantic/contract.js +104 -3
- package/dist/core/semantic/index.d.ts +7 -3
- package/dist/core/semantic/index.d.ts.map +1 -1
- package/dist/core/semantic/index.js +7 -3
- package/dist/core/semantic/once.d.ts +6 -1
- package/dist/core/semantic/once.d.ts.map +1 -1
- package/dist/core/semantic/once.js +80 -9
- package/dist/core/semantic/prompt.d.ts.map +1 -1
- package/dist/core/semantic/prompt.js +14 -1
- package/dist/core/semantic/review.d.ts +144 -0
- package/dist/core/semantic/review.d.ts.map +1 -0
- package/dist/core/semantic/review.js +544 -0
- package/dist/core/semantic/routes.d.ts +10 -0
- package/dist/core/semantic/routes.d.ts.map +1 -0
- package/dist/core/semantic/routes.js +21 -0
- package/dist/core/semantic/scheduler.d.ts +14 -3
- package/dist/core/semantic/scheduler.d.ts.map +1 -1
- package/dist/core/semantic/scheduler.js +30 -6
- package/dist/core/semantic/service-status.d.ts +20 -0
- package/dist/core/semantic/service-status.d.ts.map +1 -1
- package/dist/core/semantic/service-status.js +60 -4
- package/dist/core/semantic/service.d.ts +1 -0
- package/dist/core/semantic/service.d.ts.map +1 -1
- package/dist/core/semantic/service.js +104 -15
- package/dist/core/semantic/soak.d.ts +75 -0
- package/dist/core/semantic/soak.d.ts.map +1 -0
- package/dist/core/semantic/soak.js +476 -0
- package/dist/core/semantic/storage.d.ts +11 -1
- package/dist/core/semantic/storage.d.ts.map +1 -1
- package/dist/core/semantic/storage.js +4 -3
- package/dist/core/semantic/usage.d.ts +43 -0
- package/dist/core/semantic/usage.d.ts.map +1 -0
- package/dist/core/semantic/usage.js +193 -0
- package/dist/core/semantic/validate.d.ts +3 -1
- package/dist/core/semantic/validate.d.ts.map +1 -1
- package/dist/core/semantic/validate.js +34 -1
- package/dist/core/storage/buffer.d.ts +28 -0
- package/dist/core/storage/buffer.d.ts.map +1 -0
- package/dist/core/storage/buffer.js +101 -0
- package/dist/core/storage/builtins.d.ts +3 -0
- package/dist/core/storage/builtins.d.ts.map +1 -0
- package/dist/core/storage/builtins.js +683 -0
- package/dist/core/storage/catalog.d.ts +19 -0
- package/dist/core/storage/catalog.d.ts.map +1 -0
- package/dist/core/storage/catalog.js +365 -0
- package/dist/core/storage/config.d.ts +16 -0
- package/dist/core/storage/config.d.ts.map +1 -0
- package/dist/core/storage/config.js +311 -0
- package/dist/core/storage/contract.d.ts +275 -0
- package/dist/core/storage/contract.d.ts.map +1 -0
- package/dist/core/storage/contract.js +3 -0
- package/dist/core/storage/durable-history.d.ts +36 -0
- package/dist/core/storage/durable-history.d.ts.map +1 -0
- package/dist/core/storage/durable-history.js +606 -0
- package/dist/core/storage/health.d.ts +4 -0
- package/dist/core/storage/health.d.ts.map +1 -0
- package/dist/core/storage/health.js +65 -0
- package/dist/core/storage/index.d.ts +16 -0
- package/dist/core/storage/index.d.ts.map +1 -0
- package/dist/core/storage/index.js +15 -0
- package/dist/core/storage/inventory.d.ts +25 -0
- package/dist/core/storage/inventory.d.ts.map +1 -0
- package/dist/core/storage/inventory.js +666 -0
- package/dist/core/storage/jsonl.d.ts +52 -0
- package/dist/core/storage/jsonl.d.ts.map +1 -0
- package/dist/core/storage/jsonl.js +156 -0
- package/dist/core/storage/log-retention.d.ts +52 -0
- package/dist/core/storage/log-retention.d.ts.map +1 -0
- package/dist/core/storage/log-retention.js +419 -0
- package/dist/core/storage/logger.d.ts +82 -0
- package/dist/core/storage/logger.d.ts.map +1 -0
- package/dist/core/storage/logger.js +411 -0
- package/dist/core/storage/maintenance-providers.d.ts +26 -0
- package/dist/core/storage/maintenance-providers.d.ts.map +1 -0
- package/dist/core/storage/maintenance-providers.js +141 -0
- package/dist/core/storage/maintenance.d.ts +125 -0
- package/dist/core/storage/maintenance.d.ts.map +1 -0
- package/dist/core/storage/maintenance.js +609 -0
- package/dist/core/storage/metrics.d.ts +60 -0
- package/dist/core/storage/metrics.d.ts.map +1 -0
- package/dist/core/storage/metrics.js +134 -0
- package/dist/core/storage/policy.d.ts +7 -0
- package/dist/core/storage/policy.d.ts.map +1 -0
- package/dist/core/storage/policy.js +110 -0
- package/dist/core/storage/process-log.d.ts +38 -0
- package/dist/core/storage/process-log.d.ts.map +1 -0
- package/dist/core/storage/process-log.js +165 -0
- package/dist/core/storage/query.d.ts +34 -0
- package/dist/core/storage/query.d.ts.map +1 -0
- package/dist/core/storage/query.js +295 -0
- package/dist/core/storage/receipts.d.ts +23 -0
- package/dist/core/storage/receipts.d.ts.map +1 -0
- package/dist/core/storage/receipts.js +117 -0
- package/dist/core/storage/segments.d.ts +84 -0
- package/dist/core/storage/segments.d.ts.map +1 -0
- package/dist/core/storage/segments.js +542 -0
- package/dist/core/storage/sink-graph.d.ts +65 -0
- package/dist/core/storage/sink-graph.d.ts.map +1 -0
- package/dist/core/storage/sink-graph.js +213 -0
- package/dist/core/storage/storm-control.d.ts +23 -0
- package/dist/core/storage/storm-control.d.ts.map +1 -0
- package/dist/core/storage/storm-control.js +59 -0
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +10 -14
- package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
- package/dist/core/workflow/live-session-v3.js +2 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/lazy-commands.d.ts +26 -0
- package/dist/lazy-commands.d.ts.map +1 -0
- package/dist/lazy-commands.js +210 -0
- package/dist/lib/docs-lint.d.ts +2 -0
- package/dist/lib/docs-lint.d.ts.map +1 -1
- package/dist/lib/docs-lint.js +45 -80
- package/dist/lib/docs-metadata-audit.d.ts +3 -0
- package/dist/lib/docs-metadata-audit.d.ts.map +1 -1
- package/dist/lib/docs-metadata-audit.js +13 -23
- package/dist/lib/docs-metadata-sync.d.ts +1 -0
- package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
- package/dist/lib/docs-metadata-sync.js +28 -10
- package/dist/lib/docs-repository-view.d.ts +22 -0
- package/dist/lib/docs-repository-view.d.ts.map +1 -0
- package/dist/lib/docs-repository-view.js +185 -0
- package/dist/lib/http/client.d.ts +11 -5
- package/dist/lib/http/client.d.ts.map +1 -1
- package/dist/lib/http/client.js +22 -4
- package/dist/lib/http/index.d.ts +1 -1
- package/dist/lib/http/index.d.ts.map +1 -1
- package/dist/lib/http/index.js +1 -1
- package/dist/lib/indexer-exclusions.d.ts +27 -0
- package/dist/lib/indexer-exclusions.d.ts.map +1 -0
- package/dist/lib/indexer-exclusions.js +176 -0
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +5 -0
- package/dist/lib/local-file-url.d.ts +9 -0
- package/dist/lib/local-file-url.d.ts.map +1 -0
- package/dist/lib/local-file-url.js +20 -0
- package/dist/lib/web-performance.d.ts +118 -0
- package/dist/lib/web-performance.d.ts.map +1 -0
- package/dist/lib/web-performance.js +192 -0
- package/package.json +29 -2
- package/schemas/config.schema.json +58 -0
- package/schemas/event-v3.schema.json +324 -112
- package/src/commander.ts +462 -95
- package/src/commands/agents.ts +517 -190
- package/src/commands/backup.ts +18 -14
- package/src/commands/browse-session.ts +12 -0
- package/src/commands/browse.ts +6 -7
- package/src/commands/conversations.ts +279 -0
- package/src/commands/deinit.ts +6 -0
- package/src/commands/docs.ts +25 -6
- package/src/commands/doctor.ts +75 -9
- package/src/commands/fetch.ts +7 -6
- package/src/commands/files.ts +143 -0
- package/src/commands/governor.ts +13 -12
- package/src/commands/inbox.ts +61 -0
- package/src/commands/init.ts +78 -16
- package/src/commands/ledger-v3.ts +421 -1
- package/src/commands/logs.ts +224 -0
- package/src/commands/messages.ts +61 -0
- package/src/commands/outline.ts +6 -2
- package/src/commands/read.ts +6 -2
- package/src/commands/semantic.ts +66 -1
- package/src/commands/storage.ts +310 -0
- package/src/commands/tunnel.ts +66 -52
- package/src/commands/web.ts +77 -7
- package/src/commands/work.ts +3 -3
- package/src/commands/workflow.ts +13 -13
- package/src/core/agents/cli.ts +259 -53
- package/src/core/agents/live-authority-v3.ts +341 -10
- package/src/core/agents/live-lifecycle-v3.ts +6 -1
- package/src/core/agents/live-observation-v3.ts +6 -1
- package/src/core/agents/render/prompt-context.ts +27 -6
- package/src/core/agents/rules/stop-hook.ts +107 -16
- package/src/core/agents/rules/verdict.ts +1 -0
- package/src/core/agents/session-events.ts +4 -0
- package/src/core/agents/session-finalization-state-v3.ts +1 -1
- package/src/core/agents/session-finalizer-v3.ts +4 -1
- package/src/core/agents/state/activity-log.ts +7 -2
- package/src/core/agents/state/heartbeat-writer.ts +27 -0
- package/src/core/agents/state/live-coordination-view.ts +16 -105
- package/src/core/agents/state/live-coordination-writer.ts +141 -0
- package/src/core/artifacts/index.ts +64 -1
- package/src/core/config.ts +126 -5
- package/src/core/conversations/archive.ts +237 -0
- package/src/core/conversations/catalog.ts +79 -0
- package/src/core/conversations/context-pack.ts +72 -0
- package/src/core/conversations/contract.ts +178 -0
- package/src/core/conversations/evaluation.ts +30 -0
- package/src/core/conversations/index.ts +9 -0
- package/src/core/conversations/lifecycle.ts +63 -0
- package/src/core/conversations/normalize.ts +105 -0
- package/src/core/conversations/query.ts +318 -0
- package/src/core/conversations/search-index.ts +48 -0
- package/src/core/events/legacy-storage/canary.ts +177 -0
- package/src/core/events/legacy-storage/fence.ts +129 -0
- package/src/core/events/legacy-storage/index.ts +5 -0
- package/src/core/events/legacy-storage/inventory.ts +51 -0
- package/src/core/events/legacy-storage/manifest.ts +136 -0
- package/src/core/events/legacy-storage/reader.ts +178 -0
- package/src/core/events/v3/authority-outbox.ts +22 -1
- package/src/core/events/v3/base-contract.ts +17 -7
- package/src/core/events/v3/bootstrap.ts +195 -2
- package/src/core/events/v3/capabilities.ts +3 -3
- package/src/core/events/v3/control-witness.ts +339 -0
- package/src/core/events/v3/control-writer.ts +16 -0
- package/src/core/events/v3/control.ts +54 -18
- package/src/core/events/v3/coordination-transaction-recovery.ts +477 -0
- package/src/core/events/v3/coordination-view.ts +17 -1
- package/src/core/events/v3/generated.ts +1 -1
- package/src/core/events/v3/index.ts +5 -2
- package/src/core/events/v3/live-route-observer.ts +80 -0
- package/src/core/events/v3/live-routing.ts +64 -46
- package/src/core/events/v3/producers/coordination-recorder.ts +95 -10
- package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
- package/src/core/events/v3/producers/hook-base.ts +1 -1
- package/src/core/events/v3/producers/intake.ts +30 -2
- package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
- package/src/core/events/v3/producers/recorder.ts +571 -33
- package/src/core/events/v3/reader.ts +243 -2
- package/src/core/events/v3/rotation-config.ts +98 -0
- package/src/core/events/v3/runtime-build.ts +41 -0
- package/src/core/events/v3/runtime-identity.ts +16 -0
- package/src/core/events/v3/runtime-telemetry-capabilities.ts +14 -8
- package/src/core/events/v3/support-storage/classify.ts +209 -0
- package/src/core/events/v3/support-storage/eligibility.ts +58 -0
- package/src/core/events/v3/support-storage/index.ts +9 -0
- package/src/core/events/v3/support-storage/inventory.ts +135 -0
- package/src/core/events/v3/support-storage/logical-authority.ts +117 -0
- package/src/core/events/v3/support-storage/maintenance.ts +501 -0
- package/src/core/events/v3/support-storage/pack-contract.ts +337 -0
- package/src/core/events/v3/support-storage/pack-reader.ts +346 -0
- package/src/core/events/v3/support-storage/pack-writer.ts +352 -0
- package/src/core/events/v3/support-storage/recovery.ts +43 -0
- package/src/core/events/v3/turn-telemetry.ts +58 -7
- package/src/core/events/v3/writer.ts +168 -16
- package/src/core/governor/plan-read.ts +5 -18
- package/src/core/governor/planning.ts +5 -8
- package/src/core/governor/service-read.ts +320 -2
- package/src/core/governor/service.ts +49 -22
- package/src/core/guard/evidence-v3.ts +1 -0
- package/src/core/hooks/adapter/events.ts +1 -0
- package/src/core/hooks/adapter/output.ts +12 -5
- package/src/core/hooks/adapter/runtime-telemetry.ts +408 -13
- package/src/core/hooks/cli.ts +226 -32
- package/src/core/hooks/effects/image-capture.ts +4 -1
- package/src/core/hooks/remediation-cap.ts +12 -6
- package/src/core/hooks/resolve/coord-root.ts +91 -11
- package/src/core/hooks/resolve/owner.ts +4 -0
- package/src/core/hooks/resolve/transcript.ts +18 -0
- package/src/core/inbox/contract.ts +81 -0
- package/src/core/inbox/index.ts +4 -0
- package/src/core/inbox/lifecycle.ts +104 -0
- package/src/core/inbox/service.ts +305 -0
- package/src/core/inbox/watcher.ts +36 -0
- package/src/core/presence/codec-digest.ts +15 -9
- package/src/core/presence/relay-client.ts +55 -7
- package/src/core/semantic/adapters.ts +200 -41
- package/src/core/semantic/contract.ts +135 -3
- package/src/core/semantic/index.ts +76 -2
- package/src/core/semantic/once.ts +93 -7
- package/src/core/semantic/prompt.ts +13 -1
- package/src/core/semantic/review.ts +803 -0
- package/src/core/semantic/routes.ts +30 -0
- package/src/core/semantic/scheduler.ts +49 -5
- package/src/core/semantic/service-status.ts +99 -5
- package/src/core/semantic/service.ts +116 -15
- package/src/core/semantic/soak.ts +638 -0
- package/src/core/semantic/storage.ts +20 -6
- package/src/core/semantic/usage.ts +272 -0
- package/src/core/semantic/validate.ts +31 -0
- package/src/core/storage/buffer.ts +124 -0
- package/src/core/storage/builtins.ts +916 -0
- package/src/core/storage/catalog.ts +467 -0
- package/src/core/storage/config.ts +423 -0
- package/src/core/storage/contract.ts +342 -0
- package/src/core/storage/durable-history.ts +738 -0
- package/src/core/storage/health.ts +76 -0
- package/src/core/storage/index.ts +15 -0
- package/src/core/storage/inventory.ts +859 -0
- package/src/core/storage/jsonl.ts +213 -0
- package/src/core/storage/log-retention.ts +555 -0
- package/src/core/storage/logger.ts +546 -0
- package/src/core/storage/maintenance-providers.ts +200 -0
- package/src/core/storage/maintenance.ts +929 -0
- package/src/core/storage/metrics.ts +199 -0
- package/src/core/storage/policy.ts +141 -0
- package/src/core/storage/process-log.ts +203 -0
- package/src/core/storage/query.ts +360 -0
- package/src/core/storage/receipts.ts +162 -0
- package/src/core/storage/segments.ts +721 -0
- package/src/core/storage/sink-graph.ts +343 -0
- package/src/core/storage/storm-control.ts +91 -0
- package/src/core/work/state.ts +12 -21
- package/src/core/workflow/live-session-v3.ts +2 -4
- package/src/index.ts +2 -0
- package/src/lazy-commands.ts +294 -0
- package/src/lib/docs-lint.ts +58 -77
- package/src/lib/docs-metadata-audit.ts +26 -21
- package/src/lib/docs-metadata-sync.ts +32 -9
- package/src/lib/docs-repository-view.ts +220 -0
- package/src/lib/http/client.ts +44 -8
- package/src/lib/http/index.ts +6 -1
- package/src/lib/indexer-exclusions.ts +173 -0
- package/src/lib/instructions/templates.ts +5 -0
- package/src/lib/local-file-url.ts +31 -0
- package/src/lib/web-performance.ts +335 -0
|
@@ -17,6 +17,13 @@ export interface InitializeEventLedgerV3Result {
|
|
|
17
17
|
state: "active";
|
|
18
18
|
}>;
|
|
19
19
|
}
|
|
20
|
+
export interface RefreshIncompatibleEventLedgerV3Result {
|
|
21
|
+
state: "current" | "refreshed";
|
|
22
|
+
archived_epoch?: string;
|
|
23
|
+
control: Extract<EventV3ControlState, {
|
|
24
|
+
state: "active";
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
20
27
|
/**
|
|
21
28
|
* Ensure programmatic Harnery entry points have the same universal V3
|
|
22
29
|
* boundary as `harn init`. Only a genuinely absent control pair is created;
|
|
@@ -31,4 +38,36 @@ export declare function ensureEventLedgerV3(coordRoot: string, approvalRecordId?
|
|
|
31
38
|
* pair is published. No historical ledger bytes are rewritten or deleted.
|
|
32
39
|
*/
|
|
33
40
|
export declare function initializeEventLedgerV3(input: InitializeEventLedgerV3Input): InitializeEventLedgerV3Result;
|
|
41
|
+
/**
|
|
42
|
+
* Replace only a runtime-incompatible epoch that the current code can name
|
|
43
|
+
* exactly. Corruption and ambiguous control failures remain closed for the
|
|
44
|
+
* explicit recovery command.
|
|
45
|
+
*/
|
|
46
|
+
export declare function refreshIncompatibleEventLedgerV3(coordRoot: string): RefreshIncompatibleEventLedgerV3Result;
|
|
47
|
+
export interface RotateOversizedEventLedgerV3Result {
|
|
48
|
+
state: "rotated" | "not_oversized" | "not_active" | "disabled";
|
|
49
|
+
active_bytes: number;
|
|
50
|
+
threshold_bytes: number;
|
|
51
|
+
archived_epoch?: string;
|
|
52
|
+
control?: Extract<EventV3ControlState, {
|
|
53
|
+
state: "active";
|
|
54
|
+
}>;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Archive a valid oversized epoch intact and start a fresh one.
|
|
58
|
+
*
|
|
59
|
+
* Every canonical read validates the complete epoch, and hook producers are
|
|
60
|
+
* one-shot processes, so an unbounded active segment makes every hook's cold
|
|
61
|
+
* read scale with all history. Rotation bounds that cost: the replaced epoch
|
|
62
|
+
* (events, spool, producer states, manifests) moves whole into the V3
|
|
63
|
+
* archive, live sessions re-onboard into the new epoch on their next signal,
|
|
64
|
+
* and the writer's epoch fence keeps in-flight producers of the old epoch
|
|
65
|
+
* from ever committing into the new one. Only a currently valid, active
|
|
66
|
+
* ledger rotates; integrity failures stay closed for the explicit recovery
|
|
67
|
+
* command. The threshold comes from the isolated Event V3 config resolver
|
|
68
|
+
* unless the caller pins one; a non-positive threshold disables rotation.
|
|
69
|
+
*/
|
|
70
|
+
export declare function rotateOversizedEventLedgerV3(coordRoot: string, options?: {
|
|
71
|
+
thresholdBytes?: number;
|
|
72
|
+
}): RotateOversizedEventLedgerV3Result;
|
|
34
73
|
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/bootstrap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/bootstrap.ts"],"names":[],"mappings":"AAoBA,OAAO,EAML,KAAK,mBAAmB,EAEzB,MAAM,cAAc,CAAC;AAQtB,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,UAAU,MAAM,EAAE,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,QAAQ,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC,mBAAmB,EAAE;QAAE,KAAK,EAAE,QAAQ,CAAA;KAAE,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,sCAAsC;IACrD,KAAK,EAAE,SAAS,GAAG,WAAW,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC,mBAAmB,EAAE;QAAE,KAAK,EAAE,QAAQ,CAAA;KAAE,CAAC,CAAC;CAC5D;AAOD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,gBAAgB,SAAiC,GAChD,OAAO,CAAC,mBAAmB,EAAE;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC,CAenD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,4BAA4B,GAClC,6BAA6B,CAE/B;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,MAAM,GAChB,sCAAsC,CAgCxC;AAED,MAAM,WAAW,kCAAkC;IACjD,KAAK,EAAE,SAAS,GAAG,eAAe,GAAG,YAAY,GAAG,UAAU,CAAC;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC,mBAAmB,EAAE;QAAE,KAAK,EAAE,QAAQ,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACxC,kCAAkC,CAqDpC"}
|
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
|
-
import { chmodSync, closeSync, existsSync, fsyncSync, mkdirSync, openSync, readFileSync, renameSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { chmodSync, closeSync, existsSync, fsyncSync, mkdirSync, openSync, readFileSync, renameSync, statSync, writeFileSync, } from "node:fs";
|
|
4
|
+
import { hostname } from "node:os";
|
|
4
5
|
import { dirname, join, resolve } from "node:path";
|
|
5
6
|
import { fsyncParentDirectory } from "../../workflow/durable-record.js";
|
|
7
|
+
import { acquireNoClobberLease } from "../../workflow/workspaces/leases.js";
|
|
6
8
|
import { canonicalJsonV3, sha256V3 } from "./canonical.js";
|
|
7
9
|
import { ADAPTER_CAPABILITY_PROFILES_V3 } from "./capabilities.js";
|
|
8
|
-
import { buildActivationManifestV3, buildCandidateGenesisManifestV3, EVENT_V3_ACTIVATION_MANIFEST, EVENT_V3_GENESIS_MANIFEST, readEventV3ControlState,
|
|
10
|
+
import { buildActivationManifestV3, buildCandidateGenesisManifestV3, EVENT_V3_ACTIVATION_MANIFEST, EVENT_V3_GENESIS_MANIFEST, readEventV3ControlState, } from "./control.js";
|
|
11
|
+
import { repairEventV3ControlPair } from "./control-writer.js";
|
|
9
12
|
import { loadOrCreateFingerprintKeyStoreV3 } from "./fingerprint-keys.js";
|
|
10
13
|
import { EVENT_V3_SCHEMA_DIGEST } from "./generated.js";
|
|
11
|
-
import {
|
|
14
|
+
import { resolveEventLedgerRotateActiveBytesV3 } from "./rotation-config.js";
|
|
15
|
+
import { currentHarneryRuntimeBuild, liveEventV3BuildId, livePlatformV3 } from "./runtime-build.js";
|
|
16
|
+
import { drainReadyEventsV3 } from "./writer.js";
|
|
17
|
+
const BOOTSTRAP_LEASE_RETRIES = 12;
|
|
18
|
+
const BOOTSTRAP_LEASE_RETRY_MS = 25;
|
|
19
|
+
const BOOTSTRAP_LEASE_STALE_MS = 10_000;
|
|
20
|
+
const bootstrapSleepCell = new Int32Array(new SharedArrayBuffer(4));
|
|
12
21
|
/**
|
|
13
22
|
* Ensure programmatic Harnery entry points have the same universal V3
|
|
14
23
|
* boundary as `harn init`. Only a genuinely absent control pair is created;
|
|
@@ -37,6 +46,112 @@ export function ensureEventLedgerV3(coordRoot, approvalRecordId = "harnery-runti
|
|
|
37
46
|
* pair is published. No historical ledger bytes are rewritten or deleted.
|
|
38
47
|
*/
|
|
39
48
|
export function initializeEventLedgerV3(input) {
|
|
49
|
+
return withBootstrapLease(input.coordRoot, () => initializeEventLedgerV3Locked(input));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Replace only a runtime-incompatible epoch that the current code can name
|
|
53
|
+
* exactly. Corruption and ambiguous control failures remain closed for the
|
|
54
|
+
* explicit recovery command.
|
|
55
|
+
*/
|
|
56
|
+
export function refreshIncompatibleEventLedgerV3(coordRoot) {
|
|
57
|
+
const root = resolve(coordRoot);
|
|
58
|
+
return withBootstrapLease(root, () => {
|
|
59
|
+
const current = readEventV3ControlState(root);
|
|
60
|
+
if (current.state === "active" && runtimeCapabilityProfileCurrent(current)) {
|
|
61
|
+
return { state: "current", control: current };
|
|
62
|
+
}
|
|
63
|
+
const refreshable = (current.state === "invalid" && current.reason === "genesis_schema_digest_incompatible") ||
|
|
64
|
+
((current.state === "candidate" || current.state === "active") &&
|
|
65
|
+
!runtimeCapabilityProfileCurrent(current));
|
|
66
|
+
if (!refreshable) {
|
|
67
|
+
const reason = "reason" in current ? `${current.state}:${current.reason}` : current.state;
|
|
68
|
+
throw new Error(`event_v3_runtime_refresh_refused:${reason}`);
|
|
69
|
+
}
|
|
70
|
+
const configPath = join(root, ".harnery", "config.jsonc");
|
|
71
|
+
const initialized = initializeEventLedgerV3Locked({
|
|
72
|
+
coordRoot: root,
|
|
73
|
+
harneryBuild: currentHarneryRuntimeBuild(),
|
|
74
|
+
hostBuild: repositoryBuild(root),
|
|
75
|
+
configDigest: sha256V3(existsSync(configPath) ? readFileSync(configPath) : Buffer.from("{}\n")),
|
|
76
|
+
approvalRecordId: "harnery-runtime-v3-auto-refresh",
|
|
77
|
+
forceNewEpoch: true,
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
state: "refreshed",
|
|
81
|
+
...(initialized.archived_epoch ? { archived_epoch: initialized.archived_epoch } : {}),
|
|
82
|
+
control: initialized.control,
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Archive a valid oversized epoch intact and start a fresh one.
|
|
88
|
+
*
|
|
89
|
+
* Every canonical read validates the complete epoch, and hook producers are
|
|
90
|
+
* one-shot processes, so an unbounded active segment makes every hook's cold
|
|
91
|
+
* read scale with all history. Rotation bounds that cost: the replaced epoch
|
|
92
|
+
* (events, spool, producer states, manifests) moves whole into the V3
|
|
93
|
+
* archive, live sessions re-onboard into the new epoch on their next signal,
|
|
94
|
+
* and the writer's epoch fence keeps in-flight producers of the old epoch
|
|
95
|
+
* from ever committing into the new one. Only a currently valid, active
|
|
96
|
+
* ledger rotates; integrity failures stay closed for the explicit recovery
|
|
97
|
+
* command. The threshold comes from the isolated Event V3 config resolver
|
|
98
|
+
* unless the caller pins one; a non-positive threshold disables rotation.
|
|
99
|
+
*/
|
|
100
|
+
export function rotateOversizedEventLedgerV3(coordRoot, options = {}) {
|
|
101
|
+
const root = resolve(coordRoot);
|
|
102
|
+
const threshold = options.thresholdBytes ?? resolveEventLedgerRotateActiveBytesV3(root);
|
|
103
|
+
const activePath = join(root, ".harnery", "ledgers", "v3", "active.ndjson");
|
|
104
|
+
const measure = () => {
|
|
105
|
+
try {
|
|
106
|
+
return statSync(activePath).size;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
if (threshold <= 0) {
|
|
113
|
+
return { state: "disabled", active_bytes: measure(), threshold_bytes: threshold };
|
|
114
|
+
}
|
|
115
|
+
if (measure() < threshold) {
|
|
116
|
+
return { state: "not_oversized", active_bytes: measure(), threshold_bytes: threshold };
|
|
117
|
+
}
|
|
118
|
+
return withBootstrapLease(root, () => {
|
|
119
|
+
const activeBytes = measure();
|
|
120
|
+
if (activeBytes < threshold) {
|
|
121
|
+
return { state: "not_oversized", active_bytes: activeBytes, threshold_bytes: threshold };
|
|
122
|
+
}
|
|
123
|
+
const current = readEventV3ControlState(root);
|
|
124
|
+
if (current.state !== "active") {
|
|
125
|
+
return { state: "not_active", active_bytes: activeBytes, threshold_bytes: threshold };
|
|
126
|
+
}
|
|
127
|
+
// Flush durable ready rows into the epoch they were produced for, so the
|
|
128
|
+
// archive carries them committed instead of stranded in its spool.
|
|
129
|
+
try {
|
|
130
|
+
drainReadyEventsV3(root);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// A busy append lease only leaves rows in the archived spool; rotation
|
|
134
|
+
// itself stays safe.
|
|
135
|
+
}
|
|
136
|
+
const configPath = join(root, ".harnery", "config.jsonc");
|
|
137
|
+
const initialized = initializeEventLedgerV3Locked({
|
|
138
|
+
coordRoot: root,
|
|
139
|
+
harneryBuild: currentHarneryRuntimeBuild(),
|
|
140
|
+
hostBuild: repositoryBuild(root),
|
|
141
|
+
configDigest: sha256V3(existsSync(configPath) ? readFileSync(configPath) : Buffer.from("{}\n")),
|
|
142
|
+
approvalRecordId: "harnery-runtime-v3-size-rotation",
|
|
143
|
+
forceNewEpoch: true,
|
|
144
|
+
});
|
|
145
|
+
return {
|
|
146
|
+
state: "rotated",
|
|
147
|
+
active_bytes: activeBytes,
|
|
148
|
+
threshold_bytes: threshold,
|
|
149
|
+
...(initialized.archived_epoch ? { archived_epoch: initialized.archived_epoch } : {}),
|
|
150
|
+
control: initialized.control,
|
|
151
|
+
};
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
function initializeEventLedgerV3Locked(input) {
|
|
40
155
|
const root = resolve(input.coordRoot);
|
|
41
156
|
let current = readEventV3ControlState(root);
|
|
42
157
|
if (input.resumeCandidate && current.state === "repairable") {
|
|
@@ -100,6 +215,55 @@ export function initializeEventLedgerV3(input) {
|
|
|
100
215
|
...(archivedEpoch ? { archived_epoch: archivedEpoch } : {}),
|
|
101
216
|
};
|
|
102
217
|
}
|
|
218
|
+
function runtimeCapabilityProfileCurrent(control) {
|
|
219
|
+
const expected = Object.values(ADAPTER_CAPABILITY_PROFILES_V3).map((profile) => sha256V3(canonicalJsonV3(profile)));
|
|
220
|
+
const approved = control.genesis.profile.adapter_capability_profile_digests;
|
|
221
|
+
const expectedDigests = new Set(expected);
|
|
222
|
+
return control.state === "candidate"
|
|
223
|
+
? approved.some((digest) => expectedDigests.has(digest))
|
|
224
|
+
: expected.every((digest) => approved.includes(digest));
|
|
225
|
+
}
|
|
226
|
+
function withBootstrapLease(coordRoot, operation) {
|
|
227
|
+
const root = resolve(coordRoot);
|
|
228
|
+
const authority = createHash("sha256").update(root).digest("hex");
|
|
229
|
+
let lease;
|
|
230
|
+
for (let attempt = 0; attempt < BOOTSTRAP_LEASE_RETRIES; attempt += 1) {
|
|
231
|
+
try {
|
|
232
|
+
lease = acquireNoClobberLease({
|
|
233
|
+
path: join(root, ".harnery", "private", "event-v3-bootstrap-lease"),
|
|
234
|
+
scope: "event-v3-bootstrap",
|
|
235
|
+
authoritySha256: authority,
|
|
236
|
+
staleAfterMs: BOOTSTRAP_LEASE_STALE_MS,
|
|
237
|
+
validateStaleOwner: (owner) => owner.host === hostname() && !pidIsAlive(owner.pid),
|
|
238
|
+
});
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
if (attempt === BOOTSTRAP_LEASE_RETRIES - 1)
|
|
243
|
+
throw error;
|
|
244
|
+
Atomics.wait(bootstrapSleepCell, 0, 0, BOOTSTRAP_LEASE_RETRY_MS);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (!lease)
|
|
248
|
+
throw new Error("event_v3_bootstrap_lease_busy");
|
|
249
|
+
try {
|
|
250
|
+
return operation();
|
|
251
|
+
}
|
|
252
|
+
finally {
|
|
253
|
+
lease.release();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
function pidIsAlive(pid) {
|
|
257
|
+
if (!Number.isSafeInteger(pid) || pid < 1)
|
|
258
|
+
return false;
|
|
259
|
+
try {
|
|
260
|
+
process.kill(pid, 0);
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
return error.code !== "ESRCH";
|
|
265
|
+
}
|
|
266
|
+
}
|
|
103
267
|
function activateCandidateEpoch(root, candidate, approvalRecordId) {
|
|
104
268
|
const producer = candidate.event.producer;
|
|
105
269
|
const activation = buildActivationManifestV3({
|
|
@@ -29,7 +29,7 @@ const BASE_SIGNAL_SUPPORT = {
|
|
|
29
29
|
turn_id: "conditional",
|
|
30
30
|
permission: "native",
|
|
31
31
|
post_compaction: "native",
|
|
32
|
-
context_usage: "
|
|
32
|
+
context_usage: "conditional",
|
|
33
33
|
},
|
|
34
34
|
codex: {
|
|
35
35
|
...SHARED_SIGNAL_SUPPORT,
|
|
@@ -37,7 +37,7 @@ const BASE_SIGNAL_SUPPORT = {
|
|
|
37
37
|
turn_id: "native",
|
|
38
38
|
permission: "native",
|
|
39
39
|
post_compaction: "native",
|
|
40
|
-
context_usage: "
|
|
40
|
+
context_usage: "derived",
|
|
41
41
|
},
|
|
42
42
|
cursor: {
|
|
43
43
|
...SHARED_SIGNAL_SUPPORT,
|
|
@@ -51,7 +51,7 @@ const BASE_SIGNAL_SUPPORT = {
|
|
|
51
51
|
shell: "conditional",
|
|
52
52
|
permission: "conditional",
|
|
53
53
|
post_compaction: "unsupported",
|
|
54
|
-
context_usage: "
|
|
54
|
+
context_usage: "conditional",
|
|
55
55
|
},
|
|
56
56
|
};
|
|
57
57
|
function profile(adapter, economics) {
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ActivationManifestV3, CandidateGenesisManifestV3 } from "./control.js";
|
|
2
|
+
import { EVENT_V3_CONTROL_CHECKPOINT_RELATIVE_PATH, EVENT_V3_CONTROL_WITNESS_RELATIVE_PATH, type EventV3AppendValidationCheckpointV3, type EventV3AuthorityStorageVersionV3 } from "./reader.js";
|
|
3
|
+
export { EVENT_V3_CONTROL_CHECKPOINT_RELATIVE_PATH, EVENT_V3_CONTROL_WITNESS_RELATIVE_PATH };
|
|
4
|
+
interface EventV3ControlWitnessPayload {
|
|
5
|
+
format: "harnery-event-v3-control-witness";
|
|
6
|
+
format_version: 1;
|
|
7
|
+
genesis_id: `gex_${string}`;
|
|
8
|
+
activation_id: `act_${string}`;
|
|
9
|
+
genesis_event_id: `evt_${string}`;
|
|
10
|
+
activation_event_id: `evt_${string}`;
|
|
11
|
+
genesis_manifest_digest: `sha256:${string}`;
|
|
12
|
+
activation_manifest_digest: `sha256:${string}`;
|
|
13
|
+
candidate_manifest_digest: `sha256:${string}`;
|
|
14
|
+
privacy_key_epoch: `pep_${string}`;
|
|
15
|
+
root_id: `root_${string}`;
|
|
16
|
+
storage: EventV3AuthorityStorageVersionV3;
|
|
17
|
+
checkpoint_digest: `sha256:${string}`;
|
|
18
|
+
}
|
|
19
|
+
export interface ActiveControlWitnessBindingV3 {
|
|
20
|
+
genesis: CandidateGenesisManifestV3;
|
|
21
|
+
activation: ActivationManifestV3;
|
|
22
|
+
candidate_manifest_digest: `sha256:${string}`;
|
|
23
|
+
}
|
|
24
|
+
/** True only when one authenticated witness names this exact active control pair and storage. */
|
|
25
|
+
export declare function activeControlWitnessMatchesV3(coordRoot: string, binding: ActiveControlWitnessBindingV3): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Publish a witness only when the storage validated by the caller is still current.
|
|
28
|
+
* Failure is intentionally silent: the next read retains the canonical full-scan fallback.
|
|
29
|
+
*/
|
|
30
|
+
export declare function publishActiveControlWitnessV3(coordRoot: string, binding: ActiveControlWitnessBindingV3, validatedStorage: EventV3AuthorityStorageVersionV3, checkpoint: EventV3AppendValidationCheckpointV3): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Capture a previously authenticated witness before the append lease mutates storage.
|
|
33
|
+
* The returned payload is safe to advance only while the caller continues to hold that lease.
|
|
34
|
+
*/
|
|
35
|
+
export declare function readAdvanceableControlWitnessV3(coordRoot: string): {
|
|
36
|
+
payload: EventV3ControlWitnessPayload;
|
|
37
|
+
checkpoint: EventV3AppendValidationCheckpointV3;
|
|
38
|
+
} | undefined;
|
|
39
|
+
/** Advance a lease-held witness after durable appends without changing writer success semantics. */
|
|
40
|
+
export declare function advanceControlWitnessV3(coordRoot: string, prior: {
|
|
41
|
+
payload: EventV3ControlWitnessPayload;
|
|
42
|
+
checkpoint: EventV3AppendValidationCheckpointV3;
|
|
43
|
+
}, currentGenesisId: string | undefined): boolean;
|
|
44
|
+
//# sourceMappingURL=control-witness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-witness.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/control-witness.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAErF,OAAO,EAEL,yCAAyC,EACzC,sCAAsC,EACtC,KAAK,mCAAmC,EACxC,KAAK,gCAAgC,EAKtC,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,yCAAyC,EAAE,sCAAsC,EAAE,CAAC;AAE7F,UAAU,4BAA4B;IACpC,MAAM,EAAE,kCAAkC,CAAC;IAC3C,cAAc,EAAE,CAAC,CAAC;IAClB,UAAU,EAAE,OAAO,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,OAAO,MAAM,EAAE,CAAC;IAC/B,gBAAgB,EAAE,OAAO,MAAM,EAAE,CAAC;IAClC,mBAAmB,EAAE,OAAO,MAAM,EAAE,CAAC;IACrC,uBAAuB,EAAE,UAAU,MAAM,EAAE,CAAC;IAC5C,0BAA0B,EAAE,UAAU,MAAM,EAAE,CAAC;IAC/C,yBAAyB,EAAE,UAAU,MAAM,EAAE,CAAC;IAC9C,iBAAiB,EAAE,OAAO,MAAM,EAAE,CAAC;IACnC,OAAO,EAAE,QAAQ,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,gCAAgC,CAAC;IAC1C,iBAAiB,EAAE,UAAU,MAAM,EAAE,CAAC;CACvC;AAOD,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,0BAA0B,CAAC;IACpC,UAAU,EAAE,oBAAoB,CAAC;IACjC,yBAAyB,EAAE,UAAU,MAAM,EAAE,CAAC;CAC/C;AAED,iGAAiG;AACjG,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAYT;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,6BAA6B,EACtC,gBAAgB,EAAE,gCAAgC,EAClD,UAAU,EAAE,mCAAmC,GAC9C,OAAO,CAYT;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,MAAM,GAC7D;IACE,OAAO,EAAE,4BAA4B,CAAC;IACtC,UAAU,EAAE,mCAAmC,CAAC;CACjD,GACD,SAAS,CAYZ;AAED,oGAAoG;AACpG,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;IACL,OAAO,EAAE,4BAA4B,CAAC;IACtC,UAAU,EAAE,mCAAmC,CAAC;CACjD,EACD,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACnC,OAAO,CA0BT"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { chmodSync, closeSync, existsSync, fsyncSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { fsyncParentDirectory } from "../../workflow/durable-record.js";
|
|
4
|
+
import { canonicalJsonV3, fingerprintV3, sha256V3 } from "./canonical.js";
|
|
5
|
+
import { fingerprintContextV3 } from "./fingerprint-keys.js";
|
|
6
|
+
import { advanceEventV3AppendValidationCheckpointV3, EVENT_V3_CONTROL_CHECKPOINT_RELATIVE_PATH, EVENT_V3_CONTROL_WITNESS_RELATIVE_PATH, eventV3AuthorityStorageVersionV3, eventV3ControlCheckpointPathV3, eventV3ControlWitnessPathV3, parseEventV3AppendValidationCheckpointV3, } from "./reader.js";
|
|
7
|
+
export { EVENT_V3_CONTROL_CHECKPOINT_RELATIVE_PATH, EVENT_V3_CONTROL_WITNESS_RELATIVE_PATH };
|
|
8
|
+
/** True only when one authenticated witness names this exact active control pair and storage. */
|
|
9
|
+
export function activeControlWitnessMatchesV3(coordRoot, binding) {
|
|
10
|
+
try {
|
|
11
|
+
const before = eventV3AuthorityStorageVersionV3(coordRoot);
|
|
12
|
+
const witness = readAuthenticatedWitnessV3(coordRoot);
|
|
13
|
+
if (!witness)
|
|
14
|
+
return false;
|
|
15
|
+
const expected = witnessPayloadV3(binding, before, witness.payload.checkpoint_digest);
|
|
16
|
+
if (canonicalJsonV3(witness.payload) !== canonicalJsonV3(expected))
|
|
17
|
+
return false;
|
|
18
|
+
const after = eventV3AuthorityStorageVersionV3(coordRoot);
|
|
19
|
+
return sameStorageVersion(before, after);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Publish a witness only when the storage validated by the caller is still current.
|
|
27
|
+
* Failure is intentionally silent: the next read retains the canonical full-scan fallback.
|
|
28
|
+
*/
|
|
29
|
+
export function publishActiveControlWitnessV3(coordRoot, binding, validatedStorage, checkpoint) {
|
|
30
|
+
try {
|
|
31
|
+
const current = eventV3AuthorityStorageVersionV3(coordRoot);
|
|
32
|
+
if (!sameStorageVersion(validatedStorage, current))
|
|
33
|
+
return false;
|
|
34
|
+
return publishWitnessV3(coordRoot, witnessPayloadV3(binding, current, checkpointDigestV3(checkpoint)), checkpoint);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Capture a previously authenticated witness before the append lease mutates storage.
|
|
42
|
+
* The returned payload is safe to advance only while the caller continues to hold that lease.
|
|
43
|
+
*/
|
|
44
|
+
export function readAdvanceableControlWitnessV3(coordRoot) {
|
|
45
|
+
try {
|
|
46
|
+
const storage = eventV3AuthorityStorageVersionV3(coordRoot);
|
|
47
|
+
const witness = readAuthenticatedWitnessV3(coordRoot);
|
|
48
|
+
if (!witness || !sameStorageVersion(witness.payload.storage, storage))
|
|
49
|
+
return undefined;
|
|
50
|
+
const checkpoint = readAuthenticatedCheckpointV3(coordRoot, witness.payload.checkpoint_digest);
|
|
51
|
+
return checkpoint && checkpoint.validated_active_bytes === storage.active_bytes
|
|
52
|
+
? { payload: witness.payload, checkpoint }
|
|
53
|
+
: undefined;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Advance a lease-held witness after durable appends without changing writer success semantics. */
|
|
60
|
+
export function advanceControlWitnessV3(coordRoot, prior, currentGenesisId) {
|
|
61
|
+
try {
|
|
62
|
+
if (currentGenesisId !== prior.payload.genesis_id)
|
|
63
|
+
return false;
|
|
64
|
+
const storageBeforeValidation = eventV3AuthorityStorageVersionV3(coordRoot);
|
|
65
|
+
const checkpoint = advanceEventV3AppendValidationCheckpointV3(coordRoot, prior.checkpoint);
|
|
66
|
+
if (!checkpoint)
|
|
67
|
+
return false;
|
|
68
|
+
const storage = eventV3AuthorityStorageVersionV3(coordRoot);
|
|
69
|
+
if (storageBeforeValidation.fingerprint !== storage.fingerprint ||
|
|
70
|
+
prior.payload.storage.stable_fingerprint !== storage.stable_fingerprint ||
|
|
71
|
+
checkpoint.validated_active_bytes !== storage.active_bytes) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
return publishWitnessV3(coordRoot, {
|
|
75
|
+
...prior.payload,
|
|
76
|
+
storage,
|
|
77
|
+
checkpoint_digest: checkpointDigestV3(checkpoint),
|
|
78
|
+
}, checkpoint);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function witnessPayloadV3(binding, storage, checkpointDigest) {
|
|
85
|
+
const scope = binding.genesis.event.scope;
|
|
86
|
+
return {
|
|
87
|
+
format: "harnery-event-v3-control-witness",
|
|
88
|
+
format_version: 1,
|
|
89
|
+
genesis_id: binding.genesis.event.payload.genesis_id,
|
|
90
|
+
activation_id: binding.activation.activation_id,
|
|
91
|
+
genesis_event_id: binding.genesis.event.event_id,
|
|
92
|
+
activation_event_id: binding.activation.event.event_id,
|
|
93
|
+
genesis_manifest_digest: sha256V3(canonicalJsonV3(binding.genesis)),
|
|
94
|
+
activation_manifest_digest: sha256V3(canonicalJsonV3(binding.activation)),
|
|
95
|
+
candidate_manifest_digest: binding.candidate_manifest_digest,
|
|
96
|
+
privacy_key_epoch: binding.genesis.profile.privacy_key_epoch,
|
|
97
|
+
root_id: scope.root_id,
|
|
98
|
+
storage,
|
|
99
|
+
checkpoint_digest: checkpointDigest,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function readAuthenticatedWitnessV3(coordRoot) {
|
|
103
|
+
const path = eventV3ControlWitnessPathV3(coordRoot);
|
|
104
|
+
if (!existsSync(path))
|
|
105
|
+
return undefined;
|
|
106
|
+
const raw = readFileSync(path, "utf8");
|
|
107
|
+
const value = JSON.parse(raw);
|
|
108
|
+
const witness = parseWitnessV3(value);
|
|
109
|
+
if (`${canonicalJsonV3(witness)}\n` !== raw)
|
|
110
|
+
return undefined;
|
|
111
|
+
const expected = authenticatePayloadV3(coordRoot, witness.payload);
|
|
112
|
+
return canonicalJsonV3(witness.authentication) === canonicalJsonV3(expected)
|
|
113
|
+
? witness
|
|
114
|
+
: undefined;
|
|
115
|
+
}
|
|
116
|
+
function publishWitnessV3(coordRoot, payload, checkpoint) {
|
|
117
|
+
if (!publishCanonicalFileV3(eventV3ControlCheckpointPathV3(coordRoot), checkpoint))
|
|
118
|
+
return false;
|
|
119
|
+
const witness = {
|
|
120
|
+
payload,
|
|
121
|
+
authentication: authenticatePayloadV3(coordRoot, payload),
|
|
122
|
+
};
|
|
123
|
+
return publishCanonicalFileV3(eventV3ControlWitnessPathV3(coordRoot), witness);
|
|
124
|
+
}
|
|
125
|
+
function publishCanonicalFileV3(path, value) {
|
|
126
|
+
const temporary = `${path}.tmp-${process.pid}-${randomUUID()}`;
|
|
127
|
+
let fd;
|
|
128
|
+
try {
|
|
129
|
+
fd = openSync(temporary, "wx", 0o600);
|
|
130
|
+
writeFileSync(fd, `${canonicalJsonV3(value)}\n`, "utf8");
|
|
131
|
+
fsyncSync(fd);
|
|
132
|
+
closeSync(fd);
|
|
133
|
+
fd = undefined;
|
|
134
|
+
chmodSync(temporary, 0o600);
|
|
135
|
+
renameSync(temporary, path);
|
|
136
|
+
fsyncParentDirectory(path);
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
if (fd !== undefined)
|
|
141
|
+
closeSync(fd);
|
|
142
|
+
if (existsSync(temporary))
|
|
143
|
+
unlinkSync(temporary);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function readAuthenticatedCheckpointV3(coordRoot, expectedDigest) {
|
|
147
|
+
try {
|
|
148
|
+
const raw = readFileSync(eventV3ControlCheckpointPathV3(coordRoot), "utf8");
|
|
149
|
+
const value = JSON.parse(raw);
|
|
150
|
+
if (`${canonicalJsonV3(value)}\n` !== raw ||
|
|
151
|
+
sha256V3(canonicalJsonV3(value)) !== expectedDigest) {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
return parseEventV3AppendValidationCheckpointV3(value);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function checkpointDigestV3(checkpoint) {
|
|
161
|
+
return sha256V3(canonicalJsonV3(checkpoint));
|
|
162
|
+
}
|
|
163
|
+
function authenticatePayloadV3(coordRoot, payload) {
|
|
164
|
+
const context = fingerprintContextV3(coordRoot, payload.root_id, undefined, payload.privacy_key_epoch);
|
|
165
|
+
return fingerprintV3(context, "control-state-witness", payload, "root");
|
|
166
|
+
}
|
|
167
|
+
function parseWitnessV3(value) {
|
|
168
|
+
const envelope = object(value);
|
|
169
|
+
if (Object.keys(envelope).sort().join("\0") !== "authentication\0payload") {
|
|
170
|
+
throw new Error("control witness envelope is invalid");
|
|
171
|
+
}
|
|
172
|
+
const payload = object(envelope.payload);
|
|
173
|
+
const expectedPayloadKeys = [
|
|
174
|
+
"activation_event_id",
|
|
175
|
+
"activation_id",
|
|
176
|
+
"activation_manifest_digest",
|
|
177
|
+
"candidate_manifest_digest",
|
|
178
|
+
"checkpoint_digest",
|
|
179
|
+
"format",
|
|
180
|
+
"format_version",
|
|
181
|
+
"genesis_event_id",
|
|
182
|
+
"genesis_id",
|
|
183
|
+
"genesis_manifest_digest",
|
|
184
|
+
"privacy_key_epoch",
|
|
185
|
+
"root_id",
|
|
186
|
+
"storage",
|
|
187
|
+
];
|
|
188
|
+
if (Object.keys(payload).sort().join("\0") !== expectedPayloadKeys.sort().join("\0")) {
|
|
189
|
+
throw new Error("control witness payload shape is invalid");
|
|
190
|
+
}
|
|
191
|
+
const storage = object(payload.storage);
|
|
192
|
+
if (Object.keys(storage).sort().join("\0") !== "active_bytes\0fingerprint\0stable_fingerprint") {
|
|
193
|
+
throw new Error("control witness storage shape is invalid");
|
|
194
|
+
}
|
|
195
|
+
if (payload.format !== "harnery-event-v3-control-witness" ||
|
|
196
|
+
payload.format_version !== 1 ||
|
|
197
|
+
!token(payload.genesis_id, "gex_") ||
|
|
198
|
+
!token(payload.activation_id, "act_") ||
|
|
199
|
+
!token(payload.genesis_event_id, "evt_") ||
|
|
200
|
+
!token(payload.activation_event_id, "evt_") ||
|
|
201
|
+
!digest(payload.genesis_manifest_digest) ||
|
|
202
|
+
!digest(payload.activation_manifest_digest) ||
|
|
203
|
+
!digest(payload.candidate_manifest_digest) ||
|
|
204
|
+
!digest(payload.checkpoint_digest) ||
|
|
205
|
+
!token(payload.privacy_key_epoch, "pep_") ||
|
|
206
|
+
!token(payload.root_id, "root_") ||
|
|
207
|
+
!digest(storage.fingerprint) ||
|
|
208
|
+
!digest(storage.stable_fingerprint) ||
|
|
209
|
+
!Number.isSafeInteger(storage.active_bytes) ||
|
|
210
|
+
storage.active_bytes < 0) {
|
|
211
|
+
throw new Error("control witness payload is invalid");
|
|
212
|
+
}
|
|
213
|
+
const authentication = object(envelope.authentication);
|
|
214
|
+
return {
|
|
215
|
+
payload: payload,
|
|
216
|
+
authentication: authentication,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
function object(value) {
|
|
220
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
221
|
+
throw new Error("control witness value is not an object");
|
|
222
|
+
}
|
|
223
|
+
return value;
|
|
224
|
+
}
|
|
225
|
+
function token(value, prefix) {
|
|
226
|
+
return (typeof value === "string" && value.startsWith(prefix) && /^[a-zA-Z0-9._-]{1,160}$/.test(value));
|
|
227
|
+
}
|
|
228
|
+
function digest(value) {
|
|
229
|
+
return typeof value === "string" && /^sha256:[a-f0-9]{64}$/.test(value);
|
|
230
|
+
}
|
|
231
|
+
function sameStorageVersion(left, right) {
|
|
232
|
+
return left.fingerprint === right.fingerprint && left.active_bytes === right.active_bytes;
|
|
233
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type EventV3ControlState } from "./control.js";
|
|
2
|
+
/** Repair only a manifest-first crash by appending the exact pre-minted event. */
|
|
3
|
+
export declare function repairEventV3ControlPair(coordRoot: string): EventV3ControlState;
|
|
4
|
+
//# sourceMappingURL=control-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-writer.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/control-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAA2B,MAAM,cAAc,CAAC;AAGjF,kFAAkF;AAClF,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,CAW/E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { readEventV3ControlState } from "./control.js";
|
|
2
|
+
import { writeEventV3 } from "./writer.js";
|
|
3
|
+
/** Repair only a manifest-first crash by appending the exact pre-minted event. */
|
|
4
|
+
export function repairEventV3ControlPair(coordRoot) {
|
|
5
|
+
const control = readEventV3ControlState(coordRoot);
|
|
6
|
+
if (control.state !== "repairable")
|
|
7
|
+
return control;
|
|
8
|
+
const event = control.reason === "genesis_event_missing" ? control.genesis.event : control.activation?.event;
|
|
9
|
+
if (!event)
|
|
10
|
+
return { state: "invalid", reason: "repair_event_unavailable" };
|
|
11
|
+
const result = writeEventV3(coordRoot, event);
|
|
12
|
+
if (result.state !== "committed") {
|
|
13
|
+
return { state: "invalid", reason: "control_event_repair_not_committed" };
|
|
14
|
+
}
|
|
15
|
+
return readEventV3ControlState(coordRoot);
|
|
16
|
+
}
|
|
@@ -101,10 +101,16 @@ export declare function validateActivationManifestV3(value: unknown, candidate:
|
|
|
101
101
|
* Resolve the session/evidence gate from exact control-file and ledger-event pairs.
|
|
102
102
|
* This function never repairs or creates state. Any ambiguity keeps the gate closed.
|
|
103
103
|
*/
|
|
104
|
+
/**
|
|
105
|
+
* The live epoch's genesis id from the immutable manifest, or undefined when
|
|
106
|
+
* no valid genesis is published. This is the cheap epoch-identity read the
|
|
107
|
+
* writer fence uses: one small canonical file, never the event history.
|
|
108
|
+
*/
|
|
109
|
+
export declare function liveGenesisIdV3(coordRoot: string): `gex_${string}` | undefined;
|
|
110
|
+
/** Same read for a caller that already holds the manifest path (the writer's drain). */
|
|
111
|
+
export declare function genesisIdFromManifestV3(genesisPath: string): `gex_${string}` | undefined;
|
|
104
112
|
export declare function readEventV3ControlState(coordRoot: string): EventV3ControlState;
|
|
105
113
|
export declare function eventV3WriteGateOpen(coordRoot: string, mode: EventV3WriteMode): boolean;
|
|
106
|
-
/** Repair only a manifest-first crash by appending the exact pre-minted event. */
|
|
107
|
-
export declare function repairEventV3ControlPair(coordRoot: string): EventV3ControlState;
|
|
108
114
|
export declare function candidateProfileDigestV3(profile: CandidateProfileV3): `sha256:${string}`;
|
|
109
115
|
export declare function candidateManifestDigestV3(manifest: CandidateGenesisManifestV3): `sha256:${string}`;
|
|
110
116
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/control.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/control.ts"],"names":[],"mappings":"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"}
|