harnery 0.30.0 → 0.31.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/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 +61 -60
- 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/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 +193 -23
- 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 +4 -4
- package/dist/core/agents/canonical-emit.js +5 -5
- 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-client.d.ts +21 -2
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/coord-client.js +122 -27
- 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/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 +175 -151
- 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 +17 -17
- 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 +3 -3
- package/dist/core/hooks/resolve/coord-root.js +4 -4
- 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/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 +71 -64
- 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/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 +237 -34
- 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 +6 -6
- 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-client.ts +119 -28
- package/src/core/agents/events/consume.ts +1 -1
- package/src/core/agents/events/emit.ts +7 -6
- 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 +185 -162
- package/src/core/hooks/effects/image-capture.ts +6 -6
- package/src/core/hooks/effects/index.ts +17 -17
- 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 +4 -4
- 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/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
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { resolve } from "node:path";
|
|
2
2
|
import { acceptWorkItem, reconcileWorkItem, runWorkItem, } from "../work/index.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
export async function
|
|
3
|
+
import { runGovernorPlanner } from "./planning.js";
|
|
4
|
+
import { acquireGovernorLease, readGovernorIgnoringLease, } from "./state.js";
|
|
5
|
+
export async function runGovernor(input) {
|
|
6
6
|
const coordRoot = resolve(input.coordRoot);
|
|
7
7
|
const mode = input.mode ?? "run";
|
|
8
|
-
const actor = input.actor?.trim() || `
|
|
8
|
+
const actor = input.actor?.trim() || `governor:${input.goalId}`;
|
|
9
9
|
const log = input.onLog ?? (() => undefined);
|
|
10
10
|
const startedAt = new Date().toISOString();
|
|
11
11
|
const startedMs = Date.now();
|
|
12
|
-
const release =
|
|
12
|
+
const release = acquireGovernorLease(coordRoot, input.goalId);
|
|
13
13
|
let cycles = 0;
|
|
14
14
|
let dispatches = 0;
|
|
15
15
|
let acceptances = 0;
|
|
@@ -17,7 +17,7 @@ export async function runSupervisor(input) {
|
|
|
17
17
|
const outcomes = [];
|
|
18
18
|
const planOutcomes = [];
|
|
19
19
|
try {
|
|
20
|
-
const initial =
|
|
20
|
+
const initial = readGovernorIgnoringLease(coordRoot, input.goalId);
|
|
21
21
|
const cycleLimit = mode === "tick" ? 1 : initial.intent.limits.max_cycles;
|
|
22
22
|
const deadline = startedMs + initial.intent.limits.max_runtime_ms;
|
|
23
23
|
while (cycles < cycleLimit) {
|
|
@@ -29,7 +29,7 @@ export async function runSupervisor(input) {
|
|
|
29
29
|
return report("succeeded", record.projection.reason, record);
|
|
30
30
|
}
|
|
31
31
|
if (Date.now() >= deadline) {
|
|
32
|
-
return report("budget_exhausted", "
|
|
32
|
+
return report("budget_exhausted", "governor wall-time limit reached", record);
|
|
33
33
|
}
|
|
34
34
|
const before = graphFingerprint(record);
|
|
35
35
|
let changed = false;
|
|
@@ -37,7 +37,7 @@ export async function runSupervisor(input) {
|
|
|
37
37
|
record.projection.next_action === "plan_initial" ||
|
|
38
38
|
record.projection.next_action === "plan_milestone") {
|
|
39
39
|
log(`[${record.intent.title}] ${record.projection.next_action} at graph generation ${record.projection.plan_generation}`);
|
|
40
|
-
const plan = await
|
|
40
|
+
const plan = await runGovernorPlanner({
|
|
41
41
|
coordRoot,
|
|
42
42
|
record,
|
|
43
43
|
engine: input.engine,
|
|
@@ -64,7 +64,7 @@ export async function runSupervisor(input) {
|
|
|
64
64
|
continue;
|
|
65
65
|
acceptWorkItem(coordRoot, work.intent.id, {
|
|
66
66
|
actor,
|
|
67
|
-
reason: "passing proof accepted by frozen
|
|
67
|
+
reason: "passing proof accepted by frozen governor policy",
|
|
68
68
|
});
|
|
69
69
|
acceptances++;
|
|
70
70
|
changed = true;
|
|
@@ -124,10 +124,10 @@ export async function runSupervisor(input) {
|
|
|
124
124
|
if (mode === "tick") {
|
|
125
125
|
return report(before === after ? "no_progress" : "tick_complete", before === after
|
|
126
126
|
? "the tick found no legal progress action"
|
|
127
|
-
: "one bounded
|
|
127
|
+
: "one bounded governor cycle completed", record);
|
|
128
128
|
}
|
|
129
129
|
if (Date.now() >= deadline) {
|
|
130
|
-
return report("budget_exhausted", "
|
|
130
|
+
return report("budget_exhausted", "governor wall-time limit reached", record);
|
|
131
131
|
}
|
|
132
132
|
if (record.projection.state === "budget_exhausted") {
|
|
133
133
|
return report("budget_exhausted", record.projection.reason, record);
|
|
@@ -139,11 +139,11 @@ export async function runSupervisor(input) {
|
|
|
139
139
|
return report(stopForProjection(record.projection), record.projection.reason, record);
|
|
140
140
|
}
|
|
141
141
|
if (before === after) {
|
|
142
|
-
return report("no_progress", "a
|
|
142
|
+
return report("no_progress", "a governor cycle produced no durable state change", record);
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
145
|
const final = refreshGraph(coordRoot, input.goalId, actor);
|
|
146
|
-
return report("budget_exhausted", `
|
|
146
|
+
return report("budget_exhausted", `governor cycle limit reached (${cycleLimit})`, final);
|
|
147
147
|
}
|
|
148
148
|
finally {
|
|
149
149
|
release();
|
|
@@ -169,10 +169,10 @@ export async function runSupervisor(input) {
|
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
171
|
function refreshGraph(coordRoot, goalId, actor) {
|
|
172
|
-
const before =
|
|
172
|
+
const before = readGovernorIgnoringLease(coordRoot, goalId);
|
|
173
173
|
for (const work of before.work)
|
|
174
174
|
reconcileWorkItem(coordRoot, work.intent.id, actor);
|
|
175
|
-
return
|
|
175
|
+
return readGovernorIgnoringLease(coordRoot, goalId);
|
|
176
176
|
}
|
|
177
177
|
function selectCandidates(record) {
|
|
178
178
|
const candidates = [];
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { GovernorServiceConfig, GovernorServiceRuntime, GovernorServiceStatus } from "./service.js";
|
|
2
|
+
export declare function readGovernorServiceConfig(coordRootRaw: string): GovernorServiceConfig;
|
|
3
|
+
export declare function readGovernorServiceRuntime(coordRootRaw: string): GovernorServiceRuntime | undefined;
|
|
4
|
+
export declare function readGovernorServiceStatus(coordRootRaw: string): GovernorServiceStatus;
|
|
5
|
+
export declare function governorServiceLogPath(coordRoot: string): string;
|
|
6
|
+
//# sourceMappingURL=service-read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-read.d.ts","sourceRoot":"","sources":["../../../src/core/governor/service-read.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EAEtB,MAAM,cAAc,CAAC;AAMtB,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,qBAAqB,CA0BrF;AAED,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,GACnB,sBAAsB,GAAG,SAAS,CAgBpC;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,qBAAqB,CAkBrF;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhE"}
|
|
@@ -4,9 +4,9 @@ import { join, resolve } from "node:path";
|
|
|
4
4
|
const MAX_FILE_BYTES = 512 * 1024;
|
|
5
5
|
const MAX_GOALS = 100;
|
|
6
6
|
const FOREIGN_STATUS_STALE_MS = 30_000;
|
|
7
|
-
export function
|
|
7
|
+
export function readGovernorServiceConfig(coordRootRaw) {
|
|
8
8
|
const coordRoot = resolve(coordRootRaw);
|
|
9
|
-
const config = readBoundedJson(join(serviceDir(coordRoot), "config.json"), "
|
|
9
|
+
const config = readBoundedJson(join(serviceDir(coordRoot), "config.json"), "governor service configuration");
|
|
10
10
|
if (config.schema_version !== 1 ||
|
|
11
11
|
!validTimestamp(config.created_at) ||
|
|
12
12
|
!Array.isArray(config.goal_ids) ||
|
|
@@ -22,39 +22,39 @@ export function readSupervisorServiceConfig(coordRootRaw) {
|
|
|
22
22
|
typeof config.engine !== "object" ||
|
|
23
23
|
typeof config.engine.subscription_only !== "boolean" ||
|
|
24
24
|
typeof config.engine.allow_api_billing !== "boolean") {
|
|
25
|
-
throw new Error("
|
|
25
|
+
throw new Error("governor service configuration has an unsupported schema");
|
|
26
26
|
}
|
|
27
27
|
return config;
|
|
28
28
|
}
|
|
29
|
-
export function
|
|
29
|
+
export function readGovernorServiceRuntime(coordRootRaw) {
|
|
30
30
|
const coordRoot = resolve(coordRootRaw);
|
|
31
31
|
const path = join(serviceDir(coordRoot), "runtime.json");
|
|
32
32
|
if (!existsSync(path))
|
|
33
33
|
return undefined;
|
|
34
|
-
const runtime = readBoundedJson(path, "
|
|
34
|
+
const runtime = readBoundedJson(path, "governor service runtime");
|
|
35
35
|
if (runtime.schema_version !== 1 ||
|
|
36
36
|
!validTimestamp(runtime.config_created_at) ||
|
|
37
37
|
!validTimestamp(runtime.updated_at) ||
|
|
38
38
|
!runtime.goals ||
|
|
39
39
|
typeof runtime.goals !== "object" ||
|
|
40
40
|
Array.isArray(runtime.goals)) {
|
|
41
|
-
throw new Error("
|
|
41
|
+
throw new Error("governor service runtime has an unsupported schema");
|
|
42
42
|
}
|
|
43
43
|
return runtime;
|
|
44
44
|
}
|
|
45
|
-
export function
|
|
45
|
+
export function readGovernorServiceStatus(coordRootRaw) {
|
|
46
46
|
const coordRoot = resolve(coordRootRaw);
|
|
47
47
|
const record = readStatusRecord(coordRoot);
|
|
48
48
|
let config;
|
|
49
49
|
let runtime;
|
|
50
50
|
try {
|
|
51
|
-
config =
|
|
51
|
+
config = readGovernorServiceConfig(coordRoot);
|
|
52
52
|
}
|
|
53
53
|
catch {
|
|
54
54
|
// Unconfigured or corrupt service state is represented without throwing.
|
|
55
55
|
}
|
|
56
56
|
try {
|
|
57
|
-
runtime =
|
|
57
|
+
runtime = readGovernorServiceRuntime(coordRoot);
|
|
58
58
|
}
|
|
59
59
|
catch {
|
|
60
60
|
// Runtime is recoverable and must not make the dashboard unreadable.
|
|
@@ -64,7 +64,7 @@ export function readSupervisorServiceStatus(coordRootRaw) {
|
|
|
64
64
|
const running = statusOwnerIsLive(record);
|
|
65
65
|
return { running, stale: !running && record.state !== "stopped", record, config, runtime };
|
|
66
66
|
}
|
|
67
|
-
export function
|
|
67
|
+
export function governorServiceLogPath(coordRoot) {
|
|
68
68
|
return join(serviceDir(resolve(coordRoot)), "service.log");
|
|
69
69
|
}
|
|
70
70
|
function readStatusRecord(coordRoot) {
|
|
@@ -72,7 +72,7 @@ function readStatusRecord(coordRoot) {
|
|
|
72
72
|
if (!existsSync(path))
|
|
73
73
|
return undefined;
|
|
74
74
|
try {
|
|
75
|
-
const value = readBoundedJson(path, "
|
|
75
|
+
const value = readBoundedJson(path, "governor service status");
|
|
76
76
|
if (value.schema_version !== 1 ||
|
|
77
77
|
!Number.isSafeInteger(value.pid) ||
|
|
78
78
|
value.pid < 1 ||
|
|
@@ -117,7 +117,7 @@ function readBoundedJson(path, label) {
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
function serviceDir(coordRoot) {
|
|
120
|
-
return join(coordRoot, ".harnery", "
|
|
120
|
+
return join(coordRoot, ".harnery", "governor-service");
|
|
121
121
|
}
|
|
122
122
|
function positive(value) {
|
|
123
123
|
return Number.isSafeInteger(value) && value > 0;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { type NormalizedPolicy, type PolicyIsolation } from "../policy/index.js";
|
|
2
|
+
import type { RunWorkItemInput } from "../work/index.js";
|
|
3
|
+
import { type GovernorRunReport, type GovernorStopReason } from "./runner.js";
|
|
4
|
+
import { type GovernorRecord } from "./state.js";
|
|
5
|
+
export declare const GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION: 1;
|
|
6
|
+
export declare const GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION: 1;
|
|
7
|
+
export declare const GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION: 1;
|
|
8
|
+
export interface GovernorServiceEngineConfig {
|
|
9
|
+
default_adapter?: string;
|
|
10
|
+
cwd?: string;
|
|
11
|
+
subscription_only: boolean;
|
|
12
|
+
allow_api_billing: boolean;
|
|
13
|
+
policy?: NormalizedPolicy;
|
|
14
|
+
isolation?: PolicyIsolation;
|
|
15
|
+
approval_addressee?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface GovernorServiceConfig {
|
|
18
|
+
schema_version: typeof GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION;
|
|
19
|
+
goal_ids: string[];
|
|
20
|
+
wake_interval_ms: number;
|
|
21
|
+
heartbeat_interval_ms: number;
|
|
22
|
+
error_backoff_base_ms: number;
|
|
23
|
+
error_backoff_max_ms: number;
|
|
24
|
+
engine: GovernorServiceEngineConfig;
|
|
25
|
+
created_at: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ConfigureGovernorServiceInput {
|
|
28
|
+
coordRoot: string;
|
|
29
|
+
goalIds: readonly string[];
|
|
30
|
+
wakeIntervalMs?: number;
|
|
31
|
+
heartbeatIntervalMs?: number;
|
|
32
|
+
errorBackoffBaseMs?: number;
|
|
33
|
+
errorBackoffMaxMs?: number;
|
|
34
|
+
engine?: Partial<GovernorServiceEngineConfig>;
|
|
35
|
+
}
|
|
36
|
+
export type GovernorServiceGoalState = "idle" | "backoff" | "awaiting_change";
|
|
37
|
+
export interface GovernorServiceGoalRuntime {
|
|
38
|
+
state: GovernorServiceGoalState;
|
|
39
|
+
consecutive_errors: number;
|
|
40
|
+
observed_fingerprint?: string;
|
|
41
|
+
next_wake_at?: string;
|
|
42
|
+
last_tick_at?: string;
|
|
43
|
+
last_stop_reason?: GovernorStopReason;
|
|
44
|
+
last_error?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface GovernorServiceRuntime {
|
|
47
|
+
schema_version: typeof GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION;
|
|
48
|
+
config_created_at: string;
|
|
49
|
+
updated_at: string;
|
|
50
|
+
goals: Record<string, GovernorServiceGoalRuntime>;
|
|
51
|
+
}
|
|
52
|
+
export type GovernorServiceProcessState = "starting" | "running" | "stopping" | "stopped";
|
|
53
|
+
export interface GovernorServiceStatusRecord {
|
|
54
|
+
schema_version: typeof GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION;
|
|
55
|
+
pid: number;
|
|
56
|
+
host: string;
|
|
57
|
+
nonce: string;
|
|
58
|
+
state: GovernorServiceProcessState;
|
|
59
|
+
started_at: string;
|
|
60
|
+
heartbeat_at: string;
|
|
61
|
+
config_created_at: string;
|
|
62
|
+
sweep_count: number;
|
|
63
|
+
active_goal_id?: string;
|
|
64
|
+
last_sweep_at?: string;
|
|
65
|
+
next_wake_at?: string;
|
|
66
|
+
last_error?: string;
|
|
67
|
+
stopped_at?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface GovernorServiceStatus {
|
|
70
|
+
running: boolean;
|
|
71
|
+
stale: boolean;
|
|
72
|
+
record?: GovernorServiceStatusRecord;
|
|
73
|
+
config?: GovernorServiceConfig;
|
|
74
|
+
runtime?: GovernorServiceRuntime;
|
|
75
|
+
}
|
|
76
|
+
export interface GovernorServiceSweepOutcome {
|
|
77
|
+
goal_id: string;
|
|
78
|
+
action: "tick" | "skip" | "backoff";
|
|
79
|
+
reason: string;
|
|
80
|
+
stop_reason?: GovernorStopReason;
|
|
81
|
+
next_wake_at?: string;
|
|
82
|
+
}
|
|
83
|
+
export interface GovernorServiceSweepReport {
|
|
84
|
+
started_at: string;
|
|
85
|
+
ended_at: string;
|
|
86
|
+
outcomes: GovernorServiceSweepOutcome[];
|
|
87
|
+
}
|
|
88
|
+
export interface RunGovernorServiceSweepInput {
|
|
89
|
+
coordRoot: string;
|
|
90
|
+
config: GovernorServiceConfig;
|
|
91
|
+
engine?: Omit<RunWorkItemInput["engine"], "maxAgents" | "concurrency" | "specialists">;
|
|
92
|
+
actor?: string;
|
|
93
|
+
now?: () => number;
|
|
94
|
+
readGoal?: (coordRoot: string, goalId: string) => GovernorRecord;
|
|
95
|
+
runGoal?: (goalId: string) => Promise<GovernorRunReport>;
|
|
96
|
+
onGoalStart?: (goalId: string) => void;
|
|
97
|
+
}
|
|
98
|
+
export interface RunGovernorServiceDaemonInput {
|
|
99
|
+
coordRoot: string;
|
|
100
|
+
engine: Omit<RunWorkItemInput["engine"], "maxAgents" | "concurrency" | "specialists">;
|
|
101
|
+
actor?: string;
|
|
102
|
+
maxSweeps?: number;
|
|
103
|
+
onLog?: (line: string) => void;
|
|
104
|
+
}
|
|
105
|
+
export declare function configureGovernorService(input: ConfigureGovernorServiceInput): GovernorServiceConfig;
|
|
106
|
+
export declare function readGovernorServiceConfig(coordRootRaw: string): GovernorServiceConfig;
|
|
107
|
+
export declare function readGovernorServiceRuntime(coordRootRaw: string): GovernorServiceRuntime | undefined;
|
|
108
|
+
export declare function readGovernorServiceStatus(coordRootRaw: string): GovernorServiceStatus;
|
|
109
|
+
export declare function spawnGovernorService(coordRootRaw: string): Promise<GovernorServiceStatus>;
|
|
110
|
+
export declare function requestGovernorServiceStop(coordRootRaw: string): GovernorServiceStatus;
|
|
111
|
+
export declare function runGovernorServiceSweep(input: RunGovernorServiceSweepInput): Promise<GovernorServiceSweepReport>;
|
|
112
|
+
export declare function runGovernorServiceDaemon(input: RunGovernorServiceDaemonInput): Promise<GovernorServiceStatusRecord>;
|
|
113
|
+
export declare function governorServiceLogPath(coordRoot: string): string;
|
|
114
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/governor/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,27 +4,27 @@ import { appendFileSync, chmodSync, closeSync, existsSync, mkdirSync, openSync,
|
|
|
4
4
|
import { hostname } from "node:os";
|
|
5
5
|
import { dirname, join, resolve } from "node:path";
|
|
6
6
|
import { normalizePolicy } from "../policy/index.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
export const
|
|
10
|
-
export const
|
|
11
|
-
export const
|
|
7
|
+
import { runGovernor } from "./runner.js";
|
|
8
|
+
import { readGovernor } from "./state.js";
|
|
9
|
+
export const GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION = 1;
|
|
10
|
+
export const GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION = 1;
|
|
11
|
+
export const GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION = 1;
|
|
12
12
|
const MAX_FILE_BYTES = 512 * 1024;
|
|
13
13
|
const MAX_GOALS = 100;
|
|
14
14
|
const MAX_ERROR = 2_000;
|
|
15
15
|
const FOREIGN_STATUS_STALE_MS = 30_000;
|
|
16
|
-
export function
|
|
16
|
+
export function configureGovernorService(input) {
|
|
17
17
|
const coordRoot = resolve(input.coordRoot);
|
|
18
18
|
const active = readStatusRecord(coordRoot);
|
|
19
19
|
if (active && statusOwnerIsLive(active)) {
|
|
20
|
-
throw new Error(`stop
|
|
20
|
+
throw new Error(`stop governor service pid ${active.pid} before changing its configuration`);
|
|
21
21
|
}
|
|
22
22
|
const goalIds = unique(input.goalIds.map((value) => value.trim()).filter(Boolean));
|
|
23
23
|
if (goalIds.length < 1 || goalIds.length > MAX_GOALS) {
|
|
24
|
-
throw new Error(`
|
|
24
|
+
throw new Error(`governor service requires from 1 to ${MAX_GOALS} unique goal ids`);
|
|
25
25
|
}
|
|
26
26
|
for (const goalId of goalIds)
|
|
27
|
-
|
|
27
|
+
readGovernor(coordRoot, goalId);
|
|
28
28
|
const wakeIntervalMs = positive(input.wakeIntervalMs ?? 5_000, "service wake_interval_ms", 60 * 60 * 1_000);
|
|
29
29
|
const heartbeatIntervalMs = positive(input.heartbeatIntervalMs ?? 2_000, "service heartbeat_interval_ms", 60_000);
|
|
30
30
|
const errorBackoffBaseMs = positive(input.errorBackoffBaseMs ?? 2_000, "service error_backoff_base_ms", 60 * 60 * 1_000);
|
|
@@ -33,7 +33,7 @@ export function configureSupervisorService(input) {
|
|
|
33
33
|
throw new Error("service error_backoff_max_ms must be at least error_backoff_base_ms");
|
|
34
34
|
}
|
|
35
35
|
const config = {
|
|
36
|
-
schema_version:
|
|
36
|
+
schema_version: GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION,
|
|
37
37
|
goal_ids: goalIds,
|
|
38
38
|
wake_interval_ms: wakeIntervalMs,
|
|
39
39
|
heartbeat_interval_ms: heartbeatIntervalMs,
|
|
@@ -46,42 +46,42 @@ export function configureSupervisorService(input) {
|
|
|
46
46
|
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
47
47
|
chmodSync(dir, 0o700);
|
|
48
48
|
writePrivateJsonAtomic(serviceConfigPath(coordRoot), config);
|
|
49
|
-
return
|
|
49
|
+
return readGovernorServiceConfig(coordRoot);
|
|
50
50
|
}
|
|
51
|
-
export function
|
|
51
|
+
export function readGovernorServiceConfig(coordRootRaw) {
|
|
52
52
|
const coordRoot = resolve(coordRootRaw);
|
|
53
|
-
const config = readBoundedJson(serviceConfigPath(coordRoot), "
|
|
53
|
+
const config = readBoundedJson(serviceConfigPath(coordRoot), "governor service configuration");
|
|
54
54
|
validateConfig(coordRoot, config);
|
|
55
55
|
return config;
|
|
56
56
|
}
|
|
57
|
-
export function
|
|
57
|
+
export function readGovernorServiceRuntime(coordRootRaw) {
|
|
58
58
|
const coordRoot = resolve(coordRootRaw);
|
|
59
59
|
if (!existsSync(serviceRuntimePath(coordRoot)))
|
|
60
60
|
return undefined;
|
|
61
|
-
const runtime = readBoundedJson(serviceRuntimePath(coordRoot), "
|
|
62
|
-
if (runtime.schema_version !==
|
|
61
|
+
const runtime = readBoundedJson(serviceRuntimePath(coordRoot), "governor service runtime");
|
|
62
|
+
if (runtime.schema_version !== GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION ||
|
|
63
63
|
!validTimestamp(runtime.config_created_at) ||
|
|
64
64
|
!validTimestamp(runtime.updated_at) ||
|
|
65
65
|
!runtime.goals ||
|
|
66
66
|
typeof runtime.goals !== "object" ||
|
|
67
67
|
Array.isArray(runtime.goals)) {
|
|
68
|
-
throw new Error("
|
|
68
|
+
throw new Error("governor service runtime has an unsupported schema");
|
|
69
69
|
}
|
|
70
70
|
return runtime;
|
|
71
71
|
}
|
|
72
|
-
export function
|
|
72
|
+
export function readGovernorServiceStatus(coordRootRaw) {
|
|
73
73
|
const coordRoot = resolve(coordRootRaw);
|
|
74
74
|
const record = readStatusRecord(coordRoot);
|
|
75
75
|
let config;
|
|
76
76
|
let runtime;
|
|
77
77
|
try {
|
|
78
|
-
config =
|
|
78
|
+
config = readGovernorServiceConfig(coordRoot);
|
|
79
79
|
}
|
|
80
80
|
catch {
|
|
81
81
|
// A service has no usable configuration until explicitly configured.
|
|
82
82
|
}
|
|
83
83
|
try {
|
|
84
|
-
runtime =
|
|
84
|
+
runtime = readGovernorServiceRuntime(coordRoot);
|
|
85
85
|
}
|
|
86
86
|
catch {
|
|
87
87
|
// Status remains readable when recoverable runtime state is corrupt.
|
|
@@ -91,12 +91,12 @@ export function readSupervisorServiceStatus(coordRootRaw) {
|
|
|
91
91
|
const running = statusOwnerIsLive(record);
|
|
92
92
|
return { running, stale: !running && record.state !== "stopped", record, config, runtime };
|
|
93
93
|
}
|
|
94
|
-
export async function
|
|
94
|
+
export async function spawnGovernorService(coordRootRaw) {
|
|
95
95
|
const coordRoot = resolve(coordRootRaw);
|
|
96
|
-
|
|
97
|
-
const current =
|
|
96
|
+
readGovernorServiceConfig(coordRoot);
|
|
97
|
+
const current = readGovernorServiceStatus(coordRoot);
|
|
98
98
|
if (current.running) {
|
|
99
|
-
throw new Error(`
|
|
99
|
+
throw new Error(`governor service is already running under pid ${current.record?.pid}`);
|
|
100
100
|
}
|
|
101
101
|
mkdirSync(serviceDir(coordRoot), { recursive: true, mode: 0o700 });
|
|
102
102
|
const logFd = openSync(serviceLogPath(coordRoot), "a", 0o600);
|
|
@@ -107,7 +107,7 @@ export async function spawnSupervisorService(coordRootRaw) {
|
|
|
107
107
|
throw new Error(`cannot find harn executable at ${harnBin}`);
|
|
108
108
|
}
|
|
109
109
|
let spawnError;
|
|
110
|
-
const child = spawn(harnBin, ["
|
|
110
|
+
const child = spawn(harnBin, ["governor", "service", "daemon"], {
|
|
111
111
|
cwd: coordRoot,
|
|
112
112
|
detached: true,
|
|
113
113
|
stdio: ["ignore", logFd, logFd],
|
|
@@ -127,17 +127,17 @@ export async function spawnSupervisorService(coordRootRaw) {
|
|
|
127
127
|
await delay(50);
|
|
128
128
|
if (spawnError)
|
|
129
129
|
throw spawnError;
|
|
130
|
-
const status =
|
|
130
|
+
const status = readGovernorServiceStatus(coordRoot);
|
|
131
131
|
if (status.running && status.record?.pid === child.pid)
|
|
132
132
|
return status;
|
|
133
133
|
if (child.exitCode !== null)
|
|
134
134
|
break;
|
|
135
135
|
}
|
|
136
|
-
throw new Error(`
|
|
136
|
+
throw new Error(`governor service failed to start; inspect ${serviceLogPath(coordRoot)}`);
|
|
137
137
|
}
|
|
138
|
-
export function
|
|
138
|
+
export function requestGovernorServiceStop(coordRootRaw) {
|
|
139
139
|
const coordRoot = resolve(coordRootRaw);
|
|
140
|
-
const status =
|
|
140
|
+
const status = readGovernorServiceStatus(coordRoot);
|
|
141
141
|
if (!status.running || !status.record)
|
|
142
142
|
return status;
|
|
143
143
|
writePrivateJsonAtomic(serviceStopPath(coordRoot), {
|
|
@@ -152,24 +152,24 @@ export function requestSupervisorServiceStop(coordRootRaw) {
|
|
|
152
152
|
// The durable stop request remains for a racing or restarted daemon.
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
|
-
return
|
|
155
|
+
return readGovernorServiceStatus(coordRoot);
|
|
156
156
|
}
|
|
157
|
-
export async function
|
|
157
|
+
export async function runGovernorServiceSweep(input) {
|
|
158
158
|
const coordRoot = resolve(input.coordRoot);
|
|
159
159
|
const now = input.now ?? Date.now;
|
|
160
|
-
const readGoal = input.readGoal ??
|
|
160
|
+
const readGoal = input.readGoal ?? readGovernor;
|
|
161
161
|
const runtime = runtimeForConfig(coordRoot, input.config, now());
|
|
162
162
|
const startedAt = new Date(now()).toISOString();
|
|
163
163
|
const outcomes = [];
|
|
164
164
|
const runGoal = input.runGoal ??
|
|
165
165
|
(async (goalId) => {
|
|
166
166
|
if (!input.engine)
|
|
167
|
-
throw new Error("
|
|
168
|
-
return await
|
|
167
|
+
throw new Error("governor service sweep requires an engine");
|
|
168
|
+
return await runGovernor({
|
|
169
169
|
coordRoot,
|
|
170
170
|
goalId,
|
|
171
171
|
mode: "tick",
|
|
172
|
-
actor: input.actor ?? "
|
|
172
|
+
actor: input.actor ?? "governor-service",
|
|
173
173
|
engine: input.engine,
|
|
174
174
|
});
|
|
175
175
|
});
|
|
@@ -287,14 +287,14 @@ export async function runSupervisorServiceSweep(input) {
|
|
|
287
287
|
persistRuntime(coordRoot, runtime, Date.parse(endedAt));
|
|
288
288
|
return { started_at: startedAt, ended_at: endedAt, outcomes };
|
|
289
289
|
}
|
|
290
|
-
export async function
|
|
290
|
+
export async function runGovernorServiceDaemon(input) {
|
|
291
291
|
const coordRoot = resolve(input.coordRoot);
|
|
292
|
-
const config =
|
|
292
|
+
const config = readGovernorServiceConfig(coordRoot);
|
|
293
293
|
const release = acquireServiceLease(coordRoot);
|
|
294
294
|
rmSync(serviceStopPath(coordRoot), { force: true });
|
|
295
295
|
const now = new Date().toISOString();
|
|
296
296
|
const status = {
|
|
297
|
-
schema_version:
|
|
297
|
+
schema_version: GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION,
|
|
298
298
|
pid: process.pid,
|
|
299
299
|
host: hostname(),
|
|
300
300
|
nonce: randomUUID(),
|
|
@@ -325,20 +325,20 @@ export async function runSupervisorServiceDaemon(input) {
|
|
|
325
325
|
goals: config.goal_ids,
|
|
326
326
|
config_created_at: config.created_at,
|
|
327
327
|
});
|
|
328
|
-
log(`
|
|
328
|
+
log(`governor service started for ${config.goal_ids.length} goal(s)`);
|
|
329
329
|
const heartbeat = setInterval(() => {
|
|
330
330
|
try {
|
|
331
331
|
writeStatus();
|
|
332
332
|
}
|
|
333
333
|
catch (error) {
|
|
334
|
-
log(`
|
|
334
|
+
log(`governor service heartbeat error: ${boundedError(error.message)}`);
|
|
335
335
|
}
|
|
336
336
|
}, config.heartbeat_interval_ms);
|
|
337
337
|
try {
|
|
338
338
|
while (!stopRequested && !existsSync(serviceStopPath(coordRoot))) {
|
|
339
339
|
let sleepMs = config.wake_interval_ms;
|
|
340
340
|
try {
|
|
341
|
-
const report = await
|
|
341
|
+
const report = await runGovernorServiceSweep({
|
|
342
342
|
coordRoot,
|
|
343
343
|
config,
|
|
344
344
|
engine: input.engine,
|
|
@@ -368,7 +368,7 @@ export async function runSupervisorServiceDaemon(input) {
|
|
|
368
368
|
event: "service.sweep_error",
|
|
369
369
|
error: status.last_error,
|
|
370
370
|
});
|
|
371
|
-
log(`
|
|
371
|
+
log(`governor service sweep error: ${status.last_error}`);
|
|
372
372
|
}
|
|
373
373
|
if (input.maxSweeps !== undefined && status.sweep_count >= input.maxSweeps)
|
|
374
374
|
break;
|
|
@@ -395,13 +395,13 @@ export async function runSupervisorServiceDaemon(input) {
|
|
|
395
395
|
}
|
|
396
396
|
return status;
|
|
397
397
|
}
|
|
398
|
-
export function
|
|
398
|
+
export function governorServiceLogPath(coordRoot) {
|
|
399
399
|
return serviceLogPath(resolve(coordRoot));
|
|
400
400
|
}
|
|
401
401
|
function runtimeForConfig(coordRoot, config, timestamp) {
|
|
402
402
|
let existing;
|
|
403
403
|
try {
|
|
404
|
-
existing =
|
|
404
|
+
existing = readGovernorServiceRuntime(coordRoot);
|
|
405
405
|
}
|
|
406
406
|
catch {
|
|
407
407
|
// Runtime is a recoverable scheduling hint; durable goal state remains authoritative.
|
|
@@ -411,7 +411,7 @@ function runtimeForConfig(coordRoot, config, timestamp) {
|
|
|
411
411
|
return { ...existing, goals };
|
|
412
412
|
}
|
|
413
413
|
return {
|
|
414
|
-
schema_version:
|
|
414
|
+
schema_version: GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION,
|
|
415
415
|
config_created_at: config.created_at,
|
|
416
416
|
updated_at: new Date(timestamp).toISOString(),
|
|
417
417
|
goals: Object.fromEntries(config.goal_ids.map((goalId) => [goalId, emptyGoalRuntime()])),
|
|
@@ -453,7 +453,7 @@ function wakeDue(value, now) {
|
|
|
453
453
|
}
|
|
454
454
|
function normalizeEngineConfig(coordRoot, input) {
|
|
455
455
|
return {
|
|
456
|
-
|
|
456
|
+
default_adapter: optionalBounded(input?.default_adapter, "default_adapter", 100),
|
|
457
457
|
cwd: input?.cwd ? resolve(input.cwd) : coordRoot,
|
|
458
458
|
subscription_only: bool(input?.subscription_only ?? false, "subscription_only"),
|
|
459
459
|
allow_api_billing: bool(input?.allow_api_billing ?? false, "allow_api_billing"),
|
|
@@ -463,13 +463,13 @@ function normalizeEngineConfig(coordRoot, input) {
|
|
|
463
463
|
};
|
|
464
464
|
}
|
|
465
465
|
function validateConfig(coordRoot, config) {
|
|
466
|
-
if (config.schema_version !==
|
|
466
|
+
if (config.schema_version !== GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION ||
|
|
467
467
|
!validTimestamp(config.created_at) ||
|
|
468
468
|
!Array.isArray(config.goal_ids)) {
|
|
469
|
-
throw new Error("
|
|
469
|
+
throw new Error("governor service configuration has an unsupported schema");
|
|
470
470
|
}
|
|
471
471
|
const normalized = {
|
|
472
|
-
schema_version:
|
|
472
|
+
schema_version: GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION,
|
|
473
473
|
goal_ids: unique(config.goal_ids.map((goalId) => goalId.trim()).filter(Boolean)),
|
|
474
474
|
wake_interval_ms: positive(config.wake_interval_ms, "service wake_interval_ms", 60 * 60 * 1_000),
|
|
475
475
|
heartbeat_interval_ms: positive(config.heartbeat_interval_ms, "service heartbeat_interval_ms", 60_000),
|
|
@@ -482,7 +482,7 @@ function validateConfig(coordRoot, config) {
|
|
|
482
482
|
normalized.goal_ids.length > MAX_GOALS ||
|
|
483
483
|
normalized.error_backoff_max_ms < normalized.error_backoff_base_ms ||
|
|
484
484
|
JSON.stringify(normalized) !== JSON.stringify(config)) {
|
|
485
|
-
throw new Error("
|
|
485
|
+
throw new Error("governor service configuration is not canonical");
|
|
486
486
|
}
|
|
487
487
|
}
|
|
488
488
|
function normalizeIsolation(value) {
|
|
@@ -522,11 +522,11 @@ function acquireServiceLease(coordRoot) {
|
|
|
522
522
|
if (!acquire()) {
|
|
523
523
|
const existing = readLease(path);
|
|
524
524
|
if (existing && leaseOwnerIsLive(existing)) {
|
|
525
|
-
throw new Error(`
|
|
525
|
+
throw new Error(`governor service is already running under pid ${existing.pid}`);
|
|
526
526
|
}
|
|
527
527
|
unlinkSync(path);
|
|
528
528
|
if (!acquire())
|
|
529
|
-
throw new Error("
|
|
529
|
+
throw new Error("governor service lease raced with another process");
|
|
530
530
|
}
|
|
531
531
|
return () => {
|
|
532
532
|
try {
|
|
@@ -565,8 +565,8 @@ function readStatusRecord(coordRoot) {
|
|
|
565
565
|
if (!existsSync(serviceStatusPath(coordRoot)))
|
|
566
566
|
return undefined;
|
|
567
567
|
try {
|
|
568
|
-
const value = readBoundedJson(serviceStatusPath(coordRoot), "
|
|
569
|
-
if (value.schema_version !==
|
|
568
|
+
const value = readBoundedJson(serviceStatusPath(coordRoot), "governor service status");
|
|
569
|
+
if (value.schema_version !== GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION ||
|
|
570
570
|
!Number.isSafeInteger(value.pid) ||
|
|
571
571
|
value.pid < 1 ||
|
|
572
572
|
typeof value.host !== "string" ||
|
|
@@ -611,7 +611,7 @@ function renderSweepLog(report) {
|
|
|
611
611
|
}, {});
|
|
612
612
|
if (!counts.tick && !counts.backoff)
|
|
613
613
|
return undefined;
|
|
614
|
-
return `
|
|
614
|
+
return `governor service sweep: ${counts.tick ?? 0} tick, ${counts.skip ?? 0} skip, ${counts.backoff ?? 0} backoff`;
|
|
615
615
|
}
|
|
616
616
|
function readBoundedJson(path, label) {
|
|
617
617
|
if (!existsSync(path))
|
|
@@ -629,7 +629,7 @@ function readBoundedJson(path, label) {
|
|
|
629
629
|
function writePrivateJsonAtomic(path, value) {
|
|
630
630
|
const body = `${JSON.stringify(value, null, 2)}\n`;
|
|
631
631
|
if (Buffer.byteLength(body) > MAX_FILE_BYTES) {
|
|
632
|
-
throw new Error(`
|
|
632
|
+
throw new Error(`governor service file exceeds ${MAX_FILE_BYTES} bytes`);
|
|
633
633
|
}
|
|
634
634
|
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
635
635
|
chmodSync(dirname(path), 0o700);
|
|
@@ -639,7 +639,7 @@ function writePrivateJsonAtomic(path, value) {
|
|
|
639
639
|
chmodSync(path, 0o600);
|
|
640
640
|
}
|
|
641
641
|
function serviceDir(coordRoot) {
|
|
642
|
-
return join(resolve(coordRoot), ".harnery", "
|
|
642
|
+
return join(resolve(coordRoot), ".harnery", "governor-service");
|
|
643
643
|
}
|
|
644
644
|
function serviceConfigPath(coordRoot) {
|
|
645
645
|
return join(serviceDir(coordRoot), "config.json");
|