approval-md 0.0.1 → 0.2.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 (722) hide show
  1. package/LICENSE +176 -0
  2. package/NOTICE +5 -0
  3. package/README.md +940 -4
  4. package/SPEC.md +476 -34
  5. package/cli.js +29 -3
  6. package/dist/src/adapters/agentmail.d.ts +426 -0
  7. package/dist/src/adapters/agentmail.js +1200 -0
  8. package/dist/src/adapters/agentmail.js.map +1 -0
  9. package/dist/src/adapters/conformance.d.ts +149 -0
  10. package/dist/src/adapters/conformance.js +461 -0
  11. package/dist/src/adapters/conformance.js.map +1 -0
  12. package/dist/src/adapters/contract.d.ts +628 -0
  13. package/dist/src/adapters/contract.js +1035 -0
  14. package/dist/src/adapters/contract.js.map +1 -0
  15. package/dist/src/adapters/email.d.ts +324 -0
  16. package/dist/src/adapters/email.js +749 -0
  17. package/dist/src/adapters/email.js.map +1 -0
  18. package/dist/src/adapters/env-passphrase.d.ts +93 -0
  19. package/dist/src/adapters/env-passphrase.js +132 -0
  20. package/dist/src/adapters/env-passphrase.js.map +1 -0
  21. package/dist/src/adapters/public.d.ts +11 -0
  22. package/dist/src/adapters/public.js +11 -0
  23. package/dist/src/adapters/public.js.map +1 -0
  24. package/dist/src/adapters/registry.d.ts +59 -0
  25. package/dist/src/adapters/registry.js +77 -0
  26. package/dist/src/adapters/registry.js.map +1 -0
  27. package/dist/src/adapters/smtp.d.ts +213 -0
  28. package/dist/src/adapters/smtp.js +499 -0
  29. package/dist/src/adapters/smtp.js.map +1 -0
  30. package/dist/src/adapters/vault-provider.d.ts +114 -0
  31. package/dist/src/adapters/vault-provider.js +161 -0
  32. package/dist/src/adapters/vault-provider.js.map +1 -0
  33. package/dist/src/adapters/zzz.d.ts +66 -0
  34. package/dist/src/adapters/zzz.js +299 -0
  35. package/dist/src/adapters/zzz.js.map +1 -0
  36. package/dist/src/channels/batch.d.ts +109 -0
  37. package/dist/src/channels/batch.js +121 -0
  38. package/dist/src/channels/batch.js.map +1 -0
  39. package/dist/src/channels/cli.d.ts +193 -0
  40. package/dist/src/channels/cli.js +468 -0
  41. package/dist/src/channels/cli.js.map +1 -0
  42. package/dist/src/channels/conformance.d.ts +92 -0
  43. package/dist/src/channels/conformance.js +445 -0
  44. package/dist/src/channels/conformance.js.map +1 -0
  45. package/dist/src/channels/contract.d.ts +623 -0
  46. package/dist/src/channels/contract.js +494 -0
  47. package/dist/src/channels/contract.js.map +1 -0
  48. package/dist/src/channels/payload-view.d.ts +35 -0
  49. package/dist/src/channels/payload-view.js +43 -0
  50. package/dist/src/channels/payload-view.js.map +1 -0
  51. package/dist/src/channels/render-queue.d.ts +149 -0
  52. package/dist/src/channels/render-queue.js +564 -0
  53. package/dist/src/channels/render-queue.js.map +1 -0
  54. package/dist/src/channels/tagging.d.ts +196 -0
  55. package/dist/src/channels/tagging.js +723 -0
  56. package/dist/src/channels/tagging.js.map +1 -0
  57. package/dist/src/channels/telegram.d.ts +1832 -0
  58. package/dist/src/channels/telegram.js +3190 -0
  59. package/dist/src/channels/telegram.js.map +1 -0
  60. package/dist/src/channels/web.d.ts +341 -0
  61. package/dist/src/channels/web.js +903 -0
  62. package/dist/src/channels/web.js.map +1 -0
  63. package/dist/src/cli/adapter.d.ts +90 -0
  64. package/dist/src/cli/adapter.js +288 -0
  65. package/dist/src/cli/adapter.js.map +1 -0
  66. package/dist/src/cli/amend.d.ts +59 -0
  67. package/dist/src/cli/amend.js +2171 -0
  68. package/dist/src/cli/amend.js.map +1 -0
  69. package/dist/src/cli/args.d.ts +43 -0
  70. package/dist/src/cli/args.js +86 -0
  71. package/dist/src/cli/args.js.map +1 -0
  72. package/dist/src/cli/attest.d.ts +41 -0
  73. package/dist/src/cli/attest.js +307 -0
  74. package/dist/src/cli/attest.js.map +1 -0
  75. package/dist/src/cli/audit-card.d.ts +62 -0
  76. package/dist/src/cli/audit-card.js +201 -0
  77. package/dist/src/cli/audit-card.js.map +1 -0
  78. package/dist/src/cli/audit.d.ts +59 -0
  79. package/dist/src/cli/audit.js +460 -0
  80. package/dist/src/cli/audit.js.map +1 -0
  81. package/dist/src/cli/channel-telegram.d.ts +806 -0
  82. package/dist/src/cli/channel-telegram.js +2063 -0
  83. package/dist/src/cli/channel-telegram.js.map +1 -0
  84. package/dist/src/cli/channel-web.d.ts +131 -0
  85. package/dist/src/cli/channel-web.js +357 -0
  86. package/dist/src/cli/channel-web.js.map +1 -0
  87. package/dist/src/cli/channel.d.ts +71 -0
  88. package/dist/src/cli/channel.js +438 -0
  89. package/dist/src/cli/channel.js.map +1 -0
  90. package/dist/src/cli/checkpoint-tap.d.ts +169 -0
  91. package/dist/src/cli/checkpoint-tap.js +238 -0
  92. package/dist/src/cli/checkpoint-tap.js.map +1 -0
  93. package/dist/src/cli/codex.d.ts +2 -0
  94. package/dist/src/cli/codex.js +172 -0
  95. package/dist/src/cli/codex.js.map +1 -0
  96. package/dist/src/cli/coverage.d.ts +61 -0
  97. package/dist/src/cli/coverage.js +343 -0
  98. package/dist/src/cli/coverage.js.map +1 -0
  99. package/dist/src/cli/daemon.d.ts +120 -0
  100. package/dist/src/cli/daemon.js +631 -0
  101. package/dist/src/cli/daemon.js.map +1 -0
  102. package/dist/src/cli/doctor.d.ts +129 -0
  103. package/dist/src/cli/doctor.js +2762 -0
  104. package/dist/src/cli/doctor.js.map +1 -0
  105. package/dist/src/cli/env.d.ts +65 -0
  106. package/dist/src/cli/env.js +302 -0
  107. package/dist/src/cli/env.js.map +1 -0
  108. package/dist/src/cli/execute.d.ts +202 -0
  109. package/dist/src/cli/execute.js +1682 -0
  110. package/dist/src/cli/execute.js.map +1 -0
  111. package/dist/src/cli/exit-codes.d.ts +73 -0
  112. package/dist/src/cli/exit-codes.js +82 -0
  113. package/dist/src/cli/exit-codes.js.map +1 -0
  114. package/dist/src/cli/feedback.d.ts +60 -0
  115. package/dist/src/cli/feedback.js +205 -0
  116. package/dist/src/cli/feedback.js.map +1 -0
  117. package/dist/src/cli/gate-window.d.ts +40 -0
  118. package/dist/src/cli/gate-window.js +294 -0
  119. package/dist/src/cli/gate-window.js.map +1 -0
  120. package/dist/src/cli/gate.d.ts +68 -0
  121. package/dist/src/cli/gate.js +557 -0
  122. package/dist/src/cli/gate.js.map +1 -0
  123. package/dist/src/cli/git-scope.d.ts +190 -0
  124. package/dist/src/cli/git-scope.js +295 -0
  125. package/dist/src/cli/git-scope.js.map +1 -0
  126. package/dist/src/cli/gloss-attach.d.ts +85 -0
  127. package/dist/src/cli/gloss-attach.js +107 -0
  128. package/dist/src/cli/gloss-attach.js.map +1 -0
  129. package/dist/src/cli/gloss-codex-child.d.ts +9 -0
  130. package/dist/src/cli/gloss-codex-child.js +149 -0
  131. package/dist/src/cli/gloss-codex-child.js.map +1 -0
  132. package/dist/src/cli/gloss-codex.d.ts +24 -0
  133. package/dist/src/cli/gloss-codex.js +255 -0
  134. package/dist/src/cli/gloss-codex.js.map +1 -0
  135. package/dist/src/cli/gloss-options.d.ts +42 -0
  136. package/dist/src/cli/gloss-options.js +79 -0
  137. package/dist/src/cli/gloss-options.js.map +1 -0
  138. package/dist/src/cli/gloss.d.ts +265 -0
  139. package/dist/src/cli/gloss.js +362 -0
  140. package/dist/src/cli/gloss.js.map +1 -0
  141. package/dist/src/cli/help.d.ts +103 -0
  142. package/dist/src/cli/help.js +2339 -0
  143. package/dist/src/cli/help.js.map +1 -0
  144. package/dist/src/cli/hook-codex.d.ts +78 -0
  145. package/dist/src/cli/hook-codex.js +167 -0
  146. package/dist/src/cli/hook-codex.js.map +1 -0
  147. package/dist/src/cli/hook.d.ts +331 -0
  148. package/dist/src/cli/hook.js +2849 -0
  149. package/dist/src/cli/hook.js.map +1 -0
  150. package/dist/src/cli/import.d.ts +35 -0
  151. package/dist/src/cli/import.js +175 -0
  152. package/dist/src/cli/import.js.map +1 -0
  153. package/dist/src/cli/init.d.ts +84 -0
  154. package/dist/src/cli/init.js +336 -0
  155. package/dist/src/cli/init.js.map +1 -0
  156. package/dist/src/cli/instructions.d.ts +23 -0
  157. package/dist/src/cli/instructions.js +262 -0
  158. package/dist/src/cli/instructions.js.map +1 -0
  159. package/dist/src/cli/journal.d.ts +41 -0
  160. package/dist/src/cli/journal.js +238 -0
  161. package/dist/src/cli/journal.js.map +1 -0
  162. package/dist/src/cli/log-advance.d.ts +287 -0
  163. package/dist/src/cli/log-advance.js +840 -0
  164. package/dist/src/cli/log-advance.js.map +1 -0
  165. package/dist/src/cli/log-anchor.d.ts +176 -0
  166. package/dist/src/cli/log-anchor.js +387 -0
  167. package/dist/src/cli/log-anchor.js.map +1 -0
  168. package/dist/src/cli/log-checkpoint.d.ts +22 -0
  169. package/dist/src/cli/log-checkpoint.js +128 -0
  170. package/dist/src/cli/log-checkpoint.js.map +1 -0
  171. package/dist/src/cli/log-sync.d.ts +243 -0
  172. package/dist/src/cli/log-sync.js +849 -0
  173. package/dist/src/cli/log-sync.js.map +1 -0
  174. package/dist/src/cli/log-verbs.d.ts +16 -0
  175. package/dist/src/cli/log-verbs.js +360 -0
  176. package/dist/src/cli/log-verbs.js.map +1 -0
  177. package/dist/src/cli/long-help.d.ts +70 -0
  178. package/dist/src/cli/long-help.js +148 -0
  179. package/dist/src/cli/long-help.js.map +1 -0
  180. package/dist/src/cli/main.d.ts +77 -0
  181. package/dist/src/cli/main.js +1206 -0
  182. package/dist/src/cli/main.js.map +1 -0
  183. package/dist/src/cli/mcp.d.ts +52 -0
  184. package/dist/src/cli/mcp.js +306 -0
  185. package/dist/src/cli/mcp.js.map +1 -0
  186. package/dist/src/cli/paths.d.ts +56 -0
  187. package/dist/src/cli/paths.js +79 -0
  188. package/dist/src/cli/paths.js.map +1 -0
  189. package/dist/src/cli/payload.d.ts +58 -0
  190. package/dist/src/cli/payload.js +253 -0
  191. package/dist/src/cli/payload.js.map +1 -0
  192. package/dist/src/cli/policy.d.ts +43 -0
  193. package/dist/src/cli/policy.js +229 -0
  194. package/dist/src/cli/policy.js.map +1 -0
  195. package/dist/src/cli/preflight.d.ts +363 -0
  196. package/dist/src/cli/preflight.js +1175 -0
  197. package/dist/src/cli/preflight.js.map +1 -0
  198. package/dist/src/cli/progress.d.ts +78 -0
  199. package/dist/src/cli/progress.js +112 -0
  200. package/dist/src/cli/progress.js.map +1 -0
  201. package/dist/src/cli/prompt.d.ts +209 -0
  202. package/dist/src/cli/prompt.js +312 -0
  203. package/dist/src/cli/prompt.js.map +1 -0
  204. package/dist/src/cli/quickstart.d.ts +46 -0
  205. package/dist/src/cli/quickstart.js +297 -0
  206. package/dist/src/cli/quickstart.js.map +1 -0
  207. package/dist/src/cli/records.d.ts +34 -0
  208. package/dist/src/cli/records.js +66 -0
  209. package/dist/src/cli/records.js.map +1 -0
  210. package/dist/src/cli/render.d.ts +22 -0
  211. package/dist/src/cli/render.js +132 -0
  212. package/dist/src/cli/render.js.map +1 -0
  213. package/dist/src/cli/sandbox.d.ts +51 -0
  214. package/dist/src/cli/sandbox.js +150 -0
  215. package/dist/src/cli/sandbox.js.map +1 -0
  216. package/dist/src/cli/scaffold.d.ts +79 -0
  217. package/dist/src/cli/scaffold.js +137 -0
  218. package/dist/src/cli/scaffold.js.map +1 -0
  219. package/dist/src/cli/setup-adapter.d.ts +137 -0
  220. package/dist/src/cli/setup-adapter.js +509 -0
  221. package/dist/src/cli/setup-adapter.js.map +1 -0
  222. package/dist/src/cli/setup-channel.d.ts +117 -0
  223. package/dist/src/cli/setup-channel.js +635 -0
  224. package/dist/src/cli/setup-channel.js.map +1 -0
  225. package/dist/src/cli/setup-checkpoint.d.ts +57 -0
  226. package/dist/src/cli/setup-checkpoint.js +196 -0
  227. package/dist/src/cli/setup-checkpoint.js.map +1 -0
  228. package/dist/src/cli/setup-common.d.ts +275 -0
  229. package/dist/src/cli/setup-common.js +376 -0
  230. package/dist/src/cli/setup-common.js.map +1 -0
  231. package/dist/src/cli/setup-flow.d.ts +287 -0
  232. package/dist/src/cli/setup-flow.js +476 -0
  233. package/dist/src/cli/setup-flow.js.map +1 -0
  234. package/dist/src/cli/setup-service.d.ts +96 -0
  235. package/dist/src/cli/setup-service.js +308 -0
  236. package/dist/src/cli/setup-service.js.map +1 -0
  237. package/dist/src/cli/setup.d.ts +202 -0
  238. package/dist/src/cli/setup.js +473 -0
  239. package/dist/src/cli/setup.js.map +1 -0
  240. package/dist/src/cli/style.d.ts +320 -0
  241. package/dist/src/cli/style.js +469 -0
  242. package/dist/src/cli/style.js.map +1 -0
  243. package/dist/src/cli/token.d.ts +39 -0
  244. package/dist/src/cli/token.js +274 -0
  245. package/dist/src/cli/token.js.map +1 -0
  246. package/dist/src/cli/up.d.ts +155 -0
  247. package/dist/src/cli/up.js +849 -0
  248. package/dist/src/cli/up.js.map +1 -0
  249. package/dist/src/cli/usage.d.ts +37 -0
  250. package/dist/src/cli/usage.js +91 -0
  251. package/dist/src/cli/usage.js.map +1 -0
  252. package/dist/src/cli/values.d.ts +40 -0
  253. package/dist/src/cli/values.js +189 -0
  254. package/dist/src/cli/values.js.map +1 -0
  255. package/dist/src/cli/vault.d.ts +59 -0
  256. package/dist/src/cli/vault.js +362 -0
  257. package/dist/src/cli/vault.js.map +1 -0
  258. package/dist/src/cli/verb-registry.d.ts +76 -0
  259. package/dist/src/cli/verb-registry.js +2341 -0
  260. package/dist/src/cli/verb-registry.js.map +1 -0
  261. package/dist/src/cli/wordmark.d.ts +31 -0
  262. package/dist/src/cli/wordmark.js +52 -0
  263. package/dist/src/cli/wordmark.js.map +1 -0
  264. package/dist/src/codex/doctor.d.ts +13 -0
  265. package/dist/src/codex/doctor.js +41 -0
  266. package/dist/src/codex/doctor.js.map +1 -0
  267. package/dist/src/codex/manifest.d.ts +49 -0
  268. package/dist/src/codex/manifest.js +103 -0
  269. package/dist/src/codex/manifest.js.map +1 -0
  270. package/dist/src/codex/templates.d.ts +41 -0
  271. package/dist/src/codex/templates.js +319 -0
  272. package/dist/src/codex/templates.js.map +1 -0
  273. package/dist/src/codex/trust.d.ts +19 -0
  274. package/dist/src/codex/trust.js +183 -0
  275. package/dist/src/codex/trust.js.map +1 -0
  276. package/dist/src/codex/workspace-plan.d.ts +131 -0
  277. package/dist/src/codex/workspace-plan.js +561 -0
  278. package/dist/src/codex/workspace-plan.js.map +1 -0
  279. package/dist/src/core/actor.d.ts +2 -0
  280. package/dist/src/core/actor.js +5 -0
  281. package/dist/src/core/actor.js.map +1 -0
  282. package/dist/src/core/advance-cycle.d.ts +170 -0
  283. package/dist/src/core/advance-cycle.js +200 -0
  284. package/dist/src/core/advance-cycle.js.map +1 -0
  285. package/dist/src/core/agents-md.d.ts +276 -0
  286. package/dist/src/core/agents-md.js +747 -0
  287. package/dist/src/core/agents-md.js.map +1 -0
  288. package/dist/src/core/apply-patch.d.ts +49 -0
  289. package/dist/src/core/apply-patch.js +266 -0
  290. package/dist/src/core/apply-patch.js.map +1 -0
  291. package/dist/src/core/attest.d.ts +420 -0
  292. package/dist/src/core/attest.js +589 -0
  293. package/dist/src/core/attest.js.map +1 -0
  294. package/dist/src/core/audit.d.ts +492 -0
  295. package/dist/src/core/audit.js +882 -0
  296. package/dist/src/core/audit.js.map +1 -0
  297. package/dist/src/core/budgets.d.ts +238 -0
  298. package/dist/src/core/budgets.js +449 -0
  299. package/dist/src/core/budgets.js.map +1 -0
  300. package/dist/src/core/checkpoint.d.ts +500 -0
  301. package/dist/src/core/checkpoint.js +738 -0
  302. package/dist/src/core/checkpoint.js.map +1 -0
  303. package/dist/src/core/child-env.d.ts +88 -0
  304. package/dist/src/core/child-env.js +86 -0
  305. package/dist/src/core/child-env.js.map +1 -0
  306. package/dist/src/core/clock.d.ts +52 -0
  307. package/dist/src/core/clock.js +43 -0
  308. package/dist/src/core/clock.js.map +1 -0
  309. package/dist/src/core/command-class.d.ts +543 -0
  310. package/dist/src/core/command-class.js +2356 -0
  311. package/dist/src/core/command-class.js.map +1 -0
  312. package/dist/src/core/coverage-sources/adapter.d.ts +40 -0
  313. package/dist/src/core/coverage-sources/adapter.js +71 -0
  314. package/dist/src/core/coverage-sources/adapter.js.map +1 -0
  315. package/dist/src/core/coverage-sources/gh.d.ts +48 -0
  316. package/dist/src/core/coverage-sources/gh.js +136 -0
  317. package/dist/src/core/coverage-sources/gh.js.map +1 -0
  318. package/dist/src/core/coverage-sources/git.d.ts +101 -0
  319. package/dist/src/core/coverage-sources/git.js +269 -0
  320. package/dist/src/core/coverage-sources/git.js.map +1 -0
  321. package/dist/src/core/coverage.d.ts +217 -0
  322. package/dist/src/core/coverage.js +337 -0
  323. package/dist/src/core/coverage.js.map +1 -0
  324. package/dist/src/core/credential-spec.d.ts +72 -0
  325. package/dist/src/core/credential-spec.js +23 -0
  326. package/dist/src/core/credential-spec.js.map +1 -0
  327. package/dist/src/core/dark-session.d.ts +331 -0
  328. package/dist/src/core/dark-session.js +714 -0
  329. package/dist/src/core/dark-session.js.map +1 -0
  330. package/dist/src/core/decision-refusal.d.ts +185 -0
  331. package/dist/src/core/decision-refusal.js +265 -0
  332. package/dist/src/core/decision-refusal.js.map +1 -0
  333. package/dist/src/core/env-file.d.ts +450 -0
  334. package/dist/src/core/env-file.js +837 -0
  335. package/dist/src/core/env-file.js.map +1 -0
  336. package/dist/src/core/execute.d.ts +858 -0
  337. package/dist/src/core/execute.js +1271 -0
  338. package/dist/src/core/execute.js.map +1 -0
  339. package/dist/src/core/frontmatter.d.ts +78 -0
  340. package/dist/src/core/frontmatter.js +100 -0
  341. package/dist/src/core/frontmatter.js.map +1 -0
  342. package/dist/src/core/gate-window.d.ts +312 -0
  343. package/dist/src/core/gate-window.js +506 -0
  344. package/dist/src/core/gate-window.js.map +1 -0
  345. package/dist/src/core/gate.d.ts +1364 -0
  346. package/dist/src/core/gate.js +3002 -0
  347. package/dist/src/core/gate.js.map +1 -0
  348. package/dist/src/core/git-run.d.ts +73 -0
  349. package/dist/src/core/git-run.js +93 -0
  350. package/dist/src/core/git-run.js.map +1 -0
  351. package/dist/src/core/harness-version.d.ts +157 -0
  352. package/dist/src/core/harness-version.js +211 -0
  353. package/dist/src/core/harness-version.js.map +1 -0
  354. package/dist/src/core/harness-wait.d.ts +55 -0
  355. package/dist/src/core/harness-wait.js +58 -0
  356. package/dist/src/core/harness-wait.js.map +1 -0
  357. package/dist/src/core/head-retry.d.ts +107 -0
  358. package/dist/src/core/head-retry.js +121 -0
  359. package/dist/src/core/head-retry.js.map +1 -0
  360. package/dist/src/core/instance.d.ts +253 -0
  361. package/dist/src/core/instance.js +319 -0
  362. package/dist/src/core/instance.js.map +1 -0
  363. package/dist/src/core/intake-limits.d.ts +247 -0
  364. package/dist/src/core/intake-limits.js +350 -0
  365. package/dist/src/core/intake-limits.js.map +1 -0
  366. package/dist/src/core/jcs.d.ts +52 -0
  367. package/dist/src/core/jcs.js +132 -0
  368. package/dist/src/core/jcs.js.map +1 -0
  369. package/dist/src/core/journal.d.ts +144 -0
  370. package/dist/src/core/journal.js +200 -0
  371. package/dist/src/core/journal.js.map +1 -0
  372. package/dist/src/core/live-draw.d.ts +436 -0
  373. package/dist/src/core/live-draw.js +703 -0
  374. package/dist/src/core/live-draw.js.map +1 -0
  375. package/dist/src/core/log-reconcile.d.ts +89 -0
  376. package/dist/src/core/log-reconcile.js +136 -0
  377. package/dist/src/core/log-reconcile.js.map +1 -0
  378. package/dist/src/core/log-subscribe.d.ts +36 -0
  379. package/dist/src/core/log-subscribe.js +162 -0
  380. package/dist/src/core/log-subscribe.js.map +1 -0
  381. package/dist/src/core/log.d.ts +278 -0
  382. package/dist/src/core/log.js +546 -0
  383. package/dist/src/core/log.js.map +1 -0
  384. package/dist/src/core/loop.d.ts +274 -0
  385. package/dist/src/core/loop.js +487 -0
  386. package/dist/src/core/loop.js.map +1 -0
  387. package/dist/src/core/md-fence.d.ts +41 -0
  388. package/dist/src/core/md-fence.js +74 -0
  389. package/dist/src/core/md-fence.js.map +1 -0
  390. package/dist/src/core/money.d.ts +147 -0
  391. package/dist/src/core/money.js +195 -0
  392. package/dist/src/core/money.js.map +1 -0
  393. package/dist/src/core/payload-census.d.ts +74 -0
  394. package/dist/src/core/payload-census.js +146 -0
  395. package/dist/src/core/payload-census.js.map +1 -0
  396. package/dist/src/core/payload-store.d.ts +175 -0
  397. package/dist/src/core/payload-store.js +340 -0
  398. package/dist/src/core/payload-store.js.map +1 -0
  399. package/dist/src/core/payload.d.ts +71 -0
  400. package/dist/src/core/payload.js +80 -0
  401. package/dist/src/core/payload.js.map +1 -0
  402. package/dist/src/core/policy-diff.d.ts +292 -0
  403. package/dist/src/core/policy-diff.js +588 -0
  404. package/dist/src/core/policy-diff.js.map +1 -0
  405. package/dist/src/core/policy-expectations.d.ts +199 -0
  406. package/dist/src/core/policy-expectations.js +394 -0
  407. package/dist/src/core/policy-expectations.js.map +1 -0
  408. package/dist/src/core/policy-explain.d.ts +150 -0
  409. package/dist/src/core/policy-explain.js +258 -0
  410. package/dist/src/core/policy-explain.js.map +1 -0
  411. package/dist/src/core/policy-load.d.ts +527 -0
  412. package/dist/src/core/policy-load.js +536 -0
  413. package/dist/src/core/policy-load.js.map +1 -0
  414. package/dist/src/core/policy-match.d.ts +281 -0
  415. package/dist/src/core/policy-match.js +478 -0
  416. package/dist/src/core/policy-match.js.map +1 -0
  417. package/dist/src/core/policy-proposal.d.ts +265 -0
  418. package/dist/src/core/policy-proposal.js +458 -0
  419. package/dist/src/core/policy-proposal.js.map +1 -0
  420. package/dist/src/core/prompt-layout.d.ts +221 -0
  421. package/dist/src/core/prompt-layout.js +422 -0
  422. package/dist/src/core/prompt-layout.js.map +1 -0
  423. package/dist/src/core/protected-path-guard.d.ts +453 -0
  424. package/dist/src/core/protected-path-guard.js +1566 -0
  425. package/dist/src/core/protected-path-guard.js.map +1 -0
  426. package/dist/src/core/registration.d.ts +25 -0
  427. package/dist/src/core/registration.js +39 -0
  428. package/dist/src/core/registration.js.map +1 -0
  429. package/dist/src/core/reindex.d.ts +99 -0
  430. package/dist/src/core/reindex.js +336 -0
  431. package/dist/src/core/reindex.js.map +1 -0
  432. package/dist/src/core/sampler.d.ts +313 -0
  433. package/dist/src/core/sampler.js +388 -0
  434. package/dist/src/core/sampler.js.map +1 -0
  435. package/dist/src/core/sandbox.d.ts +290 -0
  436. package/dist/src/core/sandbox.js +424 -0
  437. package/dist/src/core/sandbox.js.map +1 -0
  438. package/dist/src/core/seal.d.ts +165 -0
  439. package/dist/src/core/seal.js +290 -0
  440. package/dist/src/core/seal.js.map +1 -0
  441. package/dist/src/core/state.d.ts +505 -0
  442. package/dist/src/core/state.js +1009 -0
  443. package/dist/src/core/state.js.map +1 -0
  444. package/dist/src/core/task-file.d.ts +185 -0
  445. package/dist/src/core/task-file.js +464 -0
  446. package/dist/src/core/task-file.js.map +1 -0
  447. package/dist/src/core/telegram-config.d.ts +93 -0
  448. package/dist/src/core/telegram-config.js +114 -0
  449. package/dist/src/core/telegram-config.js.map +1 -0
  450. package/dist/src/core/token.d.ts +409 -0
  451. package/dist/src/core/token.js +561 -0
  452. package/dist/src/core/token.js.map +1 -0
  453. package/dist/src/core/validate.d.ts +138 -0
  454. package/dist/src/core/validate.js +0 -0
  455. package/dist/src/core/validate.js.map +1 -0
  456. package/dist/src/core/values.d.ts +137 -0
  457. package/dist/src/core/values.js +153 -0
  458. package/dist/src/core/values.js.map +1 -0
  459. package/dist/src/core/vault.d.ts +291 -0
  460. package/dist/src/core/vault.js +612 -0
  461. package/dist/src/core/vault.js.map +1 -0
  462. package/dist/src/core/verified-snapshot.d.ts +204 -0
  463. package/dist/src/core/verified-snapshot.js +506 -0
  464. package/dist/src/core/verified-snapshot.js.map +1 -0
  465. package/dist/src/core/verify.d.ts +336 -0
  466. package/dist/src/core/verify.js +549 -0
  467. package/dist/src/core/verify.js.map +1 -0
  468. package/dist/src/core/version.d.ts +8 -0
  469. package/dist/src/core/version.js +9 -0
  470. package/dist/src/core/version.js.map +1 -0
  471. package/dist/src/core/wysiwys.d.ts +370 -0
  472. package/dist/src/core/wysiwys.js +728 -0
  473. package/dist/src/core/wysiwys.js.map +1 -0
  474. package/dist/src/daemon/advance-child.d.ts +39 -0
  475. package/dist/src/daemon/advance-child.js +78 -0
  476. package/dist/src/daemon/advance-child.js.map +1 -0
  477. package/dist/src/daemon/advance.d.ts +466 -0
  478. package/dist/src/daemon/advance.js +849 -0
  479. package/dist/src/daemon/advance.js.map +1 -0
  480. package/dist/src/daemon/audit.d.ts +87 -0
  481. package/dist/src/daemon/audit.js +90 -0
  482. package/dist/src/daemon/audit.js.map +1 -0
  483. package/dist/src/daemon/daemon.d.ts +1180 -0
  484. package/dist/src/daemon/daemon.js +1988 -0
  485. package/dist/src/daemon/daemon.js.map +1 -0
  486. package/dist/src/daemon/dark-session.d.ts +64 -0
  487. package/dist/src/daemon/dark-session.js +119 -0
  488. package/dist/src/daemon/dark-session.js.map +1 -0
  489. package/dist/src/daemon/draw-child.d.ts +36 -0
  490. package/dist/src/daemon/draw-child.js +132 -0
  491. package/dist/src/daemon/draw-child.js.map +1 -0
  492. package/dist/src/daemon/draw.d.ts +154 -0
  493. package/dist/src/daemon/draw.js +458 -0
  494. package/dist/src/daemon/draw.js.map +1 -0
  495. package/dist/src/daemon/git-evidence.d.ts +173 -0
  496. package/dist/src/daemon/git-evidence.js +345 -0
  497. package/dist/src/daemon/git-evidence.js.map +1 -0
  498. package/dist/src/daemon/projection.d.ts +180 -0
  499. package/dist/src/daemon/projection.js +233 -0
  500. package/dist/src/daemon/projection.js.map +1 -0
  501. package/dist/src/daemon/prune.d.ts +207 -0
  502. package/dist/src/daemon/prune.js +376 -0
  503. package/dist/src/daemon/prune.js.map +1 -0
  504. package/dist/src/mcp/http.d.ts +113 -0
  505. package/dist/src/mcp/http.js +343 -0
  506. package/dist/src/mcp/http.js.map +1 -0
  507. package/dist/src/mcp/server.d.ts +265 -0
  508. package/dist/src/mcp/server.js +602 -0
  509. package/dist/src/mcp/server.js.map +1 -0
  510. package/docs/adapter-api.md +106 -0
  511. package/docs/cli-reference.md +5716 -0
  512. package/docs/codex-enforced-session.md +30 -0
  513. package/package.json +53 -4
  514. package/schema/.gitkeep +0 -0
  515. package/schema/LICENSE +117 -0
  516. package/schema/codex-instance.schema.json +82 -0
  517. package/schema/envelope.schema.json +137 -0
  518. package/schema/event.schema.json +1811 -0
  519. package/schema/fixtures/codex-instance/invalid/unpinned-codex-version.json +40 -0
  520. package/schema/fixtures/codex-instance/valid/canonical.json +40 -0
  521. package/schema/fixtures/envelope/invalid/action-missing-idempotency-key.json +15 -0
  522. package/schema/fixtures/envelope/invalid/action-unknown-class-format.json +14 -0
  523. package/schema/fixtures/envelope/invalid/confidence-out-of-range.json +11 -0
  524. package/schema/fixtures/envelope/invalid/est-cost-bare-number.json +14 -0
  525. package/schema/fixtures/envelope/invalid/est-cost-noncanonical-string.json +14 -0
  526. package/schema/fixtures/envelope/invalid/malformed-assignee.json +10 -0
  527. package/schema/fixtures/envelope/invalid/malformed-created-by.json +7 -0
  528. package/schema/fixtures/envelope/invalid/malformed-max-latency.json +11 -0
  529. package/schema/fixtures/envelope/invalid/malformed-payload-hash.json +14 -0
  530. package/schema/fixtures/envelope/invalid/max-cost-bare-number.json +11 -0
  531. package/schema/fixtures/envelope/invalid/missing-origin.json +3 -0
  532. package/schema/fixtures/envelope/invalid/negative-est-cost.json +14 -0
  533. package/schema/fixtures/envelope/invalid/unknown-state.json +7 -0
  534. package/schema/fixtures/envelope/invalid/unknown-top-level-field.json +8 -0
  535. package/schema/fixtures/envelope/valid/action-payload-hash.json +17 -0
  536. package/schema/fixtures/envelope/valid/actions-without-budget.json +18 -0
  537. package/schema/fixtures/envelope/valid/canonical.json +25 -0
  538. package/schema/fixtures/envelope/valid/minimal.json +7 -0
  539. package/schema/fixtures/envelope/valid/multi-action-executed.json +30 -0
  540. package/schema/fixtures/envelope/valid/record-write-stage.json +22 -0
  541. package/schema/fixtures/event/invalid/approval-granted-agent-actor.json +15 -0
  542. package/schema/fixtures/event/invalid/approval-granted-empty-batch-delivery-id.json +17 -0
  543. package/schema/fixtures/event/invalid/approval-granted-fifth-reaction.json +16 -0
  544. package/schema/fixtures/event/invalid/approval-granted-missing-actor.json +14 -0
  545. package/schema/fixtures/event/invalid/approval-requested-missing-action-key.json +14 -0
  546. package/schema/fixtures/event/invalid/approval-withdrawn-agent-policy-drift.json +15 -0
  547. package/schema/fixtures/event/invalid/approval-withdrawn-missing-reason.json +15 -0
  548. package/schema/fixtures/event/invalid/approval-withdrawn-system-actor.json +15 -0
  549. package/schema/fixtures/event/invalid/audit-decision-refused-human-actor.json +17 -0
  550. package/schema/fixtures/event/invalid/audit-decision-refused-missing-code.json +16 -0
  551. package/schema/fixtures/event/invalid/audit-reviewed-agent-actor.json +15 -0
  552. package/schema/fixtures/event/invalid/audit-reviewed-loved-no-note.json +16 -0
  553. package/schema/fixtures/event/invalid/audit-reviewed-system-actor.json +15 -0
  554. package/schema/fixtures/event/invalid/bad-actor-prefix.json +15 -0
  555. package/schema/fixtures/event/invalid/est-cost-bare-number.json +17 -0
  556. package/schema/fixtures/event/invalid/execution-completed-fabricated-exit-code.json +16 -0
  557. package/schema/fixtures/event/invalid/execution-completed-provider-ref-empty-id.json +18 -0
  558. package/schema/fixtures/event/invalid/execution-completed-provider-ref-extra-field.json +19 -0
  559. package/schema/fixtures/event/invalid/execution-completed-provider-ref-id-not-string.json +18 -0
  560. package/schema/fixtures/event/invalid/execution-completed-provider-ref-missing-adapter.json +17 -0
  561. package/schema/fixtures/event/invalid/execution-failed-open-reported-by.json +16 -0
  562. package/schema/fixtures/event/invalid/execution-indeterminate-open-reason.json +14 -0
  563. package/schema/fixtures/event/invalid/execution-reconciled-agent-actor.json +17 -0
  564. package/schema/fixtures/event/invalid/execution-started-negative-env-stripped.json +16 -0
  565. package/schema/fixtures/event/invalid/gate-bypassed-missing-opened-seq.json +15 -0
  566. package/schema/fixtures/event/invalid/gate-closed-non-integer-opened-seq.json +13 -0
  567. package/schema/fixtures/event/invalid/gate-opened-agent-actor.json +16 -0
  568. package/schema/fixtures/event/invalid/gate-organ-attested-absolute-path.json +14 -0
  569. package/schema/fixtures/event/invalid/gate-organ-attested-agent-actor.json +14 -0
  570. package/schema/fixtures/event/invalid/gate-organ-attested-missing-organ-path.json +13 -0
  571. package/schema/fixtures/event/invalid/harness-unknown-kind.json +18 -0
  572. package/schema/fixtures/event/invalid/harness-version-multiline.json +16 -0
  573. package/schema/fixtures/event/invalid/log-checkpoint-agent-actor.json +17 -0
  574. package/schema/fixtures/event/invalid/log-checkpoint-missing-signature.json +16 -0
  575. package/schema/fixtures/event/invalid/log-checkpoint-short-signed-hash.json +17 -0
  576. package/schema/fixtures/event/invalid/log-checkpoint-unknown-signature-alg.json +17 -0
  577. package/schema/fixtures/event/invalid/malformed-ts.json +15 -0
  578. package/schema/fixtures/event/invalid/missing-alg.json +14 -0
  579. package/schema/fixtures/event/invalid/missing-hash.json +14 -0
  580. package/schema/fixtures/event/invalid/non-integer-seq.json +15 -0
  581. package/schema/fixtures/event/invalid/payload-pruned-human-actor.json +14 -0
  582. package/schema/fixtures/event/invalid/payload-pruned-missing-hash.json +14 -0
  583. package/schema/fixtures/event/invalid/policy-declined-agent-actor.json +15 -0
  584. package/schema/fixtures/event/invalid/policy-proposed-missing-diff.json +19 -0
  585. package/schema/fixtures/event/invalid/policy-proposed-system-actor.json +26 -0
  586. package/schema/fixtures/event/invalid/short-hash.json +15 -0
  587. package/schema/fixtures/event/invalid/unknown-alg.json +15 -0
  588. package/schema/fixtures/event/invalid/unknown-event-type.json +15 -0
  589. package/schema/fixtures/event/invalid/unknown-top-level-field.json +16 -0
  590. package/schema/fixtures/event/valid/approval-expired.json +15 -0
  591. package/schema/fixtures/event/valid/approval-granted-batch.json +19 -0
  592. package/schema/fixtures/event/valid/approval-granted-reaction.json +16 -0
  593. package/schema/fixtures/event/valid/approval-granted.json +15 -0
  594. package/schema/fixtures/event/valid/approval-rejected.json +15 -0
  595. package/schema/fixtures/event/valid/approval-requested.json +19 -0
  596. package/schema/fixtures/event/valid/approval-revoked.json +15 -0
  597. package/schema/fixtures/event/valid/approval-withdrawn-policy-drift.json +17 -0
  598. package/schema/fixtures/event/valid/approval-withdrawn.json +16 -0
  599. package/schema/fixtures/event/valid/audit-decision-refused.json +20 -0
  600. package/schema/fixtures/event/valid/audit-reviewed-reaction.json +17 -0
  601. package/schema/fixtures/event/valid/audit-reviewed.json +15 -0
  602. package/schema/fixtures/event/valid/audit-sampled.json +14 -0
  603. package/schema/fixtures/event/valid/budget-exceeded.json +21 -0
  604. package/schema/fixtures/event/valid/envelope-drift.json +16 -0
  605. package/schema/fixtures/event/valid/execution-completed-harness-report.json +16 -0
  606. package/schema/fixtures/event/valid/execution-completed-provider-ref.json +18 -0
  607. package/schema/fixtures/event/valid/execution-completed.json +15 -0
  608. package/schema/fixtures/event/valid/execution-failed-harness-report.json +16 -0
  609. package/schema/fixtures/event/valid/execution-failed.json +15 -0
  610. package/schema/fixtures/event/valid/execution-indeterminate.json +15 -0
  611. package/schema/fixtures/event/valid/execution-reconciled.json +17 -0
  612. package/schema/fixtures/event/valid/execution-started-env-stripped.json +17 -0
  613. package/schema/fixtures/event/valid/execution-started.json +14 -0
  614. package/schema/fixtures/event/valid/gate-bypassed-harness-version.json +18 -0
  615. package/schema/fixtures/event/valid/gate-bypassed.json +19 -0
  616. package/schema/fixtures/event/valid/gate-closed.json +14 -0
  617. package/schema/fixtures/event/valid/gate-opened.json +16 -0
  618. package/schema/fixtures/event/valid/gate-organ-attested.json +14 -0
  619. package/schema/fixtures/event/valid/genesis-null-prev.json +14 -0
  620. package/schema/fixtures/event/valid/log-checkpoint.json +17 -0
  621. package/schema/fixtures/event/valid/payload-pruned-orphan.json +13 -0
  622. package/schema/fixtures/event/valid/payload-pruned.json +17 -0
  623. package/schema/fixtures/event/valid/policy-declined.json +16 -0
  624. package/schema/fixtures/event/valid/policy-proposed.json +35 -0
  625. package/schema/fixtures/event/valid/policy-updated.json +14 -0
  626. package/schema/fixtures/event/valid/reconciliation-required.json +18 -0
  627. package/schema/fixtures/event/valid/reconciliation-satisfied.json +17 -0
  628. package/schema/fixtures/event/valid/route-accepted.json +15 -0
  629. package/schema/fixtures/event/valid/route-proposed.json +16 -0
  630. package/schema/fixtures/event/valid/spec-example.json +15 -0
  631. package/schema/fixtures/event/valid/task-registered-harness-version.json +23 -0
  632. package/schema/fixtures/event/valid/task-registered.json +14 -0
  633. package/schema/fixtures/hash/known-answer-pre-121.json +74 -0
  634. package/schema/fixtures/hash/known-answer.json +74 -0
  635. package/schema/fixtures/policy/invalid/bad-approval-ttl.json +7 -0
  636. package/schema/fixtures/policy/invalid/bad-web-port.json +4 -0
  637. package/schema/fixtures/policy/invalid/checkpoint-key-not-base64.json +6 -0
  638. package/schema/fixtures/policy/invalid/class-rule-missing-autonomy.json +9 -0
  639. package/schema/fixtures/policy/invalid/empty-class-key.json +6 -0
  640. package/schema/fixtures/policy/invalid/live-rate-on-human-only.json +7 -0
  641. package/schema/fixtures/policy/invalid/malformed-class-key.json +6 -0
  642. package/schema/fixtures/policy/invalid/missing-version.json +8 -0
  643. package/schema/fixtures/policy/invalid/negative-limit.json +9 -0
  644. package/schema/fixtures/policy/invalid/non-numeric-limit.json +9 -0
  645. package/schema/fixtures/policy/invalid/non-positive-max-pending.json +9 -0
  646. package/schema/fixtures/policy/invalid/on-expiry-grant.json +8 -0
  647. package/schema/fixtures/policy/invalid/payload-retention-bare-number.json +4 -0
  648. package/schema/fixtures/policy/invalid/payload-retention-compound.json +4 -0
  649. package/schema/fixtures/policy/invalid/payload-retention-fractional.json +4 -0
  650. package/schema/fixtures/policy/invalid/payload-retention-zero.json +4 -0
  651. package/schema/fixtures/policy/invalid/protected-paths-escape.json +4 -0
  652. package/schema/fixtures/policy/invalid/protected-paths-glob.json +4 -0
  653. package/schema/fixtures/policy/invalid/retro-rate-on-human-only.json +7 -0
  654. package/schema/fixtures/policy/invalid/retro-rate-on-manual.json +7 -0
  655. package/schema/fixtures/policy/invalid/retro-rate-zero.json +7 -0
  656. package/schema/fixtures/policy/invalid/sample-rate-too-high.json +5 -0
  657. package/schema/fixtures/policy/invalid/sampling-secret-env-empty.json +7 -0
  658. package/schema/fixtures/policy/invalid/sampling-secret-env-not-string.json +6 -0
  659. package/schema/fixtures/policy/invalid/skew-tolerance-compound.json +6 -0
  660. package/schema/fixtures/policy/invalid/unknown-autonomy.json +7 -0
  661. package/schema/fixtures/policy/invalid/unknown-class-rule-key.json +6 -0
  662. package/schema/fixtures/policy/invalid/unknown-top-level-key.json +7 -0
  663. package/schema/fixtures/policy/invalid/vault-passphrase-env-empty.json +6 -0
  664. package/schema/fixtures/policy/invalid/vault-passphrase-literal.json +6 -0
  665. package/schema/fixtures/policy/invalid/version-not-string.json +4 -0
  666. package/schema/fixtures/policy/valid/canonical.json +47 -0
  667. package/schema/fixtures/policy/valid/checkpoint-keys.json +18 -0
  668. package/schema/fixtures/policy/valid/class-approvers-limits.json +25 -0
  669. package/schema/fixtures/policy/valid/class-retro-rate.json +17 -0
  670. package/schema/fixtures/policy/valid/global-budgets.json +19 -0
  671. package/schema/fixtures/policy/valid/human-only.json +9 -0
  672. package/schema/fixtures/policy/valid/minimal.json +6 -0
  673. package/schema/fixtures/policy/valid/protected-paths.json +10 -0
  674. package/schema/fixtures/policy/valid/record-namespace.json +13 -0
  675. package/schema/fixtures/policy/valid/request-volume-limits.json +26 -0
  676. package/schema/fixtures/policy/valid/retention-and-sampling-secret.json +16 -0
  677. package/schema/fixtures/policy/valid/skew-tolerance.json +15 -0
  678. package/schema/fixtures/policy/valid/vault-passphrase-env.json +14 -0
  679. package/schema/fixtures/policy/valid/wildcards.json +15 -0
  680. package/schema/fixtures/policy-md/invalid/alias-bomb.md +15 -0
  681. package/schema/fixtures/policy-md/invalid/no-fence.md +7 -0
  682. package/schema/fixtures/policy-md/invalid/protected-route-not-a-subclass.md +16 -0
  683. package/schema/fixtures/policy-md/invalid/schema-invalid-autonomy.md +16 -0
  684. package/schema/fixtures/policy-md/invalid/schema-invalid-read-proof.md +17 -0
  685. package/schema/fixtures/policy-md/invalid/two-fences.md +19 -0
  686. package/schema/fixtures/policy-md/invalid/unclosed-fence.md +11 -0
  687. package/schema/fixtures/policy-md/invalid/wrong-info-string.md +11 -0
  688. package/schema/fixtures/policy-md/invalid/yaml-syntax-error.md +13 -0
  689. package/schema/fixtures/policy-md/precedence/both/APPROVAL.md +7 -0
  690. package/schema/fixtures/policy-md/precedence/both/APPROVALS.md +7 -0
  691. package/schema/fixtures/policy-md/precedence/fallback-only/APPROVALS.md +7 -0
  692. package/schema/fixtures/policy-md/valid/canonical.md +50 -0
  693. package/schema/fixtures/policy-md/valid/daemon-read-proof.md +18 -0
  694. package/schema/fixtures/policy-md/valid/minimal.md +3 -0
  695. package/schema/fixtures/policy-md/valid/prose-lookalikes.md +54 -0
  696. package/schema/fixtures/policy-md/valid/routed-protected-paths.md +49 -0
  697. package/schema/fixtures/policy-md/valid/with-values.md +79 -0
  698. package/schema/fixtures/sample-record/invalid/bad-date-time.json +4 -0
  699. package/schema/fixtures/sample-record/invalid/missing-required-field.json +3 -0
  700. package/schema/fixtures/sample-record/invalid/unknown-top-level-field.json +5 -0
  701. package/schema/fixtures/sample-record/invalid/wrong-type.json +4 -0
  702. package/schema/fixtures/sample-record/valid/minimal.json +4 -0
  703. package/schema/fixtures/sample-record/valid/with-note.json +5 -0
  704. package/schema/fixtures/values/invalid/class-shaped.json +9 -0
  705. package/schema/fixtures/values/invalid/duplicate-entry.json +4 -0
  706. package/schema/fixtures/values/invalid/non-string-item.json +4 -0
  707. package/schema/fixtures/values/invalid/over-cap.json +26 -0
  708. package/schema/fixtures/values/invalid/unknown-key.json +5 -0
  709. package/schema/fixtures/values/invalid/version-string.json +1 -0
  710. package/schema/fixtures/values/valid/empty-lists.json +7 -0
  711. package/schema/fixtures/values/valid/full.json +20 -0
  712. package/schema/fixtures/values/valid/minimal.json +1 -0
  713. package/schema/fixtures/values-md/invalid/schema-invalid.md +62 -0
  714. package/schema/fixtures/values-md/invalid/two-blocks.md +69 -0
  715. package/schema/fixtures/values-md/invalid/unterminated.md +61 -0
  716. package/schema/fixtures/values-md/invalid/yaml-error.md +63 -0
  717. package/schema/fixtures/values-md/valid/absent.md +50 -0
  718. package/schema/fixtures/values-md/valid/with-values.md +79 -0
  719. package/schema/policy.schema.json +501 -0
  720. package/schema/sample-record.schema.json +26 -0
  721. package/schema/values.schema.json +55 -0
  722. package/templates/codex/README.md +9 -0
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Monetary amounts in hashed material (APRV-121).
3
+ *
4
+ * ## The representation, and why
5
+ *
6
+ * Every USD amount that enters hashed material — an envelope's
7
+ * `actions[].est_cost_usd` and `budget.max_cost_usd`, the `est_cost_usd` the
8
+ * gate records on `approval.requested`, `approval.granted`, `execution.started`
9
+ * and `budget.exceeded`, and the `est_cost_usd` an execution token binds to —
10
+ * is a **decimal string**: `"0"`, `"0.02"`, `"1200.5"`. Not a JSON number.
11
+ *
12
+ * RFC 8785 pins ES6 number serialization, so a single TypeScript runtime is
13
+ * internally consistent with itself. Cross-language it is not: the fast-path of
14
+ * SPEC.md §13 and any second implementation must reproduce the same bytes from
15
+ * the same value, and float formatting is precisely where that breaks. A
16
+ * decimal string has one spelling, and every language agrees on it because
17
+ * nobody has to reserialize anything.
18
+ *
19
+ * **String decimal, not integer minor units.** Both remove the float; the
20
+ * choice is about what a human writes and reads. The field is named
21
+ * `est_cost_usd` and a task author writes it in YAML frontmatter next to a
22
+ * one-line summary; `est_cost_usd: "0.02"` still says two cents, while
23
+ * `est_cost_usd: 20000` says nothing without knowing the exponent this project
24
+ * picked, and picking one commits the format to a currency decision (USD has
25
+ * two decimal places, other currencies do not) that the field name does not
26
+ * make. The string also round-trips into and out of a channel message, a CLI
27
+ * table, and a policy discussion without a conversion anyone can get wrong.
28
+ *
29
+ * ## The canonical form
30
+ *
31
+ * {@link USD_STRING_PATTERN}: an optional integer part with no leading zeros,
32
+ * an optional fraction of one to six digits, no sign, no exponent, no trailing
33
+ * dot, no trailing zeros beyond the last significant digit. One value, one
34
+ * spelling — `"0.10"` and `"0.1"` cannot both be written, so two records
35
+ * carrying the same amount always hash the same way.
36
+ *
37
+ * Six fractional digits is the resolution, matching the micro-USD unit the
38
+ * arithmetic below runs in. It is far finer than any real amount and far
39
+ * coarser than IEEE-754 drift.
40
+ *
41
+ * ## The arithmetic
42
+ *
43
+ * All budget arithmetic runs in **integer micro-USD**. A decimal string parses
44
+ * to micros by integer string manipulation, never through a double, so no
45
+ * rounding happens on the way in and none is possible on the way back out.
46
+ * Sums, comparisons, and remainders are exact integers: `"0.1" + "0.2"` is
47
+ * `"0.3"`, and a window of ten thousand two-cent actions is exactly `"200"`
48
+ * rather than a value that depends on the order they were added in.
49
+ *
50
+ * ## Historical compatibility (SPEC.md §8, additive-change precedent)
51
+ *
52
+ * The log is append-only, so records written before this change carry JSON
53
+ * numbers and must keep validating, verifying, and feeding budget math exactly
54
+ * as before. Every reader here therefore accepts both forms: a decimal string
55
+ * (the only form the write boundary now admits) and a finite non-negative JSON
56
+ * number (the historical form). A historical number converts to micros by
57
+ * `Math.round(value * 1e6)`, which is deterministic for every amount the old
58
+ * write boundary could have admitted. The write boundary is the only place the
59
+ * two forms are told apart: `schema/*.schema.json` types the fields as decimal
60
+ * strings, and `validate(..., { mode: "historical" })` is the one documented
61
+ * relaxation, used by the verifier and nothing else.
62
+ */
63
+ /** Micro-USD per USD: the resolution of every amount in this module. */
64
+ export declare const USD_MICROS_SCALE = 1000000;
65
+ /** Fractional digits the canonical form admits (the micro-USD resolution). */
66
+ export declare const USD_FRACTION_DIGITS = 6;
67
+ /**
68
+ * The canonical decimal-string form, as a JSON Schema `pattern` source.
69
+ *
70
+ * Exported so the schemas and the runtime cannot drift: `tests/money.test.ts`
71
+ * asserts the schema files carry exactly this string.
72
+ */
73
+ export declare const USD_STRING_PATTERN = "^(0|[1-9][0-9]*)(\\.[0-9]{0,5}[1-9])?$";
74
+ /** Is `value` a canonical decimal USD string? */
75
+ export declare function isUsdString(value: unknown): value is string;
76
+ /**
77
+ * A canonical decimal string as integer micro-USD, or `null` when the string is
78
+ * not canonical.
79
+ *
80
+ * Parsed by integer arithmetic on the digits: the fraction is padded to six
81
+ * places and the two halves are combined, so the double never sees the value.
82
+ */
83
+ export declare function usdStringToMicros(value: string): number | null;
84
+ /**
85
+ * A historical JSON number as integer micro-USD, or `null` when it is not a
86
+ * usable amount (non-finite, negative, or beyond the safe-integer range once
87
+ * scaled).
88
+ *
89
+ * `Math.round` is the documented conversion. It is deterministic, and for every
90
+ * value the pre-APRV-121 write boundary admitted (`minimum: 0`, ES6-serialized)
91
+ * it lands on the micro the author wrote.
92
+ */
93
+ export declare function usdNumberToMicros(value: number): number | null;
94
+ /**
95
+ * Either accepted form as integer micro-USD, or `null` when the value is not a
96
+ * usable amount.
97
+ *
98
+ * This is the reader every enforcement path uses. It accepts the historical
99
+ * number deliberately: a record already in the log must feed budget math
100
+ * identically to before this change.
101
+ */
102
+ export declare function usdToMicros(value: unknown): number | null;
103
+ /** Integer micro-USD as the canonical decimal string. */
104
+ export declare function microsToUsdString(micros: number): string;
105
+ /**
106
+ * Integer micro-USD as a JSON number, for **display and CLI output only**.
107
+ *
108
+ * Never write the result of this function into hashed material: that is the
109
+ * float this module exists to remove. Budget verdicts report through it because
110
+ * a verdict is a rendered explanation of a decision the integers already made.
111
+ */
112
+ export declare function microsToUsdNumber(micros: number): number;
113
+ /**
114
+ * Either accepted form as a canonical decimal string, or `null` when the value
115
+ * is not a usable amount.
116
+ *
117
+ * The normalizer at every boundary where an amount arrives from outside: a task
118
+ * envelope, a CLI flag, a historical log record.
119
+ */
120
+ export declare function normalizeUsd(value: unknown): string | null;
121
+ /**
122
+ * Either accepted form as a canonical decimal string, defaulting to `"0"`.
123
+ *
124
+ * The budgets contract of `core/budgets.ts` requires `est_cost_usd` on every
125
+ * consuming event, and an action that declared no cost is recorded as `"0"` —
126
+ * an authorization with no declared cost is still an authorization.
127
+ */
128
+ export declare function usdOrZero(value: unknown): string;
129
+ /**
130
+ * Either accepted form as a JSON number, for **display surfaces only**: a
131
+ * channel card, a CLI table, a `--json` field a human reads.
132
+ *
133
+ * `0` for anything unusable, so a renderer never has to decide what to print
134
+ * for a malformed amount. Same warning as {@link microsToUsdNumber}: the result
135
+ * of this function must never be written into hashed material.
136
+ */
137
+ export declare function usdNumber(value: unknown): number;
138
+ /**
139
+ * Either accepted form as a JSON number, or `null` when there is no amount.
140
+ *
141
+ * The display counterpart of {@link normalizeUsd}: it keeps "declared nothing"
142
+ * distinct from "declared zero", which is a distinction the queue's own columns
143
+ * make.
144
+ */
145
+ export declare function usdNumberOrNull(value: unknown): number | null;
146
+ /** An amount as accepted from a caller: canonical string, or historical number. */
147
+ export type UsdInput = string | number;
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Monetary amounts in hashed material (APRV-121).
3
+ *
4
+ * ## The representation, and why
5
+ *
6
+ * Every USD amount that enters hashed material — an envelope's
7
+ * `actions[].est_cost_usd` and `budget.max_cost_usd`, the `est_cost_usd` the
8
+ * gate records on `approval.requested`, `approval.granted`, `execution.started`
9
+ * and `budget.exceeded`, and the `est_cost_usd` an execution token binds to —
10
+ * is a **decimal string**: `"0"`, `"0.02"`, `"1200.5"`. Not a JSON number.
11
+ *
12
+ * RFC 8785 pins ES6 number serialization, so a single TypeScript runtime is
13
+ * internally consistent with itself. Cross-language it is not: the fast-path of
14
+ * SPEC.md §13 and any second implementation must reproduce the same bytes from
15
+ * the same value, and float formatting is precisely where that breaks. A
16
+ * decimal string has one spelling, and every language agrees on it because
17
+ * nobody has to reserialize anything.
18
+ *
19
+ * **String decimal, not integer minor units.** Both remove the float; the
20
+ * choice is about what a human writes and reads. The field is named
21
+ * `est_cost_usd` and a task author writes it in YAML frontmatter next to a
22
+ * one-line summary; `est_cost_usd: "0.02"` still says two cents, while
23
+ * `est_cost_usd: 20000` says nothing without knowing the exponent this project
24
+ * picked, and picking one commits the format to a currency decision (USD has
25
+ * two decimal places, other currencies do not) that the field name does not
26
+ * make. The string also round-trips into and out of a channel message, a CLI
27
+ * table, and a policy discussion without a conversion anyone can get wrong.
28
+ *
29
+ * ## The canonical form
30
+ *
31
+ * {@link USD_STRING_PATTERN}: an optional integer part with no leading zeros,
32
+ * an optional fraction of one to six digits, no sign, no exponent, no trailing
33
+ * dot, no trailing zeros beyond the last significant digit. One value, one
34
+ * spelling — `"0.10"` and `"0.1"` cannot both be written, so two records
35
+ * carrying the same amount always hash the same way.
36
+ *
37
+ * Six fractional digits is the resolution, matching the micro-USD unit the
38
+ * arithmetic below runs in. It is far finer than any real amount and far
39
+ * coarser than IEEE-754 drift.
40
+ *
41
+ * ## The arithmetic
42
+ *
43
+ * All budget arithmetic runs in **integer micro-USD**. A decimal string parses
44
+ * to micros by integer string manipulation, never through a double, so no
45
+ * rounding happens on the way in and none is possible on the way back out.
46
+ * Sums, comparisons, and remainders are exact integers: `"0.1" + "0.2"` is
47
+ * `"0.3"`, and a window of ten thousand two-cent actions is exactly `"200"`
48
+ * rather than a value that depends on the order they were added in.
49
+ *
50
+ * ## Historical compatibility (SPEC.md §8, additive-change precedent)
51
+ *
52
+ * The log is append-only, so records written before this change carry JSON
53
+ * numbers and must keep validating, verifying, and feeding budget math exactly
54
+ * as before. Every reader here therefore accepts both forms: a decimal string
55
+ * (the only form the write boundary now admits) and a finite non-negative JSON
56
+ * number (the historical form). A historical number converts to micros by
57
+ * `Math.round(value * 1e6)`, which is deterministic for every amount the old
58
+ * write boundary could have admitted. The write boundary is the only place the
59
+ * two forms are told apart: `schema/*.schema.json` types the fields as decimal
60
+ * strings, and `validate(..., { mode: "historical" })` is the one documented
61
+ * relaxation, used by the verifier and nothing else.
62
+ */
63
+ /** Micro-USD per USD: the resolution of every amount in this module. */
64
+ export const USD_MICROS_SCALE = 1_000_000;
65
+ /** Fractional digits the canonical form admits (the micro-USD resolution). */
66
+ export const USD_FRACTION_DIGITS = 6;
67
+ /**
68
+ * The canonical decimal-string form, as a JSON Schema `pattern` source.
69
+ *
70
+ * Exported so the schemas and the runtime cannot drift: `tests/money.test.ts`
71
+ * asserts the schema files carry exactly this string.
72
+ */
73
+ export const USD_STRING_PATTERN = "^(0|[1-9][0-9]*)(\\.[0-9]{0,5}[1-9])?$";
74
+ const CANONICAL = /^(0|[1-9][0-9]*)(\.([0-9]{0,5}[1-9]))?$/u;
75
+ /** Is `value` a canonical decimal USD string? */
76
+ export function isUsdString(value) {
77
+ return typeof value === "string" && CANONICAL.test(value);
78
+ }
79
+ /**
80
+ * A canonical decimal string as integer micro-USD, or `null` when the string is
81
+ * not canonical.
82
+ *
83
+ * Parsed by integer arithmetic on the digits: the fraction is padded to six
84
+ * places and the two halves are combined, so the double never sees the value.
85
+ */
86
+ export function usdStringToMicros(value) {
87
+ const match = CANONICAL.exec(value);
88
+ if (match === null)
89
+ return null;
90
+ const whole = match[1] ?? "0";
91
+ const fraction = (match[3] ?? "").padEnd(USD_FRACTION_DIGITS, "0");
92
+ const micros = Number(whole) * USD_MICROS_SCALE + Number(fraction);
93
+ return Number.isSafeInteger(micros) ? micros : null;
94
+ }
95
+ /**
96
+ * A historical JSON number as integer micro-USD, or `null` when it is not a
97
+ * usable amount (non-finite, negative, or beyond the safe-integer range once
98
+ * scaled).
99
+ *
100
+ * `Math.round` is the documented conversion. It is deterministic, and for every
101
+ * value the pre-APRV-121 write boundary admitted (`minimum: 0`, ES6-serialized)
102
+ * it lands on the micro the author wrote.
103
+ */
104
+ export function usdNumberToMicros(value) {
105
+ if (!Number.isFinite(value) || value < 0)
106
+ return null;
107
+ const micros = Math.round(value * USD_MICROS_SCALE);
108
+ return Number.isSafeInteger(micros) ? micros : null;
109
+ }
110
+ /**
111
+ * Either accepted form as integer micro-USD, or `null` when the value is not a
112
+ * usable amount.
113
+ *
114
+ * This is the reader every enforcement path uses. It accepts the historical
115
+ * number deliberately: a record already in the log must feed budget math
116
+ * identically to before this change.
117
+ */
118
+ export function usdToMicros(value) {
119
+ if (typeof value === "string")
120
+ return usdStringToMicros(value);
121
+ if (typeof value === "number")
122
+ return usdNumberToMicros(value);
123
+ return null;
124
+ }
125
+ /** Integer micro-USD as the canonical decimal string. */
126
+ export function microsToUsdString(micros) {
127
+ if (!Number.isFinite(micros))
128
+ return "0";
129
+ const rounded = Math.round(micros);
130
+ const negative = rounded < 0;
131
+ const magnitude = Math.abs(rounded);
132
+ const whole = Math.floor(magnitude / USD_MICROS_SCALE);
133
+ const fraction = String(magnitude % USD_MICROS_SCALE)
134
+ .padStart(USD_FRACTION_DIGITS, "0")
135
+ .replace(/0+$/u, "");
136
+ const text = fraction === "" ? String(whole) : `${String(whole)}.${fraction}`;
137
+ // A negative amount is not a canonical value and never enters hashed
138
+ // material; it exists only as budget headroom already spent, which the
139
+ // verdict reports as a number rather than through this function.
140
+ return negative ? `-${text}` : text;
141
+ }
142
+ /**
143
+ * Integer micro-USD as a JSON number, for **display and CLI output only**.
144
+ *
145
+ * Never write the result of this function into hashed material: that is the
146
+ * float this module exists to remove. Budget verdicts report through it because
147
+ * a verdict is a rendered explanation of a decision the integers already made.
148
+ */
149
+ export function microsToUsdNumber(micros) {
150
+ return Math.round(micros) / USD_MICROS_SCALE;
151
+ }
152
+ /**
153
+ * Either accepted form as a canonical decimal string, or `null` when the value
154
+ * is not a usable amount.
155
+ *
156
+ * The normalizer at every boundary where an amount arrives from outside: a task
157
+ * envelope, a CLI flag, a historical log record.
158
+ */
159
+ export function normalizeUsd(value) {
160
+ const micros = usdToMicros(value);
161
+ return micros === null ? null : microsToUsdString(micros);
162
+ }
163
+ /**
164
+ * Either accepted form as a canonical decimal string, defaulting to `"0"`.
165
+ *
166
+ * The budgets contract of `core/budgets.ts` requires `est_cost_usd` on every
167
+ * consuming event, and an action that declared no cost is recorded as `"0"` —
168
+ * an authorization with no declared cost is still an authorization.
169
+ */
170
+ export function usdOrZero(value) {
171
+ return normalizeUsd(value) ?? "0";
172
+ }
173
+ /**
174
+ * Either accepted form as a JSON number, for **display surfaces only**: a
175
+ * channel card, a CLI table, a `--json` field a human reads.
176
+ *
177
+ * `0` for anything unusable, so a renderer never has to decide what to print
178
+ * for a malformed amount. Same warning as {@link microsToUsdNumber}: the result
179
+ * of this function must never be written into hashed material.
180
+ */
181
+ export function usdNumber(value) {
182
+ return microsToUsdNumber(usdToMicros(value) ?? 0);
183
+ }
184
+ /**
185
+ * Either accepted form as a JSON number, or `null` when there is no amount.
186
+ *
187
+ * The display counterpart of {@link normalizeUsd}: it keeps "declared nothing"
188
+ * distinct from "declared zero", which is a distinction the queue's own columns
189
+ * make.
190
+ */
191
+ export function usdNumberOrNull(value) {
192
+ const micros = usdToMicros(value);
193
+ return micros === null ? null : microsToUsdNumber(micros);
194
+ }
195
+ //# sourceMappingURL=money.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"money.js","sourceRoot":"","sources":["../../../src/core/money.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * What the payload store holds, read against what the log says about it
3
+ * (APRV-41's counts, APRV-59's home for them).
4
+ *
5
+ * The census is a *reporting* question, asked by `approval doctor` and by
6
+ * `approval status`, and answered from two sources that can disagree: the files
7
+ * under `.approval/payloads/` and the records of `events.jsonl`. It decides
8
+ * nothing and deletes nothing. The daemon's pruner (`daemon/prune.ts`) is the
9
+ * only caller allowed to act on the same facts, and it derives its plan through
10
+ * the two helpers exported here so that the counts a reader is shown and the
11
+ * files the daemon would remove are computed by one piece of code.
12
+ *
13
+ * ## Why this lives in `core/` and not beside the pruner
14
+ *
15
+ * The CLI reports these numbers, and a CLI verb reaching into `daemon/` to do it
16
+ * is the wrong direction: `daemon/` is a caller of the core, never a dependency
17
+ * of the surfaces. This module is that shared core. Nothing here reads a clock,
18
+ * loads a policy, appends an event, or unlinks a file.
19
+ *
20
+ * ## Why not in `core/payload-store.ts`
21
+ *
22
+ * The store module is deliberately ignorant of the log ("Nothing here opens
23
+ * `events.jsonl`"): it addresses bytes by hash and verifies them, and that
24
+ * narrowness is what makes it safe to call from every channel. The census is the
25
+ * opposite kind of thing, a comparison between the log and the store, so it gets
26
+ * its own module rather than teaching the store to read events.
27
+ */
28
+ import type { EventRecord } from "./log.js";
29
+ /** Hashes a `payload.pruned` record already names. */
30
+ export declare function prunedHashes(records: EventRecord[]): Set<string>;
31
+ export interface Binding {
32
+ /** Action keys that declared this hash. */
33
+ actionKeys: Set<string>;
34
+ /** A record named the hash without an action key: bound, but unattributable. */
35
+ unattributed: boolean;
36
+ }
37
+ /**
38
+ * Every hash any record binds to, mapped to the actions that declared it.
39
+ *
40
+ * Two attributions are understood, because they are the two the runtime writes:
41
+ * a `payload_hash` beside a record's own `action_key` (`approval.requested` and
42
+ * `approval.granted` carry it there), and the `payload_hash` of each action
43
+ * inside a `task.registered` envelope, attributed to that action's
44
+ * `idempotency_key` — which is where a *registered but not yet requested* action
45
+ * declares its bytes. Without the second, a payload stored at registration time
46
+ * would look like residue nothing bound and be pruned out from under the request
47
+ * about to be made for it.
48
+ *
49
+ * Everything else is caught by a deep scan and deliberately treated as a
50
+ * binding this module cannot attribute: an unattributable binding is never
51
+ * prunable, so an event shape nobody here anticipated makes a payload immortal
52
+ * rather than making it disposable. The only event exempt from the scan is
53
+ * `payload.pruned`, whose whole job is to name bytes that are going.
54
+ */
55
+ export declare function bindingsOf(records: EventRecord[]): Map<string, Binding>;
56
+ export interface PayloadStoreCensus {
57
+ /** Files the store currently holds, by hash. */
58
+ files: number;
59
+ /** Distinct hashes a `payload.pruned` event names — evidence that outlived bytes. */
60
+ pruned: number;
61
+ /** Files present that no record binds: head-moved residue, prunable when enabled. */
62
+ orphans: number;
63
+ /** Files present whose prune event is already logged (a crash mid-prune). */
64
+ awaitingRemoval: number;
65
+ }
66
+ /**
67
+ * Count what the store holds against what the log says about it.
68
+ *
69
+ * Honest in both directions and about both failure modes: `pruned` is a fact of
70
+ * the log (it stays true forever, whatever the store does), `orphans` and
71
+ * `awaitingRemoval` are facts about the disagreement between the two. None of
72
+ * them is a health verdict; a reader is being told what is there.
73
+ */
74
+ export declare function payloadStoreCensus(records: EventRecord[], storeDir: string): PayloadStoreCensus;
@@ -0,0 +1,146 @@
1
+ /**
2
+ * What the payload store holds, read against what the log says about it
3
+ * (APRV-41's counts, APRV-59's home for them).
4
+ *
5
+ * The census is a *reporting* question, asked by `approval doctor` and by
6
+ * `approval status`, and answered from two sources that can disagree: the files
7
+ * under `.approval/payloads/` and the records of `events.jsonl`. It decides
8
+ * nothing and deletes nothing. The daemon's pruner (`daemon/prune.ts`) is the
9
+ * only caller allowed to act on the same facts, and it derives its plan through
10
+ * the two helpers exported here so that the counts a reader is shown and the
11
+ * files the daemon would remove are computed by one piece of code.
12
+ *
13
+ * ## Why this lives in `core/` and not beside the pruner
14
+ *
15
+ * The CLI reports these numbers, and a CLI verb reaching into `daemon/` to do it
16
+ * is the wrong direction: `daemon/` is a caller of the core, never a dependency
17
+ * of the surfaces. This module is that shared core. Nothing here reads a clock,
18
+ * loads a policy, appends an event, or unlinks a file.
19
+ *
20
+ * ## Why not in `core/payload-store.ts`
21
+ *
22
+ * The store module is deliberately ignorant of the log ("Nothing here opens
23
+ * `events.jsonl`"): it addresses bytes by hash and verifies them, and that
24
+ * narrowness is what makes it safe to call from every channel. The census is the
25
+ * opposite kind of thing, a comparison between the log and the store, so it gets
26
+ * its own module rather than teaching the store to read events.
27
+ */
28
+ import { isPayloadHash } from "./payload.js";
29
+ import { listStoredPayloadHashes } from "./payload-store.js";
30
+ import { payloadOf } from "./state.js";
31
+ /** Hashes a `payload.pruned` record already names. */
32
+ export function prunedHashes(records) {
33
+ const pruned = new Set();
34
+ for (const record of records) {
35
+ if (record.event !== "payload.pruned")
36
+ continue;
37
+ const hash = payloadOf(record)["payload_hash"];
38
+ if (isPayloadHash(hash))
39
+ pruned.add(hash);
40
+ }
41
+ return pruned;
42
+ }
43
+ /** Every payload-hash-shaped string anywhere inside a value. */
44
+ function hashesWithin(value, found) {
45
+ if (isPayloadHash(value)) {
46
+ found.add(value);
47
+ return;
48
+ }
49
+ if (Array.isArray(value)) {
50
+ for (const item of value)
51
+ hashesWithin(item, found);
52
+ return;
53
+ }
54
+ if (typeof value === "object" && value !== null) {
55
+ for (const item of Object.values(value))
56
+ hashesWithin(item, found);
57
+ }
58
+ }
59
+ /**
60
+ * Every hash any record binds to, mapped to the actions that declared it.
61
+ *
62
+ * Two attributions are understood, because they are the two the runtime writes:
63
+ * a `payload_hash` beside a record's own `action_key` (`approval.requested` and
64
+ * `approval.granted` carry it there), and the `payload_hash` of each action
65
+ * inside a `task.registered` envelope, attributed to that action's
66
+ * `idempotency_key` — which is where a *registered but not yet requested* action
67
+ * declares its bytes. Without the second, a payload stored at registration time
68
+ * would look like residue nothing bound and be pruned out from under the request
69
+ * about to be made for it.
70
+ *
71
+ * Everything else is caught by a deep scan and deliberately treated as a
72
+ * binding this module cannot attribute: an unattributable binding is never
73
+ * prunable, so an event shape nobody here anticipated makes a payload immortal
74
+ * rather than making it disposable. The only event exempt from the scan is
75
+ * `payload.pruned`, whose whole job is to name bytes that are going.
76
+ */
77
+ export function bindingsOf(records) {
78
+ const bindings = new Map();
79
+ const bindingFor = (hash) => {
80
+ let binding = bindings.get(hash);
81
+ if (binding === undefined) {
82
+ binding = { actionKeys: new Set(), unattributed: false };
83
+ bindings.set(hash, binding);
84
+ }
85
+ return binding;
86
+ };
87
+ for (const record of records) {
88
+ if (record.event === "payload.pruned")
89
+ continue;
90
+ const payload = payloadOf(record);
91
+ const attributed = new Set();
92
+ const own = payload["payload_hash"];
93
+ const key = record.action_key;
94
+ if (isPayloadHash(own) && typeof key === "string" && key.length > 0) {
95
+ bindingFor(own).actionKeys.add(key);
96
+ attributed.add(own);
97
+ }
98
+ const actions = payload["actions"];
99
+ if (Array.isArray(actions)) {
100
+ for (const action of actions) {
101
+ if (typeof action !== "object" || action === null)
102
+ continue;
103
+ const item = action;
104
+ const hash = item["payload_hash"];
105
+ const declaredKey = item["idempotency_key"];
106
+ if (!isPayloadHash(hash))
107
+ continue;
108
+ if (typeof declaredKey === "string" && declaredKey.length > 0) {
109
+ bindingFor(hash).actionKeys.add(declaredKey);
110
+ attributed.add(hash);
111
+ }
112
+ }
113
+ }
114
+ const mentioned = new Set();
115
+ hashesWithin(payload, mentioned);
116
+ for (const hash of mentioned) {
117
+ if (attributed.has(hash))
118
+ continue;
119
+ bindingFor(hash).unattributed = true;
120
+ }
121
+ }
122
+ return bindings;
123
+ }
124
+ /**
125
+ * Count what the store holds against what the log says about it.
126
+ *
127
+ * Honest in both directions and about both failure modes: `pruned` is a fact of
128
+ * the log (it stays true forever, whatever the store does), `orphans` and
129
+ * `awaitingRemoval` are facts about the disagreement between the two. None of
130
+ * them is a health verdict; a reader is being told what is there.
131
+ */
132
+ export function payloadStoreCensus(records, storeDir) {
133
+ const present = listStoredPayloadHashes(storeDir);
134
+ const pruned = prunedHashes(records);
135
+ const bindings = bindingsOf(records);
136
+ let orphans = 0;
137
+ let awaitingRemoval = 0;
138
+ for (const hash of present) {
139
+ if (pruned.has(hash))
140
+ awaitingRemoval += 1;
141
+ else if (!bindings.has(hash))
142
+ orphans += 1;
143
+ }
144
+ return { files: present.length, pruned: pruned.size, orphans, awaitingRemoval };
145
+ }
146
+ //# sourceMappingURL=payload-census.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-census.js","sourceRoot":"","sources":["../../../src/core/payload-census.ts"],"names":[],"mappings":"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"}