@lannguyensi/harness 0.63.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.
Files changed (702) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/README.md +46 -42
  3. package/dist/cli/add/index.js +17 -21
  4. package/dist/cli/add/index.js.map +1 -1
  5. package/dist/cli/adopt/derive.d.ts +2 -2
  6. package/dist/cli/adopt/derive.js +2 -19
  7. package/dist/cli/adopt/derive.js.map +1 -1
  8. package/dist/cli/adopt/index.d.ts +1 -1
  9. package/dist/cli/adopt/index.js +1 -12
  10. package/dist/cli/adopt/index.js.map +1 -1
  11. package/dist/cli/apply/apply.d.ts +20 -35
  12. package/dist/cli/apply/apply.js +61 -136
  13. package/dist/cli/apply/apply.js.map +1 -1
  14. package/dist/cli/apply/generate-codex-config.js +10 -58
  15. package/dist/cli/apply/generate-codex-config.js.map +1 -1
  16. package/dist/cli/apply/generate-memory-index.js +1 -2
  17. package/dist/cli/apply/generate-memory-index.js.map +1 -1
  18. package/dist/cli/apply/generate-opencode-config.d.ts +2 -10
  19. package/dist/cli/apply/generate-opencode-config.js +74 -113
  20. package/dist/cli/apply/generate-opencode-config.js.map +1 -1
  21. package/dist/cli/apply/generate-settings.d.ts +11 -64
  22. package/dist/cli/apply/generate-settings.js +27 -132
  23. package/dist/cli/apply/generate-settings.js.map +1 -1
  24. package/dist/cli/apply/index.d.ts +1 -1
  25. package/dist/cli/apply/index.js +1 -1
  26. package/dist/cli/apply/index.js.map +1 -1
  27. package/dist/cli/apply/install-codex-config.d.ts +153 -1
  28. package/dist/cli/apply/install-codex-config.js +445 -70
  29. package/dist/cli/apply/install-codex-config.js.map +1 -1
  30. package/dist/cli/apply/next-steps.d.ts +7 -0
  31. package/dist/cli/apply/next-steps.js +13 -1
  32. package/dist/cli/apply/next-steps.js.map +1 -1
  33. package/dist/cli/bounded-stdin.d.ts +0 -23
  34. package/dist/cli/bounded-stdin.js +2 -49
  35. package/dist/cli/bounded-stdin.js.map +1 -1
  36. package/dist/cli/describe.d.ts +1 -1
  37. package/dist/cli/describe.js +0 -3
  38. package/dist/cli/describe.js.map +1 -1
  39. package/dist/cli/diff/engine.d.ts +0 -11
  40. package/dist/cli/diff/engine.js +1 -17
  41. package/dist/cli/diff/engine.js.map +1 -1
  42. package/dist/cli/diff/index.js +14 -25
  43. package/dist/cli/diff/index.js.map +1 -1
  44. package/dist/cli/doctor/claude-mcp.d.ts +4 -19
  45. package/dist/cli/doctor/claude-mcp.js +11 -22
  46. package/dist/cli/doctor/claude-mcp.js.map +1 -1
  47. package/dist/cli/doctor/codex.d.ts +12 -14
  48. package/dist/cli/doctor/codex.js +31 -144
  49. package/dist/cli/doctor/codex.js.map +1 -1
  50. package/dist/cli/doctor/format.js +23 -338
  51. package/dist/cli/doctor/format.js.map +1 -1
  52. package/dist/cli/doctor/hook-liveness.d.ts +56 -0
  53. package/dist/cli/doctor/hook-liveness.js +455 -0
  54. package/dist/cli/doctor/hook-liveness.js.map +1 -0
  55. package/dist/cli/doctor/index.d.ts +13 -87
  56. package/dist/cli/doctor/index.js +57 -705
  57. package/dist/cli/doctor/index.js.map +1 -1
  58. package/dist/cli/doctor/opencode.d.ts +2 -1
  59. package/dist/cli/doctor/opencode.js.map +1 -1
  60. package/dist/cli/doctor/types.d.ts +21 -378
  61. package/dist/cli/doctor/types.js.map +1 -1
  62. package/dist/cli/drain-stdio.d.ts +31 -0
  63. package/dist/cli/drain-stdio.js +76 -0
  64. package/dist/cli/drain-stdio.js.map +1 -0
  65. package/dist/cli/export.d.ts +3 -1
  66. package/dist/cli/export.js +7 -16
  67. package/dist/cli/export.js.map +1 -1
  68. package/dist/cli/gate/codex-disable.d.ts +29 -0
  69. package/dist/cli/gate/codex-disable.js +195 -0
  70. package/dist/cli/gate/codex-disable.js.map +1 -0
  71. package/dist/cli/gate/codex-enable.d.ts +41 -0
  72. package/dist/cli/gate/codex-enable.js +127 -0
  73. package/dist/cli/gate/codex-enable.js.map +1 -0
  74. package/dist/cli/gate/codex-snapshot.d.ts +208 -0
  75. package/dist/cli/gate/codex-snapshot.js +402 -0
  76. package/dist/cli/gate/codex-snapshot.js.map +1 -0
  77. package/dist/cli/gate/disable.d.ts +9 -0
  78. package/dist/cli/gate/disable.js +263 -28
  79. package/dist/cli/gate/disable.js.map +1 -1
  80. package/dist/cli/gate/enable.d.ts +26 -6
  81. package/dist/cli/gate/enable.js +152 -80
  82. package/dist/cli/gate/enable.js.map +1 -1
  83. package/dist/cli/gate/link-chain.d.ts +53 -0
  84. package/dist/cli/gate/link-chain.js +122 -0
  85. package/dist/cli/gate/link-chain.js.map +1 -0
  86. package/dist/cli/gate/snapshot.d.ts +289 -12
  87. package/dist/cli/gate/snapshot.js +481 -22
  88. package/dist/cli/gate/snapshot.js.map +1 -1
  89. package/dist/cli/index.d.ts +0 -9
  90. package/dist/cli/index.js +15 -2607
  91. package/dist/cli/index.js.map +1 -1
  92. package/dist/cli/init/composer.d.ts +3 -6
  93. package/dist/cli/init/composer.js +6 -370
  94. package/dist/cli/init/composer.js.map +1 -1
  95. package/dist/cli/init/dependencies.d.ts +1 -2
  96. package/dist/cli/init/dependencies.js +4 -80
  97. package/dist/cli/init/dependencies.js.map +1 -1
  98. package/dist/cli/init/detect.js +5 -4
  99. package/dist/cli/init/detect.js.map +1 -1
  100. package/dist/cli/init/interactive.d.ts +1 -23
  101. package/dist/cli/init/interactive.js +33 -247
  102. package/dist/cli/init/interactive.js.map +1 -1
  103. package/dist/cli/init/profiles.d.ts +2 -2
  104. package/dist/cli/init/profiles.js +51 -243
  105. package/dist/cli/init/profiles.js.map +1 -1
  106. package/dist/cli/init/templates.d.ts +2 -37
  107. package/dist/cli/init/templates.js +25 -1237
  108. package/dist/cli/init/templates.js.map +1 -1
  109. package/dist/cli/list.d.ts +1 -1
  110. package/dist/cli/list.js +1 -38
  111. package/dist/cli/list.js.map +1 -1
  112. package/dist/cli/loader.d.ts +15 -1
  113. package/dist/cli/loader.js +56 -39
  114. package/dist/cli/loader.js.map +1 -1
  115. package/dist/cli/main.js +7 -2
  116. package/dist/cli/main.js.map +1 -1
  117. package/dist/cli/migrate-home/index.js +2 -2
  118. package/dist/cli/migrate-home/index.js.map +1 -1
  119. package/dist/cli/pack/add.js +1 -1
  120. package/dist/cli/pack/add.js.map +1 -1
  121. package/dist/cli/pack/hook-bootstrap.d.ts +5 -164
  122. package/dist/cli/pack/hook-bootstrap.js +15 -291
  123. package/dist/cli/pack/hook-bootstrap.js.map +1 -1
  124. package/dist/cli/pack/hook-branch-protection.d.ts +28 -21
  125. package/dist/cli/pack/hook-branch-protection.js +365 -340
  126. package/dist/cli/pack/hook-branch-protection.js.map +1 -1
  127. package/dist/cli/pack/index.d.ts +0 -1
  128. package/dist/cli/pack/index.js +0 -1
  129. package/dist/cli/pack/index.js.map +1 -1
  130. package/dist/cli/pack/list.js +1 -6
  131. package/dist/cli/pack/list.js.map +1 -1
  132. package/dist/cli/pack/mutate.d.ts +7 -9
  133. package/dist/cli/pack/mutate.js +6 -9
  134. package/dist/cli/pack/mutate.js.map +1 -1
  135. package/dist/cli/pack/reseed.d.ts +2 -2
  136. package/dist/cli/pack/reseed.js +16 -22
  137. package/dist/cli/pack/reseed.js.map +1 -1
  138. package/dist/cli/register-gate-group.d.ts +5 -0
  139. package/dist/cli/register-gate-group.js +348 -0
  140. package/dist/cli/register-gate-group.js.map +1 -0
  141. package/dist/cli/register-inspect-group.d.ts +6 -0
  142. package/dist/cli/register-inspect-group.js +189 -0
  143. package/dist/cli/register-inspect-group.js.map +1 -0
  144. package/dist/cli/register-operator-lifecycle.d.ts +5 -0
  145. package/dist/cli/register-operator-lifecycle.js +20 -0
  146. package/dist/cli/register-operator-lifecycle.js.map +1 -0
  147. package/dist/cli/register-pack-group.d.ts +5 -0
  148. package/dist/cli/register-pack-group.js +134 -0
  149. package/dist/cli/register-pack-group.js.map +1 -0
  150. package/dist/cli/register-setup-group.d.ts +5 -0
  151. package/dist/cli/register-setup-group.js +495 -0
  152. package/dist/cli/register-setup-group.js.map +1 -0
  153. package/dist/cli/remove/index.d.ts +0 -14
  154. package/dist/cli/remove/index.js +2 -115
  155. package/dist/cli/remove/index.js.map +1 -1
  156. package/dist/cli/remove/mutate.d.ts +0 -2
  157. package/dist/cli/remove/mutate.js +1 -19
  158. package/dist/cli/remove/mutate.js.map +1 -1
  159. package/dist/cli/remove/register.d.ts +5 -0
  160. package/dist/cli/remove/register.js +25 -0
  161. package/dist/cli/remove/register.js.map +1 -0
  162. package/dist/cli/shell-quote.d.ts +7 -0
  163. package/dist/cli/shell-quote.js +17 -0
  164. package/dist/cli/shell-quote.js.map +1 -0
  165. package/dist/cli/uninstall/index.d.ts +4 -2
  166. package/dist/cli/uninstall/index.js +15 -7
  167. package/dist/cli/uninstall/index.js.map +1 -1
  168. package/dist/cli/uninstall/register.d.ts +5 -0
  169. package/dist/cli/uninstall/register.js +171 -0
  170. package/dist/cli/uninstall/register.js.map +1 -0
  171. package/dist/cli/uninstall/snapshot.d.ts +15 -0
  172. package/dist/cli/uninstall/snapshot.js +38 -0
  173. package/dist/cli/uninstall/snapshot.js.map +1 -1
  174. package/dist/cli/validate/checks.d.ts +0 -77
  175. package/dist/cli/validate/checks.js +3 -1049
  176. package/dist/cli/validate/checks.js.map +1 -1
  177. package/dist/cli/validate/index.js +19 -15
  178. package/dist/cli/validate/index.js.map +1 -1
  179. package/dist/index.d.ts +0 -3
  180. package/dist/index.js +0 -3
  181. package/dist/index.js.map +1 -1
  182. package/dist/io/claude-mcp.d.ts +1 -1
  183. package/dist/io/claude-mcp.js +27 -14
  184. package/dist/io/claude-mcp.js.map +1 -1
  185. package/dist/io/harness-lock.js +2 -2
  186. package/dist/io/harness-lock.js.map +1 -1
  187. package/dist/io/lock.d.ts +0 -26
  188. package/dist/io/lock.js +10 -27
  189. package/dist/io/lock.js.map +1 -1
  190. package/dist/io/merge-settings.js +6 -4
  191. package/dist/io/merge-settings.js.map +1 -1
  192. package/dist/io/project-name.d.ts +22 -39
  193. package/dist/io/project-name.js +25 -42
  194. package/dist/io/project-name.js.map +1 -1
  195. package/dist/io/read-regular-file.d.ts +103 -40
  196. package/dist/io/read-regular-file.js +196 -35
  197. package/dist/io/read-regular-file.js.map +1 -1
  198. package/dist/io/restart-hints.js +3 -6
  199. package/dist/io/restart-hints.js.map +1 -1
  200. package/dist/io/version-compare.d.ts +1 -3
  201. package/dist/io/version-compare.js +1 -3
  202. package/dist/io/version-compare.js.map +1 -1
  203. package/dist/io/write-regular-file.d.ts +30 -0
  204. package/dist/io/write-regular-file.js +85 -0
  205. package/dist/io/write-regular-file.js.map +1 -0
  206. package/dist/overrides/index.d.ts +1 -0
  207. package/dist/overrides/index.js +1 -0
  208. package/dist/overrides/index.js.map +1 -1
  209. package/dist/overrides/merge-layers.d.ts +43 -0
  210. package/dist/overrides/merge-layers.js +76 -0
  211. package/dist/overrides/merge-layers.js.map +1 -0
  212. package/dist/overrides/merge.d.ts +16 -0
  213. package/dist/overrides/merge.js +21 -8
  214. package/dist/overrides/merge.js.map +1 -1
  215. package/dist/policy-packs/builtin/branch-protection-runtime.d.ts +4 -69
  216. package/dist/policy-packs/builtin/branch-protection-runtime.js +12 -84
  217. package/dist/policy-packs/builtin/branch-protection-runtime.js.map +1 -1
  218. package/dist/policy-packs/builtin/branch-protection.d.ts +7 -30
  219. package/dist/policy-packs/builtin/branch-protection.js +56 -89
  220. package/dist/policy-packs/builtin/branch-protection.js.map +1 -1
  221. package/dist/policy-packs/config-check.d.ts +7 -5
  222. package/dist/policy-packs/config-check.js +2 -2
  223. package/dist/policy-packs/config-check.js.map +1 -1
  224. package/dist/policy-packs/expand.d.ts +1 -3
  225. package/dist/policy-packs/expand.js +5 -42
  226. package/dist/policy-packs/expand.js.map +1 -1
  227. package/dist/policy-packs/index.d.ts +3 -3
  228. package/dist/policy-packs/index.js +2 -2
  229. package/dist/policy-packs/index.js.map +1 -1
  230. package/dist/policy-packs/registry.d.ts +9 -38
  231. package/dist/policy-packs/registry.js +5 -65
  232. package/dist/policy-packs/registry.js.map +1 -1
  233. package/dist/policy-packs/runtime.d.ts +0 -4
  234. package/dist/policy-packs/runtime.js +9 -22
  235. package/dist/policy-packs/runtime.js.map +1 -1
  236. package/dist/policy-packs/types.d.ts +0 -19
  237. package/dist/policy-packs/ux-compare.d.ts +1 -11
  238. package/dist/policy-packs/ux-compare.js +6 -42
  239. package/dist/policy-packs/ux-compare.js.map +1 -1
  240. package/dist/policy-packs/ux-drift-check.d.ts +5 -5
  241. package/dist/policy-packs/ux-drift-check.js +17 -22
  242. package/dist/policy-packs/ux-drift-check.js.map +1 -1
  243. package/dist/policy-packs/version-check.d.ts +5 -26
  244. package/dist/policy-packs/version-check.js +19 -74
  245. package/dist/policy-packs/version-check.js.map +1 -1
  246. package/dist/probes/memory.d.ts +1 -1
  247. package/dist/probes/memory.js +1 -1
  248. package/dist/probes/memory.js.map +1 -1
  249. package/dist/runtime/agent-facing.d.ts +9 -0
  250. package/dist/runtime/agent-facing.js +28 -14
  251. package/dist/runtime/agent-facing.js.map +1 -1
  252. package/dist/runtime/bounded-text.d.ts +15 -0
  253. package/dist/runtime/bounded-text.js +27 -0
  254. package/dist/runtime/bounded-text.js.map +1 -0
  255. package/dist/runtime/git-branch.d.ts +125 -0
  256. package/dist/runtime/git-branch.js +381 -0
  257. package/dist/runtime/git-branch.js.map +1 -0
  258. package/dist/runtime/hermetic-spawn-guard.d.ts +2 -2
  259. package/dist/runtime/hermetic-spawn-guard.js +24 -34
  260. package/dist/runtime/hermetic-spawn-guard.js.map +1 -1
  261. package/dist/runtime/home-dir.js +3 -2
  262. package/dist/runtime/home-dir.js.map +1 -1
  263. package/dist/runtime/tool-name-aliases.d.ts +0 -6
  264. package/dist/runtime/tool-name-aliases.js +5 -18
  265. package/dist/runtime/tool-name-aliases.js.map +1 -1
  266. package/dist/schema/grounding.d.ts +7 -54
  267. package/dist/schema/grounding.js +10 -12
  268. package/dist/schema/grounding.js.map +1 -1
  269. package/dist/schema/hooks.d.ts +39 -136
  270. package/dist/schema/hooks.js +3 -6
  271. package/dist/schema/hooks.js.map +1 -1
  272. package/dist/schema/index.d.ts +114 -3828
  273. package/dist/schema/index.js +41 -80
  274. package/dist/schema/index.js.map +1 -1
  275. package/dist/schema/memory.d.ts +54 -131
  276. package/dist/schema/memory.js +2 -2
  277. package/dist/schema/memory.js.map +1 -1
  278. package/dist/schema/policy-packs.d.ts +3 -45
  279. package/dist/schema/policy-packs.js +7 -13
  280. package/dist/schema/policy-packs.js.map +1 -1
  281. package/dist/schema/policy-ux.d.ts +7 -0
  282. package/dist/schema/policy-ux.js +18 -0
  283. package/dist/schema/policy-ux.js.map +1 -0
  284. package/dist/schema/removed-keys.d.ts +185 -0
  285. package/dist/schema/removed-keys.js +531 -0
  286. package/dist/schema/removed-keys.js.map +1 -0
  287. package/dist/schema/tools.d.ts +30 -268
  288. package/dist/schema/tools.js +4 -4
  289. package/dist/schema/tools.js.map +1 -1
  290. package/package.json +5 -16
  291. package/dist/cli/approve/branch-protection.d.ts +0 -69
  292. package/dist/cli/approve/branch-protection.js +0 -144
  293. package/dist/cli/approve/branch-protection.js.map +0 -1
  294. package/dist/cli/approve/risk.d.ts +0 -112
  295. package/dist/cli/approve/risk.js +0 -197
  296. package/dist/cli/approve/risk.js.map +0 -1
  297. package/dist/cli/approve/stdin-report.d.ts +0 -57
  298. package/dist/cli/approve/stdin-report.js +0 -145
  299. package/dist/cli/approve/stdin-report.js.map +0 -1
  300. package/dist/cli/approve/understanding.d.ts +0 -410
  301. package/dist/cli/approve/understanding.js +0 -996
  302. package/dist/cli/approve/understanding.js.map +0 -1
  303. package/dist/cli/audit.d.ts +0 -80
  304. package/dist/cli/audit.js +0 -252
  305. package/dist/cli/audit.js.map +0 -1
  306. package/dist/cli/delegate/index.d.ts +0 -76
  307. package/dist/cli/delegate/index.js +0 -443
  308. package/dist/cli/delegate/index.js.map +0 -1
  309. package/dist/cli/doctor/auto-approve-mode.d.ts +0 -37
  310. package/dist/cli/doctor/auto-approve-mode.js +0 -80
  311. package/dist/cli/doctor/auto-approve-mode.js.map +0 -1
  312. package/dist/cli/doctor/bypass-without-auto-approve.d.ts +0 -38
  313. package/dist/cli/doctor/bypass-without-auto-approve.js +0 -95
  314. package/dist/cli/doctor/bypass-without-auto-approve.js.map +0 -1
  315. package/dist/cli/doctor/codex-config-drift.d.ts +0 -28
  316. package/dist/cli/doctor/codex-config-drift.js +0 -240
  317. package/dist/cli/doctor/codex-config-drift.js.map +0 -1
  318. package/dist/cli/doctor/rogue-ledger.d.ts +0 -53
  319. package/dist/cli/doctor/rogue-ledger.js +0 -153
  320. package/dist/cli/doctor/rogue-ledger.js.map +0 -1
  321. package/dist/cli/doctor/session-start-preflight-setup-version.d.ts +0 -83
  322. package/dist/cli/doctor/session-start-preflight-setup-version.js +0 -114
  323. package/dist/cli/doctor/session-start-preflight-setup-version.js.map +0 -1
  324. package/dist/cli/doctor/settings-drift.d.ts +0 -25
  325. package/dist/cli/doctor/settings-drift.js +0 -213
  326. package/dist/cli/doctor/settings-drift.js.map +0 -1
  327. package/dist/cli/doctor/toolchain-parity.d.ts +0 -63
  328. package/dist/cli/doctor/toolchain-parity.js +0 -154
  329. package/dist/cli/doctor/toolchain-parity.js.map +0 -1
  330. package/dist/cli/doctor/ug-auto-approvals.d.ts +0 -40
  331. package/dist/cli/doctor/ug-auto-approvals.js +0 -91
  332. package/dist/cli/doctor/ug-auto-approvals.js.map +0 -1
  333. package/dist/cli/doctor/ug-delegations.d.ts +0 -26
  334. package/dist/cli/doctor/ug-delegations.js +0 -121
  335. package/dist/cli/doctor/ug-delegations.js.map +0 -1
  336. package/dist/cli/doctor/ug-inflight.d.ts +0 -35
  337. package/dist/cli/doctor/ug-inflight.js +0 -57
  338. package/dist/cli/doctor/ug-inflight.js.map +0 -1
  339. package/dist/cli/doctor/understanding-mode-env.d.ts +0 -51
  340. package/dist/cli/doctor/understanding-mode-env.js +0 -98
  341. package/dist/cli/doctor/understanding-mode-env.js.map +0 -1
  342. package/dist/cli/dry-run.d.ts +0 -46
  343. package/dist/cli/dry-run.js +0 -250
  344. package/dist/cli/dry-run.js.map +0 -1
  345. package/dist/cli/event-input.d.ts +0 -28
  346. package/dist/cli/event-input.js +0 -73
  347. package/dist/cli/event-input.js.map +0 -1
  348. package/dist/cli/explain-action.d.ts +0 -20
  349. package/dist/cli/explain-action.js +0 -27
  350. package/dist/cli/explain-action.js.map +0 -1
  351. package/dist/cli/explain-policy.d.ts +0 -135
  352. package/dist/cli/explain-policy.js +0 -266
  353. package/dist/cli/explain-policy.js.map +0 -1
  354. package/dist/cli/explain.d.ts +0 -31
  355. package/dist/cli/explain.js +0 -159
  356. package/dist/cli/explain.js.map +0 -1
  357. package/dist/cli/gc/index.d.ts +0 -63
  358. package/dist/cli/gc/index.js +0 -566
  359. package/dist/cli/gc/index.js.map +0 -1
  360. package/dist/cli/pack/approve-escape.d.ts +0 -19
  361. package/dist/cli/pack/approve-escape.js +0 -190
  362. package/dist/cli/pack/approve-escape.js.map +0 -1
  363. package/dist/cli/pack/auto-approve-path.d.ts +0 -146
  364. package/dist/cli/pack/auto-approve-path.js +0 -462
  365. package/dist/cli/pack/auto-approve-path.js.map +0 -1
  366. package/dist/cli/pack/hook-codex-post-tool-use.d.ts +0 -25
  367. package/dist/cli/pack/hook-codex-post-tool-use.js +0 -160
  368. package/dist/cli/pack/hook-codex-post-tool-use.js.map +0 -1
  369. package/dist/cli/pack/hook-codex-pre-tool-use.d.ts +0 -48
  370. package/dist/cli/pack/hook-codex-pre-tool-use.js +0 -474
  371. package/dist/cli/pack/hook-codex-pre-tool-use.js.map +0 -1
  372. package/dist/cli/pack/hook-codex-stop.d.ts +0 -35
  373. package/dist/cli/pack/hook-codex-stop.js +0 -329
  374. package/dist/cli/pack/hook-codex-stop.js.map +0 -1
  375. package/dist/cli/pack/hook-codex-user-prompt-submit.d.ts +0 -24
  376. package/dist/cli/pack/hook-codex-user-prompt-submit.js +0 -93
  377. package/dist/cli/pack/hook-codex-user-prompt-submit.js.map +0 -1
  378. package/dist/cli/pack/hook-post-merge-gate-record.d.ts +0 -37
  379. package/dist/cli/pack/hook-post-merge-gate-record.js +0 -190
  380. package/dist/cli/pack/hook-post-merge-gate-record.js.map +0 -1
  381. package/dist/cli/pack/hook-post-merge-gate.d.ts +0 -34
  382. package/dist/cli/pack/hook-post-merge-gate.js +0 -277
  383. package/dist/cli/pack/hook-post-merge-gate.js.map +0 -1
  384. package/dist/cli/pack/hook-post-tool-use.d.ts +0 -45
  385. package/dist/cli/pack/hook-post-tool-use.js +0 -137
  386. package/dist/cli/pack/hook-post-tool-use.js.map +0 -1
  387. package/dist/cli/pack/hook-pre-tool-use.d.ts +0 -92
  388. package/dist/cli/pack/hook-pre-tool-use.js +0 -1328
  389. package/dist/cli/pack/hook-pre-tool-use.js.map +0 -1
  390. package/dist/cli/pack/hook-runtime-reality.d.ts +0 -63
  391. package/dist/cli/pack/hook-runtime-reality.js +0 -210
  392. package/dist/cli/pack/hook-runtime-reality.js.map +0 -1
  393. package/dist/cli/pack/hook-solution-acceptance-writeguard.d.ts +0 -32
  394. package/dist/cli/pack/hook-solution-acceptance-writeguard.js +0 -337
  395. package/dist/cli/pack/hook-solution-acceptance-writeguard.js.map +0 -1
  396. package/dist/cli/pack/hook-solution-acceptance.d.ts +0 -157
  397. package/dist/cli/pack/hook-solution-acceptance.js +0 -530
  398. package/dist/cli/pack/hook-solution-acceptance.js.map +0 -1
  399. package/dist/cli/pack/hook-stay-in-scope.d.ts +0 -37
  400. package/dist/cli/pack/hook-stay-in-scope.js +0 -128
  401. package/dist/cli/pack/hook-stay-in-scope.js.map +0 -1
  402. package/dist/cli/pack/hook-subagent-start.d.ts +0 -23
  403. package/dist/cli/pack/hook-subagent-start.js +0 -88
  404. package/dist/cli/pack/hook-subagent-start.js.map +0 -1
  405. package/dist/cli/pack/hook-subagent-stop.d.ts +0 -19
  406. package/dist/cli/pack/hook-subagent-stop.js +0 -41
  407. package/dist/cli/pack/hook-subagent-stop.js.map +0 -1
  408. package/dist/cli/pack/hook-track-active-claim.d.ts +0 -27
  409. package/dist/cli/pack/hook-track-active-claim.js +0 -275
  410. package/dist/cli/pack/hook-track-active-claim.js.map +0 -1
  411. package/dist/cli/pack/transcript-report-scan.d.ts +0 -71
  412. package/dist/cli/pack/transcript-report-scan.js +0 -359
  413. package/dist/cli/pack/transcript-report-scan.js.map +0 -1
  414. package/dist/cli/pack/understanding-report-schema-hint.d.ts +0 -26
  415. package/dist/cli/pack/understanding-report-schema-hint.js +0 -120
  416. package/dist/cli/pack/understanding-report-schema-hint.js.map +0 -1
  417. package/dist/cli/pack/upgrade.d.ts +0 -32
  418. package/dist/cli/pack/upgrade.js +0 -273
  419. package/dist/cli/pack/upgrade.js.map +0 -1
  420. package/dist/cli/pause/index.d.ts +0 -113
  421. package/dist/cli/pause/index.js +0 -251
  422. package/dist/cli/pause/index.js.map +0 -1
  423. package/dist/cli/pause-check.d.ts +0 -22
  424. package/dist/cli/pause-check.js +0 -54
  425. package/dist/cli/pause-check.js.map +0 -1
  426. package/dist/cli/policy/intercept.d.ts +0 -233
  427. package/dist/cli/policy/intercept.js +0 -1020
  428. package/dist/cli/policy/intercept.js.map +0 -1
  429. package/dist/cli/policy/risk-envelope-enrichment.d.ts +0 -40
  430. package/dist/cli/policy/risk-envelope-enrichment.js +0 -108
  431. package/dist/cli/policy/risk-envelope-enrichment.js.map +0 -1
  432. package/dist/cli/record/index.d.ts +0 -81
  433. package/dist/cli/record/index.js +0 -348
  434. package/dist/cli/record/index.js.map +0 -1
  435. package/dist/cli/resolve-env.d.ts +0 -32
  436. package/dist/cli/resolve-env.js +0 -47
  437. package/dist/cli/resolve-env.js.map +0 -1
  438. package/dist/cli/session-export/index.d.ts +0 -46
  439. package/dist/cli/session-export/index.js +0 -169
  440. package/dist/cli/session-export/index.js.map +0 -1
  441. package/dist/cli/session-export/redact.d.ts +0 -22
  442. package/dist/cli/session-export/redact.js +0 -47
  443. package/dist/cli/session-export/redact.js.map +0 -1
  444. package/dist/cli/session-export/transcript.d.ts +0 -24
  445. package/dist/cli/session-export/transcript.js +0 -164
  446. package/dist/cli/session-export/transcript.js.map +0 -1
  447. package/dist/cli/session-start/branch-check.d.ts +0 -18
  448. package/dist/cli/session-start/branch-check.js +0 -140
  449. package/dist/cli/session-start/branch-check.js.map +0 -1
  450. package/dist/cli/session-start/index.d.ts +0 -121
  451. package/dist/cli/session-start/index.js +0 -591
  452. package/dist/cli/session-start/index.js.map +0 -1
  453. package/dist/cli/session-start/shared-options.d.ts +0 -103
  454. package/dist/cli/session-start/shared-options.js +0 -107
  455. package/dist/cli/session-start/shared-options.js.map +0 -1
  456. package/dist/cli/session-start/stale-base-check.d.ts +0 -46
  457. package/dist/cli/session-start/stale-base-check.js +0 -352
  458. package/dist/cli/session-start/stale-base-check.js.map +0 -1
  459. package/dist/cli/session-start/toolchain-parity.d.ts +0 -267
  460. package/dist/cli/session-start/toolchain-parity.js +0 -797
  461. package/dist/cli/session-start/toolchain-parity.js.map +0 -1
  462. package/dist/cli/smoke/assertions.d.ts +0 -46
  463. package/dist/cli/smoke/assertions.js +0 -170
  464. package/dist/cli/smoke/assertions.js.map +0 -1
  465. package/dist/cli/smoke/index.d.ts +0 -76
  466. package/dist/cli/smoke/index.js +0 -245
  467. package/dist/cli/smoke/index.js.map +0 -1
  468. package/dist/cli/smoke/runner.d.ts +0 -55
  469. package/dist/cli/smoke/runner.js +0 -134
  470. package/dist/cli/smoke/runner.js.map +0 -1
  471. package/dist/cli/smoke/stream-parser.d.ts +0 -65
  472. package/dist/cli/smoke/stream-parser.js +0 -115
  473. package/dist/cli/smoke/stream-parser.js.map +0 -1
  474. package/dist/cli/test-risk.d.ts +0 -26
  475. package/dist/cli/test-risk.js +0 -34
  476. package/dist/cli/test-risk.js.map +0 -1
  477. package/dist/io/display-path.d.ts +0 -11
  478. package/dist/io/display-path.js +0 -29
  479. package/dist/io/display-path.js.map +0 -1
  480. package/dist/io/duration.d.ts +0 -5
  481. package/dist/io/duration.js +0 -50
  482. package/dist/io/duration.js.map +0 -1
  483. package/dist/io/extract.d.ts +0 -79
  484. package/dist/io/extract.js +0 -226
  485. package/dist/io/extract.js.map +0 -1
  486. package/dist/io/ledger-record.d.ts +0 -83
  487. package/dist/io/ledger-record.js +0 -301
  488. package/dist/io/ledger-record.js.map +0 -1
  489. package/dist/io/read-json-dir-entries.d.ts +0 -36
  490. package/dist/io/read-json-dir-entries.js +0 -48
  491. package/dist/io/read-json-dir-entries.js.map +0 -1
  492. package/dist/io/safe-json-parse.d.ts +0 -5
  493. package/dist/io/safe-json-parse.js +0 -21
  494. package/dist/io/safe-json-parse.js.map +0 -1
  495. package/dist/policies/index.d.ts +0 -5
  496. package/dist/policies/index.js +0 -6
  497. package/dist/policies/index.js.map +0 -1
  498. package/dist/policies/ledger-client.d.ts +0 -113
  499. package/dist/policies/ledger-client.js +0 -500
  500. package/dist/policies/ledger-client.js.map +0 -1
  501. package/dist/policies/producers.d.ts +0 -12
  502. package/dist/policies/producers.js +0 -61
  503. package/dist/policies/producers.js.map +0 -1
  504. package/dist/policies/requires.d.ts +0 -75
  505. package/dist/policies/requires.js +0 -240
  506. package/dist/policies/requires.js.map +0 -1
  507. package/dist/policies/timestamp.d.ts +0 -14
  508. package/dist/policies/timestamp.js +0 -36
  509. package/dist/policies/timestamp.js.map +0 -1
  510. package/dist/policy-packs/builtin/permission-profiles.d.ts +0 -11
  511. package/dist/policy-packs/builtin/permission-profiles.js +0 -74
  512. package/dist/policy-packs/builtin/permission-profiles.js.map +0 -1
  513. package/dist/policy-packs/builtin/post-merge-gate-runtime.d.ts +0 -286
  514. package/dist/policy-packs/builtin/post-merge-gate-runtime.js +0 -397
  515. package/dist/policy-packs/builtin/post-merge-gate-runtime.js.map +0 -1
  516. package/dist/policy-packs/builtin/post-merge-gate.d.ts +0 -56
  517. package/dist/policy-packs/builtin/post-merge-gate.js +0 -347
  518. package/dist/policy-packs/builtin/post-merge-gate.js.map +0 -1
  519. package/dist/policy-packs/builtin/solution-acceptance-reconnect.d.ts +0 -50
  520. package/dist/policy-packs/builtin/solution-acceptance-reconnect.js +0 -151
  521. package/dist/policy-packs/builtin/solution-acceptance-reconnect.js.map +0 -1
  522. package/dist/policy-packs/builtin/solution-acceptance-runtime.d.ts +0 -323
  523. package/dist/policy-packs/builtin/solution-acceptance-runtime.js +0 -672
  524. package/dist/policy-packs/builtin/solution-acceptance-runtime.js.map +0 -1
  525. package/dist/policy-packs/builtin/solution-acceptance.d.ts +0 -45
  526. package/dist/policy-packs/builtin/solution-acceptance.js +0 -226
  527. package/dist/policy-packs/builtin/solution-acceptance.js.map +0 -1
  528. package/dist/policy-packs/builtin/understanding-before-execution/active-claim.d.ts +0 -25
  529. package/dist/policy-packs/builtin/understanding-before-execution/active-claim.js +0 -94
  530. package/dist/policy-packs/builtin/understanding-before-execution/active-claim.js.map +0 -1
  531. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.d.ts +0 -35
  532. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.js +0 -86
  533. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.js.map +0 -1
  534. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve.d.ts +0 -210
  535. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve.js +0 -361
  536. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve.js.map +0 -1
  537. package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.d.ts +0 -304
  538. package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.js +0 -734
  539. package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.js.map +0 -1
  540. package/dist/policy-packs/builtin/understanding-before-execution/expiry-reason.d.ts +0 -36
  541. package/dist/policy-packs/builtin/understanding-before-execution/expiry-reason.js +0 -73
  542. package/dist/policy-packs/builtin/understanding-before-execution/expiry-reason.js.map +0 -1
  543. package/dist/policy-packs/builtin/understanding-before-execution/index.d.ts +0 -19
  544. package/dist/policy-packs/builtin/understanding-before-execution/index.js +0 -83
  545. package/dist/policy-packs/builtin/understanding-before-execution/index.js.map +0 -1
  546. package/dist/policy-packs/builtin/understanding-before-execution/inflight-records.d.ts +0 -135
  547. package/dist/policy-packs/builtin/understanding-before-execution/inflight-records.js +0 -618
  548. package/dist/policy-packs/builtin/understanding-before-execution/inflight-records.js.map +0 -1
  549. package/dist/policy-packs/builtin/understanding-before-execution/ledger.d.ts +0 -25
  550. package/dist/policy-packs/builtin/understanding-before-execution/ledger.js +0 -56
  551. package/dist/policy-packs/builtin/understanding-before-execution/ledger.js.map +0 -1
  552. package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.d.ts +0 -20
  553. package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.js +0 -93
  554. package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.js.map +0 -1
  555. package/dist/policy-packs/builtin/understanding-before-execution/markers.d.ts +0 -126
  556. package/dist/policy-packs/builtin/understanding-before-execution/markers.js +0 -245
  557. package/dist/policy-packs/builtin/understanding-before-execution/markers.js.map +0 -1
  558. package/dist/policy-packs/builtin/understanding-before-execution/measured-permission-modes.d.ts +0 -29
  559. package/dist/policy-packs/builtin/understanding-before-execution/measured-permission-modes.js +0 -82
  560. package/dist/policy-packs/builtin/understanding-before-execution/measured-permission-modes.js.map +0 -1
  561. package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.d.ts +0 -71
  562. package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.js +0 -175
  563. package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.js.map +0 -1
  564. package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.d.ts +0 -620
  565. package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.js +0 -1047
  566. package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.js.map +0 -1
  567. package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.d.ts +0 -128
  568. package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.js +0 -213
  569. package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.js.map +0 -1
  570. package/dist/policy-packs/builtin/understanding-before-execution/stay-in-scope-config.d.ts +0 -129
  571. package/dist/policy-packs/builtin/understanding-before-execution/stay-in-scope-config.js +0 -166
  572. package/dist/policy-packs/builtin/understanding-before-execution/stay-in-scope-config.js.map +0 -1
  573. package/dist/policy-packs/builtin/understanding-before-execution/task-markers.d.ts +0 -164
  574. package/dist/policy-packs/builtin/understanding-before-execution/task-markers.js +0 -275
  575. package/dist/policy-packs/builtin/understanding-before-execution/task-markers.js.map +0 -1
  576. package/dist/policy-packs/builtin/understanding-before-execution-runtime.d.ts +0 -1
  577. package/dist/policy-packs/builtin/understanding-before-execution-runtime.js +0 -10
  578. package/dist/policy-packs/builtin/understanding-before-execution-runtime.js.map +0 -1
  579. package/dist/policy-packs/builtin/understanding-before-execution.d.ts +0 -526
  580. package/dist/policy-packs/builtin/understanding-before-execution.js +0 -1074
  581. package/dist/policy-packs/builtin/understanding-before-execution.js.map +0 -1
  582. package/dist/policy-packs/permission-translator.d.ts +0 -9
  583. package/dist/policy-packs/permission-translator.js +0 -76
  584. package/dist/policy-packs/permission-translator.js.map +0 -1
  585. package/dist/runtime/action-envelope.d.ts +0 -64
  586. package/dist/runtime/action-envelope.js +0 -46
  587. package/dist/runtime/action-envelope.js.map +0 -1
  588. package/dist/runtime/approval-signing.d.ts +0 -111
  589. package/dist/runtime/approval-signing.js +0 -384
  590. package/dist/runtime/approval-signing.js.map +0 -1
  591. package/dist/runtime/bash-match-facts.d.ts +0 -60
  592. package/dist/runtime/bash-match-facts.js +0 -196
  593. package/dist/runtime/bash-match-facts.js.map +0 -1
  594. package/dist/runtime/bash-match-registry.d.ts +0 -112
  595. package/dist/runtime/bash-match-registry.js +0 -406
  596. package/dist/runtime/bash-match-registry.js.map +0 -1
  597. package/dist/runtime/bash-prefix-parse.d.ts +0 -31
  598. package/dist/runtime/bash-prefix-parse.js +0 -576
  599. package/dist/runtime/bash-prefix-parse.js.map +0 -1
  600. package/dist/runtime/command-normalize.d.ts +0 -658
  601. package/dist/runtime/command-normalize.js +0 -2410
  602. package/dist/runtime/command-normalize.js.map +0 -1
  603. package/dist/runtime/deletion-target-resolve.d.ts +0 -28
  604. package/dist/runtime/deletion-target-resolve.js +0 -1078
  605. package/dist/runtime/deletion-target-resolve.js.map +0 -1
  606. package/dist/runtime/destructive-shell-floor.d.ts +0 -19
  607. package/dist/runtime/destructive-shell-floor.js +0 -611
  608. package/dist/runtime/destructive-shell-floor.js.map +0 -1
  609. package/dist/runtime/environment-resolver.d.ts +0 -36
  610. package/dist/runtime/environment-resolver.js +0 -138
  611. package/dist/runtime/environment-resolver.js.map +0 -1
  612. package/dist/runtime/git-context.d.ts +0 -201
  613. package/dist/runtime/git-context.js +0 -422
  614. package/dist/runtime/git-context.js.map +0 -1
  615. package/dist/runtime/index.d.ts +0 -12
  616. package/dist/runtime/index.js +0 -13
  617. package/dist/runtime/index.js.map +0 -1
  618. package/dist/runtime/intercept.d.ts +0 -494
  619. package/dist/runtime/intercept.js +0 -1313
  620. package/dist/runtime/intercept.js.map +0 -1
  621. package/dist/runtime/kube-context.d.ts +0 -16
  622. package/dist/runtime/kube-context.js +0 -63
  623. package/dist/runtime/kube-context.js.map +0 -1
  624. package/dist/runtime/kubectl-target-parse.d.ts +0 -31
  625. package/dist/runtime/kubectl-target-parse.js +0 -249
  626. package/dist/runtime/kubectl-target-parse.js.map +0 -1
  627. package/dist/runtime/ledger-add.d.ts +0 -16
  628. package/dist/runtime/ledger-add.js +0 -150
  629. package/dist/runtime/ledger-add.js.map +0 -1
  630. package/dist/runtime/ledger-writer.d.ts +0 -27
  631. package/dist/runtime/ledger-writer.js +0 -46
  632. package/dist/runtime/ledger-writer.js.map +0 -1
  633. package/dist/runtime/pause-sentinel.d.ts +0 -60
  634. package/dist/runtime/pause-sentinel.js +0 -156
  635. package/dist/runtime/pause-sentinel.js.map +0 -1
  636. package/dist/runtime/pending-approval.d.ts +0 -23
  637. package/dist/runtime/pending-approval.js +0 -67
  638. package/dist/runtime/pending-approval.js.map +0 -1
  639. package/dist/runtime/read-only-bash.d.ts +0 -141
  640. package/dist/runtime/read-only-bash.js +0 -2204
  641. package/dist/runtime/read-only-bash.js.map +0 -1
  642. package/dist/runtime/recovery-git-commit.d.ts +0 -22
  643. package/dist/runtime/recovery-git-commit.js +0 -284
  644. package/dist/runtime/recovery-git-commit.js.map +0 -1
  645. package/dist/runtime/reject-malformed-session-id.d.ts +0 -8
  646. package/dist/runtime/reject-malformed-session-id.js +0 -16
  647. package/dist/runtime/reject-malformed-session-id.js.map +0 -1
  648. package/dist/runtime/risk-classifier.d.ts +0 -38
  649. package/dist/runtime/risk-classifier.js +0 -311
  650. package/dist/runtime/risk-classifier.js.map +0 -1
  651. package/dist/runtime/session-id.d.ts +0 -113
  652. package/dist/runtime/session-id.js +0 -193
  653. package/dist/runtime/session-id.js.map +0 -1
  654. package/dist/runtime/shell-word.d.ts +0 -62
  655. package/dist/runtime/shell-word.js +0 -410
  656. package/dist/runtime/shell-word.js.map +0 -1
  657. package/dist/runtime/task-providers/agent-tasks.d.ts +0 -103
  658. package/dist/runtime/task-providers/agent-tasks.js +0 -245
  659. package/dist/runtime/task-providers/agent-tasks.js.map +0 -1
  660. package/dist/runtime/when-eval.d.ts +0 -62
  661. package/dist/runtime/when-eval.js +0 -212
  662. package/dist/runtime/when-eval.js.map +0 -1
  663. package/dist/runtime/workflow-policies.d.ts +0 -207
  664. package/dist/runtime/workflow-policies.js +0 -596
  665. package/dist/runtime/workflow-policies.js.map +0 -1
  666. package/dist/schema/audit.d.ts +0 -71
  667. package/dist/schema/audit.js +0 -32
  668. package/dist/schema/audit.js.map +0 -1
  669. package/dist/schema/doctor.d.ts +0 -25
  670. package/dist/schema/doctor.js +0 -23
  671. package/dist/schema/doctor.js.map +0 -1
  672. package/dist/schema/environments.d.ts +0 -215
  673. package/dist/schema/environments.js +0 -101
  674. package/dist/schema/environments.js.map +0 -1
  675. package/dist/schema/extract.d.ts +0 -9
  676. package/dist/schema/extract.js +0 -86
  677. package/dist/schema/extract.js.map +0 -1
  678. package/dist/schema/permission-profiles.d.ts +0 -2292
  679. package/dist/schema/permission-profiles.js +0 -60
  680. package/dist/schema/permission-profiles.js.map +0 -1
  681. package/dist/schema/policies.d.ts +0 -974
  682. package/dist/schema/policies.js +0 -298
  683. package/dist/schema/policies.js.map +0 -1
  684. package/dist/schema/requires.d.ts +0 -131
  685. package/dist/schema/requires.js +0 -88
  686. package/dist/schema/requires.js.map +0 -1
  687. package/dist/schema/risk.d.ts +0 -144
  688. package/dist/schema/risk.js +0 -194
  689. package/dist/schema/risk.js.map +0 -1
  690. package/dist/schema/session-start-preflight.d.ts +0 -10
  691. package/dist/schema/session-start-preflight.js +0 -106
  692. package/dist/schema/session-start-preflight.js.map +0 -1
  693. package/dist/schema/stale-base-check.d.ts +0 -18
  694. package/dist/schema/stale-base-check.js +0 -37
  695. package/dist/schema/stale-base-check.js.map +0 -1
  696. package/dist/schema/toolchain-parity.d.ts +0 -21
  697. package/dist/schema/toolchain-parity.js +0 -48
  698. package/dist/schema/toolchain-parity.js.map +0 -1
  699. package/dist/schema/workflows.d.ts +0 -519
  700. package/dist/schema/workflows.js +0 -81
  701. package/dist/schema/workflows.js.map +0 -1
  702. package/scripts/runtime-reality-docker-probe.mjs +0 -71
