@lannguyensi/harness 0.64.0 → 1.0.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/CHANGELOG.md +64 -0
- package/README.md +46 -42
- package/dist/cli/add/index.js +17 -21
- package/dist/cli/add/index.js.map +1 -1
- package/dist/cli/adopt/derive.d.ts +2 -2
- package/dist/cli/adopt/derive.js +2 -19
- package/dist/cli/adopt/derive.js.map +1 -1
- package/dist/cli/adopt/index.d.ts +1 -1
- package/dist/cli/adopt/index.js +1 -12
- package/dist/cli/adopt/index.js.map +1 -1
- package/dist/cli/apply/apply.d.ts +20 -35
- package/dist/cli/apply/apply.js +61 -136
- package/dist/cli/apply/apply.js.map +1 -1
- package/dist/cli/apply/generate-codex-config.js +10 -58
- package/dist/cli/apply/generate-codex-config.js.map +1 -1
- package/dist/cli/apply/generate-memory-index.js +1 -2
- package/dist/cli/apply/generate-memory-index.js.map +1 -1
- package/dist/cli/apply/generate-opencode-config.d.ts +2 -10
- package/dist/cli/apply/generate-opencode-config.js +74 -113
- package/dist/cli/apply/generate-opencode-config.js.map +1 -1
- package/dist/cli/apply/generate-settings.d.ts +11 -64
- package/dist/cli/apply/generate-settings.js +27 -132
- package/dist/cli/apply/generate-settings.js.map +1 -1
- package/dist/cli/apply/index.d.ts +1 -1
- package/dist/cli/apply/index.js +1 -1
- package/dist/cli/apply/index.js.map +1 -1
- package/dist/cli/apply/install-codex-config.d.ts +153 -1
- package/dist/cli/apply/install-codex-config.js +445 -70
- package/dist/cli/apply/install-codex-config.js.map +1 -1
- package/dist/cli/apply/next-steps.d.ts +7 -0
- package/dist/cli/apply/next-steps.js +13 -1
- package/dist/cli/apply/next-steps.js.map +1 -1
- package/dist/cli/bounded-stdin.d.ts +0 -23
- package/dist/cli/bounded-stdin.js +2 -49
- package/dist/cli/bounded-stdin.js.map +1 -1
- package/dist/cli/describe.d.ts +1 -1
- package/dist/cli/describe.js +0 -3
- package/dist/cli/describe.js.map +1 -1
- package/dist/cli/diff/engine.d.ts +0 -11
- package/dist/cli/diff/engine.js +1 -17
- package/dist/cli/diff/engine.js.map +1 -1
- package/dist/cli/diff/index.js +14 -25
- package/dist/cli/diff/index.js.map +1 -1
- package/dist/cli/doctor/claude-mcp.d.ts +4 -19
- package/dist/cli/doctor/claude-mcp.js +11 -22
- package/dist/cli/doctor/claude-mcp.js.map +1 -1
- package/dist/cli/doctor/codex.d.ts +12 -14
- package/dist/cli/doctor/codex.js +31 -144
- package/dist/cli/doctor/codex.js.map +1 -1
- package/dist/cli/doctor/format.js +23 -345
- package/dist/cli/doctor/format.js.map +1 -1
- package/dist/cli/doctor/hook-liveness.d.ts +56 -0
- package/dist/cli/doctor/hook-liveness.js +455 -0
- package/dist/cli/doctor/hook-liveness.js.map +1 -0
- package/dist/cli/doctor/index.d.ts +13 -87
- package/dist/cli/doctor/index.js +57 -713
- package/dist/cli/doctor/index.js.map +1 -1
- package/dist/cli/doctor/opencode.d.ts +2 -1
- package/dist/cli/doctor/opencode.js.map +1 -1
- package/dist/cli/doctor/types.d.ts +21 -387
- package/dist/cli/doctor/types.js.map +1 -1
- package/dist/cli/drain-stdio.d.ts +31 -0
- package/dist/cli/drain-stdio.js +76 -0
- package/dist/cli/drain-stdio.js.map +1 -0
- package/dist/cli/export.d.ts +3 -1
- package/dist/cli/export.js +7 -16
- package/dist/cli/export.js.map +1 -1
- package/dist/cli/gate/codex-disable.d.ts +29 -0
- package/dist/cli/gate/codex-disable.js +195 -0
- package/dist/cli/gate/codex-disable.js.map +1 -0
- package/dist/cli/gate/codex-enable.d.ts +41 -0
- package/dist/cli/gate/codex-enable.js +127 -0
- package/dist/cli/gate/codex-enable.js.map +1 -0
- package/dist/cli/gate/codex-snapshot.d.ts +208 -0
- package/dist/cli/gate/codex-snapshot.js +402 -0
- package/dist/cli/gate/codex-snapshot.js.map +1 -0
- package/dist/cli/gate/disable.d.ts +9 -0
- package/dist/cli/gate/disable.js +263 -28
- package/dist/cli/gate/disable.js.map +1 -1
- package/dist/cli/gate/enable.d.ts +26 -6
- package/dist/cli/gate/enable.js +152 -80
- package/dist/cli/gate/enable.js.map +1 -1
- package/dist/cli/gate/link-chain.d.ts +53 -0
- package/dist/cli/gate/link-chain.js +122 -0
- package/dist/cli/gate/link-chain.js.map +1 -0
- package/dist/cli/gate/snapshot.d.ts +289 -12
- package/dist/cli/gate/snapshot.js +481 -22
- package/dist/cli/gate/snapshot.js.map +1 -1
- package/dist/cli/index.d.ts +0 -9
- package/dist/cli/index.js +9 -2131
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/composer.d.ts +3 -6
- package/dist/cli/init/composer.js +6 -370
- package/dist/cli/init/composer.js.map +1 -1
- package/dist/cli/init/dependencies.d.ts +1 -2
- package/dist/cli/init/dependencies.js +4 -80
- package/dist/cli/init/dependencies.js.map +1 -1
- package/dist/cli/init/detect.js +5 -4
- package/dist/cli/init/detect.js.map +1 -1
- package/dist/cli/init/interactive.d.ts +1 -23
- package/dist/cli/init/interactive.js +33 -247
- package/dist/cli/init/interactive.js.map +1 -1
- package/dist/cli/init/profiles.d.ts +2 -2
- package/dist/cli/init/profiles.js +51 -245
- package/dist/cli/init/profiles.js.map +1 -1
- package/dist/cli/init/templates.d.ts +2 -37
- package/dist/cli/init/templates.js +25 -1237
- package/dist/cli/init/templates.js.map +1 -1
- package/dist/cli/list.d.ts +1 -1
- package/dist/cli/list.js +1 -38
- package/dist/cli/list.js.map +1 -1
- package/dist/cli/loader.d.ts +15 -1
- package/dist/cli/loader.js +56 -39
- package/dist/cli/loader.js.map +1 -1
- package/dist/cli/main.js +7 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/migrate-home/index.js +2 -2
- package/dist/cli/migrate-home/index.js.map +1 -1
- package/dist/cli/pack/add.js +1 -1
- package/dist/cli/pack/add.js.map +1 -1
- package/dist/cli/pack/hook-bootstrap.d.ts +5 -164
- package/dist/cli/pack/hook-bootstrap.js +15 -291
- package/dist/cli/pack/hook-bootstrap.js.map +1 -1
- package/dist/cli/pack/hook-branch-protection.d.ts +28 -21
- package/dist/cli/pack/hook-branch-protection.js +365 -340
- package/dist/cli/pack/hook-branch-protection.js.map +1 -1
- package/dist/cli/pack/index.d.ts +0 -1
- package/dist/cli/pack/index.js +0 -1
- package/dist/cli/pack/index.js.map +1 -1
- package/dist/cli/pack/list.js +1 -6
- package/dist/cli/pack/list.js.map +1 -1
- package/dist/cli/pack/mutate.d.ts +7 -9
- package/dist/cli/pack/mutate.js +6 -9
- package/dist/cli/pack/mutate.js.map +1 -1
- package/dist/cli/pack/reseed.d.ts +2 -2
- package/dist/cli/pack/reseed.js +16 -22
- package/dist/cli/pack/reseed.js.map +1 -1
- package/dist/cli/{delegate/register.d.ts → register-gate-group.d.ts} +1 -1
- package/dist/cli/register-gate-group.js +348 -0
- package/dist/cli/register-gate-group.js.map +1 -0
- package/dist/cli/register-inspect-group.d.ts +6 -0
- package/dist/cli/register-inspect-group.js +189 -0
- package/dist/cli/register-inspect-group.js.map +1 -0
- package/dist/cli/register-operator-lifecycle.d.ts +1 -1
- package/dist/cli/register-operator-lifecycle.js +3 -100
- package/dist/cli/register-operator-lifecycle.js.map +1 -1
- package/dist/cli/register-pack-group.d.ts +5 -0
- package/dist/cli/register-pack-group.js +134 -0
- package/dist/cli/register-pack-group.js.map +1 -0
- package/dist/cli/{register-audit-group.d.ts → register-setup-group.d.ts} +1 -1
- package/dist/cli/register-setup-group.js +495 -0
- package/dist/cli/register-setup-group.js.map +1 -0
- package/dist/cli/remove/index.d.ts +0 -14
- package/dist/cli/remove/index.js +2 -115
- package/dist/cli/remove/index.js.map +1 -1
- package/dist/cli/remove/mutate.d.ts +0 -2
- package/dist/cli/remove/mutate.js +1 -19
- package/dist/cli/remove/mutate.js.map +1 -1
- package/dist/cli/remove/register.js +2 -19
- package/dist/cli/remove/register.js.map +1 -1
- package/dist/cli/shell-quote.d.ts +7 -0
- package/dist/cli/shell-quote.js +17 -0
- package/dist/cli/shell-quote.js.map +1 -0
- package/dist/cli/uninstall/index.d.ts +4 -2
- package/dist/cli/uninstall/index.js +15 -7
- package/dist/cli/uninstall/index.js.map +1 -1
- package/dist/cli/uninstall/register.js +6 -4
- package/dist/cli/uninstall/register.js.map +1 -1
- package/dist/cli/uninstall/snapshot.d.ts +15 -0
- package/dist/cli/uninstall/snapshot.js +38 -0
- package/dist/cli/uninstall/snapshot.js.map +1 -1
- package/dist/cli/validate/checks.d.ts +0 -77
- package/dist/cli/validate/checks.js +3 -1049
- package/dist/cli/validate/checks.js.map +1 -1
- package/dist/cli/validate/index.js +19 -15
- package/dist/cli/validate/index.js.map +1 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.js +0 -3
- package/dist/index.js.map +1 -1
- package/dist/io/claude-mcp.d.ts +1 -1
- package/dist/io/claude-mcp.js +27 -14
- package/dist/io/claude-mcp.js.map +1 -1
- package/dist/io/harness-lock.js +2 -2
- package/dist/io/harness-lock.js.map +1 -1
- package/dist/io/lock.d.ts +0 -26
- package/dist/io/lock.js +10 -27
- package/dist/io/lock.js.map +1 -1
- package/dist/io/merge-settings.js +6 -4
- package/dist/io/merge-settings.js.map +1 -1
- package/dist/io/project-name.d.ts +22 -39
- package/dist/io/project-name.js +25 -42
- package/dist/io/project-name.js.map +1 -1
- package/dist/io/read-regular-file.d.ts +103 -40
- package/dist/io/read-regular-file.js +196 -35
- package/dist/io/read-regular-file.js.map +1 -1
- package/dist/io/restart-hints.js +3 -6
- package/dist/io/restart-hints.js.map +1 -1
- package/dist/io/version-compare.d.ts +1 -3
- package/dist/io/version-compare.js +1 -3
- package/dist/io/version-compare.js.map +1 -1
- package/dist/io/write-regular-file.d.ts +30 -0
- package/dist/io/write-regular-file.js +85 -0
- package/dist/io/write-regular-file.js.map +1 -0
- package/dist/overrides/index.d.ts +1 -0
- package/dist/overrides/index.js +1 -0
- package/dist/overrides/index.js.map +1 -1
- package/dist/overrides/merge-layers.d.ts +43 -0
- package/dist/overrides/merge-layers.js +76 -0
- package/dist/overrides/merge-layers.js.map +1 -0
- package/dist/overrides/merge.d.ts +16 -0
- package/dist/overrides/merge.js +21 -8
- package/dist/overrides/merge.js.map +1 -1
- package/dist/policy-packs/builtin/branch-protection-runtime.d.ts +4 -69
- package/dist/policy-packs/builtin/branch-protection-runtime.js +12 -84
- package/dist/policy-packs/builtin/branch-protection-runtime.js.map +1 -1
- package/dist/policy-packs/builtin/branch-protection.d.ts +7 -30
- package/dist/policy-packs/builtin/branch-protection.js +56 -89
- package/dist/policy-packs/builtin/branch-protection.js.map +1 -1
- package/dist/policy-packs/config-check.d.ts +7 -5
- package/dist/policy-packs/config-check.js +2 -2
- package/dist/policy-packs/config-check.js.map +1 -1
- package/dist/policy-packs/expand.d.ts +1 -3
- package/dist/policy-packs/expand.js +5 -42
- package/dist/policy-packs/expand.js.map +1 -1
- package/dist/policy-packs/index.d.ts +3 -3
- package/dist/policy-packs/index.js +2 -2
- package/dist/policy-packs/index.js.map +1 -1
- package/dist/policy-packs/registry.d.ts +9 -38
- package/dist/policy-packs/registry.js +5 -65
- package/dist/policy-packs/registry.js.map +1 -1
- package/dist/policy-packs/runtime.d.ts +0 -4
- package/dist/policy-packs/runtime.js +9 -22
- package/dist/policy-packs/runtime.js.map +1 -1
- package/dist/policy-packs/types.d.ts +0 -19
- package/dist/policy-packs/ux-compare.d.ts +1 -11
- package/dist/policy-packs/ux-compare.js +6 -42
- package/dist/policy-packs/ux-compare.js.map +1 -1
- package/dist/policy-packs/ux-drift-check.d.ts +5 -5
- package/dist/policy-packs/ux-drift-check.js +17 -22
- package/dist/policy-packs/ux-drift-check.js.map +1 -1
- package/dist/policy-packs/version-check.d.ts +5 -26
- package/dist/policy-packs/version-check.js +19 -74
- package/dist/policy-packs/version-check.js.map +1 -1
- package/dist/probes/memory.d.ts +1 -1
- package/dist/probes/memory.js +1 -1
- package/dist/probes/memory.js.map +1 -1
- package/dist/runtime/agent-facing.d.ts +9 -0
- package/dist/runtime/agent-facing.js +28 -14
- package/dist/runtime/agent-facing.js.map +1 -1
- package/dist/runtime/bounded-text.d.ts +15 -0
- package/dist/runtime/bounded-text.js +27 -0
- package/dist/runtime/bounded-text.js.map +1 -0
- package/dist/runtime/git-branch.d.ts +125 -0
- package/dist/runtime/git-branch.js +381 -0
- package/dist/runtime/git-branch.js.map +1 -0
- package/dist/runtime/hermetic-spawn-guard.d.ts +2 -2
- package/dist/runtime/hermetic-spawn-guard.js +24 -34
- package/dist/runtime/hermetic-spawn-guard.js.map +1 -1
- package/dist/runtime/home-dir.js +3 -2
- package/dist/runtime/home-dir.js.map +1 -1
- package/dist/runtime/tool-name-aliases.d.ts +0 -6
- package/dist/runtime/tool-name-aliases.js +5 -18
- package/dist/runtime/tool-name-aliases.js.map +1 -1
- package/dist/schema/grounding.d.ts +7 -54
- package/dist/schema/grounding.js +10 -12
- package/dist/schema/grounding.js.map +1 -1
- package/dist/schema/hooks.d.ts +39 -136
- package/dist/schema/hooks.js +3 -6
- package/dist/schema/hooks.js.map +1 -1
- package/dist/schema/index.d.ts +114 -3828
- package/dist/schema/index.js +41 -80
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/memory.d.ts +54 -131
- package/dist/schema/memory.js +2 -2
- package/dist/schema/memory.js.map +1 -1
- package/dist/schema/policy-packs.d.ts +3 -45
- package/dist/schema/policy-packs.js +7 -13
- package/dist/schema/policy-packs.js.map +1 -1
- package/dist/schema/policy-ux.d.ts +7 -0
- package/dist/schema/policy-ux.js +18 -0
- package/dist/schema/policy-ux.js.map +1 -0
- package/dist/schema/removed-keys.d.ts +185 -0
- package/dist/schema/removed-keys.js +531 -0
- package/dist/schema/removed-keys.js.map +1 -0
- package/dist/schema/tools.d.ts +30 -268
- package/dist/schema/tools.js +4 -4
- package/dist/schema/tools.js.map +1 -1
- package/package.json +5 -16
- package/dist/cli/approve/branch-protection.d.ts +0 -69
- package/dist/cli/approve/branch-protection.js +0 -144
- package/dist/cli/approve/branch-protection.js.map +0 -1
- package/dist/cli/approve/risk.d.ts +0 -112
- package/dist/cli/approve/risk.js +0 -197
- package/dist/cli/approve/risk.js.map +0 -1
- package/dist/cli/approve/stdin-report.d.ts +0 -57
- package/dist/cli/approve/stdin-report.js +0 -145
- package/dist/cli/approve/stdin-report.js.map +0 -1
- package/dist/cli/approve/understanding.d.ts +0 -410
- package/dist/cli/approve/understanding.js +0 -996
- package/dist/cli/approve/understanding.js.map +0 -1
- package/dist/cli/audit.d.ts +0 -80
- package/dist/cli/audit.js +0 -252
- package/dist/cli/audit.js.map +0 -1
- package/dist/cli/delegate/index.d.ts +0 -76
- package/dist/cli/delegate/index.js +0 -444
- package/dist/cli/delegate/index.js.map +0 -1
- package/dist/cli/delegate/register.js +0 -90
- package/dist/cli/delegate/register.js.map +0 -1
- package/dist/cli/doctor/auto-approve-mode.d.ts +0 -37
- package/dist/cli/doctor/auto-approve-mode.js +0 -80
- package/dist/cli/doctor/auto-approve-mode.js.map +0 -1
- package/dist/cli/doctor/bypass-without-auto-approve.d.ts +0 -38
- package/dist/cli/doctor/bypass-without-auto-approve.js +0 -95
- package/dist/cli/doctor/bypass-without-auto-approve.js.map +0 -1
- package/dist/cli/doctor/codex-config-drift.d.ts +0 -28
- package/dist/cli/doctor/codex-config-drift.js +0 -240
- package/dist/cli/doctor/codex-config-drift.js.map +0 -1
- package/dist/cli/doctor/expire-on-tool-match.d.ts +0 -15
- package/dist/cli/doctor/expire-on-tool-match.js +0 -58
- package/dist/cli/doctor/expire-on-tool-match.js.map +0 -1
- package/dist/cli/doctor/rogue-ledger.d.ts +0 -53
- package/dist/cli/doctor/rogue-ledger.js +0 -153
- package/dist/cli/doctor/rogue-ledger.js.map +0 -1
- package/dist/cli/doctor/session-start-preflight-setup-version.d.ts +0 -83
- package/dist/cli/doctor/session-start-preflight-setup-version.js +0 -114
- package/dist/cli/doctor/session-start-preflight-setup-version.js.map +0 -1
- package/dist/cli/doctor/settings-drift.d.ts +0 -25
- package/dist/cli/doctor/settings-drift.js +0 -213
- package/dist/cli/doctor/settings-drift.js.map +0 -1
- package/dist/cli/doctor/toolchain-parity.d.ts +0 -63
- package/dist/cli/doctor/toolchain-parity.js +0 -154
- package/dist/cli/doctor/toolchain-parity.js.map +0 -1
- package/dist/cli/doctor/ug-auto-approvals.d.ts +0 -40
- package/dist/cli/doctor/ug-auto-approvals.js +0 -91
- package/dist/cli/doctor/ug-auto-approvals.js.map +0 -1
- package/dist/cli/doctor/ug-delegations.d.ts +0 -26
- package/dist/cli/doctor/ug-delegations.js +0 -121
- package/dist/cli/doctor/ug-delegations.js.map +0 -1
- package/dist/cli/doctor/ug-inflight.d.ts +0 -35
- package/dist/cli/doctor/ug-inflight.js +0 -57
- package/dist/cli/doctor/ug-inflight.js.map +0 -1
- package/dist/cli/doctor/understanding-mode-env.d.ts +0 -51
- package/dist/cli/doctor/understanding-mode-env.js +0 -98
- package/dist/cli/doctor/understanding-mode-env.js.map +0 -1
- package/dist/cli/dry-run.d.ts +0 -58
- package/dist/cli/dry-run.js +0 -283
- package/dist/cli/dry-run.js.map +0 -1
- package/dist/cli/enriched-event.d.ts +0 -35
- package/dist/cli/enriched-event.js +0 -60
- package/dist/cli/enriched-event.js.map +0 -1
- package/dist/cli/event-input.d.ts +0 -28
- package/dist/cli/event-input.js +0 -73
- package/dist/cli/event-input.js.map +0 -1
- package/dist/cli/explain-action.d.ts +0 -25
- package/dist/cli/explain-action.js +0 -57
- package/dist/cli/explain-action.js.map +0 -1
- package/dist/cli/explain-policy.d.ts +0 -147
- package/dist/cli/explain-policy.js +0 -248
- package/dist/cli/explain-policy.js.map +0 -1
- package/dist/cli/explain.d.ts +0 -31
- package/dist/cli/explain.js +0 -159
- package/dist/cli/explain.js.map +0 -1
- package/dist/cli/gc/index.d.ts +0 -63
- package/dist/cli/gc/index.js +0 -566
- package/dist/cli/gc/index.js.map +0 -1
- package/dist/cli/pack/approve-escape.d.ts +0 -19
- package/dist/cli/pack/approve-escape.js +0 -190
- package/dist/cli/pack/approve-escape.js.map +0 -1
- package/dist/cli/pack/auto-approve-path.d.ts +0 -146
- package/dist/cli/pack/auto-approve-path.js +0 -462
- package/dist/cli/pack/auto-approve-path.js.map +0 -1
- package/dist/cli/pack/hook-codex-post-tool-use.d.ts +0 -25
- package/dist/cli/pack/hook-codex-post-tool-use.js +0 -160
- package/dist/cli/pack/hook-codex-post-tool-use.js.map +0 -1
- package/dist/cli/pack/hook-codex-pre-tool-use.d.ts +0 -48
- package/dist/cli/pack/hook-codex-pre-tool-use.js +0 -474
- package/dist/cli/pack/hook-codex-pre-tool-use.js.map +0 -1
- package/dist/cli/pack/hook-codex-stop.d.ts +0 -35
- package/dist/cli/pack/hook-codex-stop.js +0 -329
- package/dist/cli/pack/hook-codex-stop.js.map +0 -1
- package/dist/cli/pack/hook-codex-user-prompt-submit.d.ts +0 -24
- package/dist/cli/pack/hook-codex-user-prompt-submit.js +0 -93
- package/dist/cli/pack/hook-codex-user-prompt-submit.js.map +0 -1
- package/dist/cli/pack/hook-post-merge-gate-record.d.ts +0 -37
- package/dist/cli/pack/hook-post-merge-gate-record.js +0 -190
- package/dist/cli/pack/hook-post-merge-gate-record.js.map +0 -1
- package/dist/cli/pack/hook-post-merge-gate.d.ts +0 -34
- package/dist/cli/pack/hook-post-merge-gate.js +0 -277
- package/dist/cli/pack/hook-post-merge-gate.js.map +0 -1
- package/dist/cli/pack/hook-post-tool-use.d.ts +0 -45
- package/dist/cli/pack/hook-post-tool-use.js +0 -137
- package/dist/cli/pack/hook-post-tool-use.js.map +0 -1
- package/dist/cli/pack/hook-pre-tool-use.d.ts +0 -92
- package/dist/cli/pack/hook-pre-tool-use.js +0 -1328
- package/dist/cli/pack/hook-pre-tool-use.js.map +0 -1
- package/dist/cli/pack/hook-runtime-reality.d.ts +0 -63
- package/dist/cli/pack/hook-runtime-reality.js +0 -210
- package/dist/cli/pack/hook-runtime-reality.js.map +0 -1
- package/dist/cli/pack/hook-solution-acceptance-writeguard.d.ts +0 -32
- package/dist/cli/pack/hook-solution-acceptance-writeguard.js +0 -438
- package/dist/cli/pack/hook-solution-acceptance-writeguard.js.map +0 -1
- package/dist/cli/pack/hook-solution-acceptance.d.ts +0 -157
- package/dist/cli/pack/hook-solution-acceptance.js +0 -530
- package/dist/cli/pack/hook-solution-acceptance.js.map +0 -1
- package/dist/cli/pack/hook-stay-in-scope.d.ts +0 -37
- package/dist/cli/pack/hook-stay-in-scope.js +0 -128
- package/dist/cli/pack/hook-stay-in-scope.js.map +0 -1
- package/dist/cli/pack/hook-subagent-start.d.ts +0 -23
- package/dist/cli/pack/hook-subagent-start.js +0 -88
- package/dist/cli/pack/hook-subagent-start.js.map +0 -1
- package/dist/cli/pack/hook-subagent-stop.d.ts +0 -19
- package/dist/cli/pack/hook-subagent-stop.js +0 -41
- package/dist/cli/pack/hook-subagent-stop.js.map +0 -1
- package/dist/cli/pack/hook-track-active-claim.d.ts +0 -27
- package/dist/cli/pack/hook-track-active-claim.js +0 -275
- package/dist/cli/pack/hook-track-active-claim.js.map +0 -1
- package/dist/cli/pack/transcript-report-scan.d.ts +0 -71
- package/dist/cli/pack/transcript-report-scan.js +0 -359
- package/dist/cli/pack/transcript-report-scan.js.map +0 -1
- package/dist/cli/pack/understanding-report-schema-hint.d.ts +0 -26
- package/dist/cli/pack/understanding-report-schema-hint.js +0 -120
- package/dist/cli/pack/understanding-report-schema-hint.js.map +0 -1
- package/dist/cli/pack/upgrade.d.ts +0 -32
- package/dist/cli/pack/upgrade.js +0 -273
- package/dist/cli/pack/upgrade.js.map +0 -1
- package/dist/cli/pause/index.d.ts +0 -113
- package/dist/cli/pause/index.js +0 -251
- package/dist/cli/pause/index.js.map +0 -1
- package/dist/cli/pause-check.d.ts +0 -22
- package/dist/cli/pause-check.js +0 -54
- package/dist/cli/pause-check.js.map +0 -1
- package/dist/cli/policy/intercept.d.ts +0 -233
- package/dist/cli/policy/intercept.js +0 -1022
- package/dist/cli/policy/intercept.js.map +0 -1
- package/dist/cli/policy/risk-envelope-enrichment.d.ts +0 -40
- package/dist/cli/policy/risk-envelope-enrichment.js +0 -110
- package/dist/cli/policy/risk-envelope-enrichment.js.map +0 -1
- package/dist/cli/record/index.d.ts +0 -81
- package/dist/cli/record/index.js +0 -348
- package/dist/cli/record/index.js.map +0 -1
- package/dist/cli/register-audit-group.js +0 -91
- package/dist/cli/register-audit-group.js.map +0 -1
- package/dist/cli/resolve-env.d.ts +0 -32
- package/dist/cli/resolve-env.js +0 -46
- package/dist/cli/resolve-env.js.map +0 -1
- package/dist/cli/session-export/index.d.ts +0 -46
- package/dist/cli/session-export/index.js +0 -169
- package/dist/cli/session-export/index.js.map +0 -1
- package/dist/cli/session-export/redact.d.ts +0 -22
- package/dist/cli/session-export/redact.js +0 -47
- package/dist/cli/session-export/redact.js.map +0 -1
- package/dist/cli/session-export/transcript.d.ts +0 -24
- package/dist/cli/session-export/transcript.js +0 -164
- package/dist/cli/session-export/transcript.js.map +0 -1
- package/dist/cli/session-start/branch-check.d.ts +0 -18
- package/dist/cli/session-start/branch-check.js +0 -140
- package/dist/cli/session-start/branch-check.js.map +0 -1
- package/dist/cli/session-start/index.d.ts +0 -121
- package/dist/cli/session-start/index.js +0 -591
- package/dist/cli/session-start/index.js.map +0 -1
- package/dist/cli/session-start/shared-options.d.ts +0 -103
- package/dist/cli/session-start/shared-options.js +0 -107
- package/dist/cli/session-start/shared-options.js.map +0 -1
- package/dist/cli/session-start/stale-base-check.d.ts +0 -46
- package/dist/cli/session-start/stale-base-check.js +0 -352
- package/dist/cli/session-start/stale-base-check.js.map +0 -1
- package/dist/cli/session-start/toolchain-parity.d.ts +0 -267
- package/dist/cli/session-start/toolchain-parity.js +0 -797
- package/dist/cli/session-start/toolchain-parity.js.map +0 -1
- package/dist/cli/smoke/assertions.d.ts +0 -46
- package/dist/cli/smoke/assertions.js +0 -170
- package/dist/cli/smoke/assertions.js.map +0 -1
- package/dist/cli/smoke/index.d.ts +0 -76
- package/dist/cli/smoke/index.js +0 -245
- package/dist/cli/smoke/index.js.map +0 -1
- package/dist/cli/smoke/runner.d.ts +0 -55
- package/dist/cli/smoke/runner.js +0 -134
- package/dist/cli/smoke/runner.js.map +0 -1
- package/dist/cli/smoke/stream-parser.d.ts +0 -65
- package/dist/cli/smoke/stream-parser.js +0 -115
- package/dist/cli/smoke/stream-parser.js.map +0 -1
- package/dist/cli/test-risk.d.ts +0 -27
- package/dist/cli/test-risk.js +0 -38
- package/dist/cli/test-risk.js.map +0 -1
- package/dist/io/display-path.d.ts +0 -11
- package/dist/io/display-path.js +0 -29
- package/dist/io/display-path.js.map +0 -1
- package/dist/io/duration.d.ts +0 -5
- package/dist/io/duration.js +0 -50
- package/dist/io/duration.js.map +0 -1
- package/dist/io/extract.d.ts +0 -79
- package/dist/io/extract.js +0 -226
- package/dist/io/extract.js.map +0 -1
- package/dist/io/ledger-record.d.ts +0 -83
- package/dist/io/ledger-record.js +0 -301
- package/dist/io/ledger-record.js.map +0 -1
- package/dist/io/read-json-dir-entries.d.ts +0 -36
- package/dist/io/read-json-dir-entries.js +0 -48
- package/dist/io/read-json-dir-entries.js.map +0 -1
- package/dist/io/safe-json-parse.d.ts +0 -5
- package/dist/io/safe-json-parse.js +0 -21
- package/dist/io/safe-json-parse.js.map +0 -1
- package/dist/policies/index.d.ts +0 -5
- package/dist/policies/index.js +0 -6
- package/dist/policies/index.js.map +0 -1
- package/dist/policies/ledger-client.d.ts +0 -113
- package/dist/policies/ledger-client.js +0 -500
- package/dist/policies/ledger-client.js.map +0 -1
- package/dist/policies/producers.d.ts +0 -12
- package/dist/policies/producers.js +0 -61
- package/dist/policies/producers.js.map +0 -1
- package/dist/policies/requires.d.ts +0 -75
- package/dist/policies/requires.js +0 -240
- package/dist/policies/requires.js.map +0 -1
- package/dist/policies/timestamp.d.ts +0 -14
- package/dist/policies/timestamp.js +0 -36
- package/dist/policies/timestamp.js.map +0 -1
- package/dist/policy-packs/builtin/permission-profiles.d.ts +0 -11
- package/dist/policy-packs/builtin/permission-profiles.js +0 -74
- package/dist/policy-packs/builtin/permission-profiles.js.map +0 -1
- package/dist/policy-packs/builtin/post-merge-gate-runtime.d.ts +0 -286
- package/dist/policy-packs/builtin/post-merge-gate-runtime.js +0 -397
- package/dist/policy-packs/builtin/post-merge-gate-runtime.js.map +0 -1
- package/dist/policy-packs/builtin/post-merge-gate.d.ts +0 -56
- package/dist/policy-packs/builtin/post-merge-gate.js +0 -347
- package/dist/policy-packs/builtin/post-merge-gate.js.map +0 -1
- package/dist/policy-packs/builtin/solution-acceptance-reconnect.d.ts +0 -50
- package/dist/policy-packs/builtin/solution-acceptance-reconnect.js +0 -151
- package/dist/policy-packs/builtin/solution-acceptance-reconnect.js.map +0 -1
- package/dist/policy-packs/builtin/solution-acceptance-runtime.d.ts +0 -323
- package/dist/policy-packs/builtin/solution-acceptance-runtime.js +0 -672
- package/dist/policy-packs/builtin/solution-acceptance-runtime.js.map +0 -1
- package/dist/policy-packs/builtin/solution-acceptance.d.ts +0 -45
- package/dist/policy-packs/builtin/solution-acceptance.js +0 -226
- package/dist/policy-packs/builtin/solution-acceptance.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/active-claim.d.ts +0 -25
- package/dist/policy-packs/builtin/understanding-before-execution/active-claim.js +0 -94
- package/dist/policy-packs/builtin/understanding-before-execution/active-claim.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.d.ts +0 -35
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.js +0 -86
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve.d.ts +0 -210
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve.js +0 -361
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.d.ts +0 -304
- package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.js +0 -734
- package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/expiry-reason.d.ts +0 -36
- package/dist/policy-packs/builtin/understanding-before-execution/expiry-reason.js +0 -73
- package/dist/policy-packs/builtin/understanding-before-execution/expiry-reason.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/index.d.ts +0 -19
- package/dist/policy-packs/builtin/understanding-before-execution/index.js +0 -83
- package/dist/policy-packs/builtin/understanding-before-execution/index.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/inflight-records.d.ts +0 -135
- package/dist/policy-packs/builtin/understanding-before-execution/inflight-records.js +0 -643
- package/dist/policy-packs/builtin/understanding-before-execution/inflight-records.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/ledger.d.ts +0 -25
- package/dist/policy-packs/builtin/understanding-before-execution/ledger.js +0 -56
- package/dist/policy-packs/builtin/understanding-before-execution/ledger.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.d.ts +0 -20
- package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.js +0 -106
- package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/markers.d.ts +0 -126
- package/dist/policy-packs/builtin/understanding-before-execution/markers.js +0 -245
- package/dist/policy-packs/builtin/understanding-before-execution/markers.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/measured-permission-modes.d.ts +0 -29
- package/dist/policy-packs/builtin/understanding-before-execution/measured-permission-modes.js +0 -82
- package/dist/policy-packs/builtin/understanding-before-execution/measured-permission-modes.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.d.ts +0 -71
- package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.js +0 -175
- package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.d.ts +0 -625
- package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.js +0 -1076
- package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.d.ts +0 -128
- package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.js +0 -213
- package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/stay-in-scope-config.d.ts +0 -129
- package/dist/policy-packs/builtin/understanding-before-execution/stay-in-scope-config.js +0 -166
- package/dist/policy-packs/builtin/understanding-before-execution/stay-in-scope-config.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/task-markers.d.ts +0 -164
- package/dist/policy-packs/builtin/understanding-before-execution/task-markers.js +0 -275
- package/dist/policy-packs/builtin/understanding-before-execution/task-markers.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.d.ts +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.js +0 -10
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution.d.ts +0 -526
- package/dist/policy-packs/builtin/understanding-before-execution.js +0 -1078
- package/dist/policy-packs/builtin/understanding-before-execution.js.map +0 -1
- package/dist/policy-packs/permission-translator.d.ts +0 -9
- package/dist/policy-packs/permission-translator.js +0 -76
- package/dist/policy-packs/permission-translator.js.map +0 -1
- package/dist/runtime/action-envelope.d.ts +0 -64
- package/dist/runtime/action-envelope.js +0 -46
- package/dist/runtime/action-envelope.js.map +0 -1
- package/dist/runtime/approval-signing.d.ts +0 -111
- package/dist/runtime/approval-signing.js +0 -384
- package/dist/runtime/approval-signing.js.map +0 -1
- package/dist/runtime/bash-match-facts.d.ts +0 -60
- package/dist/runtime/bash-match-facts.js +0 -196
- package/dist/runtime/bash-match-facts.js.map +0 -1
- package/dist/runtime/bash-match-registry.d.ts +0 -112
- package/dist/runtime/bash-match-registry.js +0 -406
- package/dist/runtime/bash-match-registry.js.map +0 -1
- package/dist/runtime/bash-prefix-parse.d.ts +0 -31
- package/dist/runtime/bash-prefix-parse.js +0 -576
- package/dist/runtime/bash-prefix-parse.js.map +0 -1
- package/dist/runtime/command-normalize.d.ts +0 -658
- package/dist/runtime/command-normalize.js +0 -2410
- package/dist/runtime/command-normalize.js.map +0 -1
- package/dist/runtime/deletion-target-resolve.d.ts +0 -28
- package/dist/runtime/deletion-target-resolve.js +0 -1078
- package/dist/runtime/deletion-target-resolve.js.map +0 -1
- package/dist/runtime/destructive-shell-floor.d.ts +0 -19
- package/dist/runtime/destructive-shell-floor.js +0 -611
- package/dist/runtime/destructive-shell-floor.js.map +0 -1
- package/dist/runtime/environment-resolver.d.ts +0 -36
- package/dist/runtime/environment-resolver.js +0 -138
- package/dist/runtime/environment-resolver.js.map +0 -1
- package/dist/runtime/git-context.d.ts +0 -201
- package/dist/runtime/git-context.js +0 -422
- package/dist/runtime/git-context.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -12
- package/dist/runtime/index.js +0 -13
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/intercept.d.ts +0 -623
- package/dist/runtime/intercept.js +0 -1384
- package/dist/runtime/intercept.js.map +0 -1
- package/dist/runtime/kube-context.d.ts +0 -16
- package/dist/runtime/kube-context.js +0 -63
- package/dist/runtime/kube-context.js.map +0 -1
- package/dist/runtime/kubectl-target-parse.d.ts +0 -31
- package/dist/runtime/kubectl-target-parse.js +0 -249
- package/dist/runtime/kubectl-target-parse.js.map +0 -1
- package/dist/runtime/ledger-add.d.ts +0 -16
- package/dist/runtime/ledger-add.js +0 -150
- package/dist/runtime/ledger-add.js.map +0 -1
- package/dist/runtime/ledger-writer.d.ts +0 -27
- package/dist/runtime/ledger-writer.js +0 -46
- package/dist/runtime/ledger-writer.js.map +0 -1
- package/dist/runtime/pause-sentinel.d.ts +0 -60
- package/dist/runtime/pause-sentinel.js +0 -156
- package/dist/runtime/pause-sentinel.js.map +0 -1
- package/dist/runtime/pending-approval.d.ts +0 -23
- package/dist/runtime/pending-approval.js +0 -67
- package/dist/runtime/pending-approval.js.map +0 -1
- package/dist/runtime/read-only-bash.d.ts +0 -141
- package/dist/runtime/read-only-bash.js +0 -2204
- package/dist/runtime/read-only-bash.js.map +0 -1
- package/dist/runtime/recovery-git-commit.d.ts +0 -22
- package/dist/runtime/recovery-git-commit.js +0 -284
- package/dist/runtime/recovery-git-commit.js.map +0 -1
- package/dist/runtime/reject-malformed-session-id.d.ts +0 -8
- package/dist/runtime/reject-malformed-session-id.js +0 -16
- package/dist/runtime/reject-malformed-session-id.js.map +0 -1
- package/dist/runtime/risk-classifier.d.ts +0 -38
- package/dist/runtime/risk-classifier.js +0 -311
- package/dist/runtime/risk-classifier.js.map +0 -1
- package/dist/runtime/session-id.d.ts +0 -113
- package/dist/runtime/session-id.js +0 -193
- package/dist/runtime/session-id.js.map +0 -1
- package/dist/runtime/shell-word.d.ts +0 -62
- package/dist/runtime/shell-word.js +0 -410
- package/dist/runtime/shell-word.js.map +0 -1
- package/dist/runtime/task-providers/agent-tasks.d.ts +0 -105
- package/dist/runtime/task-providers/agent-tasks.js +0 -247
- package/dist/runtime/task-providers/agent-tasks.js.map +0 -1
- package/dist/runtime/when-eval.d.ts +0 -62
- package/dist/runtime/when-eval.js +0 -212
- package/dist/runtime/when-eval.js.map +0 -1
- package/dist/runtime/workflow-policies.d.ts +0 -207
- package/dist/runtime/workflow-policies.js +0 -596
- package/dist/runtime/workflow-policies.js.map +0 -1
- package/dist/schema/audit.d.ts +0 -71
- package/dist/schema/audit.js +0 -32
- package/dist/schema/audit.js.map +0 -1
- package/dist/schema/doctor.d.ts +0 -25
- package/dist/schema/doctor.js +0 -23
- package/dist/schema/doctor.js.map +0 -1
- package/dist/schema/environments.d.ts +0 -215
- package/dist/schema/environments.js +0 -101
- package/dist/schema/environments.js.map +0 -1
- package/dist/schema/extract.d.ts +0 -9
- package/dist/schema/extract.js +0 -86
- package/dist/schema/extract.js.map +0 -1
- package/dist/schema/permission-profiles.d.ts +0 -2292
- package/dist/schema/permission-profiles.js +0 -60
- package/dist/schema/permission-profiles.js.map +0 -1
- package/dist/schema/policies.d.ts +0 -974
- package/dist/schema/policies.js +0 -298
- package/dist/schema/policies.js.map +0 -1
- package/dist/schema/requires.d.ts +0 -131
- package/dist/schema/requires.js +0 -88
- package/dist/schema/requires.js.map +0 -1
- package/dist/schema/risk.d.ts +0 -144
- package/dist/schema/risk.js +0 -194
- package/dist/schema/risk.js.map +0 -1
- package/dist/schema/session-start-preflight.d.ts +0 -10
- package/dist/schema/session-start-preflight.js +0 -106
- package/dist/schema/session-start-preflight.js.map +0 -1
- package/dist/schema/stale-base-check.d.ts +0 -18
- package/dist/schema/stale-base-check.js +0 -37
- package/dist/schema/stale-base-check.js.map +0 -1
- package/dist/schema/toolchain-parity.d.ts +0 -21
- package/dist/schema/toolchain-parity.js +0 -48
- package/dist/schema/toolchain-parity.js.map +0 -1
- package/dist/schema/workflows.d.ts +0 -519
- package/dist/schema/workflows.js +0 -81
- package/dist/schema/workflows.js.map +0 -1
- package/scripts/runtime-reality-docker-probe.mjs +0 -71
|
@@ -1,625 +0,0 @@
|
|
|
1
|
-
export interface PersistedReport {
|
|
2
|
-
filePath: string;
|
|
3
|
-
sessionId: string | null;
|
|
4
|
-
approvalStatus: string | null;
|
|
5
|
-
approvedAt: string | null;
|
|
6
|
-
/**
|
|
7
|
-
* Event a PostToolUse boundary expired this report for
|
|
8
|
-
* (`tool:<tool_name>` or `bash:/<regex>/`), stamped by
|
|
9
|
-
* `expirePersistedReport`; null for a report without the field (older
|
|
10
|
-
* reports, package producers, or a TTL-only lapse).
|
|
11
|
-
*/
|
|
12
|
-
expiredBy: string | null;
|
|
13
|
-
/** ISO timestamp `expirePersistedReport` stamped; null when absent. */
|
|
14
|
-
expiredAt: string | null;
|
|
15
|
-
/**
|
|
16
|
-
* ISO timestamp the producer stamped when it wrote the report; null
|
|
17
|
-
* for legacy reports without the field.
|
|
18
|
-
*/
|
|
19
|
-
createdAt: string | null;
|
|
20
|
-
/**
|
|
21
|
-
* Effective creation time in epoch ms, resolved `createdAt` →
|
|
22
|
-
* filename ISO prefix → file mtime. Unlike mtime alone this survives
|
|
23
|
-
* the approval rewrite (which bumps mtime and would otherwise make a
|
|
24
|
-
* weeks-old report sort as the freshest, harness-discovery C1).
|
|
25
|
-
*/
|
|
26
|
-
createdAtMs: number;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Env var the persisted-report directory can be set from. Honored by
|
|
30
|
-
* harness (`defaultReportsDir` below + emitted by `harness apply` onto
|
|
31
|
-
* the pack-contributed hook commands) AND by `@lannguyensi/understanding-gate`
|
|
32
|
-
* (its `core/persistence.js:resolveReportDir` reads the same name), so
|
|
33
|
-
* the three actors that touch the directory — Stop hook (package),
|
|
34
|
-
* PreToolUse blocker (harness), `harness approve understanding` — can
|
|
35
|
-
* agree on the path regardless of each process's cwd.
|
|
36
|
-
*/
|
|
37
|
-
export declare const REPORTS_DIR_ENV = "UNDERSTANDING_GATE_REPORT_DIR";
|
|
38
|
-
/**
|
|
39
|
-
* Resolve the persisted-report directory. Precedence:
|
|
40
|
-
* 1. `UNDERSTANDING_GATE_REPORT_DIR` (taken verbatim — apply emits an
|
|
41
|
-
* absolute path, operator-exported values are shell-expanded before
|
|
42
|
-
* we see them).
|
|
43
|
-
* 2. `<cwd>/.understanding-gate/reports` — backward-compat fallback.
|
|
44
|
-
* Callers that have a stable anchor (the manifest directory) pass
|
|
45
|
-
* it as `cwd` so the fallback agrees with whatever path apply
|
|
46
|
-
* baked into the hook commands.
|
|
47
|
-
*/
|
|
48
|
-
export declare function defaultReportsDir(cwd?: string): string;
|
|
49
|
-
/**
|
|
50
|
-
* Project root anchor for the reports directory: `<dir-of-manifest>/.understanding-gate/reports`.
|
|
51
|
-
* Used by `harness apply` to bake an absolute, manifest-anchored value into
|
|
52
|
-
* the pack-contributed hook commands' env, and by `harness approve` as the
|
|
53
|
-
* fallback when `UNDERSTANDING_GATE_REPORT_DIR` is unset.
|
|
54
|
-
*/
|
|
55
|
-
export declare function reportsDirForManifest(manifestPath: string): string;
|
|
56
|
-
/**
|
|
57
|
-
* List persisted reports under `dir`, newest-first by creation time
|
|
58
|
-
* (JSON `createdAt`, then the filename ISO prefix, then mtime). Missing
|
|
59
|
-
* directory returns []; an I/O error on a single file skips it. Reads each
|
|
60
|
-
* regular file IN FULL, so it must not list the agent-writable reports
|
|
61
|
-
* directory (use {@link listPersistedReportsBoundedWithSkips}); no `src`
|
|
62
|
-
* caller remains, it stays for its tests and the pack's export surface.
|
|
63
|
-
*
|
|
64
|
-
* Creation time, NOT mtime, is the sort key: `harness approve
|
|
65
|
-
* understanding` rewrites the report it flips, which bumps mtime and
|
|
66
|
-
* made an old just-approved report sort as the freshest
|
|
67
|
-
* (harness-discovery C1). mtime is the last-resort fallback.
|
|
68
|
-
*/
|
|
69
|
-
export declare function listPersistedReports(dir: string): PersistedReport[];
|
|
70
|
-
/**
|
|
71
|
-
* Maximum age a sessionId-null report may have for the tolerant
|
|
72
|
-
* fallback to adopt it on the `harness approve understanding` path.
|
|
73
|
-
* Sized for the real flow (Stop hook persists at turn end, operator
|
|
74
|
-
* approves within minutes) with slack for a slow read-through. Live
|
|
75
|
-
* repro that motivated it: a 17-day-old pending report got adopted,
|
|
76
|
-
* validated, and stamped for a fresh session because the producer had
|
|
77
|
-
* silently failed to persist the fresh report (harness-discovery C1,
|
|
78
|
-
* friction-log #67).
|
|
79
|
-
*/
|
|
80
|
-
export declare const TOLERANT_FALLBACK_MAX_AGE_MS: number;
|
|
81
|
-
/**
|
|
82
|
-
* Tolerance for a sessionId-less candidate whose `createdAt` lies in
|
|
83
|
-
* the FUTURE relative to the approve-time clock. A future creation
|
|
84
|
-
* time is suspect either way: a forged `createdAt` (the producer's
|
|
85
|
-
* Metadata block lets the agent author it) or serious clock skew.
|
|
86
|
-
* Beyond this skew the fallback rejects the candidate just like a
|
|
87
|
-
* stale one rather than trusting a timestamp that cannot be right.
|
|
88
|
-
*/
|
|
89
|
-
export declare const TOLERANT_FALLBACK_FUTURE_SKEW_MS: number;
|
|
90
|
-
export interface FindReportOptions {
|
|
91
|
-
/**
|
|
92
|
-
* Behaviour of the sessionId-null tolerant fallback (older Stop-hook
|
|
93
|
-
* package versions write reports without a `sessionId` field):
|
|
94
|
-
* - `"any"` (default): adopt the freshest sessionId-null report
|
|
95
|
-
* regardless of its `approvalStatus`. The gate read path
|
|
96
|
-
* (`checkPersistedReport`) and post-tool-use expiry
|
|
97
|
-
* (`expirePersistedReport`) rely on this so they keep finding the
|
|
98
|
-
* session's own report.
|
|
99
|
-
* - `"uncompleted"`: skip sessionId-null reports whose
|
|
100
|
-
* `approvalStatus` is a terminal `approved` / `expired`. Such a
|
|
101
|
-
* report belongs to a prior, finished approval cycle (often from
|
|
102
|
-
* a different task days ago) and must not be silently re-adopted
|
|
103
|
-
* as the current session's approval. `harness approve
|
|
104
|
-
* understanding` passes this so it never flips a stale unrelated
|
|
105
|
-
* report into the live session (harness/0dce3880 friction #1).
|
|
106
|
-
*/
|
|
107
|
-
tolerantFallback?: "any" | "uncompleted";
|
|
108
|
-
/**
|
|
109
|
-
* Maximum age (relative to `now`) of a sessionId-null candidate the
|
|
110
|
-
* tolerant fallback may adopt; older candidates are skipped and
|
|
111
|
-
* surfaced via `FindReportSelection.staleRejected`. Strict sessionId
|
|
112
|
-
* matches are never age-limited. Unset means no limit (the legacy
|
|
113
|
-
* gate-read / expiry contract).
|
|
114
|
-
*/
|
|
115
|
-
maxFallbackAgeMs?: number;
|
|
116
|
-
/** Clock anchor for the age computation; defaults to the wall clock. */
|
|
117
|
-
now?: Date;
|
|
118
|
-
}
|
|
119
|
-
export interface FindReportSelection {
|
|
120
|
-
report: PersistedReport | null;
|
|
121
|
-
/**
|
|
122
|
-
* True when `report` was adopted via the sessionId-null tolerant
|
|
123
|
-
* fallback rather than a strict sessionId match. Callers that bind
|
|
124
|
-
* the report to a session (the approve flow) surface this loudly so
|
|
125
|
-
* the operator can verify the adoption.
|
|
126
|
-
*/
|
|
127
|
-
fallbackAdopted: boolean;
|
|
128
|
-
/**
|
|
129
|
-
* sessionId-null candidates skipped for exceeding `maxFallbackAgeMs`,
|
|
130
|
-
* newest first. Lets the caller distinguish "no report at all" from
|
|
131
|
-
* "only stale candidates existed", which are different failures: the
|
|
132
|
-
* latter usually means the producer failed to persist the fresh
|
|
133
|
-
* report (harness-discovery C1).
|
|
134
|
-
*/
|
|
135
|
-
staleRejected: PersistedReport[];
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Select the freshest report for a given session_id, or the freshest
|
|
139
|
-
* applicable report when the persisted file lacks a sessionId field
|
|
140
|
-
* (older package versions). `report: null` when nothing matches.
|
|
141
|
-
*
|
|
142
|
-
* The strict (sessionId-equals) match always wins. The tolerant
|
|
143
|
-
* fallback's appetite is controlled by `opts.tolerantFallback` and
|
|
144
|
-
* `opts.maxFallbackAgeMs` — see `FindReportOptions`. The selection
|
|
145
|
-
* result carries enough context (`fallbackAdopted`, `staleRejected`)
|
|
146
|
-
* for the caller to be loud about non-strict adoptions.
|
|
147
|
-
*/
|
|
148
|
-
export declare function selectReportForSession(reports: PersistedReport[], sessionId: string, opts?: FindReportOptions): FindReportSelection;
|
|
149
|
-
/**
|
|
150
|
-
* The NEWEST report whose `sessionId` strictly equals `sessionId`, or
|
|
151
|
-
* `null` when the newest-first list has none. Deliberately NOT a thin
|
|
152
|
-
* wrapper over {@link selectReportForSession}: it stops at the first
|
|
153
|
-
* strict match and never consults the sessionId-null tolerant fallback.
|
|
154
|
-
*
|
|
155
|
-
* Written for the PreToolUse hook's auto-approval path
|
|
156
|
-
* (agent-tasks/74b4b17d, ADR
|
|
157
|
-
* docs/decisions/2026-08-27-ug-auto-mode-approval.md, Option A condition
|
|
158
|
-
* 3), where both of the fallback's properties are unacceptable:
|
|
159
|
-
*
|
|
160
|
-
* - A sessionId-null report is adopted by whichever session asks, so
|
|
161
|
-
* the fallback would let a report bound to no session at all mint a
|
|
162
|
-
* marker for THIS one. The auto path has no operator to confirm that
|
|
163
|
-
* adoption the way `harness approve understanding` does.
|
|
164
|
-
* - Eligibility is evaluated on the newest report ONLY. The caller
|
|
165
|
-
* checks `approvalStatus === "pending"` on whatever this returns; if
|
|
166
|
-
* the newest strict-session report was already consumed, the session
|
|
167
|
-
* is ineligible even when an older `pending` report is still on disk.
|
|
168
|
-
* Scanning further down the list for some other pending report is
|
|
169
|
-
* exactly the re-mint this design forbids.
|
|
170
|
-
*/
|
|
171
|
-
export declare function selectNewestStrictSessionReport(reports: PersistedReport[], sessionId: string): PersistedReport | null;
|
|
172
|
-
/**
|
|
173
|
-
* Back-compat wrapper around `selectReportForSession` for callers that
|
|
174
|
-
* only need the report (the gate read and expiry paths).
|
|
175
|
-
*/
|
|
176
|
-
export declare function findLatestReportForSession(reports: PersistedReport[], sessionId: string, opts?: FindReportOptions): PersistedReport | null;
|
|
177
|
-
/**
|
|
178
|
-
* `detail` is not an inert log line: both PreToolUse hooks embed it
|
|
179
|
-
* verbatim into their block `reason`, and the Codex hook additionally
|
|
180
|
-
* writes it to stderr, the block-reason surface an operator reads
|
|
181
|
-
* directly. The report file's basename and its `approvedAt` field both
|
|
182
|
-
* come from a JSON file whose content the gated agent controls (it is
|
|
183
|
-
* only unsigned evidence, task 7402301d), so neither is trusted
|
|
184
|
-
* verbatim here: control characters (including newlines, which could
|
|
185
|
-
* forge extra `reason:`-looking lines) are replaced with a space and
|
|
186
|
-
* the result is capped so one field cannot blow out the surface.
|
|
187
|
-
*/
|
|
188
|
-
export declare function sanitizeDetailValue(value: string): string;
|
|
189
|
-
/**
|
|
190
|
-
* What the gate learns from the persisted report: EVIDENCE, never
|
|
191
|
-
* authority (task 7402301d). Until that task the report was the second
|
|
192
|
-
* of two equal approval sources ("either source approves"), consulted
|
|
193
|
-
* right after a forged marker had been rejected, and it was unsigned: an
|
|
194
|
-
* attacker with any write primitive the `Edit|Write|Bash` blocker
|
|
195
|
-
* matcher does not cover forged an approval with ONE unsigned JSON write
|
|
196
|
-
* (no session id, no key read needed, since the gate-read fallback adopts
|
|
197
|
-
* a sessionId-less report for any session). Gate-time approval authority
|
|
198
|
-
* now flows ONLY through the HMAC-signed marker (`checkOperatorApprovalMarkers`);
|
|
199
|
-
* this shape deliberately has no `approved` field so a hook cannot read
|
|
200
|
-
* an allow decision out of it by accident.
|
|
201
|
-
*/
|
|
202
|
-
export interface PersistedReportEvidence {
|
|
203
|
-
/**
|
|
204
|
-
* True when the selected report's on-disk `approvalStatus` is
|
|
205
|
-
* `"approved"`. Diagnostic only: an approved-looking report with no
|
|
206
|
-
* signed marker behind it is exactly the forgery shape this field must
|
|
207
|
-
* never be allowed to open the gate for. `detail` carries the
|
|
208
|
-
* `UNSIGNED_REPORT_APPROVAL_REJECTED` phrase in that case.
|
|
209
|
-
*/
|
|
210
|
-
claimsApproved: boolean;
|
|
211
|
-
detail: string;
|
|
212
|
-
report: PersistedReport | null;
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Flip the latest matching persisted report's approvalStatus to
|
|
216
|
-
* `expired` so the audit record agrees with the cleared marker
|
|
217
|
-
* (harness/1ee26e77 follow-up: post-tool-use expiry was marker-only; the
|
|
218
|
-
* persisted report at .understanding-gate/reports/ silently kept
|
|
219
|
-
* satisfying the gate even after task_finish deleted the marker. Since
|
|
220
|
-
* task 7402301d the report carries no gate authority at all, so this flip
|
|
221
|
-
* is audit hygiene rather than a second gate closure).
|
|
222
|
-
*
|
|
223
|
-
* Atomic rewrite. Preserves the rest of the report body so the audit
|
|
224
|
-
* trail (the operator's actual Understanding text + previous approval
|
|
225
|
-
* timestamps) stays intact; only the status fields change.
|
|
226
|
-
*
|
|
227
|
-
* Returns `{ ok: true, filePath, previousStatus }` on success,
|
|
228
|
-
* `{ ok: false, reason }` when no matching report exists or rewrite
|
|
229
|
-
* failed. Non-throwing: caller (post-tool-use hook) uses this as a
|
|
230
|
-
* best-effort cleanup so a missing report dir or unrelated I/O issue
|
|
231
|
-
* does not escalate into a session-breaking hook failure.
|
|
232
|
-
*/
|
|
233
|
-
export declare function expirePersistedReport(reportsDir: string, sessionId: string, now?: Date, trigger?: string): {
|
|
234
|
-
ok: true;
|
|
235
|
-
filePath: string;
|
|
236
|
-
previousStatus: string | null;
|
|
237
|
-
} | {
|
|
238
|
-
ok: false;
|
|
239
|
-
reason: string;
|
|
240
|
-
};
|
|
241
|
-
/**
|
|
242
|
-
* Gate-side EVIDENCE probe of the persisted report (task 7402301d). Both
|
|
243
|
-
* PreToolUse hooks call this after the signed-marker check has NOT
|
|
244
|
-
* matched, purely to (a) put a precise reason into the block diagnostic
|
|
245
|
-
* and (b) tell "no report at all" (`report: null`, which gates the
|
|
246
|
-
* parse-error lookup) apart from "a report exists but is pending".
|
|
247
|
-
*
|
|
248
|
-
* It never returns an approval. The selection still uses the tolerant
|
|
249
|
-
* sessionId-null fallback (`"any"`, no age limit) so the diagnostic keeps
|
|
250
|
-
* naming a legacy session's own sessionId-less report; that leniency is
|
|
251
|
-
* harmless now because nothing here can open the gate. A report whose
|
|
252
|
-
* on-disk status is `approved` yields `claimsApproved: true` with the
|
|
253
|
-
* `UNSIGNED_REPORT_APPROVAL_REJECTED` phrase in `detail`, the distinct
|
|
254
|
-
* audit signal for a report-side forgery attempt (or an approval that
|
|
255
|
-
* bypassed `harness approve understanding`, e.g. the standalone
|
|
256
|
-
* `understanding-gate approve` CLI, which writes no signed marker).
|
|
257
|
-
*/
|
|
258
|
-
export declare function checkPersistedReport(reportsDir: string, sessionId: string): PersistedReportEvidence;
|
|
259
|
-
/**
|
|
260
|
-
* `approval expired because <event> at <time>` for a report a PostToolUse
|
|
261
|
-
* boundary expired (`expirePersistedReport` stamps `expiredBy` and
|
|
262
|
-
* `expiredAt`), `undefined` for any other report, including an older one or
|
|
263
|
-
* one a package producer wrote that carries no `expiredBy`. Both values come
|
|
264
|
-
* from a JSON file the gated agent can write, so both pass
|
|
265
|
-
* `sanitizeDetailValue`.
|
|
266
|
-
*/
|
|
267
|
-
export declare function describeBoundaryExpiry(report: Pick<PersistedReport, "approvalStatus" | "expiredBy" | "expiredAt">): string | undefined;
|
|
268
|
-
/**
|
|
269
|
-
* Largest report file, in bytes, the canonical hash reads from disk (1 MiB).
|
|
270
|
-
* Every `*.json` entry of the reports directory reaches the hash through the
|
|
271
|
-
* gate-read scan, and the agent can write that directory, so without a bound
|
|
272
|
-
* a planted file of a few hundred megabytes made the hook run out of heap or
|
|
273
|
-
* past its time budget instead of deciding (a hook that dies or overruns is a
|
|
274
|
-
* non-blocking error for the runtime). A real report is a few kilobytes, far
|
|
275
|
-
* below the cap. A file over the cap matches nothing at gate read, and both
|
|
276
|
-
* producers refuse to approve such a report.
|
|
277
|
-
*/
|
|
278
|
-
export declare const MAX_HASHED_REPORT_BYTES: number;
|
|
279
|
-
/**
|
|
280
|
-
* Budget the gate-read hash scan spends before it gives up (32 MiB), charged
|
|
281
|
-
* per `*.json` entry as the larger of the bytes read and
|
|
282
|
-
* {@link MIN_SCAN_ENTRY_COST_BYTES}. The per-file cap bounds one file, not
|
|
283
|
-
* their number: 160 planted 1 MiB key-heavy files took 15.9 to 17.6 s of scan
|
|
284
|
-
* time, past the 15 s PreToolUse budget, and a hook past its budget is a
|
|
285
|
-
* non-blocking error for the runtime (an allow). Charging bytes alone left the
|
|
286
|
-
* entry count open: entries that cost no bytes (tiny files, directories named
|
|
287
|
-
* `*.json`, files over the cap, unreadable ones) still cost an open each, and
|
|
288
|
-
* 400k tiny files took about 22 s of CPU. A scan that spent the budget without
|
|
289
|
-
* finding every wanted hash stops and the check fails closed with the mismatch
|
|
290
|
-
* reason. With the floor the scan opens at most 8192 entries and reads about
|
|
291
|
-
* 32 MiB (the last file read may add up to the 1 MiB per-file cap), whichever
|
|
292
|
-
* the entries are. Real reports are a few kilobytes, so the budget covers
|
|
293
|
-
* thousands of them. The scan reads the newest file first, which is where the
|
|
294
|
-
* approved report usually is.
|
|
295
|
-
*
|
|
296
|
-
* The other full-directory reads on the PreToolUse path spend the same
|
|
297
|
-
* budget with the same floor, each its own (a fresh {@link ReadBudget} per
|
|
298
|
-
* listing, not one shared across the hook call): the evidence read, the
|
|
299
|
-
* auto-approval precondition listing, the subagent-delegation lookup and the
|
|
300
|
-
* parse-error log lookup each read at most about 32 MiB, and none opens an
|
|
301
|
-
* entry once the directory holds more than {@link MAX_HOOK_LISTING_ENTRIES}.
|
|
302
|
-
*/
|
|
303
|
-
export declare const MAX_HASH_SCAN_BYTES: number;
|
|
304
|
-
/**
|
|
305
|
-
* Least a `*.json` entry is charged against {@link MAX_HASH_SCAN_BYTES}
|
|
306
|
-
* whatever the read returned (4 KiB, about one real report), so entries that
|
|
307
|
-
* read nothing or little still spend the budget at a rate that bounds their
|
|
308
|
-
* count: 32 MiB / 4 KiB = 8192 entries.
|
|
309
|
-
*/
|
|
310
|
-
export declare const MIN_SCAN_ENTRY_COST_BYTES = 4096;
|
|
311
|
-
/**
|
|
312
|
-
* Most entries (8192, the hash scan's budget divided by its per-entry floor)
|
|
313
|
-
* a PreToolUse-path reader accepts in one agent-writable directory. The hash
|
|
314
|
-
* scan stops at its budget, but four more readers on the same hook path used
|
|
315
|
-
* to open every entry (the evidence read, the auto-approval precondition
|
|
316
|
-
* listing, the subagent-delegation lookup, the parse-error log lookup), so a
|
|
317
|
-
* directory of hundreds of thousands of planted entries took the hook past the
|
|
318
|
-
* 15 s PreToolUse budget, which the runtime treats as an allow (measured at
|
|
319
|
-
* 400k planted entries: 408195 opens and 28.9 s of CPU in the Claude Code
|
|
320
|
-
* hook). The count alone left each entry readable up to the 1 MiB per-file
|
|
321
|
-
* cap, so every one of those readers also charges the entries it reads against
|
|
322
|
-
* {@link MAX_HASH_SCAN_BYTES} (see {@link ReadBudget}).
|
|
323
|
-
*
|
|
324
|
-
* A reader does not take a newest window of such a directory: a partial view
|
|
325
|
-
* would let a hidden newer entry change a selection (an auto-approval would
|
|
326
|
-
* adopt an older pending report while a newer, hidden one is already
|
|
327
|
-
* approved). Past either bound (more entries, or more report data than the
|
|
328
|
-
* byte budget) it returns nothing and reports the directory as too large to
|
|
329
|
-
* read, and each reader treats that as no evidence: the evidence read
|
|
330
|
-
* reports no report, the auto-approval path declines, the delegation lookup
|
|
331
|
-
* captures nothing and the parse-error lookup finds nothing. None of them
|
|
332
|
-
* allows. The directory listing stops as soon as the bound is crossed. See
|
|
333
|
-
* {@link listDirNamesBounded}.
|
|
334
|
-
*/
|
|
335
|
-
export declare const MAX_HOOK_LISTING_ENTRIES: number;
|
|
336
|
-
/** Result of {@link listDirNamesBounded}. */
|
|
337
|
-
export interface BoundedDirNames {
|
|
338
|
-
/** Entry names that end with the suffix, in ascending byte order; empty when `truncated`. */
|
|
339
|
-
names: string[];
|
|
340
|
-
/** True when the directory holds more matching entries than `maxEntries`, or more entries in all than `maxScanned`. */
|
|
341
|
-
truncated: boolean;
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* Names under `dir` ending in `suffix`, or none and `truncated: true` when
|
|
345
|
-
* there are more than `maxEntries` of them. The one listing the bounded
|
|
346
|
-
* PreToolUse-path readers share, so the bound lives in one place; a missing or
|
|
347
|
-
* unreadable directory lists nothing and is not `truncated`.
|
|
348
|
-
*
|
|
349
|
-
* The listing reads the directory one entry at a time and stops as soon as
|
|
350
|
-
* `maxEntries + 1` matching names have been seen, or `maxScanned` entries of
|
|
351
|
-
* any name (default: {@link HOOK_LISTING_SCAN_FACTOR} times `maxEntries`),
|
|
352
|
-
* so millions of planted names, matching or not, cost a bounded number of
|
|
353
|
-
* directory reads and no allocation of their names. The directory handle is
|
|
354
|
-
* always closed. An unbounded `maxEntries` reads the whole directory. The
|
|
355
|
-
* names come back in ascending byte order (the `fs.readdirSync` order), not
|
|
356
|
-
* in the filesystem's iteration order.
|
|
357
|
-
*/
|
|
358
|
-
export declare function listDirNamesBounded(dir: string, suffix: string, maxEntries: number, maxScanned?: number): BoundedDirNames;
|
|
359
|
-
/** Result of {@link walkContainerDepth}. */
|
|
360
|
-
export interface ContainerDepthWalk {
|
|
361
|
-
/** True when some array/object nests deeper than the walk's `max` levels. */
|
|
362
|
-
tooDeep: boolean;
|
|
363
|
-
/** Values the walk took off its stack: the root plus every array/object below it. */
|
|
364
|
-
visited: number;
|
|
365
|
-
}
|
|
366
|
-
/**
|
|
367
|
-
* Iterative walk over the arrays and objects of `value` (the value itself is
|
|
368
|
-
* level 1) that stops at the first one nested deeper than `max` levels.
|
|
369
|
-
* Iterative, so the walk itself cannot overflow the stack. Only arrays and
|
|
370
|
-
* objects are pushed: a scalar child (string, number, boolean, null) cannot
|
|
371
|
-
* nest, so a wide array of scalars costs no stack slot per element, and
|
|
372
|
-
* `visited` counts the root plus the containers below it. Exported for tests.
|
|
373
|
-
*/
|
|
374
|
-
export declare function walkContainerDepth(value: unknown, max: number): ContainerDepthWalk;
|
|
375
|
-
/**
|
|
376
|
-
* The hash an approval marker signs as its `reportContentHash`, and the one
|
|
377
|
-
* the gate recomputes at read time (task fa423e9b): sha256 over a key-sorted
|
|
378
|
-
* JSON serialisation of the parsed report with the lifecycle fields in
|
|
379
|
-
* `LIFECYCLE_REPORT_FIELDS` removed. A raw-bytes hash cannot do this job: the
|
|
380
|
-
* producers hash before `rewriteReportApproved` re-serialises the file and
|
|
381
|
-
* `expirePersistedReport` rewrites it again, so the raw bytes of an untouched
|
|
382
|
-
* report never match what the marker signed. One function on purpose, shared
|
|
383
|
-
* by both producers (`harness approve understanding`, the auto-approval path)
|
|
384
|
-
* and the verifier.
|
|
385
|
-
*
|
|
386
|
-
* Total: returns null instead of throwing for a report nested deeper than
|
|
387
|
-
* `MAX_CANONICAL_REPORT_DEPTH`. The verifier counts such a file as one that
|
|
388
|
-
* matches nothing; both producers refuse to approve such a report, so no
|
|
389
|
-
* marker is ever signed without a content binding because of it. Report
|
|
390
|
-
* files reach it only after {@link readReportFileBounded} bounded their type
|
|
391
|
-
* and size (the gate-read scan and `harness approve understanding` through
|
|
392
|
-
* {@link hashReportFile}, the auto-approval path directly).
|
|
393
|
-
*/
|
|
394
|
-
export declare function canonicalReportHash(report: Record<string, unknown>): string | null;
|
|
395
|
-
/** Why {@link readReportFileBounded} returned no content. */
|
|
396
|
-
export type ReportFileReadFailure = "unreadable" | "not-regular" | "too-large" | "grew" | "over-budget";
|
|
397
|
-
/**
|
|
398
|
-
* Bytes a bounded multi-entry reader has spent against
|
|
399
|
-
* {@link MAX_HASH_SCAN_BYTES}; pass one object to every
|
|
400
|
-
* {@link readReportFileBounded} call of the same listing.
|
|
401
|
-
*/
|
|
402
|
-
export interface ReadBudget {
|
|
403
|
-
spent: number;
|
|
404
|
-
}
|
|
405
|
-
export type BoundedReportRead = {
|
|
406
|
-
ok: true;
|
|
407
|
-
raw: string;
|
|
408
|
-
mtimeMs: number;
|
|
409
|
-
} | {
|
|
410
|
-
ok: false;
|
|
411
|
-
reason: ReportFileReadFailure;
|
|
412
|
-
detail: string;
|
|
413
|
-
};
|
|
414
|
-
/**
|
|
415
|
-
* Read a report file for hashing, bounded by type and size. This is the one
|
|
416
|
-
* read every canonical report hash goes through: the gate-read scan (via
|
|
417
|
-
* {@link hashReportFile}) and both producers. The path is opened once,
|
|
418
|
-
* read-only and non-blocking (`O_NONBLOCK`: opening a FIFO with no writer
|
|
419
|
-
* returns at once instead of waiting for one); its type and size come from
|
|
420
|
-
* `fstat` on that descriptor, and the content is read through the same
|
|
421
|
-
* descriptor, so nothing can be swapped in between (no separate stat of the
|
|
422
|
-
* path, which a symlink flipped to a FIFO used to race). Refused without
|
|
423
|
-
* reading: anything that is not a regular file, and a file larger than
|
|
424
|
-
* `MAX_HASHED_REPORT_BYTES`. The read stops one byte past the fstat size
|
|
425
|
-
* (never more than the cap plus one byte); a file that grows into that byte
|
|
426
|
-
* while being read is refused too. The descriptor is always closed. Never
|
|
427
|
-
* throws.
|
|
428
|
-
*
|
|
429
|
-
* `opts.noFollow` adds `O_NOFOLLOW` to the open: a path that is a symbolic
|
|
430
|
-
* link (whatever it points at, a dangling link included) is refused as
|
|
431
|
-
* not-regular by the open itself (`ELOOP`), with no earlier `lstat` for a
|
|
432
|
-
* swap to race. Off by default, so every hook read keeps following links
|
|
433
|
-
* exactly as before; `harness approve understanding` turns it on.
|
|
434
|
-
*
|
|
435
|
-
* `opts.budget` charges the read against {@link MAX_HASH_SCAN_BYTES} the way
|
|
436
|
-
* the hash scan does (the larger of the `fstat` size and
|
|
437
|
-
* {@link MIN_SCAN_ENTRY_COST_BYTES} per entry, taken before the read); once
|
|
438
|
-
* the budget is spent the call opens nothing and returns `over-budget`.
|
|
439
|
-
*/
|
|
440
|
-
export declare function readReportFileBounded(filePath: string, opts?: {
|
|
441
|
-
noFollow?: boolean;
|
|
442
|
-
budget?: ReadBudget;
|
|
443
|
-
}): BoundedReportRead;
|
|
444
|
-
/** Why a report file has no canonical hash. */
|
|
445
|
-
export type UnhashableReportReason = ReportFileReadFailure | "not-json-object" | "too-deep";
|
|
446
|
-
export type ReportFileHash = {
|
|
447
|
-
ok: true;
|
|
448
|
-
hash: string;
|
|
449
|
-
} | {
|
|
450
|
-
ok: false;
|
|
451
|
-
reason: UnhashableReportReason;
|
|
452
|
-
detail: string;
|
|
453
|
-
};
|
|
454
|
-
/**
|
|
455
|
-
* Canonical hash of the report file at `filePath`, read through
|
|
456
|
-
* {@link readReportFileBounded}, or why it has none: not a regular file, over
|
|
457
|
-
* `MAX_HASHED_REPORT_BYTES`, unreadable, grown while read, not a JSON object,
|
|
458
|
-
* or nested too deeply. `harness approve understanding` refuses a report on
|
|
459
|
-
* any of these (the `detail` is its message); the gate-read scan counts such
|
|
460
|
-
* a file as one that matches nothing. Never throws.
|
|
461
|
-
*/
|
|
462
|
-
export declare function hashReportFile(filePath: string, opts?: {
|
|
463
|
-
noFollow?: boolean;
|
|
464
|
-
}): ReportFileHash;
|
|
465
|
-
/** Canonical hash of the report file at `filePath` ({@link hashReportFile}); null when it has none. */
|
|
466
|
-
export declare function canonicalReportHashOfFile(filePath: string, opts?: {
|
|
467
|
-
noFollow?: boolean;
|
|
468
|
-
}): string | null;
|
|
469
|
-
/** Marker kind whose signed report hash the gate checks. */
|
|
470
|
-
export type ApprovalMarkerKind = "task" | "session";
|
|
471
|
-
/** One matched marker's signed `reportContentHash`, tagged with its kind. */
|
|
472
|
-
export interface MarkerReportBinding {
|
|
473
|
-
kind: ApprovalMarkerKind;
|
|
474
|
-
reportContentHash: string | null;
|
|
475
|
-
}
|
|
476
|
-
export type ApprovedReportHashVerification = {
|
|
477
|
-
ok: true;
|
|
478
|
-
kind: ApprovalMarkerKind;
|
|
479
|
-
} | {
|
|
480
|
-
ok: false;
|
|
481
|
-
detail: string;
|
|
482
|
-
};
|
|
483
|
-
/**
|
|
484
|
-
* Gate-read cross-check of a matched approval marker against the persisted
|
|
485
|
-
* reports (task fa423e9b). Both PreToolUse hooks call it after
|
|
486
|
-
* `checkOperatorApprovalMarkers` matched, through `verifyMatchedMarkerReport`.
|
|
487
|
-
*
|
|
488
|
-
* Rule: a marker with a non-null signed `reportContentHash` is valid iff at
|
|
489
|
-
* least one parseable report file in `reportsDir` (any session, any
|
|
490
|
-
* `approvalStatus`) has a canonical hash equal to it. The hash already
|
|
491
|
-
* leaves the lifecycle fields out, so approving, expiring or re-approving
|
|
492
|
-
* the report never changes it. The signed hash therefore proves one thing:
|
|
493
|
-
* the content the operator approved is still on disk unmodified. Editing
|
|
494
|
-
* that file (in place, by swap, by symlink, by an unparseable rewrite)
|
|
495
|
-
* removes the only match and the marker stops opening the gate. Comparing
|
|
496
|
-
* against the session's newest approved report instead would deny
|
|
497
|
-
* legitimate approvals (a newer report approved for the same claim, two
|
|
498
|
-
* sessions on one claim) and would let a swap pass by moving the swapped
|
|
499
|
-
* report out of the selection.
|
|
500
|
-
*
|
|
501
|
-
* Bounded input: only a regular file of at most `MAX_HASHED_REPORT_BYTES`
|
|
502
|
-
* (1 MiB) that parses as a JSON object nested at most 64 levels deep has a
|
|
503
|
-
* canonical hash, read through {@link readReportFileBounded} (opened
|
|
504
|
-
* non-blocking, typed and sized by `fstat` on the open descriptor, read
|
|
505
|
-
* through it). Every other `*.json` entry (a FIFO, a directory, a device, a
|
|
506
|
-
* symlink to one of them, a file over the cap, an unreadable, unparseable or
|
|
507
|
-
* too deeply nested file) still counts as a report file but matches nothing,
|
|
508
|
-
* so it can neither open the gate nor make the scan block, run out of
|
|
509
|
-
* memory or die instead of deciding.
|
|
510
|
-
*
|
|
511
|
-
* Residuals: (1) the check proves only that some file carries the approved
|
|
512
|
-
* content. Any regular `*.json` file within the size cap whose content
|
|
513
|
-
* equals it keeps a match, whether it was kept before the edit (a copy) or
|
|
514
|
-
* re-created after it (the agent wrote that content, so it can write it
|
|
515
|
-
* again), and the marker still opens the gate. (2) A reports directory that
|
|
516
|
-
* is empty, unreadable or holds no `*.json` entry at all (every report
|
|
517
|
-
* deleted, the directory made unreadable, the reports renamed) falls back to
|
|
518
|
-
* the "no report file" allow, the same as before this check existed. The
|
|
519
|
-
* marker and the operator's approval itself are untouched in both cases;
|
|
520
|
-
* only the audit trail loses its claim to be the approved content. (3) The
|
|
521
|
-
* cap bounds each file, not their number, so the scan charges every `*.json`
|
|
522
|
-
* entry at least `MIN_SCAN_ENTRY_COST_BYTES` against `MAX_HASH_SCAN_BYTES`
|
|
523
|
-
* (bytes read or the floor, whichever is larger, whatever the read returned):
|
|
524
|
-
* past the budget the check denies with the mismatch reason (fail closed).
|
|
525
|
-
* That bounds the entries opened (8192) and the bytes read (about 32 MiB, the
|
|
526
|
-
* last file read may add up to the 1 MiB per-file cap). The directory listing
|
|
527
|
-
* is bounded as well ({@link listDirNamesBounded}, one entry at a time): past
|
|
528
|
-
* {@link MAX_HOOK_LISTING_ENTRIES} `*.json` entries, or twice that many entries
|
|
529
|
-
* of any name, the check opens nothing and denies with a reason that names the
|
|
530
|
-
* bound and the remedy (fail closed), so the listing cost is bounded by that
|
|
531
|
-
* count however many names are planted. Two costs remain. A legitimate
|
|
532
|
-
* approval whose report sits behind that much newer report data (by name,
|
|
533
|
-
* descending) is denied; re-approving writes a new, newest report and recovers
|
|
534
|
-
* only when the newer entries are real reports: planted `*.json` names that
|
|
535
|
-
* sort after the timestamped report names (for example names starting with a
|
|
536
|
-
* letter) stay newer than any new report and keep denying until removed (the
|
|
537
|
-
* same holds past the entry bound, where the scan does not start at all).
|
|
538
|
-
* A reports directory with more entries than the bound is denied even when the
|
|
539
|
-
* approved report is among them, until entries are removed by hand. The hash
|
|
540
|
-
* scan is not the whole hook: the other full-directory reads on it (the
|
|
541
|
-
* evidence read, the auto-approval listing, the delegation lookup and the
|
|
542
|
-
* parse-error lookup) list the directory entry by entry and stop once
|
|
543
|
-
* {@link MAX_HOOK_LISTING_ENTRIES} entries are crossed, and charge the entries
|
|
544
|
-
* they read against the same byte budget; past either bound they open or read
|
|
545
|
-
* nothing more and fail closed.
|
|
546
|
-
*
|
|
547
|
-
* Removing the approved report while other report files remain is a deny:
|
|
548
|
-
* nothing on disk carries the signed content any more. `harness gc --apply`
|
|
549
|
-
* can do that legitimately: it ages approved reports out by their createdAt
|
|
550
|
-
* but markers by their file mtime, so a report written long before its
|
|
551
|
-
* approval can go while the marker stays. Re-approving recovers.
|
|
552
|
-
*
|
|
553
|
-
* `primary` is the marker that satisfied the gate (task-scoped first),
|
|
554
|
-
* `fallback` a session marker that matched behind a task marker. The
|
|
555
|
-
* fallback is consulted only when the primary fails the check, so a task
|
|
556
|
-
* marker signed for another report does not hide a session marker that
|
|
557
|
-
* verifies. Unchanged behaviour: a null hash on the accepted marker (no
|
|
558
|
-
* report resolved, or `--force` over a report nested too deeply to hash,
|
|
559
|
-
* never one over the size cap) and a reports directory with no
|
|
560
|
-
* `*.json` entry at all both allow. A forced approval of a hashable report
|
|
561
|
-
* signs its hash and is checked like any other.
|
|
562
|
-
*
|
|
563
|
-
* The `detail` is the block reason. It names the failing marker kind and the
|
|
564
|
-
* one-command fix, which is also the single migration step for a marker
|
|
565
|
-
* written before the canonical hash existed. It carries no report-derived
|
|
566
|
-
* value, so nothing in it needs sanitising.
|
|
567
|
-
*/
|
|
568
|
-
export declare function verifyApprovedReportHash(reportsDir: string, primary: MarkerReportBinding, fallback?: MarkerReportBinding | null): ApprovedReportHashVerification;
|
|
569
|
-
/**
|
|
570
|
-
* Why a `*.json` entry of the reports directory is absent from a bounded
|
|
571
|
-
* listing: it could not be read through {@link readReportFileBounded}.
|
|
572
|
-
*/
|
|
573
|
-
export interface SkippedReportEntry {
|
|
574
|
-
filePath: string;
|
|
575
|
-
reason: ReportFileReadFailure;
|
|
576
|
-
detail: string;
|
|
577
|
-
}
|
|
578
|
-
/**
|
|
579
|
-
* {@link listPersistedReports} for every read a PreToolUse hook (or the
|
|
580
|
-
* PostToolUse boundary) makes of the reports directory. The directory holds
|
|
581
|
-
* files the gated agent can write, so every entry is opened once through
|
|
582
|
-
* {@link readReportFileBounded}: non-blocking, typed and sized by `fstat` on
|
|
583
|
-
* the open descriptor, read through it. A `*.json` entry that is not a
|
|
584
|
-
* regular file (a FIFO, a directory, a device, a symlink to one of them), is
|
|
585
|
-
* over `MAX_HASHED_REPORT_BYTES`, cannot be opened or read, or grows while it
|
|
586
|
-
* is read is left out of `reports`, as if it were not there, and recorded in
|
|
587
|
-
* `skipped`: it can neither block the hook nor run it out of memory. There is
|
|
588
|
-
* no separate stat of the path (a symlink flipped to a FIFO between that stat
|
|
589
|
-
* and the read used to hang the read), and the modification time comes from
|
|
590
|
-
* the same descriptor.
|
|
591
|
-
*
|
|
592
|
-
* A caller that must not let the selection fall back to an older report when
|
|
593
|
-
* a newer one is unreadable (the auto-approval precondition) declines when
|
|
594
|
-
* `skipped` is not empty. The operator commands read through this listing as
|
|
595
|
-
* well, so a planted oversized or non-regular entry cannot crash or hang
|
|
596
|
-
* them, and they still see it: `harness approve understanding` refuses
|
|
597
|
-
* while `skipped` is not empty (it passes `refuseSymlinks`, which also
|
|
598
|
-
* refuses a symbolic link at the open, whatever it points at), and
|
|
599
|
-
* `harness gc` reports each skipped entry and leaves it in place.
|
|
600
|
-
*
|
|
601
|
-
* Placement: this block sits at the end of the file, and
|
|
602
|
-
* {@link readPersistedReport} takes the already-read text (`boundedRaw`), so
|
|
603
|
-
* the line numbers the decision record
|
|
604
|
-
* docs/decisions/2026-08-27-ug-auto-mode-approval.md cites in this file stay
|
|
605
|
-
* put (tests/decisions-citations-resolve.test.ts pins them).
|
|
606
|
-
*/
|
|
607
|
-
export declare function listPersistedReportsBoundedWithSkips(dir: string, opts?: {
|
|
608
|
-
refuseSymlinks?: boolean;
|
|
609
|
-
maxEntries?: number;
|
|
610
|
-
}): {
|
|
611
|
-
reports: PersistedReport[];
|
|
612
|
-
skipped: SkippedReportEntry[];
|
|
613
|
-
/** True when `opts.maxEntries` was set and the directory holds more `*.json` entries, or more report data than the byte budget; no report is returned. */
|
|
614
|
-
truncated: boolean;
|
|
615
|
-
/** Why the listing was `truncated`, as a clause that follows the subject ("holds more than ..."); empty otherwise. */
|
|
616
|
-
truncatedDetail: string;
|
|
617
|
-
};
|
|
618
|
-
/**
|
|
619
|
-
* {@link listPersistedReportsBoundedWithSkips} without the skipped entries,
|
|
620
|
-
* for the callers that treat a skipped entry as no evidence
|
|
621
|
-
* ({@link checkPersistedReport}, {@link expirePersistedReport}). Expiry acts
|
|
622
|
-
* on the newest report that was within the cap, so an oversized newest
|
|
623
|
-
* approved report is left as it is and the next in-cap one is expired.
|
|
624
|
-
*/
|
|
625
|
-
export declare function listPersistedReportsBounded(dir: string): PersistedReport[];
|