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
package/dist/core/agents/cli.js
CHANGED
|
@@ -162,12 +162,12 @@ async function emitClaimRelease(root, owner, hb, path, reason) {
|
|
|
162
162
|
const { emit } = await import("./events/emit.js");
|
|
163
163
|
const canonical = path.startsWith(`${root}/`) ? path.slice(root.length + 1) : path;
|
|
164
164
|
const platform = hb.platform;
|
|
165
|
-
const
|
|
165
|
+
const adapter = platform === "cursor" ? "cursor" : platform === "codex" ? "codex" : "claude-code";
|
|
166
166
|
emit(root, {
|
|
167
167
|
event_type: "claim.release",
|
|
168
168
|
instance_id: owner,
|
|
169
169
|
session_id: hb.session_id ?? owner,
|
|
170
|
-
|
|
170
|
+
adapter,
|
|
171
171
|
source: "agent-coord",
|
|
172
172
|
data: { path: canonical, reason },
|
|
173
173
|
});
|
|
@@ -262,16 +262,16 @@ async function handleStateAction(root, action, rest) {
|
|
|
262
262
|
return 0;
|
|
263
263
|
}
|
|
264
264
|
case "heal-heartbeat": {
|
|
265
|
-
//
|
|
265
|
+
// adapter arrives as a `--adapter=<h>` flag (not positional) so the live
|
|
266
266
|
// tool.pre_use heal and the manual `harn agents heal` path (which pass
|
|
267
267
|
// different positional counts) can both supply it without arg-order
|
|
268
268
|
// fragility. Positionals (sessionId, model) stay as-is once flags are
|
|
269
269
|
// filtered out.
|
|
270
|
-
const
|
|
270
|
+
const adapter = args.find((a) => a.startsWith("--adapter="))?.slice("--adapter=".length);
|
|
271
271
|
const positional = args.filter((a) => !a.startsWith("--"));
|
|
272
272
|
const sessionId = positional[0];
|
|
273
273
|
const model = positional[1];
|
|
274
|
-
const hb = writer.healHeartbeat(root, owner, sessionId, model,
|
|
274
|
+
const hb = writer.healHeartbeat(root, owner, sessionId, model, adapter);
|
|
275
275
|
process.stdout.write(`${JSON.stringify({ instance_id: owner, recreated: !!hb })}\n`);
|
|
276
276
|
return hb ? 0 : 1;
|
|
277
277
|
}
|
|
@@ -293,45 +293,45 @@ async function handleStateAction(root, action, rest) {
|
|
|
293
293
|
return 2;
|
|
294
294
|
}
|
|
295
295
|
}
|
|
296
|
-
async function
|
|
297
|
-
const
|
|
298
|
-
if (action === "append-
|
|
296
|
+
async function handleJournalAction(root, action, rest) {
|
|
297
|
+
const journal = await import("./state/journal.js");
|
|
298
|
+
if (action === "append-journal") {
|
|
299
299
|
const [owner, category, ...bodyParts] = rest;
|
|
300
300
|
const body = bodyParts.join(" ");
|
|
301
301
|
if (!owner || !category || !body) {
|
|
302
|
-
process.stderr.write("agent-coord append-
|
|
302
|
+
process.stderr.write("agent-coord append-journal <instance_id> <category> <body>\n");
|
|
303
303
|
return 2;
|
|
304
304
|
}
|
|
305
|
-
const result =
|
|
305
|
+
const result = journal.appendJournal(root, owner, category, body);
|
|
306
306
|
if (!result.ok) {
|
|
307
|
-
process.stderr.write(`agent-coord append-
|
|
307
|
+
process.stderr.write(`agent-coord append-journal: ${result.reason}\n`);
|
|
308
308
|
return 1;
|
|
309
309
|
}
|
|
310
310
|
process.stdout.write(`${JSON.stringify({ instance_id: owner, category, path: result.path })}\n`);
|
|
311
311
|
return 0;
|
|
312
312
|
}
|
|
313
|
-
if (action === "edit-
|
|
313
|
+
if (action === "edit-journal") {
|
|
314
314
|
const [owner, newBodyFile, ...summaryParts] = rest;
|
|
315
315
|
const summary = summaryParts.join(" ");
|
|
316
316
|
if (!owner || !newBodyFile) {
|
|
317
|
-
process.stderr.write("agent-coord edit-
|
|
317
|
+
process.stderr.write("agent-coord edit-journal <instance_id> <new-body-file> [<summary>]\n");
|
|
318
318
|
return 2;
|
|
319
319
|
}
|
|
320
320
|
if (!existsSync(newBodyFile)) {
|
|
321
|
-
process.stderr.write(`agent-coord edit-
|
|
321
|
+
process.stderr.write(`agent-coord edit-journal: file not found: ${newBodyFile}\n`);
|
|
322
322
|
return 2;
|
|
323
323
|
}
|
|
324
324
|
const { readFileSync } = await import("node:fs");
|
|
325
325
|
const newBody = readFileSync(newBodyFile, "utf8");
|
|
326
|
-
const result =
|
|
326
|
+
const result = journal.editJournal(root, owner, newBody, summary);
|
|
327
327
|
if (!result.ok) {
|
|
328
|
-
process.stderr.write(`agent-coord edit-
|
|
328
|
+
process.stderr.write(`agent-coord edit-journal: ${result.reason}\n`);
|
|
329
329
|
return 1;
|
|
330
330
|
}
|
|
331
331
|
process.stdout.write(`${JSON.stringify({ instance_id: owner, path: result.path, archive_path: result.archivePath })}\n`);
|
|
332
332
|
return 0;
|
|
333
333
|
}
|
|
334
|
-
process.stderr.write(`agent-coord: unknown
|
|
334
|
+
process.stderr.write(`agent-coord: unknown journal action ${action}\n`);
|
|
335
335
|
return 2;
|
|
336
336
|
}
|
|
337
337
|
async function handleCouncilAction(root, action, rest) {
|
|
@@ -522,7 +522,7 @@ async function handleShellMutationClaimLog(root, rest) {
|
|
|
522
522
|
// in a log file; now a canonical decision.warn so the
|
|
523
523
|
// signal survives in events.ndjson. (The blocking claim-conflict path is
|
|
524
524
|
// separate: claim.conflict / verdict, and unaffected.)
|
|
525
|
-
const
|
|
525
|
+
const adapter = platform === "cursor" ? "cursor" : platform === "codex" ? "codex" : "claude-code";
|
|
526
526
|
const hb = owner ? readHeartbeat(root, owner) : null;
|
|
527
527
|
for (const p of paths) {
|
|
528
528
|
try {
|
|
@@ -530,7 +530,7 @@ async function handleShellMutationClaimLog(root, rest) {
|
|
|
530
530
|
event_type: "decision.warn",
|
|
531
531
|
instance_id: owner ?? "unknown",
|
|
532
532
|
session_id: hb?.session_id ?? owner ?? "unknown",
|
|
533
|
-
|
|
533
|
+
adapter,
|
|
534
534
|
data: {
|
|
535
535
|
rule: "shell_mutation_candidate",
|
|
536
536
|
reason: `path=${p} cmd=${truncated} platform=${platform}`,
|
|
@@ -568,9 +568,11 @@ async function handlePromptContext(root, rest) {
|
|
|
568
568
|
const instanceId = args.instance;
|
|
569
569
|
const sessionId = args.session ?? instanceId;
|
|
570
570
|
const agentName = args.name;
|
|
571
|
+
const sessionNameNudge = args["session-name-nudge"] === "true";
|
|
571
572
|
const taskNudge = args["task-nudge"] === "true";
|
|
573
|
+
const statusFooterNudge = args["status-footer-nudge"] === "true";
|
|
572
574
|
if (!instanceId) {
|
|
573
|
-
process.stderr.write("agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--task-nudge]\n");
|
|
575
|
+
process.stderr.write("agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--session-name-nudge] [--task-nudge] [--status-footer-nudge]\n");
|
|
574
576
|
return 2;
|
|
575
577
|
}
|
|
576
578
|
const { renderPromptContext } = await import("./render/prompt-context.js");
|
|
@@ -579,7 +581,9 @@ async function handlePromptContext(root, rest) {
|
|
|
579
581
|
instanceId,
|
|
580
582
|
sessionId: sessionId,
|
|
581
583
|
agentName,
|
|
584
|
+
sessionNameNudge,
|
|
582
585
|
taskNudge,
|
|
586
|
+
statusFooterNudge,
|
|
583
587
|
});
|
|
584
588
|
process.stdout.write(text);
|
|
585
589
|
return 0;
|
|
@@ -689,10 +693,10 @@ async function handleEmitEvent(root, rest) {
|
|
|
689
693
|
const eventType = args.type;
|
|
690
694
|
const instanceId = args.owner;
|
|
691
695
|
const sessionId = args.session;
|
|
692
|
-
const
|
|
696
|
+
const adapter = args.adapter;
|
|
693
697
|
const dataJson = args["data-json"] ?? "{}";
|
|
694
|
-
if (!eventType || !instanceId || !sessionId || !
|
|
695
|
-
process.stderr.write("agent-coord emit-event --type <T> --owner <id> --session <id> --
|
|
698
|
+
if (!eventType || !instanceId || !sessionId || !adapter) {
|
|
699
|
+
process.stderr.write("agent-coord emit-event --type <T> --owner <id> --session <id> --adapter <h> [--data-json '<json>']\n");
|
|
696
700
|
return 2;
|
|
697
701
|
}
|
|
698
702
|
let data;
|
|
@@ -714,7 +718,7 @@ async function handleEmitEvent(root, rest) {
|
|
|
714
718
|
event_type: eventType,
|
|
715
719
|
instance_id: instanceId,
|
|
716
720
|
session_id: sessionId,
|
|
717
|
-
|
|
721
|
+
adapter,
|
|
718
722
|
turn_id: args["turn-id"],
|
|
719
723
|
parent_session_id: args["parent-session-id"],
|
|
720
724
|
parent_turn_id: args["parent-turn-id"],
|
|
@@ -751,8 +755,8 @@ async function main() {
|
|
|
751
755
|
subcommand === "stamp-tool-activity") {
|
|
752
756
|
return handleStateAction(root, subcommand, rest);
|
|
753
757
|
}
|
|
754
|
-
if (subcommand === "append-
|
|
755
|
-
return
|
|
758
|
+
if (subcommand === "append-journal" || subcommand === "edit-journal") {
|
|
759
|
+
return handleJournalAction(root, subcommand, rest);
|
|
756
760
|
}
|
|
757
761
|
if (subcommand === "council-advance" ||
|
|
758
762
|
subcommand === "council-close" ||
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Production codex sessions emit canonical events from each `harn` invocation
|
|
5
5
|
* via the in-process session-tee middleware (which calls `agent-coord
|
|
6
6
|
* emit-event` for state.task_set / state.status_checked). But the codex
|
|
7
|
-
*
|
|
7
|
+
* adapter itself doesn't wire agent-hook on preToolUse, so user_prompt.submit
|
|
8
8
|
* + tool.pre_use + turn.stop aren't emitted live.
|
|
9
9
|
*
|
|
10
10
|
* This module parses the Codex JSONL transcript at stop time and emits the
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Production codex sessions emit canonical events from each `harn` invocation
|
|
5
5
|
* via the in-process session-tee middleware (which calls `agent-coord
|
|
6
6
|
* emit-event` for state.task_set / state.status_checked). But the codex
|
|
7
|
-
*
|
|
7
|
+
* adapter itself doesn't wire agent-hook on preToolUse, so user_prompt.submit
|
|
8
8
|
* + tool.pre_use + turn.stop aren't emitted live.
|
|
9
9
|
*
|
|
10
10
|
* This module parses the Codex JSONL transcript at stop time and emits the
|
|
@@ -49,7 +49,7 @@ export function replayCodexJsonl(opts) {
|
|
|
49
49
|
event_type: "user_prompt.submit",
|
|
50
50
|
instance_id: instanceId,
|
|
51
51
|
session_id: sessionId,
|
|
52
|
-
|
|
52
|
+
adapter: "codex",
|
|
53
53
|
ts,
|
|
54
54
|
data: {
|
|
55
55
|
prompt_text: clamp(entry.payload.message ?? "", 4000),
|
|
@@ -75,7 +75,7 @@ export function replayCodexJsonl(opts) {
|
|
|
75
75
|
event_type: "tool.pre_use",
|
|
76
76
|
instance_id: instanceId,
|
|
77
77
|
session_id: sessionId,
|
|
78
|
-
|
|
78
|
+
adapter: "codex",
|
|
79
79
|
ts,
|
|
80
80
|
data: {
|
|
81
81
|
tool_name: name === "exec_command" ? "Bash" : name,
|
|
@@ -94,7 +94,7 @@ export function replayCodexJsonl(opts) {
|
|
|
94
94
|
event_type: "state.status_checked",
|
|
95
95
|
instance_id: instanceId,
|
|
96
96
|
session_id: sessionId,
|
|
97
|
-
|
|
97
|
+
adapter: "codex",
|
|
98
98
|
ts,
|
|
99
99
|
data: { source: "codex-replay" },
|
|
100
100
|
});
|
|
@@ -105,7 +105,7 @@ export function replayCodexJsonl(opts) {
|
|
|
105
105
|
event_type: "state.task_set",
|
|
106
106
|
instance_id: instanceId,
|
|
107
107
|
session_id: sessionId,
|
|
108
|
-
|
|
108
|
+
adapter: "codex",
|
|
109
109
|
ts,
|
|
110
110
|
data: { source: "codex-replay" },
|
|
111
111
|
});
|
|
@@ -121,7 +121,7 @@ export function replayCodexJsonl(opts) {
|
|
|
121
121
|
event_type: "turn.stop",
|
|
122
122
|
instance_id: instanceId,
|
|
123
123
|
session_id: sessionId,
|
|
124
|
-
|
|
124
|
+
adapter: "codex",
|
|
125
125
|
data: {
|
|
126
126
|
status_box_present: boxPresent,
|
|
127
127
|
tool_call_count: -1,
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Locate harnery's own bundled coordination binaries (`agent-coord`,
|
|
3
|
+
* `agent-hook`, `harn`).
|
|
4
|
+
*
|
|
5
|
+
* Every coord-helper spawn used to build its path as
|
|
6
|
+
* `<coordRoot>/harnery/bin/<name>`, which only exists in one host layout: a
|
|
7
|
+
* superproject carrying harnery as a submodule at `harnery/`. That assumption
|
|
8
|
+
* was load-bearing in the worst way — because the path missed whenever the
|
|
9
|
+
* resolved root was anything else, root resolution itself was bent toward the
|
|
10
|
+
* git superproject to keep the spawns working, which is what split the CLI's
|
|
11
|
+
* root from the hook's and blocked end-of-turn rule 1/3. The same missing path
|
|
12
|
+
* also surfaced as a crash rather than an error: `spawnSync` on a nonexistent
|
|
13
|
+
* binary reports `status: null` and `stderr: null`, so a caller checking
|
|
14
|
+
* `status !== 0` then reading `stderr.trim()` threw "null is not an object".
|
|
15
|
+
*
|
|
16
|
+
* The binaries ship inside the harnery package, so the package is what knows
|
|
17
|
+
* where they are. Resolution walks up from this module to the package root,
|
|
18
|
+
* which covers every install shape: `src/` under Bun, `dist/` on Node, and
|
|
19
|
+
* `node_modules/harnery/`. The layout-specific paths remain as fallbacks so a
|
|
20
|
+
* host whose harnery copy is not the one executing (a vendored tree, a shim)
|
|
21
|
+
* still resolves.
|
|
22
|
+
*/
|
|
23
|
+
export type CoordBinName = "agent-coord" | "agent-hook" | "harn";
|
|
24
|
+
/**
|
|
25
|
+
* Absolute path to one of harnery's bundled binaries, or null when no candidate
|
|
26
|
+
* exists on disk. Callers must handle null — a missing helper is a real state
|
|
27
|
+
* (a partially installed package) and silently spawning a nonexistent path is
|
|
28
|
+
* what produced the null-deref crash above.
|
|
29
|
+
*/
|
|
30
|
+
export declare function coordBinPath(name: CoordBinName, coordRoot?: string | null): string | null;
|
|
31
|
+
/** Candidate paths for `name`, in resolution order. Exported for tests. */
|
|
32
|
+
export declare function coordBinCandidates(name: CoordBinName, coordRoot?: string | null): string[];
|
|
33
|
+
//# sourceMappingURL=coord-bin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coord-bin.d.ts","sourceRoot":"","sources":["../../../src/core/agents/coord-bin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;AAEjE;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAKzF;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAuB1F"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Locate harnery's own bundled coordination binaries (`agent-coord`,
|
|
3
|
+
* `agent-hook`, `harn`).
|
|
4
|
+
*
|
|
5
|
+
* Every coord-helper spawn used to build its path as
|
|
6
|
+
* `<coordRoot>/harnery/bin/<name>`, which only exists in one host layout: a
|
|
7
|
+
* superproject carrying harnery as a submodule at `harnery/`. That assumption
|
|
8
|
+
* was load-bearing in the worst way — because the path missed whenever the
|
|
9
|
+
* resolved root was anything else, root resolution itself was bent toward the
|
|
10
|
+
* git superproject to keep the spawns working, which is what split the CLI's
|
|
11
|
+
* root from the hook's and blocked end-of-turn rule 1/3. The same missing path
|
|
12
|
+
* also surfaced as a crash rather than an error: `spawnSync` on a nonexistent
|
|
13
|
+
* binary reports `status: null` and `stderr: null`, so a caller checking
|
|
14
|
+
* `status !== 0` then reading `stderr.trim()` threw "null is not an object".
|
|
15
|
+
*
|
|
16
|
+
* The binaries ship inside the harnery package, so the package is what knows
|
|
17
|
+
* where they are. Resolution walks up from this module to the package root,
|
|
18
|
+
* which covers every install shape: `src/` under Bun, `dist/` on Node, and
|
|
19
|
+
* `node_modules/harnery/`. The layout-specific paths remain as fallbacks so a
|
|
20
|
+
* host whose harnery copy is not the one executing (a vendored tree, a shim)
|
|
21
|
+
* still resolves.
|
|
22
|
+
*/
|
|
23
|
+
import { existsSync } from "node:fs";
|
|
24
|
+
import { dirname, join, resolve } from "node:path";
|
|
25
|
+
import { fileURLToPath } from "node:url";
|
|
26
|
+
import { coordEnv } from "../../lib/env.js";
|
|
27
|
+
/**
|
|
28
|
+
* Absolute path to one of harnery's bundled binaries, or null when no candidate
|
|
29
|
+
* exists on disk. Callers must handle null — a missing helper is a real state
|
|
30
|
+
* (a partially installed package) and silently spawning a nonexistent path is
|
|
31
|
+
* what produced the null-deref crash above.
|
|
32
|
+
*/
|
|
33
|
+
export function coordBinPath(name, coordRoot) {
|
|
34
|
+
for (const candidate of coordBinCandidates(name, coordRoot)) {
|
|
35
|
+
if (existsSync(candidate))
|
|
36
|
+
return candidate;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
/** Candidate paths for `name`, in resolution order. Exported for tests. */
|
|
41
|
+
export function coordBinCandidates(name, coordRoot) {
|
|
42
|
+
const candidates = [];
|
|
43
|
+
const push = (value) => {
|
|
44
|
+
if (value && !candidates.includes(value))
|
|
45
|
+
candidates.push(value);
|
|
46
|
+
};
|
|
47
|
+
// Explicit pin, for a host that relocates the binaries.
|
|
48
|
+
const pinned = coordEnv("BIN_DIR");
|
|
49
|
+
if (pinned)
|
|
50
|
+
push(join(pinned, name));
|
|
51
|
+
// The package this code is executing from.
|
|
52
|
+
const pkgRoot = packageRoot(name);
|
|
53
|
+
if (pkgRoot)
|
|
54
|
+
push(join(pkgRoot, "bin", name));
|
|
55
|
+
if (coordRoot) {
|
|
56
|
+
// Host layouts, in decreasing specificity: harnery as a submodule, as an
|
|
57
|
+
// installed dependency, or the coord root being harnery's own checkout.
|
|
58
|
+
push(resolve(coordRoot, "harnery", "bin", name));
|
|
59
|
+
push(resolve(coordRoot, "node_modules", "harnery", "bin", name));
|
|
60
|
+
push(resolve(coordRoot, "bin", name));
|
|
61
|
+
}
|
|
62
|
+
return candidates;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Walk up from this module to the directory holding `bin/<name>`.
|
|
66
|
+
*
|
|
67
|
+
* The walk keys on the binary itself rather than on `package.json`, because
|
|
68
|
+
* both `src/core/agents/` and the built `dist/core/agents/` sit under the same
|
|
69
|
+
* package root and only the binary's presence proves we found the right level.
|
|
70
|
+
*/
|
|
71
|
+
function packageRoot(name) {
|
|
72
|
+
let dir;
|
|
73
|
+
try {
|
|
74
|
+
dir = dirname(fileURLToPath(import.meta.url));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// No import.meta (a CJS transpile); the coordRoot fallbacks still apply.
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
for (let hop = 0; hop < 8; hop++) {
|
|
81
|
+
if (existsSync(join(dir, "bin", name)))
|
|
82
|
+
return dir;
|
|
83
|
+
const parent = dirname(dir);
|
|
84
|
+
if (parent === dir)
|
|
85
|
+
break;
|
|
86
|
+
dir = parent;
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
@@ -38,7 +38,7 @@ export interface Heartbeat {
|
|
|
38
38
|
last_tool_target?: string;
|
|
39
39
|
/** Free-form task/intent string set via `harn agents set-task`. Phase 2. */
|
|
40
40
|
task?: string;
|
|
41
|
-
/** UTC ISO-8601 timestamp when task was last set/cleared. Used by
|
|
41
|
+
/** UTC ISO-8601 timestamp when task was last set/cleared. Used by adapters without Stop enforcement to compute staleness. 2026-05-24. */
|
|
42
42
|
task_updated_at?: string | null;
|
|
43
43
|
/** Auto-generated per-turn summary written by the Stop hook via Haiku. 2026-05-23. */
|
|
44
44
|
turn_summary?: string | null;
|
|
@@ -50,18 +50,78 @@ export interface Heartbeat {
|
|
|
50
50
|
/**
|
|
51
51
|
* Resolve the monorepo root for coord-state purposes.
|
|
52
52
|
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* `<superproject>/.git/modules/<name>/` to recover the superproject for
|
|
56
|
-
* submodule worktrees. Without that fallback, a TS coord caller running
|
|
57
|
-
* inside a `harn worktree add-submodule` checkout would resolve a different
|
|
58
|
-
* `.harnery/` than the bash hooks and the two layers would silently diverge.
|
|
53
|
+
* Thin alias for `resolveCoordRoot()`; kept because it is the name the CLI
|
|
54
|
+
* command modules and the vendored downstream consumer already import.
|
|
59
55
|
*/
|
|
60
56
|
export declare function monorepoRoot(): string | null;
|
|
57
|
+
/**
|
|
58
|
+
* THE coordination-root resolution. Every surface — the hooks, the CLI's reads,
|
|
59
|
+
* and the CLI's canonical emits — resolves through this one function, because a
|
|
60
|
+
* root the two layers disagree about is a root that silently breaks the
|
|
61
|
+
* end-of-turn rules: the hook evaluates `state.status_checked` from the stream
|
|
62
|
+
* it reads, so an emit into a different `.harnery/events.ndjson` is invisible
|
|
63
|
+
* and rule 1/3 blocks a turn that did run `agents status`, with no sequence of
|
|
64
|
+
* CLI commands able to satisfy it.
|
|
65
|
+
*
|
|
66
|
+
* Precedence:
|
|
67
|
+
* 1. `HARNERY_COORD_ROOT_OVERRIDE` — explicit pin (tests, git hooks, and the
|
|
68
|
+
* root every coord-helper spawn pins for its child).
|
|
69
|
+
* 2. `CLAUDE_PROJECT_DIR` — the adapter stating which project it opened. Hook
|
|
70
|
+
* processes inherit the session's *shell* cwd, which follows `cd` into a
|
|
71
|
+
* subdirectory or submodule that may carry a `.harnery/` of its own (or
|
|
72
|
+
* none at all), so the adapter's own statement outranks the cwd walk.
|
|
73
|
+
* 3. The candidate root that already holds THIS session's heartbeat.
|
|
74
|
+
* 4. The nearest enclosing `.harnery/`, then a git-derived root.
|
|
75
|
+
*
|
|
76
|
+
* Step 3 is what makes CLI/hook disagreement structurally impossible rather
|
|
77
|
+
* than a coin flip. Choosing either root unconditionally is wrong in one
|
|
78
|
+
* direction each: preferring the git superproject strands a session whose
|
|
79
|
+
* adapter opened the submodule itself (its heartbeat lives in the submodule,
|
|
80
|
+
* so status/set-task wrote events the hook never read), while walking up from
|
|
81
|
+
* cwd alone strands the opposite case, a session opened on the superproject
|
|
82
|
+
* whose shell has cd'd into a submodule that carries its own `.harnery/`
|
|
83
|
+
* (regression-tested in tests/unit/coord-helper-root-pin.test.ts). The session's
|
|
84
|
+
* own heartbeat settles it: whichever root the hook registered this session in
|
|
85
|
+
* is the root the CLI must use, and the adapter-exported session id needed to
|
|
86
|
+
* recognize it is available to a plain tool-call subprocess even though
|
|
87
|
+
* `CLAUDE_PROJECT_DIR` is not.
|
|
88
|
+
*/
|
|
89
|
+
export declare function resolveCoordRoot(start?: string): string | null;
|
|
90
|
+
/** Nearest enclosing directory carrying `.harnery/`, or null. */
|
|
91
|
+
export declare function nearestCoordRoot(start: string): string | null;
|
|
92
|
+
/**
|
|
93
|
+
* Does this root's `.harnery/` already know the process asking?
|
|
94
|
+
*
|
|
95
|
+
* Two discriminators, both genuinely about *this* session: the adapter-exported
|
|
96
|
+
* session id matching a live heartbeat, and a pid-map row on our own ppid
|
|
97
|
+
* chain. Deliberately NOT the single-live-agent fallback that owner resolution
|
|
98
|
+
* ends with — a lone stranger in the wrong root is exactly how `whoami` came to
|
|
99
|
+
* report another agent's name and task as its own.
|
|
100
|
+
*/
|
|
101
|
+
export declare function rootKnowsSession(root: string): boolean;
|
|
61
102
|
/** Parse owner from a pid-map row (`owner` or `owner\tplatform`). */
|
|
62
103
|
export declare function parsePidmapRowOwner(row: string): string;
|
|
63
104
|
/** Parse platform from a pid-map row; legacy rows default to `claude_code`. */
|
|
64
105
|
export declare function parsePidmapRowPlatform(row: string): string;
|
|
106
|
+
/** Parse the start token from a pid-map row; rows written before it carry none. */
|
|
107
|
+
export declare function parsePidmapRowStartToken(row: string): string | undefined;
|
|
108
|
+
/**
|
|
109
|
+
* Is the process now holding `pid` the one this row was written for?
|
|
110
|
+
*
|
|
111
|
+
* A pid is a number the OS re-issues, and quickly: a `pid_max` of 99999 against
|
|
112
|
+
* ~100 new processes a second recycles the whole space about every quarter
|
|
113
|
+
* hour. Believing a row past that point resolves this session to whichever
|
|
114
|
+
* agent last held the number — which is what made `whoami` report a stranger's
|
|
115
|
+
* name and files. The start token settles it, since two processes may share a
|
|
116
|
+
* pid but never a pid and a start instant.
|
|
117
|
+
*
|
|
118
|
+
* Deliberately inlined rather than imported from `state/proc-start.ts`: this
|
|
119
|
+
* file is vendored verbatim into a downstream consumer and stays on node
|
|
120
|
+
* builtins only. The token is a wire format shared with that module and with
|
|
121
|
+
* the host's commit guard, so the copies must agree byte for byte; exported so
|
|
122
|
+
* a test can hold this one against `processStartToken` and fail on drift.
|
|
123
|
+
*/
|
|
124
|
+
export declare function pidStartToken(pid: number): string | null;
|
|
65
125
|
/**
|
|
66
126
|
* Walk up the ppid chain looking for a pid-map entry. Returns
|
|
67
127
|
* the resolved instance_id or null.
|
|
@@ -87,7 +147,17 @@ export declare function resolveOwnerWithSource(): {
|
|
|
87
147
|
source: "env" | "pidmap" | "pidmap_fallback" | "session_env" | "active_singleton" | "none";
|
|
88
148
|
};
|
|
89
149
|
/**
|
|
90
|
-
*
|
|
150
|
+
* Walk our own ppid chain for a pid-map row in ONE given root.
|
|
151
|
+
*
|
|
152
|
+
* Root-parameterized (rather than resolving the root itself) so root resolution
|
|
153
|
+
* can use it as a discriminator without recursing back into itself.
|
|
154
|
+
*/
|
|
155
|
+
export declare function resolveOwnerByPidmap(root: string): {
|
|
156
|
+
owner: string | null;
|
|
157
|
+
source: "pidmap" | "pidmap_fallback" | "none";
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* Resolve the owner by matching the adapter session-id env var against the
|
|
91
161
|
* `session_id` of a live heartbeat in this coord root. Returns the matching
|
|
92
162
|
* `instance_id`, or null if there's no session-id env var or no live heartbeat
|
|
93
163
|
* carries it. "Live" reuses the same 10-minute freshness window the singleton
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coord-client.d.ts","sourceRoot":"","sources":["../../../src/core/agents/coord-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAWhE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAI5E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOhF;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oGAAoG;IACpG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,
|
|
1
|
+
{"version":3,"file":"coord-client.d.ts","sourceRoot":"","sources":["../../../src/core/agents/coord-client.ts"],"names":[],"mappings":"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"}
|