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
package/dist/commands/agents.js
CHANGED
|
@@ -17,15 +17,16 @@ import { existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync,
|
|
|
17
17
|
import { homedir, tmpdir } from "node:os";
|
|
18
18
|
import { basename, join, resolve } from "node:path";
|
|
19
19
|
import { readStreamTailBounded } from "../core/agents/events/consume.js";
|
|
20
|
-
import { emitCanonical, monorepoRoot,
|
|
20
|
+
import { emitCanonical, monorepoRoot, normalizeAdapter, readHeartbeat, resolveOwner, resolveOwnerBySessionEnv, resolveOwnerWithSource, } from "../core/agents/index.js";
|
|
21
21
|
import { coordFreshnessSeconds, resolveBinName } from "../core/config.js";
|
|
22
22
|
import { readRemoteMachines } from "../core/presence/index.js";
|
|
23
|
+
import { registerContextCommand } from "./context.js";
|
|
23
24
|
/** Cap for CLI scans of the unbounded event ledger (`trace` / `health`). Well
|
|
24
25
|
* under V8's ~512MB max string length so a `readFileSync` of the whole file can
|
|
25
26
|
* never throw; covers ample recent history for a diagnostic scan. */
|
|
26
27
|
const STREAM_SCAN_CAP_BYTES = 128 * 1024 * 1024; // 128 MiB
|
|
27
28
|
import { parsePsChainLine } from "../core/hooks/resolve/anchor.js";
|
|
28
|
-
import { appendEntry, resolveOwnerByName } from "../core/
|
|
29
|
+
import { appendEntry, resolveOwnerByName } from "../core/journal/index.js";
|
|
29
30
|
import { buildCouncilId, buildInviteMarkdown, COUNCIL_SCHEMA_VERSION, contributorsInRound, councilBodyDir, councilsArchiveDir, deleteArchivedCouncil, effectiveSteward, findManifestByPartialId, listKnownAgents, listManifests, moveFromArchive, moveToArchive, normalizeAgentName, pendingCouncilsForMember, readArchivedManifest, readManifest, readRoundPrompts, roundDir, setCouncilSteward, writeContribution, writeManifest, writePrompt, } from "../lib/council/index.js";
|
|
30
31
|
import { assumeIdentity, IdentityAssumeError } from "../lib/identities/assume.js";
|
|
31
32
|
import { displayName as displayAgentName, ensureIdentity, listIdentities, lookupById as lookupIdentityById, lookupByName as lookupIdentityByName, } from "../lib/identities/index.js";
|
|
@@ -63,11 +64,12 @@ function formatPlatformLabel(platform) {
|
|
|
63
64
|
return "CC";
|
|
64
65
|
}
|
|
65
66
|
let emit;
|
|
66
|
-
export function registerAgentsCommand(program, emitParam) {
|
|
67
|
+
export function registerAgentsCommand(program, emitParam, programContext) {
|
|
67
68
|
emit = emitParam;
|
|
68
69
|
const cmd = program
|
|
69
70
|
.command("agents")
|
|
70
|
-
.description("
|
|
71
|
+
.description("The live agent sessions in this project: who is running now, what they hold, and their coordination state (whoami / list / status / health).");
|
|
72
|
+
registerContextCommand(cmd, emitParam, programContext);
|
|
71
73
|
cmd
|
|
72
74
|
.command("whoami")
|
|
73
75
|
.description("Print the current agent's name + instance_id + files claimed")
|
|
@@ -97,7 +99,7 @@ export function registerAgentsCommand(program, emitParam) {
|
|
|
97
99
|
cmd
|
|
98
100
|
.command("suggest-name [description...]")
|
|
99
101
|
.description('Reprint a session name ("Agent <you> - <description>") for the operator to set as their ' +
|
|
100
|
-
"
|
|
102
|
+
"adapter tab title. With no arg, derives it from your current task. The primary naming path " +
|
|
101
103
|
"is set-task (it suggests a name on the first focus declaration); reach for this to reprint " +
|
|
102
104
|
"or re-suggest after a topic pivot. Read-only.")
|
|
103
105
|
.option("--json", "JSON output instead of the bare name")
|
|
@@ -154,7 +156,7 @@ export function registerAgentsCommand(program, emitParam) {
|
|
|
154
156
|
});
|
|
155
157
|
cmd
|
|
156
158
|
.command("ping <name> <message...>")
|
|
157
|
-
.description("Append a 'handoff' entry to a peer agent's
|
|
159
|
+
.description("Append a 'handoff' entry to a peer agent's journal. Body prefixed with " +
|
|
158
160
|
"`from agent-<me>:`. Use to leave actionable coordination notes for peers " +
|
|
159
161
|
"currently holding files you need.")
|
|
160
162
|
.option("--json", "JSON output")
|
|
@@ -194,17 +196,17 @@ export function registerAgentsCommand(program, emitParam) {
|
|
|
194
196
|
runHealth(opts);
|
|
195
197
|
});
|
|
196
198
|
cmd
|
|
197
|
-
.command("
|
|
198
|
-
.description("
|
|
199
|
+
.command("adapter-probe <id>")
|
|
200
|
+
.description("Adapter wiring probe: ppid chain, comm names, pid-map anchor, sample payload paths. " +
|
|
199
201
|
"With --replay-samples, also replays every checked-in sample payload against the live " +
|
|
200
202
|
"adapter in an isolated sandbox to catch adapter / payload-shape drift. " +
|
|
201
203
|
"Complements heal-events (drift telemetry). Id: claude_code | cursor.")
|
|
202
204
|
.option("--json", "JSON envelope output")
|
|
203
|
-
.option("--replay-samples", "Replay docs/api/<
|
|
205
|
+
.option("--replay-samples", "Replay docs/api/<adapter>-hooks/samples/*.json against the live adapter in an isolated sandbox. " +
|
|
204
206
|
"Exits non-zero if any sample crashes the adapter.")
|
|
205
207
|
.option("--sample <path>", "Replay only the named sample file (basename match). Implies --replay-samples.")
|
|
206
208
|
.action((id, opts) => {
|
|
207
|
-
|
|
209
|
+
runAdapterProbe(id, opts);
|
|
208
210
|
});
|
|
209
211
|
cmd
|
|
210
212
|
.command("heal")
|
|
@@ -226,7 +228,6 @@ export function registerAgentsCommand(program, emitParam) {
|
|
|
226
228
|
.action((opts) => {
|
|
227
229
|
runHeal(opts);
|
|
228
230
|
});
|
|
229
|
-
registerCouncilCommands(cmd);
|
|
230
231
|
registerIdentityCommands(cmd);
|
|
231
232
|
}
|
|
232
233
|
function registerIdentityCommands(parent) {
|
|
@@ -368,7 +369,7 @@ function runIdentityAssume(target, opts) {
|
|
|
368
369
|
process.exit(1);
|
|
369
370
|
}
|
|
370
371
|
}
|
|
371
|
-
function registerCouncilCommands(parent) {
|
|
372
|
+
export function registerCouncilCommands(parent) {
|
|
372
373
|
const council = parent
|
|
373
374
|
.command("council")
|
|
374
375
|
.description("Multi-agent deliberation: convene a temporary group around an " +
|
|
@@ -453,7 +454,7 @@ function registerCouncilCommands(parent) {
|
|
|
453
454
|
"(or omit [steward]) to drop the field and revert to the default " +
|
|
454
455
|
"(the convener). Refuses to mutate archived councils. By default, " +
|
|
455
456
|
"rejects names not in the known-agents list (active heartbeats + " +
|
|
456
|
-
"
|
|
457
|
+
"journals archived in the last 30 days); pass --allow-unknown " +
|
|
457
458
|
"to bypass when bootstrapping.")
|
|
458
459
|
.option("--clear", "Clear the steward field, reverting to created_by default")
|
|
459
460
|
.option("--allow-unknown", "Skip the known-agents check (bootstrap an agent that hasn't run yet)")
|
|
@@ -467,7 +468,7 @@ function registerCouncilCommands(parent) {
|
|
|
467
468
|
"Pass either --message <inline> or --file <path>. Writes to " +
|
|
468
469
|
".harnery/councils/<id>/round-<N>/<agent-Name>.md. Pass --as <member> " +
|
|
469
470
|
"to contribute under a council seat name that differs from the running " +
|
|
470
|
-
"agent's heartbeat name (useful for cross-
|
|
471
|
+
"agent's heartbeat name (useful for cross-adapter councils where each " +
|
|
471
472
|
"reviewer has a different auto-generated session name).")
|
|
472
473
|
.option("--message <text>", "Inline contribution text (caps at 4KB)")
|
|
473
474
|
.option("--file <path>", "Path to a file containing the contribution")
|
|
@@ -1023,7 +1024,7 @@ function ensureCursorSession(root) {
|
|
|
1023
1024
|
composer_mode: "agent",
|
|
1024
1025
|
is_background_agent: false,
|
|
1025
1026
|
});
|
|
1026
|
-
spawnSync("bash", [agentHook, "session-start", "--
|
|
1027
|
+
spawnSync("bash", [agentHook, "session-start", "--adapter", "cursor"], {
|
|
1027
1028
|
input: payload,
|
|
1028
1029
|
cwd: root,
|
|
1029
1030
|
encoding: "utf8",
|
|
@@ -1122,11 +1123,11 @@ function runSetTask(task, opts) {
|
|
|
1122
1123
|
type: "state.task_set",
|
|
1123
1124
|
owner: myOwner,
|
|
1124
1125
|
session: hb?.session_id ?? myOwner,
|
|
1125
|
-
|
|
1126
|
+
adapter: normalizeAdapter(hb?.platform),
|
|
1126
1127
|
data: { task, cleared: !task || task.length === 0 },
|
|
1127
1128
|
});
|
|
1128
1129
|
// On the first focus declaration of a session, surface a suggested session
|
|
1129
|
-
// name for the operator to set as their
|
|
1130
|
+
// name for the operator to set as their adapter tab title. Read the result
|
|
1130
1131
|
// (`suggested_session_name`) and reproduce it in a fenced code block so the
|
|
1131
1132
|
// UI's Copy button hands over the exact string. null on every later call.
|
|
1132
1133
|
const built = firstOfSession && !opts?.sessionId ? buildSuggestedName(hb?.name ?? "unknown", [task]) : null;
|
|
@@ -1254,7 +1255,7 @@ function runStatus(opts) {
|
|
|
1254
1255
|
type: "state.status_checked",
|
|
1255
1256
|
owner: myOwner,
|
|
1256
1257
|
session: hb.session_id ?? myOwner,
|
|
1257
|
-
|
|
1258
|
+
adapter: normalizeAdapter(hb.platform),
|
|
1258
1259
|
data: {
|
|
1259
1260
|
format: opts.json ? "json" : "box",
|
|
1260
1261
|
agent_count: 0, // computed below, not yet available here; Phase 5 verdict reads owner-scope only
|
|
@@ -1721,14 +1722,14 @@ function readCanonicalEventsInWindow(root, cutoffMs) {
|
|
|
1721
1722
|
}
|
|
1722
1723
|
return out;
|
|
1723
1724
|
}
|
|
1724
|
-
/**
|
|
1725
|
+
/** adapter ("claude-code") → legacy platform label ("claude_code") so the
|
|
1725
1726
|
* existing formatPlatformLabel rendering keeps working unchanged. */
|
|
1726
|
-
function
|
|
1727
|
-
if (
|
|
1727
|
+
function adapterToPlatform(adapter) {
|
|
1728
|
+
if (adapter === "claude-code")
|
|
1728
1729
|
return "claude_code";
|
|
1729
|
-
if (
|
|
1730
|
+
if (adapter === "cursor")
|
|
1730
1731
|
return "cursor";
|
|
1731
|
-
if (
|
|
1732
|
+
if (adapter === "codex")
|
|
1732
1733
|
return "codex";
|
|
1733
1734
|
return "claude_code";
|
|
1734
1735
|
}
|
|
@@ -1750,7 +1751,7 @@ function canonicalToHealEvent(ev, nameById) {
|
|
|
1750
1751
|
agent,
|
|
1751
1752
|
kind,
|
|
1752
1753
|
reason,
|
|
1753
|
-
platform:
|
|
1754
|
+
platform: adapterToPlatform(ev.adapter),
|
|
1754
1755
|
};
|
|
1755
1756
|
if (kind === "pidmap" && data.pid !== undefined && data.pid !== null) {
|
|
1756
1757
|
out.pid = String(data.pid);
|
|
@@ -2508,14 +2509,14 @@ function renderHealthBox(report) {
|
|
|
2508
2509
|
}
|
|
2509
2510
|
}
|
|
2510
2511
|
}
|
|
2511
|
-
function
|
|
2512
|
+
function runAdapterProbe(id, opts) {
|
|
2512
2513
|
if (opts.json)
|
|
2513
2514
|
emit.config({ format: "json" });
|
|
2514
|
-
const
|
|
2515
|
-
if (
|
|
2515
|
+
const adapter = id.trim();
|
|
2516
|
+
if (adapter !== "claude_code" && adapter !== "cursor") {
|
|
2516
2517
|
emit.error({
|
|
2517
|
-
code: "
|
|
2518
|
-
message: "
|
|
2518
|
+
code: "bad_adapter",
|
|
2519
|
+
message: "adapter id must be claude_code or cursor",
|
|
2519
2520
|
});
|
|
2520
2521
|
process.exit(1);
|
|
2521
2522
|
}
|
|
@@ -2527,13 +2528,13 @@ function runHarnessProbe(id, opts) {
|
|
|
2527
2528
|
});
|
|
2528
2529
|
process.exit(1);
|
|
2529
2530
|
}
|
|
2530
|
-
const subagentDir =
|
|
2531
|
-
const sampleDir =
|
|
2532
|
-
const dispatchEntry =
|
|
2533
|
-
? "harnery/bin/agent-hook session-start --
|
|
2534
|
-
: "harnery/bin/agent-hook session-start --
|
|
2531
|
+
const subagentDir = adapter === "cursor" ? ".harnery/.cursor-subagent-map" : `.harnery/.subagent-map/${adapter}`;
|
|
2532
|
+
const sampleDir = adapter === "cursor" ? "docs/api/cursor-hooks/samples" : "docs/api/claude-code-hooks/samples";
|
|
2533
|
+
const dispatchEntry = adapter === "cursor"
|
|
2534
|
+
? "harnery/bin/agent-hook session-start --adapter cursor"
|
|
2535
|
+
: "harnery/bin/agent-hook session-start --adapter claude-code";
|
|
2535
2536
|
// TS-native probe. The owner + anchor-pid resolution it reports lives in
|
|
2536
|
-
// `
|
|
2537
|
+
// `findAdapterAnchorPid` (core/hooks/cli.ts, the /proc walk mirrored below)
|
|
2537
2538
|
// and `resolveOwner` here, so the probe reports exactly what the live hot
|
|
2538
2539
|
// path resolves.
|
|
2539
2540
|
const anchorTokens = new Set(["claude", "claude-code", "cursor", "codex"]);
|
|
@@ -2573,7 +2574,7 @@ function runHarnessProbe(id, opts) {
|
|
|
2573
2574
|
walkPid = ppid;
|
|
2574
2575
|
}
|
|
2575
2576
|
const data = {
|
|
2576
|
-
|
|
2577
|
+
adapter,
|
|
2577
2578
|
anchor_pid: anchorPid,
|
|
2578
2579
|
hook_pid: String(process.pid),
|
|
2579
2580
|
resolved_owner: resolveOwner() ?? "",
|
|
@@ -2581,13 +2582,13 @@ function runHarnessProbe(id, opts) {
|
|
|
2581
2582
|
subagent_map_dir: subagentDir,
|
|
2582
2583
|
sample_ref: sampleDir,
|
|
2583
2584
|
dispatch_entry: dispatchEntry,
|
|
2584
|
-
note: "heal-events counts drift;
|
|
2585
|
+
note: "heal-events counts drift; adapter-probe answers wiring",
|
|
2585
2586
|
};
|
|
2586
2587
|
const wantReplay = opts.replaySamples || !!opts.sample;
|
|
2587
2588
|
let samples = [];
|
|
2588
2589
|
let replayExitCode = 0;
|
|
2589
2590
|
if (wantReplay) {
|
|
2590
|
-
const result =
|
|
2591
|
+
const result = replayAdapterSamples(adapter, root, sampleDir, opts.sample);
|
|
2591
2592
|
samples = result.samples;
|
|
2592
2593
|
replayExitCode = result.exitCode;
|
|
2593
2594
|
data.samples = samples;
|
|
@@ -2596,7 +2597,7 @@ function runHarnessProbe(id, opts) {
|
|
|
2596
2597
|
emit.data(data);
|
|
2597
2598
|
if (process.stdout.isTTY && !opts.json) {
|
|
2598
2599
|
const lines = [
|
|
2599
|
-
`
|
|
2600
|
+
`Adapter probe: ${adapter}`,
|
|
2600
2601
|
` anchor_pid: ${String(data.anchor_pid) || "(empty, expected in sandbox/non-IDE)"}`,
|
|
2601
2602
|
` hook_pid: ${String(data.hook_pid)}`,
|
|
2602
2603
|
` resolved_owner: ${String(data.resolved_owner) || "(none)"}`,
|
|
@@ -2636,11 +2637,11 @@ function runHarnessProbe(id, opts) {
|
|
|
2636
2637
|
}
|
|
2637
2638
|
}
|
|
2638
2639
|
/**
|
|
2639
|
-
* Replay every JSON fixture in <root>/<sampleDir> against the live
|
|
2640
|
+
* Replay every JSON fixture in <root>/<sampleDir> against the live adapter
|
|
2640
2641
|
* dispatcher in an isolated sandbox.
|
|
2641
2642
|
*
|
|
2642
2643
|
* Sandbox isolation strategy:
|
|
2643
|
-
* - mkdtempSync(tmpdir(), "harn-
|
|
2644
|
+
* - mkdtempSync(tmpdir(), "harn-adapter-probe-") creates a non-git tmp dir.
|
|
2644
2645
|
* - The dispatcher's coord-root resolution falls back to
|
|
2645
2646
|
* `HARNERY_COORD_ROOT_OVERRIDE` when git rev-parse fails. We set it to the sandbox.
|
|
2646
2647
|
* - We rewrite the payload's `cwd` field (Cursor cds to it) to the sandbox,
|
|
@@ -2652,7 +2653,7 @@ function runHarnessProbe(id, opts) {
|
|
|
2652
2653
|
* payload with `.hook_event_name`. Event name resolution falls back to the
|
|
2653
2654
|
* filename (without `.json`) when neither field exists.
|
|
2654
2655
|
*/
|
|
2655
|
-
function
|
|
2656
|
+
function replayAdapterSamples(adapter, root, relativeSampleDir, filter) {
|
|
2656
2657
|
const sampleDir = resolve(root, relativeSampleDir);
|
|
2657
2658
|
if (!existsSync(sampleDir)) {
|
|
2658
2659
|
return {
|
|
@@ -2673,7 +2674,7 @@ function replayHarnessSamples(harness, root, relativeSampleDir, filter) {
|
|
|
2673
2674
|
};
|
|
2674
2675
|
}
|
|
2675
2676
|
// agent-hook is the single entry point. Replay sample payloads against it,
|
|
2676
|
-
// mapping the
|
|
2677
|
+
// mapping the adapter-native hook_event_name to the agent-hook CLI subcommand.
|
|
2677
2678
|
const agentHook = resolve(root, "harnery/bin/agent-hook");
|
|
2678
2679
|
if (!existsSync(agentHook)) {
|
|
2679
2680
|
return {
|
|
@@ -2711,8 +2712,8 @@ function replayHarnessSamples(harness, root, relativeSampleDir, filter) {
|
|
|
2711
2712
|
stopFailure: "stop-failure",
|
|
2712
2713
|
StopFailure: "stop-failure",
|
|
2713
2714
|
};
|
|
2714
|
-
const
|
|
2715
|
-
const sandbox = mkdtempSync(join(tmpdir(), "harn-
|
|
2715
|
+
const adapterFlag = adapter === "claude_code" ? "claude-code" : adapter;
|
|
2716
|
+
const sandbox = mkdtempSync(join(tmpdir(), "harn-adapter-probe-"));
|
|
2716
2717
|
const results = [];
|
|
2717
2718
|
try {
|
|
2718
2719
|
for (const file of fixtures) {
|
|
@@ -2749,7 +2750,7 @@ function replayHarnessSamples(harness, root, relativeSampleDir, filter) {
|
|
|
2749
2750
|
payloadObj.workspace_roots = [sandbox];
|
|
2750
2751
|
}
|
|
2751
2752
|
const subcommand = EVENT_SUBCOMMAND[event] ?? event;
|
|
2752
|
-
const dispatch = spawnSync("bash", [agentHook, subcommand, "--
|
|
2753
|
+
const dispatch = spawnSync("bash", [agentHook, subcommand, "--adapter", adapterFlag], {
|
|
2753
2754
|
cwd: sandbox,
|
|
2754
2755
|
encoding: "utf8",
|
|
2755
2756
|
input: JSON.stringify(payloadObj),
|
|
@@ -2757,8 +2758,8 @@ function replayHarnessSamples(harness, root, relativeSampleDir, filter) {
|
|
|
2757
2758
|
env: {
|
|
2758
2759
|
...process.env,
|
|
2759
2760
|
HARNERY_COORD_ROOT_OVERRIDE: sandbox,
|
|
2760
|
-
|
|
2761
|
-
HARNERY_AGENT_COORD_PLATFORM:
|
|
2761
|
+
HARNERY_AGENT_COORD_ADAPTER: adapter,
|
|
2762
|
+
HARNERY_AGENT_COORD_PLATFORM: adapter,
|
|
2762
2763
|
HARNERY_AGENT_COORD_OFF: "0",
|
|
2763
2764
|
},
|
|
2764
2765
|
});
|
|
@@ -2893,8 +2894,8 @@ function runPing(name, message, opts) {
|
|
|
2893
2894
|
peer_instance_id: peerOwner,
|
|
2894
2895
|
from: fromName,
|
|
2895
2896
|
body,
|
|
2896
|
-
|
|
2897
|
-
|
|
2897
|
+
journal_path: doc.path,
|
|
2898
|
+
journal_bytes: doc.bytes,
|
|
2898
2899
|
};
|
|
2899
2900
|
if (opts.json) {
|
|
2900
2901
|
emit.config({ format: "json" });
|
|
@@ -3109,7 +3110,7 @@ function emitCouncilStateEvent(type, manifest, extraData) {
|
|
|
3109
3110
|
type,
|
|
3110
3111
|
owner: myOwner,
|
|
3111
3112
|
session: hb?.session_id ?? myOwner,
|
|
3112
|
-
|
|
3113
|
+
adapter: normalizeAdapter(hb?.platform),
|
|
3113
3114
|
data: { council_id: manifest.council_id, ...extraData },
|
|
3114
3115
|
});
|
|
3115
3116
|
}
|
|
@@ -3214,7 +3215,7 @@ function runCouncilCreate(objective, opts) {
|
|
|
3214
3215
|
type: "council.open",
|
|
3215
3216
|
owner: myOwner,
|
|
3216
3217
|
session: myHbForEmit?.session_id ?? myOwner,
|
|
3217
|
-
|
|
3218
|
+
adapter: normalizeAdapter(myHbForEmit?.platform),
|
|
3218
3219
|
data: {
|
|
3219
3220
|
council_id: councilId,
|
|
3220
3221
|
topic: trimmedObjective,
|
|
@@ -3223,7 +3224,7 @@ function runCouncilCreate(objective, opts) {
|
|
|
3223
3224
|
},
|
|
3224
3225
|
});
|
|
3225
3226
|
}
|
|
3226
|
-
// Best-effort: ping each currently-active member's
|
|
3227
|
+
// Best-effort: ping each currently-active member's journal with a
|
|
3227
3228
|
// handoff entry pointing them at the council. Members not currently active
|
|
3228
3229
|
// get nothing here; the Phase 2 SessionStart adapter will surface the
|
|
3229
3230
|
// invite on their next session.
|
|
@@ -3646,7 +3647,7 @@ function runCouncilSetSteward(id, stewardArg, opts) {
|
|
|
3646
3647
|
const known_names = known.map((a) => a.name).join(", ") || "(none)";
|
|
3647
3648
|
emit.error({
|
|
3648
3649
|
code: "steward_not_known",
|
|
3649
|
-
message: `'${steward}' is not a known agent (active heartbeats +
|
|
3650
|
+
message: `'${steward}' is not a known agent (active heartbeats + journals archived in the last 30 days). Pass --allow-unknown to bootstrap. Known: ${known_names}`,
|
|
3650
3651
|
});
|
|
3651
3652
|
process.exit(1);
|
|
3652
3653
|
}
|
|
@@ -3679,7 +3680,7 @@ function runCouncilSetSteward(id, stewardArg, opts) {
|
|
|
3679
3680
|
emit.text(`council ${next.council_id} steward set to ${label}.\n`);
|
|
3680
3681
|
}
|
|
3681
3682
|
}
|
|
3682
|
-
/** Build a markdown
|
|
3683
|
+
/** Build a markdown journal of every round's contributions on disk. */
|
|
3683
3684
|
function buildTranscript(manifest) {
|
|
3684
3685
|
const body = councilBodyDir(manifest.council_id);
|
|
3685
3686
|
const out = [];
|
|
@@ -3749,7 +3750,7 @@ function runCouncilContribute(id, opts) {
|
|
|
3749
3750
|
}
|
|
3750
3751
|
// Resolve the contributor name. Two paths:
|
|
3751
3752
|
// 1. --as <member> override: caller explicitly names the council seat. Used
|
|
3752
|
-
// for cross-
|
|
3753
|
+
// for cross-adapter councils where each reviewer agent has a different
|
|
3753
3754
|
// auto-generated session name from a different name pool; they can
|
|
3754
3755
|
// contribute under a fixed seat name without renaming the session.
|
|
3755
3756
|
// 2. Heartbeat-derived (default): resolve owner via ppid walk + read the
|
|
@@ -3936,7 +3937,7 @@ function runCouncilPrompt(id, member, opts) {
|
|
|
3936
3937
|
process.exit(1);
|
|
3937
3938
|
}
|
|
3938
3939
|
// Resolve caller identity (steward authority check). Same --as override
|
|
3939
|
-
// shape as `contribute` for cross-
|
|
3940
|
+
// shape as `contribute` for cross-adapter scripting.
|
|
3940
3941
|
let callerName;
|
|
3941
3942
|
let actualName = null;
|
|
3942
3943
|
if (opts.as) {
|
|
@@ -4142,7 +4143,7 @@ function runCouncilAdvance(id, opts) {
|
|
|
4142
4143
|
* Shared advance helper used by both `advance` and auto-advance from
|
|
4143
4144
|
* `contribute`. Increments current_round, flips round_status back to open,
|
|
4144
4145
|
* creates the new round directory, writes the manifest, and pings each
|
|
4145
|
-
* member's
|
|
4146
|
+
* member's journal with the advance notification.
|
|
4146
4147
|
*/
|
|
4147
4148
|
function advanceCouncil(manifest, force) {
|
|
4148
4149
|
const nextRound = manifest.current_round + 1;
|
|
@@ -4156,7 +4157,7 @@ function advanceCouncil(manifest, force) {
|
|
|
4156
4157
|
if (rd && !existsSync(rd))
|
|
4157
4158
|
mkdirSync(rd, { recursive: true });
|
|
4158
4159
|
writeManifest(next);
|
|
4159
|
-
// Ping each member's
|
|
4160
|
+
// Ping each member's journal with the advance notification.
|
|
4160
4161
|
// (Convener already knows; we skip pinging them if they convened it from
|
|
4161
4162
|
// their own session.)
|
|
4162
4163
|
const myOwner = resolveOwner();
|
|
@@ -4172,7 +4173,7 @@ function advanceCouncil(manifest, force) {
|
|
|
4172
4173
|
appendEntry(memberOwner, "handoff", `from council advance (${manifest.council_id}): round ${nextRound} is now open${force ? " (advanced with --force; some round-N members dropped)" : ""}. Run 'harn agents council show ${manifest.council_id}' to read prior round + 'harn agents council contribute ${manifest.council_id}' to weigh in.`);
|
|
4173
4174
|
}
|
|
4174
4175
|
catch {
|
|
4175
|
-
/* best-effort; member
|
|
4176
|
+
/* best-effort; member journal may not exist yet */
|
|
4176
4177
|
}
|
|
4177
4178
|
}
|
|
4178
4179
|
return next;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { EmitContext, HarneryProgramContext } from "../commander.js";
|
|
3
|
+
export declare function registerArtifactsCommand(program: Command, emit: EmitContext, context?: HarneryProgramContext): void;
|
|
4
|
+
//# sourceMappingURL=artifacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/commands/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAa1E,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAmGN"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { monorepoRoot, readHeartbeat, resolveOwner } from "../core/agents/index.js";
|
|
2
|
+
import { cleanArtifacts, createArtifact, inventoryArtifacts, releaseArtifact, renewArtifact, showArtifact, } from "../core/artifacts/index.js";
|
|
3
|
+
import { artifactDefaultRetentionDays, coordFreshnessSeconds } from "../core/config.js";
|
|
4
|
+
export function registerArtifactsCommand(program, emit, context) {
|
|
5
|
+
const root = program
|
|
6
|
+
.command("artifacts")
|
|
7
|
+
.alias("artifact")
|
|
8
|
+
.description("Manage repository-local working artifacts under .harnery/artifacts/");
|
|
9
|
+
root
|
|
10
|
+
.command("create <slug>")
|
|
11
|
+
.description("Create one managed artifact workspace and print its path.")
|
|
12
|
+
.requiredOption("--purpose <text>", "What the files are for")
|
|
13
|
+
.option("--days <n>", "Retention in days (default from artifacts.default_retention_days)")
|
|
14
|
+
.action((slug, opts) => {
|
|
15
|
+
run(emit, () => {
|
|
16
|
+
const repoRoot = requireRepoRoot(context);
|
|
17
|
+
const actor = currentActor();
|
|
18
|
+
const retentionDays = opts.days
|
|
19
|
+
? parseDays(opts.days)
|
|
20
|
+
: artifactDefaultRetentionDays(repoRoot);
|
|
21
|
+
const created = createArtifact(repoRoot, {
|
|
22
|
+
slug,
|
|
23
|
+
purpose: opts.purpose,
|
|
24
|
+
retentionDays,
|
|
25
|
+
actor,
|
|
26
|
+
});
|
|
27
|
+
emit.data({
|
|
28
|
+
path: created.path,
|
|
29
|
+
artifact_id: created.manifest.artifact_id,
|
|
30
|
+
expires_at: created.manifest.retention.expires_at,
|
|
31
|
+
owner_instance_id: actor?.instance_id ?? null,
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
root
|
|
36
|
+
.command("list")
|
|
37
|
+
.description("Inventory every artifact workspace with its cleanup classification.")
|
|
38
|
+
.action(() => {
|
|
39
|
+
run(emit, () => {
|
|
40
|
+
const repoRoot = requireRepoRoot(context);
|
|
41
|
+
const rows = inventoryArtifacts(repoRoot, {
|
|
42
|
+
freshnessSeconds: coordFreshnessSeconds(repoRoot),
|
|
43
|
+
});
|
|
44
|
+
emit.data({ rows, meta: summarize(rows) });
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
root
|
|
48
|
+
.command("show <ref>")
|
|
49
|
+
.description("Show one artifact by id, directory name, or direct-child path.")
|
|
50
|
+
.action((ref) => {
|
|
51
|
+
run(emit, () => {
|
|
52
|
+
const repoRoot = requireRepoRoot(context);
|
|
53
|
+
emit.data(showArtifact(repoRoot, ref, {
|
|
54
|
+
freshnessSeconds: coordFreshnessSeconds(repoRoot),
|
|
55
|
+
}));
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
root
|
|
59
|
+
.command("renew <ref>")
|
|
60
|
+
.description("Set a new retention window. Renewal does not mark the artifact active.")
|
|
61
|
+
.requiredOption("--days <n>", "Days from now")
|
|
62
|
+
.requiredOption("--reason <text>", "Why the extra retention is needed")
|
|
63
|
+
.action((ref, opts) => {
|
|
64
|
+
run(emit, () => {
|
|
65
|
+
const repoRoot = requireRepoRoot(context);
|
|
66
|
+
const manifest = renewArtifact(repoRoot, ref, parseDays(opts.days), opts.reason, {
|
|
67
|
+
actor: currentActor(),
|
|
68
|
+
});
|
|
69
|
+
emit.data(manifest);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
root
|
|
73
|
+
.command("release <ref>")
|
|
74
|
+
.description("Release active-owner protection without shortening retention.")
|
|
75
|
+
.action((ref) => {
|
|
76
|
+
run(emit, () => {
|
|
77
|
+
const repoRoot = requireRepoRoot(context);
|
|
78
|
+
emit.data(releaseArtifact(repoRoot, ref, { actor: currentActor() }));
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
root
|
|
82
|
+
.command("clean")
|
|
83
|
+
.description("Preview expired artifact deletion; pass --yes to delete.")
|
|
84
|
+
.option("--yes", "Permanently delete entries classified managed-expired")
|
|
85
|
+
.action((opts) => {
|
|
86
|
+
run(emit, () => {
|
|
87
|
+
const repoRoot = requireRepoRoot(context);
|
|
88
|
+
const rows = cleanArtifacts(repoRoot, {
|
|
89
|
+
yes: opts.yes,
|
|
90
|
+
freshnessSeconds: coordFreshnessSeconds(repoRoot),
|
|
91
|
+
});
|
|
92
|
+
emit.data({ rows, meta: summarize(rows) });
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
function currentActor() {
|
|
97
|
+
const instanceId = resolveOwner();
|
|
98
|
+
if (!instanceId)
|
|
99
|
+
return undefined;
|
|
100
|
+
const hb = readHeartbeat(instanceId);
|
|
101
|
+
return {
|
|
102
|
+
instance_id: instanceId,
|
|
103
|
+
session_id: hb?.session_id,
|
|
104
|
+
name: hb?.name,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function requireRepoRoot(context) {
|
|
108
|
+
const root = context?.repoRoot ?? monorepoRoot();
|
|
109
|
+
if (!root)
|
|
110
|
+
throw new Error("not inside a Git repository");
|
|
111
|
+
return root;
|
|
112
|
+
}
|
|
113
|
+
function parseDays(value) {
|
|
114
|
+
const parsed = Number(value);
|
|
115
|
+
if (!Number.isInteger(parsed) || parsed <= 0 || parsed > 3650) {
|
|
116
|
+
throw new Error("--days must be between 1 and 3650");
|
|
117
|
+
}
|
|
118
|
+
return parsed;
|
|
119
|
+
}
|
|
120
|
+
function summarize(rows) {
|
|
121
|
+
const classifications = {};
|
|
122
|
+
for (const row of rows) {
|
|
123
|
+
classifications[row.classification] = (classifications[row.classification] ?? 0) + 1;
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
total: rows.length,
|
|
127
|
+
classifications,
|
|
128
|
+
would_delete: rows.filter((row) => row.action === "would-delete").length,
|
|
129
|
+
deleted: rows.filter((row) => row.action === "deleted").length,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function run(emit, fn) {
|
|
133
|
+
try {
|
|
134
|
+
fn();
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
emit.error({
|
|
138
|
+
code: "artifact_failed",
|
|
139
|
+
message: error instanceof Error ? error.message : String(error),
|
|
140
|
+
});
|
|
141
|
+
emit.setExitCode(1);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* paths and are init'd on first `harn backup init`. Subcommands:
|
|
7
7
|
*
|
|
8
8
|
* init restic init the repo (one-time)
|
|
9
|
-
* snapshot restic backup .harnery/
|
|
9
|
+
* snapshot restic backup .harnery/ (working artifacts excluded)
|
|
10
10
|
* list restic snapshots
|
|
11
11
|
* restore restic restore <id>
|
|
12
12
|
* prune restic forget --keep-daily 7 --keep-weekly 4 --prune
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA4EnD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA4EnD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAqN/E"}
|
package/dist/commands/backup.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* paths and are init'd on first `harn backup init`. Subcommands:
|
|
7
7
|
*
|
|
8
8
|
* init restic init the repo (one-time)
|
|
9
|
-
* snapshot restic backup .harnery/
|
|
9
|
+
* snapshot restic backup .harnery/ (working artifacts excluded)
|
|
10
10
|
* list restic snapshots
|
|
11
11
|
* restore restic restore <id>
|
|
12
12
|
* prune restic forget --keep-daily 7 --keep-weekly 4 --prune
|
|
@@ -109,12 +109,13 @@ export function registerBackupCommand(program, emit) {
|
|
|
109
109
|
backup
|
|
110
110
|
.command("snapshot")
|
|
111
111
|
.description("Take a restic snapshot of .harnery/ (excluding events.ndjson and " +
|
|
112
|
-
".lock files by default). Pass --target to back up a different path.")
|
|
112
|
+
".lock files and artifacts/ by default). Pass --target to back up a different path.")
|
|
113
113
|
.option("--target <path>", "Path to snapshot (default: .harnery/ from cwd walk-up)")
|
|
114
114
|
.option("--tag <tag>", "Restic tag (repeatable)", collect, [])
|
|
115
115
|
.option("--repo <path>", "Repository path")
|
|
116
116
|
.option("--password-file <path>", "Password file")
|
|
117
117
|
.option("--include-events", "Don't exclude events.ndjson (default: excluded; large + machine-local)")
|
|
118
|
+
.option("--include-artifacts", "Include managed working artifacts (default: excluded; potentially large + ephemeral)")
|
|
118
119
|
.action((opts) => {
|
|
119
120
|
if (!checkRestic(emit)) {
|
|
120
121
|
emit.setExitCode(1);
|
|
@@ -135,6 +136,8 @@ export function registerBackupCommand(program, emit) {
|
|
|
135
136
|
passThrough.push("--exclude", ".lock");
|
|
136
137
|
passThrough.push("--exclude", ".log.lock");
|
|
137
138
|
}
|
|
139
|
+
if (!opts.includeArtifacts)
|
|
140
|
+
passThrough.push("--exclude", "artifacts");
|
|
138
141
|
for (const t of opts.tag) {
|
|
139
142
|
passThrough.push("--tag", t);
|
|
140
143
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browse.d.ts","sourceRoot":"","sources":["../../src/commands/browse.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"browse.d.ts","sourceRoot":"","sources":["../../src/commands/browse.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAuL1E,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,WAAW,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAoWN"}
|