harnery 0.29.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 +2 -1
- package/dist/commands/work.d.ts.map +1 -1
- package/dist/commands/work.js +55 -25
- 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 +28 -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 +71 -51
- package/dist/core/governor/plan-types.d.ts +181 -0
- 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 +143 -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 +290 -116
- 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/runner.d.ts.map +1 -1
- package/dist/core/work/runner.js +11 -2
- package/dist/core/work/state.d.ts +28 -3
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +148 -16
- 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 +151 -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 +3 -2
- package/dist/core/workflow/index.d.ts.map +1 -1
- package/dist/core/workflow/index.js +2 -1
- package/dist/core/workflow/proof.d.ts +28 -5
- package/dist/core/workflow/proof.d.ts.map +1 -1
- package/dist/core/workflow/proof.js +77 -34
- 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 +28 -8
- 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 +26 -8
- 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 +27 -8
- package/dist/core/workflow/spawn-failure.d.ts +15 -1
- package/dist/core/workflow/spawn-failure.d.ts.map +1 -1
- package/dist/core/workflow/spawn-failure.js +35 -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 +119 -46
- 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/exec.d.ts +7 -0
- package/dist/lib/exec.d.ts.map +1 -1
- package/dist/lib/exec.js +6 -3
- 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 +72 -38
- 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 +28 -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 +120 -96
- package/src/core/{supervisor → governor}/plan-types.ts +64 -50
- package/src/core/{supervisor → governor}/planning.ts +240 -188
- 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 +389 -174
- 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/runner.ts +11 -2
- package/src/core/work/state.ts +185 -21
- 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 +166 -90
- package/src/core/workflow/evidence-preflight.ts +165 -0
- package/src/core/workflow/index.ts +6 -3
- package/src/core/workflow/proof.ts +94 -48
- 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 +34 -12
- package/src/core/workflow/spawn-codex.ts +30 -12
- package/src/core/workflow/spawn-cursor.ts +31 -12
- package/src/core/workflow/spawn-failure.ts +41 -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 +130 -46
- 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/exec.ts +13 -3
- 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 +0 -170
- 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,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Workflow engine contracts. A workflow is a small throwaway JS script with
|
|
3
|
-
* bounded, schema-gated stages that fan work out to headless
|
|
3
|
+
* bounded, schema-gated stages that fan work out to headless adapter-CLI
|
|
4
4
|
* subagents; the SCRIPT (deterministic code), not any model, decides routing
|
|
5
5
|
* between stages, and the run always terminates when the script returns.
|
|
6
6
|
*
|
|
@@ -28,7 +28,18 @@ export const WORKFLOW_PROOF_SCHEMA_VERSION = 1 as const;
|
|
|
28
28
|
export const WORKFLOW_WORK_CONTEXT_SCHEMA_VERSION = 1 as const;
|
|
29
29
|
export const WORKFLOW_ATTEMPT_CONTEXT_SCHEMA_VERSION = 1 as const;
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
/** The evidence vocabulary, as a value so the runtime validator and the
|
|
32
|
+
* pre-flight source scan cannot drift from the type or from each other. */
|
|
33
|
+
export const EVIDENCE_KINDS = [
|
|
34
|
+
"test",
|
|
35
|
+
"command",
|
|
36
|
+
"artifact",
|
|
37
|
+
"change",
|
|
38
|
+
"review",
|
|
39
|
+
"observation",
|
|
40
|
+
] as const;
|
|
41
|
+
|
|
42
|
+
export type EvidenceKind = (typeof EVIDENCE_KINDS)[number];
|
|
32
43
|
export type EvidenceStatus = "passed" | "failed" | "observed" | "unknown";
|
|
33
44
|
export type EvidenceSource = "workflow" | "engine";
|
|
34
45
|
export type AcceptanceStatus = "satisfied" | "unsatisfied" | "unknown";
|
|
@@ -90,7 +101,7 @@ export interface WorkflowAgentProof {
|
|
|
90
101
|
label: string;
|
|
91
102
|
stage?: string;
|
|
92
103
|
specialist?: string;
|
|
93
|
-
|
|
104
|
+
adapter: AdapterName;
|
|
94
105
|
model?: string;
|
|
95
106
|
status: "succeeded" | "failed" | "cached";
|
|
96
107
|
attempts: number;
|
|
@@ -99,6 +110,11 @@ export interface WorkflowAgentProof {
|
|
|
99
110
|
session_id?: string;
|
|
100
111
|
result?: ResultDigest;
|
|
101
112
|
error?: string;
|
|
113
|
+
/** Set on a failed agent whose spawn was classified uninformative about the
|
|
114
|
+
* work (ADR 0046): environment (binary absent) or upstream (vendor refused).
|
|
115
|
+
* Absent ⇒ a work failure. Recorded even when a script's parallel() swallows
|
|
116
|
+
* the rejection, so the run-level class can still be derived from proof. */
|
|
117
|
+
class?: SpawnFailureClass;
|
|
102
118
|
}
|
|
103
119
|
|
|
104
120
|
export interface WorkflowRepoSnapshot {
|
|
@@ -126,16 +142,16 @@ export interface WorkflowRepoEvidence {
|
|
|
126
142
|
};
|
|
127
143
|
}
|
|
128
144
|
|
|
129
|
-
/** Bounded pointer to the live attestation backing a
|
|
145
|
+
/** Bounded pointer to the live attestation backing a adapter's claims
|
|
130
146
|
* (ADR 0038). Structural facts only: no prompt text, no host paths. */
|
|
131
|
-
export interface
|
|
147
|
+
export interface AdapterAttestationCitation {
|
|
132
148
|
binary_version: string;
|
|
133
149
|
observed_at: string;
|
|
134
150
|
record_digest: string;
|
|
135
151
|
}
|
|
136
152
|
|
|
137
|
-
export interface
|
|
138
|
-
|
|
153
|
+
export interface AdapterEvidenceCoverage {
|
|
154
|
+
adapter: AdapterName;
|
|
139
155
|
tool_evidence: {
|
|
140
156
|
support: "supported" | "partial" | "unsupported" | "unknown";
|
|
141
157
|
note?: string;
|
|
@@ -145,10 +161,10 @@ export interface HarnessEvidenceCoverage {
|
|
|
145
161
|
session_ids: number;
|
|
146
162
|
costs: number;
|
|
147
163
|
};
|
|
148
|
-
/** What backs this
|
|
164
|
+
/** What backs this adapter's capability claims (ADR 0038). Absent when the
|
|
149
165
|
* host recorded no live attestation, which is the common case and is not by
|
|
150
166
|
* itself a proof unknown. */
|
|
151
|
-
attestation?:
|
|
167
|
+
attestation?: AdapterAttestationCitation;
|
|
152
168
|
}
|
|
153
169
|
|
|
154
170
|
export interface WorkflowSandboxProjectionEvidence {
|
|
@@ -161,12 +177,12 @@ export interface WorkflowSandboxProjectionEvidence {
|
|
|
161
177
|
export interface WorkflowProofUnknown {
|
|
162
178
|
code:
|
|
163
179
|
| "tool_evidence_unavailable"
|
|
164
|
-
| "
|
|
180
|
+
| "adapter_capability_unregistered"
|
|
165
181
|
| "agent_cost_unreported"
|
|
166
182
|
| "agent_session_unreported"
|
|
167
183
|
| "repository_drift_incomplete";
|
|
168
184
|
message: string;
|
|
169
|
-
|
|
185
|
+
adapter?: AdapterName;
|
|
170
186
|
agent_id?: string;
|
|
171
187
|
}
|
|
172
188
|
|
|
@@ -186,6 +202,17 @@ export interface WorkflowProof {
|
|
|
186
202
|
objective?: string;
|
|
187
203
|
error?: string;
|
|
188
204
|
result?: ResultDigest;
|
|
205
|
+
/** Set on a failed run that was uninformative about the work (ADR 0046):
|
|
206
|
+
* environment, upstream, or decision. The first two are derived from the
|
|
207
|
+
* agents' classes when no agent produced a result; `decision` is declared by
|
|
208
|
+
* the script through ctx.blocked(). Absent ⇒ the attempt is charged as
|
|
209
|
+
* before. The durable work projection reads this to decide charging,
|
|
210
|
+
* stopping, and the uncharged-attempt bound. */
|
|
211
|
+
class?: RunFailureClass;
|
|
212
|
+
/** Docket id of the decision this run stopped on. Only ever set alongside
|
|
213
|
+
* class "decision", and only when the script named one. Carried so the work
|
|
214
|
+
* projection can point a human at the exact question rather than at prose. */
|
|
215
|
+
decision_id?: string;
|
|
189
216
|
};
|
|
190
217
|
acceptance: {
|
|
191
218
|
criteria: AcceptanceResult[];
|
|
@@ -201,11 +228,11 @@ export interface WorkflowProof {
|
|
|
201
228
|
* Absent means no projection was applied, which is the default. Present means
|
|
202
229
|
* the run can be audited for exactly what its children could write. */
|
|
203
230
|
sandbox_projection?: WorkflowSandboxProjectionEvidence;
|
|
204
|
-
|
|
231
|
+
adapters: AdapterEvidenceCoverage[];
|
|
205
232
|
unknowns: WorkflowProofUnknown[];
|
|
206
233
|
integrity: {
|
|
207
|
-
|
|
208
|
-
path: "
|
|
234
|
+
transcript: {
|
|
235
|
+
path: "transcript.jsonl";
|
|
209
236
|
sha256: string;
|
|
210
237
|
bytes: number;
|
|
211
238
|
};
|
|
@@ -228,8 +255,8 @@ export interface WorkflowPolicyProof {
|
|
|
228
255
|
};
|
|
229
256
|
}
|
|
230
257
|
|
|
231
|
-
export interface
|
|
232
|
-
toolEvidence:
|
|
258
|
+
export interface AdapterEvidenceCapability {
|
|
259
|
+
toolEvidence: AdapterEvidenceCoverage["tool_evidence"];
|
|
233
260
|
}
|
|
234
261
|
|
|
235
262
|
/** JSON-schema *subset* accepted by stage gates (see validate.ts). */
|
|
@@ -261,36 +288,36 @@ export interface AgentOpts {
|
|
|
261
288
|
* validate; the engine retries with the validation error appended, up to
|
|
262
289
|
* `maxAttempts`. Without it, `agent()` resolves to the raw reply text. */
|
|
263
290
|
schema?: StageSchema;
|
|
264
|
-
/** Model slug passed through to the
|
|
291
|
+
/** Model slug passed through to the adapter CLI (default: the CLI's default). */
|
|
265
292
|
model?: string;
|
|
266
|
-
/** Reasoning effort mapped through the selected
|
|
293
|
+
/** Reasoning effort mapped through the selected adapter profile. Unsupported
|
|
267
294
|
* values fail before the vendor process starts. */
|
|
268
295
|
effort?: string;
|
|
269
296
|
/** Attempt ceiling for the schema-retry loop (default 2). */
|
|
270
297
|
maxAttempts?: number;
|
|
271
298
|
/** Subprocess timeout ms (default 300_000). */
|
|
272
299
|
timeoutMs?: number;
|
|
273
|
-
/**
|
|
300
|
+
/** Adapter-turn ceiling for the child (default 25; use 1 for pure
|
|
274
301
|
* classification stages — cheaper and faster). */
|
|
275
302
|
maxTurns?: number;
|
|
276
|
-
/** Display label in the
|
|
303
|
+
/** Display label in the transcript (default: prompt head). */
|
|
277
304
|
label?: string;
|
|
278
|
-
/** Which
|
|
279
|
-
* Mixed-
|
|
305
|
+
/** Which adapter runs this agent (default: the run's default adapter).
|
|
306
|
+
* Mixed-adapter workflows are legal: triage on one CLI, deep work on
|
|
280
307
|
* another. */
|
|
281
|
-
|
|
308
|
+
adapter?: AdapterName;
|
|
282
309
|
}
|
|
283
310
|
|
|
284
311
|
/** Open registry key. The built-in catalog currently contains Claude Code,
|
|
285
312
|
* Codex, and Cursor; consumers may register another adapter without widening
|
|
286
313
|
* a package-owned union first. */
|
|
287
|
-
export type
|
|
314
|
+
export type AdapterName = string;
|
|
288
315
|
|
|
289
|
-
/** Durable role defaults supplied by a goal
|
|
316
|
+
/** Durable role defaults supplied by a goal governor or embedding host.
|
|
290
317
|
* Profiles are frozen into a workflow run manifest before the first spawn. */
|
|
291
318
|
export interface WorkflowSpecialistProfile {
|
|
292
319
|
instructions: string;
|
|
293
|
-
|
|
320
|
+
adapter?: AdapterName;
|
|
294
321
|
model?: string;
|
|
295
322
|
effort?: string;
|
|
296
323
|
maxAttempts?: number;
|
|
@@ -298,17 +325,51 @@ export interface WorkflowSpecialistProfile {
|
|
|
298
325
|
maxTurns?: number;
|
|
299
326
|
}
|
|
300
327
|
|
|
328
|
+
/**
|
|
329
|
+
* Why a failed run was uninformative about the work (ADR 0046). Absent means
|
|
330
|
+
* the attempt produced information about the work (or succeeded), which is the
|
|
331
|
+
* default and is charged against the attempt budget exactly as before.
|
|
332
|
+
*
|
|
333
|
+
* - `environment`: the run never started — a precondition was missing (the
|
|
334
|
+
* vendor binary was absent). Uncharged AND not retried: retrying an unchanged
|
|
335
|
+
* environment cannot help, so the work item stops and names the precondition.
|
|
336
|
+
* - `upstream`: the vendor was reached and refused (5xx, 429, circuit open).
|
|
337
|
+
* Uncharged, but retry stays available (bounded by max_uncharged_attempts).
|
|
338
|
+
*/
|
|
339
|
+
export type SpawnFailureClass = "environment" | "upstream";
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Why a failed run was uninformative about the work. A superset of
|
|
343
|
+
* {@link SpawnFailureClass}: a spawn can fail for reasons outside the work, and
|
|
344
|
+
* so can the script itself.
|
|
345
|
+
*
|
|
346
|
+
* - `decision`: the script reached a correct conclusion and that conclusion is
|
|
347
|
+
* that a human must rule before the work can proceed. Nothing about the work
|
|
348
|
+
* was wrong, so the attempt is uncharged; nothing about a retry can help,
|
|
349
|
+
* because the blocker is a person, so the item stops and names the decision.
|
|
350
|
+
*
|
|
351
|
+
* This class exists because without it a correct refusal and a botched attempt
|
|
352
|
+
* are the same outcome to the engine. Automatic retry then re-issues work an
|
|
353
|
+
* agent already answered correctly, once per attempt budget, and the answer is
|
|
354
|
+
* identical every time — the loop cannot converge, because the thing it is
|
|
355
|
+
* waiting for is a person who was never told.
|
|
356
|
+
*/
|
|
357
|
+
export type RunFailureClass = SpawnFailureClass | "decision";
|
|
358
|
+
|
|
301
359
|
/** What a spawn adapter returns for one subagent run. */
|
|
302
360
|
export interface SpawnResult {
|
|
303
361
|
ok: boolean;
|
|
304
362
|
/** The model's final reply text (envelope-unwrapped). */
|
|
305
363
|
text: string;
|
|
306
|
-
/** Child
|
|
364
|
+
/** Child adapter session id when the envelope carries one. */
|
|
307
365
|
sessionId?: string;
|
|
308
366
|
costUsd?: number;
|
|
309
367
|
durationMs: number;
|
|
310
368
|
/** Populated when ok=false. */
|
|
311
369
|
error?: string;
|
|
370
|
+
/** Set when ok=false and the failure was positively identified as
|
|
371
|
+
* uninformative about the work. Absent ⇒ a work failure (charged). */
|
|
372
|
+
class?: SpawnFailureClass;
|
|
312
373
|
}
|
|
313
374
|
|
|
314
375
|
export interface SpawnRequest {
|
|
@@ -321,6 +382,10 @@ export interface SpawnRequest {
|
|
|
321
382
|
/** Run id, stamped into the child env (HARNERY_WORKFLOW_RUN_ID) so the
|
|
322
383
|
* coord layer can associate child sessions with their workflow run. */
|
|
323
384
|
runId?: string;
|
|
385
|
+
/** Transcript agent id (`a1`, `a2`, …), stamped into the child env
|
|
386
|
+
* (HARNERY_WORKFLOW_AGENT_ID) so in-flight child activity attributes to one
|
|
387
|
+
* agent row rather than only to the run. */
|
|
388
|
+
agentId?: string;
|
|
324
389
|
/** Scrub all API-key vars from the child env so it can only authenticate
|
|
325
390
|
* via its stored (subscription) login. See billing.ts. */
|
|
326
391
|
subscriptionOnly?: boolean;
|
|
@@ -370,14 +435,33 @@ export interface WorkflowContext {
|
|
|
370
435
|
agent: (prompt: string, opts?: AgentOpts) => Promise<unknown>;
|
|
371
436
|
/** Run thunks with bounded concurrency; a rejected thunk resolves to null. */
|
|
372
437
|
parallel: <T>(thunks: Array<() => Promise<T>>) => Promise<Array<T | null>>;
|
|
373
|
-
/** Declare the current stage (
|
|
438
|
+
/** Declare the current stage (transcript + progress grouping). */
|
|
374
439
|
stage: (title: string) => void;
|
|
375
|
-
/** Narrate progress (stderr +
|
|
440
|
+
/** Narrate progress (stderr + transcript). */
|
|
376
441
|
log: (message: string) => void;
|
|
377
442
|
/** Attach a bounded, sourced receipt to the run and optional acceptance criteria. */
|
|
378
443
|
evidence: (input: WorkflowEvidenceInput) => string;
|
|
379
444
|
/** Authorize one host-mediated external mutation before performing it. */
|
|
380
445
|
authorize: (input: ExternalMutationRequest) => Promise<PolicyDecision>;
|
|
446
|
+
/** Stop the run because a human must rule before the work can proceed.
|
|
447
|
+
*
|
|
448
|
+
* This is not a failure and must not be used as one. Reach for it only when
|
|
449
|
+
* the script determined something *correct* — that the question in front of
|
|
450
|
+
* it belongs to a person. The run ends uncharged and the work item stops
|
|
451
|
+
* naming the decision, so no automatic retry re-issues work that was already
|
|
452
|
+
* answered correctly. A plain `throw` means the opposite: the work failed and
|
|
453
|
+
* a retry might do better. */
|
|
454
|
+
blocked: (input: BlockedInput) => never;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/** Why a run stopped on a human. */
|
|
458
|
+
export interface BlockedInput {
|
|
459
|
+
/** What a human has to settle, in one sentence. Shown verbatim to the
|
|
460
|
+
* operator as the work item's reason, so write it for them, not for a log. */
|
|
461
|
+
reason: string;
|
|
462
|
+
/** Docket id of the decision to resolve. Strongly preferred: without it the
|
|
463
|
+
* operator gets prose and has to go find the question themselves. */
|
|
464
|
+
decision?: string;
|
|
381
465
|
}
|
|
382
466
|
|
|
383
467
|
export interface WorkflowMeta {
|
|
@@ -442,18 +526,18 @@ export interface WorkflowOperatorFinding {
|
|
|
442
526
|
}
|
|
443
527
|
|
|
444
528
|
export interface EngineOpts {
|
|
445
|
-
/** Repo root whose .harnery/ receives the run
|
|
529
|
+
/** Repo root whose .harnery/ receives the run transcript. */
|
|
446
530
|
coordRoot: string;
|
|
447
|
-
/** Spawner registry keyed by
|
|
448
|
-
* entry and names it in `
|
|
449
|
-
spawners: Readonly<Record<
|
|
450
|
-
/**
|
|
451
|
-
|
|
531
|
+
/** Spawner registry keyed by adapter. A single-adapter caller registers one
|
|
532
|
+
* entry and names it in `defaultAdapter`. */
|
|
533
|
+
spawners: Readonly<Record<AdapterName, Spawner | undefined>>;
|
|
534
|
+
/** Adapter used when an agent() call doesn't name one (default "claude-code"). */
|
|
535
|
+
defaultAdapter?: AdapterName;
|
|
452
536
|
/** Named specialist roles available to agent(..., { specialist }). */
|
|
453
537
|
specialists?: Readonly<Record<string, WorkflowSpecialistProfile>>;
|
|
454
|
-
/** Resume: run id of a prior run whose
|
|
538
|
+
/** Resume: run id of a prior run whose transcript supplies cached results.
|
|
455
539
|
* agent() calls whose (stage, prompt, model, maxTurns, schema) key matches a
|
|
456
|
-
* completed prior agent return the
|
|
540
|
+
* completed prior agent return the transcripted result without spawning. */
|
|
457
541
|
resumeFrom?: string;
|
|
458
542
|
/** Continue a parked run in its original directory after its durable
|
|
459
543
|
* approval has been resolved. The frozen run manifest supplies execution
|
|
@@ -478,7 +562,7 @@ export interface EngineOpts {
|
|
|
478
562
|
/** Progress sink (default: process.stderr). */
|
|
479
563
|
onLog?: (line: string) => void;
|
|
480
564
|
/** Guarantee subscription billing: API-key vars are scrubbed from every
|
|
481
|
-
* child env, and a
|
|
565
|
+
* child env, and a adapter whose stored login is provably absent fails
|
|
482
566
|
* loud before spawning. */
|
|
483
567
|
subscriptionOnly?: boolean;
|
|
484
568
|
/** Permit the api-key-override billing state (an exported API key silently
|
|
@@ -490,10 +574,10 @@ export interface EngineOpts {
|
|
|
490
574
|
probeBilling?: BillingProber;
|
|
491
575
|
/** Capability claims used to state whether adapter-native tool evidence was
|
|
492
576
|
* available. Missing claims remain unknown. */
|
|
493
|
-
|
|
494
|
-
/** Live attestations backing each
|
|
577
|
+
adapterEvidence?: Readonly<Record<AdapterName, AdapterEvidenceCapability | undefined>>;
|
|
578
|
+
/** Live attestations backing each adapter's claims (ADR 0038). Read once by
|
|
495
579
|
* the host and injected, so the engine performs no capability lookups. */
|
|
496
|
-
|
|
580
|
+
adapterAttestations?: Readonly<Record<AdapterName, AdapterAttestationCitation | undefined>>;
|
|
497
581
|
/** Filesystem policy projected into every child's own vendor sandbox
|
|
498
582
|
* (ADR 0039). Validated against the workspace binding before the first spawn,
|
|
499
583
|
* and recorded in proof. Absent leaves every adapter invocation unchanged. */
|
|
@@ -524,7 +608,7 @@ export interface EngineOpts {
|
|
|
524
608
|
approvalAddressee?: string;
|
|
525
609
|
/** Execution boundary created by the host (default shared). */
|
|
526
610
|
isolation?: PolicyIsolation;
|
|
527
|
-
/** Network state of spawned
|
|
611
|
+
/** Network state of spawned adapter subprocesses (default unknown). */
|
|
528
612
|
networkAccess?: PolicyNetworkAccess;
|
|
529
613
|
/** Explicit provider and host-owned roots. Omit for shared or declaration-only execution. */
|
|
530
614
|
workspace?: {
|
|
@@ -540,19 +624,19 @@ export interface RunReport {
|
|
|
540
624
|
/** What the script's default export returned. */
|
|
541
625
|
result: unknown;
|
|
542
626
|
agentsSpawned: number;
|
|
543
|
-
/** agent() calls satisfied from the resumeFrom
|
|
627
|
+
/** agent() calls satisfied from the resumeFrom transcript without spawning. */
|
|
544
628
|
agentsCached: number;
|
|
545
629
|
costUsd: number;
|
|
546
630
|
durationMs: number;
|
|
547
|
-
|
|
631
|
+
transcriptPath: string;
|
|
548
632
|
proofPath: string;
|
|
549
633
|
acceptance: AcceptanceSummary;
|
|
550
634
|
/** Estimated tokens of repo instructions (CLAUDE.md/AGENTS.md at the child
|
|
551
635
|
* cwd) that EVERY child cache-writes on spawn — the fixed per-child context
|
|
552
636
|
* overhead a fan-out multiplies. bytes/4 heuristic; 0 when no such file. */
|
|
553
637
|
contextTokensPerChildEstimate: number;
|
|
554
|
-
/** Billing mode per
|
|
555
|
-
billing: Array<{
|
|
638
|
+
/** Billing mode per adapter actually used this run (probed on first use). */
|
|
639
|
+
billing: Array<{ adapter: AdapterName; mode: BillingMode }>;
|
|
556
640
|
/** Policy verdict totals when the host supplied a policy. */
|
|
557
641
|
policy?: WorkflowPolicyProof["summary"];
|
|
558
642
|
/** Isolated workspace binding when this run requested a provider capability. */
|
|
@@ -114,7 +114,7 @@ export function validateAgainstSchema(value: unknown, schema: StageSchema, path
|
|
|
114
114
|
/**
|
|
115
115
|
* Parse one schema-gated JSON value.
|
|
116
116
|
*
|
|
117
|
-
* Exact JSON and a whole fenced value remain the normal paths. Some
|
|
117
|
+
* Exact JSON and a whole fenced value remain the normal paths. Some adapters
|
|
118
118
|
* prepend a short narration despite an explicit JSON-only contract. Accept
|
|
119
119
|
* that drift only when the reply contains exactly one unambiguous top-level
|
|
120
120
|
* object or array, the value reaches the end of the reply, and JSON.parse
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
} from "../../work/state.ts";
|
|
6
6
|
import { readWorkflowRunManifest } from "../run-state.ts";
|
|
7
7
|
import {
|
|
8
|
-
|
|
8
|
+
appendWorkflowTranscriptEvent,
|
|
9
9
|
readWorkflowSupplement,
|
|
10
10
|
stableDigest,
|
|
11
11
|
writeWorkflowSupplement,
|
|
@@ -72,7 +72,7 @@ export async function cancelWorkspace(
|
|
|
72
72
|
reason: result.reason,
|
|
73
73
|
};
|
|
74
74
|
writeWorkflowSupplement(input.coordRoot, input.runId, "cancellation/outcome.json", receipt);
|
|
75
|
-
|
|
75
|
+
appendWorkflowTranscriptEvent(input.coordRoot, input.runId, "workspace.cancel", {
|
|
76
76
|
binding_id: binding.binding_id,
|
|
77
77
|
provider_id: binding.provider.id,
|
|
78
78
|
receipt_id: receipt.receipt_id,
|
|
@@ -5,7 +5,7 @@ import { acquireNoClobberLease } from "./leases.ts";
|
|
|
5
5
|
import { containsPath } from "./paths.ts";
|
|
6
6
|
import {
|
|
7
7
|
appendCleanupAttempt,
|
|
8
|
-
|
|
8
|
+
appendWorkflowTranscriptEvent,
|
|
9
9
|
readCleanupAttempts,
|
|
10
10
|
readWorkflowSupplement,
|
|
11
11
|
stableDigest,
|
|
@@ -112,7 +112,7 @@ async function cleanupWorkspaceUnderLease(
|
|
|
112
112
|
reason: result.reason,
|
|
113
113
|
recorded_at: result.recorded_at,
|
|
114
114
|
});
|
|
115
|
-
|
|
115
|
+
appendWorkflowTranscriptEvent(input.coordRoot, input.runId, "workspace.cleanup", {
|
|
116
116
|
binding_id: binding.binding_id,
|
|
117
117
|
provider_id: binding.provider.id,
|
|
118
118
|
operation_id: intent.operation_id,
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
sameFilesystemIdentity,
|
|
11
11
|
validateConfiguredRoot,
|
|
12
12
|
} from "./paths.ts";
|
|
13
|
-
import {
|
|
13
|
+
import { appendWorkflowTranscriptEvent, stableDigest, writeWorkspaceRequest } from "./state.ts";
|
|
14
14
|
import type {
|
|
15
15
|
WorkspaceAttestation,
|
|
16
16
|
WorkspaceBinding,
|
|
@@ -72,7 +72,7 @@ export async function resolveWorkspaceBinding(input: {
|
|
|
72
72
|
unknowns: [],
|
|
73
73
|
receipts: {},
|
|
74
74
|
};
|
|
75
|
-
|
|
75
|
+
appendWorkflowTranscriptEvent(input.opts.coordRoot, input.runId, "workspace.compatibility", {
|
|
76
76
|
requested_isolation: fallback.requested_isolation,
|
|
77
77
|
effective_isolation: fallback.effective_isolation,
|
|
78
78
|
selection_reason: fallback.selection_reason,
|
|
@@ -114,7 +114,7 @@ export async function resolveWorkspaceBinding(input: {
|
|
|
114
114
|
}
|
|
115
115
|
throw new Error(`workflow run ${input.runId} could not reattach its frozen workspace`);
|
|
116
116
|
}
|
|
117
|
-
|
|
117
|
+
appendWorkflowTranscriptEvent(input.opts.coordRoot, input.runId, "workspace.reattach", {
|
|
118
118
|
binding_id: frozenBinding.binding_id,
|
|
119
119
|
provider_id: frozenBinding.provider.id,
|
|
120
120
|
attestation_sha256: stableDigest(reattached),
|
|
@@ -180,7 +180,7 @@ export async function resolveWorkspaceBinding(input: {
|
|
|
180
180
|
unknowns: [...probe.unknowns],
|
|
181
181
|
receipts: {},
|
|
182
182
|
};
|
|
183
|
-
|
|
183
|
+
appendWorkflowTranscriptEvent(input.opts.coordRoot, input.runId, "workspace.fallback", {
|
|
184
184
|
requested_isolation: fallback.requested_isolation,
|
|
185
185
|
effective_isolation: fallback.effective_isolation,
|
|
186
186
|
selection_reason: fallback.selection_reason,
|
|
@@ -226,7 +226,7 @@ export async function resolveWorkspaceBinding(input: {
|
|
|
226
226
|
idempotency_key: stableDigest(requestWithoutKey),
|
|
227
227
|
};
|
|
228
228
|
writeWorkspaceRequest(input.opts.coordRoot, request);
|
|
229
|
-
|
|
229
|
+
appendWorkflowTranscriptEvent(input.opts.coordRoot, input.runId, "execution.allocate.start", {
|
|
230
230
|
provider_id: probe.capabilities.provider_id,
|
|
231
231
|
request_sha256: stableDigest(request),
|
|
232
232
|
});
|
|
@@ -261,7 +261,7 @@ export async function resolveWorkspaceBinding(input: {
|
|
|
261
261
|
}
|
|
262
262
|
throw new Error("workspace provider returned a binding that failed initial attestation");
|
|
263
263
|
}
|
|
264
|
-
|
|
264
|
+
appendWorkflowTranscriptEvent(input.opts.coordRoot, input.runId, "execution.allocate.end", {
|
|
265
265
|
binding_id: binding.binding_id,
|
|
266
266
|
provider_id: binding.provider.id,
|
|
267
267
|
active_root: binding.active_root,
|
|
@@ -97,7 +97,7 @@ export type WorkflowWorkspaceInspection =
|
|
|
97
97
|
| { ok: true; value: WorkflowWorkspaceStatus }
|
|
98
98
|
| { ok: false; run_id: string; error: string };
|
|
99
99
|
|
|
100
|
-
interface
|
|
100
|
+
interface WorkflowTranscriptProjectionEvent {
|
|
101
101
|
event: string;
|
|
102
102
|
ok?: boolean;
|
|
103
103
|
status?: "blocked" | "lost" | "cancelled" | "unsupported" | "preserved_dirty";
|
|
@@ -119,7 +119,7 @@ export function readWorkflowWorkspaceStatus(
|
|
|
119
119
|
const root = resolve(coordRoot);
|
|
120
120
|
const runDir = workflowRunDir(root, runId);
|
|
121
121
|
const manifest = readWorkflowRunManifest(root, runId);
|
|
122
|
-
const
|
|
122
|
+
const transcript = readWorkspaceTranscript(runDir, runId);
|
|
123
123
|
const proofPath = join(runDir, "proof.json");
|
|
124
124
|
const proof = existsSync(proofPath) ? readWorkflowProof(root, runId) : undefined;
|
|
125
125
|
const proofSha256 = proof ? fileSha256(proofPath) : undefined;
|
|
@@ -129,7 +129,7 @@ export function readWorkflowWorkspaceStatus(
|
|
|
129
129
|
if (!binding) {
|
|
130
130
|
const lifecycle = deriveWorkspaceLifecycle({
|
|
131
131
|
manifest,
|
|
132
|
-
|
|
132
|
+
workflow_transcript: transcript,
|
|
133
133
|
proof,
|
|
134
134
|
proof_sha256: proofSha256,
|
|
135
135
|
allocation_unsupported: fallback !== undefined,
|
|
@@ -212,7 +212,7 @@ export function readWorkflowWorkspaceStatus(
|
|
|
212
212
|
binding,
|
|
213
213
|
provider_events: providerEvents,
|
|
214
214
|
manifest,
|
|
215
|
-
|
|
215
|
+
workflow_transcript: transcript,
|
|
216
216
|
proof,
|
|
217
217
|
proof_sha256: proofSha256,
|
|
218
218
|
integration_plan: integrationPlan,
|
|
@@ -355,8 +355,11 @@ export function renderWorkflowWorkspaceStatus(status: WorkflowWorkspaceStatus):
|
|
|
355
355
|
|
|
356
356
|
const MAX_LISTED_DIRTY_PATHS = 12;
|
|
357
357
|
|
|
358
|
-
function
|
|
359
|
-
|
|
358
|
+
function readWorkspaceTranscript(
|
|
359
|
+
runDir: string,
|
|
360
|
+
runId: string,
|
|
361
|
+
): WorkflowTranscriptProjectionEvent[] {
|
|
362
|
+
const path = join(runDir, "transcript.jsonl");
|
|
360
363
|
if (!existsSync(path)) return [];
|
|
361
364
|
return readFileSync(path, "utf8")
|
|
362
365
|
.split("\n")
|
|
@@ -367,7 +370,7 @@ function readWorkspaceJournal(runDir: string, runId: string): WorkflowJournalPro
|
|
|
367
370
|
record = JSON.parse(line) as Record<string, unknown>;
|
|
368
371
|
} catch (error) {
|
|
369
372
|
throw new Error(
|
|
370
|
-
`cannot parse workflow
|
|
373
|
+
`cannot parse workflow transcript event ${index + 1}: ${
|
|
371
374
|
error instanceof Error ? error.message : String(error)
|
|
372
375
|
}`,
|
|
373
376
|
);
|
|
@@ -376,12 +379,12 @@ function readWorkspaceJournal(runDir: string, runId: string): WorkflowJournalPro
|
|
|
376
379
|
typeof record.event !== "string" ||
|
|
377
380
|
(record.run_id !== undefined && record.run_id !== runId)
|
|
378
381
|
) {
|
|
379
|
-
throw new Error(`workflow
|
|
382
|
+
throw new Error(`workflow transcript event ${index + 1} is foreign or unsupported`);
|
|
380
383
|
}
|
|
381
384
|
return {
|
|
382
385
|
event: record.event,
|
|
383
386
|
ok: typeof record.ok === "boolean" ? record.ok : undefined,
|
|
384
|
-
status:
|
|
387
|
+
status: transcriptStatus(record.status),
|
|
385
388
|
work_event_seq:
|
|
386
389
|
typeof record.work_event_seq === "number" ? record.work_event_seq : undefined,
|
|
387
390
|
work_event_sha256:
|
|
@@ -424,10 +427,10 @@ function cleanupState(
|
|
|
424
427
|
return intent || attemptStatus ? "pending" : "not_requested";
|
|
425
428
|
}
|
|
426
429
|
|
|
427
|
-
function
|
|
430
|
+
function transcriptStatus(value: unknown): WorkflowTranscriptProjectionEvent["status"] {
|
|
428
431
|
return typeof value === "string" &&
|
|
429
432
|
["blocked", "lost", "cancelled", "unsupported", "preserved_dirty"].includes(value)
|
|
430
|
-
? (value as
|
|
433
|
+
? (value as WorkflowTranscriptProjectionEvent["status"])
|
|
431
434
|
: undefined;
|
|
432
435
|
}
|
|
433
436
|
|
|
@@ -16,7 +16,7 @@ import { readWorkflowRunManifest } from "../run-state.ts";
|
|
|
16
16
|
import { acquireNoClobberLease } from "./leases.ts";
|
|
17
17
|
import {
|
|
18
18
|
appendIntegrationAttempt,
|
|
19
|
-
|
|
19
|
+
appendWorkflowTranscriptEvent,
|
|
20
20
|
fileSha256,
|
|
21
21
|
readIntegrationAttempts,
|
|
22
22
|
readWorkflowSupplement,
|
|
@@ -177,7 +177,7 @@ export async function prepareIntegration(input: PrepareIntegrationInput): Promis
|
|
|
177
177
|
}
|
|
178
178
|
if (!prior) {
|
|
179
179
|
writeWorkflowSupplement(input.coordRoot, input.runId, "integration/plan.json", plan);
|
|
180
|
-
|
|
180
|
+
appendWorkflowTranscriptEvent(input.coordRoot, input.runId, "integration.plan", {
|
|
181
181
|
plan_id: plan.plan_id,
|
|
182
182
|
plan_sha256: stableDigest(plan),
|
|
183
183
|
});
|
|
@@ -236,12 +236,12 @@ export async function applyIntegration(
|
|
|
236
236
|
}
|
|
237
237
|
if (
|
|
238
238
|
authorization.decision_sha256 !== stableDigest(authorization.decision) ||
|
|
239
|
-
authorization.
|
|
240
|
-
authorization.
|
|
239
|
+
authorization.transcript_anchor.event !== "integration.plan" ||
|
|
240
|
+
authorization.transcript_anchor.plan_sha256 !== planSha256
|
|
241
241
|
) {
|
|
242
|
-
throw new Error("integration authorization digest or
|
|
242
|
+
throw new Error("integration authorization digest or transcript anchor is corrupt");
|
|
243
243
|
}
|
|
244
|
-
|
|
244
|
+
assertIntegrationPlanTranscript(input.coordRoot, input.runId, planSha256);
|
|
245
245
|
if (authorization.approval_id) {
|
|
246
246
|
const approval = readWorkflowApproval(input.coordRoot, authorization.approval_id);
|
|
247
247
|
if (
|
|
@@ -397,7 +397,7 @@ export async function applyIntegration(
|
|
|
397
397
|
applied_at: providerResult.applied_at,
|
|
398
398
|
};
|
|
399
399
|
writeWorkflowSupplement(input.coordRoot, input.runId, "integration/receipt.json", receipt);
|
|
400
|
-
|
|
400
|
+
appendWorkflowTranscriptEvent(input.coordRoot, input.runId, "integration.apply", {
|
|
401
401
|
receipt_id: receipt.receipt_id,
|
|
402
402
|
status: receipt.status,
|
|
403
403
|
target_commit: receipt.target_commit,
|
|
@@ -721,7 +721,7 @@ function authorizePlan(input: PrepareIntegrationInput, plan: IntegrationPlan): v
|
|
|
721
721
|
approval_id: approvalId,
|
|
722
722
|
approval_actor: approvalActor,
|
|
723
723
|
approval_sha256: approvalSha256,
|
|
724
|
-
|
|
724
|
+
transcript_anchor: {
|
|
725
725
|
event: "integration.plan",
|
|
726
726
|
plan_sha256: stableDigest(plan),
|
|
727
727
|
},
|
|
@@ -740,7 +740,7 @@ function authorizePlan(input: PrepareIntegrationInput, plan: IntegrationPlan): v
|
|
|
740
740
|
prior.decision_sha256 !== stableDigest(prior.decision) ||
|
|
741
741
|
prior.approval_id !== authorization.approval_id ||
|
|
742
742
|
prior.approval_sha256 !== authorization.approval_sha256 ||
|
|
743
|
-
stableDigest(prior.
|
|
743
|
+
stableDigest(prior.transcript_anchor) !== stableDigest(authorization.transcript_anchor)
|
|
744
744
|
) {
|
|
745
745
|
throw new Error("existing integration authorization does not match the exact plan");
|
|
746
746
|
}
|
|
@@ -752,7 +752,7 @@ function authorizePlan(input: PrepareIntegrationInput, plan: IntegrationPlan): v
|
|
|
752
752
|
"integration/authorization.json",
|
|
753
753
|
authorization,
|
|
754
754
|
);
|
|
755
|
-
|
|
755
|
+
appendWorkflowTranscriptEvent(input.coordRoot, input.runId, "integration.authorized", {
|
|
756
756
|
plan_id: plan.plan_id,
|
|
757
757
|
authorization_sha256: stableDigest(authorization),
|
|
758
758
|
policy_sha256: authorization.policy_sha256,
|
|
@@ -787,8 +787,12 @@ function requiredIntegrationRoot(binding: WorkspaceBinding): string {
|
|
|
787
787
|
return binding.integration_root;
|
|
788
788
|
}
|
|
789
789
|
|
|
790
|
-
function
|
|
791
|
-
|
|
790
|
+
function assertIntegrationPlanTranscript(
|
|
791
|
+
coordRoot: string,
|
|
792
|
+
runId: string,
|
|
793
|
+
planSha256: string,
|
|
794
|
+
): void {
|
|
795
|
+
const path = join(workflowRunDir(coordRoot, runId), "transcript.jsonl");
|
|
792
796
|
let records: Array<Record<string, unknown>>;
|
|
793
797
|
try {
|
|
794
798
|
records = readFileSync(path, "utf8")
|
|
@@ -796,7 +800,7 @@ function assertIntegrationPlanJournal(coordRoot: string, runId: string, planSha2
|
|
|
796
800
|
.filter(Boolean)
|
|
797
801
|
.map((line) => JSON.parse(line) as Record<string, unknown>);
|
|
798
802
|
} catch (error) {
|
|
799
|
-
throw new Error(`workflow
|
|
803
|
+
throw new Error(`workflow transcript is corrupt: ${(error as Error).message}`);
|
|
800
804
|
}
|
|
801
805
|
if (
|
|
802
806
|
records.some((record) => record.run_id !== runId || typeof record.event !== "string") ||
|
|
@@ -804,7 +808,7 @@ function assertIntegrationPlanJournal(coordRoot: string, runId: string, planSha2
|
|
|
804
808
|
(record) => record.event === "integration.plan" && record.plan_sha256 === planSha256,
|
|
805
809
|
)
|
|
806
810
|
) {
|
|
807
|
-
throw new Error("integration plan
|
|
811
|
+
throw new Error("integration plan transcript anchor is missing or mismatched");
|
|
808
812
|
}
|
|
809
813
|
}
|
|
810
814
|
|