harnery 0.34.1 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commander.d.ts +30 -5
- package/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +124 -94
- package/dist/commands/agents.d.ts +37 -6
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +466 -371
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +10 -10
- package/dist/commands/browse-session.d.ts.map +1 -1
- package/dist/commands/browse-session.js +12 -0
- package/dist/commands/browse.d.ts +1 -1
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +31 -6
- package/dist/commands/conversations.d.ts +10 -0
- package/dist/commands/conversations.d.ts.map +1 -0
- package/dist/commands/conversations.js +201 -0
- package/dist/commands/decision.d.ts.map +1 -1
- package/dist/commands/decision.js +2 -2
- package/dist/commands/deinit.d.ts.map +1 -1
- package/dist/commands/deinit.js +5 -0
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +13 -2
- package/dist/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +51 -7
- package/dist/commands/events.d.ts.map +1 -1
- package/dist/commands/events.js +18 -1
- package/dist/commands/fetch.js +6 -5
- package/dist/commands/files.d.ts +22 -0
- package/dist/commands/files.d.ts.map +1 -0
- package/dist/commands/files.js +113 -0
- package/dist/commands/governor.js +14 -12
- package/dist/commands/inbox.d.ts +5 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +57 -0
- package/dist/commands/init.d.ts +4 -5
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +63 -13
- package/dist/commands/ledger-v3.d.ts.map +1 -1
- package/dist/commands/ledger-v3.js +347 -1
- package/dist/commands/logs.d.ts +4 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +169 -0
- package/dist/commands/messages.d.ts +5 -0
- package/dist/commands/messages.d.ts.map +1 -0
- package/dist/commands/messages.js +45 -0
- package/dist/commands/outline.d.ts +1 -1
- package/dist/commands/outline.d.ts.map +1 -1
- package/dist/commands/outline.js +2 -2
- package/dist/commands/presence.d.ts.map +1 -1
- package/dist/commands/presence.js +2 -2
- package/dist/commands/read.d.ts +1 -1
- package/dist/commands/read.d.ts.map +1 -1
- package/dist/commands/read.js +2 -2
- package/dist/commands/semantic.d.ts +4 -0
- package/dist/commands/semantic.d.ts.map +1 -0
- package/dist/commands/semantic.js +199 -0
- package/dist/commands/storage.d.ts +4 -0
- package/dist/commands/storage.d.ts.map +1 -0
- package/dist/commands/storage.js +238 -0
- package/dist/commands/tunnel.d.ts +5 -1
- package/dist/commands/tunnel.d.ts.map +1 -1
- package/dist/commands/tunnel.js +44 -31
- package/dist/commands/web.d.ts +3 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +84 -7
- package/dist/commands/work.js +3 -3
- package/dist/commands/workflow.js +13 -13
- package/dist/core/adapters/profiles.d.ts +1 -1
- package/dist/core/agents/canonical-emit.d.ts +3 -0
- package/dist/core/agents/canonical-emit.d.ts.map +1 -1
- package/dist/core/agents/canonical-emit.js +12 -0
- package/dist/core/agents/claim-path.d.ts +11 -0
- package/dist/core/agents/claim-path.d.ts.map +1 -0
- package/dist/core/agents/claim-path.js +22 -0
- package/dist/core/agents/cli.js +209 -39
- package/dist/core/agents/coord-client.d.ts +29 -3
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/coord-client.js +88 -9
- package/dist/core/agents/live-authority-v3.d.ts +47 -1
- package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
- package/dist/core/agents/live-authority-v3.js +245 -13
- package/dist/core/agents/live-lifecycle-v3.js +9 -4
- package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
- package/dist/core/agents/live-observation-v3.js +8 -3
- package/dist/core/agents/render/prompt-context.d.ts +9 -3
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +36 -17
- package/dist/core/agents/rules/stop-hook.d.ts +2 -0
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +115 -22
- package/dist/core/agents/rules/verdict.d.ts +1 -0
- package/dist/core/agents/rules/verdict.d.ts.map +1 -1
- package/dist/core/agents/session-events.d.ts.map +1 -1
- package/dist/core/agents/session-events.js +4 -0
- package/dist/core/agents/session-finalization-state-v3.js +1 -1
- package/dist/core/agents/session-finalizer-v3.js +5 -1
- package/dist/core/agents/session-name-display.d.ts +1 -0
- package/dist/core/agents/session-name-display.d.ts.map +1 -1
- package/dist/core/agents/session-name-display.js +8 -1
- package/dist/core/agents/state/activity-log.d.ts +3 -0
- package/dist/core/agents/state/activity-log.d.ts.map +1 -1
- package/dist/core/agents/state/activity-log.js +6 -3
- package/dist/core/agents/state/heartbeat-reader.d.ts +46 -0
- package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -0
- package/dist/core/agents/state/heartbeat-reader.js +25 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts +9 -48
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +34 -34
- package/dist/core/agents/state/live-coordination-view.d.ts +6 -8
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +16 -67
- package/dist/core/agents/state/live-coordination-writer.d.ts +12 -0
- package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -0
- package/dist/core/agents/state/live-coordination-writer.js +92 -0
- package/dist/core/agents/state/names.d.ts +9 -1
- package/dist/core/agents/state/names.d.ts.map +1 -1
- package/dist/core/agents/state/names.js +190 -182
- package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
- package/dist/core/agents/state/stale-sweep.js +23 -5
- package/dist/core/artifacts/constants.d.ts +5 -0
- package/dist/core/artifacts/constants.d.ts.map +1 -0
- package/dist/core/artifacts/constants.js +4 -0
- package/dist/core/artifacts/index.d.ts +24 -3
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +96 -8
- package/dist/core/config.d.ts +62 -4
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +98 -4
- package/dist/core/conversations/archive.d.ts +49 -0
- package/dist/core/conversations/archive.d.ts.map +1 -0
- package/dist/core/conversations/archive.js +136 -0
- package/dist/core/conversations/catalog.d.ts +10 -0
- package/dist/core/conversations/catalog.d.ts.map +1 -0
- package/dist/core/conversations/catalog.js +72 -0
- package/dist/core/conversations/context-pack.d.ts +6 -0
- package/dist/core/conversations/context-pack.d.ts.map +1 -0
- package/dist/core/conversations/context-pack.js +60 -0
- package/dist/core/conversations/contract.d.ts +155 -0
- package/dist/core/conversations/contract.d.ts.map +1 -0
- package/dist/core/conversations/contract.js +1 -0
- package/dist/core/conversations/evaluation.d.ts +16 -0
- package/dist/core/conversations/evaluation.d.ts.map +1 -0
- package/dist/core/conversations/evaluation.js +9 -0
- package/dist/core/conversations/index.d.ts +10 -0
- package/dist/core/conversations/index.d.ts.map +1 -0
- package/dist/core/conversations/index.js +9 -0
- package/dist/core/conversations/lifecycle.d.ts +28 -0
- package/dist/core/conversations/lifecycle.d.ts.map +1 -0
- package/dist/core/conversations/lifecycle.js +29 -0
- package/dist/core/conversations/normalize.d.ts +14 -0
- package/dist/core/conversations/normalize.d.ts.map +1 -0
- package/dist/core/conversations/normalize.js +82 -0
- package/dist/core/conversations/query.d.ts +8 -0
- package/dist/core/conversations/query.d.ts.map +1 -0
- package/dist/core/conversations/query.js +280 -0
- package/dist/core/conversations/search-index.d.ts +9 -0
- package/dist/core/conversations/search-index.d.ts.map +1 -0
- package/dist/core/conversations/search-index.js +29 -0
- package/dist/core/events/legacy-storage/canary.d.ts +18 -0
- package/dist/core/events/legacy-storage/canary.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/canary.js +150 -0
- package/dist/core/events/legacy-storage/fence.d.ts +15 -0
- package/dist/core/events/legacy-storage/fence.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/fence.js +115 -0
- package/dist/core/events/legacy-storage/index.d.ts +6 -0
- package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/index.js +5 -0
- package/dist/core/events/legacy-storage/inventory.d.ts +10 -0
- package/dist/core/events/legacy-storage/inventory.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/inventory.js +40 -0
- package/dist/core/events/legacy-storage/manifest.d.ts +23 -0
- package/dist/core/events/legacy-storage/manifest.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/manifest.js +108 -0
- package/dist/core/events/legacy-storage/reader.d.ts +15 -0
- package/dist/core/events/legacy-storage/reader.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/reader.js +154 -0
- package/dist/core/events/v3/authority-outbox.d.ts +7 -2
- package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
- package/dist/core/events/v3/authority-outbox.js +16 -3
- package/dist/core/events/v3/base-contract.d.ts +851 -16
- package/dist/core/events/v3/base-contract.d.ts.map +1 -1
- package/dist/core/events/v3/base-contract.js +50 -7
- package/dist/core/events/v3/bootstrap.d.ts +39 -0
- package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
- package/dist/core/events/v3/bootstrap.js +167 -3
- package/dist/core/events/v3/capabilities.d.ts +11 -0
- package/dist/core/events/v3/capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/capabilities.js +26 -3
- package/dist/core/events/v3/control-witness.d.ts +44 -0
- package/dist/core/events/v3/control-witness.d.ts.map +1 -0
- package/dist/core/events/v3/control-witness.js +233 -0
- package/dist/core/events/v3/control-writer.d.ts +4 -0
- package/dist/core/events/v3/control-writer.d.ts.map +1 -0
- package/dist/core/events/v3/control-writer.js +16 -0
- package/dist/core/events/v3/control.d.ts +8 -2
- package/dist/core/events/v3/control.d.ts.map +1 -1
- package/dist/core/events/v3/control.js +46 -18
- package/dist/core/events/v3/coordination-transaction-recovery.d.ts +42 -0
- package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -0
- package/dist/core/events/v3/coordination-transaction-recovery.js +342 -0
- package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
- package/dist/core/events/v3/coordination-view.js +16 -1
- package/dist/core/events/v3/generated.d.ts +1 -1
- package/dist/core/events/v3/generated.js +1 -1
- package/dist/core/events/v3/index.d.ts +8 -5
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +7 -4
- package/dist/core/events/v3/latency.d.ts +31 -1
- package/dist/core/events/v3/latency.d.ts.map +1 -1
- package/dist/core/events/v3/latency.js +127 -3
- package/dist/core/events/v3/live-route-observer.d.ts +31 -0
- package/dist/core/events/v3/live-route-observer.d.ts.map +1 -0
- package/dist/core/events/v3/live-route-observer.js +58 -0
- package/dist/core/events/v3/live-routing.d.ts +42 -20
- package/dist/core/events/v3/live-routing.d.ts.map +1 -1
- package/dist/core/events/v3/live-routing.js +153 -41
- package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/command-recorder.js +10 -1
- package/dist/core/events/v3/producers/coordination-recorder.d.ts +11 -1
- package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/coordination-recorder.js +90 -13
- package/dist/core/events/v3/producers/diagnostic-summaries.d.ts +129 -0
- package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -0
- package/dist/core/events/v3/producers/diagnostic-summaries.js +499 -0
- package/dist/core/events/v3/producers/hook-base.d.ts +17 -1
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook-base.js +83 -2
- package/dist/core/events/v3/producers/intake.d.ts +13 -0
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
- package/dist/core/events/v3/producers/intake.js +36 -2
- package/dist/core/events/v3/producers/producer-state-observer.d.ts +8 -0
- package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -0
- package/dist/core/events/v3/producers/producer-state-observer.js +45 -0
- package/dist/core/events/v3/producers/recorder.d.ts +117 -1
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +992 -27
- package/dist/core/events/v3/reader.d.ts +51 -0
- package/dist/core/events/v3/reader.d.ts.map +1 -1
- package/dist/core/events/v3/reader.js +181 -1
- package/dist/core/events/v3/rotation-config.d.ts +9 -0
- package/dist/core/events/v3/rotation-config.d.ts.map +1 -0
- package/dist/core/events/v3/rotation-config.js +91 -0
- package/dist/core/events/v3/runtime-build.d.ts +11 -0
- package/dist/core/events/v3/runtime-build.d.ts.map +1 -0
- package/dist/core/events/v3/runtime-build.js +39 -0
- package/dist/core/events/v3/runtime-identity.d.ts +5 -0
- package/dist/core/events/v3/runtime-identity.d.ts.map +1 -0
- package/dist/core/events/v3/runtime-identity.js +18 -0
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +52 -0
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -0
- package/dist/core/events/v3/runtime-telemetry-capabilities.js +54 -0
- package/dist/core/events/v3/support-storage/classify.d.ts +46 -0
- package/dist/core/events/v3/support-storage/classify.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/classify.js +149 -0
- package/dist/core/events/v3/support-storage/eligibility.d.ts +29 -0
- package/dist/core/events/v3/support-storage/eligibility.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/eligibility.js +35 -0
- package/dist/core/events/v3/support-storage/index.d.ts +10 -0
- package/dist/core/events/v3/support-storage/index.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/index.js +9 -0
- package/dist/core/events/v3/support-storage/inventory.d.ts +30 -0
- package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/inventory.js +94 -0
- package/dist/core/events/v3/support-storage/logical-authority.d.ts +14 -0
- package/dist/core/events/v3/support-storage/logical-authority.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/logical-authority.js +104 -0
- package/dist/core/events/v3/support-storage/maintenance.d.ts +98 -0
- package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/maintenance.js +352 -0
- package/dist/core/events/v3/support-storage/pack-contract.d.ts +59 -0
- package/dist/core/events/v3/support-storage/pack-contract.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-contract.js +249 -0
- package/dist/core/events/v3/support-storage/pack-reader.d.ts +34 -0
- package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-reader.js +258 -0
- package/dist/core/events/v3/support-storage/pack-writer.d.ts +30 -0
- package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-writer.js +268 -0
- package/dist/core/events/v3/support-storage/recovery.d.ts +15 -0
- package/dist/core/events/v3/support-storage/recovery.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/recovery.js +22 -0
- package/dist/core/events/v3/turn-telemetry.d.ts +21 -6
- package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
- package/dist/core/events/v3/turn-telemetry.js +32 -2
- package/dist/core/events/v3/writer.d.ts +13 -1
- package/dist/core/events/v3/writer.d.ts.map +1 -1
- package/dist/core/events/v3/writer.js +126 -12
- package/dist/core/governor/plan-read.d.ts.map +1 -1
- package/dist/core/governor/plan-read.js +5 -21
- package/dist/core/governor/planning.js +6 -8
- package/dist/core/governor/service-read.d.ts +12 -0
- package/dist/core/governor/service-read.d.ts.map +1 -1
- package/dist/core/governor/service-read.js +266 -2
- package/dist/core/governor/service.d.ts +1 -0
- package/dist/core/governor/service.d.ts.map +1 -1
- package/dist/core/governor/service.js +53 -18
- package/dist/core/guard/evidence-v3.d.ts.map +1 -1
- package/dist/core/guard/evidence-v3.js +2 -0
- package/dist/core/hooks/adapter/events.d.ts.map +1 -1
- package/dist/core/hooks/adapter/events.js +1 -0
- package/dist/core/hooks/adapter/output.d.ts +4 -2
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/output.js +13 -5
- package/dist/core/hooks/adapter/parse.d.ts +3 -0
- package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
- package/dist/core/hooks/adapter/parse.js +14 -0
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts +142 -0
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -0
- package/dist/core/hooks/adapter/runtime-telemetry.js +869 -0
- package/dist/core/hooks/cli.js +318 -61
- package/dist/core/hooks/effects/image-capture.d.ts +1 -1
- package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
- package/dist/core/hooks/effects/image-capture.js +4 -2
- package/dist/core/hooks/remediation-cap.d.ts +39 -0
- package/dist/core/hooks/remediation-cap.d.ts.map +1 -0
- package/dist/core/hooks/remediation-cap.js +63 -0
- package/dist/core/hooks/resolve/coord-root.d.ts +22 -9
- package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
- package/dist/core/hooks/resolve/coord-root.js +92 -11
- package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
- package/dist/core/hooks/resolve/owner.js +5 -0
- package/dist/core/hooks/resolve/transcript.d.ts +33 -9
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
- package/dist/core/hooks/resolve/transcript.js +33 -10
- package/dist/core/inbox/contract.d.ts +64 -0
- package/dist/core/inbox/contract.d.ts.map +1 -0
- package/dist/core/inbox/contract.js +13 -0
- package/dist/core/inbox/index.d.ts +5 -0
- package/dist/core/inbox/index.d.ts.map +1 -0
- package/dist/core/inbox/index.js +4 -0
- package/dist/core/inbox/lifecycle.d.ts +22 -0
- package/dist/core/inbox/lifecycle.d.ts.map +1 -0
- package/dist/core/inbox/lifecycle.js +41 -0
- package/dist/core/inbox/service.d.ts +36 -0
- package/dist/core/inbox/service.d.ts.map +1 -0
- package/dist/core/inbox/service.js +210 -0
- package/dist/core/inbox/watcher.d.ts +7 -0
- package/dist/core/inbox/watcher.d.ts.map +1 -0
- package/dist/core/inbox/watcher.js +26 -0
- package/dist/core/presence/codec-digest.d.ts.map +1 -1
- package/dist/core/presence/codec-digest.js +14 -3
- package/dist/core/presence/relay-client.d.ts +1 -0
- package/dist/core/presence/relay-client.d.ts.map +1 -1
- package/dist/core/presence/relay-client.js +52 -8
- package/dist/core/semantic/adapters.d.ts +37 -0
- package/dist/core/semantic/adapters.d.ts.map +1 -0
- package/dist/core/semantic/adapters.js +360 -0
- package/dist/core/semantic/contract.d.ts +1072 -0
- package/dist/core/semantic/contract.d.ts.map +1 -0
- package/dist/core/semantic/contract.js +331 -0
- package/dist/core/semantic/evidence.d.ts +11 -0
- package/dist/core/semantic/evidence.d.ts.map +1 -0
- package/dist/core/semantic/evidence.js +262 -0
- package/dist/core/semantic/index.d.ts +14 -0
- package/dist/core/semantic/index.d.ts.map +1 -0
- package/dist/core/semantic/index.js +13 -0
- package/dist/core/semantic/once.d.ts +38 -0
- package/dist/core/semantic/once.d.ts.map +1 -0
- package/dist/core/semantic/once.js +364 -0
- package/dist/core/semantic/prompt.d.ts +12 -0
- package/dist/core/semantic/prompt.d.ts.map +1 -0
- package/dist/core/semantic/prompt.js +83 -0
- package/dist/core/semantic/review.d.ts +144 -0
- package/dist/core/semantic/review.d.ts.map +1 -0
- package/dist/core/semantic/review.js +544 -0
- package/dist/core/semantic/routes.d.ts +10 -0
- package/dist/core/semantic/routes.d.ts.map +1 -0
- package/dist/core/semantic/routes.js +21 -0
- package/dist/core/semantic/scheduler.d.ts +27 -0
- package/dist/core/semantic/scheduler.d.ts.map +1 -0
- package/dist/core/semantic/scheduler.js +91 -0
- package/dist/core/semantic/service-status.d.ts +51 -0
- package/dist/core/semantic/service-status.d.ts.map +1 -0
- package/dist/core/semantic/service-status.js +140 -0
- package/dist/core/semantic/service.d.ts +52 -0
- package/dist/core/semantic/service.d.ts.map +1 -0
- package/dist/core/semantic/service.js +559 -0
- package/dist/core/semantic/soak.d.ts +75 -0
- package/dist/core/semantic/soak.d.ts.map +1 -0
- package/dist/core/semantic/soak.js +476 -0
- package/dist/core/semantic/storage.d.ts +81 -0
- package/dist/core/semantic/storage.d.ts.map +1 -0
- package/dist/core/semantic/storage.js +180 -0
- package/dist/core/semantic/usage.d.ts +43 -0
- package/dist/core/semantic/usage.d.ts.map +1 -0
- package/dist/core/semantic/usage.js +193 -0
- package/dist/core/semantic/validate.d.ts +18 -0
- package/dist/core/semantic/validate.d.ts.map +1 -0
- package/dist/core/semantic/validate.js +207 -0
- package/dist/core/storage/buffer.d.ts +28 -0
- package/dist/core/storage/buffer.d.ts.map +1 -0
- package/dist/core/storage/buffer.js +101 -0
- package/dist/core/storage/builtins.d.ts +3 -0
- package/dist/core/storage/builtins.d.ts.map +1 -0
- package/dist/core/storage/builtins.js +683 -0
- package/dist/core/storage/catalog.d.ts +19 -0
- package/dist/core/storage/catalog.d.ts.map +1 -0
- package/dist/core/storage/catalog.js +365 -0
- package/dist/core/storage/config.d.ts +16 -0
- package/dist/core/storage/config.d.ts.map +1 -0
- package/dist/core/storage/config.js +311 -0
- package/dist/core/storage/contract.d.ts +275 -0
- package/dist/core/storage/contract.d.ts.map +1 -0
- package/dist/core/storage/contract.js +3 -0
- package/dist/core/storage/durable-history.d.ts +36 -0
- package/dist/core/storage/durable-history.d.ts.map +1 -0
- package/dist/core/storage/durable-history.js +606 -0
- package/dist/core/storage/health.d.ts +4 -0
- package/dist/core/storage/health.d.ts.map +1 -0
- package/dist/core/storage/health.js +65 -0
- package/dist/core/storage/index.d.ts +16 -0
- package/dist/core/storage/index.d.ts.map +1 -0
- package/dist/core/storage/index.js +15 -0
- package/dist/core/storage/inventory.d.ts +25 -0
- package/dist/core/storage/inventory.d.ts.map +1 -0
- package/dist/core/storage/inventory.js +666 -0
- package/dist/core/storage/jsonl.d.ts +52 -0
- package/dist/core/storage/jsonl.d.ts.map +1 -0
- package/dist/core/storage/jsonl.js +156 -0
- package/dist/core/storage/log-retention.d.ts +52 -0
- package/dist/core/storage/log-retention.d.ts.map +1 -0
- package/dist/core/storage/log-retention.js +419 -0
- package/dist/core/storage/logger.d.ts +82 -0
- package/dist/core/storage/logger.d.ts.map +1 -0
- package/dist/core/storage/logger.js +411 -0
- package/dist/core/storage/maintenance-providers.d.ts +26 -0
- package/dist/core/storage/maintenance-providers.d.ts.map +1 -0
- package/dist/core/storage/maintenance-providers.js +141 -0
- package/dist/core/storage/maintenance.d.ts +125 -0
- package/dist/core/storage/maintenance.d.ts.map +1 -0
- package/dist/core/storage/maintenance.js +609 -0
- package/dist/core/storage/metrics.d.ts +60 -0
- package/dist/core/storage/metrics.d.ts.map +1 -0
- package/dist/core/storage/metrics.js +134 -0
- package/dist/core/storage/policy.d.ts +7 -0
- package/dist/core/storage/policy.d.ts.map +1 -0
- package/dist/core/storage/policy.js +110 -0
- package/dist/core/storage/process-log.d.ts +38 -0
- package/dist/core/storage/process-log.d.ts.map +1 -0
- package/dist/core/storage/process-log.js +165 -0
- package/dist/core/storage/query.d.ts +34 -0
- package/dist/core/storage/query.d.ts.map +1 -0
- package/dist/core/storage/query.js +295 -0
- package/dist/core/storage/receipts.d.ts +23 -0
- package/dist/core/storage/receipts.d.ts.map +1 -0
- package/dist/core/storage/receipts.js +117 -0
- package/dist/core/storage/segments.d.ts +84 -0
- package/dist/core/storage/segments.d.ts.map +1 -0
- package/dist/core/storage/segments.js +542 -0
- package/dist/core/storage/sink-graph.d.ts +65 -0
- package/dist/core/storage/sink-graph.d.ts.map +1 -0
- package/dist/core/storage/sink-graph.js +213 -0
- package/dist/core/storage/storm-control.d.ts +23 -0
- package/dist/core/storage/storm-control.d.ts.map +1 -0
- package/dist/core/storage/storm-control.js +59 -0
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +10 -14
- package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
- package/dist/core/workflow/live-session-v3.js +2 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/lazy-commands.d.ts +26 -0
- package/dist/lazy-commands.d.ts.map +1 -0
- package/dist/lazy-commands.js +210 -0
- package/dist/lib/browser/client.d.ts +11 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +13 -0
- package/dist/lib/browser/index.d.ts +1 -0
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/standalone-html.d.ts +25 -0
- package/dist/lib/browser/standalone-html.d.ts.map +1 -0
- package/dist/lib/browser/standalone-html.js +284 -0
- package/dist/lib/docs-lint.d.ts +2 -0
- package/dist/lib/docs-lint.d.ts.map +1 -1
- package/dist/lib/docs-lint.js +45 -80
- package/dist/lib/docs-metadata-audit.d.ts +3 -0
- package/dist/lib/docs-metadata-audit.d.ts.map +1 -1
- package/dist/lib/docs-metadata-audit.js +13 -23
- package/dist/lib/docs-metadata-sync.d.ts +1 -0
- package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
- package/dist/lib/docs-metadata-sync.js +28 -10
- package/dist/lib/docs-repository-view.d.ts +22 -0
- package/dist/lib/docs-repository-view.d.ts.map +1 -0
- package/dist/lib/docs-repository-view.js +185 -0
- package/dist/lib/http/client.d.ts +11 -5
- package/dist/lib/http/client.d.ts.map +1 -1
- package/dist/lib/http/client.js +22 -4
- package/dist/lib/http/index.d.ts +1 -1
- package/dist/lib/http/index.d.ts.map +1 -1
- package/dist/lib/http/index.js +1 -1
- package/dist/lib/indexer-exclusions.d.ts +27 -0
- package/dist/lib/indexer-exclusions.d.ts.map +1 -0
- package/dist/lib/indexer-exclusions.js +176 -0
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +1 -0
- package/dist/lib/instructions/templates.d.ts +2 -0
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +149 -4
- package/dist/lib/local-file-url.d.ts +9 -0
- package/dist/lib/local-file-url.d.ts.map +1 -0
- package/dist/lib/local-file-url.js +20 -0
- package/dist/lib/web-performance.d.ts +118 -0
- package/dist/lib/web-performance.d.ts.map +1 -0
- package/dist/lib/web-performance.js +192 -0
- package/package.json +34 -2
- package/schemas/config.schema.json +58 -0
- package/schemas/event-v3.schema.json +3073 -581
- package/src/commander.ts +462 -93
- package/src/commands/agents.ts +617 -355
- package/src/commands/backup.ts +18 -14
- package/src/commands/browse-session.ts +12 -0
- package/src/commands/browse.ts +31 -9
- package/src/commands/conversations.ts +279 -0
- package/src/commands/decision.ts +8 -2
- package/src/commands/deinit.ts +6 -0
- package/src/commands/docs.ts +25 -6
- package/src/commands/doctor.ts +75 -9
- package/src/commands/events.ts +21 -1
- package/src/commands/fetch.ts +7 -6
- package/src/commands/files.ts +143 -0
- package/src/commands/governor.ts +13 -12
- package/src/commands/inbox.ts +61 -0
- package/src/commands/init.ts +78 -16
- package/src/commands/ledger-v3.ts +421 -1
- package/src/commands/logs.ts +224 -0
- package/src/commands/messages.ts +61 -0
- package/src/commands/outline.ts +6 -2
- package/src/commands/presence.ts +7 -2
- package/src/commands/read.ts +6 -2
- package/src/commands/semantic.ts +244 -0
- package/src/commands/storage.ts +310 -0
- package/src/commands/tunnel.ts +66 -52
- package/src/commands/web.ts +92 -7
- package/src/commands/work.ts +3 -3
- package/src/commands/workflow.ts +13 -13
- package/src/core/agents/canonical-emit.ts +15 -0
- package/src/core/agents/claim-path.ts +23 -0
- package/src/core/agents/cli.ts +259 -53
- package/src/core/agents/coord-client.ts +92 -8
- package/src/core/agents/live-authority-v3.ts +342 -14
- package/src/core/agents/live-lifecycle-v3.ts +14 -4
- package/src/core/agents/live-observation-v3.ts +13 -3
- package/src/core/agents/render/prompt-context.ts +40 -16
- package/src/core/agents/rules/stop-hook.ts +129 -25
- package/src/core/agents/rules/verdict.ts +1 -0
- package/src/core/agents/session-events.ts +4 -0
- package/src/core/agents/session-finalization-state-v3.ts +1 -1
- package/src/core/agents/session-finalizer-v3.ts +4 -1
- package/src/core/agents/session-name-display.ts +9 -1
- package/src/core/agents/state/activity-log.ts +7 -2
- package/src/core/agents/state/heartbeat-reader.ts +69 -0
- package/src/core/agents/state/heartbeat-writer.ts +47 -84
- package/src/core/agents/state/live-coordination-view.ts +17 -81
- package/src/core/agents/state/live-coordination-writer.ts +141 -0
- package/src/core/agents/state/names.ts +190 -182
- package/src/core/agents/state/stale-sweep.ts +25 -5
- package/src/core/artifacts/constants.ts +4 -0
- package/src/core/artifacts/index.ts +113 -8
- package/src/core/config.ts +126 -5
- package/src/core/conversations/archive.ts +237 -0
- package/src/core/conversations/catalog.ts +79 -0
- package/src/core/conversations/context-pack.ts +72 -0
- package/src/core/conversations/contract.ts +178 -0
- package/src/core/conversations/evaluation.ts +30 -0
- package/src/core/conversations/index.ts +9 -0
- package/src/core/conversations/lifecycle.ts +63 -0
- package/src/core/conversations/normalize.ts +105 -0
- package/src/core/conversations/query.ts +318 -0
- package/src/core/conversations/search-index.ts +48 -0
- package/src/core/events/legacy-storage/canary.ts +177 -0
- package/src/core/events/legacy-storage/fence.ts +129 -0
- package/src/core/events/legacy-storage/index.ts +5 -0
- package/src/core/events/legacy-storage/inventory.ts +51 -0
- package/src/core/events/legacy-storage/manifest.ts +136 -0
- package/src/core/events/legacy-storage/reader.ts +178 -0
- package/src/core/events/v3/authority-outbox.ts +22 -1
- package/src/core/events/v3/base-contract.ts +56 -7
- package/src/core/events/v3/bootstrap.ts +195 -2
- package/src/core/events/v3/capabilities.ts +37 -3
- package/src/core/events/v3/control-witness.ts +339 -0
- package/src/core/events/v3/control-writer.ts +16 -0
- package/src/core/events/v3/control.ts +54 -18
- package/src/core/events/v3/coordination-transaction-recovery.ts +477 -0
- package/src/core/events/v3/coordination-view.ts +17 -1
- package/src/core/events/v3/generated.ts +1 -1
- package/src/core/events/v3/index.ts +26 -2
- package/src/core/events/v3/latency.ts +213 -2
- package/src/core/events/v3/live-route-observer.ts +80 -0
- package/src/core/events/v3/live-routing.ts +182 -45
- package/src/core/events/v3/producers/command-recorder.ts +10 -1
- package/src/core/events/v3/producers/coordination-recorder.ts +112 -15
- package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
- package/src/core/events/v3/producers/hook-base.ts +116 -2
- package/src/core/events/v3/producers/intake.ts +48 -2
- package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
- package/src/core/events/v3/producers/recorder.ts +1403 -30
- package/src/core/events/v3/reader.ts +243 -2
- package/src/core/events/v3/rotation-config.ts +98 -0
- package/src/core/events/v3/runtime-build.ts +41 -0
- package/src/core/events/v3/runtime-identity.ts +16 -0
- package/src/core/events/v3/runtime-telemetry-capabilities.ts +143 -0
- package/src/core/events/v3/support-storage/classify.ts +209 -0
- package/src/core/events/v3/support-storage/eligibility.ts +58 -0
- package/src/core/events/v3/support-storage/index.ts +9 -0
- package/src/core/events/v3/support-storage/inventory.ts +135 -0
- package/src/core/events/v3/support-storage/logical-authority.ts +117 -0
- package/src/core/events/v3/support-storage/maintenance.ts +501 -0
- package/src/core/events/v3/support-storage/pack-contract.ts +337 -0
- package/src/core/events/v3/support-storage/pack-reader.ts +346 -0
- package/src/core/events/v3/support-storage/pack-writer.ts +352 -0
- package/src/core/events/v3/support-storage/recovery.ts +43 -0
- package/src/core/events/v3/turn-telemetry.ts +66 -5
- package/src/core/events/v3/writer.ts +168 -16
- package/src/core/governor/plan-read.ts +5 -18
- package/src/core/governor/planning.ts +5 -8
- package/src/core/governor/service-read.ts +320 -2
- package/src/core/governor/service.ts +49 -22
- package/src/core/guard/evidence-v3.ts +1 -0
- package/src/core/hooks/adapter/events.ts +1 -0
- package/src/core/hooks/adapter/output.ts +12 -5
- package/src/core/hooks/adapter/parse.ts +16 -0
- package/src/core/hooks/adapter/runtime-telemetry.ts +1200 -0
- package/src/core/hooks/cli.ts +342 -64
- package/src/core/hooks/effects/image-capture.ts +4 -1
- package/src/core/hooks/remediation-cap.ts +83 -0
- package/src/core/hooks/resolve/coord-root.ts +91 -11
- package/src/core/hooks/resolve/owner.ts +4 -0
- package/src/core/hooks/resolve/transcript.ts +55 -11
- package/src/core/inbox/contract.ts +81 -0
- package/src/core/inbox/index.ts +4 -0
- package/src/core/inbox/lifecycle.ts +104 -0
- package/src/core/inbox/service.ts +305 -0
- package/src/core/inbox/watcher.ts +36 -0
- package/src/core/presence/codec-digest.ts +15 -9
- package/src/core/presence/relay-client.ts +55 -7
- package/src/core/semantic/adapters.ts +452 -0
- package/src/core/semantic/contract.ts +430 -0
- package/src/core/semantic/evidence.ts +336 -0
- package/src/core/semantic/index.ts +201 -0
- package/src/core/semantic/once.ts +496 -0
- package/src/core/semantic/prompt.ts +96 -0
- package/src/core/semantic/review.ts +803 -0
- package/src/core/semantic/routes.ts +30 -0
- package/src/core/semantic/scheduler.ts +151 -0
- package/src/core/semantic/service-status.ts +212 -0
- package/src/core/semantic/service.ts +681 -0
- package/src/core/semantic/soak.ts +638 -0
- package/src/core/semantic/storage.ts +300 -0
- package/src/core/semantic/usage.ts +272 -0
- package/src/core/semantic/validate.ts +243 -0
- package/src/core/storage/buffer.ts +124 -0
- package/src/core/storage/builtins.ts +916 -0
- package/src/core/storage/catalog.ts +467 -0
- package/src/core/storage/config.ts +423 -0
- package/src/core/storage/contract.ts +342 -0
- package/src/core/storage/durable-history.ts +738 -0
- package/src/core/storage/health.ts +76 -0
- package/src/core/storage/index.ts +15 -0
- package/src/core/storage/inventory.ts +859 -0
- package/src/core/storage/jsonl.ts +213 -0
- package/src/core/storage/log-retention.ts +555 -0
- package/src/core/storage/logger.ts +546 -0
- package/src/core/storage/maintenance-providers.ts +200 -0
- package/src/core/storage/maintenance.ts +929 -0
- package/src/core/storage/metrics.ts +199 -0
- package/src/core/storage/policy.ts +141 -0
- package/src/core/storage/process-log.ts +203 -0
- package/src/core/storage/query.ts +360 -0
- package/src/core/storage/receipts.ts +162 -0
- package/src/core/storage/segments.ts +721 -0
- package/src/core/storage/sink-graph.ts +343 -0
- package/src/core/storage/storm-control.ts +91 -0
- package/src/core/work/state.ts +12 -21
- package/src/core/workflow/live-session-v3.ts +2 -4
- package/src/index.ts +2 -0
- package/src/lazy-commands.ts +294 -0
- package/src/lib/browser/client.ts +21 -0
- package/src/lib/browser/index.ts +4 -0
- package/src/lib/browser/standalone-html.ts +312 -0
- package/src/lib/docs-lint.ts +58 -77
- package/src/lib/docs-metadata-audit.ts +26 -21
- package/src/lib/docs-metadata-sync.ts +32 -9
- package/src/lib/docs-repository-view.ts +220 -0
- package/src/lib/http/client.ts +44 -8
- package/src/lib/http/index.ts +6 -1
- package/src/lib/indexer-exclusions.ts +173 -0
- package/src/lib/instructions/apply.ts +1 -0
- package/src/lib/instructions/templates.ts +154 -4
- package/src/lib/local-file-url.ts +31 -0
- package/src/lib/web-performance.ts +335 -0
package/src/commands/tunnel.ts
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
|
+
import { type ChildProcess, spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
1
4
|
import type { Command } from "commander";
|
|
2
5
|
import type { EmitContext, HarneryProgramContext } from "../commander.ts";
|
|
3
6
|
|
|
4
|
-
// Inline cachePath; see lib/tunnel/state.ts for rationale.
|
|
5
|
-
function cachePath(tool: string, filename: string): string {
|
|
6
|
-
const dir = resolve(process.cwd(), ".cache", tool);
|
|
7
|
-
return resolve(dir, filename);
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
import { type ChildProcess, spawn, spawnSync } from "node:child_process";
|
|
11
|
-
import { existsSync, openSync, readFileSync, writeFileSync } from "node:fs";
|
|
12
|
-
import { resolve } from "node:path";
|
|
13
|
-
|
|
14
7
|
import { resolveBinName } from "../core/config.ts";
|
|
8
|
+
import {
|
|
9
|
+
processLogDestination,
|
|
10
|
+
runRotatingProcessSync,
|
|
11
|
+
spawnRotatingProcess,
|
|
12
|
+
} from "../core/storage/process-log.ts";
|
|
15
13
|
import {
|
|
16
14
|
clearState,
|
|
17
15
|
DEFAULT_INSTANCE,
|
|
@@ -79,6 +77,27 @@ interface LogsOpts {
|
|
|
79
77
|
provider?: boolean;
|
|
80
78
|
}
|
|
81
79
|
|
|
80
|
+
export function tunnelLogDestinations(
|
|
81
|
+
name: string,
|
|
82
|
+
provider: TunnelProvider,
|
|
83
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
84
|
+
root = process.cwd(),
|
|
85
|
+
): { gate: string; provider: string } {
|
|
86
|
+
const destination = (filename: string) =>
|
|
87
|
+
processLogDestination({
|
|
88
|
+
coord_root: root,
|
|
89
|
+
project_root: root,
|
|
90
|
+
family_id: "tunnel-process-log",
|
|
91
|
+
filename,
|
|
92
|
+
legacy_path: resolve(root, ".cache", "tunnel", filename),
|
|
93
|
+
env,
|
|
94
|
+
});
|
|
95
|
+
return {
|
|
96
|
+
gate: destination(gateLogFile(name)),
|
|
97
|
+
provider: destination(providerLogFile(name, provider)),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
82
101
|
/**
|
|
83
102
|
* Validate + normalize an instance name. Names become filename fragments
|
|
84
103
|
* (state-<name>.json) and pgrep patterns, so they're restricted to a safe
|
|
@@ -348,7 +367,6 @@ function runTailscaleShare(
|
|
|
348
367
|
httpsPort: number,
|
|
349
368
|
logPath: string,
|
|
350
369
|
): void {
|
|
351
|
-
const fd = openSync(logPath, "a");
|
|
352
370
|
const args = [
|
|
353
371
|
tailscaleCommand(mode),
|
|
354
372
|
"--bg",
|
|
@@ -357,31 +375,36 @@ function runTailscaleShare(
|
|
|
357
375
|
`--set-path=${path}`,
|
|
358
376
|
targetUrl,
|
|
359
377
|
];
|
|
360
|
-
const
|
|
361
|
-
|
|
378
|
+
const status = runRotatingProcessSync({
|
|
379
|
+
path: logPath,
|
|
380
|
+
command: "tailscale",
|
|
381
|
+
arguments: args,
|
|
362
382
|
});
|
|
363
|
-
if (
|
|
383
|
+
if (status !== 0) {
|
|
364
384
|
emit.error({
|
|
365
385
|
code: "tunnel_tailscale_failed",
|
|
366
386
|
message: `tailscale ${tailscaleCommand(mode)} failed. Check log: ${logPath}`,
|
|
367
387
|
});
|
|
368
|
-
process.exit(
|
|
388
|
+
process.exit(status ?? 1);
|
|
369
389
|
}
|
|
370
390
|
}
|
|
371
391
|
|
|
372
392
|
function stopTailscaleShare(state: TunnelState): boolean {
|
|
373
393
|
if (state.provider !== "tailscale" || !state.tailscale_mode) return true;
|
|
374
394
|
const cmd = tailscaleCommand(state.tailscale_mode);
|
|
375
|
-
const logPath =
|
|
376
|
-
const fd = openSync(logPath, "a");
|
|
395
|
+
const logPath = tunnelLogDestinations(state.name, "tailscale").provider;
|
|
377
396
|
const args = [
|
|
378
397
|
cmd,
|
|
379
398
|
`--https=${state.tailscale_https_port ?? 443}`,
|
|
380
399
|
`--set-path=${state.tailscale_path ?? "/"}`,
|
|
381
400
|
"off",
|
|
382
401
|
];
|
|
383
|
-
const
|
|
384
|
-
|
|
402
|
+
const status = runRotatingProcessSync({
|
|
403
|
+
path: logPath,
|
|
404
|
+
command: "tailscale",
|
|
405
|
+
arguments: args,
|
|
406
|
+
});
|
|
407
|
+
if (status !== 0) {
|
|
385
408
|
// The gate is torn down and its port is freed for reuse regardless, so a
|
|
386
409
|
// surviving serve/funnel mapping could later re-expose whatever next binds
|
|
387
410
|
// that port. Surface it loudly so the operator can clear it by hand.
|
|
@@ -432,26 +455,22 @@ interface GateSpawnOpts {
|
|
|
432
455
|
* re-reads — that snapshot is precisely why `reload` has to exist.
|
|
433
456
|
*/
|
|
434
457
|
function spawnGate(o: GateSpawnOpts): ChildProcess {
|
|
435
|
-
const gateFd = openSync(o.gateLogPath, "a");
|
|
436
458
|
// `--name`/`--port` on argv mirror the env vars; they're what makes the gate
|
|
437
459
|
// process distinguishable per-instance in `pgrep -f` (see sweepStrays).
|
|
438
|
-
const gateProc =
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
HARNERY_TUNNEL_VHOST: o.vhost,
|
|
451
|
-
HARNERY_TUNNEL_PORT: String(o.gatePort),
|
|
452
|
-
},
|
|
460
|
+
const gateProc = spawnRotatingProcess({
|
|
461
|
+
path: o.gateLogPath,
|
|
462
|
+
command: "bun",
|
|
463
|
+
arguments: ["run", gateScriptPath(), "--name", o.name, "--port", String(o.gatePort)],
|
|
464
|
+
env: {
|
|
465
|
+
...process.env,
|
|
466
|
+
HARNERY_TUNNEL_ALLOW: o.allowedIps.join(","),
|
|
467
|
+
HARNERY_TUNNEL_ACCESS:
|
|
468
|
+
o.provider === "cloudflare" ? "cloudflare-allowlist" : "trusted-local-proxy",
|
|
469
|
+
HARNERY_TUNNEL_TARGET: o.target,
|
|
470
|
+
HARNERY_TUNNEL_VHOST: o.vhost,
|
|
471
|
+
HARNERY_TUNNEL_PORT: String(o.gatePort),
|
|
453
472
|
},
|
|
454
|
-
);
|
|
473
|
+
});
|
|
455
474
|
gateProc.unref();
|
|
456
475
|
return gateProc;
|
|
457
476
|
}
|
|
@@ -521,10 +540,9 @@ async function up(opts: UpOpts): Promise<void> {
|
|
|
521
540
|
process.exit(1);
|
|
522
541
|
}
|
|
523
542
|
|
|
524
|
-
const
|
|
525
|
-
const
|
|
526
|
-
|
|
527
|
-
writeFileSync(providerLogPath, "");
|
|
543
|
+
const logPaths = tunnelLogDestinations(name, provider);
|
|
544
|
+
const gateLogPath = logPaths.gate;
|
|
545
|
+
const providerLogPath = logPaths.provider;
|
|
528
546
|
|
|
529
547
|
const gateProc = spawnGate({
|
|
530
548
|
name,
|
|
@@ -551,20 +569,16 @@ async function up(opts: UpOpts): Promise<void> {
|
|
|
551
569
|
let cloudflaredPid: number | undefined;
|
|
552
570
|
|
|
553
571
|
if (provider === "cloudflare") {
|
|
554
|
-
const cfdFd = openSync(providerLogPath, "a");
|
|
555
572
|
// Force HTTP/2 transport. The default QUIC transport wedges at precheck on
|
|
556
573
|
// constrained hosts (e.g. WSL, where UDP receive buffers can't grow and ICMP
|
|
557
574
|
// is restricted): the URL prints but the edge never registers. HTTP/2 is
|
|
558
575
|
// marginally higher-latency but registers reliably, which is what a dev
|
|
559
576
|
// tunnel needs.
|
|
560
|
-
const cfdProc =
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
{
|
|
564
|
-
|
|
565
|
-
stdio: ["ignore", cfdFd, cfdFd],
|
|
566
|
-
},
|
|
567
|
-
);
|
|
577
|
+
const cfdProc = spawnRotatingProcess({
|
|
578
|
+
path: providerLogPath,
|
|
579
|
+
command: cloudflaredBin!,
|
|
580
|
+
arguments: ["tunnel", "--protocol", "http2", "--url", `http://localhost:${gatePort}`],
|
|
581
|
+
});
|
|
568
582
|
cfdProc.unref();
|
|
569
583
|
cloudflaredPid = cfdProc.pid!;
|
|
570
584
|
|
|
@@ -788,7 +802,7 @@ export async function reloadOne(state: TunnelState): Promise<{ ok: boolean; mess
|
|
|
788
802
|
vhost: state.vhost,
|
|
789
803
|
provider: state.provider,
|
|
790
804
|
allowedIps: cfg.allowed_ips,
|
|
791
|
-
gateLogPath:
|
|
805
|
+
gateLogPath: tunnelLogDestinations(name, state.provider).gate,
|
|
792
806
|
});
|
|
793
807
|
|
|
794
808
|
await sleep(800);
|
|
@@ -952,8 +966,8 @@ function logs(opts: LogsOpts): void {
|
|
|
952
966
|
const name = resolveName(opts.name);
|
|
953
967
|
const state = readState(name);
|
|
954
968
|
const provider = state?.provider ?? "cloudflare";
|
|
955
|
-
const
|
|
956
|
-
const path =
|
|
969
|
+
const destinations = tunnelLogDestinations(name, provider);
|
|
970
|
+
const path = opts.provider ? destinations.provider : destinations.gate;
|
|
957
971
|
if (!existsSync(path)) {
|
|
958
972
|
emit.error({ code: "tunnel_no_log", message: `No log file at ${path}` });
|
|
959
973
|
process.exit(1);
|
package/src/commands/web.ts
CHANGED
|
@@ -2,10 +2,17 @@ import { spawn, spawnSync } from "node:child_process";
|
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { createServer } from "node:net";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
6
6
|
import type { Command } from "commander";
|
|
7
7
|
import type { EmitContext } from "../commander.ts";
|
|
8
8
|
import { DEFAULT_WEB_PORT, resolveWebPort } from "../core/config.ts";
|
|
9
|
+
import { ensureSemanticServiceRunning } from "../core/semantic/service.ts";
|
|
10
|
+
import { processLogDestination } from "../core/storage/process-log.ts";
|
|
11
|
+
import {
|
|
12
|
+
parsePerformanceWindow,
|
|
13
|
+
readWebPerformanceReport,
|
|
14
|
+
WEB_PERFORMANCE_LOG,
|
|
15
|
+
} from "../lib/web-performance.ts";
|
|
9
16
|
import { lazyFetchWebRoot, webRunner } from "./web-fetch.ts";
|
|
10
17
|
|
|
11
18
|
/**
|
|
@@ -15,6 +22,7 @@ import { lazyFetchWebRoot, webRunner } from "./web-fetch.ts";
|
|
|
15
22
|
* up [--prod]: start the server (dev mode default; --prod runs next start)
|
|
16
23
|
* build: next build (production bundle)
|
|
17
24
|
* start: next start (must `harn web build` first)
|
|
25
|
+
* performance: summarize request latency and event-loop delays
|
|
18
26
|
*
|
|
19
27
|
* Launches the Next.js app under `harnery/web/` against the user's current
|
|
20
28
|
* working directory. The web app reads `.harnery/` via `HARNERY_COORD_ROOT`;
|
|
@@ -69,6 +77,38 @@ export function nodeOptionsWithHeapCap(mb: number): string | undefined {
|
|
|
69
77
|
return `${inherited} --max-old-space-size=${mb}`.trim();
|
|
70
78
|
}
|
|
71
79
|
|
|
80
|
+
/** Preload the request diagnostics hook without replacing Next's HTTP server. */
|
|
81
|
+
export function nodeOptionsWithWebDiagnostics(webDir: string, mb: number): string {
|
|
82
|
+
const inherited = nodeOptionsWithHeapCap(mb) ?? "";
|
|
83
|
+
if (inherited.includes("server-performance.mjs")) return inherited;
|
|
84
|
+
const preload = pathToFileURL(path.join(webDir, "server-performance.mjs")).href;
|
|
85
|
+
return `${inherited} --import=${preload}`.trim();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function webPerformanceLogDestination(
|
|
89
|
+
coordRoot: string,
|
|
90
|
+
env: Readonly<Record<string, string | undefined>> = process.env,
|
|
91
|
+
): string {
|
|
92
|
+
return processLogDestination({
|
|
93
|
+
coord_root: coordRoot,
|
|
94
|
+
family_id: "web-performance-log",
|
|
95
|
+
filename: "active.jsonl",
|
|
96
|
+
legacy_path: path.join(coordRoot, ".harnery", "logs", WEB_PERFORMANCE_LOG),
|
|
97
|
+
env,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async function startSemanticServiceWithWeb(coordRoot: string, emit: EmitContext): Promise<void> {
|
|
102
|
+
const result = await ensureSemanticServiceRunning(coordRoot);
|
|
103
|
+
if (result.state === "started") emit.log("semantic reader · started automatically", "info");
|
|
104
|
+
if (result.state === "running") emit.log("semantic reader · already running", "info");
|
|
105
|
+
if (result.state === "paused") emit.log("semantic reader · paused by operator", "info");
|
|
106
|
+
if (result.state === "inactive") emit.log("semantic reader · waiting for active V3", "info");
|
|
107
|
+
if (result.state === "unavailable") {
|
|
108
|
+
emit.log(`semantic reader · unavailable (${result.error ?? "startup failed"})`, "warn");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
72
112
|
/**
|
|
73
113
|
* Resolve the web app root. A local `web/` (source checkout / submodule) wins.
|
|
74
114
|
* Otherwise, on an npm install, lazy-fetch it (clone + install) unless the
|
|
@@ -193,10 +233,15 @@ export function registerWebCommand(program: Command, emit: EmitContext): void {
|
|
|
193
233
|
|
|
194
234
|
if (!(await requireAvailablePort(emit, port))) return;
|
|
195
235
|
|
|
236
|
+
await startSemanticServiceWithWeb(coordRoot, emit);
|
|
237
|
+
|
|
196
238
|
const heapMb = resolveMaxOldSpaceMb(opts.maxOldSpace);
|
|
239
|
+
const nodeOptions = nodeOptionsWithWebDiagnostics(root, heapMb);
|
|
240
|
+
const performanceLogPath = webPerformanceLogDestination(coordRoot);
|
|
197
241
|
emit.log(`harn web · http://localhost:${port} (${mode})`, "info");
|
|
198
242
|
emit.log(`files origin · http://harnery-files.localhost:${port}`, "info");
|
|
199
243
|
emit.log(`reading .harnery/ from: ${coordRoot}`, "info");
|
|
244
|
+
emit.log(`performance log · ${performanceLogPath}`, "info");
|
|
200
245
|
if (heapMb > 0) emit.log(`heap ceiling · ${heapMb} MB`, "info");
|
|
201
246
|
|
|
202
247
|
const child = spawn(webRunner(), ["run", mode], {
|
|
@@ -205,9 +250,9 @@ export function registerWebCommand(program: Command, emit: EmitContext): void {
|
|
|
205
250
|
...process.env,
|
|
206
251
|
HARNERY_COORD_ROOT: coordRoot,
|
|
207
252
|
HARNERY_WEB_PORT: String(port),
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
253
|
+
HARNERY_WEB_MODE: mode,
|
|
254
|
+
HARNERY_WEB_PERFORMANCE_LOG_PATH: performanceLogPath,
|
|
255
|
+
NODE_OPTIONS: nodeOptions,
|
|
211
256
|
},
|
|
212
257
|
stdio: "inherit",
|
|
213
258
|
});
|
|
@@ -281,9 +326,13 @@ export function registerWebCommand(program: Command, emit: EmitContext): void {
|
|
|
281
326
|
return;
|
|
282
327
|
}
|
|
283
328
|
if (!(await requireAvailablePort(emit, port))) return;
|
|
329
|
+
await startSemanticServiceWithWeb(coordRoot, emit);
|
|
284
330
|
const heapMb = resolveMaxOldSpaceMb(opts.maxOldSpace);
|
|
331
|
+
const nodeOptions = nodeOptionsWithWebDiagnostics(root, heapMb);
|
|
332
|
+
const performanceLogPath = webPerformanceLogDestination(coordRoot);
|
|
285
333
|
emit.log(`harn web · http://localhost:${port} (start)`, "info");
|
|
286
334
|
emit.log(`reading .harnery/ from: ${coordRoot}`, "info");
|
|
335
|
+
emit.log(`performance log · ${performanceLogPath}`, "info");
|
|
287
336
|
if (heapMb > 0) emit.log(`heap ceiling · ${heapMb} MB`, "info");
|
|
288
337
|
|
|
289
338
|
const child = spawn(webRunner(), ["run", "start"], {
|
|
@@ -292,9 +341,9 @@ export function registerWebCommand(program: Command, emit: EmitContext): void {
|
|
|
292
341
|
...process.env,
|
|
293
342
|
HARNERY_COORD_ROOT: coordRoot,
|
|
294
343
|
HARNERY_WEB_PORT: String(port),
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
344
|
+
HARNERY_WEB_MODE: "start",
|
|
345
|
+
HARNERY_WEB_PERFORMANCE_LOG_PATH: performanceLogPath,
|
|
346
|
+
NODE_OPTIONS: nodeOptions,
|
|
298
347
|
},
|
|
299
348
|
stdio: "inherit",
|
|
300
349
|
});
|
|
@@ -309,4 +358,40 @@ export function registerWebCommand(program: Command, emit: EmitContext): void {
|
|
|
309
358
|
process.exitCode = code ?? 0;
|
|
310
359
|
});
|
|
311
360
|
});
|
|
361
|
+
|
|
362
|
+
web
|
|
363
|
+
.command("performance")
|
|
364
|
+
.description("Summarize dashboard request, event-loop, memory, and GC diagnostics")
|
|
365
|
+
.option("--coord-root <dir>", "Override the coordination root", process.cwd())
|
|
366
|
+
.option("--since <window>", "Include the last Nm, Nh, or Nd", "1h")
|
|
367
|
+
.option("--limit <n>", "Keep the N slowest requests and delays", "20")
|
|
368
|
+
.option("--json", "Emit structured JSON")
|
|
369
|
+
.action((opts: { coordRoot: string; since: string; limit: string; json?: boolean }) => {
|
|
370
|
+
const windowMs = parsePerformanceWindow(opts.since);
|
|
371
|
+
if (windowMs === null) {
|
|
372
|
+
emit.error({
|
|
373
|
+
code: "invalid_web_performance_window",
|
|
374
|
+
message: `invalid --since value '${opts.since}'`,
|
|
375
|
+
hint: "Use Nm, Nh, or Nd, for example 30m, 1h, or 7d.",
|
|
376
|
+
});
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
const limit = Number(opts.limit);
|
|
380
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 500) {
|
|
381
|
+
emit.error({
|
|
382
|
+
code: "invalid_web_performance_limit",
|
|
383
|
+
message: `invalid --limit value '${opts.limit}'`,
|
|
384
|
+
hint: "Use an integer from 1 through 500.",
|
|
385
|
+
});
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
if (opts.json) emit.config({ format: "json" });
|
|
389
|
+
emit.data(
|
|
390
|
+
readWebPerformanceReport({
|
|
391
|
+
root: opts.coordRoot,
|
|
392
|
+
since: opts.since,
|
|
393
|
+
limit,
|
|
394
|
+
}),
|
|
395
|
+
);
|
|
396
|
+
});
|
|
312
397
|
}
|
package/src/commands/work.ts
CHANGED
|
@@ -6,9 +6,9 @@ import {
|
|
|
6
6
|
createBuiltinAdapterRegistry,
|
|
7
7
|
probeBinaryVersion,
|
|
8
8
|
} from "../core/adapters/index.ts";
|
|
9
|
+
import { resolveCoordRoot } from "../core/agents/coord-client.ts";
|
|
9
10
|
import { workflowSubscriptionOnly } from "../core/config.ts";
|
|
10
11
|
import { findCompletedMissionGoverning, reopenGovernorMission } from "../core/governor/index.ts";
|
|
11
|
-
import { findCoordRoot } from "../core/hooks/resolve/coord-root.ts";
|
|
12
12
|
import type { PolicyIsolation } from "../core/policy/index.ts";
|
|
13
13
|
import { loadPolicyFile } from "../core/policy/index.ts";
|
|
14
14
|
import {
|
|
@@ -467,7 +467,7 @@ export function renderAttemptBudget(record: WorkRecord): string {
|
|
|
467
467
|
}
|
|
468
468
|
|
|
469
469
|
function withWorkRoot(emit: EmitContext, fn: (coordRoot: string) => void): void {
|
|
470
|
-
const coordRoot =
|
|
470
|
+
const coordRoot = resolveCoordRoot();
|
|
471
471
|
if (!coordRoot) {
|
|
472
472
|
emit.error({
|
|
473
473
|
code: "no_coord_root",
|
|
@@ -488,7 +488,7 @@ async function withWorkRootAsync(
|
|
|
488
488
|
emit: EmitContext,
|
|
489
489
|
fn: (coordRoot: string) => Promise<void>,
|
|
490
490
|
): Promise<void> {
|
|
491
|
-
const coordRoot =
|
|
491
|
+
const coordRoot = resolveCoordRoot();
|
|
492
492
|
if (!coordRoot) {
|
|
493
493
|
emit.error({
|
|
494
494
|
code: "no_coord_root",
|
package/src/commands/workflow.ts
CHANGED
|
@@ -7,8 +7,8 @@ import {
|
|
|
7
7
|
createBuiltinAdapterRegistry,
|
|
8
8
|
probeBinaryVersion,
|
|
9
9
|
} from "../core/adapters/index.ts";
|
|
10
|
+
import { resolveCoordRoot } from "../core/agents/coord-client.ts";
|
|
10
11
|
import { resolveBinName, workflowSubscriptionOnly } from "../core/config.ts";
|
|
11
|
-
import { findCoordRoot } from "../core/hooks/resolve/coord-root.ts";
|
|
12
12
|
import type { PolicyIsolation } from "../core/policy/index.ts";
|
|
13
13
|
import { loadPolicyFile } from "../core/policy/index.ts";
|
|
14
14
|
import type { WorkflowApproval, WorkflowApprovalStatus } from "../core/workflow/approvals.ts";
|
|
@@ -132,7 +132,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
|
|
|
132
132
|
.option("--approval-to <address>", "Address durable ASK requests (default: operator)")
|
|
133
133
|
.option("--json", "Emit the full RunReport as JSON")
|
|
134
134
|
.action(async (script: string, opts: WorkflowRunOpts) => {
|
|
135
|
-
const coordRoot =
|
|
135
|
+
const coordRoot = resolveCoordRoot();
|
|
136
136
|
if (!coordRoot) {
|
|
137
137
|
emit.error({
|
|
138
138
|
code: "no_coord_root",
|
|
@@ -263,7 +263,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
|
|
|
263
263
|
.description("Resume a parked workflow after its durable approval has been resolved.")
|
|
264
264
|
.option("--json", "Emit the full RunReport or parked result as JSON")
|
|
265
265
|
.action(async (runId: string, opts: { json?: boolean }) => {
|
|
266
|
-
const coordRoot =
|
|
266
|
+
const coordRoot = resolveCoordRoot();
|
|
267
267
|
if (!coordRoot) {
|
|
268
268
|
emit.error({
|
|
269
269
|
code: "no_coord_root",
|
|
@@ -345,7 +345,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
|
|
|
345
345
|
.description("Show validated allocation, verification, integration, and cleanup state.")
|
|
346
346
|
.option("--json", "Emit the validated workspace status as JSON")
|
|
347
347
|
.action(async (runId: string, opts: { json?: boolean }) => {
|
|
348
|
-
const coordRoot =
|
|
348
|
+
const coordRoot = resolveCoordRoot();
|
|
349
349
|
if (!coordRoot) {
|
|
350
350
|
emit.error({
|
|
351
351
|
code: "no_coord_root",
|
|
@@ -374,7 +374,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
|
|
|
374
374
|
.description("List validated isolated and shared-compatibility workspace decisions.")
|
|
375
375
|
.option("--json", "Emit workspace inspections as JSON")
|
|
376
376
|
.action(async (opts: { json?: boolean }) => {
|
|
377
|
-
const coordRoot =
|
|
377
|
+
const coordRoot = resolveCoordRoot();
|
|
378
378
|
if (!coordRoot) {
|
|
379
379
|
emit.error({
|
|
380
380
|
code: "no_coord_root",
|
|
@@ -433,7 +433,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
|
|
|
433
433
|
.option("--approval-to <address>", "Address a durable policy ASK request")
|
|
434
434
|
.option("--json", "Emit the durable integration plan as JSON")
|
|
435
435
|
.action(async (runId: string, opts: WorkflowIntegrationPrepareOpts) => {
|
|
436
|
-
const coordRoot =
|
|
436
|
+
const coordRoot = resolveCoordRoot();
|
|
437
437
|
if (!coordRoot) {
|
|
438
438
|
emit.error({
|
|
439
439
|
code: "no_coord_root",
|
|
@@ -521,7 +521,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
|
|
|
521
521
|
.option("--yes", "Confirm the target-branch mutation")
|
|
522
522
|
.option("--json", "Emit the durable integration receipt as JSON")
|
|
523
523
|
.action(async (runId: string, opts: WorkflowConfirmedMutationOpts) => {
|
|
524
|
-
const coordRoot =
|
|
524
|
+
const coordRoot = resolveCoordRoot();
|
|
525
525
|
if (!coordRoot) {
|
|
526
526
|
emit.error({
|
|
527
527
|
code: "no_coord_root",
|
|
@@ -565,7 +565,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
|
|
|
565
565
|
.option("--yes", "Confirm the worktree and provider-branch removal attempt")
|
|
566
566
|
.option("--json", "Emit the cleanup attempt or receipt as JSON")
|
|
567
567
|
.action(async (runId: string, opts: WorkflowConfirmedMutationOpts) => {
|
|
568
|
-
const coordRoot =
|
|
568
|
+
const coordRoot = resolveCoordRoot();
|
|
569
569
|
if (!coordRoot) {
|
|
570
570
|
emit.error({
|
|
571
571
|
code: "no_coord_root",
|
|
@@ -616,7 +616,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
|
|
|
616
616
|
.option("--discard", "Throw the uncommitted work away instead of salvaging it")
|
|
617
617
|
.option("--json", "Emit the reclaim preparation and cleanup result as JSON")
|
|
618
618
|
.action(async (runId: string, opts: WorkflowReclaimOpts) => {
|
|
619
|
-
const coordRoot =
|
|
619
|
+
const coordRoot = resolveCoordRoot();
|
|
620
620
|
if (!coordRoot) {
|
|
621
621
|
emit.error({
|
|
622
622
|
code: "no_coord_root",
|
|
@@ -687,7 +687,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
|
|
|
687
687
|
.option("--status <status>", "Filter: pending | approved | denied")
|
|
688
688
|
.option("--json", "Emit approval records as JSON")
|
|
689
689
|
.action(async (opts: WorkflowApprovalListOpts) => {
|
|
690
|
-
const coordRoot =
|
|
690
|
+
const coordRoot = resolveCoordRoot();
|
|
691
691
|
if (!coordRoot) {
|
|
692
692
|
emit.error({ code: "no_coord_root", message: "no .harnery/ coordination root found" });
|
|
693
693
|
process.exit(1);
|
|
@@ -725,7 +725,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
|
|
|
725
725
|
.description("Show one durable workflow approval.")
|
|
726
726
|
.option("--json", "Emit the approval record as JSON")
|
|
727
727
|
.action(async (approvalId: string, opts: { json?: boolean }) => {
|
|
728
|
-
const coordRoot =
|
|
728
|
+
const coordRoot = resolveCoordRoot();
|
|
729
729
|
if (!coordRoot) {
|
|
730
730
|
emit.error({ code: "no_coord_root", message: "no .harnery/ coordination root found" });
|
|
731
731
|
process.exit(1);
|
|
@@ -755,7 +755,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
|
|
|
755
755
|
.option("--reason <text>", "Bounded decision reason")
|
|
756
756
|
.option("--json", "Emit the resolved approval as JSON")
|
|
757
757
|
.action(async (approvalId: string, opts: WorkflowApprovalDecisionOpts) => {
|
|
758
|
-
const coordRoot =
|
|
758
|
+
const coordRoot = resolveCoordRoot();
|
|
759
759
|
if (!coordRoot) {
|
|
760
760
|
emit.error({ code: "no_coord_root", message: "no .harnery/ coordination root found" });
|
|
761
761
|
process.exit(1);
|
|
@@ -798,7 +798,7 @@ export function registerWorkflowCommand(program: Command, emit: EmitContext): vo
|
|
|
798
798
|
.description("Show the bounded proof packet for a completed workflow run.")
|
|
799
799
|
.option("--json", "Emit the stored proof packet as JSON")
|
|
800
800
|
.action(async (runId: string, opts: WorkflowProofOpts) => {
|
|
801
|
-
const coordRoot =
|
|
801
|
+
const coordRoot = resolveCoordRoot();
|
|
802
802
|
if (!coordRoot) {
|
|
803
803
|
emit.error({
|
|
804
804
|
code: "no_coord_root",
|
|
@@ -14,6 +14,7 @@ import { spawnSync } from "node:child_process";
|
|
|
14
14
|
import type { LiveCoordinationObservationV3 } from "../events/v3/live-observation.ts";
|
|
15
15
|
import { coordBinPath } from "./coord-bin.ts";
|
|
16
16
|
import { resolveCoordRoot } from "./coord-client.ts";
|
|
17
|
+
import type { Heartbeat } from "./state/heartbeat-reader.ts";
|
|
17
18
|
|
|
18
19
|
export type EventV3EmitObservation =
|
|
19
20
|
| LiveCoordinationObservationV3
|
|
@@ -96,3 +97,17 @@ export function normalizeAdapter(platform: string | undefined): "claude-code" |
|
|
|
96
97
|
if (platform === "codex") return "codex";
|
|
97
98
|
return "claude-code";
|
|
98
99
|
}
|
|
100
|
+
|
|
101
|
+
/** Producer joins use the private native session ID, never its V3 fingerprint. */
|
|
102
|
+
export function nativeSessionIdentity(
|
|
103
|
+
row: Pick<Heartbeat, "native_session_id" | "session_id"> | null | undefined,
|
|
104
|
+
fallback: string,
|
|
105
|
+
): string {
|
|
106
|
+
if (row?.native_session_id) return row.native_session_id;
|
|
107
|
+
// A projection-only row carries the privacy-safe canonical session
|
|
108
|
+
// fingerprint, not the adapter's native session ID needed to join the hook
|
|
109
|
+
// producer. Until a disposable cache exists, the resolved owner is the only
|
|
110
|
+
// native identity available to command surfaces.
|
|
111
|
+
if (row?.session_id && !/^sid_[a-f0-9]{64}$/.test(row.session_id)) return row.session_id;
|
|
112
|
+
return fallback;
|
|
113
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Canonical identity for an authority-bearing write claim.
|
|
5
|
+
*
|
|
6
|
+
* Workspace paths stay portable and repository-relative. Approved paths
|
|
7
|
+
* outside the coordination root become resolved absolute paths so a later
|
|
8
|
+
* release matches whether the caller supplies the stored dot-dot form or the
|
|
9
|
+
* absolute target. This is lexical identity only; finalization policy owns the
|
|
10
|
+
* physical containment and symlink checks before a claim is acquired.
|
|
11
|
+
*/
|
|
12
|
+
export function canonicalClaimPath(coordRoot: string, value: string): string {
|
|
13
|
+
const root = resolve(coordRoot);
|
|
14
|
+
const absolute = resolve(root, value);
|
|
15
|
+
const fromRoot = relative(root, absolute);
|
|
16
|
+
const contained = fromRoot !== ".." && !fromRoot.startsWith(`..${sep}`) && !isAbsolute(fromRoot);
|
|
17
|
+
if (contained) return portable(fromRoot || ".");
|
|
18
|
+
return portable(absolute);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function portable(value: string): string {
|
|
22
|
+
return value.split(sep).join("/");
|
|
23
|
+
}
|