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,308 @@
1
+ /**
2
+ * `approval setup service` — the login service that runs the ambient runtime
3
+ * (SPEC.md §10.2, APRV-110).
4
+ *
5
+ * `approval up` is a foreground process. This verb writes the one file that
6
+ * makes it start at login and stay started: a launchd user agent on macOS, or a
7
+ * systemd user unit on Linux. It is the fifth member of the `setup` family and
8
+ * it obeys the family's rules — interactive by refusal, human-only, appending
9
+ * nothing to the log, editing no policy — with two of its own.
10
+ *
11
+ * ## It never copies a value
12
+ *
13
+ * A unit file is world-readable configuration that survives reboots and gets
14
+ * backed up. A bot token in one is a bot token in a backup. So the unit NAMES
15
+ * where the environment comes from and never carries it:
16
+ *
17
+ * - by default it runs a WRAPPER the human reads in the printed unit —
18
+ * `eval "$(approval env)"` and then `exec approval up` — so the keystore
19
+ * references stay in the keystore and `approval env` stays the only thing
20
+ * that resolves them (SPEC.md §11.1 invariant 7: nothing loads that file
21
+ * implicitly, and here it is a human's line in a file they approved);
22
+ * - or, with `--env-file`, it points at a file THE OPERATOR AUTHORED, which
23
+ * this verb neither writes nor reads.
24
+ *
25
+ * ## It prints the unit before it writes it, and it does not arm it
26
+ *
27
+ * The whole file goes to stdout first, and nothing is written until the operator
28
+ * confirms. Loading it is a separate act: this verb prints the exact
29
+ * `launchctl` or `systemctl` line and stops there. A login service is a standing
30
+ * capability on someone's machine — it will start a process that holds a
31
+ * credential and can put prompts on a phone — and a wizard that armed one as a
32
+ * side effect of writing a file would be making that decision on the operator's
33
+ * behalf. Printing the command costs one paste and buys an explicit act.
34
+ *
35
+ * ## Logs never go into `.approval/`
36
+ *
37
+ * The service's stdout and stderr go where the operator chooses, defaulting to
38
+ * the platform's own log home. A path inside the approval home is REFUSED:
39
+ * `.approval/` holds the log, the queue projection, the payload store, the
40
+ * vault and the environment source map, and a service that appended its console
41
+ * output beside them would put unverifiable text in the one directory whose
42
+ * contents are supposed to mean something.
43
+ */
44
+ import { existsSync, mkdirSync, unlinkSync, writeFileSync } from "node:fs";
45
+ import { homedir } from "node:os";
46
+ import { dirname, join, sep } from "node:path";
47
+ import { envFilePathFor } from "../core/env-file.js";
48
+ import { telegramChatEnvFor, telegramTokenEnvFor } from "../core/telegram-config.js";
49
+ import { passphraseEnvFor } from "../core/vault.js";
50
+ import { HUMAN_ACTOR_ENV } from "../core/attest.js";
51
+ import { stringFlag, boolFlag } from "./args.js";
52
+ import { EXIT_IO, EXIT_OK } from "./exit-codes.js";
53
+ import { SETUP_SERVICE_HELP } from "./help.js";
54
+ import { absolute, front, requireHuman, usageError, } from "./setup-common.js";
55
+ const SERVICE_FLAGS = {
56
+ "--platform": "string",
57
+ "--label": "string",
58
+ "--logs": "string",
59
+ "--env-file": "string",
60
+ "--exec": "string",
61
+ "--out": "string",
62
+ "--uninstall": "boolean",
63
+ };
64
+ /** The conventional names. `--label` overrides both. */
65
+ export const LAUNCHD_LABEL = "md.approval.up";
66
+ export const SYSTEMD_UNIT = "approval-up";
67
+ /** Which manager this machine has, or `null` when it has neither. */
68
+ export function platformFor(platform) {
69
+ if (platform === "darwin")
70
+ return "launchd";
71
+ if (platform === "linux")
72
+ return "systemd";
73
+ return null;
74
+ }
75
+ /** Where the unit file belongs, for a platform and a label. */
76
+ export function unitPathFor(platform, label, home) {
77
+ return platform === "launchd"
78
+ ? join(home, "Library", "LaunchAgents", `${label}.plist`)
79
+ : join(home, ".config", "systemd", "user", `${label}.service`);
80
+ }
81
+ /** Where the platform keeps a user's own logs. */
82
+ export function defaultLogsDir(platform, home) {
83
+ return platform === "launchd"
84
+ ? join(home, "Library", "Logs", "approval")
85
+ : join(home, ".local", "state", "approval");
86
+ }
87
+ /** The command that arms the written unit, printed and never run. */
88
+ export function armCommand(platform, label, path) {
89
+ return platform === "launchd"
90
+ ? `launchctl bootstrap gui/$(id -u) ${path}`
91
+ : `systemctl --user daemon-reload && systemctl --user enable --now ${label}.service`;
92
+ }
93
+ /**
94
+ * The command that disarms it, printed before the file is removed.
95
+ *
96
+ * Takes no path, unlike {@link armCommand}: launchd boots a service OUT by its
97
+ * label, and the plist it was booted in from may already be gone.
98
+ */
99
+ export function disarmCommand(platform, label) {
100
+ return platform === "launchd"
101
+ ? `launchctl bootout gui/$(id -u)/${label}`
102
+ : `systemctl --user disable --now ${label}.service`;
103
+ }
104
+ /**
105
+ * XML text, escaped. A plist is XML, and a working directory with an `&` in it
106
+ * would otherwise produce a file launchd refuses to parse.
107
+ */
108
+ function xml(text) {
109
+ return text
110
+ .replaceAll("&", "&")
111
+ .replaceAll("<", "&lt;")
112
+ .replaceAll(">", "&gt;")
113
+ .replaceAll('"', "&quot;");
114
+ }
115
+ /** One `sh -lc` script: the wrapper the operator reads inside the unit. */
116
+ export function wrapperScript(plan) {
117
+ const exec = plan.exec.join(" ");
118
+ const source = plan.envFile === null
119
+ ? `eval "$(${exec} env)"`
120
+ : `set -a; . '${plan.envFile}'; set +a`;
121
+ return `cd '${plan.workingDir}' && ${source} && exec ${exec} up --json`;
122
+ }
123
+ /** The whole unit file, as the operator will read it and as it will be written. */
124
+ export function renderUnit(plan) {
125
+ const names = plan.variables.join(", ");
126
+ if (plan.platform === "launchd") {
127
+ return [
128
+ `<?xml version="1.0" encoding="UTF-8"?>`,
129
+ `<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">`,
130
+ `<!-- approval.md: the ambient runtime (approval up) at login.`,
131
+ ` No credential value appears in this file. The wrapper below resolves`,
132
+ ` ${names}`,
133
+ ` through \`approval env\`, which reads .approval/env and the OS keystore. -->`,
134
+ `<plist version="1.0">`,
135
+ `<dict>`,
136
+ ` <key>Label</key><string>${xml(plan.label)}</string>`,
137
+ ` <key>ProgramArguments</key>`,
138
+ ` <array>`,
139
+ ` <string>/bin/sh</string>`,
140
+ ` <string>-lc</string>`,
141
+ ` <string>${xml(wrapperScript(plan))}</string>`,
142
+ ` </array>`,
143
+ ` <key>WorkingDirectory</key><string>${xml(plan.workingDir)}</string>`,
144
+ ` <key>RunAtLoad</key><true/>`,
145
+ ` <key>KeepAlive</key><true/>`,
146
+ ` <key>StandardOutPath</key><string>${xml(plan.outLog)}</string>`,
147
+ ` <key>StandardErrorPath</key><string>${xml(plan.errLog)}</string>`,
148
+ `</dict>`,
149
+ `</plist>`,
150
+ ``,
151
+ ].join("\n");
152
+ }
153
+ return [
154
+ `# approval.md: the ambient runtime (approval up) at login.`,
155
+ `# No credential value appears in this file. The environment is resolved`,
156
+ `# for ${names}`,
157
+ plan.envFile === null
158
+ ? `# through \`approval env\` in the ExecStart wrapper below.`
159
+ : `# from the EnvironmentFile below, which you wrote and this verb never read.`,
160
+ `[Unit]`,
161
+ `Description=approval.md ambient runtime (daemon and channels)`,
162
+ `After=default.target`,
163
+ ``,
164
+ `[Service]`,
165
+ `Type=simple`,
166
+ `WorkingDirectory=${plan.workingDir}`,
167
+ ...(plan.envFile === null ? [] : [`EnvironmentFile=${plan.envFile}`]),
168
+ `ExecStart=/bin/sh -lc '${wrapperScript(plan).replaceAll("'", `'\\''`)}'`,
169
+ `Restart=always`,
170
+ `RestartSec=5`,
171
+ `StandardOutput=append:${plan.outLog}`,
172
+ `StandardError=append:${plan.errLog}`,
173
+ ``,
174
+ `[Install]`,
175
+ `WantedBy=default.target`,
176
+ ``,
177
+ ].join("\n");
178
+ }
179
+ const SERVICE_HINT = (where) => ` # write the unit yourself; \`approval setup service\` only generates it:\n approval setup service --platform launchd|systemd # from a terminal\n\n # whatever you write, it must name variables and never values:\n # ${where.tokenEnv}, ${where.chatEnv}, ${where.passphraseEnv}, ${HUMAN_ACTOR_ENV}\n # resolved by \`eval "$(approval env)"\` in the unit's own wrapper.`;
180
+ /**
181
+ * The approval invocation this process was started as.
182
+ *
183
+ * `node dist/src/cli/main.js` and the installed `approval` bin are both
184
+ * legitimate, and a unit that named the wrong one would fail at login rather
185
+ * than here. `--exec` overrides for the case neither guess fits.
186
+ */
187
+ export function execWords(override, argv) {
188
+ if (override !== null)
189
+ return [override];
190
+ const entry = argv[1];
191
+ if (entry === undefined)
192
+ return ["approval"];
193
+ return entry.endsWith(".js") || entry.endsWith(".mjs") ? [argv[0] ?? "node", entry] : [entry];
194
+ }
195
+ /** A path a single-quoted shell word cannot carry safely. */
196
+ function unquotable(path) {
197
+ return path.includes("'") || path.includes("\n");
198
+ }
199
+ /** `approval setup service` — write the login unit. HUMAN-ONLY, INTERACTIVE. */
200
+ export function commandSetupService(argv, streams, cwd, deps = {}) {
201
+ const outcome = front("service", argv, streams, cwd, deps, SETUP_SERVICE_HELP, SERVICE_HINT, SERVICE_FLAGS);
202
+ if (outcome.kind === "handled")
203
+ return outcome.code;
204
+ const context = outcome;
205
+ const human = requireHuman(context.flags, streams, SETUP_SERVICE_HELP, "service");
206
+ if (!human.ok)
207
+ return human.code;
208
+ const extra = context.positionals[0];
209
+ if (extra !== undefined) {
210
+ return usageError(streams, false, `unexpected argument ${JSON.stringify(extra)}`, SETUP_SERVICE_HELP);
211
+ }
212
+ const platformFlag = stringFlag(context.flags, "--platform");
213
+ if (platformFlag !== null && platformFlag !== "launchd" && platformFlag !== "systemd") {
214
+ return usageError(streams, false, `--platform expects launchd or systemd, got ${JSON.stringify(platformFlag)}`, SETUP_SERVICE_HELP);
215
+ }
216
+ const platform = platformFlag ?? platformFor(process.platform);
217
+ if (platform === null) {
218
+ return usageError(streams, false, `no login service manager is known for ${process.platform}: this verb writes a launchd plist (macOS) or a systemd user unit (Linux). Run \`approval up\` under whatever supervisor this machine has, or pass --platform to generate a unit for another machine`, SETUP_SERVICE_HELP);
219
+ }
220
+ const home = homedir();
221
+ const label = stringFlag(context.flags, "--label") ??
222
+ (platform === "launchd" ? LAUNCHD_LABEL : SYSTEMD_UNIT);
223
+ const outFlag = stringFlag(context.flags, "--out");
224
+ const unitPath = outFlag === null ? unitPathFor(platform, label, home) : absolute(outFlag, cwd);
225
+ // -------------------------------------------------------------------------
226
+ // Uninstall
227
+ // -------------------------------------------------------------------------
228
+ if (boolFlag(context.flags, "--uninstall")) {
229
+ if (!existsSync(unitPath)) {
230
+ streams.out(`nothing to remove: ${unitPath} does not exist\n`);
231
+ return EXIT_OK;
232
+ }
233
+ streams.out(`approval setup service --uninstall — removes ${unitPath}.\n\nSTOP IT FIRST, or the running process outlives the file that describes it:\n\n ${disarmCommand(platform, label)}\n\n`);
234
+ if (!context.prompter.confirm(`remove ${unitPath}?`)) {
235
+ streams.out("aborted: nothing was removed\n");
236
+ return EXIT_OK;
237
+ }
238
+ try {
239
+ unlinkSync(unitPath);
240
+ }
241
+ catch (cause) {
242
+ streams.err(`approval: ${unitPath} could not be removed: ${cause instanceof Error ? cause.message : String(cause)}\n`);
243
+ return EXIT_IO;
244
+ }
245
+ streams.out(`removed ${unitPath}\n`);
246
+ streams.out(`\nThe log, the policy and .approval/ are untouched: this verb only ever wrote\nthe unit file. Nothing was appended anywhere.\n`);
247
+ return EXIT_OK;
248
+ }
249
+ // -------------------------------------------------------------------------
250
+ // The plan
251
+ // -------------------------------------------------------------------------
252
+ const workingDir = absolute(stringFlag(context.flags, "--dir") ?? cwd, cwd);
253
+ const approvalHome = dirname(envFilePathFor(context.logPath));
254
+ const logsFlag = stringFlag(context.flags, "--logs");
255
+ const logsDir = logsFlag === null ? defaultLogsDir(platform, home) : absolute(logsFlag, cwd);
256
+ if (logsDir === approvalHome || logsDir.startsWith(`${approvalHome}${sep}`)) {
257
+ return usageError(streams, false, `--logs ${logsDir} is inside ${approvalHome}, and a service's console output never goes there: that directory holds the log, the queue projection, the payload store and the environment source map, and unverifiable text beside them is exactly what makes a directory stop meaning something`, SETUP_SERVICE_HELP);
258
+ }
259
+ const envFileFlag = stringFlag(context.flags, "--env-file");
260
+ const envFile = envFileFlag === null ? null : absolute(envFileFlag, cwd);
261
+ const exec = execWords(stringFlag(context.flags, "--exec"), process.argv);
262
+ for (const path of [workingDir, logsDir, ...(envFile === null ? [] : [envFile]), ...exec]) {
263
+ if (unquotable(path)) {
264
+ return usageError(streams, false, `${JSON.stringify(path)} carries a quote or a newline, which cannot be placed in the unit's shell wrapper safely. Move it, or write the unit by hand`, SETUP_SERVICE_HELP);
265
+ }
266
+ }
267
+ const plan = {
268
+ platform,
269
+ label,
270
+ path: unitPath,
271
+ workingDir,
272
+ exec,
273
+ envFile,
274
+ outLog: join(logsDir, "approval-up.out.log"),
275
+ errLog: join(logsDir, "approval-up.err.log"),
276
+ variables: [
277
+ HUMAN_ACTOR_ENV,
278
+ telegramTokenEnvFor(context.load),
279
+ telegramChatEnvFor(context.load),
280
+ passphraseEnvFor(context.load),
281
+ ],
282
+ };
283
+ const unit = renderUnit(plan);
284
+ streams.out(`approval setup service — writes the ${platform === "launchd" ? "launchd user agent" : "systemd user unit"} that runs\n\`approval up\` in ${workingDir} at login.\n\nNO CREDENTIAL VALUE APPEARS IN IT. ${envFile === null
285
+ ? "The wrapper below evaluates `approval env`, which\nresolves the keystore references in .approval/env at start time."
286
+ : `The unit reads ${envFile}, which you wrote\nand this verb has neither read nor written.`}\nIts console output goes to ${logsDir}, never into ${approvalHome}.\n\nRead it before it exists:\n\n`);
287
+ streams.out(`${unit}\n`);
288
+ if (existsSync(unitPath)) {
289
+ streams.out(`WARNING: ${unitPath} already exists and would be REPLACED. If a service is\nloaded from it, stop it first:\n\n ${disarmCommand(platform, label)}\n\n`);
290
+ }
291
+ if (!context.prompter.confirm(`write it to ${unitPath}?`)) {
292
+ streams.out("aborted: nothing was written\n");
293
+ return EXIT_OK;
294
+ }
295
+ try {
296
+ mkdirSync(dirname(unitPath), { recursive: true });
297
+ mkdirSync(logsDir, { recursive: true });
298
+ writeFileSync(unitPath, unit, { encoding: "utf8", mode: 0o644 });
299
+ }
300
+ catch (cause) {
301
+ streams.err(`approval: ${unitPath} could not be written: ${cause instanceof Error ? cause.message : String(cause)}\n`);
302
+ return EXIT_IO;
303
+ }
304
+ streams.out(`wrote ${unitPath}\n logs -> ${plan.outLog}\n logs -> ${plan.errLog}\n`);
305
+ streams.out(`\nIT IS NOT RUNNING YET, and this verb will not start it: a service that starts\nat login is a standing capability on this machine, so arming it is your act and\nnot a side effect of writing a file. One command:\n\n ${armCommand(platform, label, unitPath)}\n\nUndo the whole thing with \`approval setup service --uninstall\`, which prints\nthe stop command and removes the file.\n`);
306
+ return EXIT_OK;
307
+ }
308
+ //# sourceMappingURL=setup-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-service.js","sourceRoot":"","sources":["../../../src/cli/setup-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * `approval setup` — the interactive configuration family (SPEC.md §5.2, §10.1).
3
+ *
4
+ * APRV-73 gave `.approval/env` a format and `approval env` a reader. This verb
5
+ * is the writer, and it is the only one: it establishes the things an operator
6
+ * must have before any gate operation works — a declared human identity, a
7
+ * vault passphrase, a sampling secret, a live Telegram bot and chat, and an
8
+ * adapter's credentials — by putting each VALUE where that kind of value
9
+ * belongs and each SOURCE in `.approval/env`.
10
+ *
11
+ * ## Who lives where
12
+ *
13
+ * This file holds the three subcommands whose subject is a value this runtime
14
+ * MINTS or a name it records, plus the dispatch:
15
+ *
16
+ * ```
17
+ * setup identity # APPROVAL_HUMAN, in this file
18
+ * setup vault # the vault passphrase, in this file
19
+ * setup sampling # the audit sampling secret, in this file
20
+ * setup checkpoint # cli/setup-checkpoint.ts (the vault + a print)
21
+ * setup channel <name> # cli/setup-channel.ts (keystore + .approval/env)
22
+ * setup adapter <name> # cli/setup-adapter.ts (the vault)
23
+ * setup service # cli/setup-service.ts (a launchd/systemd unit)
24
+ * ```
25
+ *
26
+ * The last two are **two nouns and not one list**, and the split is SPEC.md
27
+ * §4's: a CHANNEL surfaces requests and collects decisions and holds no state,
28
+ * so its setup fills the keystore and `.approval/env`; an ADAPTER executes side
29
+ * effects and holds credentials, so its setup fills the vault.
30
+ * An older build spelled the Telegram one without the `channel` noun, and that
31
+ * form is gone (APRV-79): the dispatch answers it with the new one and exits 2
32
+ * rather than aliasing it, because an alias would leave two spellings of a
33
+ * distinction the SPEC draws on purpose.
34
+ *
35
+ * Everything the three files share — the dependency bag, the keystore seam, the
36
+ * front matter, the human-only gate, the service names, the plaintext-literal
37
+ * offer — is `cli/setup-common.ts`, which imports from none of them. The
38
+ * conversation `setup channel|adapter` both run is `cli/setup-flow.ts`.
39
+ *
40
+ * ## The order these run in
41
+ *
42
+ * Nothing enforced it and nothing said it, which APRV-76 noticed the hard way.
43
+ * It is:
44
+ *
45
+ * ```
46
+ * approval init # the directory and the .gitignore
47
+ * (write APPROVAL.md) # the policy NAMES every variable below
48
+ * approval setup identity # APPROVAL_HUMAN
49
+ * approval setup vault # the passphrase, into the keystore
50
+ * eval "$(approval env)" # the ONLY thing that puts them in a shell
51
+ * approval setup adapter <name> # the adapter's credentials, into the vault
52
+ * ```
53
+ *
54
+ * The policy comes before every `setup`, because each of them reads variable
55
+ * NAMES out of it. The `eval` comes before `setup adapter`, because that
56
+ * subcommand needs the passphrase's VALUE in the environment and will not read
57
+ * `.approval/env` to get it (§11.1 invariant 7). `setup sampling` and
58
+ * `setup channel telegram` slot in anywhere after the policy.
59
+ *
60
+ * ## What this verb is not allowed to do
61
+ *
62
+ * **It never appends to the log, never attests, and never edits `APPROVAL.md`.**
63
+ * Configuration is not an authorized action, and the log is the record of
64
+ * authorized actions; a "telegram configured" event would be a line in the one
65
+ * file this project promises never to rewrite, saying something the log has no
66
+ * business knowing. `tests/cli-setup.test.ts` byte-compares `events.jsonl`
67
+ * across a complete run of every subcommand to keep that true by assertion.
68
+ * When a policy line is needed (the sampling secret's name), this verb PRINTS
69
+ * the `approval policy amend` invocation and stops: an amendment is a human
70
+ * ceremony with an attestation at the end of it, and a setup wizard that
71
+ * silently edited an attested policy would be forging the sign-off.
72
+ *
73
+ * It writes exactly three things: lines in `.approval/env`, through a writer
74
+ * that preserves every other line and comment (`core/env-file.ts`), items in
75
+ * the OS keystore, and entries in the vault (`setup adapter` only).
76
+ *
77
+ * ## Interactive or nothing
78
+ *
79
+ * Every subcommand refuses when stdin is not a terminal, or when `--json` was
80
+ * given, and exits 2 printing THE EXACT NON-INTERACTIVE ALTERNATIVE — the
81
+ * `security add-generic-password` line to run, or the `.approval/env` line to
82
+ * add, or the `export` to put in a shell profile. This is not a wizard being
83
+ * precious about its terminal. A `setup` that could be driven from a pipe would
84
+ * be a way for a CI job or an agent to write `APPROVAL_HUMAN` and a keystore
85
+ * item, which is precisely the boundary §11 draws: identity is config-declared,
86
+ * so establishing it must be an act of the human at the machine. The refusal
87
+ * text is the documented scripted path, so nobody has to reverse-engineer one.
88
+ *
89
+ * `setup identity` is EXEMPT from the human-only `--as` gate that every other
90
+ * subcommand carries, and the exemption is not a hole: identity is what that
91
+ * gate reads. A verb that demanded `APPROVAL_HUMAN` before it would let you set
92
+ * `APPROVAL_HUMAN` could only ever be run by someone who did not need it. The
93
+ * control on this path is the terminal itself.
94
+ *
95
+ * ## Answers, and answering again (APRV-90)
96
+ *
97
+ * Every typed question in this family runs through `prompt.ts`'s `askUntil`: a
98
+ * wrong answer is one line saying what was wrong and the same question again,
99
+ * never an exit code with a help page under it. `setup identity` also
100
+ * NORMALISES what it is given — `carter` is recorded as `human:carter`, and
101
+ * `human:carter` is taken as it stands ({@link identityFromAnswer}). The prompt
102
+ * still prints the `human:` prefix, because the prefix is what distinguishes
103
+ * the actor kinds the human-only verbs refuse, but nobody has to retype a
104
+ * prefix the question already showed them. `agent:` and `system:` are refused
105
+ * with the sentence that names why, as a reason to answer again.
106
+ *
107
+ * ## Where a secret goes, and how it gets there
108
+ *
109
+ * Three service names, one per secret, documented so an operator can find them
110
+ * with `security find-generic-password` or `secret-tool lookup` by hand:
111
+ * `approval-tg-token`, `approval-vault-passphrase`, `approval-sampling-secret`.
112
+ *
113
+ * - **macOS** (`darwin` and `security` on PATH) → `keychain:<service>`;
114
+ * - **Linux with `secret-tool`** → `secret-service:<service>` (the same string
115
+ * is the label, so the two platforms name one secret one way);
116
+ * - **neither** → the operator is OFFERED a plaintext literal in
117
+ * `.approval/env`, and must type `yes` in full to take it, having been shown
118
+ * the same warning `approval env --check` will print at them forever after.
119
+ * §5.2 permits literals for a stated reason, and refusing here would only
120
+ * move the value into a shell profile where nothing can see it to report it.
121
+ *
122
+ * **A value the operator already holds is never handled by this process.** The
123
+ * Telegram token on macOS is collected by `security`'s OWN no-echo prompt: we
124
+ * spawn `security add-generic-password … -w` WITH NO VALUE and with inherited
125
+ * stdio, Apple's prompt reads it from the terminal, and the token reaches this
126
+ * runtime only afterwards, on the stdout of a `find-generic-password -w` read
127
+ * that puts nothing in an argv either. Off macOS it comes through
128
+ * `Prompter.readSecret`, which at least keeps it off the screen.
129
+ *
130
+ * **A value we generate ourselves is a different question**, and it is the one
131
+ * place this family makes a trade rather than following a rule. The vault
132
+ * passphrase and the sampling secret are `randomBytes(32)`, minted in this
133
+ * process, so they are already in this process and there is nobody to prompt.
134
+ * They reach the keystore by STDIN first: `security add-generic-password -w`
135
+ * with the value written to its stdin twice (the prompt asks for confirmation),
136
+ * and `secret-tool store`, which documents stdin as its input. Only if the
137
+ * stdin form FAILS does the fallback put the value in an argv (`-w <value>`),
138
+ * and then the outcome says so out loud. That residual exposure is a value
139
+ * minted one millisecond earlier, never used, visible in `ps` to the same user
140
+ * who is running the command and to root — which is the boundary §11 already
141
+ * declares undefended. It is accepted for generated values and for nothing
142
+ * else: no path in this family ever puts an operator's own token in an argv.
143
+ *
144
+ * **And there is one standing exception to the rule above, which
145
+ * `setup adapter <name>` takes.** A credential bound for the VAULT must pass
146
+ * through this process, because the vault is not a helper with a prompt: it is
147
+ * a file this runtime encrypts, so `setCredential` needs the bytes. There is
148
+ * nothing to delegate the typing to and no third party to hold the value. The
149
+ * secret is read with `Prompter.readSecret` (no echo), handed straight to the
150
+ * cipher, and never printed, logged, or placed in an argv — which is exactly
151
+ * what `approval vault set` already does when a human pastes a credential onto
152
+ * its stdin. The rule is "never handle a value someone else can hold for you";
153
+ * for the vault nobody can, so it is stated here rather than left to look like
154
+ * an oversight.
155
+ *
156
+ * ## Seams
157
+ *
158
+ * The prompter, the keystore, and `fetch` are injected. The alternative is a
159
+ * test suite that needs a terminal, writes to the developer's real Keychain,
160
+ * and talks to the real Bot API — and the third of those would put a real bot
161
+ * token in a test run. `tests/cli-setup.test.ts` drives all three through fakes
162
+ * and the mock Bot API on loopback, and the spawned-CLI cases never get past
163
+ * the terminal check, so nothing under `npm test` can reach a keystore at all.
164
+ */
165
+ import { type SetupDeps } from "./setup-common.js";
166
+ import type { Streams } from "./main.js";
167
+ /**
168
+ * One typed answer to `human identity (human:<id>):`, as an identity (APRV-90).
169
+ *
170
+ * **A bare id is accepted and normalised.** The prompt prints the `human:`
171
+ * prefix because the prefix is load-bearing — actors are `human:`, `agent:` or
172
+ * `system:`, and the human-only verbs refuse the other two — so an operator who
173
+ * has never read SPEC.md §11 learns the shape from the question itself. Making
174
+ * them retype a prefix the prompt just printed adds a failure path and teaches
175
+ * nothing further, so `carter` becomes `human:carter` and `human:carter` is
176
+ * taken as it stands.
177
+ *
178
+ * An answer with a colon in it is taken as a FULL actor and validated as one,
179
+ * which is what makes `agent:claude` a refusal rather than `human:agent:claude`.
180
+ * That refusal is a reason handed back to {@link askUntil}, so the operator is
181
+ * asked again rather than dropped out of the verb.
182
+ */
183
+ export declare function identityFromAnswer(answer: string): {
184
+ ok: true;
185
+ value: string;
186
+ } | {
187
+ ok: false;
188
+ reason: string;
189
+ };
190
+ /**
191
+ * `approval setup identity` — declare who the human is.
192
+ *
193
+ * EXEMPT from the human-only gate, and the module doc says why: this is the
194
+ * verb that creates the thing the gate reads.
195
+ */
196
+ export declare function commandSetupIdentity(argv: string[], streams: Streams, cwd: string, deps?: SetupDeps): number;
197
+ /** `approval setup vault` — mint and store the vault passphrase. HUMAN-ONLY. */
198
+ export declare function commandSetupVault(argv: string[], streams: Streams, cwd: string, deps?: SetupDeps): number;
199
+ /** `approval setup sampling` — mint and store the audit sampling secret. HUMAN-ONLY. */
200
+ export declare function commandSetupSampling(argv: string[], streams: Streams, cwd: string, deps?: SetupDeps): number;
201
+ /** `approval setup <identity|vault|sampling|channel <name>|adapter <name>>`. */
202
+ export declare function commandSetup(argv: string[], streams: Streams, cwd: string, deps?: SetupDeps): number | Promise<number>;