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
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { EVIDENCE_KINDS } from "./types.js";
|
|
2
|
+
/** Every literal `evidence({ kind: … })` in this source whose kind is not in the
|
|
3
|
+
* vocabulary. Computed kinds are invisible here, by design. */
|
|
4
|
+
export function findInvalidEvidenceKinds(source) {
|
|
5
|
+
const { masked, literals } = maskSource(source);
|
|
6
|
+
const problems = [];
|
|
7
|
+
const valid = new Set(EVIDENCE_KINDS);
|
|
8
|
+
for (const call of evidenceCallRanges(masked)) {
|
|
9
|
+
// `kind` as an object key, then the value's first character. A quote there
|
|
10
|
+
// means a literal we can read; anything else is computed, so skip it.
|
|
11
|
+
const property = /\bkind\s*:\s*/g;
|
|
12
|
+
property.lastIndex = 0;
|
|
13
|
+
const slice = masked.slice(call.start, call.end);
|
|
14
|
+
let match = property.exec(slice);
|
|
15
|
+
while (match !== null) {
|
|
16
|
+
const valueAt = call.start + match.index + match[0].length;
|
|
17
|
+
const literal = literals.get(valueAt);
|
|
18
|
+
if (literal !== undefined && !valid.has(literal)) {
|
|
19
|
+
problems.push({ kind: literal, line: lineOf(source, valueAt) });
|
|
20
|
+
}
|
|
21
|
+
match = property.exec(slice);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return problems;
|
|
25
|
+
}
|
|
26
|
+
/** The thrown message, or undefined when the script is clean or unreadable. */
|
|
27
|
+
export function evidencePreflightError(source, scriptPath) {
|
|
28
|
+
const problems = findInvalidEvidenceKinds(source);
|
|
29
|
+
if (problems.length === 0)
|
|
30
|
+
return undefined;
|
|
31
|
+
const listed = problems
|
|
32
|
+
.map((problem) => `line ${problem.line}: ${JSON.stringify(problem.kind)}`)
|
|
33
|
+
.join(", ");
|
|
34
|
+
return (`${scriptPath}: evidence kind must be one of: ${EVIDENCE_KINDS.join(", ")} ` +
|
|
35
|
+
`(${listed}). Rejected before running, because an invalid kind would otherwise ` +
|
|
36
|
+
`throw at the end of the workflow and discard the work every agent had already done.`);
|
|
37
|
+
}
|
|
38
|
+
function maskSource(source) {
|
|
39
|
+
const out = source.split("");
|
|
40
|
+
const literals = new Map();
|
|
41
|
+
let index = 0;
|
|
42
|
+
const blank = (from, to) => {
|
|
43
|
+
for (let i = from; i < to && i < out.length; i++) {
|
|
44
|
+
if (out[i] !== "\n")
|
|
45
|
+
out[i] = " ";
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
while (index < source.length) {
|
|
49
|
+
const char = source[index];
|
|
50
|
+
const next = source[index + 1];
|
|
51
|
+
if (char === "/" && next === "/") {
|
|
52
|
+
const end = source.indexOf("\n", index);
|
|
53
|
+
blank(index, end === -1 ? source.length : end);
|
|
54
|
+
index = end === -1 ? source.length : end;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (char === "/" && next === "*") {
|
|
58
|
+
const end = source.indexOf("*/", index + 2);
|
|
59
|
+
const stop = end === -1 ? source.length : end + 2;
|
|
60
|
+
blank(index, stop);
|
|
61
|
+
index = stop;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (char === '"' || char === "'" || char === "`") {
|
|
65
|
+
const start = index;
|
|
66
|
+
let cursor = index + 1;
|
|
67
|
+
let value = "";
|
|
68
|
+
while (cursor < source.length) {
|
|
69
|
+
const inner = source[cursor];
|
|
70
|
+
if (inner === "\\") {
|
|
71
|
+
value += source[cursor + 1] ?? "";
|
|
72
|
+
cursor += 2;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (inner === char)
|
|
76
|
+
break;
|
|
77
|
+
// An unterminated single- or double-quoted string cannot span lines, so
|
|
78
|
+
// stop rather than swallowing the rest of the file on a syntax error.
|
|
79
|
+
if (inner === "\n" && char !== "`")
|
|
80
|
+
break;
|
|
81
|
+
value += inner;
|
|
82
|
+
cursor++;
|
|
83
|
+
}
|
|
84
|
+
const closed = source[cursor] === char;
|
|
85
|
+
blank(start + 1, cursor);
|
|
86
|
+
if (closed && char !== "`")
|
|
87
|
+
literals.set(start, value);
|
|
88
|
+
index = closed ? cursor + 1 : cursor;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
index++;
|
|
92
|
+
}
|
|
93
|
+
return { masked: out.join(""), literals };
|
|
94
|
+
}
|
|
95
|
+
/** The argument list of every `evidence(` call, as index ranges into the masked
|
|
96
|
+
* source. A dotted receiver (`ctx.evidence(`) counts; a longer identifier that
|
|
97
|
+
* merely ends in "evidence" does not. */
|
|
98
|
+
function evidenceCallRanges(masked) {
|
|
99
|
+
const ranges = [];
|
|
100
|
+
const call = /evidence\s*\(/g;
|
|
101
|
+
let match = call.exec(masked);
|
|
102
|
+
while (match !== null) {
|
|
103
|
+
const before = match.index > 0 ? masked[match.index - 1] : "";
|
|
104
|
+
if (!/[A-Za-z0-9_$]/.test(before)) {
|
|
105
|
+
const open = match.index + match[0].length - 1;
|
|
106
|
+
const close = matchingParen(masked, open);
|
|
107
|
+
if (close > open)
|
|
108
|
+
ranges.push({ start: open + 1, end: close });
|
|
109
|
+
}
|
|
110
|
+
match = call.exec(masked);
|
|
111
|
+
}
|
|
112
|
+
return ranges;
|
|
113
|
+
}
|
|
114
|
+
function matchingParen(masked, open) {
|
|
115
|
+
let depth = 0;
|
|
116
|
+
for (let i = open; i < masked.length; i++) {
|
|
117
|
+
if (masked[i] === "(")
|
|
118
|
+
depth++;
|
|
119
|
+
else if (masked[i] === ")") {
|
|
120
|
+
depth--;
|
|
121
|
+
if (depth === 0)
|
|
122
|
+
return i;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return -1;
|
|
126
|
+
}
|
|
127
|
+
function lineOf(source, index) {
|
|
128
|
+
let line = 1;
|
|
129
|
+
for (let i = 0; i < index && i < source.length; i++) {
|
|
130
|
+
if (source[i] === "\n")
|
|
131
|
+
line++;
|
|
132
|
+
}
|
|
133
|
+
return line;
|
|
134
|
+
}
|
|
@@ -6,7 +6,7 @@ export { buildWorkflowProof, createEvidenceRecord, deriveRunFailureClass, digest
|
|
|
6
6
|
export type { WorkflowRunManifest } from "./run-state.js";
|
|
7
7
|
export { acquireWorkflowResumeLease, assertWorkflowRunResumable, assertWorkflowScriptUnchanged, readWorkflowRunManifest, WORKFLOW_RUN_MANIFEST_SCHEMA_VERSION, workflowRunManifestPath, workflowScriptDigest, writeWorkflowRunManifest, } from "./run-state.js";
|
|
8
8
|
export { isUpstreamFailureText, vendorFailureText } from "./spawn-failure.js";
|
|
9
|
-
export type { AcceptanceCriterion, AcceptanceResult, AcceptanceStatus, AcceptanceSummary,
|
|
9
|
+
export type { AcceptanceCriterion, AcceptanceResult, AcceptanceStatus, AcceptanceSummary, AdapterEvidenceCapability, AdapterEvidenceCoverage, AdapterName, AgentOpts, EngineOpts, EvidenceKind, EvidenceSource, EvidenceStatus, ResultDigest, RunReport, Spawner, SpawnFailureClass, SpawnRequest, SpawnResult, StageSchema, WorkflowAgentProof, WorkflowApprovalMode, WorkflowAttemptContext, WorkflowAttemptFailureCause, WorkflowAttemptPriorContext, WorkflowAttemptUnresolvedCriterion, WorkflowContext, WorkflowEvidenceInput, WorkflowEvidenceRecord, WorkflowMeta, WorkflowModule, WorkflowPolicyProof, WorkflowProof, WorkflowProofUnknown, WorkflowRepoEvidence, WorkflowRepoSnapshot, WorkflowRunStatus, WorkflowSpecialistProfile, WorkflowWorkContext, } from "./types.js";
|
|
10
10
|
export { WORKFLOW_ATTEMPT_CONTEXT_SCHEMA_VERSION, WORKFLOW_PROOF_SCHEMA_VERSION, WORKFLOW_WORK_CONTEXT_SCHEMA_VERSION, } from "./types.js";
|
|
11
11
|
export type { ApplyIntegrationInput, AuthorizedIntegrationPlan, AuthorizedProviderIntegrationInput, CancelWorkspaceInput, CleanupWorkspaceInput, FilesystemIdentity, IntegrationApplyAttempt, IntegrationApplyReceipt, IntegrationAuthorization, IntegrationPlan, IntegrationReviewRecord, IntegrationTarget, LocalGitWorktreeProviderOptions, PrepareIntegrationInput, ProviderIntegrationInput, ProviderIntegrationPreview, ProviderIntegrationResult, ProviderUnknown, ProviderUnsupportedReason, RepositoryBinding, ValidatedFilesystemPath, WorkflowWorkspaceInspection, WorkflowWorkspaceSelection, WorkflowWorkspaceStatus, WorkflowWorkspaceVerification, WorkspaceAllocationRequest, WorkspaceAttestation, WorkspaceBinding, WorkspaceBoundExecutionEvidence, WorkspaceCancellationReceipt, WorkspaceCancellationResult, WorkspaceCleanupAttempt, WorkspaceCleanupIntent, WorkspaceCleanupMode, WorkspaceCleanupReceipt, WorkspaceCleanupResult, WorkspaceCompatibilityExecutionEvidence, WorkspaceExecutionEvidence, WorkspaceIntegrationState, WorkspaceIsolation, WorkspaceLifecycleProjection, WorkspaceLifecycleProjectionInput, WorkspaceLifecycleState, WorkspaceObservation, WorkspaceOwner, WorkspaceProbeInput, WorkspaceProbeResult, WorkspaceProofOutcome, WorkspaceProvider, WorkspaceProviderCapabilities, WorkspaceProviderRef, WorkspaceResourceState, WorkspaceUnsupportedExecutionEvidence, } from "./workspaces/index.js";
|
|
12
12
|
export { applyIntegration, assertWorkspaceLifecycleTransition, cancelWorkspace, cleanupWorkspace, createLocalGitWorktreeProvider, deriveWorkspaceLifecycle, IntegrationPrepareParkedError, inspectWorkflowWorkspace, isWorkspaceLifecycleState, listWorkflowWorkspaceInspections, prepareIntegration, prepareReclaim, probeLocalGitWorktreeProvider, readWorkflowWorkspaceStatus, renderWorkflowWorkspaceStatus, validateProviderEventChain, WORKSPACE_BINDING_SCHEMA_VERSION, WORKSPACE_RECEIPT_SCHEMA_VERSION, } from "./workspaces/index.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,2BAA2B,EAC3B,4BAA4B,EAC5B,gBAAgB,EAChB,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,gCAAgC,EAChC,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,4BAA4B,EAC5B,iCAAiC,EACjC,+BAA+B,GAChC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,6BAA6B,EAC7B,uBAAuB,EACvB,oCAAoC,EACpC,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,UAAU,EACV,YAAY,EACZ,cAAc,EACd,cAAc,EACd,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { RepoSnapshot } from "../context/index.js";
|
|
2
2
|
import type { NormalizedPolicy, PolicyDecision, PolicyIsolation, PolicyNetworkAccess } from "../policy/index.js";
|
|
3
|
-
import type { AcceptanceCriterion, AcceptanceResult, AcceptanceSummary,
|
|
3
|
+
import type { AcceptanceCriterion, AcceptanceResult, AcceptanceSummary, AdapterAttestationCitation, AdapterEvidenceCapability, ResultDigest, SpawnFailureClass, WorkflowAgentProof, WorkflowAttemptContext, WorkflowEvidenceInput, WorkflowEvidenceRecord, WorkflowMeta, WorkflowProof, WorkflowSandboxProjectionEvidence, WorkflowWorkContext } from "./types.js";
|
|
4
4
|
import type { WorkspaceAttestation, WorkspaceBinding, WorkspaceUnsupportedExecutionEvidence } from "./workspaces/index.js";
|
|
5
5
|
export interface NormalizedWorkflowMeta {
|
|
6
6
|
name: string;
|
|
@@ -18,23 +18,29 @@ export interface BuildWorkflowProofInput {
|
|
|
18
18
|
startedAt: string;
|
|
19
19
|
endedAt: string;
|
|
20
20
|
durationMs: number;
|
|
21
|
-
|
|
21
|
+
transcriptPath: string;
|
|
22
22
|
before: RepoSnapshot;
|
|
23
23
|
after: RepoSnapshot;
|
|
24
24
|
agents: WorkflowAgentProof[];
|
|
25
25
|
evidence: WorkflowEvidenceRecord[];
|
|
26
|
-
|
|
26
|
+
adapterEvidence?: Readonly<Record<string, AdapterEvidenceCapability | undefined>>;
|
|
27
27
|
/** Filesystem policy actually projected into children (ADR 0039). */
|
|
28
28
|
sandboxProjection?: WorkflowSandboxProjectionEvidence;
|
|
29
|
-
/** Live attestations backing each
|
|
29
|
+
/** Live attestations backing each adapter's claims (ADR 0038). Injected by
|
|
30
30
|
* the caller so proof stays free of filesystem lookups. */
|
|
31
|
-
|
|
31
|
+
adapterAttestations?: Readonly<Record<string, AdapterAttestationCitation | undefined>>;
|
|
32
32
|
policy?: {
|
|
33
33
|
config: Readonly<NormalizedPolicy>;
|
|
34
34
|
decisions: readonly PolicyDecision[];
|
|
35
35
|
isolation: PolicyIsolation;
|
|
36
36
|
networkAccess: PolicyNetworkAccess;
|
|
37
37
|
};
|
|
38
|
+
/** Set when the script called ctx.blocked(): the run stopped because a human
|
|
39
|
+
* must rule. Forces run class "decision" regardless of the agents' classes. */
|
|
40
|
+
blocked?: {
|
|
41
|
+
reason: string;
|
|
42
|
+
decisionId?: string;
|
|
43
|
+
};
|
|
38
44
|
workspaceBinding?: WorkspaceBinding;
|
|
39
45
|
workspaceAttestation?: WorkspaceAttestation;
|
|
40
46
|
workspaceFallback?: WorkspaceUnsupportedExecutionEvidence;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proof.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/proof.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAEzB,YAAY,
|
|
1
|
+
{"version":3,"file":"proof.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/proof.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EAEzB,YAAY,EAEZ,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,EAEZ,aAAa,EAIb,iCAAiC,EACjC,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEhB,qCAAqC,EACtC,MAAM,uBAAuB,CAAC;AAoB/B,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAC5C,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IAClD,IAAI,EAAE,sBAAsB,CAAC;IAC7B,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IACnC,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,yBAAyB,GAAG,SAAS,CAAC,CAAC,CAAC;IAClF,qEAAqE;IACrE,iBAAiB,CAAC,EAAE,iCAAiC,CAAC;IACtD;+DAC2D;IAC3D,mBAAmB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,0BAA0B,GAAG,SAAS,CAAC,CAAC,CAAC;IACvF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACnC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;QACrC,SAAS,EAAE,eAAe,CAAC;QAC3B,aAAa,EAAE,mBAAmB,CAAC;KACpC,CAAC;IACF;mFAC+E;IAC/E,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,iBAAiB,CAAC,EAAE,qCAAqC,CAAC;IAC1D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,YAAY,EAAE,MAAM,GACnB,sBAAsB,CAqCxB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,KAAK,EAAE,qBAAqB,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,sBAAsB,CAyBzB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,QAAQ,EAAE,sBAAsB,EAAE,GACjC;IAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,CAuB9D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,CAQjF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,GAAG,QAAQ,EAC9B,MAAM,EAAE,SAAS,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,OAAO,CAAC,EAAE,GAC9D,iBAAiB,GAAG,SAAS,CAS/B;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,aAAa,CA6DhF;AAgCD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAO3E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAoDjF;AA2BD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAoChE"}
|
|
@@ -5,7 +5,7 @@ import { policyDigest } from "../policy/index.js";
|
|
|
5
5
|
import { isCanonicalWorkflowAttemptContext } from "./attempt-context.js";
|
|
6
6
|
import { stableDigest, writeImmutableJson } from "./durable-record.js";
|
|
7
7
|
import { readWorkflowRunManifest } from "./run-state.js";
|
|
8
|
-
import { WORKFLOW_PROOF_SCHEMA_VERSION } from "./types.js";
|
|
8
|
+
import { EVIDENCE_KINDS, WORKFLOW_PROOF_SCHEMA_VERSION } from "./types.js";
|
|
9
9
|
import { isCanonicalWorkflowWorkContext } from "./work-context.js";
|
|
10
10
|
import { isWorkspaceBoundExecutionEvidence, isWorkspaceExecutionEvidence, isWorkspaceUnsupportedExecutionEvidence, workspaceProofLifecycle, } from "./workspaces/validate.js";
|
|
11
11
|
const MAX_ACCEPTANCE_CRITERIA = 50;
|
|
@@ -66,7 +66,7 @@ export function createEvidenceRecord(input) {
|
|
|
66
66
|
id: `e${input.sequence}`,
|
|
67
67
|
source: "workflow",
|
|
68
68
|
recorded_at: input.recordedAt ?? new Date().toISOString(),
|
|
69
|
-
kind: enumValue(value.kind,
|
|
69
|
+
kind: enumValue(value.kind, EVIDENCE_KINDS, "evidence kind"),
|
|
70
70
|
status: enumValue(value.status, ["passed", "failed", "observed", "unknown"], "evidence status"),
|
|
71
71
|
label: boundedRequired(value.label, "evidence label", MAX_LABEL_CHARS),
|
|
72
72
|
summary: boundedOptional(value.summary, "evidence summary", MAX_SUMMARY_CHARS),
|
|
@@ -148,10 +148,15 @@ export function buildWorkflowProof(input) {
|
|
|
148
148
|
session_id: clippedOptional(agent.session_id, MAX_REF_CHARS),
|
|
149
149
|
error: clippedOptional(agent.error, MAX_SUMMARY_CHARS),
|
|
150
150
|
}));
|
|
151
|
-
const
|
|
152
|
-
const unknowns = buildUnknowns(agents,
|
|
153
|
-
|
|
154
|
-
|
|
151
|
+
const adapters = buildAdapterCoverage(agents, input.adapterEvidence, input.adapterAttestations);
|
|
152
|
+
const unknowns = buildUnknowns(agents, adapters, repository);
|
|
153
|
+
// A declared stop-on-human beats a derived spawn class. If the script said a
|
|
154
|
+
// human must rule, that is the true reason the run ended, even when some agent
|
|
155
|
+
// also happened to hit a flaky vendor on the way there.
|
|
156
|
+
const runClass = input.status === "failed" && input.blocked
|
|
157
|
+
? "decision"
|
|
158
|
+
: deriveRunFailureClass(input.status, agents);
|
|
159
|
+
const transcript = readFileSync(input.transcriptPath);
|
|
155
160
|
return {
|
|
156
161
|
schema_version: WORKFLOW_PROOF_SCHEMA_VERSION,
|
|
157
162
|
run: {
|
|
@@ -168,6 +173,9 @@ export function buildWorkflowProof(input) {
|
|
|
168
173
|
error: clippedOptional(input.error, MAX_SUMMARY_CHARS),
|
|
169
174
|
result: input.result === undefined ? undefined : digestResult(input.result),
|
|
170
175
|
...(runClass ? { class: runClass } : {}),
|
|
176
|
+
...(runClass === "decision" && input.blocked?.decisionId
|
|
177
|
+
? { decision_id: clipped(input.blocked.decisionId, MAX_REF_CHARS) }
|
|
178
|
+
: {}),
|
|
171
179
|
},
|
|
172
180
|
acceptance,
|
|
173
181
|
agents,
|
|
@@ -178,13 +186,13 @@ export function buildWorkflowProof(input) {
|
|
|
178
186
|
: input.workspaceFallback,
|
|
179
187
|
repository,
|
|
180
188
|
...(input.sandboxProjection ? { sandbox_projection: input.sandboxProjection } : {}),
|
|
181
|
-
|
|
189
|
+
adapters,
|
|
182
190
|
unknowns,
|
|
183
191
|
integrity: {
|
|
184
|
-
|
|
185
|
-
path: "
|
|
186
|
-
sha256: createHash("sha256").update(
|
|
187
|
-
bytes:
|
|
192
|
+
transcript: {
|
|
193
|
+
path: "transcript.jsonl",
|
|
194
|
+
sha256: createHash("sha256").update(transcript).digest("hex"),
|
|
195
|
+
bytes: transcript.byteLength,
|
|
188
196
|
},
|
|
189
197
|
},
|
|
190
198
|
};
|
|
@@ -245,7 +253,8 @@ export function readWorkflowProof(coordRoot, runId) {
|
|
|
245
253
|
proof.run?.id !== runId ||
|
|
246
254
|
(proof.run.class !== undefined &&
|
|
247
255
|
proof.run.class !== "environment" &&
|
|
248
|
-
proof.run.class !== "upstream"
|
|
256
|
+
proof.run.class !== "upstream" &&
|
|
257
|
+
proof.run.class !== "decision") ||
|
|
249
258
|
(proof.run.work_context !== undefined &&
|
|
250
259
|
(!proof.run.work_item_id ||
|
|
251
260
|
proof.run.work_context.id !== proof.run.work_item_id ||
|
|
@@ -326,7 +335,7 @@ export function renderWorkflowProof(proof) {
|
|
|
326
335
|
for (const unknown of proof.unknowns)
|
|
327
336
|
lines.push(` - ${unknown.message}`);
|
|
328
337
|
}
|
|
329
|
-
lines.push(`
|
|
338
|
+
lines.push(`transcript sha256: ${proof.integrity.transcript.sha256}`);
|
|
330
339
|
return `${lines.join("\n")}\n`;
|
|
331
340
|
}
|
|
332
341
|
function buildRepoEvidence(beforeRaw, afterRaw) {
|
|
@@ -363,39 +372,39 @@ function normalizeRepoSnapshot(snapshot) {
|
|
|
363
372
|
dirty_paths_truncated: snapshot.dirty_paths_truncated,
|
|
364
373
|
};
|
|
365
374
|
}
|
|
366
|
-
function
|
|
367
|
-
return [...new Set(agents.map((agent) => agent.
|
|
368
|
-
const
|
|
375
|
+
function buildAdapterCoverage(agents, claims, attestations) {
|
|
376
|
+
return [...new Set(agents.map((agent) => agent.adapter))].map((adapter) => {
|
|
377
|
+
const adapterAgents = agents.filter((agent) => agent.adapter === adapter);
|
|
369
378
|
return {
|
|
370
|
-
|
|
371
|
-
tool_evidence: claims?.[
|
|
379
|
+
adapter,
|
|
380
|
+
tool_evidence: claims?.[adapter]?.toolEvidence ?? {
|
|
372
381
|
support: "unknown",
|
|
373
|
-
note: "No
|
|
382
|
+
note: "No adapter capability claim was supplied to this workflow run.",
|
|
374
383
|
},
|
|
375
384
|
observed: {
|
|
376
|
-
final_results:
|
|
377
|
-
session_ids:
|
|
378
|
-
costs:
|
|
385
|
+
final_results: adapterAgents.filter((agent) => agent.result).length,
|
|
386
|
+
session_ids: adapterAgents.filter((agent) => agent.session_id).length,
|
|
387
|
+
costs: adapterAgents.filter((agent) => agent.cost_usd !== undefined).length,
|
|
379
388
|
},
|
|
380
|
-
...(attestations?.[
|
|
389
|
+
...(attestations?.[adapter] ? { attestation: attestations[adapter] } : {}),
|
|
381
390
|
};
|
|
382
391
|
});
|
|
383
392
|
}
|
|
384
|
-
function buildUnknowns(agents,
|
|
393
|
+
function buildUnknowns(agents, adapters, repository) {
|
|
385
394
|
const unknowns = [];
|
|
386
|
-
for (const
|
|
387
|
-
if (
|
|
395
|
+
for (const adapter of adapters) {
|
|
396
|
+
if (adapter.tool_evidence.support === "unknown") {
|
|
388
397
|
unknowns.push({
|
|
389
|
-
code: "
|
|
390
|
-
|
|
391
|
-
message: `${
|
|
398
|
+
code: "adapter_capability_unregistered",
|
|
399
|
+
adapter: adapter.adapter,
|
|
400
|
+
message: `${adapter.adapter}: tool-evidence capability was not registered for this run.`,
|
|
392
401
|
});
|
|
393
402
|
}
|
|
394
|
-
else if (
|
|
403
|
+
else if (adapter.tool_evidence.support !== "supported") {
|
|
395
404
|
unknowns.push({
|
|
396
405
|
code: "tool_evidence_unavailable",
|
|
397
|
-
|
|
398
|
-
message: `${
|
|
406
|
+
adapter: adapter.adapter,
|
|
407
|
+
message: `${adapter.adapter}: adapter-native tool evidence is ${adapter.tool_evidence.support}.`,
|
|
399
408
|
});
|
|
400
409
|
}
|
|
401
410
|
}
|
|
@@ -403,17 +412,17 @@ function buildUnknowns(agents, harnesses, repository) {
|
|
|
403
412
|
if (agent.cost_usd === undefined) {
|
|
404
413
|
unknowns.push({
|
|
405
414
|
code: "agent_cost_unreported",
|
|
406
|
-
|
|
415
|
+
adapter: agent.adapter,
|
|
407
416
|
agent_id: agent.id,
|
|
408
|
-
message: `${agent.id}: ${agent.
|
|
417
|
+
message: `${agent.id}: ${agent.adapter} did not report per-run cost.`,
|
|
409
418
|
});
|
|
410
419
|
}
|
|
411
420
|
if (!agent.session_id) {
|
|
412
421
|
unknowns.push({
|
|
413
422
|
code: "agent_session_unreported",
|
|
414
|
-
|
|
423
|
+
adapter: agent.adapter,
|
|
415
424
|
agent_id: agent.id,
|
|
416
|
-
message: `${agent.id}: ${agent.
|
|
425
|
+
message: `${agent.id}: ${agent.adapter} did not report a child session id.`,
|
|
417
426
|
});
|
|
418
427
|
}
|
|
419
428
|
}
|
|
@@ -73,12 +73,12 @@ export function readWorkflowRunManifest(coordRoot, runId) {
|
|
|
73
73
|
}
|
|
74
74
|
export function assertWorkflowRunResumable(coordRoot, runId) {
|
|
75
75
|
const manifest = readWorkflowRunManifest(coordRoot, runId);
|
|
76
|
-
const
|
|
77
|
-
if (!existsSync(
|
|
78
|
-
throw new Error(`workflow run ${runId} has no
|
|
76
|
+
const transcriptPath = join(coordRoot, ".harnery", "workflows", runId, "transcript.jsonl");
|
|
77
|
+
if (!existsSync(transcriptPath))
|
|
78
|
+
throw new Error(`workflow run ${runId} has no transcript`);
|
|
79
79
|
let approvalId;
|
|
80
80
|
let terminal = false;
|
|
81
|
-
for (const line of readFileSync(
|
|
81
|
+
for (const line of readFileSync(transcriptPath, "utf8").split("\n")) {
|
|
82
82
|
if (!line.trim())
|
|
83
83
|
continue;
|
|
84
84
|
try {
|
|
@@ -90,7 +90,7 @@ export function assertWorkflowRunResumable(coordRoot, runId) {
|
|
|
90
90
|
terminal = true;
|
|
91
91
|
}
|
|
92
92
|
catch {
|
|
93
|
-
throw new Error(`workflow run ${runId} has a malformed
|
|
93
|
+
throw new Error(`workflow run ${runId} has a malformed transcript line`);
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
if (terminal)
|
|
@@ -195,8 +195,8 @@ function validExecution(value) {
|
|
|
195
195
|
if (!value || typeof value !== "object")
|
|
196
196
|
return false;
|
|
197
197
|
return (isAbsolute(value.cwd) &&
|
|
198
|
-
typeof value.
|
|
199
|
-
value.
|
|
198
|
+
typeof value.default_adapter === "string" &&
|
|
199
|
+
value.default_adapter.length > 0 &&
|
|
200
200
|
positiveSafeInteger(value.max_agents) &&
|
|
201
201
|
positiveSafeInteger(value.concurrency) &&
|
|
202
202
|
typeof value.subscription_only === "boolean" &&
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Project the host's filesystem policy into a
|
|
2
|
+
* Project the host's filesystem policy into a adapter's own vendor sandbox
|
|
3
3
|
* (ADR 0039).
|
|
4
4
|
*
|
|
5
5
|
* Harnery decides where a workflow child may write. Until this existed it never
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
* dropped would leave an operator believing a child was constrained when it was
|
|
14
14
|
* not, which is worse than refusing and worse than never offering the feature.
|
|
15
15
|
*/
|
|
16
|
-
import type {
|
|
16
|
+
import type { AdapterSandboxProjection } from "../adapters/types.js";
|
|
17
17
|
import type { GitAdministrativeGrant, SpawnFilesystemPolicy } from "./types.js";
|
|
18
18
|
import type { WorkspaceBinding } from "./workspaces/types.js";
|
|
19
19
|
export declare class SandboxProjectionError extends Error {
|
|
20
|
-
readonly
|
|
20
|
+
readonly adapter: string;
|
|
21
21
|
readonly reason: "mode_unrepresentable" | "writable_roots_unrepresentable" | "no_projection" | "writable_root_escapes_workspace" | "git_grant_unavailable";
|
|
22
|
-
constructor(
|
|
22
|
+
constructor(adapter: string, reason: SandboxProjectionError["reason"], message: string);
|
|
23
23
|
}
|
|
24
24
|
export interface ResolvedSandboxProjection {
|
|
25
25
|
/** Vendor-native name for the requested mode. */
|
|
@@ -30,7 +30,7 @@ export interface ResolvedSandboxProjection {
|
|
|
30
30
|
* Resolve a requested policy against what the adapter declares it can carry.
|
|
31
31
|
* Throws rather than degrading; see the module note.
|
|
32
32
|
*/
|
|
33
|
-
export declare function resolveSandboxProjection(
|
|
33
|
+
export declare function resolveSandboxProjection(adapter: string, declaration: AdapterSandboxProjection | undefined, policy: SpawnFilesystemPolicy): ResolvedSandboxProjection;
|
|
34
34
|
/**
|
|
35
35
|
* Refuse a projection that would grant write access outside the root the
|
|
36
36
|
* workspace provider already validated (ADR 0039).
|
|
@@ -39,7 +39,7 @@ export declare function resolveSandboxProjection(harness: string, declaration: H
|
|
|
39
39
|
* the provider never sanctioned would let a projection quietly widen the blast
|
|
40
40
|
* radius of a run that the workspace lifecycle believes it has contained.
|
|
41
41
|
*/
|
|
42
|
-
export declare function assertProjectionWithinWorkspace(
|
|
42
|
+
export declare function assertProjectionWithinWorkspace(adapter: string, allowedRootRealpath: string, writableRoots: readonly string[]): void;
|
|
43
43
|
/**
|
|
44
44
|
* Resolve a named Git administrative grant into concrete writable roots
|
|
45
45
|
* (ADR 0040).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-projection.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/sandbox-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"sandbox-projection.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/sandbox-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EACX,sBAAsB,GACtB,gCAAgC,GAChC,eAAe,GACf,iCAAiC,GACjC,uBAAuB,CAAC;gBAEhB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM;CAMvF;AAED,MAAM,WAAW,yBAAyB;IACxC,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,wBAAwB,GAAG,SAAS,EACjD,MAAM,EAAE,qBAAqB,GAC5B,yBAAyB,CAoC3B;AASD;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,MAAM,EACf,mBAAmB,EAAE,MAAM,EAC3B,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,IAAI,CAUN;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,sBAAsB,EAC7B,OAAO,EAAE,gBAAgB,GAAG,SAAS,GACpC,SAAS,MAAM,EAAE,CAanB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Project the host's filesystem policy into a
|
|
2
|
+
* Project the host's filesystem policy into a adapter's own vendor sandbox
|
|
3
3
|
* (ADR 0039).
|
|
4
4
|
*
|
|
5
5
|
* Harnery decides where a workflow child may write. Until this existed it never
|
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
* not, which is worse than refusing and worse than never offering the feature.
|
|
15
15
|
*/
|
|
16
16
|
export class SandboxProjectionError extends Error {
|
|
17
|
-
|
|
17
|
+
adapter;
|
|
18
18
|
reason;
|
|
19
|
-
constructor(
|
|
19
|
+
constructor(adapter, reason, message) {
|
|
20
20
|
super(message);
|
|
21
21
|
this.name = "SandboxProjectionError";
|
|
22
|
-
this.
|
|
22
|
+
this.adapter = adapter;
|
|
23
23
|
this.reason = reason;
|
|
24
24
|
}
|
|
25
25
|
}
|
|
@@ -27,23 +27,23 @@ export class SandboxProjectionError extends Error {
|
|
|
27
27
|
* Resolve a requested policy against what the adapter declares it can carry.
|
|
28
28
|
* Throws rather than degrading; see the module note.
|
|
29
29
|
*/
|
|
30
|
-
export function resolveSandboxProjection(
|
|
30
|
+
export function resolveSandboxProjection(adapter, declaration, policy) {
|
|
31
31
|
if (!declaration) {
|
|
32
|
-
throw new SandboxProjectionError(
|
|
32
|
+
throw new SandboxProjectionError(adapter, "no_projection", `${adapter} cannot project a filesystem policy into its sandbox; remove the policy or use a adapter that can`);
|
|
33
33
|
}
|
|
34
34
|
const nativeMode = declaration.modes[policy.mode];
|
|
35
35
|
if (!nativeMode) {
|
|
36
|
-
throw new SandboxProjectionError(
|
|
36
|
+
throw new SandboxProjectionError(adapter, "mode_unrepresentable", `${adapter} does not distinguish the "${policy.mode}" filesystem mode, so it cannot be enforced`);
|
|
37
37
|
}
|
|
38
38
|
const writableRoots = policy.writableRoots ?? [];
|
|
39
39
|
if (writableRoots.length > 0 && !declaration.writableRoots) {
|
|
40
|
-
throw new SandboxProjectionError(
|
|
40
|
+
throw new SandboxProjectionError(adapter, "writable_roots_unrepresentable", `${adapter} does not accept an explicit writable-root set, so ${writableRoots.length} declared path(s) could not be enforced`);
|
|
41
41
|
}
|
|
42
42
|
for (const root of writableRoots) {
|
|
43
43
|
// Relative paths cannot be validated against the provider's roots and are
|
|
44
44
|
// resolved differently by every vendor, so they are refused outright.
|
|
45
45
|
if (typeof root !== "string" || !root.startsWith("/")) {
|
|
46
|
-
throw new SandboxProjectionError(
|
|
46
|
+
throw new SandboxProjectionError(adapter, "writable_roots_unrepresentable", `writable root ${JSON.stringify(root)} must be an absolute path`);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
return { nativeMode, writableRoots };
|
|
@@ -62,10 +62,10 @@ function isWithin(root, candidate) {
|
|
|
62
62
|
* the provider never sanctioned would let a projection quietly widen the blast
|
|
63
63
|
* radius of a run that the workspace lifecycle believes it has contained.
|
|
64
64
|
*/
|
|
65
|
-
export function assertProjectionWithinWorkspace(
|
|
65
|
+
export function assertProjectionWithinWorkspace(adapter, allowedRootRealpath, writableRoots) {
|
|
66
66
|
for (const root of writableRoots) {
|
|
67
67
|
if (!isWithin(allowedRootRealpath, root)) {
|
|
68
|
-
throw new SandboxProjectionError(
|
|
68
|
+
throw new SandboxProjectionError(adapter, "writable_root_escapes_workspace", `writable root ${JSON.stringify(root)} is outside the workspace root ${JSON.stringify(allowedRootRealpath)} the provider validated`);
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
}
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
* gets HARNERY_WORKFLOW_CHILD=1 and the stop-hook rule exempts it
|
|
18
18
|
* (stop-hook.ts), keeping heartbeats + events on.
|
|
19
19
|
*/
|
|
20
|
-
import type {
|
|
20
|
+
import type { AdapterInvocation, AdapterRawResult } from "../adapters/types.js";
|
|
21
21
|
import type { Spawner, SpawnRequest, SpawnResult } from "./types.js";
|
|
22
|
-
export declare function buildClaudeInvocation(req: SpawnRequest):
|
|
23
|
-
export declare function normalizeClaudeResult(raw:
|
|
22
|
+
export declare function buildClaudeInvocation(req: SpawnRequest): AdapterInvocation;
|
|
23
|
+
export declare function normalizeClaudeResult(raw: AdapterRawResult): SpawnResult;
|
|
24
24
|
export declare const claudeCodeSpawner: Spawner;
|
|
25
25
|
//# sourceMappingURL=spawn-claude.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spawn-claude.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/spawn-claude.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"spawn-claude.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/spawn-claude.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKhF,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAYrE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,YAAY,GAAG,iBAAiB,CAsB1E;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,GAAG,WAAW,CA2ExE;AAED,eAAO,MAAM,iBAAiB,EAAE,OAiB/B,CAAC"}
|
|
@@ -18,16 +18,16 @@
|
|
|
18
18
|
* (stop-hook.ts), keeping heartbeats + events on.
|
|
19
19
|
*/
|
|
20
20
|
import { exec } from "../../lib/exec.js";
|
|
21
|
-
import {
|
|
21
|
+
import { builtinAdapterProfile, validateAdapterEffort } from "../adapters/profiles.js";
|
|
22
|
+
import { notFoundError } from "./adapters.js";
|
|
22
23
|
import { buildChildEnv } from "./child-env.js";
|
|
23
|
-
import { notFoundError } from "./harnesses.js";
|
|
24
24
|
import { resolveSandboxProjection } from "./sandbox-projection.js";
|
|
25
25
|
import { isUpstreamFailureText, vendorFailureText } from "./spawn-failure.js";
|
|
26
26
|
export function buildClaudeInvocation(req) {
|
|
27
|
-
|
|
27
|
+
validateAdapterEffort("claude-code", req.effort);
|
|
28
28
|
if (req.filesystemPolicy) {
|
|
29
29
|
// Declared unrepresentable: refuse rather than drop it silently (ADR 0039).
|
|
30
|
-
resolveSandboxProjection("claude-code",
|
|
30
|
+
resolveSandboxProjection("claude-code", builtinAdapterProfile("claude-code")?.sandboxProjection, req.filesystemPolicy);
|
|
31
31
|
}
|
|
32
32
|
const argv = [
|
|
33
33
|
"claude",
|
|
@@ -104,7 +104,7 @@ export function normalizeClaudeResult(raw) {
|
|
|
104
104
|
sessionId: envelope.session_id,
|
|
105
105
|
costUsd: envelope.total_cost_usd,
|
|
106
106
|
durationMs: raw.durationMs,
|
|
107
|
-
error: `
|
|
107
|
+
error: `adapter error (${envelope.subtype ?? "unknown"}): ${(envelope.errors ?? []).join("; ") || "see envelope"}`,
|
|
108
108
|
...(isUpstreamFailureText(envelopeError) ? { class: "upstream" } : {}),
|
|
109
109
|
};
|
|
110
110
|
}
|
|
@@ -127,7 +127,10 @@ export const claudeCodeSpawner = async (req) => {
|
|
|
127
127
|
}
|
|
128
128
|
const r = await exec(invocation.argv, {
|
|
129
129
|
cwd: req.cwd,
|
|
130
|
-
env: buildChildEnv(req.runId, {
|
|
130
|
+
env: buildChildEnv(req.runId, {
|
|
131
|
+
subscriptionOnly: req.subscriptionOnly,
|
|
132
|
+
agentId: req.agentId,
|
|
133
|
+
}),
|
|
131
134
|
timeout: req.timeoutMs,
|
|
132
135
|
});
|
|
133
136
|
return normalizeClaudeResult({ ...r, durationMs: Date.now() - t0 });
|