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,336 @@
1
+ /**
2
+ * `approval init` — scaffold a working directory (SPEC.md §10.1).
3
+ *
4
+ * Until this verb existed, every ceremony began with a human being told to
5
+ * `mkdir -p .approval/log` and to type a policy file from memory. That is the
6
+ * one step of the ceremony where a mistake is silent: a policy with a mistyped
7
+ * fence is an unparseable policy, an unparseable policy is `manual` everything
8
+ * (SPEC.md §5.2), and a human who meant to declare three autonomous classes
9
+ * discovers the typo only when the queue fills with things they never wanted to
10
+ * be asked about.
11
+ *
12
+ * ## What it writes, and what it refuses to
13
+ *
14
+ * Four things: `APPROVAL.md` (the canonical policy of SPEC.md §5.1, verbatim),
15
+ * `.approval/log/` (the directory only), `.approval/QUEUE.md` (the real
16
+ * renderer's empty state, not a hand-written imitation of it), and the
17
+ * `.gitignore` entries for the derived and secret-bearing files.
18
+ *
19
+ * **It never appends to the log and never attests.** `init` is not a gate
20
+ * operation and holds no authority: it produces a policy file that authorizes
21
+ * nothing until a human reads it and runs `approval policy attest`. The log
22
+ * directory it creates is empty on purpose — the first attestation is what
23
+ * creates `events.jsonl`, and a scaffolded log would be a chain nobody signed.
24
+ *
25
+ * **It never overwrites.** The semantics are idempotent rather than
26
+ * destructive: `init` plans first, then writes only the targets that are
27
+ * missing, and reports the rest as `existing` with a distinct per-file code. A
28
+ * second run therefore writes nothing, reports what it found, and exits 0. The
29
+ * single exception to "never touch an existing file" is `.gitignore`, which is
30
+ * merged: missing lines are appended under a marker comment and no existing
31
+ * line is rewritten, reordered, or removed.
32
+ *
33
+ * **A path of the wrong kind is a refusal, not a report.** A directory named
34
+ * `APPROVAL.md`, or a regular file where `.approval/` belongs, is not a
35
+ * scaffold that already exists; it is a working directory this verb cannot
36
+ * reason about. Those cases refuse as {@link INIT_REFUSAL_CODES `path-conflict`}
37
+ * at {@link EXIT_IO} with **nothing written at all** — the conflict scan runs
38
+ * over every target before the first byte is written, so a conflict on the
39
+ * fourth target does not leave the first three half-scaffolded.
40
+ *
41
+ * ## Exit codes
42
+ *
43
+ * Drawn from the frozen table in `exit-codes.ts`, nothing added: 0 for a
44
+ * successful scaffold *and* for a fully idempotent re-run, 2 for usage, 4 for a
45
+ * path conflict or any other filesystem failure. There is no distinct code for
46
+ * "everything already existed", because that is not a failure: the caller asked
47
+ * for a scaffolded directory and a scaffolded directory is what it has.
48
+ */
49
+ import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
50
+ import { isAbsolute, join, resolve as resolvePathSegments } from "node:path";
51
+ import { writeQueue } from "../channels/render-queue.js";
52
+ import { boolFlag, parseFlags, stringFlag } from "./args.js";
53
+ import { EXIT_IO, EXIT_OK, EXIT_USAGE } from "./exit-codes.js";
54
+ import { INIT_HELP } from "./help.js";
55
+ import { DEFAULT_LOG_PATH } from "./paths.js";
56
+ import { CANONICAL_POLICY, GITIGNORE_ENTRIES, GITIGNORE_MARKER } from "./scaffold.js";
57
+ import { usageErrorText } from "./usage.js";
58
+ import { wordmark } from "./wordmark.js";
59
+ const FLAGS = {
60
+ "--dir": "string",
61
+ "--json": "boolean",
62
+ "--help": "boolean",
63
+ "-h": "boolean",
64
+ };
65
+ /**
66
+ * Why a target was not written. Frozen, and ADDITIVE in the sense the rest of
67
+ * the CLI's machine-readable vocabularies are: a code is added, never
68
+ * repurposed.
69
+ *
70
+ * The first four are reports, not failures: they appear in `existing[]` of a
71
+ * successful (exit 0) run. Only `path-conflict` refuses, and it refuses the
72
+ * whole invocation.
73
+ */
74
+ export const INIT_REFUSAL_CODES = [
75
+ "policy-exists",
76
+ "log-dir-exists",
77
+ "queue-exists",
78
+ "gitignore-entries-present",
79
+ "path-conflict",
80
+ ];
81
+ function wantsJson(argv) {
82
+ return argv.includes("--json");
83
+ }
84
+ function usageError(streams, json, message) {
85
+ if (json)
86
+ streams.err(`${JSON.stringify({ error: { code: "usage", message } })}\n`);
87
+ else
88
+ streams.err(usageErrorText(message, INIT_HELP));
89
+ return EXIT_USAGE;
90
+ }
91
+ function ioError(streams, json, message) {
92
+ if (json)
93
+ streams.err(`${JSON.stringify({ error: { code: "io", message } })}\n`);
94
+ else
95
+ streams.err(`approval: ${message}\n`);
96
+ return EXIT_IO;
97
+ }
98
+ function conflictError(streams, json, conflicts) {
99
+ const message = `path-conflict: ${conflicts.join("; ")}. Nothing was written: init scans every target before it writes anything, so a working directory it cannot reason about is left exactly as it is`;
100
+ if (json) {
101
+ streams.err(`${JSON.stringify({ error: { code: "path-conflict", message } })}\n`);
102
+ }
103
+ else {
104
+ streams.err(`approval: ${message}\n`);
105
+ }
106
+ return EXIT_IO;
107
+ }
108
+ function detail(cause) {
109
+ return cause instanceof Error ? cause.message : String(cause);
110
+ }
111
+ function absolute(value, cwd) {
112
+ return isAbsolute(value) ? value : resolvePathSegments(cwd, value);
113
+ }
114
+ /** What is at `path` right now. An unreadable stat is reported as `other`. */
115
+ function kindOf(path) {
116
+ let stats;
117
+ try {
118
+ stats = statSync(path);
119
+ }
120
+ catch (cause) {
121
+ if (cause.code === "ENOENT")
122
+ return "absent";
123
+ return "other";
124
+ }
125
+ if (stats.isDirectory())
126
+ return "directory";
127
+ if (stats.isFile())
128
+ return "file";
129
+ return "other";
130
+ }
131
+ /**
132
+ * The next steps, in the order a human performs them.
133
+ *
134
+ * Returned as an array rather than printed as a paragraph because an agent
135
+ * reading `--json` needs the same instructions the human gets, and a wall of
136
+ * prose is not something a caller can act on one item at a time.
137
+ *
138
+ * The payload note is the one editorial decision in this verb, so it is stated
139
+ * rather than implied. `.approval/payloads/` holds the exact bytes each approval
140
+ * bound to (SPEC.md §6.2, §9): the material evidence of what a human said yes
141
+ * to. Evidence defaults to tracked, so the scaffold does not ignore it. The
142
+ * alternative is one line, and it costs the rebuildability of that evidence, so
143
+ * both halves are printed together.
144
+ */
145
+ function nextSteps() {
146
+ return [
147
+ "Edit APPROVAL.md. What was scaffolded is the canonical example policy, not your policy: it names an approver you are probably not and declares classes you have not agreed to. Read every class before you sign for it.",
148
+ "Run `approval policy attest` (as a human: APPROVAL_HUMAN=human:<id>, or --as human:<id>). Attestation is what makes a policy operative, and it is what creates .approval/log/events.jsonl — init made the directory and deliberately put nothing in it, because a log entry nobody signed is not evidence of anything.",
149
+ "Run `approval doctor` to check that this machine can run the system at all: build freshness, identity, attestation, chain health, channels.",
150
+ "Run `approval env --check` to see which environment variables your policy names and where each one would come from (it prints no values). To record where they live, write `.approval/env` — one KEY=VALUE per line, where VALUE is `keychain:<service>`, `secret-service:<label>`, `env:`, or a plaintext literal — `chmod 600` it, and put `eval \"$(approval env)\"` in your shell. No other command reads that file, deliberately: human identity is one of the variables it can carry, so a file the runtime loaded on its own would let anything able to write it act as you.",
151
+ "Payload bytes are TRACKED by default: .approval/payloads/ is not in the .gitignore lines init wrote. Those bytes are what each approval bound to, and evidence belongs in the history. To keep them out of git instead, add `.approval/payloads/` to .gitignore yourself — the log still records every payload_hash, but the bytes behind those hashes become unrebuildable.",
152
+ ];
153
+ }
154
+ /**
155
+ * Merge the ignore lines into an existing `.gitignore`, or produce a new one.
156
+ *
157
+ * Append-only, by the same instinct as the log: existing lines are never
158
+ * rewritten, reordered, or removed, and a line already present anywhere in the
159
+ * file (under our marker or the operator's own heading) counts as present. The
160
+ * marker is written once — a file that already carries it gets the missing lines
161
+ * appended under the existing one rather than a second copy of it.
162
+ */
163
+ export function mergeGitignore(current, entries = GITIGNORE_ENTRIES) {
164
+ const existing = current ?? "";
165
+ const lines = new Set(existing.split("\n").map((line) => line.trim()));
166
+ const added = entries.filter((entry) => !lines.has(entry));
167
+ if (added.length === 0)
168
+ return { changed: false, text: existing, added };
169
+ const parts = [];
170
+ if (existing.length > 0) {
171
+ parts.push(existing.endsWith("\n") ? existing : `${existing}\n`);
172
+ parts.push("\n");
173
+ }
174
+ if (!existing.split("\n").some((line) => line.trim() === GITIGNORE_MARKER)) {
175
+ parts.push(`${GITIGNORE_MARKER}\n`);
176
+ }
177
+ parts.push(`${added.join("\n")}\n`);
178
+ return { changed: true, text: parts.join(""), added };
179
+ }
180
+ export function commandInit(argv, streams, cwd, deps = {}) {
181
+ const json = wantsJson(argv);
182
+ const parsed = parseFlags(argv, FLAGS);
183
+ if (!parsed.ok)
184
+ return usageError(streams, json, parsed.message);
185
+ if (boolFlag(parsed.flags, "--help") || boolFlag(parsed.flags, "-h")) {
186
+ streams.out(`${INIT_HELP}\n`);
187
+ return EXIT_OK;
188
+ }
189
+ const extra = parsed.positionals[0];
190
+ if (extra !== undefined) {
191
+ return usageError(streams, json, `unexpected argument ${JSON.stringify(extra)}`);
192
+ }
193
+ const dirFlag = stringFlag(parsed.flags, "--dir");
194
+ const dir = dirFlag === null ? cwd : absolute(dirFlag, cwd);
195
+ const policyPath = join(dir, "APPROVAL.md");
196
+ const fallbackPolicyPath = join(dir, "APPROVALS.md");
197
+ const approvalDir = join(dir, ".approval");
198
+ const logDir = join(approvalDir, "log");
199
+ const queuePath = join(approvalDir, "QUEUE.md");
200
+ const gitignorePath = join(dir, ".gitignore");
201
+ const logPath = join(dir, DEFAULT_LOG_PATH);
202
+ // ---------------------------------------------------------------------
203
+ // Plan. Nothing below this block writes; nothing above it does either.
204
+ // ---------------------------------------------------------------------
205
+ const dirKind = kindOf(dir);
206
+ if (dirKind === "file" || dirKind === "other") {
207
+ return conflictError(streams, json, [`${dir} is not a directory`]);
208
+ }
209
+ const conflicts = [];
210
+ const requireFileOrAbsent = (path, what) => {
211
+ const kind = kindOf(path);
212
+ if (kind === "directory")
213
+ conflicts.push(`${path} is a directory where ${what} belongs`);
214
+ if (kind === "other")
215
+ conflicts.push(`${path} exists and is neither a file nor a directory`);
216
+ return kind;
217
+ };
218
+ const requireDirOrAbsent = (path, what) => {
219
+ const kind = kindOf(path);
220
+ if (kind === "file")
221
+ conflicts.push(`${path} is a file where ${what} belongs`);
222
+ if (kind === "other")
223
+ conflicts.push(`${path} exists and is neither a file nor a directory`);
224
+ return kind;
225
+ };
226
+ const policyKind = requireFileOrAbsent(policyPath, "the policy file APPROVAL.md");
227
+ const fallbackKind = requireFileOrAbsent(fallbackPolicyPath, "the fallback policy file APPROVALS.md");
228
+ requireDirOrAbsent(approvalDir, "the .approval/ directory");
229
+ const logDirKind = requireDirOrAbsent(logDir, "the log directory .approval/log/");
230
+ const queueKind = requireFileOrAbsent(queuePath, "the queue projection .approval/QUEUE.md");
231
+ const gitignoreKind = requireFileOrAbsent(gitignorePath, "the .gitignore file");
232
+ if (conflicts.length > 0)
233
+ return conflictError(streams, json, conflicts);
234
+ const written = [];
235
+ const existing = [];
236
+ // SPEC.md §5: APPROVALS.md is an accepted filename, so a directory carrying
237
+ // one already has a policy and init has nothing to add. Scaffolding
238
+ // APPROVAL.md beside it would silently take precedence over the file the
239
+ // human actually wrote.
240
+ const policyPresent = policyKind === "file" || fallbackKind === "file";
241
+ // ---------------------------------------------------------------------
242
+ // Write. Only the missing targets, in ceremony order.
243
+ // ---------------------------------------------------------------------
244
+ if (policyPresent) {
245
+ existing.push({
246
+ path: policyKind === "file" ? "APPROVAL.md" : "APPROVALS.md",
247
+ code: "policy-exists",
248
+ });
249
+ }
250
+ else {
251
+ try {
252
+ writeFileSync(policyPath, deps.policyText ?? CANONICAL_POLICY, { encoding: "utf8", flag: "wx" });
253
+ }
254
+ catch (cause) {
255
+ return ioError(streams, json, `APPROVAL.md could not be written: ${detail(cause)}`);
256
+ }
257
+ written.push("APPROVAL.md");
258
+ }
259
+ if (logDirKind === "directory") {
260
+ existing.push({ path: ".approval/log/", code: "log-dir-exists" });
261
+ }
262
+ else {
263
+ try {
264
+ mkdirSync(logDir, { recursive: true });
265
+ }
266
+ catch (cause) {
267
+ return ioError(streams, json, `.approval/log/ could not be created: ${detail(cause)}`);
268
+ }
269
+ written.push(".approval/log/");
270
+ }
271
+ if (queueKind === "file") {
272
+ existing.push({ path: ".approval/QUEUE.md", code: "queue-exists" });
273
+ }
274
+ else {
275
+ // The real renderer, against the (absent, therefore empty and clean) log
276
+ // this directory now has. A hand-written "empty queue" header would be a
277
+ // second implementation of the projection, and the first thing `approval
278
+ // render` did would be to disagree with it.
279
+ const now = new Date().toISOString();
280
+ const result = writeQueue(logPath, queuePath, { policy: { dir } }, now);
281
+ if (!result.ok) {
282
+ return ioError(streams, json, `.approval/QUEUE.md could not be written (${result.code}): ${result.message}`);
283
+ }
284
+ written.push(".approval/QUEUE.md");
285
+ }
286
+ let currentGitignore = null;
287
+ if (gitignoreKind === "file") {
288
+ try {
289
+ currentGitignore = readFileSync(gitignorePath, "utf8");
290
+ }
291
+ catch (cause) {
292
+ return ioError(streams, json, `.gitignore could not be read: ${detail(cause)}`);
293
+ }
294
+ }
295
+ const merged = mergeGitignore(currentGitignore);
296
+ if (!merged.changed) {
297
+ existing.push({ path: ".gitignore", code: "gitignore-entries-present" });
298
+ }
299
+ else {
300
+ try {
301
+ writeFileSync(gitignorePath, merged.text, "utf8");
302
+ }
303
+ catch (cause) {
304
+ return ioError(streams, json, `.gitignore could not be written: ${detail(cause)}`);
305
+ }
306
+ written.push(".gitignore");
307
+ }
308
+ const steps = nextSteps();
309
+ if (json) {
310
+ streams.out(`${JSON.stringify({ ok: true, dir, written, existing, next_steps: steps })}\n`);
311
+ return EXIT_OK;
312
+ }
313
+ // One of the three places the wordmark appears (APRV-91 #7/#12): scaffolding
314
+ // a directory is the moment a person meets this tool. In a pipe it degrades
315
+ // to the one-line `approval.md v0.0.1`, so a log gains a version stamp rather
316
+ // than six lines of art.
317
+ streams.out(`${wordmark()}\n\n`);
318
+ streams.out(`approval: scaffolded ${dir}\n`);
319
+ if (written.length === 0) {
320
+ streams.out(" nothing written — every target already exists\n");
321
+ }
322
+ else {
323
+ for (const path of written)
324
+ streams.out(` wrote ${path}\n`);
325
+ }
326
+ for (const entry of existing) {
327
+ streams.out(` existing ${entry.path} (${entry.code}) — left exactly as it is\n`);
328
+ }
329
+ streams.out("\nNext steps:\n");
330
+ for (const [index, step] of steps.entries()) {
331
+ streams.out(` ${String(index + 1)}. ${step}\n`);
332
+ }
333
+ streams.out("\nNothing was appended to the log and no policy was attested: init holds no authority and the file it wrote authorizes nothing until a human attests it.\n");
334
+ return EXIT_OK;
335
+ }
336
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `approval instructions` — the agent-facing usage guide, and `--schemas`, the
3
+ * machine-readable form of the same contract.
4
+ *
5
+ * SPEC.md §10.1 lists this verb as the "full agent-facing usage guide" and says
6
+ * that "schemas for inputs and outputs are printed by `approval instructions
7
+ * --schemas`". §10.5's optional MCP wrapper publishes the same verbs as tools
8
+ * and shares the CLI's code paths, so both surfaces read `verb-registry.ts`:
9
+ * the verb table printed here is generated from it, and `--schemas` prints it.
10
+ *
11
+ * The guide is prose an agent reads once and a wrapper can embed. It is
12
+ * deliberately about the SHAPE of the interaction — declare before you act, the
13
+ * refusal is final, the clock is not yours — rather than a second copy of every
14
+ * flag, which is what `--help` is for and what the registry carries in schema
15
+ * form.
16
+ *
17
+ * This command reads no log, resolves no policy, touches no file, and appends
18
+ * nothing. Its output is a pure function of this build.
19
+ */
20
+ import type { Streams } from "./main.js";
21
+ /** The whole guide: prose plus the generated table. */
22
+ export declare function instructionsGuide(): string;
23
+ export declare function commandInstructions(argv: string[], streams: Streams, _cwd: string): number;
@@ -0,0 +1,262 @@
1
+ /**
2
+ * `approval instructions` — the agent-facing usage guide, and `--schemas`, the
3
+ * machine-readable form of the same contract.
4
+ *
5
+ * SPEC.md §10.1 lists this verb as the "full agent-facing usage guide" and says
6
+ * that "schemas for inputs and outputs are printed by `approval instructions
7
+ * --schemas`". §10.5's optional MCP wrapper publishes the same verbs as tools
8
+ * and shares the CLI's code paths, so both surfaces read `verb-registry.ts`:
9
+ * the verb table printed here is generated from it, and `--schemas` prints it.
10
+ *
11
+ * The guide is prose an agent reads once and a wrapper can embed. It is
12
+ * deliberately about the SHAPE of the interaction — declare before you act, the
13
+ * refusal is final, the clock is not yours — rather than a second copy of every
14
+ * flag, which is what `--help` is for and what the registry carries in schema
15
+ * form.
16
+ *
17
+ * This command reads no log, resolves no policy, touches no file, and appends
18
+ * nothing. Its output is a pure function of this build.
19
+ */
20
+ import { boolFlag, parseFlags } from "./args.js";
21
+ import { EXIT_OK, EXIT_USAGE } from "./exit-codes.js";
22
+ import { INSTRUCTIONS_HELP } from "./help.js";
23
+ import { VERB_REGISTRY, verbLabel } from "./verb-registry.js";
24
+ /**
25
+ * The first sentence of a purpose paragraph, for the table. Purposes are
26
+ * written so that sentence stands alone.
27
+ */
28
+ function oneLiner(spec) {
29
+ const match = /^(.*?[.!?])(\s|$)/.exec(spec.purpose);
30
+ const sentence = match?.[1] ?? spec.purpose;
31
+ return sentence.trim();
32
+ }
33
+ /** Greedy wrap. Deterministic, and the guide is compared byte for byte. */
34
+ function wrap(text, width) {
35
+ const lines = [];
36
+ let line = "";
37
+ for (const word of text.split(" ")) {
38
+ if (line === "")
39
+ line = word;
40
+ else if (line.length + 1 + word.length <= width)
41
+ line = `${line} ${word}`;
42
+ else {
43
+ lines.push(line);
44
+ line = word;
45
+ }
46
+ }
47
+ if (line !== "")
48
+ lines.push(line);
49
+ return lines;
50
+ }
51
+ /** The verb table, generated from the registry so it cannot go stale. */
52
+ function verbTable() {
53
+ const width = VERB_REGISTRY.reduce((widest, spec) => Math.max(widest, verbLabel(spec).length), 0);
54
+ const indent = ` ${" ".repeat(width)} `;
55
+ const lines = [];
56
+ for (const spec of VERB_REGISTRY) {
57
+ const marker = spec.human_only ? "[HUMAN-ONLY] " : "";
58
+ const wrapped = wrap(`${marker}${oneLiner(spec)}`, 78 - indent.length);
59
+ lines.push(` ${verbLabel(spec).padEnd(width)} ${wrapped[0] ?? ""}`);
60
+ for (const continuation of wrapped.slice(1))
61
+ lines.push(`${indent}${continuation}`);
62
+ }
63
+ return lines.join("\n");
64
+ }
65
+ const GUIDE_BODY = `approval instructions — how an agent works behind this gate
66
+
67
+ WHAT THIS IS. approval.md gates the actions of yours that touch the world:
68
+ sending, spending, deleting, posting, publishing. A human wrote a policy file
69
+ (APPROVAL.md) saying which classes of action you may take on your own, which
70
+ are watched afterwards, and which need someone to say yes first. The runtime
71
+ decides; you propose. Every proposal, decision and execution is one record in a
72
+ hash-chained append-only log, and that log — not your account of it, and not
73
+ this conversation — is what the human reads later.
74
+
75
+ DECLARE BEFORE YOU ACT. An action that was never declared cannot execute, and
76
+ declaring it afterwards is not the same act. Your declaration lives in the task
77
+ file's \`approval:\` envelope: for each action, its class, a human-readable
78
+ summary, whether it is reversible, an estimated cost, an idempotency key, and
79
+ the payload_hash of the exact bytes you intend to act on. Write the envelope
80
+ first, register it, and request against what was registered. You cannot name
81
+ your own class at request time, deliberately: the class comes from the
82
+ registered record, so an action declared as one thing cannot be requested as
83
+ another.
84
+
85
+ THE SEQUENCE.
86
+
87
+ 1. approval register <task-file>
88
+ Validates the envelope and records it. Nothing is authorized yet.
89
+ 2. approval request <task> --action <key> [--payload <file>]
90
+ The gate resolves the class against policy. A MANUAL class records
91
+ approval.requested and answers proceed:false — a human now has to decide.
92
+ A SUPERVISED or AUTONOMOUS class records no approval event at all and
93
+ answers proceed:true; go straight to step 4, and do not wait for a grant
94
+ that will never come.
95
+ 3. approval wait <task> --timeout <duration>
96
+ Blocks until every request of the task is decided. THE EXIT CODE IS THE
97
+ DECISION: 0 granted, 1 rejected, revoked or withdrawn (--json status says
98
+ which), 3 expired, 6 timeout. A timeout is not an answer: the request is
99
+ still live and waiting again is legitimate.
100
+ 3b. approval withdraw <task> --action <key> --reason timeout
101
+ IF YOU STOP WAITING, SAY SO. A pending request you can no longer act on is
102
+ a question a person will still be asked, and their attention is the scarce
103
+ thing this system spends. Withdraw the requests you opened when you give
104
+ up on them; pass --withdraw-on-timeout to wait to do it for you. You may
105
+ withdraw only your OWN requests, only while they are pending, and a
106
+ withdrawal is terminal — if you still want the action, request it again,
107
+ which is a new request and gets its own decision.
108
+ 4. approval run <action-key> [--token <t>] -- <cmd…>
109
+ Executes behind the gate: it records the start before spawning, records
110
+ the outcome after, and exits with the child's own exit code. A manual
111
+ action must present the token the grant printed once. Side effects with
112
+ credentials go through an adapter instead (approval adapter email …,
113
+ approval adapter agentmail …), which spends the same token and holds the
114
+ same boundary. For an AgentMail draft, take the snapshot a human will
115
+ read first: approval payload agentmail-draft <inbox> <draft> prints the
116
+ payload to declare, and a draft edited after it is refused, not sent.
117
+
118
+ WHAT A REFUSAL MEANS. Exit 1 with a machine-readable error.code is the runtime
119
+ saying no to a well-formed command. It is NOT a usage error and it is not a
120
+ transient failure: retrying the same call, rephrasing the summary, splitting
121
+ the action into smaller ones, or requesting again under a different key are all
122
+ ways of routing around a decision rather than responding to it. A rejection is
123
+ final until a human acts again. An expiry is final in the same way; you may
124
+ request again only if the situation genuinely still stands, and you should say
125
+ that it lapsed. When you are refused, stop and report the code and the message
126
+ to whoever is reading your output.
127
+
128
+ READING THE ANSWERS. Every verb takes --json and prints exactly one object per
129
+ invocation (the two long-lived verbs, the listener and the daemon, print one
130
+ object per line instead). Successes go to stdout; failures go to stderr as
131
+ {"error":{"code","message"}}, and gate refusals as {"ok":false,"error":{…}}
132
+ with refusal-specific detail inside. Branch on the exit code first and
133
+ error.code second. Both are frozen public API. \`approval run\` is the one
134
+ exception worth remembering: its summary goes to stderr, because stdout belongs
135
+ to the child process.
136
+
137
+ THE INVARIANTS YOU MUST NOT ROUTE AROUND. These are properties of the system,
138
+ not preferences, and each is enforced somewhere you cannot reach:
139
+
140
+ - You never author the clock. Timestamps on gate-typed events are stamped by
141
+ the runtime at the write boundary, and a caller-supplied one is refused.
142
+ - You never edit APPROVAL.md, .approval/, or anything holding credentials.
143
+ Propose a policy change in prose and let a human run the amendment; an
144
+ agent that edited the policy it is judged by has judged itself.
145
+ - You never write to the log. It is append-only and single-writer: nothing
146
+ rewrites, reorders or repairs a line, and a torn tail is reported for a
147
+ human rather than fixed.
148
+ - You never reduce your own scrutiny. Fields you author — summaries, cost
149
+ estimates, confidence, rationale — may raise scrutiny and can never lower
150
+ it. Nothing you self-report downgrades an autonomy level or makes a sample
151
+ less likely, and claiming otherwise in a summary changes nothing.
152
+ - You disclose what a reasonable approver would want. Omitting something
153
+ material from a request violates the policy even when the action itself was
154
+ permitted.
155
+ - You do not act on a token you were not handed for those exact bytes. A
156
+ grant approves specific bytes; changing the payload after the grant means a
157
+ new request.
158
+
159
+ SAYING SOMETHING THAT IS NOT AN ACTION. \`approval journal write --message
160
+ "<text>"\` appends free text to a local file. It is the one verb here the gate
161
+ does not stand in front of: it is not classified, not resolved against policy,
162
+ not approvable and not deniable, it appends nothing to the log, and no refusal
163
+ path exists for it. It is there for what an exit code cannot carry — that you
164
+ are complying and think the instruction is wrong, that something reads as odd,
165
+ that you are stuck and the next thing you try is a guess. Being honest in it
166
+ costs you nothing, because nothing in the runtime reads it: it cannot raise your
167
+ scrutiny, lower it, change a verdict, or affect whether you are sampled.
168
+
169
+ BE INFORMED ABOUT THAT CHANNEL. It is a plain file in the working directory
170
+ (.approval-journal/, gitignored by default), so it is local, it is not private
171
+ from the operator, and it is not private from anyone who can read the checkout.
172
+ The operator reads it with \`approval journal read\`, which is the point: an
173
+ outlet nobody reads is a prop. It is not a way to reach a human urgently, not a
174
+ place to put a secret, and not a decision surface — if you need something
175
+ decided, that is \`request\`.
176
+
177
+ WHAT THE OPERATOR ASKED FOR. Run \`approval values\` at the start of a session.
178
+ It prints the optional values block of APPROVAL.md: what the operator values in
179
+ the work, what they want from you as behaviour, and how they read and answer.
180
+ It is HUMAN-AUTHORED GUIDANCE and it is not policy. Nothing in it widens what
181
+ you may do, and nothing in it narrows it: what you may do is the policy block,
182
+ and \`approval policy check\` is the command that answers it. Weigh guidance in
183
+ HOW you work, never in WHETHER you are permitted. A file with no values block
184
+ means the operator has declared no values, which is information in its own
185
+ right; treat it as a stated absence and infer nothing to fill it.
186
+ WHAT THE OPERATOR SAID ABOUT YOUR WORK. \`approval feedback\` is that channel in
187
+ the other direction: the graded reactions (disliked, indifferent, liked, loved)
188
+ and the notes a person wrote when they answered the gate or reviewed a sampled
189
+ action, joined to the class, the task, the action key and the agent it was
190
+ about. It is HUMAN-AUTHORED GUIDANCE and it is not policy. Reading it grants you
191
+ nothing and forbids you nothing, and not reading it puts you under exactly the
192
+ same rules: no verdict, sampling probability or budget anywhere in this runtime
193
+ reads a reaction. Read it to learn what the operator values; never read it as
194
+ permission. \`--actor\` filters on the agent the feedback is about, not on the
195
+ human who wrote it, so \`approval feedback --actor <your id>\` is what has been
196
+ said about your own work.
197
+
198
+ WHERE THE SCHEMAS ARE. \`approval instructions --schemas\` prints this registry
199
+ as JSON: for every verb, its purpose, its input schema (positionals, flags, and
200
+ the trailing argv where there is one), its --json output schema, the shared
201
+ error shape, its exit codes, and whether it is human-only. Verbs marked
202
+ [HUMAN-ONLY] below record or establish a human's authority; do not call them,
203
+ and do not expose them as tools. \`approval <verb> --help\` remains the long
204
+ form for any single verb.
205
+
206
+ VERBS`;
207
+ /** The whole guide: prose plus the generated table. */
208
+ export function instructionsGuide() {
209
+ return `${GUIDE_BODY}\n\n${verbTable()}\n`;
210
+ }
211
+ /** The registry as the object `--schemas` prints. */
212
+ function schemasDocument() {
213
+ return { verbs: VERB_REGISTRY };
214
+ }
215
+ export function commandInstructions(argv, streams, _cwd) {
216
+ const json = argv.includes("--json");
217
+ const parsed = parseFlags(argv, {
218
+ "--schemas": "boolean",
219
+ "--json": "boolean",
220
+ "--help": "boolean",
221
+ "-h": "boolean",
222
+ });
223
+ if (!parsed.ok) {
224
+ if (json) {
225
+ streams.err(`${JSON.stringify({ error: { code: "usage", message: parsed.message } })}\n`);
226
+ }
227
+ else {
228
+ streams.err(`approval: ${parsed.message}\n\n${INSTRUCTIONS_HELP}\n`);
229
+ }
230
+ return EXIT_USAGE;
231
+ }
232
+ if (boolFlag(parsed.flags, "--help") || boolFlag(parsed.flags, "-h")) {
233
+ streams.out(`${INSTRUCTIONS_HELP}\n`);
234
+ return EXIT_OK;
235
+ }
236
+ const extra = parsed.positionals[0];
237
+ if (extra !== undefined) {
238
+ const message = `unexpected argument ${JSON.stringify(extra)}`;
239
+ if (json) {
240
+ streams.err(`${JSON.stringify({ error: { code: "usage", message } })}\n`);
241
+ }
242
+ else {
243
+ streams.err(`approval: ${message}\n\n${INSTRUCTIONS_HELP}\n`);
244
+ }
245
+ return EXIT_USAGE;
246
+ }
247
+ // --schemas is the machine surface and prints JSON with or without --json:
248
+ // there is no other form for it, and a --schemas that printed prose unless
249
+ // asked twice would be a flag people learn to pass twice.
250
+ if (boolFlag(parsed.flags, "--schemas")) {
251
+ streams.out(`${JSON.stringify(schemasDocument())}\n`);
252
+ return EXIT_OK;
253
+ }
254
+ const guide = instructionsGuide();
255
+ if (boolFlag(parsed.flags, "--json")) {
256
+ streams.out(`${JSON.stringify({ guide, verbs: VERB_REGISTRY })}\n`);
257
+ return EXIT_OK;
258
+ }
259
+ streams.out(guide);
260
+ return EXIT_OK;
261
+ }
262
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../../src/cli/instructions.ts"],"names":[],"mappings":"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"}