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,221 @@
1
+ /**
2
+ * Prompt layout: which INFORMATIONAL rows a channel puts in front of an
3
+ * approver, as a policy decision rather than a code decision (APRV-218).
4
+ *
5
+ * SPEC.md §5.2 gains `channels.<name>.prompt`; SPEC.md §10.3 already says a
6
+ * channel holds no truth, and this module is what keeps that so — the block
7
+ * decides what is SHOWN, never what is true, and every field it can reach was
8
+ * already on the `ChannelRequest` and already in `--json`, `approval queue` and
9
+ * the web page. Nothing here reads the log, and no key added here lets a
10
+ * channel learn anything about it.
11
+ *
12
+ * ## Why this is a policy key at all
13
+ *
14
+ * The Telegram prompt was slimmed deliberately: APRV-143 dropped the `ttl` row
15
+ * because the `waiting … expires HH:MM UTC` line already states the deadline,
16
+ * and APRV-163 dropped six bookkeeping rows and made three health rows render
17
+ * only when abnormal. That layout fits ONE operator's workflow. Another wants
18
+ * the budget line on every prompt, or the TTL as a duration, or the task id
19
+ * always visible. Those are preferences about a screen, and preferences about a
20
+ * screen belong in the policy file beside the other things an operator chooses,
21
+ * not in a `git blame` argument about a default.
22
+ *
23
+ * ## What a layout may NOT do
24
+ *
25
+ * A layout chooses among rows the approver may read. It cannot touch what the
26
+ * approver SIGNS. Three things are therefore out of its reach entirely:
27
+ *
28
+ * 1. **The canonical block** (SPEC.md §9's "what you see is what you sign") is
29
+ * not a row. It carries the payload bytes, the renderer version, the class,
30
+ * the kind and the bound `payload sha256`, it is rendered verbatim, and no
31
+ * key in this module can reorder, shorten, or remove it.
32
+ * 2. **The computed/claimed split.** A row's side of the boundary is a property
33
+ * of the field (`TaggedField.kind`), not of the layout. `rows` reorders; it
34
+ * cannot move a claimed line into the computed block, because a channel
35
+ * partitions by kind AFTER it applies the order. That is the property
36
+ * APRV-144's CLAIMED heading exists for, and a test pins it.
37
+ * 3. **{@link REQUIRED_PROMPT_ROWS}**, the rows the contract marks as required
38
+ * for a decision. Naming one in `hide` is a policy that fails to load.
39
+ *
40
+ * The buttons are not a row either, for the same reason the block is not: a
41
+ * prompt with no way to answer it is not a prompt.
42
+ *
43
+ * ## Fail directions
44
+ *
45
+ * Soft on ABSENCE, closed on INVALIDITY, which is the split every other policy
46
+ * key in this runtime keeps. No `prompt` block, or a policy that did not load,
47
+ * means today's rows: a layout is not a permission, and an unrelated typo in a
48
+ * class rule must not silently redecorate a phone screen. An unknown row name
49
+ * or a required row in `hide` is a statement the runtime cannot honour, so the
50
+ * WHOLE policy fails schema validation and every class resolves to `manual` —
51
+ * the operator repairs the file, and until they do the gate is at its
52
+ * strictest.
53
+ *
54
+ * Pure: no clock, no IO, no environment. It sits in `core/` rather than in
55
+ * `channels/` for `core/telegram-config.ts`'s reason — more than one layer asks
56
+ * "which rows does this policy want?" and none of them may answer differently —
57
+ * and it imports nothing from `channels/`, so `tests/layering.test.ts` stays
58
+ * true. The row names below are the `ChannelRequest` member names spelled as
59
+ * plain strings for exactly that reason.
60
+ */
61
+ import type { Policy, PolicyLoadResult } from "./policy-load.js";
62
+ import type { ValidationError } from "./validate.js";
63
+ /**
64
+ * The row vocabulary: every `ChannelRequest` member a channel renders as a row.
65
+ *
66
+ * Closed, and closed for `delivery`'s reason (APRV-216): a name this runtime
67
+ * cannot place is a row the author believes is in force that nothing reads, and
68
+ * guessing at it would be the silent no-op the whole policy schema is shaped to
69
+ * prevent.
70
+ *
71
+ * `fullPayload` is deliberately ABSENT. The canonical block is not a row.
72
+ */
73
+ export declare const PROMPT_ROWS: readonly ["action_key", "task", "class", "command_breakdown", "protected_path", "policy_diff", "policy_load", "autonomy", "provenance", "state", "requested_ts", "waiting", "ttl_remaining_ms", "payload_hash", "attestation", "budgets", "chain", "token_delivery", "est_cost_usd", "gloss", "summary", "rationale", "confidence"];
74
+ /** One row name from {@link PROMPT_ROWS}. */
75
+ export type PromptRow = (typeof PROMPT_ROWS)[number];
76
+ /** Whether a string is a row name this runtime knows how to place. */
77
+ export declare function isPromptRow(value: unknown): value is PromptRow;
78
+ /**
79
+ * The rows an operator may reorder but never remove.
80
+ *
81
+ * Each is required for a DECISION rather than for a screen. `action_key`
82
+ * identifies which request the gesture answers; `class` is the resolution the
83
+ * whole gate turns on; `command_breakdown` and `protected_path` are APRV-144
84
+ * and APRV-143's answer to "what does this command actually do, and which
85
+ * protected path earned the class", derived from the bound bytes by the same
86
+ * classifier the hook decided with; `policy_diff` and `policy_load` are what
87
+ * SPEC.md §10.3 requires of an attestation prompt, where "a prompt carrying
88
+ * only a hash asks a human to sign for sixty-four characters and is a
89
+ * conformance failure".
90
+ *
91
+ * `payload_hash` is NOT here, and its absence is not an oversight. The bound
92
+ * hash is stated inside the canonical block on every channel, and the block is
93
+ * out of a layout's reach, so an operator who hides the row removes a
94
+ * duplicate rather than the binding. Telegram's default layout already does
95
+ * exactly that (APRV-163).
96
+ *
97
+ * A required row a request does not CARRY renders nothing, as it does today.
98
+ * Requirement is about what a policy may instruct, not about what a particular
99
+ * request happens to hold.
100
+ */
101
+ export declare const REQUIRED_PROMPT_ROWS: readonly PromptRow[];
102
+ /**
103
+ * How a row renders when nothing in the policy says otherwise.
104
+ *
105
+ * - `always` — on every prompt the request carries the field for.
106
+ * - `abnormal` — only when the value is the reason to look. APRV-163's
107
+ * argument: a row that says "everything is fine" on every ordinary request is
108
+ * a row a reader learns to skip, and the skipping does not stop on the one
109
+ * request where it says something else.
110
+ * - `off` — the channel does not render it by default. The field still travels
111
+ * on the request, so `--json`, `approval queue` and the web page carry it.
112
+ */
113
+ export type RowVisibility = "always" | "abnormal" | "off";
114
+ /** A resolved layout: the order rows render in, and each row's visibility. */
115
+ export interface PromptLayout {
116
+ /** Every row in {@link PROMPT_ROWS}, in render order. */
117
+ order: readonly PromptRow[];
118
+ /** Visibility per row. Total: every row name has an entry. */
119
+ visibility: Readonly<Record<PromptRow, RowVisibility>>;
120
+ }
121
+ /** The channels this runtime ships (SPEC.md §10.3). */
122
+ export declare const PROMPT_CHANNELS: readonly ["cli", "web", "telegram"];
123
+ /** One of the three shipped channel names. */
124
+ export type PromptChannel = (typeof PROMPT_CHANNELS)[number];
125
+ /**
126
+ * Telegram's default layout: the slimmed phone prompt, exactly as APRV-143 and
127
+ * APRV-163 left it.
128
+ *
129
+ * The ORDER of the rows that render is load-bearing and must not drift: it is
130
+ * the sequence a reader's eye has learned. The `off` rows are interleaved where
131
+ * they belong if an operator turns them on, which costs nothing while they are
132
+ * off and saves an operator from writing a `rows` list to get a sensible
133
+ * position.
134
+ *
135
+ * `action_key` is `off` here because Telegram renders it STRUCTURALLY, as the
136
+ * message's second line in a `<code>` span. It is required, so it cannot be
137
+ * hidden, and it is not a bullet, so promoting it changes nothing.
138
+ */
139
+ export declare const TELEGRAM_PROMPT_LAYOUT: PromptLayout;
140
+ /**
141
+ * The CLI channel's default layout: every row the request carries.
142
+ *
143
+ * A terminal has room, and a one-shot rendering an operator asked for by typing
144
+ * a verb is not the place to economise on lines the way a push notification is.
145
+ */
146
+ export declare const CLI_PROMPT_LAYOUT: PromptLayout;
147
+ /** The web channel's default layout. Same reasoning as the CLI's: a page scrolls. */
148
+ export declare const WEB_PROMPT_LAYOUT: PromptLayout;
149
+ /** Default layout per shipped channel. What an absent `prompt` block means. */
150
+ export declare const DEFAULT_PROMPT_LAYOUTS: Readonly<Record<PromptChannel, PromptLayout>>;
151
+ /**
152
+ * A `channels.<name>.prompt` block as a policy may write it.
153
+ *
154
+ * Three keys, and each does ONE thing, because a key that both orders and
155
+ * hides would leave an operator guessing which of the two a short list meant:
156
+ *
157
+ * - `rows` — ORDER ONLY. The rows it names render in that order, ahead of every
158
+ * row it does not name; those keep their default relative order behind them.
159
+ * It is never a whitelist, so a `ChannelRequest` widened by a later task
160
+ * cannot silently lose a field to a list written before that field existed —
161
+ * the same property `orderedFields` has held since APRV-23.
162
+ * - `always` — visibility UP. A row that is `abnormal` or `off` by default
163
+ * renders on every prompt.
164
+ * - `hide` — visibility DOWN. A row never renders. Refused for
165
+ * {@link REQUIRED_PROMPT_ROWS}.
166
+ *
167
+ * `always` and `hide` naming the same row is refused rather than resolved by
168
+ * precedence: a policy that says both things about one row has an author who
169
+ * believes one of them, and picking for them is the guess this schema does not
170
+ * make.
171
+ */
172
+ export interface PromptBlock {
173
+ rows?: PromptRow[];
174
+ always?: PromptRow[];
175
+ hide?: PromptRow[];
176
+ }
177
+ /**
178
+ * The layout in force for `channel`.
179
+ *
180
+ * Fail-soft in the same direction as `telegramDeliveryFor`: a policy that did
181
+ * not load declares nothing, an absent block declares nothing, and a layout is
182
+ * not a permission. Anything structurally wrong that reaches here (a hand-built
183
+ * load result, a key from a later version) falls back to the default rather
184
+ * than being guessed at — a LOADED policy cannot carry such a block, because
185
+ * {@link promptBlockErrors} refuses it at load.
186
+ */
187
+ export declare function promptLayoutFor(load: PolicyLoadResult, channel: string): PromptLayout;
188
+ /**
189
+ * Apply a block to a layout. Pure, total, and exported so a caller holding a
190
+ * block already can resolve it without going back through a policy file, which
191
+ * is what the tests do and what a future `approval policy explain` of a channel
192
+ * would need. Nothing outside the tests calls it today, and that is fine: the
193
+ * split keeps {@link promptLayoutFor} to one job, reading the block.
194
+ */
195
+ export declare function applyPromptBlock(base: PromptLayout, block: PromptBlock): PromptLayout;
196
+ /** The machine-readable reasons a `prompt` block refuses (APRV-218). */
197
+ export declare const PROMPT_BLOCK_ERROR_KEYWORDS: readonly [
198
+ /** A row name this runtime cannot place. */
199
+ "prompt-row-unknown",
200
+ /** {@link REQUIRED_PROMPT_ROWS} named in `hide`. */
201
+ "prompt-row-required",
202
+ /** `rows`, `always` or `hide` is not an array of strings. */
203
+ "prompt-block-shape",
204
+ /** One row named by both `always` and `hide`. */
205
+ "prompt-row-conflict",
206
+ /** A key the `prompt` block does not define. */
207
+ "prompt-key-unknown"];
208
+ /**
209
+ * Validate every `channels.<name>.prompt` in a policy. Empty means clean.
210
+ *
211
+ * This runs on top of the JSON Schema rather than instead of it, and the
212
+ * duplication is deliberate. The schema types the three channels this runtime
213
+ * ships and closes the row enum there, which is where SPEC.md §8's
214
+ * validate-at-the-write-boundary rule wants it; but `channels` admits UNKNOWN
215
+ * channel names as free-form objects on purpose, so a third-party transport
216
+ * plugin does not invalidate a whole policy, and a `prompt` block written under
217
+ * such a name would otherwise reach a renderer unchecked. Both nets return the
218
+ * same verdict — the policy does not load, everything is `manual` — so an
219
+ * operator never has to know which one caught them.
220
+ */
221
+ export declare function promptBlockErrors(policy: Policy): ValidationError[];
@@ -0,0 +1,422 @@
1
+ /**
2
+ * Prompt layout: which INFORMATIONAL rows a channel puts in front of an
3
+ * approver, as a policy decision rather than a code decision (APRV-218).
4
+ *
5
+ * SPEC.md §5.2 gains `channels.<name>.prompt`; SPEC.md §10.3 already says a
6
+ * channel holds no truth, and this module is what keeps that so — the block
7
+ * decides what is SHOWN, never what is true, and every field it can reach was
8
+ * already on the `ChannelRequest` and already in `--json`, `approval queue` and
9
+ * the web page. Nothing here reads the log, and no key added here lets a
10
+ * channel learn anything about it.
11
+ *
12
+ * ## Why this is a policy key at all
13
+ *
14
+ * The Telegram prompt was slimmed deliberately: APRV-143 dropped the `ttl` row
15
+ * because the `waiting … expires HH:MM UTC` line already states the deadline,
16
+ * and APRV-163 dropped six bookkeeping rows and made three health rows render
17
+ * only when abnormal. That layout fits ONE operator's workflow. Another wants
18
+ * the budget line on every prompt, or the TTL as a duration, or the task id
19
+ * always visible. Those are preferences about a screen, and preferences about a
20
+ * screen belong in the policy file beside the other things an operator chooses,
21
+ * not in a `git blame` argument about a default.
22
+ *
23
+ * ## What a layout may NOT do
24
+ *
25
+ * A layout chooses among rows the approver may read. It cannot touch what the
26
+ * approver SIGNS. Three things are therefore out of its reach entirely:
27
+ *
28
+ * 1. **The canonical block** (SPEC.md §9's "what you see is what you sign") is
29
+ * not a row. It carries the payload bytes, the renderer version, the class,
30
+ * the kind and the bound `payload sha256`, it is rendered verbatim, and no
31
+ * key in this module can reorder, shorten, or remove it.
32
+ * 2. **The computed/claimed split.** A row's side of the boundary is a property
33
+ * of the field (`TaggedField.kind`), not of the layout. `rows` reorders; it
34
+ * cannot move a claimed line into the computed block, because a channel
35
+ * partitions by kind AFTER it applies the order. That is the property
36
+ * APRV-144's CLAIMED heading exists for, and a test pins it.
37
+ * 3. **{@link REQUIRED_PROMPT_ROWS}**, the rows the contract marks as required
38
+ * for a decision. Naming one in `hide` is a policy that fails to load.
39
+ *
40
+ * The buttons are not a row either, for the same reason the block is not: a
41
+ * prompt with no way to answer it is not a prompt.
42
+ *
43
+ * ## Fail directions
44
+ *
45
+ * Soft on ABSENCE, closed on INVALIDITY, which is the split every other policy
46
+ * key in this runtime keeps. No `prompt` block, or a policy that did not load,
47
+ * means today's rows: a layout is not a permission, and an unrelated typo in a
48
+ * class rule must not silently redecorate a phone screen. An unknown row name
49
+ * or a required row in `hide` is a statement the runtime cannot honour, so the
50
+ * WHOLE policy fails schema validation and every class resolves to `manual` —
51
+ * the operator repairs the file, and until they do the gate is at its
52
+ * strictest.
53
+ *
54
+ * Pure: no clock, no IO, no environment. It sits in `core/` rather than in
55
+ * `channels/` for `core/telegram-config.ts`'s reason — more than one layer asks
56
+ * "which rows does this policy want?" and none of them may answer differently —
57
+ * and it imports nothing from `channels/`, so `tests/layering.test.ts` stays
58
+ * true. The row names below are the `ChannelRequest` member names spelled as
59
+ * plain strings for exactly that reason.
60
+ */
61
+ /**
62
+ * The row vocabulary: every `ChannelRequest` member a channel renders as a row.
63
+ *
64
+ * Closed, and closed for `delivery`'s reason (APRV-216): a name this runtime
65
+ * cannot place is a row the author believes is in force that nothing reads, and
66
+ * guessing at it would be the silent no-op the whole policy schema is shaped to
67
+ * prevent.
68
+ *
69
+ * `fullPayload` is deliberately ABSENT. The canonical block is not a row.
70
+ */
71
+ export const PROMPT_ROWS = [
72
+ "action_key",
73
+ "task",
74
+ "class",
75
+ "command_breakdown",
76
+ "protected_path",
77
+ "policy_diff",
78
+ "policy_load",
79
+ "autonomy",
80
+ "provenance",
81
+ "state",
82
+ "requested_ts",
83
+ "waiting",
84
+ "ttl_remaining_ms",
85
+ "payload_hash",
86
+ "attestation",
87
+ "budgets",
88
+ "chain",
89
+ "token_delivery",
90
+ "est_cost_usd",
91
+ "gloss",
92
+ "summary",
93
+ "rationale",
94
+ "confidence",
95
+ ];
96
+ /** Whether a string is a row name this runtime knows how to place. */
97
+ export function isPromptRow(value) {
98
+ return typeof value === "string" && PROMPT_ROWS.includes(value);
99
+ }
100
+ /**
101
+ * The rows an operator may reorder but never remove.
102
+ *
103
+ * Each is required for a DECISION rather than for a screen. `action_key`
104
+ * identifies which request the gesture answers; `class` is the resolution the
105
+ * whole gate turns on; `command_breakdown` and `protected_path` are APRV-144
106
+ * and APRV-143's answer to "what does this command actually do, and which
107
+ * protected path earned the class", derived from the bound bytes by the same
108
+ * classifier the hook decided with; `policy_diff` and `policy_load` are what
109
+ * SPEC.md §10.3 requires of an attestation prompt, where "a prompt carrying
110
+ * only a hash asks a human to sign for sixty-four characters and is a
111
+ * conformance failure".
112
+ *
113
+ * `payload_hash` is NOT here, and its absence is not an oversight. The bound
114
+ * hash is stated inside the canonical block on every channel, and the block is
115
+ * out of a layout's reach, so an operator who hides the row removes a
116
+ * duplicate rather than the binding. Telegram's default layout already does
117
+ * exactly that (APRV-163).
118
+ *
119
+ * A required row a request does not CARRY renders nothing, as it does today.
120
+ * Requirement is about what a policy may instruct, not about what a particular
121
+ * request happens to hold.
122
+ */
123
+ export const REQUIRED_PROMPT_ROWS = [
124
+ "action_key",
125
+ "class",
126
+ "command_breakdown",
127
+ "protected_path",
128
+ "policy_diff",
129
+ "policy_load",
130
+ ];
131
+ /** The channels this runtime ships (SPEC.md §10.3). */
132
+ export const PROMPT_CHANNELS = ["cli", "web", "telegram"];
133
+ function layoutOf(order, visibility) {
134
+ const full = {};
135
+ for (const row of PROMPT_ROWS)
136
+ full[row] = visibility[row] ?? "off";
137
+ return { order, visibility: full };
138
+ }
139
+ /**
140
+ * Telegram's default layout: the slimmed phone prompt, exactly as APRV-143 and
141
+ * APRV-163 left it.
142
+ *
143
+ * The ORDER of the rows that render is load-bearing and must not drift: it is
144
+ * the sequence a reader's eye has learned. The `off` rows are interleaved where
145
+ * they belong if an operator turns them on, which costs nothing while they are
146
+ * off and saves an operator from writing a `rows` list to get a sensible
147
+ * position.
148
+ *
149
+ * `action_key` is `off` here because Telegram renders it STRUCTURALLY, as the
150
+ * message's second line in a `<code>` span. It is required, so it cannot be
151
+ * hidden, and it is not a bullet, so promoting it changes nothing.
152
+ */
153
+ export const TELEGRAM_PROMPT_LAYOUT = layoutOf([
154
+ "action_key",
155
+ "task",
156
+ "class",
157
+ "command_breakdown",
158
+ "protected_path",
159
+ "policy_diff",
160
+ "policy_load",
161
+ "autonomy",
162
+ "budgets",
163
+ "attestation",
164
+ "provenance",
165
+ "state",
166
+ "requested_ts",
167
+ "waiting",
168
+ "ttl_remaining_ms",
169
+ "payload_hash",
170
+ "chain",
171
+ "token_delivery",
172
+ "gloss",
173
+ "summary",
174
+ "est_cost_usd",
175
+ "rationale",
176
+ "confidence",
177
+ ], {
178
+ class: "always",
179
+ command_breakdown: "always",
180
+ protected_path: "always",
181
+ policy_diff: "always",
182
+ policy_load: "always",
183
+ autonomy: "abnormal",
184
+ budgets: "abnormal",
185
+ attestation: "abnormal",
186
+ waiting: "always",
187
+ gloss: "always",
188
+ summary: "always",
189
+ est_cost_usd: "always",
190
+ rationale: "always",
191
+ confidence: "always",
192
+ });
193
+ /**
194
+ * The order the terminal and the page have used since APRV-23: computed
195
+ * identity and authority first, claimed persuasion last, so a reader who stops
196
+ * halfway has read the runtime's answer and not the agent's pitch.
197
+ *
198
+ * `token_delivery` sits at the end because that is where it lands today —
199
+ * neither channel's `FIELD_ORDER` named it, and both append a member they do
200
+ * not list. Naming it here makes it reachable by `hide` and `rows` without
201
+ * moving it.
202
+ */
203
+ const FULL_ROW_ORDER = [
204
+ "action_key",
205
+ "task",
206
+ "class",
207
+ "command_breakdown",
208
+ "protected_path",
209
+ "policy_diff",
210
+ "policy_load",
211
+ "autonomy",
212
+ "provenance",
213
+ "state",
214
+ "requested_ts",
215
+ "waiting",
216
+ "ttl_remaining_ms",
217
+ "payload_hash",
218
+ "attestation",
219
+ "budgets",
220
+ "chain",
221
+ "est_cost_usd",
222
+ "gloss",
223
+ "summary",
224
+ "rationale",
225
+ "confidence",
226
+ "token_delivery",
227
+ ];
228
+ const ALL_ALWAYS = Object.fromEntries(PROMPT_ROWS.map((row) => [row, "always"]));
229
+ /**
230
+ * The CLI channel's default layout: every row the request carries.
231
+ *
232
+ * A terminal has room, and a one-shot rendering an operator asked for by typing
233
+ * a verb is not the place to economise on lines the way a push notification is.
234
+ */
235
+ export const CLI_PROMPT_LAYOUT = layoutOf(FULL_ROW_ORDER, ALL_ALWAYS);
236
+ /** The web channel's default layout. Same reasoning as the CLI's: a page scrolls. */
237
+ export const WEB_PROMPT_LAYOUT = layoutOf(FULL_ROW_ORDER, ALL_ALWAYS);
238
+ /** Default layout per shipped channel. What an absent `prompt` block means. */
239
+ export const DEFAULT_PROMPT_LAYOUTS = {
240
+ cli: CLI_PROMPT_LAYOUT,
241
+ web: WEB_PROMPT_LAYOUT,
242
+ telegram: TELEGRAM_PROMPT_LAYOUT,
243
+ };
244
+ /**
245
+ * The layout in force for `channel`.
246
+ *
247
+ * Fail-soft in the same direction as `telegramDeliveryFor`: a policy that did
248
+ * not load declares nothing, an absent block declares nothing, and a layout is
249
+ * not a permission. Anything structurally wrong that reaches here (a hand-built
250
+ * load result, a key from a later version) falls back to the default rather
251
+ * than being guessed at — a LOADED policy cannot carry such a block, because
252
+ * {@link promptBlockErrors} refuses it at load.
253
+ */
254
+ export function promptLayoutFor(load, channel) {
255
+ const base = DEFAULT_PROMPT_LAYOUTS[channel] ?? CLI_PROMPT_LAYOUT;
256
+ if (!load.ok)
257
+ return base;
258
+ const block = readBlock(load.policy.channels?.[channel]);
259
+ if (block === null)
260
+ return base;
261
+ return applyPromptBlock(base, block);
262
+ }
263
+ /**
264
+ * Apply a block to a layout. Pure, total, and exported so a caller holding a
265
+ * block already can resolve it without going back through a policy file, which
266
+ * is what the tests do and what a future `approval policy explain` of a channel
267
+ * would need. Nothing outside the tests calls it today, and that is fine: the
268
+ * split keeps {@link promptLayoutFor} to one job, reading the block.
269
+ */
270
+ export function applyPromptBlock(base, block) {
271
+ const named = (block.rows ?? []).filter(isPromptRow);
272
+ const order = [];
273
+ for (const row of named)
274
+ if (!order.includes(row))
275
+ order.push(row);
276
+ for (const row of base.order)
277
+ if (!order.includes(row))
278
+ order.push(row);
279
+ const visibility = { ...base.visibility };
280
+ for (const row of block.always ?? [])
281
+ if (isPromptRow(row))
282
+ visibility[row] = "always";
283
+ for (const row of block.hide ?? [])
284
+ if (isPromptRow(row))
285
+ visibility[row] = "off";
286
+ return { order, visibility };
287
+ }
288
+ /**
289
+ * The `prompt` block under one channel entry, or `null` when there is none.
290
+ *
291
+ * Structural only. Every semantic check lives in {@link promptBlockErrors} and
292
+ * has already run at load, so a block reaching here from a loaded policy is
293
+ * known-good; this function's `null` returns are for the hand-built and
294
+ * future-version cases the fail-soft rule above covers.
295
+ */
296
+ function readBlock(entry) {
297
+ if (entry === null || typeof entry !== "object")
298
+ return null;
299
+ const raw = entry["prompt"];
300
+ if (raw === null || raw === undefined || typeof raw !== "object" || Array.isArray(raw))
301
+ return null;
302
+ const block = raw;
303
+ const list = (key) => {
304
+ const value = block[key];
305
+ if (!Array.isArray(value))
306
+ return undefined;
307
+ return value.filter(isPromptRow);
308
+ };
309
+ const rows = list("rows");
310
+ const always = list("always");
311
+ const hide = list("hide");
312
+ return {
313
+ ...(rows === undefined ? {} : { rows }),
314
+ ...(always === undefined ? {} : { always }),
315
+ ...(hide === undefined ? {} : { hide }),
316
+ };
317
+ }
318
+ /** The machine-readable reasons a `prompt` block refuses (APRV-218). */
319
+ export const PROMPT_BLOCK_ERROR_KEYWORDS = [
320
+ /** A row name this runtime cannot place. */
321
+ "prompt-row-unknown",
322
+ /** {@link REQUIRED_PROMPT_ROWS} named in `hide`. */
323
+ "prompt-row-required",
324
+ /** `rows`, `always` or `hide` is not an array of strings. */
325
+ "prompt-block-shape",
326
+ /** One row named by both `always` and `hide`. */
327
+ "prompt-row-conflict",
328
+ /** A key the `prompt` block does not define. */
329
+ "prompt-key-unknown",
330
+ ];
331
+ const PROMPT_BLOCK_KEYS = ["rows", "always", "hide"];
332
+ /**
333
+ * Validate every `channels.<name>.prompt` in a policy. Empty means clean.
334
+ *
335
+ * This runs on top of the JSON Schema rather than instead of it, and the
336
+ * duplication is deliberate. The schema types the three channels this runtime
337
+ * ships and closes the row enum there, which is where SPEC.md §8's
338
+ * validate-at-the-write-boundary rule wants it; but `channels` admits UNKNOWN
339
+ * channel names as free-form objects on purpose, so a third-party transport
340
+ * plugin does not invalidate a whole policy, and a `prompt` block written under
341
+ * such a name would otherwise reach a renderer unchecked. Both nets return the
342
+ * same verdict — the policy does not load, everything is `manual` — so an
343
+ * operator never has to know which one caught them.
344
+ */
345
+ export function promptBlockErrors(policy) {
346
+ const errors = [];
347
+ const channels = policy.channels;
348
+ if (channels === undefined || channels === null || typeof channels !== "object")
349
+ return errors;
350
+ for (const channel of Object.keys(channels).sort()) {
351
+ const entry = channels[channel];
352
+ if (entry === null || typeof entry !== "object" || Array.isArray(entry))
353
+ continue;
354
+ const raw = entry["prompt"];
355
+ if (raw === undefined)
356
+ continue;
357
+ const at = `/channels/${channel}/prompt`;
358
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
359
+ errors.push({
360
+ path: at,
361
+ keyword: "prompt-block-shape",
362
+ message: "expected an object with any of `rows`, `always`, `hide`",
363
+ });
364
+ continue;
365
+ }
366
+ const block = raw;
367
+ for (const key of Object.keys(block).sort()) {
368
+ if (!PROMPT_BLOCK_KEYS.includes(key)) {
369
+ errors.push({
370
+ path: `${at}/${key}`,
371
+ keyword: "prompt-key-unknown",
372
+ message: `unknown key; the prompt block defines ${PROMPT_BLOCK_KEYS.join(", ")}`,
373
+ });
374
+ }
375
+ }
376
+ const seen = {};
377
+ for (const key of PROMPT_BLOCK_KEYS) {
378
+ const value = block[key];
379
+ if (value === undefined)
380
+ continue;
381
+ if (!Array.isArray(value)) {
382
+ errors.push({
383
+ path: `${at}/${key}`,
384
+ keyword: "prompt-block-shape",
385
+ message: "expected an array of row names",
386
+ });
387
+ continue;
388
+ }
389
+ const names = new Set();
390
+ value.forEach((row, index) => {
391
+ if (!isPromptRow(row)) {
392
+ errors.push({
393
+ path: `${at}/${key}/${String(index)}`,
394
+ keyword: "prompt-row-unknown",
395
+ message: `unknown row name ${JSON.stringify(row)}; known rows are ${PROMPT_ROWS.join(", ")}`,
396
+ });
397
+ return;
398
+ }
399
+ names.add(row);
400
+ if (key === "hide" && REQUIRED_PROMPT_ROWS.includes(row)) {
401
+ errors.push({
402
+ path: `${at}/${key}/${String(index)}`,
403
+ keyword: "prompt-row-required",
404
+ message: `row ${JSON.stringify(row)} is required for a decision and may be reordered but not hidden; required rows are ${REQUIRED_PROMPT_ROWS.join(", ")}`,
405
+ });
406
+ }
407
+ });
408
+ seen[key] = names;
409
+ }
410
+ for (const row of seen["always"] ?? new Set()) {
411
+ if (seen["hide"]?.has(row) === true) {
412
+ errors.push({
413
+ path: `${at}/hide`,
414
+ keyword: "prompt-row-conflict",
415
+ message: `row ${JSON.stringify(row)} is named by both \`always\` and \`hide\`; say one of them`,
416
+ });
417
+ }
418
+ }
419
+ }
420
+ return errors;
421
+ }
422
+ //# sourceMappingURL=prompt-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-layout.js","sourceRoot":"","sources":["../../../src/core/prompt-layout.ts"],"names":[],"mappings":"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"}