@@ -1,620 +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). Three costs remain.
527
- * A legitimate approval whose report sits behind that much newer report data
528
- * (by name, descending) is denied; re-approving writes a new, newest report
529
- * and recovers only when the newer entries are real reports: planted `*.json`
530
- * names that sort after the timestamped report names (for example names
531
- * starting with a letter) stay newer than any new report and keep denying
532
- * until removed. The `readdir` plus name sort of the directory itself are not
533
- * charged, so a directory of millions of entries still costs that listing
534
- * before this scan starts (the scan runs when a signed marker is present). The
535
- * hash scan is not the whole hook: the other full-directory reads on it (the
536
- * evidence read, the auto-approval listing, the delegation lookup and the
537
- * parse-error lookup) list the directory entry by entry and stop once
538
- * {@link MAX_HOOK_LISTING_ENTRIES} entries are crossed, and charge the entries
539
- * they read against the same byte budget; past either bound they open or read
540
- * nothing more and fail closed.
541
- *
542
- * Removing the approved report while other report files remain is a deny:
543
- * nothing on disk carries the signed content any more. `harness gc --apply`
544
- * can do that legitimately: it ages approved reports out by their createdAt
545
- * but markers by their file mtime, so a report written long before its
546
- * approval can go while the marker stays. Re-approving recovers.
547
- *
548
- * `primary` is the marker that satisfied the gate (task-scoped first),
549
- * `fallback` a session marker that matched behind a task marker. The
550
- * fallback is consulted only when the primary fails the check, so a task
551
- * marker signed for another report does not hide a session marker that
552
- * verifies. Unchanged behaviour: a null hash on the accepted marker (no
553
- * report resolved, or `--force` over a report nested too deeply to hash,
554
- * never one over the size cap) and a reports directory with no
555
- * `*.json` entry at all both allow. A forced approval of a hashable report
556
- * signs its hash and is checked like any other.
557
- *
558
- * The `detail` is the block reason. It names the failing marker kind and the
559
- * one-command fix, which is also the single migration step for a marker
560
- * written before the canonical hash existed. It carries no report-derived
561
- * value, so nothing in it needs sanitising.
562
- */
563
- export declare function verifyApprovedReportHash(reportsDir: string, primary: MarkerReportBinding, fallback?: MarkerReportBinding | null): ApprovedReportHashVerification;
564
- /**
565
- * Why a `*.json` entry of the reports directory is absent from a bounded
566
- * listing: it could not be read through {@link readReportFileBounded}.
567
- */
568
- export interface SkippedReportEntry {
569
- filePath: string;
570
- reason: ReportFileReadFailure;
571
- detail: string;
572
- }
573
- /**
574
- * {@link listPersistedReports} for every read a PreToolUse hook (or the
575
- * PostToolUse boundary) makes of the reports directory. The directory holds
576
- * files the gated agent can write, so every entry is opened once through
577
- * {@link readReportFileBounded}: non-blocking, typed and sized by `fstat` on
578
- * the open descriptor, read through it. A `*.json` entry that is not a
579
- * regular file (a FIFO, a directory, a device, a symlink to one of them), is
580
- * over `MAX_HASHED_REPORT_BYTES`, cannot be opened or read, or grows while it
581
- * is read is left out of `reports`, as if it were not there, and recorded in
582
- * `skipped`: it can neither block the hook nor run it out of memory. There is
583
- * no separate stat of the path (a symlink flipped to a FIFO between that stat
584
- * and the read used to hang the read), and the modification time comes from
585
- * the same descriptor.
586
- *
587
- * A caller that must not let the selection fall back to an older report when
588
- * a newer one is unreadable (the auto-approval precondition) declines when
589
- * `skipped` is not empty. The operator commands read through this listing as
590
- * well, so a planted oversized or non-regular entry cannot crash or hang
591
- * them, and they still see it: `harness approve understanding` refuses
592
- * while `skipped` is not empty (it passes `refuseSymlinks`, which also
593
- * refuses a symbolic link at the open, whatever it points at), and
594
- * `harness gc` reports each skipped entry and leaves it in place.
595
- *
596
- * Placement: this block sits at the end of the file, and
597
- * {@link readPersistedReport} takes the already-read text (`boundedRaw`), so
598
- * the line numbers the decision record
599
- * docs/decisions/2026-08-27-ug-auto-mode-approval.md cites in this file stay
600
- * put (tests/decisions-citations-resolve.test.ts pins them).
601
- */
602
- export declare function listPersistedReportsBoundedWithSkips(dir: string, opts?: {
603
- refuseSymlinks?: boolean;
604
- maxEntries?: number;
605
- }): {
606
- reports: PersistedReport[];
607
- skipped: SkippedReportEntry[];
608
- /** 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. */
609
- truncated: boolean;
610
- /** Why the listing was `truncated`, as a clause that follows the subject ("holds more than ..."); empty otherwise. */
611
- truncatedDetail: string;
612
- };
613
- /**
614
- * {@link listPersistedReportsBoundedWithSkips} without the skipped entries,
615
- * for the callers that treat a skipped entry as no evidence
616
- * ({@link checkPersistedReport}, {@link expirePersistedReport}). Expiry acts
617
- * on the newest report that was within the cap, so an oversized newest
618
- * approved report is left as it is and the next in-cap one is expired.
619
- */
620
- export declare function listPersistedReportsBounded(dir: string): PersistedReport[];