harnery 0.30.0 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/commander.d.ts +8 -0
- package/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +14 -13
- package/dist/commands/adapter.d.ts +12 -0
- package/dist/commands/adapter.d.ts.map +1 -0
- package/dist/commands/{harness.js → adapter.js} +35 -35
- package/dist/commands/agents.d.ts +3 -2
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +61 -60
- package/dist/commands/artifacts.d.ts +4 -0
- package/dist/commands/artifacts.d.ts.map +1 -0
- package/dist/commands/artifacts.js +143 -0
- package/dist/commands/backup.d.ts +1 -1
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +5 -2
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +310 -7
- package/dist/commands/checkpoint.d.ts +12 -0
- package/dist/commands/checkpoint.d.ts.map +1 -0
- package/dist/commands/checkpoint.js +162 -0
- package/dist/commands/context.d.ts +2 -2
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +3 -151
- package/dist/commands/decision.d.ts.map +1 -1
- package/dist/commands/decision.js +31 -7
- package/dist/commands/deinit.d.ts +2 -2
- package/dist/commands/deinit.js +15 -15
- package/dist/commands/doctor.js +23 -23
- package/dist/commands/governor.d.ts +4 -0
- package/dist/commands/governor.d.ts.map +1 -0
- package/dist/commands/{supervisor.js → governor.js} +133 -108
- package/dist/commands/init.d.ts +12 -12
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +44 -30
- package/dist/commands/{session.d.ts → journal.d.ts} +2 -2
- package/dist/commands/journal.d.ts.map +1 -0
- package/dist/commands/{scratch.js → journal.js} +47 -47
- package/dist/commands/policy.js +1 -1
- package/dist/commands/presence.js +2 -2
- package/dist/commands/sync.d.ts +1 -1
- package/dist/commands/sync.js +3 -3
- package/dist/commands/tunnel.d.ts +16 -0
- package/dist/commands/tunnel.d.ts.map +1 -1
- package/dist/commands/tunnel.js +193 -23
- package/dist/commands/web-fetch.js +1 -1
- package/dist/commands/web.d.ts +19 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +51 -0
- package/dist/commands/work.d.ts.map +1 -1
- package/dist/commands/work.js +38 -22
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +35 -28
- package/dist/core/{harnesses → adapters}/attest-projection.d.ts +2 -2
- package/dist/core/adapters/attest-projection.d.ts.map +1 -0
- package/dist/core/{harnesses → adapters}/attest.d.ts +16 -16
- package/dist/core/adapters/attest.d.ts.map +1 -0
- package/dist/core/{harnesses → adapters}/attest.js +9 -9
- package/dist/core/{harnesses → adapters}/attestation.d.ts +16 -16
- package/dist/core/adapters/attestation.d.ts.map +1 -0
- package/dist/core/{harnesses → adapters}/attestation.js +20 -20
- package/dist/core/{harnesses → adapters}/bench.d.ts +12 -12
- package/dist/core/adapters/bench.d.ts.map +1 -0
- package/dist/core/{harnesses → adapters}/bench.js +12 -12
- package/dist/core/adapters/index.d.ts +13 -0
- package/dist/core/adapters/index.d.ts.map +1 -0
- package/dist/core/adapters/index.js +6 -0
- package/dist/core/{harnesses → adapters}/profiles.d.ts +11 -11
- package/dist/core/adapters/profiles.d.ts.map +1 -0
- package/dist/core/{harnesses → adapters}/profiles.js +11 -11
- package/dist/core/adapters/registry.d.ts +15 -0
- package/dist/core/adapters/registry.d.ts.map +1 -0
- package/dist/core/{harnesses → adapters}/registry.js +11 -11
- package/dist/core/{harnesses → adapters}/types.d.ts +23 -23
- package/dist/core/adapters/types.d.ts.map +1 -0
- package/dist/core/{harnesses → adapters}/types.js +1 -1
- package/dist/core/agents/canonical-emit.d.ts +4 -4
- package/dist/core/agents/canonical-emit.js +5 -5
- package/dist/core/agents/cli-emit.js +1 -1
- package/dist/core/agents/cli.js +30 -26
- package/dist/core/agents/codex-replay.d.ts +1 -1
- package/dist/core/agents/codex-replay.js +6 -6
- package/dist/core/agents/coord-client.d.ts +21 -2
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/coord-client.js +122 -27
- package/dist/core/agents/events/consume.d.ts +1 -1
- package/dist/core/agents/events/emit.d.ts +5 -6
- package/dist/core/agents/events/emit.d.ts.map +1 -1
- package/dist/core/agents/events/emit.js +2 -2
- package/dist/core/agents/render/prompt-context.d.ts +21 -9
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +82 -30
- package/dist/core/agents/render/session-context.d.ts +1 -1
- package/dist/core/agents/render/session-context.js +5 -5
- package/dist/core/agents/rules/claim-conflict.d.ts +2 -6
- package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/claim-conflict.js +1 -1
- package/dist/core/agents/rules/commit-conflict.js +98 -22
- package/dist/core/agents/rules/stop-hook.d.ts +9 -9
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +23 -5
- package/dist/core/agents/rules/verdict.d.ts +14 -0
- package/dist/core/agents/rules/verdict.d.ts.map +1 -0
- package/dist/core/agents/rules/verdict.js +1 -0
- package/dist/core/agents/session-events.js +3 -3
- package/dist/core/agents/state/council.d.ts +1 -1
- package/dist/core/agents/state/council.js +1 -1
- package/dist/core/agents/state/heartbeat-projector.d.ts +3 -2
- package/dist/core/agents/state/heartbeat-projector.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-projector.js +14 -10
- package/dist/core/agents/state/heartbeat-writer.d.ts +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +12 -12
- package/dist/core/agents/state/{scratch.d.ts → journal.d.ts} +7 -7
- package/dist/core/agents/state/{scratch.d.ts.map → journal.d.ts.map} +1 -1
- package/dist/core/agents/state/{scratch.js → journal.js} +12 -12
- package/dist/core/agents/state/pidmap.d.ts +28 -4
- package/dist/core/agents/state/pidmap.d.ts.map +1 -1
- package/dist/core/agents/state/pidmap.js +130 -15
- package/dist/core/agents/state/proc-start.d.ts +95 -0
- package/dist/core/agents/state/proc-start.d.ts.map +1 -0
- package/dist/core/agents/state/proc-start.js +199 -0
- package/dist/core/agents/state/shell-mutation.d.ts +1 -1
- package/dist/core/agents/state/shell-mutation.js +1 -1
- package/dist/core/agents/state/stale-sweep.js +7 -7
- package/dist/core/artifacts/index.d.ts +86 -0
- package/dist/core/artifacts/index.d.ts.map +1 -0
- package/dist/core/artifacts/index.js +421 -0
- package/dist/core/config.d.ts +9 -2
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +26 -2
- package/dist/core/context/index.d.ts +12 -12
- package/dist/core/context/index.js +10 -10
- package/dist/core/governor/adapter-spread.d.ts +52 -0
- package/dist/core/governor/adapter-spread.d.ts.map +1 -0
- package/dist/core/governor/adapter-spread.js +52 -0
- package/dist/core/governor/index.d.ts +7 -0
- package/dist/core/governor/index.d.ts.map +1 -0
- package/dist/core/governor/index.js +6 -0
- package/dist/core/governor/plan-api.d.ts +38 -0
- package/dist/core/governor/plan-api.d.ts.map +1 -0
- package/dist/core/governor/plan-api.js +83 -0
- package/dist/core/governor/plan-read.d.ts +5 -0
- package/dist/core/governor/plan-read.d.ts.map +1 -0
- package/dist/core/{supervisor → governor}/plan-read.js +66 -52
- package/dist/core/{supervisor → governor}/plan-types.d.ts +57 -56
- package/dist/core/governor/plan-types.d.ts.map +1 -0
- package/dist/core/{supervisor → governor}/plan-types.js +4 -4
- package/dist/core/governor/planning.d.ts +48 -0
- package/dist/core/governor/planning.d.ts.map +1 -0
- package/dist/core/{supervisor → governor}/planning.js +125 -94
- package/dist/core/governor/read.d.ts +6 -0
- package/dist/core/governor/read.d.ts.map +1 -0
- package/dist/core/governor/read.js +4 -0
- package/dist/core/governor/runner.d.ts +37 -0
- package/dist/core/governor/runner.d.ts.map +1 -0
- package/dist/core/{supervisor → governor}/runner.js +15 -15
- package/dist/core/governor/service-read.d.ts +6 -0
- package/dist/core/governor/service-read.d.ts.map +1 -0
- package/dist/core/{supervisor → governor}/service-read.js +12 -12
- package/dist/core/governor/service.d.ts +114 -0
- package/dist/core/governor/service.d.ts.map +1 -0
- package/dist/core/{supervisor → governor}/service.js +57 -57
- package/dist/core/governor/state.d.ts +116 -0
- package/dist/core/governor/state.d.ts.map +1 -0
- package/dist/core/{supervisor → governor}/state.js +228 -108
- package/dist/core/hooks/adapter/detect.d.ts +9 -0
- package/dist/core/hooks/{harness → adapter}/detect.d.ts.map +1 -1
- package/dist/core/hooks/{harness → adapter}/detect.js +8 -8
- package/dist/core/hooks/{harness → adapter}/events.d.ts +15 -14
- package/dist/core/hooks/adapter/events.d.ts.map +1 -0
- package/dist/core/hooks/{harness → adapter}/events.js +5 -5
- package/dist/core/hooks/{harness → adapter}/output.d.ts +20 -14
- package/dist/core/hooks/adapter/output.d.ts.map +1 -0
- package/dist/core/hooks/{harness → adapter}/output.js +30 -22
- package/dist/core/hooks/{harness → adapter}/parse.d.ts +5 -5
- package/dist/core/hooks/{harness → adapter}/parse.d.ts.map +1 -1
- package/dist/core/hooks/{harness → adapter}/parse.js +4 -4
- package/dist/core/hooks/{harness → adapter}/wiring.d.ts +15 -15
- package/dist/core/hooks/{harness → adapter}/wiring.d.ts.map +1 -1
- package/dist/core/hooks/{harness → adapter}/wiring.js +13 -13
- package/dist/core/hooks/cli.d.ts +3 -3
- package/dist/core/hooks/cli.js +175 -151
- package/dist/core/hooks/effects/image-capture.d.ts +5 -5
- package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
- package/dist/core/hooks/effects/image-capture.js +3 -3
- package/dist/core/hooks/effects/index.d.ts +12 -12
- package/dist/core/hooks/effects/index.d.ts.map +1 -1
- package/dist/core/hooks/effects/index.js +17 -17
- package/dist/core/hooks/events/emit.d.ts +2 -2
- package/dist/core/hooks/events/emit.d.ts.map +1 -1
- package/dist/core/hooks/events/emit.js +1 -1
- package/dist/core/hooks/events/rotate.js +1 -1
- package/dist/core/hooks/events/schema.d.ts +13 -5
- package/dist/core/hooks/events/schema.d.ts.map +1 -1
- package/dist/core/hooks/guard-path.d.ts +2 -2
- package/dist/core/hooks/guard-path.js +2 -2
- package/dist/core/hooks/index.d.ts +1 -1
- package/dist/core/hooks/index.d.ts.map +1 -1
- package/dist/core/hooks/resolve/anchor.d.ts +14 -5
- package/dist/core/hooks/resolve/anchor.d.ts.map +1 -1
- package/dist/core/hooks/resolve/anchor.js +64 -7
- package/dist/core/hooks/resolve/coord-root.d.ts +3 -3
- package/dist/core/hooks/resolve/coord-root.js +4 -4
- package/dist/core/hooks/resolve/intent.js +1 -1
- package/dist/core/hooks/resolve/owner.d.ts +1 -1
- package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
- package/dist/core/hooks/resolve/owner.js +11 -5
- package/dist/core/{scratch → journal}/index.d.ts +25 -25
- package/dist/core/{scratch → journal}/index.d.ts.map +1 -1
- package/dist/core/{scratch → journal}/index.js +38 -38
- package/dist/core/policy/evaluate.d.ts +1 -1
- package/dist/core/policy/evaluate.d.ts.map +1 -1
- package/dist/core/policy/evaluate.js +7 -7
- package/dist/core/policy/types.d.ts +3 -3
- package/dist/core/policy/types.d.ts.map +1 -1
- package/dist/core/work/state.d.ts +12 -4
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +50 -17
- package/dist/core/workflow/adapters.d.ts +17 -0
- package/dist/core/workflow/adapters.d.ts.map +1 -0
- package/dist/core/workflow/adapters.js +21 -0
- package/dist/core/workflow/approvals.js +6 -6
- package/dist/core/workflow/billing.d.ts +9 -9
- package/dist/core/workflow/billing.js +9 -9
- package/dist/core/workflow/child-env.d.ts +10 -2
- package/dist/core/workflow/child-env.d.ts.map +1 -1
- package/dist/core/workflow/child-env.js +12 -4
- package/dist/core/workflow/engine.d.ts +15 -5
- package/dist/core/workflow/engine.d.ts.map +1 -1
- package/dist/core/workflow/engine.js +138 -83
- package/dist/core/workflow/evidence-preflight.d.ts +24 -0
- package/dist/core/workflow/evidence-preflight.d.ts.map +1 -0
- package/dist/core/workflow/evidence-preflight.js +134 -0
- package/dist/core/workflow/index.d.ts +1 -1
- package/dist/core/workflow/index.d.ts.map +1 -1
- package/dist/core/workflow/proof.d.ts +11 -5
- package/dist/core/workflow/proof.d.ts.map +1 -1
- package/dist/core/workflow/proof.js +45 -36
- package/dist/core/workflow/run-state.d.ts +1 -1
- package/dist/core/workflow/run-state.js +7 -7
- package/dist/core/workflow/sandbox-projection.d.ts +6 -6
- package/dist/core/workflow/sandbox-projection.d.ts.map +1 -1
- package/dist/core/workflow/sandbox-projection.js +11 -11
- package/dist/core/workflow/spawn-claude.d.ts +3 -3
- package/dist/core/workflow/spawn-claude.d.ts.map +1 -1
- package/dist/core/workflow/spawn-claude.js +9 -6
- package/dist/core/workflow/spawn-codex.d.ts +4 -4
- package/dist/core/workflow/spawn-codex.d.ts.map +1 -1
- package/dist/core/workflow/spawn-codex.js +9 -6
- package/dist/core/workflow/spawn-cursor.d.ts +4 -4
- package/dist/core/workflow/spawn-cursor.d.ts.map +1 -1
- package/dist/core/workflow/spawn-cursor.js +9 -6
- package/dist/core/workflow/spawn-failure.d.ts +1 -1
- package/dist/core/workflow/spawn-failure.js +1 -1
- package/dist/core/workflow/specialists.js +2 -2
- package/dist/core/workflow/{journal.d.ts → transcript.d.ts} +8 -8
- package/dist/core/workflow/transcript.d.ts.map +1 -0
- package/dist/core/workflow/{journal.js → transcript.js} +14 -14
- package/dist/core/workflow/types.d.ts +98 -51
- package/dist/core/workflow/types.d.ts.map +1 -1
- package/dist/core/workflow/types.js +11 -1
- package/dist/core/workflow/validate.d.ts +1 -1
- package/dist/core/workflow/validate.js +1 -1
- package/dist/core/workflow/workspaces/cancellation.js +2 -2
- package/dist/core/workflow/workspaces/cleanup.js +2 -2
- package/dist/core/workflow/workspaces/execution.js +6 -6
- package/dist/core/workflow/workspaces/inspect.js +9 -9
- package/dist/core/workflow/workspaces/integration.js +14 -14
- package/dist/core/workflow/workspaces/lifecycle.d.ts +1 -1
- package/dist/core/workflow/workspaces/lifecycle.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/lifecycle.js +9 -9
- package/dist/core/workflow/workspaces/local-git.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/local-git.js +39 -5
- package/dist/core/workflow/workspaces/recovery.js +3 -3
- package/dist/core/workflow/workspaces/state.d.ts +1 -1
- package/dist/core/workflow/workspaces/state.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/state.js +3 -3
- package/dist/core/workflow/workspaces/types.d.ts +1 -1
- package/dist/core/workflow/workspaces/types.d.ts.map +1 -1
- package/dist/lib/browser/asserts.d.ts +28 -0
- package/dist/lib/browser/asserts.d.ts.map +1 -0
- package/dist/lib/browser/asserts.js +152 -0
- package/dist/lib/browser/client.d.ts +49 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +155 -14
- package/dist/lib/browser/content-checks.d.ts +108 -0
- package/dist/lib/browser/content-checks.d.ts.map +1 -0
- package/dist/lib/browser/content-checks.js +474 -0
- package/dist/lib/browser/critique.d.ts +91 -0
- package/dist/lib/browser/critique.d.ts.map +1 -0
- package/dist/lib/browser/critique.js +167 -0
- package/dist/lib/browser/geometry.d.ts +32 -0
- package/dist/lib/browser/geometry.d.ts.map +1 -1
- package/dist/lib/browser/geometry.js +244 -1
- package/dist/lib/browser/index.d.ts +4 -1
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +2 -0
- package/dist/lib/claude-desktop.d.ts.map +1 -1
- package/dist/lib/claude-desktop.js +4 -1
- package/dist/lib/council/index.d.ts +6 -6
- package/dist/lib/council/index.d.ts.map +1 -1
- package/dist/lib/council/index.js +8 -8
- package/dist/lib/identities/assume.d.ts +2 -2
- package/dist/lib/identities/assume.js +7 -7
- package/dist/lib/instructions/apply.d.ts +3 -3
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +75 -27
- package/dist/lib/instructions/host-addendum.d.ts +54 -0
- package/dist/lib/instructions/host-addendum.d.ts.map +1 -0
- package/dist/lib/instructions/host-addendum.js +107 -0
- package/dist/lib/instructions/templates.d.ts +10 -3
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +41 -12
- package/dist/lib/machine.d.ts +2 -2
- package/dist/lib/machine.js +2 -2
- package/package.json +26 -21
- package/schemas/config.schema.json +26 -1
- package/src/commander.ts +22 -13
- package/src/commands/{harness.ts → adapter.ts} +46 -46
- package/src/commands/agents.ts +71 -64
- package/src/commands/artifacts.ts +168 -0
- package/src/commands/backup.ts +47 -33
- package/src/commands/browse.ts +438 -2
- package/src/commands/checkpoint.ts +196 -0
- package/src/commands/context.ts +3 -176
- package/src/commands/decision.ts +41 -7
- package/src/commands/deinit.ts +16 -16
- package/src/commands/doctor.ts +28 -28
- package/src/commands/{supervisor.ts → governor.ts} +184 -154
- package/src/commands/init.ts +50 -34
- package/src/commands/{scratch.ts → journal.ts} +60 -60
- package/src/commands/policy.ts +1 -1
- package/src/commands/presence.ts +2 -2
- package/src/commands/sync.ts +3 -3
- package/src/commands/tunnel.ts +237 -34
- package/src/commands/web-fetch.ts +1 -1
- package/src/commands/web.ts +56 -1
- package/src/commands/work.ts +50 -35
- package/src/commands/workflow.ts +43 -34
- package/src/core/{harnesses → adapters}/attest-projection.ts +2 -2
- package/src/core/{harnesses → adapters}/attest.ts +27 -27
- package/src/core/{harnesses → adapters}/attestation.ts +41 -41
- package/src/core/{harnesses → adapters}/bench.ts +34 -43
- package/src/core/adapters/index.ts +56 -0
- package/src/core/{harnesses → adapters}/profiles.ts +16 -16
- package/src/core/{harnesses → adapters}/registry.ts +23 -23
- package/src/core/{harnesses → adapters}/types.ts +23 -23
- package/src/core/agents/canonical-emit.ts +6 -6
- package/src/core/agents/cli-emit.ts +1 -1
- package/src/core/agents/cli.ts +30 -28
- package/src/core/agents/codex-replay.ts +6 -6
- package/src/core/agents/coord-client.ts +119 -28
- package/src/core/agents/events/consume.ts +1 -1
- package/src/core/agents/events/emit.ts +7 -6
- package/src/core/agents/render/prompt-context.ts +107 -31
- package/src/core/agents/render/session-context.ts +6 -6
- package/src/core/agents/rules/claim-conflict.ts +4 -7
- package/src/core/agents/rules/commit-conflict.ts +103 -22
- package/src/core/agents/rules/stop-hook.ts +33 -17
- package/src/core/agents/rules/verdict.ts +13 -0
- package/src/core/agents/session-events.ts +4 -4
- package/src/core/agents/state/council.ts +1 -1
- package/src/core/agents/state/heartbeat-projector.ts +16 -12
- package/src/core/agents/state/heartbeat-writer.ts +12 -12
- package/src/core/agents/state/{scratch.ts → journal.ts} +12 -12
- package/src/core/agents/state/pidmap.ts +130 -15
- package/src/core/agents/state/proc-start.ts +208 -0
- package/src/core/agents/state/shell-mutation.ts +1 -1
- package/src/core/agents/state/stale-sweep.ts +7 -7
- package/src/core/artifacts/index.ts +557 -0
- package/src/core/config.ts +30 -2
- package/src/core/context/index.ts +15 -15
- package/src/core/governor/adapter-spread.ts +82 -0
- package/src/core/governor/index.ts +91 -0
- package/src/core/governor/plan-api.ts +115 -0
- package/src/core/{supervisor → governor}/plan-read.ts +112 -97
- package/src/core/{supervisor → governor}/plan-types.ts +59 -56
- package/src/core/{supervisor → governor}/planning.ts +223 -192
- package/src/core/governor/read.ts +59 -0
- package/src/core/{supervisor → governor}/runner.ts +39 -39
- package/src/core/{supervisor → governor}/service-read.ts +22 -22
- package/src/core/{supervisor → governor}/service.ts +117 -119
- package/src/core/{supervisor → governor}/state.ts +325 -167
- package/src/core/hooks/adapter/detect.ts +30 -0
- package/src/core/hooks/{harness → adapter}/events.ts +16 -14
- package/src/core/hooks/{harness → adapter}/output.ts +31 -23
- package/src/core/hooks/{harness → adapter}/parse.ts +5 -5
- package/src/core/hooks/{harness → adapter}/wiring.ts +21 -21
- package/src/core/hooks/cli.ts +185 -162
- package/src/core/hooks/effects/image-capture.ts +6 -6
- package/src/core/hooks/effects/index.ts +17 -17
- package/src/core/hooks/events/emit.ts +3 -3
- package/src/core/hooks/events/rotate.ts +1 -1
- package/src/core/hooks/events/schema.ts +15 -7
- package/src/core/hooks/guard-path.ts +2 -2
- package/src/core/hooks/index.ts +1 -1
- package/src/core/hooks/resolve/anchor.ts +63 -8
- package/src/core/hooks/resolve/coord-root.ts +4 -4
- package/src/core/hooks/resolve/intent.ts +1 -1
- package/src/core/hooks/resolve/owner.ts +11 -5
- package/src/core/{scratch → journal}/index.ts +53 -53
- package/src/core/policy/evaluate.ts +8 -8
- package/src/core/policy/types.ts +3 -3
- package/src/core/work/state.ts +65 -23
- package/src/core/workflow/adapters.ts +33 -0
- package/src/core/workflow/approvals.ts +7 -7
- package/src/core/workflow/billing.ts +12 -12
- package/src/core/workflow/child-env.ts +13 -4
- package/src/core/workflow/engine.ts +155 -90
- package/src/core/workflow/evidence-preflight.ts +165 -0
- package/src/core/workflow/index.ts +3 -3
- package/src/core/workflow/proof.ts +60 -50
- package/src/core/workflow/run-state.ts +7 -7
- package/src/core/workflow/sandbox-projection.ts +16 -16
- package/src/core/workflow/spawn-claude.ts +13 -10
- package/src/core/workflow/spawn-codex.ts +13 -10
- package/src/core/workflow/spawn-cursor.ts +13 -10
- package/src/core/workflow/spawn-failure.ts +1 -1
- package/src/core/workflow/specialists.ts +2 -2
- package/src/core/workflow/{journal.ts → transcript.ts} +16 -16
- package/src/core/workflow/types.ts +108 -51
- package/src/core/workflow/validate.ts +1 -1
- package/src/core/workflow/workspaces/cancellation.ts +2 -2
- package/src/core/workflow/workspaces/cleanup.ts +2 -2
- package/src/core/workflow/workspaces/execution.ts +6 -6
- package/src/core/workflow/workspaces/inspect.ts +14 -11
- package/src/core/workflow/workspaces/integration.ts +18 -14
- package/src/core/workflow/workspaces/lifecycle.ts +10 -10
- package/src/core/workflow/workspaces/local-git.ts +47 -5
- package/src/core/workflow/workspaces/recovery.ts +3 -3
- package/src/core/workflow/workspaces/state.ts +4 -3
- package/src/core/workflow/workspaces/types.ts +1 -1
- package/src/lib/browser/asserts.ts +177 -0
- package/src/lib/browser/client.ts +189 -14
- package/src/lib/browser/content-checks.ts +571 -0
- package/src/lib/browser/critique.ts +231 -0
- package/src/lib/browser/geometry.ts +297 -1
- package/src/lib/browser/index.ts +34 -0
- package/src/lib/claude-desktop.ts +4 -1
- package/src/lib/council/index.ts +9 -9
- package/src/lib/identities/assume.ts +7 -7
- package/src/lib/instructions/apply.ts +87 -25
- package/src/lib/instructions/host-addendum.ts +126 -0
- package/src/lib/instructions/templates.ts +44 -15
- package/src/lib/machine.ts +2 -2
- package/dist/commands/harness.d.ts +0 -12
- package/dist/commands/harness.d.ts.map +0 -1
- package/dist/commands/scratch.d.ts +0 -4
- package/dist/commands/scratch.d.ts.map +0 -1
- package/dist/commands/session.d.ts.map +0 -1
- package/dist/commands/session.js +0 -162
- package/dist/commands/supervisor.d.ts +0 -4
- package/dist/commands/supervisor.d.ts.map +0 -1
- package/dist/core/harnesses/attest-projection.d.ts.map +0 -1
- package/dist/core/harnesses/attest.d.ts.map +0 -1
- package/dist/core/harnesses/attestation.d.ts.map +0 -1
- package/dist/core/harnesses/bench.d.ts.map +0 -1
- package/dist/core/harnesses/index.d.ts +0 -13
- package/dist/core/harnesses/index.d.ts.map +0 -1
- package/dist/core/harnesses/index.js +0 -6
- package/dist/core/harnesses/profiles.d.ts.map +0 -1
- package/dist/core/harnesses/registry.d.ts +0 -15
- package/dist/core/harnesses/registry.d.ts.map +0 -1
- package/dist/core/harnesses/types.d.ts.map +0 -1
- package/dist/core/hooks/harness/detect.d.ts +0 -9
- package/dist/core/hooks/harness/events.d.ts.map +0 -1
- package/dist/core/hooks/harness/output.d.ts.map +0 -1
- package/dist/core/supervisor/index.d.ts +0 -7
- package/dist/core/supervisor/index.d.ts.map +0 -1
- package/dist/core/supervisor/index.js +0 -6
- package/dist/core/supervisor/plan-api.d.ts +0 -23
- package/dist/core/supervisor/plan-api.d.ts.map +0 -1
- package/dist/core/supervisor/plan-api.js +0 -50
- package/dist/core/supervisor/plan-read.d.ts +0 -5
- package/dist/core/supervisor/plan-read.d.ts.map +0 -1
- package/dist/core/supervisor/plan-types.d.ts.map +0 -1
- package/dist/core/supervisor/planning.d.ts +0 -33
- package/dist/core/supervisor/planning.d.ts.map +0 -1
- package/dist/core/supervisor/read.d.ts +0 -6
- package/dist/core/supervisor/read.d.ts.map +0 -1
- package/dist/core/supervisor/read.js +0 -4
- package/dist/core/supervisor/runner.d.ts +0 -37
- package/dist/core/supervisor/runner.d.ts.map +0 -1
- package/dist/core/supervisor/service-read.d.ts +0 -6
- package/dist/core/supervisor/service-read.d.ts.map +0 -1
- package/dist/core/supervisor/service.d.ts +0 -114
- package/dist/core/supervisor/service.d.ts.map +0 -1
- package/dist/core/supervisor/state.d.ts +0 -95
- package/dist/core/supervisor/state.d.ts.map +0 -1
- package/dist/core/workflow/harnesses.d.ts +0 -17
- package/dist/core/workflow/harnesses.d.ts.map +0 -1
- package/dist/core/workflow/harnesses.js +0 -21
- package/dist/core/workflow/journal.d.ts.map +0 -1
- package/src/commands/session.ts +0 -187
- package/src/core/harnesses/index.ts +0 -56
- package/src/core/hooks/harness/detect.ts +0 -30
- package/src/core/supervisor/index.ts +0 -89
- package/src/core/supervisor/plan-api.ts +0 -73
- package/src/core/supervisor/read.ts +0 -59
- package/src/core/workflow/harnesses.ts +0 -33
- /package/dist/core/{harnesses → adapters}/attest-projection.js +0 -0
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* UserPromptSubmit UX renderer. Combines the peer-refresh dedup, the
|
|
3
|
-
* council-pending hash-dedup,
|
|
3
|
+
* council-pending hash-dedup, the cross-adapter first-session naming nudge,
|
|
4
|
+
* the Cursor/Codex set-task staleness nudge, and the Codex status-footer
|
|
5
|
+
* reminder.
|
|
4
6
|
* agent-hook's user_prompt.submit post-emit handler calls this
|
|
5
|
-
* and forwards the result as the
|
|
7
|
+
* and forwards the result as the adapter-shaped additionalContext payload.
|
|
6
8
|
*
|
|
7
|
-
*
|
|
9
|
+
* Four subsections combined into one additionalContext payload:
|
|
8
10
|
* 1. Peer table: semantically-relevant peer fields hashed; only re-emits
|
|
9
11
|
* when peers change (name + instance_id + session_id + kind + started_at
|
|
10
12
|
* + sorted(files_touched) + platform, sorted by instance_id).
|
|
11
13
|
* 2. Council pending: pending open-council IDs hashed; re-emits when the
|
|
12
14
|
* ID set changes.
|
|
13
|
-
* 3.
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
15
|
+
* 3. Focus nudge. Before the first set-task in a human-facing session, tells
|
|
16
|
+
* every adapter to reproduce set-task's suggested session name in a fenced
|
|
17
|
+
* code block. Cursor/Codex additionally get the existing unset/stale-task
|
|
18
|
+
* reminder because their Stop hooks do not enforce task declarations as
|
|
19
|
+
* reliably as Claude Code's.
|
|
20
|
+
* 4. Codex status footer: a non-deduplicated reminder to put the live status
|
|
21
|
+
* box after the substantive answer. Stop stays observe-only, so missing the
|
|
22
|
+
* footer can never trigger a replacement response.
|
|
17
23
|
*
|
|
18
24
|
* Hash files live at:
|
|
19
25
|
* .harnery/.last-peer-hash.<instance_id>
|
|
@@ -26,6 +32,7 @@ import { createHash } from "node:crypto";
|
|
|
26
32
|
import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
|
|
27
33
|
import { join } from "node:path";
|
|
28
34
|
import { coordEnv } from "../../../lib/env.js";
|
|
35
|
+
import { resolveBinName } from "../../config.js";
|
|
29
36
|
import { readRemoteMachines } from "../../presence/index.js";
|
|
30
37
|
import { formatPendingCouncils } from "./session-context.js";
|
|
31
38
|
/**
|
|
@@ -37,7 +44,7 @@ import { formatPendingCouncils } from "./session-context.js";
|
|
|
37
44
|
* councils are pending, matching the bash behavior).
|
|
38
45
|
*/
|
|
39
46
|
export function renderPromptContext(opts) {
|
|
40
|
-
const { coordRoot, instanceId, sessionId, agentName, taskNudge } = opts;
|
|
47
|
+
const { coordRoot, instanceId, sessionId, agentName, sessionNameNudge, taskNudge, statusFooterNudge, } = opts;
|
|
41
48
|
const sections = [];
|
|
42
49
|
// 1. Peer table with hash dedup.
|
|
43
50
|
const peerTable = computePeerTableIfChanged(coordRoot, instanceId, sessionId);
|
|
@@ -49,19 +56,42 @@ export function renderPromptContext(opts) {
|
|
|
49
56
|
if (councilMsg)
|
|
50
57
|
sections.push(councilMsg);
|
|
51
58
|
}
|
|
52
|
-
// 3.
|
|
53
|
-
|
|
54
|
-
|
|
59
|
+
// 3. First-session naming for every adapter, plus unset/stale-task reminders
|
|
60
|
+
// for Cursor/Codex. One state machine avoids a second generic "task unset"
|
|
61
|
+
// reminder immediately after the first-session reminder has been deduped.
|
|
62
|
+
if (sessionNameNudge || taskNudge) {
|
|
63
|
+
const nudgeMsg = computeFocusNudgeIfChanged(coordRoot, instanceId, {
|
|
64
|
+
sessionNameNudge: sessionNameNudge ?? false,
|
|
65
|
+
taskNudge: taskNudge ?? false,
|
|
66
|
+
});
|
|
55
67
|
if (nudgeMsg)
|
|
56
68
|
sections.push(nudgeMsg);
|
|
57
69
|
}
|
|
70
|
+
// 4. Codex gets this on every prompt. It is intentionally not hash-deduped:
|
|
71
|
+
// the reminder must be fresh in the model's context when it writes the reply.
|
|
72
|
+
// Missing it is harmless because Codex Stop enforcement remains observe-only.
|
|
73
|
+
if (statusFooterNudge) {
|
|
74
|
+
const statusMsg = renderStatusFooterReminder(coordRoot, instanceId);
|
|
75
|
+
if (statusMsg)
|
|
76
|
+
sections.push(statusMsg);
|
|
77
|
+
}
|
|
58
78
|
return sections.join("\n\n");
|
|
59
79
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
80
|
+
function renderStatusFooterReminder(coordRoot, selfInstanceId) {
|
|
81
|
+
const hb = readHeartbeat(join(coordRoot, ".harnery", "active", `${selfInstanceId}.json`));
|
|
82
|
+
if (!hb || hb.kind === "subagent" || hb.kind === "transient" || hb.workflow_run_id)
|
|
83
|
+
return "";
|
|
84
|
+
const bin = resolveBinName(coordRoot);
|
|
85
|
+
return ("Codex status footer: complete the user's request first. " +
|
|
86
|
+
`Then run \`${bin} agents status\` as your final shell call and append its stdout verbatim in a fenced code block at the bottom of the same substantive reply. ` +
|
|
87
|
+
"Keep the answer intact. If the footer is missed, do not retry or replace the reply; the Stop hook is observe-only.");
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* First-session naming for every adapter, followed by Cursor/Codex task
|
|
91
|
+
* staleness checks. The absence of `task_updated_at` is the same invariant
|
|
92
|
+
* `agents set-task` uses for `first_of_session`; clears still stamp the field.
|
|
93
|
+
*/
|
|
94
|
+
function computeFocusNudgeIfChanged(coordRoot, selfInstanceId, opts) {
|
|
65
95
|
const hbPath = join(coordRoot, ".harnery", "active", `${selfInstanceId}.json`);
|
|
66
96
|
if (!existsSync(hbPath))
|
|
67
97
|
return "";
|
|
@@ -72,39 +102,52 @@ function computeTaskNudgeIfChanged(coordRoot, selfInstanceId) {
|
|
|
72
102
|
catch {
|
|
73
103
|
return "";
|
|
74
104
|
}
|
|
105
|
+
const hashFile = join(coordRoot, ".harnery", `.last-task-nudge-hash.${selfInstanceId}`);
|
|
106
|
+
// Subagents and workflow children have no human-owned session/tab to rename.
|
|
107
|
+
if (hb.kind === "subagent" || hb.kind === "transient" || hb.workflow_run_id) {
|
|
108
|
+
clearHashFile(hashFile);
|
|
109
|
+
return "";
|
|
110
|
+
}
|
|
111
|
+
const bin = resolveBinName(coordRoot);
|
|
75
112
|
const threshold = Number.parseInt(coordEnv("TASK_STALE_SECONDS") ?? "1800", 10);
|
|
76
113
|
const taskValue = hb.task ?? "";
|
|
77
114
|
let needsNudge = false;
|
|
78
115
|
let message = "";
|
|
79
|
-
|
|
116
|
+
let nudgeKind = "";
|
|
117
|
+
if (opts.sessionNameNudge && !hb.task_updated_at) {
|
|
118
|
+
needsNudge = true;
|
|
119
|
+
nudgeKind = "session-name";
|
|
120
|
+
message =
|
|
121
|
+
`New session: run \`${bin} agents set-task "<2-5 word session topic>"\` as your first tool call. ` +
|
|
122
|
+
"When it returns `first_of_session: true`, reproduce its `suggested_session_name` value by itself inside a fenced code block at the very top of your reply so the operator can one-click-copy it as the session/tab title. " +
|
|
123
|
+
"Then continue with the task; that first `set-task` also satisfies this turn's focus declaration.";
|
|
124
|
+
}
|
|
125
|
+
else if (opts.taskNudge && !taskValue) {
|
|
80
126
|
needsNudge = true;
|
|
127
|
+
nudgeKind = "task-unset";
|
|
81
128
|
message =
|
|
82
|
-
|
|
129
|
+
`Heads up: your \`task\` field is unset. Run \`${bin} agents set-task "<short focus>"\` so peers + the coord dashboard can see what you're working on. ` +
|
|
130
|
+
"(This adapter cannot enforce the declaration from its Stop hook as reliably as Claude Code, so this is a one-time soft reminder per staleness state.)";
|
|
83
131
|
}
|
|
84
|
-
else if (hb.task_updated_at) {
|
|
132
|
+
else if (opts.taskNudge && hb.task_updated_at) {
|
|
85
133
|
const updatedSec = Math.floor(Date.parse(hb.task_updated_at) / 1000);
|
|
86
134
|
const nowSec = Math.floor(Date.now() / 1000);
|
|
87
135
|
if (Number.isFinite(updatedSec) && updatedSec > 0) {
|
|
88
136
|
const ageSec = nowSec - updatedSec;
|
|
89
137
|
if (ageSec > threshold) {
|
|
90
138
|
needsNudge = true;
|
|
91
|
-
|
|
139
|
+
nudgeKind = "task-stale";
|
|
140
|
+
message = `Heads up: your \`task\` field hasn't changed in ${ageSec}s (threshold ${threshold}s). If you've moved on from "${taskValue.slice(0, 60)}", update via \`${bin} agents set-task "<new focus>"\`. Pass an empty string to clear.`;
|
|
92
141
|
}
|
|
93
142
|
}
|
|
94
143
|
}
|
|
95
|
-
const hashFile = join(coordRoot, ".harnery", `.last-task-nudge-hash.${selfInstanceId}`);
|
|
96
144
|
if (!needsNudge) {
|
|
97
|
-
|
|
98
|
-
if (existsSync(hashFile))
|
|
99
|
-
rmSync(hashFile, { force: true });
|
|
100
|
-
}
|
|
101
|
-
catch {
|
|
102
|
-
/* swallow */
|
|
103
|
-
}
|
|
145
|
+
clearHashFile(hashFile);
|
|
104
146
|
return "";
|
|
105
147
|
}
|
|
106
|
-
// Dedup on
|
|
107
|
-
|
|
148
|
+
// Dedup on kind + task state so the first-session reminder does not turn into
|
|
149
|
+
// a generic "task unset" reminder on the next prompt before set-task runs.
|
|
150
|
+
const state = `${nudgeKind}|task=${taskValue}|updated=${hb.task_updated_at ?? ""}|threshold=${threshold}`;
|
|
108
151
|
const newHash = sha256Hex16(state);
|
|
109
152
|
const oldHash = safeRead(hashFile);
|
|
110
153
|
if (oldHash && oldHash === newHash)
|
|
@@ -269,6 +312,15 @@ function safeRead(path) {
|
|
|
269
312
|
return "";
|
|
270
313
|
}
|
|
271
314
|
}
|
|
315
|
+
function clearHashFile(path) {
|
|
316
|
+
try {
|
|
317
|
+
if (existsSync(path))
|
|
318
|
+
rmSync(path, { force: true });
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
/* swallow */
|
|
322
|
+
}
|
|
323
|
+
}
|
|
272
324
|
function sha256Hex16(input) {
|
|
273
325
|
return createHash("sha256").update(input).digest("hex").slice(0, 16);
|
|
274
326
|
}
|
|
@@ -12,7 +12,7 @@ export interface RenderOpts {
|
|
|
12
12
|
instanceId: string;
|
|
13
13
|
sessionId: string;
|
|
14
14
|
agentName?: string;
|
|
15
|
-
/**
|
|
15
|
+
/** Adapter label rendered in parens after the self-name (e.g. "Cursor", "Codex").
|
|
16
16
|
* Claude Code omits it. */
|
|
17
17
|
platformLabel?: string;
|
|
18
18
|
}
|
|
@@ -10,7 +10,7 @@ import { spawnSync } from "node:child_process";
|
|
|
10
10
|
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
11
11
|
import { join } from "node:path";
|
|
12
12
|
import { resolveBinName, resolveHooksSetupHint } from "../../config.js";
|
|
13
|
-
import { harneryVersion,
|
|
13
|
+
import { harneryVersion, loadAdapterWiring } from "../../hooks/adapter/wiring.js";
|
|
14
14
|
import { readRemoteMachines } from "../../presence/index.js";
|
|
15
15
|
/**
|
|
16
16
|
* Build the combined SessionStart systemMessage. Returns the additionalContext
|
|
@@ -52,11 +52,11 @@ export function renderSessionContext(opts) {
|
|
|
52
52
|
const wiringSummary = `Coordination hooks are NOT wired: the E-guard will not block conflicting commits, and post-commit claim pruning will not run. ${fix} Detected:\n${wiringIssues.map((i) => ` - ${i}`).join("\n")}`;
|
|
53
53
|
messages.push(wiringSummary);
|
|
54
54
|
}
|
|
55
|
-
// 5.
|
|
56
|
-
// project's settings file hasn't been re-wired. Only fires for a
|
|
55
|
+
// 5. Adapter-hook drift: a harnery upgrade changed the hook set, but this
|
|
56
|
+
// project's settings file hasn't been re-wired. Only fires for a adapter the
|
|
57
57
|
// project already opted into (≥1 hook wired), so it never nags a project that
|
|
58
58
|
// simply has a settings file. Remedy is always `<bin> init` (idempotent).
|
|
59
|
-
const drift =
|
|
59
|
+
const drift = loadAdapterWiring(coordRoot);
|
|
60
60
|
if (drift.length > 0) {
|
|
61
61
|
const bin = resolveBinName(coordRoot);
|
|
62
62
|
const ver = harneryVersion();
|
|
@@ -69,7 +69,7 @@ export function renderSessionContext(opts) {
|
|
|
69
69
|
bits.push(`orphaned: ${d.orphans.join(", ")}`);
|
|
70
70
|
return ` - ${d.settingsFile} — ${bits.join("; ")}`;
|
|
71
71
|
});
|
|
72
|
-
messages.push(`Harnery hook wiring is out of date${verPart}: an upgrade changed the hook set but the
|
|
72
|
+
messages.push(`Harnery hook wiring is out of date${verPart}: an upgrade changed the hook set but the adapter ` +
|
|
73
73
|
`settings file hasn't been re-wired, so the new hook(s) won't fire. Run \`${bin} init\` to wire them ` +
|
|
74
74
|
`(idempotent, additive).\n${lines.join("\n")}`);
|
|
75
75
|
}
|
|
@@ -13,12 +13,8 @@
|
|
|
13
13
|
* Reads from `.harnery/active/<id>.json`, the single canonical heartbeat
|
|
14
14
|
* location after Phase 8 collapsed the v1/v2 dual-write.
|
|
15
15
|
*/
|
|
16
|
-
export type VerdictResult
|
|
17
|
-
|
|
18
|
-
exit_code: 0 | 2;
|
|
19
|
-
rule: string;
|
|
20
|
-
reason?: string;
|
|
21
|
-
};
|
|
16
|
+
export type { VerdictResult } from "./verdict.js";
|
|
17
|
+
import type { VerdictResult } from "./verdict.js";
|
|
22
18
|
export interface ClaimRequest {
|
|
23
19
|
rule: "claim";
|
|
24
20
|
instance_id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claim-conflict.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/claim-conflict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,
|
|
1
|
+
{"version":3,"file":"claim-conflict.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/claim-conflict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAelD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,aAAa,CAoGjF"}
|
|
@@ -290,7 +290,7 @@ function pruneClaimFromPeer(coordRoot, instanceId, relPath) {
|
|
|
290
290
|
event_type: "claim.release",
|
|
291
291
|
instance_id: instanceId,
|
|
292
292
|
session_id: body.session_id ?? instanceId,
|
|
293
|
-
|
|
293
|
+
adapter: platform === "cursor" ? "cursor" : platform === "codex" ? "codex" : "claude-code",
|
|
294
294
|
source: "agent-coord",
|
|
295
295
|
data: { path: target, reason: "heal" },
|
|
296
296
|
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
* in that set are matched with the staged-is-gitlink rule.
|
|
21
21
|
*/
|
|
22
22
|
import { spawnSync } from "node:child_process";
|
|
23
|
-
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
24
|
-
import { join } from "node:path";
|
|
23
|
+
import { appendFileSync, existsSync, readdirSync, readFileSync } from "node:fs";
|
|
24
|
+
import { basename, dirname, join } from "node:path";
|
|
25
25
|
import { coordFreshnessSeconds } from "../../config.js";
|
|
26
26
|
import { instanceHasLivePid } from "../state/pidmap.js";
|
|
27
27
|
export function evaluateCommit(coordRoot, req) {
|
|
@@ -134,12 +134,37 @@ function findOverlap(staged, files, coordRoot, stagedIsGitlink) {
|
|
|
134
134
|
}
|
|
135
135
|
return null;
|
|
136
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Repository-discovery environment that git exports to its own hooks.
|
|
139
|
+
*
|
|
140
|
+
* A hook runs with GIT_DIR (and friends) already pointing at the repository
|
|
141
|
+
* being committed, and every child inherits them. That silently outranks `cwd`,
|
|
142
|
+
* so a probe launched from some other directory still interrogates the hook's
|
|
143
|
+
* repository. Committing inside a submodule therefore asked the submodule about
|
|
144
|
+
* superproject paths and vice versa, and the answers were wrong in whichever
|
|
145
|
+
* direction did not match. Scrubbing these lets git rediscover the repository
|
|
146
|
+
* from `cwd`, which is the whole point of choosing a `cwd` per path.
|
|
147
|
+
*/
|
|
148
|
+
const GIT_DISCOVERY_VARS = [
|
|
149
|
+
"GIT_DIR",
|
|
150
|
+
"GIT_WORK_TREE",
|
|
151
|
+
"GIT_COMMON_DIR",
|
|
152
|
+
"GIT_INDEX_FILE",
|
|
153
|
+
"GIT_OBJECT_DIRECTORY",
|
|
154
|
+
"GIT_ALTERNATE_OBJECT_DIRECTORIES",
|
|
155
|
+
"GIT_PREFIX",
|
|
156
|
+
"GIT_NAMESPACE",
|
|
157
|
+
];
|
|
158
|
+
/** Run a read-only git probe in `cwd`, free of the caller's repo environment. */
|
|
159
|
+
function gitProbe(args, cwd) {
|
|
160
|
+
const env = { ...process.env };
|
|
161
|
+
for (const v of GIT_DISCOVERY_VARS)
|
|
162
|
+
delete env[v];
|
|
163
|
+
const result = spawnSync("git", args, { cwd, env, encoding: "utf8", timeout: 2000 });
|
|
164
|
+
return { status: result.status ?? 1, stdout: result.stdout ?? "" };
|
|
165
|
+
}
|
|
137
166
|
function isGitlinkInIndex(coordRoot, path) {
|
|
138
|
-
const result =
|
|
139
|
-
cwd: coordRoot,
|
|
140
|
-
encoding: "utf8",
|
|
141
|
-
timeout: 2000,
|
|
142
|
-
});
|
|
167
|
+
const result = gitProbe(["ls-files", "--stage", "--", path], coordRoot);
|
|
143
168
|
if (result.status !== 0)
|
|
144
169
|
return false;
|
|
145
170
|
// ls-files --stage emits "<mode> <sha> <stage>\t<path>"; mode 160000 = gitlink.
|
|
@@ -147,43 +172,94 @@ function isGitlinkInIndex(coordRoot, path) {
|
|
|
147
172
|
}
|
|
148
173
|
function isHolderSelfAttributed(coordRoot, holderId, stagedSet, peers) {
|
|
149
174
|
// Gate B (cheaper): live foreign pid-map entry blocks self-attribution.
|
|
150
|
-
if (holderHasLiveForeignPid(coordRoot, holderId))
|
|
175
|
+
if (holderHasLiveForeignPid(coordRoot, holderId)) {
|
|
176
|
+
debugGate(coordRoot, { holder: holderId, gate: "B", reason: "live_pid_anchor" });
|
|
151
177
|
return false;
|
|
178
|
+
}
|
|
152
179
|
// Gate A: every held path is either in the staged set or already clean in HEAD.
|
|
153
180
|
const holder = peers.find((p) => p.instance_id === holderId);
|
|
154
|
-
if (!holder)
|
|
181
|
+
if (!holder) {
|
|
182
|
+
debugGate(coordRoot, { holder: holderId, gate: "A", reason: "holder_not_found" });
|
|
155
183
|
return false;
|
|
184
|
+
}
|
|
156
185
|
const files = holder.files_touched ?? [];
|
|
157
|
-
if (files.length === 0)
|
|
186
|
+
if (files.length === 0) {
|
|
187
|
+
debugGate(coordRoot, { holder: holderId, gate: "A", reason: "holder_holds_nothing" });
|
|
158
188
|
return false;
|
|
189
|
+
}
|
|
159
190
|
for (const held of files) {
|
|
160
191
|
if (stagedSet.has(held))
|
|
161
192
|
continue;
|
|
162
193
|
if (isPathCleanInHead(coordRoot, held))
|
|
163
194
|
continue;
|
|
195
|
+
if (isPathIgnoredByGit(coordRoot, held))
|
|
196
|
+
continue;
|
|
197
|
+
debugGate(coordRoot, { holder: holderId, gate: "A", reason: "path_unverifiable", path: held });
|
|
164
198
|
return false;
|
|
165
199
|
}
|
|
166
200
|
return true;
|
|
167
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* Append one line explaining a refused gate, when HARNERY_COORD_DEBUG is set.
|
|
204
|
+
*
|
|
205
|
+
* Worth carrying permanently: the deciding state lives inside a git hook, whose
|
|
206
|
+
* stderr the caller discards and whose process is gone before anyone can look.
|
|
207
|
+
* Reconstructing a refusal afterwards means guessing, because the holder's claim
|
|
208
|
+
* set has moved on by then. This turns that into evidence.
|
|
209
|
+
*/
|
|
210
|
+
function debugGate(coordRoot, detail) {
|
|
211
|
+
if (!process.env.HARNERY_COORD_DEBUG)
|
|
212
|
+
return;
|
|
213
|
+
try {
|
|
214
|
+
appendFileSync(join(coordRoot, ".harnery", "coord-debug.ndjson"), `${JSON.stringify({ event: "self_attribution_refused", pid: process.pid, ...detail })}\n`, "utf8");
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
/* diagnostics never break a verdict */
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Does git ignore this path?
|
|
222
|
+
*
|
|
223
|
+
* Such a claim is safe to look past. Agents write journal files into ignored
|
|
224
|
+
* directories constantly, and each one used to leave a claim that Gate A could
|
|
225
|
+
* never vouch for: not staged, not tracked, therefore "unknown", therefore
|
|
226
|
+
* blocked. That defeated self-attribution for the rest of a session and taught
|
|
227
|
+
* agents to reach for the bypass. An ignored path cannot enter anyone's commit,
|
|
228
|
+
* so it cannot be work this commit might clobber. A merely untracked path is a
|
|
229
|
+
* different matter and still counts against the holder, since anybody could add
|
|
230
|
+
* it.
|
|
231
|
+
*/
|
|
232
|
+
function isPathIgnoredByGit(coordRoot, relPath) {
|
|
233
|
+
const abs = join(coordRoot, relPath);
|
|
234
|
+
const cwd = dirname(abs);
|
|
235
|
+
if (!existsSync(cwd))
|
|
236
|
+
return false;
|
|
237
|
+
// check-ignore exits 0 when the path is ignored, 1 when it is not.
|
|
238
|
+
return gitProbe(["check-ignore", "--quiet", "--", basename(abs)], cwd).status === 0;
|
|
239
|
+
}
|
|
168
240
|
function holderHasLiveForeignPid(coordRoot, holderId) {
|
|
169
241
|
return instanceHasLivePid(coordRoot, holderId);
|
|
170
242
|
}
|
|
171
243
|
function isPathCleanInHead(coordRoot, relPath) {
|
|
172
244
|
// Path is tracked + diff-clean against HEAD = "already committed, holder
|
|
173
245
|
// hasn't released the claim yet". Counts as self-attributable.
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
246
|
+
//
|
|
247
|
+
// Ask the repository that actually tracks the path, by running git from the
|
|
248
|
+
// file's own directory instead of the coord root. Claims are recorded
|
|
249
|
+
// monorepo-relative, so a submodule file arrives here as `sub/src/x.ts`, and
|
|
250
|
+
// the superproject does not track submodule contents: asking it always
|
|
251
|
+
// answered "not tracked". Gate A therefore failed for every submodule path,
|
|
252
|
+
// self-attribution never suppressed a submodule commit, and the operator paid
|
|
253
|
+
// a HARNERY_AGENT_COORD_BYPASS=1 per commit. Running from the file's directory
|
|
254
|
+
// lands in the submodule's own repo and handles any nesting depth.
|
|
255
|
+
const abs = join(coordRoot, relPath);
|
|
256
|
+
const cwd = dirname(abs);
|
|
257
|
+
const base = basename(abs);
|
|
258
|
+
if (!existsSync(cwd))
|
|
259
|
+
return false;
|
|
260
|
+
if (gitProbe(["ls-files", "--error-unmatch", "--", base], cwd).status !== 0)
|
|
180
261
|
return false;
|
|
181
|
-
|
|
182
|
-
cwd: coordRoot,
|
|
183
|
-
encoding: "utf8",
|
|
184
|
-
timeout: 2000,
|
|
185
|
-
});
|
|
186
|
-
return diff.status === 0;
|
|
262
|
+
return gitProbe(["diff", "--quiet", "HEAD", "--", base], cwd).status === 0;
|
|
187
263
|
}
|
|
188
264
|
function readActivePeers(coordRoot) {
|
|
189
265
|
const dir = join(coordRoot, ".harnery", "active");
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
* Stop-hook verdict: rule 1/3, 2/3, 3/3 enforcement evaluated
|
|
3
3
|
* from the canonical event stream alone (no transcript scan).
|
|
4
4
|
*
|
|
5
|
+
* Codex is observe-only: its Stop continuation can replace the user-facing
|
|
6
|
+
* answer in clients that retain only the final continuation response.
|
|
7
|
+
*
|
|
8
|
+
* Enforced adapters:
|
|
5
9
|
* Rule 1/3: `state.status_checked` event with matching turn boundary exists.
|
|
6
10
|
* Rule 2/3: latest `turn.stop` event has `status_box_present: true` (or the
|
|
7
11
|
* stop currently firing carries that field via the in-flight event
|
|
@@ -12,19 +16,15 @@
|
|
|
12
16
|
* the current turn, rules 1/3 and 3/3 do not apply. Rule 2/3 still applies
|
|
13
17
|
* as a user-visible mobile cue.
|
|
14
18
|
*/
|
|
15
|
-
export type VerdictResult
|
|
16
|
-
|
|
17
|
-
exit_code: 0 | 2;
|
|
18
|
-
rule: string;
|
|
19
|
-
reason?: string;
|
|
20
|
-
};
|
|
19
|
+
export type { VerdictResult } from "./verdict.js";
|
|
20
|
+
import type { VerdictResult } from "./verdict.js";
|
|
21
21
|
export interface StopHookRequest {
|
|
22
22
|
rule: "stop-hook";
|
|
23
23
|
instance_id: string;
|
|
24
24
|
session_id?: string;
|
|
25
|
-
/** Firing
|
|
25
|
+
/** Firing adapter. Selects the end-of-turn ack signal (see `ackSignalFor`).
|
|
26
26
|
* Undefined → Claude Code semantics (transcript-scanned status box). */
|
|
27
|
-
|
|
27
|
+
adapter?: string;
|
|
28
28
|
/** Wall-clock cutoff for the current turn; events strictly after this are not yet relevant. */
|
|
29
29
|
now_ms?: number;
|
|
30
30
|
/** Override the turn-window discovery (used by tests). */
|
|
@@ -36,7 +36,7 @@ export interface StopHookRequest {
|
|
|
36
36
|
bypass?: boolean;
|
|
37
37
|
/** Headless child spawned by `harn workflow` (HARNERY_WORKFLOW_CHILD=1).
|
|
38
38
|
* The end-of-turn ritual exists to surface status to a HUMAN reader; a
|
|
39
|
-
* workflow child reports to the engine's
|
|
39
|
+
* workflow child reports to the engine's transcript instead, so the ritual is
|
|
40
40
|
* meaningless there — worse, blocking burns the child's turn budget on
|
|
41
41
|
* re-prompts (observed as error_max_turns in the Phase 1 spike). Exempting
|
|
42
42
|
* here, rather than disabling the child's hooks wholesale, keeps heartbeat +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop-hook.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/stop-hook.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"stop-hook.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/stop-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAclD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;4EACwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,WAAW,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,yFAAyF;IACzF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;;iFAM6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA+BD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,aAAa,CAmHvF"}
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
* Stop-hook verdict: rule 1/3, 2/3, 3/3 enforcement evaluated
|
|
3
3
|
* from the canonical event stream alone (no transcript scan).
|
|
4
4
|
*
|
|
5
|
+
* Codex is observe-only: its Stop continuation can replace the user-facing
|
|
6
|
+
* answer in clients that retain only the final continuation response.
|
|
7
|
+
*
|
|
8
|
+
* Enforced adapters:
|
|
5
9
|
* Rule 1/3: `state.status_checked` event with matching turn boundary exists.
|
|
6
10
|
* Rule 2/3: latest `turn.stop` event has `status_box_present: true` (or the
|
|
7
11
|
* stop currently firing carries that field via the in-flight event
|
|
@@ -15,8 +19,8 @@
|
|
|
15
19
|
import { existsSync, readFileSync } from "node:fs";
|
|
16
20
|
import { join } from "node:path";
|
|
17
21
|
import { resolveBinName } from "../../config.js";
|
|
18
|
-
function ackSignalFor(
|
|
19
|
-
return
|
|
22
|
+
function ackSignalFor(adapter) {
|
|
23
|
+
return adapter === "cursor" ? "status_checked" : "status_box_present";
|
|
20
24
|
}
|
|
21
25
|
const RECENT_EVENT_WINDOW_LINES = 5_000;
|
|
22
26
|
/**
|
|
@@ -41,6 +45,20 @@ export function evaluateStopHook(coordRoot, req) {
|
|
|
41
45
|
reason: "HARNERY_WORKFLOW_CHILD=1: headless workflow child; ritual not applicable",
|
|
42
46
|
};
|
|
43
47
|
}
|
|
48
|
+
// A blocked Codex Stop does not reject the turn. Codex creates a continuation
|
|
49
|
+
// prompt and asks the model to answer again. Some clients retain only that
|
|
50
|
+
// final continuation response, so a coordination reminder can replace a
|
|
51
|
+
// correct user-facing answer with status output. The Stop path has already
|
|
52
|
+
// emitted turn.stop and projected the coordination state before this verdict
|
|
53
|
+
// runs. Keep that telemetry, but never continue a Codex turn for this ritual.
|
|
54
|
+
if (req.adapter === "codex") {
|
|
55
|
+
return {
|
|
56
|
+
allow: true,
|
|
57
|
+
exit_code: 0,
|
|
58
|
+
rule: "stop-hook.codex_observe_only",
|
|
59
|
+
reason: "Codex Stop continuations must not replace the user-facing answer",
|
|
60
|
+
};
|
|
61
|
+
}
|
|
44
62
|
let events;
|
|
45
63
|
try {
|
|
46
64
|
events = readRecentEvents(coordRoot, RECENT_EVENT_WINDOW_LINES);
|
|
@@ -84,15 +102,15 @@ export function evaluateStopHook(coordRoot, req) {
|
|
|
84
102
|
// fired turn.stop is already in the stream.
|
|
85
103
|
const latestTurnStop = [...inTurn].reverse().find((e) => e.event_type === "turn.stop");
|
|
86
104
|
const boxPresent = latestTurnStop ? Boolean(latestTurnStop.data.status_box_present) : false;
|
|
87
|
-
//
|
|
105
|
+
// Adapter-aware end-of-turn ack signal (see `ackSignalFor`). On Cursor the
|
|
88
106
|
// ack is `status_checked` (running `harn agents status` shows the box inline);
|
|
89
107
|
// on Claude Code / Codex it's the transcript-scanned `status_box_present`.
|
|
90
108
|
// The matching block helper carries the right "how to fix" message.
|
|
91
|
-
const ackSignal = ackSignalFor(req.
|
|
109
|
+
const ackSignal = ackSignalFor(req.adapter);
|
|
92
110
|
const ackPresent = ackSignal === "status_checked" ? statusChecked : boxPresent;
|
|
93
111
|
const ackBlock = ackSignal === "status_checked" ? rule13Block : rule23Block;
|
|
94
112
|
// Pure-prose-turn exemption: only the ack signal applies. Parity
|
|
95
|
-
// across
|
|
113
|
+
// across adapters: CC requires the box; Cursor requires status_checked.
|
|
96
114
|
if (!toolPreUseInTurn) {
|
|
97
115
|
if (!ackPresent) {
|
|
98
116
|
return ackBlock();
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shape every coordination rule returns.
|
|
3
|
+
*
|
|
4
|
+
* Declared here once. The claim-conflict and stop-hook rules each carried a
|
|
5
|
+
* byte-identical private copy, which is how two rules drift into disagreeing
|
|
6
|
+
* about what a verdict is.
|
|
7
|
+
*/
|
|
8
|
+
export type VerdictResult = {
|
|
9
|
+
allow: boolean;
|
|
10
|
+
exit_code: 0 | 2;
|
|
11
|
+
rule: string;
|
|
12
|
+
reason?: string;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=verdict.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/verdict.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -11,7 +11,7 @@ import { randomBytes } from "node:crypto";
|
|
|
11
11
|
import { existsSync, readFileSync } from "node:fs";
|
|
12
12
|
import { dirname, resolve } from "node:path";
|
|
13
13
|
// Kept dependency-light: vendored verbatim into a downstream consumer, so no coordEnv import.
|
|
14
|
-
import {
|
|
14
|
+
import { normalizeAdapter, resolveEmitRoot } from "./canonical-emit.js";
|
|
15
15
|
import { emit } from "./events/emit.js";
|
|
16
16
|
/**
|
|
17
17
|
* Resolved path of the ndjson sidecar file. Lives inside `.harnery/` so a
|
|
@@ -100,7 +100,7 @@ function enrichFromHeartbeat(coordRoot, instanceId) {
|
|
|
100
100
|
const hb = JSON.parse(readFileSync(hbPath, "utf8"));
|
|
101
101
|
const enrichment = {
|
|
102
102
|
session_id: hb.session_id || instanceId,
|
|
103
|
-
|
|
103
|
+
adapter: normalizeAdapter(hb.platform),
|
|
104
104
|
at: now,
|
|
105
105
|
};
|
|
106
106
|
enrichCache.set(instanceId, enrichment);
|
|
@@ -151,7 +151,7 @@ function emitCanonicalCommand(type, fields) {
|
|
|
151
151
|
event_type: eventType,
|
|
152
152
|
instance_id: instanceId,
|
|
153
153
|
session_id: enrich.session_id,
|
|
154
|
-
|
|
154
|
+
adapter: enrich.adapter,
|
|
155
155
|
data: canonicalData(type, fields),
|
|
156
156
|
});
|
|
157
157
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* This module owns: lifecycle (advance, close, archive, unarchive, delete)
|
|
9
9
|
* and steward reassignment. Council CREATION + contribution writes stay
|
|
10
|
-
* separate (operator-side,
|
|
10
|
+
* separate (operator-side, adapter-agnostic).
|
|
11
11
|
*/
|
|
12
12
|
export declare function advanceCouncil(coordRoot: string, councilId: string, opts?: {
|
|
13
13
|
force?: boolean;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* This module owns: lifecycle (advance, close, archive, unarchive, delete)
|
|
9
9
|
* and steward reassignment. Council CREATION + contribution writes stay
|
|
10
|
-
* separate (operator-side,
|
|
10
|
+
* separate (operator-side, adapter-agnostic).
|
|
11
11
|
*/
|
|
12
12
|
import { cpSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
|
|
13
13
|
import { dirname, join } from "node:path";
|
|
@@ -12,7 +12,7 @@ import type { CanonicalEvent } from "../events/consume.js";
|
|
|
12
12
|
export interface V2Heartbeat {
|
|
13
13
|
instance_id: string;
|
|
14
14
|
session_id: string;
|
|
15
|
-
|
|
15
|
+
adapter: string;
|
|
16
16
|
agent_id?: string;
|
|
17
17
|
name?: string;
|
|
18
18
|
kind?: "session" | "subagent" | "transient";
|
|
@@ -20,8 +20,9 @@ export interface V2Heartbeat {
|
|
|
20
20
|
platform?: string;
|
|
21
21
|
subagent_call_id?: string;
|
|
22
22
|
parent_session_id?: string;
|
|
23
|
-
/** Set iff this owner is a `workflow run` child (joins to the run
|
|
23
|
+
/** Set iff this owner is a `workflow run` child (joins to the run transcript). */
|
|
24
24
|
workflow_run_id?: string;
|
|
25
|
+
workflow_agent_id?: string;
|
|
25
26
|
started_at?: string;
|
|
26
27
|
last_heartbeat: string;
|
|
27
28
|
last_tool?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat-projector.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/heartbeat-projector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B
|
|
1
|
+
{"version":3,"file":"heartbeat-projector.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/heartbeat-projector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,yEAAyE;IACzE,aAAa,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,OAAO,EAAE;QACP,cAAc,EAAE,CAAC,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,cAAc,EAAE,GAChC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;CAAE,CAoD9D;AA4XD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3E"}
|