harnery 0.30.0 → 0.31.1
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/README.md +4 -4
- package/dist/commander.d.ts +8 -0
- package/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +14 -13
- package/dist/commands/adapter.d.ts +12 -0
- package/dist/commands/adapter.d.ts.map +1 -0
- package/dist/commands/{harness.js → adapter.js} +35 -35
- package/dist/commands/agents.d.ts +3 -2
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +185 -74
- package/dist/commands/artifacts.d.ts +4 -0
- package/dist/commands/artifacts.d.ts.map +1 -0
- package/dist/commands/artifacts.js +143 -0
- package/dist/commands/backup.d.ts +1 -1
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +5 -2
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +310 -7
- package/dist/commands/checkpoint.d.ts +12 -0
- package/dist/commands/checkpoint.d.ts.map +1 -0
- package/dist/commands/checkpoint.js +162 -0
- package/dist/commands/context.d.ts +2 -2
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +3 -151
- package/dist/commands/decision.d.ts.map +1 -1
- package/dist/commands/decision.js +31 -7
- package/dist/commands/deinit.d.ts +2 -2
- package/dist/commands/deinit.js +15 -15
- package/dist/commands/doctor.js +23 -23
- package/dist/commands/governor.d.ts +4 -0
- package/dist/commands/governor.d.ts.map +1 -0
- package/dist/commands/{supervisor.js → governor.js} +133 -108
- package/dist/commands/grep.d.ts +1 -1
- package/dist/commands/grep.d.ts.map +1 -1
- package/dist/commands/grep.js +19 -2
- package/dist/commands/init.d.ts +12 -12
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +44 -30
- package/dist/commands/{session.d.ts → journal.d.ts} +2 -2
- package/dist/commands/journal.d.ts.map +1 -0
- package/dist/commands/{scratch.js → journal.js} +47 -47
- package/dist/commands/policy.js +1 -1
- package/dist/commands/presence.js +2 -2
- package/dist/commands/sync.d.ts +1 -1
- package/dist/commands/sync.js +3 -3
- package/dist/commands/tunnel.d.ts +16 -0
- package/dist/commands/tunnel.d.ts.map +1 -1
- package/dist/commands/tunnel.js +213 -27
- package/dist/commands/web-fetch.js +1 -1
- package/dist/commands/web.d.ts +19 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +51 -0
- package/dist/commands/work.d.ts.map +1 -1
- package/dist/commands/work.js +38 -22
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +35 -28
- package/dist/core/{harnesses → adapters}/attest-projection.d.ts +2 -2
- package/dist/core/adapters/attest-projection.d.ts.map +1 -0
- package/dist/core/{harnesses → adapters}/attest.d.ts +16 -16
- package/dist/core/adapters/attest.d.ts.map +1 -0
- package/dist/core/{harnesses → adapters}/attest.js +9 -9
- package/dist/core/{harnesses → adapters}/attestation.d.ts +16 -16
- package/dist/core/adapters/attestation.d.ts.map +1 -0
- package/dist/core/{harnesses → adapters}/attestation.js +20 -20
- package/dist/core/{harnesses → adapters}/bench.d.ts +12 -12
- package/dist/core/adapters/bench.d.ts.map +1 -0
- package/dist/core/{harnesses → adapters}/bench.js +12 -12
- package/dist/core/adapters/index.d.ts +13 -0
- package/dist/core/adapters/index.d.ts.map +1 -0
- package/dist/core/adapters/index.js +6 -0
- package/dist/core/{harnesses → adapters}/profiles.d.ts +11 -11
- package/dist/core/adapters/profiles.d.ts.map +1 -0
- package/dist/core/{harnesses → adapters}/profiles.js +11 -11
- package/dist/core/adapters/registry.d.ts +15 -0
- package/dist/core/adapters/registry.d.ts.map +1 -0
- package/dist/core/{harnesses → adapters}/registry.js +11 -11
- package/dist/core/{harnesses → adapters}/types.d.ts +23 -23
- package/dist/core/adapters/types.d.ts.map +1 -0
- package/dist/core/{harnesses → adapters}/types.js +1 -1
- package/dist/core/agents/canonical-emit.d.ts +9 -14
- package/dist/core/agents/canonical-emit.d.ts.map +1 -1
- package/dist/core/agents/canonical-emit.js +15 -44
- package/dist/core/agents/cli-emit.js +1 -1
- package/dist/core/agents/cli.js +30 -26
- package/dist/core/agents/codex-replay.d.ts +1 -1
- package/dist/core/agents/codex-replay.js +6 -6
- package/dist/core/agents/coord-bin.d.ts +33 -0
- package/dist/core/agents/coord-bin.d.ts.map +1 -0
- package/dist/core/agents/coord-bin.js +89 -0
- package/dist/core/agents/coord-client.d.ts +78 -8
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/coord-client.js +303 -75
- package/dist/core/agents/events/consume.d.ts +1 -1
- package/dist/core/agents/events/emit.d.ts +5 -6
- package/dist/core/agents/events/emit.d.ts.map +1 -1
- package/dist/core/agents/events/emit.js +2 -2
- package/dist/core/agents/paths.d.ts +5 -2
- package/dist/core/agents/paths.d.ts.map +1 -1
- package/dist/core/agents/paths.js +7 -13
- package/dist/core/agents/render/prompt-context.d.ts +21 -9
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +82 -30
- package/dist/core/agents/render/session-context.d.ts +1 -1
- package/dist/core/agents/render/session-context.js +5 -5
- package/dist/core/agents/rules/claim-conflict.d.ts +2 -6
- package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/claim-conflict.js +1 -1
- package/dist/core/agents/rules/commit-conflict.js +98 -22
- package/dist/core/agents/rules/stop-hook.d.ts +9 -9
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +23 -5
- package/dist/core/agents/rules/verdict.d.ts +14 -0
- package/dist/core/agents/rules/verdict.d.ts.map +1 -0
- package/dist/core/agents/rules/verdict.js +1 -0
- package/dist/core/agents/session-events.js +3 -3
- package/dist/core/agents/state/council.d.ts +1 -1
- package/dist/core/agents/state/council.js +1 -1
- package/dist/core/agents/state/heartbeat-projector.d.ts +3 -2
- package/dist/core/agents/state/heartbeat-projector.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-projector.js +14 -10
- package/dist/core/agents/state/heartbeat-writer.d.ts +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +12 -12
- package/dist/core/agents/state/{scratch.d.ts → journal.d.ts} +7 -7
- package/dist/core/agents/state/{scratch.d.ts.map → journal.d.ts.map} +1 -1
- package/dist/core/agents/state/{scratch.js → journal.js} +12 -12
- package/dist/core/agents/state/pidmap.d.ts +28 -4
- package/dist/core/agents/state/pidmap.d.ts.map +1 -1
- package/dist/core/agents/state/pidmap.js +130 -15
- package/dist/core/agents/state/proc-start.d.ts +95 -0
- package/dist/core/agents/state/proc-start.d.ts.map +1 -0
- package/dist/core/agents/state/proc-start.js +199 -0
- package/dist/core/agents/state/shell-mutation.d.ts +1 -1
- package/dist/core/agents/state/shell-mutation.js +1 -1
- package/dist/core/agents/state/stale-sweep.js +7 -7
- package/dist/core/artifacts/index.d.ts +86 -0
- package/dist/core/artifacts/index.d.ts.map +1 -0
- package/dist/core/artifacts/index.js +421 -0
- package/dist/core/config.d.ts +9 -2
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +26 -2
- package/dist/core/context/index.d.ts +12 -12
- package/dist/core/context/index.js +10 -10
- package/dist/core/governor/adapter-spread.d.ts +52 -0
- package/dist/core/governor/adapter-spread.d.ts.map +1 -0
- package/dist/core/governor/adapter-spread.js +52 -0
- package/dist/core/governor/index.d.ts +7 -0
- package/dist/core/governor/index.d.ts.map +1 -0
- package/dist/core/governor/index.js +6 -0
- package/dist/core/governor/plan-api.d.ts +38 -0
- package/dist/core/governor/plan-api.d.ts.map +1 -0
- package/dist/core/governor/plan-api.js +83 -0
- package/dist/core/governor/plan-read.d.ts +5 -0
- package/dist/core/governor/plan-read.d.ts.map +1 -0
- package/dist/core/{supervisor → governor}/plan-read.js +66 -52
- package/dist/core/{supervisor → governor}/plan-types.d.ts +57 -56
- package/dist/core/governor/plan-types.d.ts.map +1 -0
- package/dist/core/{supervisor → governor}/plan-types.js +4 -4
- package/dist/core/governor/planning.d.ts +48 -0
- package/dist/core/governor/planning.d.ts.map +1 -0
- package/dist/core/{supervisor → governor}/planning.js +125 -94
- package/dist/core/governor/read.d.ts +6 -0
- package/dist/core/governor/read.d.ts.map +1 -0
- package/dist/core/governor/read.js +4 -0
- package/dist/core/governor/runner.d.ts +37 -0
- package/dist/core/governor/runner.d.ts.map +1 -0
- package/dist/core/{supervisor → governor}/runner.js +15 -15
- package/dist/core/governor/service-read.d.ts +6 -0
- package/dist/core/governor/service-read.d.ts.map +1 -0
- package/dist/core/{supervisor → governor}/service-read.js +12 -12
- package/dist/core/governor/service.d.ts +114 -0
- package/dist/core/governor/service.d.ts.map +1 -0
- package/dist/core/{supervisor → governor}/service.js +57 -57
- package/dist/core/governor/state.d.ts +116 -0
- package/dist/core/governor/state.d.ts.map +1 -0
- package/dist/core/{supervisor → governor}/state.js +228 -108
- package/dist/core/hooks/adapter/detect.d.ts +9 -0
- package/dist/core/hooks/{harness → adapter}/detect.d.ts.map +1 -1
- package/dist/core/hooks/{harness → adapter}/detect.js +8 -8
- package/dist/core/hooks/{harness → adapter}/events.d.ts +15 -14
- package/dist/core/hooks/adapter/events.d.ts.map +1 -0
- package/dist/core/hooks/{harness → adapter}/events.js +5 -5
- package/dist/core/hooks/{harness → adapter}/output.d.ts +20 -14
- package/dist/core/hooks/adapter/output.d.ts.map +1 -0
- package/dist/core/hooks/{harness → adapter}/output.js +30 -22
- package/dist/core/hooks/{harness → adapter}/parse.d.ts +5 -5
- package/dist/core/hooks/{harness → adapter}/parse.d.ts.map +1 -1
- package/dist/core/hooks/{harness → adapter}/parse.js +4 -4
- package/dist/core/hooks/{harness → adapter}/wiring.d.ts +15 -15
- package/dist/core/hooks/{harness → adapter}/wiring.d.ts.map +1 -1
- package/dist/core/hooks/{harness → adapter}/wiring.js +13 -13
- package/dist/core/hooks/cli.d.ts +3 -3
- package/dist/core/hooks/cli.js +187 -162
- package/dist/core/hooks/effects/image-capture.d.ts +5 -5
- package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
- package/dist/core/hooks/effects/image-capture.js +3 -3
- package/dist/core/hooks/effects/index.d.ts +12 -12
- package/dist/core/hooks/effects/index.d.ts.map +1 -1
- package/dist/core/hooks/effects/index.js +19 -19
- package/dist/core/hooks/events/emit.d.ts +2 -2
- package/dist/core/hooks/events/emit.d.ts.map +1 -1
- package/dist/core/hooks/events/emit.js +1 -1
- package/dist/core/hooks/events/rotate.js +1 -1
- package/dist/core/hooks/events/schema.d.ts +13 -5
- package/dist/core/hooks/events/schema.d.ts.map +1 -1
- package/dist/core/hooks/guard-path.d.ts +2 -2
- package/dist/core/hooks/guard-path.js +2 -2
- package/dist/core/hooks/index.d.ts +1 -1
- package/dist/core/hooks/index.d.ts.map +1 -1
- package/dist/core/hooks/resolve/anchor.d.ts +14 -5
- package/dist/core/hooks/resolve/anchor.d.ts.map +1 -1
- package/dist/core/hooks/resolve/anchor.js +64 -7
- package/dist/core/hooks/resolve/coord-root.d.ts +16 -11
- package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
- package/dist/core/hooks/resolve/coord-root.js +18 -43
- package/dist/core/hooks/resolve/intent.js +1 -1
- package/dist/core/hooks/resolve/owner.d.ts +1 -1
- package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
- package/dist/core/hooks/resolve/owner.js +11 -5
- package/dist/core/{scratch → journal}/index.d.ts +25 -25
- package/dist/core/{scratch → journal}/index.d.ts.map +1 -1
- package/dist/core/{scratch → journal}/index.js +38 -38
- package/dist/core/policy/evaluate.d.ts +1 -1
- package/dist/core/policy/evaluate.d.ts.map +1 -1
- package/dist/core/policy/evaluate.js +7 -7
- package/dist/core/policy/types.d.ts +3 -3
- package/dist/core/policy/types.d.ts.map +1 -1
- package/dist/core/work/state.d.ts +12 -4
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +50 -17
- package/dist/core/workflow/adapters.d.ts +17 -0
- package/dist/core/workflow/adapters.d.ts.map +1 -0
- package/dist/core/workflow/adapters.js +21 -0
- package/dist/core/workflow/approvals.js +6 -6
- package/dist/core/workflow/billing.d.ts +9 -9
- package/dist/core/workflow/billing.js +9 -9
- package/dist/core/workflow/child-env.d.ts +10 -2
- package/dist/core/workflow/child-env.d.ts.map +1 -1
- package/dist/core/workflow/child-env.js +12 -4
- package/dist/core/workflow/engine.d.ts +15 -5
- package/dist/core/workflow/engine.d.ts.map +1 -1
- package/dist/core/workflow/engine.js +138 -83
- package/dist/core/workflow/evidence-preflight.d.ts +24 -0
- package/dist/core/workflow/evidence-preflight.d.ts.map +1 -0
- package/dist/core/workflow/evidence-preflight.js +134 -0
- package/dist/core/workflow/index.d.ts +1 -1
- package/dist/core/workflow/index.d.ts.map +1 -1
- package/dist/core/workflow/proof.d.ts +11 -5
- package/dist/core/workflow/proof.d.ts.map +1 -1
- package/dist/core/workflow/proof.js +45 -36
- package/dist/core/workflow/run-state.d.ts +1 -1
- package/dist/core/workflow/run-state.js +7 -7
- package/dist/core/workflow/sandbox-projection.d.ts +6 -6
- package/dist/core/workflow/sandbox-projection.d.ts.map +1 -1
- package/dist/core/workflow/sandbox-projection.js +11 -11
- package/dist/core/workflow/spawn-claude.d.ts +3 -3
- package/dist/core/workflow/spawn-claude.d.ts.map +1 -1
- package/dist/core/workflow/spawn-claude.js +9 -6
- package/dist/core/workflow/spawn-codex.d.ts +4 -4
- package/dist/core/workflow/spawn-codex.d.ts.map +1 -1
- package/dist/core/workflow/spawn-codex.js +9 -6
- package/dist/core/workflow/spawn-cursor.d.ts +4 -4
- package/dist/core/workflow/spawn-cursor.d.ts.map +1 -1
- package/dist/core/workflow/spawn-cursor.js +9 -6
- package/dist/core/workflow/spawn-failure.d.ts +1 -1
- package/dist/core/workflow/spawn-failure.js +1 -1
- package/dist/core/workflow/specialists.js +2 -2
- package/dist/core/workflow/{journal.d.ts → transcript.d.ts} +8 -8
- package/dist/core/workflow/transcript.d.ts.map +1 -0
- package/dist/core/workflow/{journal.js → transcript.js} +14 -14
- package/dist/core/workflow/types.d.ts +98 -51
- package/dist/core/workflow/types.d.ts.map +1 -1
- package/dist/core/workflow/types.js +11 -1
- package/dist/core/workflow/validate.d.ts +1 -1
- package/dist/core/workflow/validate.js +1 -1
- package/dist/core/workflow/workspaces/cancellation.js +2 -2
- package/dist/core/workflow/workspaces/cleanup.js +2 -2
- package/dist/core/workflow/workspaces/execution.js +6 -6
- package/dist/core/workflow/workspaces/inspect.js +9 -9
- package/dist/core/workflow/workspaces/integration.js +14 -14
- package/dist/core/workflow/workspaces/lifecycle.d.ts +1 -1
- package/dist/core/workflow/workspaces/lifecycle.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/lifecycle.js +9 -9
- package/dist/core/workflow/workspaces/local-git.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/local-git.js +39 -5
- package/dist/core/workflow/workspaces/recovery.js +3 -3
- package/dist/core/workflow/workspaces/state.d.ts +1 -1
- package/dist/core/workflow/workspaces/state.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/state.js +3 -3
- package/dist/core/workflow/workspaces/types.d.ts +1 -1
- package/dist/core/workflow/workspaces/types.d.ts.map +1 -1
- package/dist/lib/browser/asserts.d.ts +28 -0
- package/dist/lib/browser/asserts.d.ts.map +1 -0
- package/dist/lib/browser/asserts.js +152 -0
- package/dist/lib/browser/client.d.ts +49 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +155 -14
- package/dist/lib/browser/content-checks.d.ts +108 -0
- package/dist/lib/browser/content-checks.d.ts.map +1 -0
- package/dist/lib/browser/content-checks.js +474 -0
- package/dist/lib/browser/critique.d.ts +91 -0
- package/dist/lib/browser/critique.d.ts.map +1 -0
- package/dist/lib/browser/critique.js +167 -0
- package/dist/lib/browser/geometry.d.ts +32 -0
- package/dist/lib/browser/geometry.d.ts.map +1 -1
- package/dist/lib/browser/geometry.js +244 -1
- package/dist/lib/browser/index.d.ts +4 -1
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +2 -0
- package/dist/lib/claude-desktop.d.ts.map +1 -1
- package/dist/lib/claude-desktop.js +4 -1
- package/dist/lib/context/index.js +9 -2
- package/dist/lib/council/index.d.ts +6 -6
- package/dist/lib/council/index.d.ts.map +1 -1
- package/dist/lib/council/index.js +8 -8
- package/dist/lib/identities/assume.d.ts +2 -2
- package/dist/lib/identities/assume.js +7 -7
- package/dist/lib/instructions/apply.d.ts +3 -3
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +75 -27
- package/dist/lib/instructions/host-addendum.d.ts +54 -0
- package/dist/lib/instructions/host-addendum.d.ts.map +1 -0
- package/dist/lib/instructions/host-addendum.js +107 -0
- package/dist/lib/instructions/templates.d.ts +10 -3
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +41 -12
- package/dist/lib/machine.d.ts +2 -2
- package/dist/lib/machine.js +2 -2
- package/package.json +26 -21
- package/schemas/config.schema.json +26 -1
- package/src/commander.ts +22 -13
- package/src/commands/{harness.ts → adapter.ts} +46 -46
- package/src/commands/agents.ts +200 -78
- package/src/commands/artifacts.ts +168 -0
- package/src/commands/backup.ts +47 -33
- package/src/commands/browse.ts +438 -2
- package/src/commands/checkpoint.ts +196 -0
- package/src/commands/context.ts +3 -176
- package/src/commands/decision.ts +41 -7
- package/src/commands/deinit.ts +16 -16
- package/src/commands/doctor.ts +28 -28
- package/src/commands/{supervisor.ts → governor.ts} +184 -154
- package/src/commands/grep.ts +19 -2
- package/src/commands/init.ts +50 -34
- package/src/commands/{scratch.ts → journal.ts} +60 -60
- package/src/commands/policy.ts +1 -1
- package/src/commands/presence.ts +2 -2
- package/src/commands/sync.ts +3 -3
- package/src/commands/tunnel.ts +256 -38
- package/src/commands/web-fetch.ts +1 -1
- package/src/commands/web.ts +56 -1
- package/src/commands/work.ts +50 -35
- package/src/commands/workflow.ts +43 -34
- package/src/core/{harnesses → adapters}/attest-projection.ts +2 -2
- package/src/core/{harnesses → adapters}/attest.ts +27 -27
- package/src/core/{harnesses → adapters}/attestation.ts +41 -41
- package/src/core/{harnesses → adapters}/bench.ts +34 -43
- package/src/core/adapters/index.ts +56 -0
- package/src/core/{harnesses → adapters}/profiles.ts +16 -16
- package/src/core/{harnesses → adapters}/registry.ts +23 -23
- package/src/core/{harnesses → adapters}/types.ts +23 -23
- package/src/core/agents/canonical-emit.ts +16 -43
- package/src/core/agents/cli-emit.ts +1 -1
- package/src/core/agents/cli.ts +30 -28
- package/src/core/agents/codex-replay.ts +6 -6
- package/src/core/agents/coord-bin.ts +92 -0
- package/src/core/agents/coord-client.ts +302 -78
- package/src/core/agents/events/consume.ts +1 -1
- package/src/core/agents/events/emit.ts +7 -6
- package/src/core/agents/paths.ts +7 -11
- package/src/core/agents/render/prompt-context.ts +107 -31
- package/src/core/agents/render/session-context.ts +6 -6
- package/src/core/agents/rules/claim-conflict.ts +4 -7
- package/src/core/agents/rules/commit-conflict.ts +103 -22
- package/src/core/agents/rules/stop-hook.ts +33 -17
- package/src/core/agents/rules/verdict.ts +13 -0
- package/src/core/agents/session-events.ts +4 -4
- package/src/core/agents/state/council.ts +1 -1
- package/src/core/agents/state/heartbeat-projector.ts +16 -12
- package/src/core/agents/state/heartbeat-writer.ts +12 -12
- package/src/core/agents/state/{scratch.ts → journal.ts} +12 -12
- package/src/core/agents/state/pidmap.ts +130 -15
- package/src/core/agents/state/proc-start.ts +208 -0
- package/src/core/agents/state/shell-mutation.ts +1 -1
- package/src/core/agents/state/stale-sweep.ts +7 -7
- package/src/core/artifacts/index.ts +557 -0
- package/src/core/config.ts +30 -2
- package/src/core/context/index.ts +15 -15
- package/src/core/governor/adapter-spread.ts +82 -0
- package/src/core/governor/index.ts +91 -0
- package/src/core/governor/plan-api.ts +115 -0
- package/src/core/{supervisor → governor}/plan-read.ts +112 -97
- package/src/core/{supervisor → governor}/plan-types.ts +59 -56
- package/src/core/{supervisor → governor}/planning.ts +223 -192
- package/src/core/governor/read.ts +59 -0
- package/src/core/{supervisor → governor}/runner.ts +39 -39
- package/src/core/{supervisor → governor}/service-read.ts +22 -22
- package/src/core/{supervisor → governor}/service.ts +117 -119
- package/src/core/{supervisor → governor}/state.ts +325 -167
- package/src/core/hooks/adapter/detect.ts +30 -0
- package/src/core/hooks/{harness → adapter}/events.ts +16 -14
- package/src/core/hooks/{harness → adapter}/output.ts +31 -23
- package/src/core/hooks/{harness → adapter}/parse.ts +5 -5
- package/src/core/hooks/{harness → adapter}/wiring.ts +21 -21
- package/src/core/hooks/cli.ts +197 -173
- package/src/core/hooks/effects/image-capture.ts +6 -6
- package/src/core/hooks/effects/index.ts +19 -19
- package/src/core/hooks/events/emit.ts +3 -3
- package/src/core/hooks/events/rotate.ts +1 -1
- package/src/core/hooks/events/schema.ts +15 -7
- package/src/core/hooks/guard-path.ts +2 -2
- package/src/core/hooks/index.ts +1 -1
- package/src/core/hooks/resolve/anchor.ts +63 -8
- package/src/core/hooks/resolve/coord-root.ts +18 -40
- package/src/core/hooks/resolve/intent.ts +1 -1
- package/src/core/hooks/resolve/owner.ts +11 -5
- package/src/core/{scratch → journal}/index.ts +53 -53
- package/src/core/policy/evaluate.ts +8 -8
- package/src/core/policy/types.ts +3 -3
- package/src/core/work/state.ts +65 -23
- package/src/core/workflow/adapters.ts +33 -0
- package/src/core/workflow/approvals.ts +7 -7
- package/src/core/workflow/billing.ts +12 -12
- package/src/core/workflow/child-env.ts +13 -4
- package/src/core/workflow/engine.ts +155 -90
- package/src/core/workflow/evidence-preflight.ts +165 -0
- package/src/core/workflow/index.ts +3 -3
- package/src/core/workflow/proof.ts +60 -50
- package/src/core/workflow/run-state.ts +7 -7
- package/src/core/workflow/sandbox-projection.ts +16 -16
- package/src/core/workflow/spawn-claude.ts +13 -10
- package/src/core/workflow/spawn-codex.ts +13 -10
- package/src/core/workflow/spawn-cursor.ts +13 -10
- package/src/core/workflow/spawn-failure.ts +1 -1
- package/src/core/workflow/specialists.ts +2 -2
- package/src/core/workflow/{journal.ts → transcript.ts} +16 -16
- package/src/core/workflow/types.ts +108 -51
- package/src/core/workflow/validate.ts +1 -1
- package/src/core/workflow/workspaces/cancellation.ts +2 -2
- package/src/core/workflow/workspaces/cleanup.ts +2 -2
- package/src/core/workflow/workspaces/execution.ts +6 -6
- package/src/core/workflow/workspaces/inspect.ts +14 -11
- package/src/core/workflow/workspaces/integration.ts +18 -14
- package/src/core/workflow/workspaces/lifecycle.ts +10 -10
- package/src/core/workflow/workspaces/local-git.ts +47 -5
- package/src/core/workflow/workspaces/recovery.ts +3 -3
- package/src/core/workflow/workspaces/state.ts +4 -3
- package/src/core/workflow/workspaces/types.ts +1 -1
- package/src/lib/browser/asserts.ts +177 -0
- package/src/lib/browser/client.ts +189 -14
- package/src/lib/browser/content-checks.ts +571 -0
- package/src/lib/browser/critique.ts +231 -0
- package/src/lib/browser/geometry.ts +297 -1
- package/src/lib/browser/index.ts +34 -0
- package/src/lib/claude-desktop.ts +4 -1
- package/src/lib/context/index.ts +11 -1
- package/src/lib/council/index.ts +9 -9
- package/src/lib/identities/assume.ts +7 -7
- package/src/lib/instructions/apply.ts +87 -25
- package/src/lib/instructions/host-addendum.ts +126 -0
- package/src/lib/instructions/templates.ts +44 -15
- package/src/lib/machine.ts +2 -2
- package/dist/commands/harness.d.ts +0 -12
- package/dist/commands/harness.d.ts.map +0 -1
- package/dist/commands/scratch.d.ts +0 -4
- package/dist/commands/scratch.d.ts.map +0 -1
- package/dist/commands/session.d.ts.map +0 -1
- package/dist/commands/session.js +0 -162
- package/dist/commands/supervisor.d.ts +0 -4
- package/dist/commands/supervisor.d.ts.map +0 -1
- package/dist/core/harnesses/attest-projection.d.ts.map +0 -1
- package/dist/core/harnesses/attest.d.ts.map +0 -1
- package/dist/core/harnesses/attestation.d.ts.map +0 -1
- package/dist/core/harnesses/bench.d.ts.map +0 -1
- package/dist/core/harnesses/index.d.ts +0 -13
- package/dist/core/harnesses/index.d.ts.map +0 -1
- package/dist/core/harnesses/index.js +0 -6
- package/dist/core/harnesses/profiles.d.ts.map +0 -1
- package/dist/core/harnesses/registry.d.ts +0 -15
- package/dist/core/harnesses/registry.d.ts.map +0 -1
- package/dist/core/harnesses/types.d.ts.map +0 -1
- package/dist/core/hooks/harness/detect.d.ts +0 -9
- package/dist/core/hooks/harness/events.d.ts.map +0 -1
- package/dist/core/hooks/harness/output.d.ts.map +0 -1
- package/dist/core/supervisor/index.d.ts +0 -7
- package/dist/core/supervisor/index.d.ts.map +0 -1
- package/dist/core/supervisor/index.js +0 -6
- package/dist/core/supervisor/plan-api.d.ts +0 -23
- package/dist/core/supervisor/plan-api.d.ts.map +0 -1
- package/dist/core/supervisor/plan-api.js +0 -50
- package/dist/core/supervisor/plan-read.d.ts +0 -5
- package/dist/core/supervisor/plan-read.d.ts.map +0 -1
- package/dist/core/supervisor/plan-types.d.ts.map +0 -1
- package/dist/core/supervisor/planning.d.ts +0 -33
- package/dist/core/supervisor/planning.d.ts.map +0 -1
- package/dist/core/supervisor/read.d.ts +0 -6
- package/dist/core/supervisor/read.d.ts.map +0 -1
- package/dist/core/supervisor/read.js +0 -4
- package/dist/core/supervisor/runner.d.ts +0 -37
- package/dist/core/supervisor/runner.d.ts.map +0 -1
- package/dist/core/supervisor/service-read.d.ts +0 -6
- package/dist/core/supervisor/service-read.d.ts.map +0 -1
- package/dist/core/supervisor/service.d.ts +0 -114
- package/dist/core/supervisor/service.d.ts.map +0 -1
- package/dist/core/supervisor/state.d.ts +0 -95
- package/dist/core/supervisor/state.d.ts.map +0 -1
- package/dist/core/workflow/harnesses.d.ts +0 -17
- package/dist/core/workflow/harnesses.d.ts.map +0 -1
- package/dist/core/workflow/harnesses.js +0 -21
- package/dist/core/workflow/journal.d.ts.map +0 -1
- package/src/commands/session.ts +0 -187
- package/src/core/harnesses/index.ts +0 -56
- package/src/core/hooks/harness/detect.ts +0 -30
- package/src/core/supervisor/index.ts +0 -89
- package/src/core/supervisor/plan-api.ts +0 -73
- package/src/core/supervisor/read.ts +0 -59
- package/src/core/workflow/harnesses.ts +0 -33
- /package/dist/core/{harnesses → adapters}/attest-projection.js +0 -0
|
@@ -18,20 +18,20 @@ import { hostname } from "node:os";
|
|
|
18
18
|
import { dirname, join, resolve } from "node:path";
|
|
19
19
|
import { type NormalizedPolicy, normalizePolicy, type PolicyIsolation } from "../policy/index.ts";
|
|
20
20
|
import type { RunWorkItemInput } from "../work/index.ts";
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
21
|
+
import { type GovernorRunReport, type GovernorStopReason, runGovernor } from "./runner.ts";
|
|
22
|
+
import { type GovernorRecord, readGovernor } from "./state.ts";
|
|
23
23
|
|
|
24
|
-
export const
|
|
25
|
-
export const
|
|
26
|
-
export const
|
|
24
|
+
export const GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION = 1 as const;
|
|
25
|
+
export const GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION = 1 as const;
|
|
26
|
+
export const GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION = 1 as const;
|
|
27
27
|
|
|
28
28
|
const MAX_FILE_BYTES = 512 * 1024;
|
|
29
29
|
const MAX_GOALS = 100;
|
|
30
30
|
const MAX_ERROR = 2_000;
|
|
31
31
|
const FOREIGN_STATUS_STALE_MS = 30_000;
|
|
32
32
|
|
|
33
|
-
export interface
|
|
34
|
-
|
|
33
|
+
export interface GovernorServiceEngineConfig {
|
|
34
|
+
default_adapter?: string;
|
|
35
35
|
cwd?: string;
|
|
36
36
|
subscription_only: boolean;
|
|
37
37
|
allow_api_billing: boolean;
|
|
@@ -40,54 +40,54 @@ export interface SupervisorServiceEngineConfig {
|
|
|
40
40
|
approval_addressee?: string;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
export interface
|
|
44
|
-
schema_version: typeof
|
|
43
|
+
export interface GovernorServiceConfig {
|
|
44
|
+
schema_version: typeof GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION;
|
|
45
45
|
goal_ids: string[];
|
|
46
46
|
wake_interval_ms: number;
|
|
47
47
|
heartbeat_interval_ms: number;
|
|
48
48
|
error_backoff_base_ms: number;
|
|
49
49
|
error_backoff_max_ms: number;
|
|
50
|
-
engine:
|
|
50
|
+
engine: GovernorServiceEngineConfig;
|
|
51
51
|
created_at: string;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
export interface
|
|
54
|
+
export interface ConfigureGovernorServiceInput {
|
|
55
55
|
coordRoot: string;
|
|
56
56
|
goalIds: readonly string[];
|
|
57
57
|
wakeIntervalMs?: number;
|
|
58
58
|
heartbeatIntervalMs?: number;
|
|
59
59
|
errorBackoffBaseMs?: number;
|
|
60
60
|
errorBackoffMaxMs?: number;
|
|
61
|
-
engine?: Partial<
|
|
61
|
+
engine?: Partial<GovernorServiceEngineConfig>;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
export type
|
|
64
|
+
export type GovernorServiceGoalState = "idle" | "backoff" | "awaiting_change";
|
|
65
65
|
|
|
66
|
-
export interface
|
|
67
|
-
state:
|
|
66
|
+
export interface GovernorServiceGoalRuntime {
|
|
67
|
+
state: GovernorServiceGoalState;
|
|
68
68
|
consecutive_errors: number;
|
|
69
69
|
observed_fingerprint?: string;
|
|
70
70
|
next_wake_at?: string;
|
|
71
71
|
last_tick_at?: string;
|
|
72
|
-
last_stop_reason?:
|
|
72
|
+
last_stop_reason?: GovernorStopReason;
|
|
73
73
|
last_error?: string;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
export interface
|
|
77
|
-
schema_version: typeof
|
|
76
|
+
export interface GovernorServiceRuntime {
|
|
77
|
+
schema_version: typeof GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION;
|
|
78
78
|
config_created_at: string;
|
|
79
79
|
updated_at: string;
|
|
80
|
-
goals: Record<string,
|
|
80
|
+
goals: Record<string, GovernorServiceGoalRuntime>;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
export type
|
|
83
|
+
export type GovernorServiceProcessState = "starting" | "running" | "stopping" | "stopped";
|
|
84
84
|
|
|
85
|
-
export interface
|
|
86
|
-
schema_version: typeof
|
|
85
|
+
export interface GovernorServiceStatusRecord {
|
|
86
|
+
schema_version: typeof GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION;
|
|
87
87
|
pid: number;
|
|
88
88
|
host: string;
|
|
89
89
|
nonce: string;
|
|
90
|
-
state:
|
|
90
|
+
state: GovernorServiceProcessState;
|
|
91
91
|
started_at: string;
|
|
92
92
|
heartbeat_at: string;
|
|
93
93
|
config_created_at: string;
|
|
@@ -99,40 +99,40 @@ export interface SupervisorServiceStatusRecord {
|
|
|
99
99
|
stopped_at?: string;
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
export interface
|
|
102
|
+
export interface GovernorServiceStatus {
|
|
103
103
|
running: boolean;
|
|
104
104
|
stale: boolean;
|
|
105
|
-
record?:
|
|
106
|
-
config?:
|
|
107
|
-
runtime?:
|
|
105
|
+
record?: GovernorServiceStatusRecord;
|
|
106
|
+
config?: GovernorServiceConfig;
|
|
107
|
+
runtime?: GovernorServiceRuntime;
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
export interface
|
|
110
|
+
export interface GovernorServiceSweepOutcome {
|
|
111
111
|
goal_id: string;
|
|
112
112
|
action: "tick" | "skip" | "backoff";
|
|
113
113
|
reason: string;
|
|
114
|
-
stop_reason?:
|
|
114
|
+
stop_reason?: GovernorStopReason;
|
|
115
115
|
next_wake_at?: string;
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
export interface
|
|
118
|
+
export interface GovernorServiceSweepReport {
|
|
119
119
|
started_at: string;
|
|
120
120
|
ended_at: string;
|
|
121
|
-
outcomes:
|
|
121
|
+
outcomes: GovernorServiceSweepOutcome[];
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
-
export interface
|
|
124
|
+
export interface RunGovernorServiceSweepInput {
|
|
125
125
|
coordRoot: string;
|
|
126
|
-
config:
|
|
126
|
+
config: GovernorServiceConfig;
|
|
127
127
|
engine?: Omit<RunWorkItemInput["engine"], "maxAgents" | "concurrency" | "specialists">;
|
|
128
128
|
actor?: string;
|
|
129
129
|
now?: () => number;
|
|
130
|
-
readGoal?: (coordRoot: string, goalId: string) =>
|
|
131
|
-
runGoal?: (goalId: string) => Promise<
|
|
130
|
+
readGoal?: (coordRoot: string, goalId: string) => GovernorRecord;
|
|
131
|
+
runGoal?: (goalId: string) => Promise<GovernorRunReport>;
|
|
132
132
|
onGoalStart?: (goalId: string) => void;
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
-
export interface
|
|
135
|
+
export interface RunGovernorServiceDaemonInput {
|
|
136
136
|
coordRoot: string;
|
|
137
137
|
engine: Omit<RunWorkItemInput["engine"], "maxAgents" | "concurrency" | "specialists">;
|
|
138
138
|
actor?: string;
|
|
@@ -147,19 +147,19 @@ interface ServiceLease {
|
|
|
147
147
|
created_at: string;
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
-
export function
|
|
151
|
-
input:
|
|
152
|
-
):
|
|
150
|
+
export function configureGovernorService(
|
|
151
|
+
input: ConfigureGovernorServiceInput,
|
|
152
|
+
): GovernorServiceConfig {
|
|
153
153
|
const coordRoot = resolve(input.coordRoot);
|
|
154
154
|
const active = readStatusRecord(coordRoot);
|
|
155
155
|
if (active && statusOwnerIsLive(active)) {
|
|
156
|
-
throw new Error(`stop
|
|
156
|
+
throw new Error(`stop governor service pid ${active.pid} before changing its configuration`);
|
|
157
157
|
}
|
|
158
158
|
const goalIds = unique(input.goalIds.map((value) => value.trim()).filter(Boolean));
|
|
159
159
|
if (goalIds.length < 1 || goalIds.length > MAX_GOALS) {
|
|
160
|
-
throw new Error(`
|
|
160
|
+
throw new Error(`governor service requires from 1 to ${MAX_GOALS} unique goal ids`);
|
|
161
161
|
}
|
|
162
|
-
for (const goalId of goalIds)
|
|
162
|
+
for (const goalId of goalIds) readGovernor(coordRoot, goalId);
|
|
163
163
|
const wakeIntervalMs = positive(
|
|
164
164
|
input.wakeIntervalMs ?? 5_000,
|
|
165
165
|
"service wake_interval_ms",
|
|
@@ -183,8 +183,8 @@ export function configureSupervisorService(
|
|
|
183
183
|
if (errorBackoffMaxMs < errorBackoffBaseMs) {
|
|
184
184
|
throw new Error("service error_backoff_max_ms must be at least error_backoff_base_ms");
|
|
185
185
|
}
|
|
186
|
-
const config:
|
|
187
|
-
schema_version:
|
|
186
|
+
const config: GovernorServiceConfig = {
|
|
187
|
+
schema_version: GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION,
|
|
188
188
|
goal_ids: goalIds,
|
|
189
189
|
wake_interval_ms: wakeIntervalMs,
|
|
190
190
|
heartbeat_interval_ms: heartbeatIntervalMs,
|
|
@@ -197,53 +197,53 @@ export function configureSupervisorService(
|
|
|
197
197
|
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
198
198
|
chmodSync(dir, 0o700);
|
|
199
199
|
writePrivateJsonAtomic(serviceConfigPath(coordRoot), config);
|
|
200
|
-
return
|
|
200
|
+
return readGovernorServiceConfig(coordRoot);
|
|
201
201
|
}
|
|
202
202
|
|
|
203
|
-
export function
|
|
203
|
+
export function readGovernorServiceConfig(coordRootRaw: string): GovernorServiceConfig {
|
|
204
204
|
const coordRoot = resolve(coordRootRaw);
|
|
205
|
-
const config = readBoundedJson<
|
|
205
|
+
const config = readBoundedJson<GovernorServiceConfig>(
|
|
206
206
|
serviceConfigPath(coordRoot),
|
|
207
|
-
"
|
|
207
|
+
"governor service configuration",
|
|
208
208
|
);
|
|
209
209
|
validateConfig(coordRoot, config);
|
|
210
210
|
return config;
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
-
export function
|
|
213
|
+
export function readGovernorServiceRuntime(
|
|
214
214
|
coordRootRaw: string,
|
|
215
|
-
):
|
|
215
|
+
): GovernorServiceRuntime | undefined {
|
|
216
216
|
const coordRoot = resolve(coordRootRaw);
|
|
217
217
|
if (!existsSync(serviceRuntimePath(coordRoot))) return undefined;
|
|
218
|
-
const runtime = readBoundedJson<
|
|
218
|
+
const runtime = readBoundedJson<GovernorServiceRuntime>(
|
|
219
219
|
serviceRuntimePath(coordRoot),
|
|
220
|
-
"
|
|
220
|
+
"governor service runtime",
|
|
221
221
|
);
|
|
222
222
|
if (
|
|
223
|
-
runtime.schema_version !==
|
|
223
|
+
runtime.schema_version !== GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION ||
|
|
224
224
|
!validTimestamp(runtime.config_created_at) ||
|
|
225
225
|
!validTimestamp(runtime.updated_at) ||
|
|
226
226
|
!runtime.goals ||
|
|
227
227
|
typeof runtime.goals !== "object" ||
|
|
228
228
|
Array.isArray(runtime.goals)
|
|
229
229
|
) {
|
|
230
|
-
throw new Error("
|
|
230
|
+
throw new Error("governor service runtime has an unsupported schema");
|
|
231
231
|
}
|
|
232
232
|
return runtime;
|
|
233
233
|
}
|
|
234
234
|
|
|
235
|
-
export function
|
|
235
|
+
export function readGovernorServiceStatus(coordRootRaw: string): GovernorServiceStatus {
|
|
236
236
|
const coordRoot = resolve(coordRootRaw);
|
|
237
237
|
const record = readStatusRecord(coordRoot);
|
|
238
|
-
let config:
|
|
239
|
-
let runtime:
|
|
238
|
+
let config: GovernorServiceConfig | undefined;
|
|
239
|
+
let runtime: GovernorServiceRuntime | undefined;
|
|
240
240
|
try {
|
|
241
|
-
config =
|
|
241
|
+
config = readGovernorServiceConfig(coordRoot);
|
|
242
242
|
} catch {
|
|
243
243
|
// A service has no usable configuration until explicitly configured.
|
|
244
244
|
}
|
|
245
245
|
try {
|
|
246
|
-
runtime =
|
|
246
|
+
runtime = readGovernorServiceRuntime(coordRoot);
|
|
247
247
|
} catch {
|
|
248
248
|
// Status remains readable when recoverable runtime state is corrupt.
|
|
249
249
|
}
|
|
@@ -252,14 +252,12 @@ export function readSupervisorServiceStatus(coordRootRaw: string): SupervisorSer
|
|
|
252
252
|
return { running, stale: !running && record.state !== "stopped", record, config, runtime };
|
|
253
253
|
}
|
|
254
254
|
|
|
255
|
-
export async function
|
|
256
|
-
coordRootRaw: string,
|
|
257
|
-
): Promise<SupervisorServiceStatus> {
|
|
255
|
+
export async function spawnGovernorService(coordRootRaw: string): Promise<GovernorServiceStatus> {
|
|
258
256
|
const coordRoot = resolve(coordRootRaw);
|
|
259
|
-
|
|
260
|
-
const current =
|
|
257
|
+
readGovernorServiceConfig(coordRoot);
|
|
258
|
+
const current = readGovernorServiceStatus(coordRoot);
|
|
261
259
|
if (current.running) {
|
|
262
|
-
throw new Error(`
|
|
260
|
+
throw new Error(`governor service is already running under pid ${current.record?.pid}`);
|
|
263
261
|
}
|
|
264
262
|
mkdirSync(serviceDir(coordRoot), { recursive: true, mode: 0o700 });
|
|
265
263
|
const logFd = openSync(serviceLogPath(coordRoot), "a", 0o600);
|
|
@@ -270,7 +268,7 @@ export async function spawnSupervisorService(
|
|
|
270
268
|
throw new Error(`cannot find harn executable at ${harnBin}`);
|
|
271
269
|
}
|
|
272
270
|
let spawnError: Error | undefined;
|
|
273
|
-
const child = spawn(harnBin, ["
|
|
271
|
+
const child = spawn(harnBin, ["governor", "service", "daemon"], {
|
|
274
272
|
cwd: coordRoot,
|
|
275
273
|
detached: true,
|
|
276
274
|
stdio: ["ignore", logFd, logFd],
|
|
@@ -289,16 +287,16 @@ export async function spawnSupervisorService(
|
|
|
289
287
|
while (Date.now() < deadline) {
|
|
290
288
|
await delay(50);
|
|
291
289
|
if (spawnError) throw spawnError;
|
|
292
|
-
const status =
|
|
290
|
+
const status = readGovernorServiceStatus(coordRoot);
|
|
293
291
|
if (status.running && status.record?.pid === child.pid) return status;
|
|
294
292
|
if (child.exitCode !== null) break;
|
|
295
293
|
}
|
|
296
|
-
throw new Error(`
|
|
294
|
+
throw new Error(`governor service failed to start; inspect ${serviceLogPath(coordRoot)}`);
|
|
297
295
|
}
|
|
298
296
|
|
|
299
|
-
export function
|
|
297
|
+
export function requestGovernorServiceStop(coordRootRaw: string): GovernorServiceStatus {
|
|
300
298
|
const coordRoot = resolve(coordRootRaw);
|
|
301
|
-
const status =
|
|
299
|
+
const status = readGovernorServiceStatus(coordRoot);
|
|
302
300
|
if (!status.running || !status.record) return status;
|
|
303
301
|
writePrivateJsonAtomic(serviceStopPath(coordRoot), {
|
|
304
302
|
requested_at: new Date().toISOString(),
|
|
@@ -311,27 +309,27 @@ export function requestSupervisorServiceStop(coordRootRaw: string): SupervisorSe
|
|
|
311
309
|
// The durable stop request remains for a racing or restarted daemon.
|
|
312
310
|
}
|
|
313
311
|
}
|
|
314
|
-
return
|
|
312
|
+
return readGovernorServiceStatus(coordRoot);
|
|
315
313
|
}
|
|
316
314
|
|
|
317
|
-
export async function
|
|
318
|
-
input:
|
|
319
|
-
): Promise<
|
|
315
|
+
export async function runGovernorServiceSweep(
|
|
316
|
+
input: RunGovernorServiceSweepInput,
|
|
317
|
+
): Promise<GovernorServiceSweepReport> {
|
|
320
318
|
const coordRoot = resolve(input.coordRoot);
|
|
321
319
|
const now = input.now ?? Date.now;
|
|
322
|
-
const readGoal = input.readGoal ??
|
|
320
|
+
const readGoal = input.readGoal ?? readGovernor;
|
|
323
321
|
const runtime = runtimeForConfig(coordRoot, input.config, now());
|
|
324
322
|
const startedAt = new Date(now()).toISOString();
|
|
325
|
-
const outcomes:
|
|
323
|
+
const outcomes: GovernorServiceSweepOutcome[] = [];
|
|
326
324
|
const runGoal =
|
|
327
325
|
input.runGoal ??
|
|
328
326
|
(async (goalId: string) => {
|
|
329
|
-
if (!input.engine) throw new Error("
|
|
330
|
-
return await
|
|
327
|
+
if (!input.engine) throw new Error("governor service sweep requires an engine");
|
|
328
|
+
return await runGovernor({
|
|
331
329
|
coordRoot,
|
|
332
330
|
goalId,
|
|
333
331
|
mode: "tick",
|
|
334
|
-
actor: input.actor ?? "
|
|
332
|
+
actor: input.actor ?? "governor-service",
|
|
335
333
|
engine: input.engine,
|
|
336
334
|
});
|
|
337
335
|
});
|
|
@@ -454,16 +452,16 @@ export async function runSupervisorServiceSweep(
|
|
|
454
452
|
return { started_at: startedAt, ended_at: endedAt, outcomes };
|
|
455
453
|
}
|
|
456
454
|
|
|
457
|
-
export async function
|
|
458
|
-
input:
|
|
459
|
-
): Promise<
|
|
455
|
+
export async function runGovernorServiceDaemon(
|
|
456
|
+
input: RunGovernorServiceDaemonInput,
|
|
457
|
+
): Promise<GovernorServiceStatusRecord> {
|
|
460
458
|
const coordRoot = resolve(input.coordRoot);
|
|
461
|
-
const config =
|
|
459
|
+
const config = readGovernorServiceConfig(coordRoot);
|
|
462
460
|
const release = acquireServiceLease(coordRoot);
|
|
463
461
|
rmSync(serviceStopPath(coordRoot), { force: true });
|
|
464
462
|
const now = new Date().toISOString();
|
|
465
|
-
const status:
|
|
466
|
-
schema_version:
|
|
463
|
+
const status: GovernorServiceStatusRecord = {
|
|
464
|
+
schema_version: GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION,
|
|
467
465
|
pid: process.pid,
|
|
468
466
|
host: hostname(),
|
|
469
467
|
nonce: randomUUID(),
|
|
@@ -494,19 +492,19 @@ export async function runSupervisorServiceDaemon(
|
|
|
494
492
|
goals: config.goal_ids,
|
|
495
493
|
config_created_at: config.created_at,
|
|
496
494
|
});
|
|
497
|
-
log(`
|
|
495
|
+
log(`governor service started for ${config.goal_ids.length} goal(s)`);
|
|
498
496
|
const heartbeat = setInterval(() => {
|
|
499
497
|
try {
|
|
500
498
|
writeStatus();
|
|
501
499
|
} catch (error) {
|
|
502
|
-
log(`
|
|
500
|
+
log(`governor service heartbeat error: ${boundedError((error as Error).message)}`);
|
|
503
501
|
}
|
|
504
502
|
}, config.heartbeat_interval_ms);
|
|
505
503
|
try {
|
|
506
504
|
while (!stopRequested && !existsSync(serviceStopPath(coordRoot))) {
|
|
507
505
|
let sleepMs = config.wake_interval_ms;
|
|
508
506
|
try {
|
|
509
|
-
const report = await
|
|
507
|
+
const report = await runGovernorServiceSweep({
|
|
510
508
|
coordRoot,
|
|
511
509
|
config,
|
|
512
510
|
engine: input.engine,
|
|
@@ -534,7 +532,7 @@ export async function runSupervisorServiceDaemon(
|
|
|
534
532
|
event: "service.sweep_error",
|
|
535
533
|
error: status.last_error,
|
|
536
534
|
});
|
|
537
|
-
log(`
|
|
535
|
+
log(`governor service sweep error: ${status.last_error}`);
|
|
538
536
|
}
|
|
539
537
|
if (input.maxSweeps !== undefined && status.sweep_count >= input.maxSweeps) break;
|
|
540
538
|
if (!stopRequested && !existsSync(serviceStopPath(coordRoot))) {
|
|
@@ -563,18 +561,18 @@ export async function runSupervisorServiceDaemon(
|
|
|
563
561
|
return status;
|
|
564
562
|
}
|
|
565
563
|
|
|
566
|
-
export function
|
|
564
|
+
export function governorServiceLogPath(coordRoot: string): string {
|
|
567
565
|
return serviceLogPath(resolve(coordRoot));
|
|
568
566
|
}
|
|
569
567
|
|
|
570
568
|
function runtimeForConfig(
|
|
571
569
|
coordRoot: string,
|
|
572
|
-
config:
|
|
570
|
+
config: GovernorServiceConfig,
|
|
573
571
|
timestamp: number,
|
|
574
|
-
):
|
|
575
|
-
let existing:
|
|
572
|
+
): GovernorServiceRuntime {
|
|
573
|
+
let existing: GovernorServiceRuntime | undefined;
|
|
576
574
|
try {
|
|
577
|
-
existing =
|
|
575
|
+
existing = readGovernorServiceRuntime(coordRoot);
|
|
578
576
|
} catch {
|
|
579
577
|
// Runtime is a recoverable scheduling hint; durable goal state remains authoritative.
|
|
580
578
|
}
|
|
@@ -585,31 +583,31 @@ function runtimeForConfig(
|
|
|
585
583
|
return { ...existing, goals };
|
|
586
584
|
}
|
|
587
585
|
return {
|
|
588
|
-
schema_version:
|
|
586
|
+
schema_version: GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION,
|
|
589
587
|
config_created_at: config.created_at,
|
|
590
588
|
updated_at: new Date(timestamp).toISOString(),
|
|
591
589
|
goals: Object.fromEntries(config.goal_ids.map((goalId) => [goalId, emptyGoalRuntime()])),
|
|
592
590
|
};
|
|
593
591
|
}
|
|
594
592
|
|
|
595
|
-
function emptyGoalRuntime():
|
|
593
|
+
function emptyGoalRuntime(): GovernorServiceGoalRuntime {
|
|
596
594
|
return { state: "idle", consecutive_errors: 0 };
|
|
597
595
|
}
|
|
598
596
|
|
|
599
597
|
function persistRuntime(
|
|
600
598
|
coordRoot: string,
|
|
601
|
-
runtime:
|
|
599
|
+
runtime: GovernorServiceRuntime,
|
|
602
600
|
timestamp: number,
|
|
603
601
|
): void {
|
|
604
602
|
runtime.updated_at = new Date(timestamp).toISOString();
|
|
605
603
|
writePrivateJsonAtomic(serviceRuntimePath(coordRoot), runtime);
|
|
606
604
|
}
|
|
607
605
|
|
|
608
|
-
function goalFingerprint(record:
|
|
606
|
+
function goalFingerprint(record: GovernorRecord): string {
|
|
609
607
|
return projectionFingerprint(record.projection);
|
|
610
608
|
}
|
|
611
609
|
|
|
612
|
-
function projectionFingerprint(projection:
|
|
610
|
+
function projectionFingerprint(projection: GovernorRecord["projection"]): string {
|
|
613
611
|
return JSON.stringify([
|
|
614
612
|
projection.state,
|
|
615
613
|
projection.next_action,
|
|
@@ -637,10 +635,10 @@ function wakeDue(value: string | undefined, now: number): boolean {
|
|
|
637
635
|
|
|
638
636
|
function normalizeEngineConfig(
|
|
639
637
|
coordRoot: string,
|
|
640
|
-
input: Partial<
|
|
641
|
-
):
|
|
638
|
+
input: Partial<GovernorServiceEngineConfig> | undefined,
|
|
639
|
+
): GovernorServiceEngineConfig {
|
|
642
640
|
return {
|
|
643
|
-
|
|
641
|
+
default_adapter: optionalBounded(input?.default_adapter, "default_adapter", 100),
|
|
644
642
|
cwd: input?.cwd ? resolve(input.cwd) : coordRoot,
|
|
645
643
|
subscription_only: bool(input?.subscription_only ?? false, "subscription_only"),
|
|
646
644
|
allow_api_billing: bool(input?.allow_api_billing ?? false, "allow_api_billing"),
|
|
@@ -650,16 +648,16 @@ function normalizeEngineConfig(
|
|
|
650
648
|
};
|
|
651
649
|
}
|
|
652
650
|
|
|
653
|
-
function validateConfig(coordRoot: string, config:
|
|
651
|
+
function validateConfig(coordRoot: string, config: GovernorServiceConfig): void {
|
|
654
652
|
if (
|
|
655
|
-
config.schema_version !==
|
|
653
|
+
config.schema_version !== GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION ||
|
|
656
654
|
!validTimestamp(config.created_at) ||
|
|
657
655
|
!Array.isArray(config.goal_ids)
|
|
658
656
|
) {
|
|
659
|
-
throw new Error("
|
|
657
|
+
throw new Error("governor service configuration has an unsupported schema");
|
|
660
658
|
}
|
|
661
|
-
const normalized:
|
|
662
|
-
schema_version:
|
|
659
|
+
const normalized: GovernorServiceConfig = {
|
|
660
|
+
schema_version: GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION,
|
|
663
661
|
goal_ids: unique(config.goal_ids.map((goalId) => goalId.trim()).filter(Boolean)),
|
|
664
662
|
wake_interval_ms: positive(
|
|
665
663
|
config.wake_interval_ms,
|
|
@@ -690,7 +688,7 @@ function validateConfig(coordRoot: string, config: SupervisorServiceConfig): voi
|
|
|
690
688
|
normalized.error_backoff_max_ms < normalized.error_backoff_base_ms ||
|
|
691
689
|
JSON.stringify(normalized) !== JSON.stringify(config)
|
|
692
690
|
) {
|
|
693
|
-
throw new Error("
|
|
691
|
+
throw new Error("governor service configuration is not canonical");
|
|
694
692
|
}
|
|
695
693
|
}
|
|
696
694
|
|
|
@@ -728,10 +726,10 @@ function acquireServiceLease(coordRoot: string): () => void {
|
|
|
728
726
|
if (!acquire()) {
|
|
729
727
|
const existing = readLease(path);
|
|
730
728
|
if (existing && leaseOwnerIsLive(existing)) {
|
|
731
|
-
throw new Error(`
|
|
729
|
+
throw new Error(`governor service is already running under pid ${existing.pid}`);
|
|
732
730
|
}
|
|
733
731
|
unlinkSync(path);
|
|
734
|
-
if (!acquire()) throw new Error("
|
|
732
|
+
if (!acquire()) throw new Error("governor service lease raced with another process");
|
|
735
733
|
}
|
|
736
734
|
return () => {
|
|
737
735
|
try {
|
|
@@ -766,15 +764,15 @@ function leaseOwnerIsLive(lease: ServiceLease): boolean {
|
|
|
766
764
|
return pidAlive(lease.pid);
|
|
767
765
|
}
|
|
768
766
|
|
|
769
|
-
function readStatusRecord(coordRoot: string):
|
|
767
|
+
function readStatusRecord(coordRoot: string): GovernorServiceStatusRecord | undefined {
|
|
770
768
|
if (!existsSync(serviceStatusPath(coordRoot))) return undefined;
|
|
771
769
|
try {
|
|
772
|
-
const value = readBoundedJson<
|
|
770
|
+
const value = readBoundedJson<GovernorServiceStatusRecord>(
|
|
773
771
|
serviceStatusPath(coordRoot),
|
|
774
|
-
"
|
|
772
|
+
"governor service status",
|
|
775
773
|
);
|
|
776
774
|
if (
|
|
777
|
-
value.schema_version !==
|
|
775
|
+
value.schema_version !== GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION ||
|
|
778
776
|
!Number.isSafeInteger(value.pid) ||
|
|
779
777
|
value.pid < 1 ||
|
|
780
778
|
typeof value.host !== "string" ||
|
|
@@ -790,7 +788,7 @@ function readStatusRecord(coordRoot: string): SupervisorServiceStatusRecord | un
|
|
|
790
788
|
}
|
|
791
789
|
}
|
|
792
790
|
|
|
793
|
-
function statusOwnerIsLive(record:
|
|
791
|
+
function statusOwnerIsLive(record: GovernorServiceStatusRecord): boolean {
|
|
794
792
|
if (record.state === "stopped") return false;
|
|
795
793
|
if (record.host === hostname()) return pidAlive(record.pid);
|
|
796
794
|
const age = Date.now() - Date.parse(record.heartbeat_at);
|
|
@@ -817,13 +815,13 @@ function appendServiceEvent(coordRoot: string, data: Record<string, unknown>): v
|
|
|
817
815
|
chmodSync(path, 0o600);
|
|
818
816
|
}
|
|
819
817
|
|
|
820
|
-
function renderSweepLog(report:
|
|
818
|
+
function renderSweepLog(report: GovernorServiceSweepReport): string | undefined {
|
|
821
819
|
const counts = report.outcomes.reduce<Record<string, number>>((acc, outcome) => {
|
|
822
820
|
acc[outcome.action] = (acc[outcome.action] ?? 0) + 1;
|
|
823
821
|
return acc;
|
|
824
822
|
}, {});
|
|
825
823
|
if (!counts.tick && !counts.backoff) return undefined;
|
|
826
|
-
return `
|
|
824
|
+
return `governor service sweep: ${counts.tick ?? 0} tick, ${counts.skip ?? 0} skip, ${counts.backoff ?? 0} backoff`;
|
|
827
825
|
}
|
|
828
826
|
|
|
829
827
|
function readBoundedJson<T>(path: string, label: string): T {
|
|
@@ -840,7 +838,7 @@ function readBoundedJson<T>(path: string, label: string): T {
|
|
|
840
838
|
function writePrivateJsonAtomic(path: string, value: unknown): void {
|
|
841
839
|
const body = `${JSON.stringify(value, null, 2)}\n`;
|
|
842
840
|
if (Buffer.byteLength(body) > MAX_FILE_BYTES) {
|
|
843
|
-
throw new Error(`
|
|
841
|
+
throw new Error(`governor service file exceeds ${MAX_FILE_BYTES} bytes`);
|
|
844
842
|
}
|
|
845
843
|
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
846
844
|
chmodSync(dirname(path), 0o700);
|
|
@@ -851,7 +849,7 @@ function writePrivateJsonAtomic(path: string, value: unknown): void {
|
|
|
851
849
|
}
|
|
852
850
|
|
|
853
851
|
function serviceDir(coordRoot: string): string {
|
|
854
|
-
return join(resolve(coordRoot), ".harnery", "
|
|
852
|
+
return join(resolve(coordRoot), ".harnery", "governor-service");
|
|
855
853
|
}
|
|
856
854
|
|
|
857
855
|
function serviceConfigPath(coordRoot: string): string {
|