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,114 @@
1
+ /**
2
+ * Telegram configuration NAMES (SPEC.md §5.1 `channels.telegram.token_env` /
3
+ * `chat_id_env`, amended §5.2 by APRV-72).
4
+ *
5
+ * Constants and resolvers live in core, not in `channels/`, because more than
6
+ * one layer needs them: the Telegram CLI, doctor, and `approval env` (APRV-73)
7
+ * all ask "which variable holds the token?" and none of them may answer it
8
+ * differently. Placing them here also keeps `core/` free of any import from
9
+ * `channels/`, in the spirit of `tests/layering.test.ts`.
10
+ *
11
+ * NAMES only, in both directions: a policy that carried the token would be a
12
+ * bot credential in a file agents may read, which is exactly what §5.1's
13
+ * name-indirection exists to prevent. A policy that failed to load names
14
+ * nothing, so the default applies: a variable name is not a permission, and
15
+ * treating it as one would mean an unrelated policy typo locked the operator
16
+ * out of their own channel. This is `passphraseEnvFor`'s argument, verbatim,
17
+ * for the same reason: these are the same kind of key.
18
+ *
19
+ * Nothing here reads `process.env`. The CLI layer takes the name and looks
20
+ * the value up.
21
+ */
22
+ /**
23
+ * The environment variable the bot token is read from when the policy declares
24
+ * no `channels.telegram.token_env`. A DEFAULT, not a fixed name: see
25
+ * {@link telegramTokenEnvFor}.
26
+ */
27
+ export const TELEGRAM_TOKEN_ENV = "APPROVAL_TG_TOKEN";
28
+ /**
29
+ * The environment variable the approver chat id is read from when the policy
30
+ * declares no `channels.telegram.chat_id_env`. Also a default.
31
+ */
32
+ export const TELEGRAM_CHAT_ENV = "APPROVAL_TG_CHAT";
33
+ /** The NAME of the variable this policy says the bot token lives in. */
34
+ export function telegramTokenEnvFor(load) {
35
+ return declaredEnvName(load, "token_env") ?? TELEGRAM_TOKEN_ENV;
36
+ }
37
+ /** The NAME of the variable this policy says the approver chat id lives in. */
38
+ export function telegramChatEnvFor(load) {
39
+ return declaredEnvName(load, "chat_id_env") ?? TELEGRAM_CHAT_ENV;
40
+ }
41
+ /**
42
+ * What an absent `channels.telegram.delivery` means.
43
+ *
44
+ * Paced, since APRV-216. The incident behind it is the one APRV-196 softened
45
+ * rather than closed: a restart with six pending policy edits put six prompts
46
+ * on a phone at once, and an approver reading a wall of near-identical
47
+ * questions is an approver who taps rather than reads. A default is a claim
48
+ * about which failure is worse, and the worse one here is inattentive approval
49
+ * rather than a slower queue: pacing withholds nothing, because every request
50
+ * stays pending in the log whether or not it has been shown, and `/queue`
51
+ * lists the whole set on demand.
52
+ */
53
+ export const TELEGRAM_DEFAULT_DELIVERY = "paced";
54
+ /**
55
+ * The delivery mode this policy declares, or the default.
56
+ *
57
+ * Fail-soft in the same direction as the two name resolvers above: a policy
58
+ * that did not load declares nothing, and a delivery mode is not a permission,
59
+ * so an unrelated policy typo must not decide how requests are shown. The
60
+ * schema closes the enum, so a policy that LOADED can only carry one of the
61
+ * two; anything else reaching here (a hand-built load result, a key from a
62
+ * later version) falls back rather than being guessed at.
63
+ */
64
+ export function telegramDeliveryFor(load) {
65
+ if (!load.ok)
66
+ return TELEGRAM_DEFAULT_DELIVERY;
67
+ const declared = load.policy.channels?.["telegram"]?.["delivery"];
68
+ if (declared === "paced" || declared === "burst")
69
+ return declared;
70
+ return TELEGRAM_DEFAULT_DELIVERY;
71
+ }
72
+ /**
73
+ * The Telegram channel's credential manifest (APRV-79).
74
+ *
75
+ * The same shape an adapter declares (`core/credential-spec.ts`), for the same
76
+ * reason: `approval setup channel telegram` runs the shared conversation in
77
+ * `cli/setup-flow.ts`, and that conversation is DERIVED from a manifest. What
78
+ * differs from an adapter's is the destination and not the vocabulary — a
79
+ * channel's two values go to the OS keystore and `.approval/env`, because a
80
+ * channel holds no state and its token is what unlocks the machine, while an
81
+ * adapter's go to the vault (SPEC.md §4, §10.3, §10.4).
82
+ *
83
+ * The NAMES are the policy's, resolved through the two functions above, so the
84
+ * checklist an operator reads names the variables their own policy declares.
85
+ * A spec carries no value and no default on either entry: the token is the
86
+ * operator's and the chat id is discovered.
87
+ */
88
+ export function telegramCredentialSpecs(load) {
89
+ return [
90
+ {
91
+ name: telegramTokenEnvFor(load),
92
+ kind: "secret",
93
+ label: "bot token from @BotFather",
94
+ describe: "the bot credential, stored in the OS keystore; this file records only where it lives",
95
+ required: true,
96
+ },
97
+ {
98
+ name: telegramChatEnvFor(load),
99
+ kind: "config",
100
+ label: "approver chat id",
101
+ describe: "discovered from the bot's updates, written as a literal: a chat id is not a secret",
102
+ required: true,
103
+ },
104
+ ];
105
+ }
106
+ /** A non-empty string under `channels.telegram.<key>`, or `null`. */
107
+ function declaredEnvName(load, key) {
108
+ if (!load.ok)
109
+ return null;
110
+ const telegram = load.policy.channels?.["telegram"];
111
+ const declared = telegram === undefined ? undefined : telegram[key];
112
+ return typeof declared === "string" && declared.length > 0 ? declared : null;
113
+ }
114
+ //# sourceMappingURL=telegram-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-config.js","sourceRoot":"","sources":["../../../src/core/telegram-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AAEtD;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AAEpD,wEAAwE;AACxE,MAAM,UAAU,mBAAmB,CAAC,IAAsB;IACxD,OAAO,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,kBAAkB,CAAC;AAClE,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACvD,OAAO,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,iBAAiB,CAAC;AACnE,CAAC;AAiBD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAqB,OAAO,CAAC;AAEnE;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAsB;IACxD,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,yBAAyB,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IAClE,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAC;IAClE,OAAO,yBAAyB,CAAC;AACnC,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAsB;IAC5D,OAAO;QACL;YACE,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;YAC/B,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,2BAA2B;YAClC,QAAQ,EACN,sFAAsF;YACxF,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC;YAC9B,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,kBAAkB;YACzB,QAAQ,EACN,oFAAoF;YACtF,QAAQ,EAAE,IAAI;SACf;KACF,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,SAAS,eAAe,CAAC,IAAsB,EAAE,GAAW;IAC1D,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpE,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,409 @@
1
+ /**
2
+ * Execution tokens (SPEC.md §10.4, §11) — the hard-enforcement primitive.
3
+ *
4
+ * An adapter holds credentials and "MUST require a valid, unexpired, single-use
5
+ * execution token bound to the action's `idempotency_key`" (SPEC.md §10.4).
6
+ * This module mints those tokens, decides whether a presented one is still good,
7
+ * and spends it. Everything it knows it derives from the append-only log.
8
+ *
9
+ * ## The five settled properties (human decision, 2026-08-06)
10
+ *
11
+ * 1. **Minted at grant.** There is exactly one mint site: the grant path of
12
+ * `core/gate.ts`'s {@link import("./gate.js").decide}. No other code path
13
+ * creates a token, so a token's existence *is* a human's yes.
14
+ * 2. **Single-use.** Consumption is an `execution.started` event, so the second
15
+ * attempt is refused by reading the log rather than by remembering anything.
16
+ * Double-spend detection is chain-native: it survives a process restart, a
17
+ * different machine, and a lost in-memory cache, because the evidence is the
18
+ * log itself.
19
+ * 3. **Bound to the request, its `idempotency_key`, and its `payload_hash`**
20
+ * (amended SPEC.md §10, A1). A token is looked up by `action_key` — the
21
+ * envelope's `idempotency_key` — and is compared against the hash on *that*
22
+ * action's grant. A token minted for action A therefore cannot be presented
23
+ * for action B: B's grant carries a different hash (or no grant at all), and
24
+ * the comparison fails. The third binding is to the bytes: a consumer states
25
+ * the hash of the payload it is about to execute, and anything but the hash
26
+ * the grant recorded is refused `payload-mismatch`. A grant approves specific
27
+ * bytes; changing them after grant requires a new request. A grant that
28
+ * recorded *no* bytes is refused too — see {@link consumeToken}.
29
+ * 4. **Hash-only in the log.** `approval.granted` carries
30
+ * `payload.token_sha256`; the raw token is returned to the caller of `decide`
31
+ * and to nothing else. Possession is proven by presenting a preimage. An
32
+ * attacker with a copy of the log — the one artifact this system deliberately
33
+ * makes durable, copyable, and auditable — gains no ability to execute.
34
+ * 5. **No separate token TTL in v0.1.** A token dies exactly three ways:
35
+ * execution ({@link consumeToken}), revocation (`approval.revoked`), and the
36
+ * lapse of the *parent request's* TTL (`defaults.approval_ttl`, measured from
37
+ * the `approval.requested` timestamp). Inventing a second, independent clock
38
+ * would create a state where a request is live and its token is not, which no
39
+ * operator could explain from the log.
40
+ *
41
+ * ## Why the parent TTL bounds a *granted* request
42
+ *
43
+ * `requestState` deliberately stops applying the TTL once a decision lands: an
44
+ * answered request is answered. Token liveness is a stricter question than
45
+ * request state, and the settled design gives an approval a shelf life. So
46
+ * {@link tokenStatus} re-applies `requestTs + approval_ttl` to a *granted*
47
+ * request and refuses with `token-expired` past it. This never mutates the
48
+ * derived request state and never writes anything — an aged-out token is simply
49
+ * not spendable, and re-requesting the action is the repair. (Contrast
50
+ * `core/gate.ts`, which materialises `approval.expired` when it discovers a
51
+ * lapse on an *undecided* request. That branch belongs to the gate and this
52
+ * module does not duplicate it: a granted request's `approval.expired` would
53
+ * claim the human never answered.)
54
+ *
55
+ * ## Where this module sits between APRV-16 and APRV-18
56
+ *
57
+ * `core/gate.ts` deliberately appends no `execution.*` event. {@link
58
+ * consumeToken} is the **only sanctioned appender of `execution.started` on the
59
+ * manual path**, and it appends one only after a live token verifies — closing
60
+ * the gap APRV-16 flagged, where a manual action's start event had no guard at
61
+ * all.
62
+ *
63
+ * The supervised/autonomous paths are **not** this function's business. Under
64
+ * the amended SPEC.md §6.3 they produce no approval events and therefore no
65
+ * token; their `execution.started` is appended by APRV-18's `approval run`
66
+ * wrapper, which is also where their budget is charged (see the consumption
67
+ * contract in `core/budgets.ts`). One rule, stated once: *manual actions spend a
68
+ * token here; non-manual actions start there.*
69
+ *
70
+ * ## The budgets contract
71
+ *
72
+ * The appended `execution.started` carries `payload.class` and
73
+ * `payload.est_cost_usd`, **copied from the grant's payload** rather than
74
+ * re-derived. `core/budgets.ts` counts an `execution.started` only when the
75
+ * window holds no `approval.granted` with the same `action_key`, so a manual
76
+ * action that is granted and then consumed is charged exactly once — the grant.
77
+ * Copying rather than re-deriving keeps the two records agreeing about what was
78
+ * authorized even if the task file changed in between.
79
+ *
80
+ * ## Time
81
+ *
82
+ * {@link tokenStatus} and {@link verifyToken} are pure and take `now` as a
83
+ * parameter: they answer a question and write nothing, so a caller asking "was
84
+ * this token live at time T?" is asking something legitimate. {@link
85
+ * consumeToken} *writes*, and `execution.started` is a gate-typed event, so
86
+ * amended SPEC.md §8 (A2) gives its timestamp to the runtime: no `ts`
87
+ * parameter, one read of {@link TokenOptions.clock} at the top, and a spender
88
+ * that cannot choose the moment its own TTL is judged at.
89
+ */
90
+ import { type ClockOptions } from "./clock.js";
91
+ import { type AppendError, type AppendOptions, type EventRecord } from "./log.js";
92
+ import { type PolicyLoadResult } from "./policy-load.js";
93
+ import type { SandboxState } from "./sandbox.js";
94
+ import { type RequestState } from "./state.js";
95
+ /** Token entropy. 32 bytes = 256 bits, rendered as 64 lowercase hex chars. */
96
+ export declare const TOKEN_BYTES = 32;
97
+ /** The payload key carrying the token's digest, on both grant and start. */
98
+ export declare const TOKEN_HASH_FIELD = "token_sha256";
99
+ /** The payload key carrying the content binding (amended SPEC.md §6.2, §10). */
100
+ export declare const PAYLOAD_HASH_FIELD = "payload_hash";
101
+ /**
102
+ * Mint a token: 32 cryptographically random bytes as lowercase hex.
103
+ *
104
+ * `randomBytes` (CSPRNG), never `Math.random`. The value is a bearer credential
105
+ * for a real-world side effect; 256 bits makes guessing irrelevant next to every
106
+ * other attack in SPEC.md §11's "not defended" list.
107
+ */
108
+ export declare function mintToken(): string;
109
+ /** The token's SHA-256, lowercase hex — the only form that ever reaches the log. */
110
+ export declare function tokenHash(token: string): string;
111
+ /**
112
+ * Constant-time comparison of two 64-hex digests.
113
+ *
114
+ * Both operands are digests, so a timing leak reveals a prefix of a *hash*, not
115
+ * of a token — but this CLI runs on a shared developer machine beside the very
116
+ * agents it polices, and an oracle that says "your first N hex digits were
117
+ * right" is the kind of affordance that should not exist at all. `timingSafeEqual`
118
+ * costs nothing here and removes the question.
119
+ *
120
+ * Digests are compared as decoded bytes: a malformed stored digest decodes to a
121
+ * different length, which `timingSafeEqual` rejects by throwing, so the length
122
+ * guard comes first and a malformed digest simply fails to match.
123
+ */
124
+ export declare function digestsEqual(a: string, b: string): boolean;
125
+ /**
126
+ * The token refusals proper — the closed set an agent branches on to learn *why*
127
+ * a token will not execute. Frozen public API, in the same sense the gate's
128
+ * codes and the exit codes are.
129
+ *
130
+ * The four death conditions are distinguishable on purpose: "you presented the
131
+ * wrong string", "this token was already spent", "a human took it back", and
132
+ * "it aged out" call for four different responses (fix the caller, stop
133
+ * retrying, escalate to the human, re-request).
134
+ */
135
+ export declare const TOKEN_VERIFY_REFUSAL_CODES: readonly [
136
+ /** No grant governs this action key: never requested, awaiting, or rejected. */
137
+ "not-granted",
138
+ /** A grant exists, but the presented token is not its preimage. */
139
+ "token-mismatch",
140
+ /** The token was already spent: an `execution.started` exists for this key. */
141
+ "token-consumed",
142
+ /** The parent request's TTL lapsed. There is no separate token TTL. */
143
+ "token-expired",
144
+ /** A human withdrew the grant (`approval.revoked`). */
145
+ "token-revoked",
146
+ /**
147
+ * The bytes do not match (amended SPEC.md §10, A1). The grant recorded a
148
+ * `payload_hash` and the consumer presented a different one — or none at all,
149
+ * which is the same fact stated by omission: an executor that cannot say what
150
+ * it is about to run has not shown that it is running what was approved.
151
+ *
152
+ * Distinct from `token-mismatch` on purpose. That one says "you are not the
153
+ * party who was approved"; this one says "you are, but that is not what was
154
+ * approved", and the repair is different: request the new payload rather than
155
+ * hunt for a lost token.
156
+ */
157
+ "payload-mismatch",
158
+ /**
159
+ * The grant was for a harness-executed request and minted no token
160
+ * (APRV-106). Nothing is wrong: the requesting process runs the command
161
+ * itself and never had a token to spend, so there is nothing to present here
162
+ * and nothing to recover. Distinct from `token-mismatch`, which says a
163
+ * digest exists and does not match, and from `not-granted`, which says no
164
+ * authorization exists at all — this one says the authorization exists, is
165
+ * complete, and is not the kind that is spent.
166
+ */
167
+ "harness-executed"];
168
+ export type TokenVerifyRefusalCode = (typeof TOKEN_VERIFY_REFUSAL_CODES)[number];
169
+ /**
170
+ * Everything {@link consumeToken} can refuse: the verification codes plus the
171
+ * three log/append failures, whose names and meanings are borrowed verbatim from
172
+ * `core/gate.ts` so the CLI can map them onto the frozen exit table identically.
173
+ */
174
+ export declare const TOKEN_REFUSAL_CODES: readonly ["not-granted", "token-mismatch", "token-consumed", "token-expired", "token-revoked", "payload-mismatch", "harness-executed", "class-human-only", "log-unreadable", "log-torn-tail", "log-corrupt", "append-failed"];
175
+ export type TokenRefusalCode = (typeof TOKEN_REFUSAL_CODES)[number];
176
+ /** Every token failure is one of these. Nothing here throws. */
177
+ export interface TokenRefusal {
178
+ ok: false;
179
+ code: TokenRefusalCode;
180
+ message: string;
181
+ /** The derived request state at refusal time, when one could be derived. */
182
+ state?: RequestState;
183
+ /** The seq of the record that produced the refusal (grant, start, revoke). */
184
+ seq?: number;
185
+ /** The underlying append error, when `code` is `append-failed`. */
186
+ append?: AppendError;
187
+ }
188
+ /** A live, unspent grant and everything a consumer needs to spend it. */
189
+ export interface TokenStatus {
190
+ ok: true;
191
+ actionKey: string;
192
+ /** The task id the grant names; `execution.started` requires it. */
193
+ task: string | null;
194
+ /** The `approval.granted` record's seq — the mint site, for audit. */
195
+ grantSeq: number;
196
+ /** The digest recorded at mint. The raw token is not stored anywhere. */
197
+ tokenSha256: string;
198
+ /** Copied from the grant payload, per the budgets consumption contract. */
199
+ class: string;
200
+ /**
201
+ * Canonical decimal USD string (APRV-121), copied from the grant and written
202
+ * verbatim onto `execution.started`. The value is hashed material at both
203
+ * ends, so it is carried as the string the grant recorded rather than parsed
204
+ * into a number and reserialized.
205
+ */
206
+ est_cost_usd: string;
207
+ /**
208
+ * The bytes this grant approved (amended SPEC.md §10), or `null` for a grant
209
+ * that recorded none. Unreachable through the gate for a manual action —
210
+ * `request` refuses `payload-hash-required` — so `null` here means a log
211
+ * written by something other than this runtime, or one predating A1.
212
+ *
213
+ * `null` does not mean "unbound and therefore free": {@link consumeToken}
214
+ * refuses such a grant `payload-mismatch` and it can never be spent. This
215
+ * field is `string | null` so a *reader* (`approval token`, a channel) can
216
+ * report the fact; it is never a permission.
217
+ */
218
+ payloadHash: string | null;
219
+ /** The `approval.requested` timestamp the TTL is measured from. */
220
+ requestTs: string | null;
221
+ }
222
+ export type TokenStatusResult = TokenStatus | TokenRefusal;
223
+ /**
224
+ * Is there a live, unspent token for `actionKey` — and what is its digest?
225
+ *
226
+ * Pure: no I/O, no clock. `now` is the moment the question is asked; `ttlMs` is
227
+ * `defaults.approval_ttl` as the policy loader parsed it, or `null` for a policy
228
+ * that declares no lapse (in which case a granted token stays spendable until it
229
+ * is used or revoked, exactly as an undecided request stays live).
230
+ *
231
+ * Check order, and why:
232
+ *
233
+ * 1. **Revoked**, then **expired-by-derivation**, then **anything not granted**.
234
+ * A withdrawn authorization and a lapsed one are different facts and get
235
+ * different codes; everything else — never requested, still awaiting,
236
+ * rejected — is `not-granted`, because from a token's point of view they are
237
+ * the same absence.
238
+ * 2. **The parent TTL, re-applied to the grant.** See the module header.
239
+ * 3. **The recorded digest.** A grant with no usable `token_sha256` is a grant
240
+ * minted before this module existed (or by something else); it cannot
241
+ * authenticate anything, so it fails closed as `token-mismatch`.
242
+ * 4. **Consumption.** Any `execution.started` for this action key spends it —
243
+ * matching digest or not. The narrow rule (same digest) is what makes
244
+ * double-spend detection chain-native; the broader rule (same action key)
245
+ * enforces SPEC.md §7's single-use idempotency key even against a start event
246
+ * that named no token, and both answer `token-consumed`.
247
+ */
248
+ export declare function tokenStatus(records: EventRecord[], actionKey: string, now: string, ttlMs?: number | null): TokenStatusResult;
249
+ /**
250
+ * The raw token for `actionKey`, recovered from the log's `token_sealed` with
251
+ * the private key this machine holds — or `null`.
252
+ *
253
+ * `null` means "no token was delivered here", and it means it for every reason
254
+ * at once: the policy is `manual` and nothing was sealed, this is a different
255
+ * machine from the one that requested, the key file has already been unlinked
256
+ * because the token was spent, or the ciphertext does not authenticate. The
257
+ * caller's response is identical in all four cases — fall back to the raw token
258
+ * the granting surface printed — and distinguishing them would be an oracle for
259
+ * a decryption capability nobody should be probing.
260
+ *
261
+ * Recovering a minted token is not minting one. The token still exists only
262
+ * because a human granted it, still binds to the payload, and is still spendable
263
+ * exactly once; what this function replaces is the human carrying it in a
264
+ * clipboard. Nothing here consults, relaxes, or substitutes for
265
+ * {@link verifyToken}: the value returned goes on to be verified against the
266
+ * log's digest like any pasted one.
267
+ *
268
+ * Pure with respect to the LOG (it appends nothing) and reads exactly one file.
269
+ * Never throws.
270
+ */
271
+ export declare function deliveredToken(records: readonly EventRecord[], actionKey: string, keyDir: string): string | null;
272
+ /**
273
+ * Does `presentedToken` authorize `actionKey` right now?
274
+ *
275
+ * Accepts **iff** all five hold: the latest cycle for the key derives as
276
+ * `granted`; the parent request's TTL has not lapsed; the grant has not been
277
+ * revoked; no `execution.started` has spent it; and `sha256(presentedToken)`
278
+ * equals the digest recorded on the grant, compared in constant time.
279
+ *
280
+ * `ttlMs` is the parsed `defaults.approval_ttl`. It is a parameter rather than a
281
+ * policy read because this function is pure — {@link consumeToken} and the CLI
282
+ * load the policy and hand it in, so a verification can be replayed from the log
283
+ * plus the policy that was in force.
284
+ */
285
+ export declare function verifyToken(records: EventRecord[], actionKey: string, presentedToken: string, now: string, ttlMs?: number | null): TokenStatusResult;
286
+ /**
287
+ * Where to find the policy whose `approval_ttl` bounds the token — plus the two
288
+ * things a spend now carries that a status read does not.
289
+ *
290
+ * `ts` is not among them, and no longer a parameter of {@link consumeToken}:
291
+ * `execution.started` is a gate-typed event, so amended SPEC.md §8 gives its
292
+ * timestamp to the runtime at the write boundary ({@link ClockOptions}).
293
+ */
294
+ export interface TokenOptions extends ClockOptions {
295
+ /** Schema directory, passed to the append's write-boundary validation. */
296
+ schemaDir?: string;
297
+ /** Directory to discover `APPROVAL.md` in. Ignored when `policyFile` is set. */
298
+ policyDir?: string;
299
+ /** An explicit policy file, overriding discovery. */
300
+ policyFile?: string;
301
+ /** Lock tuning for the append path. */
302
+ append?: AppendOptions;
303
+ /**
304
+ * The hash of the payload the caller is **about to execute** (amended
305
+ * SPEC.md §10, A1).
306
+ *
307
+ * "Adapters and `approval run` MUST recompute the hash of the payload they
308
+ * are about to execute and MUST refuse, with a distinct machine-readable
309
+ * reason (`payload-mismatch`), when it differs from the hash the grant
310
+ * recorded." That is this field: it is not read from the log, because a value
311
+ * read from the log would prove nothing — the point is that the executor
312
+ * states, independently, what it holds, and the runtime compares.
313
+ *
314
+ * REQUIRED for every spend. Under A1 every manual grant this runtime mints
315
+ * records a `payload_hash`, and a grant that somehow records none is refused
316
+ * outright rather than treated as unbound — so there is no case in which
317
+ * omitting this field succeeds. Omitting it is a mismatch.
318
+ */
319
+ presentedPayloadHash?: string;
320
+ /**
321
+ * How many credential-bearing variables the executor withheld from the child
322
+ * it is about to spawn (APRV-205), recorded on the `execution.started` this
323
+ * spend appends.
324
+ *
325
+ * The manual path's copy of `ExecuteOptions.envStripped`, and it exists
326
+ * because the manual path's `execution.started` is written HERE rather than
327
+ * in `core/execute.ts`. A count recorded on one of the two start events and
328
+ * not the other would be a field an auditor could not rely on. A count, never
329
+ * a name and never a value.
330
+ */
331
+ envStripped?: number;
332
+ /**
333
+ * The room the child ran in (APRV-193), recorded on the `execution.started`
334
+ * this spend appends. The manual path's copy of `ExecuteOptions.sandbox`, for
335
+ * the same reason the count above is: a field recorded on one of the two
336
+ * start events and not the other is a field an auditor cannot rely on.
337
+ */
338
+ sandbox?: SandboxState;
339
+ }
340
+ export type ConsumeResult = {
341
+ ok: true;
342
+ record: EventRecord;
343
+ tokenSha256: string;
344
+ grantSeq: number;
345
+ } | TokenRefusal;
346
+ /** The parsed TTL, or `null` when the policy declares (or can declare) none. */
347
+ export declare function tokenTtlMs(options: TokenOptions): number | null;
348
+ /** The policy this module reads, loaded once per operation. */
349
+ export declare function tokenPolicy(options: TokenOptions): PolicyLoadResult;
350
+ /**
351
+ * Is `actionClass` reserved to human hands under `load` (APRV-185)?
352
+ *
353
+ * Returns the refusal to emit, or `null`. Shared by {@link consumeToken} and by
354
+ * the `approval token` verb, which report the same fact about the same class
355
+ * and must not word it two ways.
356
+ *
357
+ * The §7 irreversibility floor is deliberately not consulted: it raises to
358
+ * `manual` at most and can neither produce `human-only` nor remove it, so the
359
+ * grant's declared `reversible` — which this module does not carry anyway —
360
+ * cannot change this answer.
361
+ */
362
+ export declare function humanOnlyClassRefusal(load: PolicyLoadResult, actionClass: string | null, whatWasRefused: string): TokenRefusal | null;
363
+ /**
364
+ * Verify every read-only condition of a token spend.
365
+ *
366
+ * Shared by {@link consumeToken} and adapter execution preflight. It appends
367
+ * nothing and grants no authority to act; `consumeToken` re-reads and repeats
368
+ * this check immediately before its compare-and-append.
369
+ */
370
+ export type TokenSpendStatus = TokenStatus & {
371
+ task: string;
372
+ payloadHash: string;
373
+ };
374
+ export declare function verifyTokenSpend(records: EventRecord[], actionKey: string, presentedToken: string, now: string, load: PolicyLoadResult, presentedPayloadHash?: string): TokenSpendStatus | TokenRefusal;
375
+ /**
376
+ * Spend a token: verify it, then append `execution.started`.
377
+ *
378
+ * **This is the only sanctioned way to append `execution.started` for a manual
379
+ * action.** APRV-16 left that gap open deliberately — the gate appends no
380
+ * execution events — and this function closes it: on the manual path a start
381
+ * event now requires a live, verified, unspent token, so an agent cannot record
382
+ * an execution the human never authorized. Supervised and autonomous actions
383
+ * have no grant and therefore no token; their start event is APRV-18's `approval
384
+ * run` wrapper's job, and calling this for them correctly refuses `not-granted`.
385
+ *
386
+ * The payload is exactly `{class, est_cost_usd, token_sha256, payload_hash}`:
387
+ * the first two because `core/budgets.ts` meters authorization from them, the
388
+ * third because it is what makes the second consumption attempt refusable from
389
+ * the log alone, and the fourth because an auditor should be able to see from
390
+ * the log that what ran is what was approved. All four are copied from the
391
+ * grant, never re-derived. `payload_hash` is unconditional because a grant
392
+ * carrying none is refused (see below) rather than spent.
393
+ *
394
+ * Verification and append are made atomic by compare-and-append (APRV-20 finding
395
+ * B1): this function reads the log itself — never records handed in by a caller —
396
+ * and passes the head it read as `appendEvent`'s `expectedHead`. Two genuinely
397
+ * concurrent consumers of one token therefore cannot both start. Whichever takes
398
+ * the lockfile first appends `execution.started`; the loser finds the head moved
399
+ * under the lock and is refused `append-failed`/`head-moved` with nothing
400
+ * written. The loser is **not** retried here: re-reading would report
401
+ * `token-consumed`, but deciding to look again is the caller's call, and a core
402
+ * that silently retried would hide a double-spend attempt behind a tidy error.
403
+ *
404
+ * `actor` is not pre-validated: the event schema is the authority on actor
405
+ * shape, and a malformed one is refused at the write boundary as
406
+ * `append-failed`, with the schema's own error attached. One rule about actors,
407
+ * enforced in one place.
408
+ */
409
+ export declare function consumeToken(logPath: string, actionKey: string, presentedToken: string, actor: string, options?: TokenOptions): ConsumeResult;