approval-md 0.0.1 → 0.1.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 (522) hide show
  1. package/LICENSE +176 -0
  2. package/NOTICE +5 -0
  3. package/README.md +909 -4
  4. package/SPEC.md +445 -32
  5. package/cli.js +29 -3
  6. package/dist/src/adapters/agentmail.js +1200 -0
  7. package/dist/src/adapters/agentmail.js.map +1 -0
  8. package/dist/src/adapters/conformance.js +461 -0
  9. package/dist/src/adapters/conformance.js.map +1 -0
  10. package/dist/src/adapters/contract.js +941 -0
  11. package/dist/src/adapters/contract.js.map +1 -0
  12. package/dist/src/adapters/email.js +749 -0
  13. package/dist/src/adapters/email.js.map +1 -0
  14. package/dist/src/adapters/env-passphrase.js +132 -0
  15. package/dist/src/adapters/env-passphrase.js.map +1 -0
  16. package/dist/src/adapters/registry.js +76 -0
  17. package/dist/src/adapters/registry.js.map +1 -0
  18. package/dist/src/adapters/smtp.js +499 -0
  19. package/dist/src/adapters/smtp.js.map +1 -0
  20. package/dist/src/adapters/vault-provider.js +161 -0
  21. package/dist/src/adapters/vault-provider.js.map +1 -0
  22. package/dist/src/channels/batch.js +121 -0
  23. package/dist/src/channels/batch.js.map +1 -0
  24. package/dist/src/channels/cli.js +468 -0
  25. package/dist/src/channels/cli.js.map +1 -0
  26. package/dist/src/channels/conformance.js +445 -0
  27. package/dist/src/channels/conformance.js.map +1 -0
  28. package/dist/src/channels/contract.js +494 -0
  29. package/dist/src/channels/contract.js.map +1 -0
  30. package/dist/src/channels/payload-view.js +43 -0
  31. package/dist/src/channels/payload-view.js.map +1 -0
  32. package/dist/src/channels/render-queue.js +564 -0
  33. package/dist/src/channels/render-queue.js.map +1 -0
  34. package/dist/src/channels/tagging.js +723 -0
  35. package/dist/src/channels/tagging.js.map +1 -0
  36. package/dist/src/channels/telegram.js +3190 -0
  37. package/dist/src/channels/telegram.js.map +1 -0
  38. package/dist/src/channels/web.js +903 -0
  39. package/dist/src/channels/web.js.map +1 -0
  40. package/dist/src/cli/adapter.js +278 -0
  41. package/dist/src/cli/adapter.js.map +1 -0
  42. package/dist/src/cli/amend.js +2171 -0
  43. package/dist/src/cli/amend.js.map +1 -0
  44. package/dist/src/cli/args.js +86 -0
  45. package/dist/src/cli/args.js.map +1 -0
  46. package/dist/src/cli/attest.js +307 -0
  47. package/dist/src/cli/attest.js.map +1 -0
  48. package/dist/src/cli/audit-card.js +201 -0
  49. package/dist/src/cli/audit-card.js.map +1 -0
  50. package/dist/src/cli/audit.js +460 -0
  51. package/dist/src/cli/audit.js.map +1 -0
  52. package/dist/src/cli/channel-telegram.js +2063 -0
  53. package/dist/src/cli/channel-telegram.js.map +1 -0
  54. package/dist/src/cli/channel-web.js +357 -0
  55. package/dist/src/cli/channel-web.js.map +1 -0
  56. package/dist/src/cli/channel.js +438 -0
  57. package/dist/src/cli/channel.js.map +1 -0
  58. package/dist/src/cli/checkpoint-tap.js +238 -0
  59. package/dist/src/cli/checkpoint-tap.js.map +1 -0
  60. package/dist/src/cli/coverage.js +343 -0
  61. package/dist/src/cli/coverage.js.map +1 -0
  62. package/dist/src/cli/daemon.js +631 -0
  63. package/dist/src/cli/daemon.js.map +1 -0
  64. package/dist/src/cli/doctor.js +2648 -0
  65. package/dist/src/cli/doctor.js.map +1 -0
  66. package/dist/src/cli/env.js +302 -0
  67. package/dist/src/cli/env.js.map +1 -0
  68. package/dist/src/cli/execute.js +1682 -0
  69. package/dist/src/cli/execute.js.map +1 -0
  70. package/dist/src/cli/exit-codes.js +82 -0
  71. package/dist/src/cli/exit-codes.js.map +1 -0
  72. package/dist/src/cli/feedback.js +205 -0
  73. package/dist/src/cli/feedback.js.map +1 -0
  74. package/dist/src/cli/gate-window.js +294 -0
  75. package/dist/src/cli/gate-window.js.map +1 -0
  76. package/dist/src/cli/gate.js +557 -0
  77. package/dist/src/cli/gate.js.map +1 -0
  78. package/dist/src/cli/git-scope.js +295 -0
  79. package/dist/src/cli/git-scope.js.map +1 -0
  80. package/dist/src/cli/gloss-attach.js +107 -0
  81. package/dist/src/cli/gloss-attach.js.map +1 -0
  82. package/dist/src/cli/gloss-codex-child.js +149 -0
  83. package/dist/src/cli/gloss-codex-child.js.map +1 -0
  84. package/dist/src/cli/gloss-codex.js +255 -0
  85. package/dist/src/cli/gloss-codex.js.map +1 -0
  86. package/dist/src/cli/gloss-options.js +79 -0
  87. package/dist/src/cli/gloss-options.js.map +1 -0
  88. package/dist/src/cli/gloss.js +362 -0
  89. package/dist/src/cli/gloss.js.map +1 -0
  90. package/dist/src/cli/help.js +2217 -0
  91. package/dist/src/cli/help.js.map +1 -0
  92. package/dist/src/cli/hook.js +2743 -0
  93. package/dist/src/cli/hook.js.map +1 -0
  94. package/dist/src/cli/import.js +175 -0
  95. package/dist/src/cli/import.js.map +1 -0
  96. package/dist/src/cli/init.js +336 -0
  97. package/dist/src/cli/init.js.map +1 -0
  98. package/dist/src/cli/instructions.js +262 -0
  99. package/dist/src/cli/instructions.js.map +1 -0
  100. package/dist/src/cli/journal.js +238 -0
  101. package/dist/src/cli/journal.js.map +1 -0
  102. package/dist/src/cli/log-advance.js +749 -0
  103. package/dist/src/cli/log-advance.js.map +1 -0
  104. package/dist/src/cli/log-anchor.js +387 -0
  105. package/dist/src/cli/log-anchor.js.map +1 -0
  106. package/dist/src/cli/log-checkpoint.js +128 -0
  107. package/dist/src/cli/log-checkpoint.js.map +1 -0
  108. package/dist/src/cli/log-sync.js +849 -0
  109. package/dist/src/cli/log-sync.js.map +1 -0
  110. package/dist/src/cli/log-verbs.js +354 -0
  111. package/dist/src/cli/log-verbs.js.map +1 -0
  112. package/dist/src/cli/long-help.js +148 -0
  113. package/dist/src/cli/long-help.js.map +1 -0
  114. package/dist/src/cli/main.js +1056 -0
  115. package/dist/src/cli/main.js.map +1 -0
  116. package/dist/src/cli/mcp.js +306 -0
  117. package/dist/src/cli/mcp.js.map +1 -0
  118. package/dist/src/cli/paths.js +79 -0
  119. package/dist/src/cli/paths.js.map +1 -0
  120. package/dist/src/cli/payload.js +253 -0
  121. package/dist/src/cli/payload.js.map +1 -0
  122. package/dist/src/cli/policy.js +229 -0
  123. package/dist/src/cli/policy.js.map +1 -0
  124. package/dist/src/cli/preflight.js +888 -0
  125. package/dist/src/cli/preflight.js.map +1 -0
  126. package/dist/src/cli/progress.js +112 -0
  127. package/dist/src/cli/progress.js.map +1 -0
  128. package/dist/src/cli/prompt.js +312 -0
  129. package/dist/src/cli/prompt.js.map +1 -0
  130. package/dist/src/cli/records.js +66 -0
  131. package/dist/src/cli/records.js.map +1 -0
  132. package/dist/src/cli/render.js +132 -0
  133. package/dist/src/cli/render.js.map +1 -0
  134. package/dist/src/cli/sandbox.js +150 -0
  135. package/dist/src/cli/sandbox.js.map +1 -0
  136. package/dist/src/cli/scaffold.js +137 -0
  137. package/dist/src/cli/scaffold.js.map +1 -0
  138. package/dist/src/cli/setup-adapter.js +475 -0
  139. package/dist/src/cli/setup-adapter.js.map +1 -0
  140. package/dist/src/cli/setup-channel.js +635 -0
  141. package/dist/src/cli/setup-channel.js.map +1 -0
  142. package/dist/src/cli/setup-checkpoint.js +196 -0
  143. package/dist/src/cli/setup-checkpoint.js.map +1 -0
  144. package/dist/src/cli/setup-common.js +376 -0
  145. package/dist/src/cli/setup-common.js.map +1 -0
  146. package/dist/src/cli/setup-flow.js +476 -0
  147. package/dist/src/cli/setup-flow.js.map +1 -0
  148. package/dist/src/cli/setup-service.js +308 -0
  149. package/dist/src/cli/setup-service.js.map +1 -0
  150. package/dist/src/cli/setup.js +473 -0
  151. package/dist/src/cli/setup.js.map +1 -0
  152. package/dist/src/cli/style.js +469 -0
  153. package/dist/src/cli/style.js.map +1 -0
  154. package/dist/src/cli/token.js +274 -0
  155. package/dist/src/cli/token.js.map +1 -0
  156. package/dist/src/cli/up.js +847 -0
  157. package/dist/src/cli/up.js.map +1 -0
  158. package/dist/src/cli/usage.js +91 -0
  159. package/dist/src/cli/usage.js.map +1 -0
  160. package/dist/src/cli/values.js +189 -0
  161. package/dist/src/cli/values.js.map +1 -0
  162. package/dist/src/cli/vault.js +362 -0
  163. package/dist/src/cli/vault.js.map +1 -0
  164. package/dist/src/cli/verb-registry.js +2173 -0
  165. package/dist/src/cli/verb-registry.js.map +1 -0
  166. package/dist/src/cli/wordmark.js +52 -0
  167. package/dist/src/cli/wordmark.js.map +1 -0
  168. package/dist/src/core/advance-cycle.js +200 -0
  169. package/dist/src/core/advance-cycle.js.map +1 -0
  170. package/dist/src/core/agents-md.js +747 -0
  171. package/dist/src/core/agents-md.js.map +1 -0
  172. package/dist/src/core/attest.js +577 -0
  173. package/dist/src/core/attest.js.map +1 -0
  174. package/dist/src/core/audit.js +882 -0
  175. package/dist/src/core/audit.js.map +1 -0
  176. package/dist/src/core/budgets.js +449 -0
  177. package/dist/src/core/budgets.js.map +1 -0
  178. package/dist/src/core/checkpoint.js +738 -0
  179. package/dist/src/core/checkpoint.js.map +1 -0
  180. package/dist/src/core/child-env.js +86 -0
  181. package/dist/src/core/child-env.js.map +1 -0
  182. package/dist/src/core/clock.js +43 -0
  183. package/dist/src/core/clock.js.map +1 -0
  184. package/dist/src/core/command-class.js +2321 -0
  185. package/dist/src/core/command-class.js.map +1 -0
  186. package/dist/src/core/coverage-sources/adapter.js +71 -0
  187. package/dist/src/core/coverage-sources/adapter.js.map +1 -0
  188. package/dist/src/core/coverage-sources/gh.js +136 -0
  189. package/dist/src/core/coverage-sources/gh.js.map +1 -0
  190. package/dist/src/core/coverage-sources/git.js +269 -0
  191. package/dist/src/core/coverage-sources/git.js.map +1 -0
  192. package/dist/src/core/coverage.js +337 -0
  193. package/dist/src/core/coverage.js.map +1 -0
  194. package/dist/src/core/credential-spec.js +23 -0
  195. package/dist/src/core/credential-spec.js.map +1 -0
  196. package/dist/src/core/dark-session.js +714 -0
  197. package/dist/src/core/dark-session.js.map +1 -0
  198. package/dist/src/core/decision-refusal.js +265 -0
  199. package/dist/src/core/decision-refusal.js.map +1 -0
  200. package/dist/src/core/env-file.js +837 -0
  201. package/dist/src/core/env-file.js.map +1 -0
  202. package/dist/src/core/execute.js +1233 -0
  203. package/dist/src/core/execute.js.map +1 -0
  204. package/dist/src/core/frontmatter.js +100 -0
  205. package/dist/src/core/frontmatter.js.map +1 -0
  206. package/dist/src/core/gate-window.js +506 -0
  207. package/dist/src/core/gate-window.js.map +1 -0
  208. package/dist/src/core/gate.js +2947 -0
  209. package/dist/src/core/gate.js.map +1 -0
  210. package/dist/src/core/git-run.js +93 -0
  211. package/dist/src/core/git-run.js.map +1 -0
  212. package/dist/src/core/harness-version.js +210 -0
  213. package/dist/src/core/harness-version.js.map +1 -0
  214. package/dist/src/core/harness-wait.js +58 -0
  215. package/dist/src/core/harness-wait.js.map +1 -0
  216. package/dist/src/core/head-retry.js +121 -0
  217. package/dist/src/core/head-retry.js.map +1 -0
  218. package/dist/src/core/instance.js +319 -0
  219. package/dist/src/core/instance.js.map +1 -0
  220. package/dist/src/core/intake-limits.js +350 -0
  221. package/dist/src/core/intake-limits.js.map +1 -0
  222. package/dist/src/core/jcs.js +132 -0
  223. package/dist/src/core/jcs.js.map +1 -0
  224. package/dist/src/core/journal.js +200 -0
  225. package/dist/src/core/journal.js.map +1 -0
  226. package/dist/src/core/live-draw.js +703 -0
  227. package/dist/src/core/live-draw.js.map +1 -0
  228. package/dist/src/core/log-reconcile.js +136 -0
  229. package/dist/src/core/log-reconcile.js.map +1 -0
  230. package/dist/src/core/log.js +546 -0
  231. package/dist/src/core/log.js.map +1 -0
  232. package/dist/src/core/loop.js +476 -0
  233. package/dist/src/core/loop.js.map +1 -0
  234. package/dist/src/core/md-fence.js +74 -0
  235. package/dist/src/core/md-fence.js.map +1 -0
  236. package/dist/src/core/money.js +195 -0
  237. package/dist/src/core/money.js.map +1 -0
  238. package/dist/src/core/payload-census.js +146 -0
  239. package/dist/src/core/payload-census.js.map +1 -0
  240. package/dist/src/core/payload-store.js +340 -0
  241. package/dist/src/core/payload-store.js.map +1 -0
  242. package/dist/src/core/payload.js +80 -0
  243. package/dist/src/core/payload.js.map +1 -0
  244. package/dist/src/core/policy-diff.js +565 -0
  245. package/dist/src/core/policy-diff.js.map +1 -0
  246. package/dist/src/core/policy-expectations.js +394 -0
  247. package/dist/src/core/policy-expectations.js.map +1 -0
  248. package/dist/src/core/policy-explain.js +230 -0
  249. package/dist/src/core/policy-explain.js.map +1 -0
  250. package/dist/src/core/policy-load.js +524 -0
  251. package/dist/src/core/policy-load.js.map +1 -0
  252. package/dist/src/core/policy-match.js +467 -0
  253. package/dist/src/core/policy-match.js.map +1 -0
  254. package/dist/src/core/policy-proposal.js +458 -0
  255. package/dist/src/core/policy-proposal.js.map +1 -0
  256. package/dist/src/core/prompt-layout.js +422 -0
  257. package/dist/src/core/prompt-layout.js.map +1 -0
  258. package/dist/src/core/protected-path-guard.js +1087 -0
  259. package/dist/src/core/protected-path-guard.js.map +1 -0
  260. package/dist/src/core/registration.js +39 -0
  261. package/dist/src/core/registration.js.map +1 -0
  262. package/dist/src/core/reindex.js +336 -0
  263. package/dist/src/core/reindex.js.map +1 -0
  264. package/dist/src/core/sampler.js +388 -0
  265. package/dist/src/core/sampler.js.map +1 -0
  266. package/dist/src/core/sandbox.js +424 -0
  267. package/dist/src/core/sandbox.js.map +1 -0
  268. package/dist/src/core/seal.js +290 -0
  269. package/dist/src/core/seal.js.map +1 -0
  270. package/dist/src/core/state.js +1009 -0
  271. package/dist/src/core/state.js.map +1 -0
  272. package/dist/src/core/task-file.js +464 -0
  273. package/dist/src/core/task-file.js.map +1 -0
  274. package/dist/src/core/telegram-config.js +114 -0
  275. package/dist/src/core/telegram-config.js.map +1 -0
  276. package/dist/src/core/token.js +578 -0
  277. package/dist/src/core/token.js.map +1 -0
  278. package/dist/src/core/validate.js +0 -0
  279. package/dist/src/core/validate.js.map +1 -0
  280. package/dist/src/core/values.js +153 -0
  281. package/dist/src/core/values.js.map +1 -0
  282. package/dist/src/core/vault.js +612 -0
  283. package/dist/src/core/vault.js.map +1 -0
  284. package/dist/src/core/verified-snapshot.js +506 -0
  285. package/dist/src/core/verified-snapshot.js.map +1 -0
  286. package/dist/src/core/verify.js +549 -0
  287. package/dist/src/core/verify.js.map +1 -0
  288. package/dist/src/core/version.js +9 -0
  289. package/dist/src/core/version.js.map +1 -0
  290. package/dist/src/core/wysiwys.js +728 -0
  291. package/dist/src/core/wysiwys.js.map +1 -0
  292. package/dist/src/daemon/advance-child.js +78 -0
  293. package/dist/src/daemon/advance-child.js.map +1 -0
  294. package/dist/src/daemon/advance.js +849 -0
  295. package/dist/src/daemon/advance.js.map +1 -0
  296. package/dist/src/daemon/audit.js +90 -0
  297. package/dist/src/daemon/audit.js.map +1 -0
  298. package/dist/src/daemon/daemon.js +1988 -0
  299. package/dist/src/daemon/daemon.js.map +1 -0
  300. package/dist/src/daemon/dark-session.js +119 -0
  301. package/dist/src/daemon/dark-session.js.map +1 -0
  302. package/dist/src/daemon/draw-child.js +132 -0
  303. package/dist/src/daemon/draw-child.js.map +1 -0
  304. package/dist/src/daemon/draw.js +458 -0
  305. package/dist/src/daemon/draw.js.map +1 -0
  306. package/dist/src/daemon/git-evidence.js +345 -0
  307. package/dist/src/daemon/git-evidence.js.map +1 -0
  308. package/dist/src/daemon/projection.js +233 -0
  309. package/dist/src/daemon/projection.js.map +1 -0
  310. package/dist/src/daemon/prune.js +376 -0
  311. package/dist/src/daemon/prune.js.map +1 -0
  312. package/dist/src/mcp/http.js +343 -0
  313. package/dist/src/mcp/http.js.map +1 -0
  314. package/dist/src/mcp/server.js +594 -0
  315. package/dist/src/mcp/server.js.map +1 -0
  316. package/docs/cli-reference.md +5363 -0
  317. package/package.json +43 -4
  318. package/schema/.gitkeep +0 -0
  319. package/schema/LICENSE +117 -0
  320. package/schema/envelope.schema.json +137 -0
  321. package/schema/event.schema.json +1810 -0
  322. package/schema/fixtures/envelope/invalid/action-missing-idempotency-key.json +15 -0
  323. package/schema/fixtures/envelope/invalid/action-unknown-class-format.json +14 -0
  324. package/schema/fixtures/envelope/invalid/confidence-out-of-range.json +11 -0
  325. package/schema/fixtures/envelope/invalid/est-cost-bare-number.json +14 -0
  326. package/schema/fixtures/envelope/invalid/est-cost-noncanonical-string.json +14 -0
  327. package/schema/fixtures/envelope/invalid/malformed-assignee.json +10 -0
  328. package/schema/fixtures/envelope/invalid/malformed-created-by.json +7 -0
  329. package/schema/fixtures/envelope/invalid/malformed-max-latency.json +11 -0
  330. package/schema/fixtures/envelope/invalid/malformed-payload-hash.json +14 -0
  331. package/schema/fixtures/envelope/invalid/max-cost-bare-number.json +11 -0
  332. package/schema/fixtures/envelope/invalid/missing-origin.json +3 -0
  333. package/schema/fixtures/envelope/invalid/negative-est-cost.json +14 -0
  334. package/schema/fixtures/envelope/invalid/unknown-state.json +7 -0
  335. package/schema/fixtures/envelope/invalid/unknown-top-level-field.json +8 -0
  336. package/schema/fixtures/envelope/valid/action-payload-hash.json +17 -0
  337. package/schema/fixtures/envelope/valid/actions-without-budget.json +18 -0
  338. package/schema/fixtures/envelope/valid/canonical.json +25 -0
  339. package/schema/fixtures/envelope/valid/minimal.json +7 -0
  340. package/schema/fixtures/envelope/valid/multi-action-executed.json +30 -0
  341. package/schema/fixtures/envelope/valid/record-write-stage.json +22 -0
  342. package/schema/fixtures/event/invalid/approval-granted-agent-actor.json +15 -0
  343. package/schema/fixtures/event/invalid/approval-granted-empty-batch-delivery-id.json +17 -0
  344. package/schema/fixtures/event/invalid/approval-granted-fifth-reaction.json +16 -0
  345. package/schema/fixtures/event/invalid/approval-granted-missing-actor.json +14 -0
  346. package/schema/fixtures/event/invalid/approval-requested-missing-action-key.json +14 -0
  347. package/schema/fixtures/event/invalid/approval-withdrawn-agent-policy-drift.json +15 -0
  348. package/schema/fixtures/event/invalid/approval-withdrawn-missing-reason.json +15 -0
  349. package/schema/fixtures/event/invalid/approval-withdrawn-system-actor.json +15 -0
  350. package/schema/fixtures/event/invalid/audit-decision-refused-human-actor.json +17 -0
  351. package/schema/fixtures/event/invalid/audit-decision-refused-missing-code.json +16 -0
  352. package/schema/fixtures/event/invalid/audit-reviewed-agent-actor.json +15 -0
  353. package/schema/fixtures/event/invalid/audit-reviewed-loved-no-note.json +16 -0
  354. package/schema/fixtures/event/invalid/audit-reviewed-system-actor.json +15 -0
  355. package/schema/fixtures/event/invalid/bad-actor-prefix.json +15 -0
  356. package/schema/fixtures/event/invalid/est-cost-bare-number.json +17 -0
  357. package/schema/fixtures/event/invalid/execution-completed-fabricated-exit-code.json +16 -0
  358. package/schema/fixtures/event/invalid/execution-completed-provider-ref-empty-id.json +18 -0
  359. package/schema/fixtures/event/invalid/execution-completed-provider-ref-extra-field.json +19 -0
  360. package/schema/fixtures/event/invalid/execution-completed-provider-ref-id-not-string.json +18 -0
  361. package/schema/fixtures/event/invalid/execution-completed-provider-ref-missing-adapter.json +17 -0
  362. package/schema/fixtures/event/invalid/execution-failed-open-reported-by.json +16 -0
  363. package/schema/fixtures/event/invalid/execution-indeterminate-open-reason.json +14 -0
  364. package/schema/fixtures/event/invalid/execution-reconciled-agent-actor.json +17 -0
  365. package/schema/fixtures/event/invalid/execution-started-negative-env-stripped.json +16 -0
  366. package/schema/fixtures/event/invalid/gate-bypassed-missing-opened-seq.json +15 -0
  367. package/schema/fixtures/event/invalid/gate-closed-non-integer-opened-seq.json +13 -0
  368. package/schema/fixtures/event/invalid/gate-opened-agent-actor.json +16 -0
  369. package/schema/fixtures/event/invalid/gate-organ-attested-absolute-path.json +14 -0
  370. package/schema/fixtures/event/invalid/gate-organ-attested-agent-actor.json +14 -0
  371. package/schema/fixtures/event/invalid/gate-organ-attested-missing-organ-path.json +13 -0
  372. package/schema/fixtures/event/invalid/harness-unknown-kind.json +18 -0
  373. package/schema/fixtures/event/invalid/harness-version-multiline.json +16 -0
  374. package/schema/fixtures/event/invalid/log-checkpoint-agent-actor.json +17 -0
  375. package/schema/fixtures/event/invalid/log-checkpoint-missing-signature.json +16 -0
  376. package/schema/fixtures/event/invalid/log-checkpoint-short-signed-hash.json +17 -0
  377. package/schema/fixtures/event/invalid/log-checkpoint-unknown-signature-alg.json +17 -0
  378. package/schema/fixtures/event/invalid/malformed-ts.json +15 -0
  379. package/schema/fixtures/event/invalid/missing-alg.json +14 -0
  380. package/schema/fixtures/event/invalid/missing-hash.json +14 -0
  381. package/schema/fixtures/event/invalid/non-integer-seq.json +15 -0
  382. package/schema/fixtures/event/invalid/payload-pruned-human-actor.json +14 -0
  383. package/schema/fixtures/event/invalid/payload-pruned-missing-hash.json +14 -0
  384. package/schema/fixtures/event/invalid/policy-declined-agent-actor.json +15 -0
  385. package/schema/fixtures/event/invalid/policy-proposed-missing-diff.json +19 -0
  386. package/schema/fixtures/event/invalid/policy-proposed-system-actor.json +26 -0
  387. package/schema/fixtures/event/invalid/short-hash.json +15 -0
  388. package/schema/fixtures/event/invalid/unknown-alg.json +15 -0
  389. package/schema/fixtures/event/invalid/unknown-event-type.json +15 -0
  390. package/schema/fixtures/event/invalid/unknown-top-level-field.json +16 -0
  391. package/schema/fixtures/event/valid/approval-expired.json +15 -0
  392. package/schema/fixtures/event/valid/approval-granted-batch.json +19 -0
  393. package/schema/fixtures/event/valid/approval-granted-reaction.json +16 -0
  394. package/schema/fixtures/event/valid/approval-granted.json +15 -0
  395. package/schema/fixtures/event/valid/approval-rejected.json +15 -0
  396. package/schema/fixtures/event/valid/approval-requested.json +19 -0
  397. package/schema/fixtures/event/valid/approval-revoked.json +15 -0
  398. package/schema/fixtures/event/valid/approval-withdrawn-policy-drift.json +17 -0
  399. package/schema/fixtures/event/valid/approval-withdrawn.json +16 -0
  400. package/schema/fixtures/event/valid/audit-decision-refused.json +20 -0
  401. package/schema/fixtures/event/valid/audit-reviewed-reaction.json +17 -0
  402. package/schema/fixtures/event/valid/audit-reviewed.json +15 -0
  403. package/schema/fixtures/event/valid/audit-sampled.json +14 -0
  404. package/schema/fixtures/event/valid/budget-exceeded.json +21 -0
  405. package/schema/fixtures/event/valid/envelope-drift.json +16 -0
  406. package/schema/fixtures/event/valid/execution-completed-harness-report.json +16 -0
  407. package/schema/fixtures/event/valid/execution-completed-provider-ref.json +18 -0
  408. package/schema/fixtures/event/valid/execution-completed.json +15 -0
  409. package/schema/fixtures/event/valid/execution-failed-harness-report.json +16 -0
  410. package/schema/fixtures/event/valid/execution-failed.json +15 -0
  411. package/schema/fixtures/event/valid/execution-indeterminate.json +15 -0
  412. package/schema/fixtures/event/valid/execution-reconciled.json +17 -0
  413. package/schema/fixtures/event/valid/execution-started-env-stripped.json +17 -0
  414. package/schema/fixtures/event/valid/execution-started.json +14 -0
  415. package/schema/fixtures/event/valid/gate-bypassed-harness-version.json +18 -0
  416. package/schema/fixtures/event/valid/gate-bypassed.json +19 -0
  417. package/schema/fixtures/event/valid/gate-closed.json +14 -0
  418. package/schema/fixtures/event/valid/gate-opened.json +16 -0
  419. package/schema/fixtures/event/valid/gate-organ-attested.json +14 -0
  420. package/schema/fixtures/event/valid/genesis-null-prev.json +14 -0
  421. package/schema/fixtures/event/valid/log-checkpoint.json +17 -0
  422. package/schema/fixtures/event/valid/payload-pruned-orphan.json +13 -0
  423. package/schema/fixtures/event/valid/payload-pruned.json +17 -0
  424. package/schema/fixtures/event/valid/policy-declined.json +16 -0
  425. package/schema/fixtures/event/valid/policy-proposed.json +35 -0
  426. package/schema/fixtures/event/valid/policy-updated.json +14 -0
  427. package/schema/fixtures/event/valid/reconciliation-required.json +18 -0
  428. package/schema/fixtures/event/valid/reconciliation-satisfied.json +17 -0
  429. package/schema/fixtures/event/valid/route-accepted.json +15 -0
  430. package/schema/fixtures/event/valid/route-proposed.json +16 -0
  431. package/schema/fixtures/event/valid/spec-example.json +15 -0
  432. package/schema/fixtures/event/valid/task-registered-harness-version.json +23 -0
  433. package/schema/fixtures/event/valid/task-registered.json +14 -0
  434. package/schema/fixtures/hash/known-answer-pre-121.json +74 -0
  435. package/schema/fixtures/hash/known-answer.json +74 -0
  436. package/schema/fixtures/policy/invalid/bad-approval-ttl.json +7 -0
  437. package/schema/fixtures/policy/invalid/bad-web-port.json +4 -0
  438. package/schema/fixtures/policy/invalid/checkpoint-key-not-base64.json +6 -0
  439. package/schema/fixtures/policy/invalid/class-rule-missing-autonomy.json +9 -0
  440. package/schema/fixtures/policy/invalid/empty-class-key.json +6 -0
  441. package/schema/fixtures/policy/invalid/live-rate-on-human-only.json +7 -0
  442. package/schema/fixtures/policy/invalid/malformed-class-key.json +6 -0
  443. package/schema/fixtures/policy/invalid/missing-version.json +8 -0
  444. package/schema/fixtures/policy/invalid/negative-limit.json +9 -0
  445. package/schema/fixtures/policy/invalid/non-numeric-limit.json +9 -0
  446. package/schema/fixtures/policy/invalid/non-positive-max-pending.json +9 -0
  447. package/schema/fixtures/policy/invalid/on-expiry-grant.json +8 -0
  448. package/schema/fixtures/policy/invalid/payload-retention-bare-number.json +4 -0
  449. package/schema/fixtures/policy/invalid/payload-retention-compound.json +4 -0
  450. package/schema/fixtures/policy/invalid/payload-retention-fractional.json +4 -0
  451. package/schema/fixtures/policy/invalid/payload-retention-zero.json +4 -0
  452. package/schema/fixtures/policy/invalid/protected-paths-escape.json +4 -0
  453. package/schema/fixtures/policy/invalid/protected-paths-glob.json +4 -0
  454. package/schema/fixtures/policy/invalid/retro-rate-on-human-only.json +7 -0
  455. package/schema/fixtures/policy/invalid/retro-rate-on-manual.json +7 -0
  456. package/schema/fixtures/policy/invalid/retro-rate-zero.json +7 -0
  457. package/schema/fixtures/policy/invalid/sample-rate-too-high.json +5 -0
  458. package/schema/fixtures/policy/invalid/sampling-secret-env-empty.json +7 -0
  459. package/schema/fixtures/policy/invalid/sampling-secret-env-not-string.json +6 -0
  460. package/schema/fixtures/policy/invalid/skew-tolerance-compound.json +6 -0
  461. package/schema/fixtures/policy/invalid/unknown-autonomy.json +7 -0
  462. package/schema/fixtures/policy/invalid/unknown-class-rule-key.json +6 -0
  463. package/schema/fixtures/policy/invalid/unknown-top-level-key.json +7 -0
  464. package/schema/fixtures/policy/invalid/vault-passphrase-env-empty.json +6 -0
  465. package/schema/fixtures/policy/invalid/vault-passphrase-literal.json +6 -0
  466. package/schema/fixtures/policy/invalid/version-not-string.json +4 -0
  467. package/schema/fixtures/policy/valid/canonical.json +47 -0
  468. package/schema/fixtures/policy/valid/checkpoint-keys.json +18 -0
  469. package/schema/fixtures/policy/valid/class-approvers-limits.json +25 -0
  470. package/schema/fixtures/policy/valid/class-retro-rate.json +17 -0
  471. package/schema/fixtures/policy/valid/global-budgets.json +19 -0
  472. package/schema/fixtures/policy/valid/human-only.json +9 -0
  473. package/schema/fixtures/policy/valid/minimal.json +6 -0
  474. package/schema/fixtures/policy/valid/protected-paths.json +10 -0
  475. package/schema/fixtures/policy/valid/record-namespace.json +13 -0
  476. package/schema/fixtures/policy/valid/request-volume-limits.json +26 -0
  477. package/schema/fixtures/policy/valid/retention-and-sampling-secret.json +16 -0
  478. package/schema/fixtures/policy/valid/skew-tolerance.json +15 -0
  479. package/schema/fixtures/policy/valid/vault-passphrase-env.json +14 -0
  480. package/schema/fixtures/policy/valid/wildcards.json +15 -0
  481. package/schema/fixtures/policy-md/invalid/alias-bomb.md +15 -0
  482. package/schema/fixtures/policy-md/invalid/no-fence.md +7 -0
  483. package/schema/fixtures/policy-md/invalid/protected-route-not-a-subclass.md +16 -0
  484. package/schema/fixtures/policy-md/invalid/schema-invalid-autonomy.md +16 -0
  485. package/schema/fixtures/policy-md/invalid/schema-invalid-read-proof.md +17 -0
  486. package/schema/fixtures/policy-md/invalid/two-fences.md +19 -0
  487. package/schema/fixtures/policy-md/invalid/unclosed-fence.md +11 -0
  488. package/schema/fixtures/policy-md/invalid/wrong-info-string.md +11 -0
  489. package/schema/fixtures/policy-md/invalid/yaml-syntax-error.md +13 -0
  490. package/schema/fixtures/policy-md/precedence/both/APPROVAL.md +7 -0
  491. package/schema/fixtures/policy-md/precedence/both/APPROVALS.md +7 -0
  492. package/schema/fixtures/policy-md/precedence/fallback-only/APPROVALS.md +7 -0
  493. package/schema/fixtures/policy-md/valid/canonical.md +50 -0
  494. package/schema/fixtures/policy-md/valid/daemon-read-proof.md +18 -0
  495. package/schema/fixtures/policy-md/valid/minimal.md +3 -0
  496. package/schema/fixtures/policy-md/valid/prose-lookalikes.md +54 -0
  497. package/schema/fixtures/policy-md/valid/routed-protected-paths.md +49 -0
  498. package/schema/fixtures/policy-md/valid/with-values.md +79 -0
  499. package/schema/fixtures/sample-record/invalid/bad-date-time.json +4 -0
  500. package/schema/fixtures/sample-record/invalid/missing-required-field.json +3 -0
  501. package/schema/fixtures/sample-record/invalid/unknown-top-level-field.json +5 -0
  502. package/schema/fixtures/sample-record/invalid/wrong-type.json +4 -0
  503. package/schema/fixtures/sample-record/valid/minimal.json +4 -0
  504. package/schema/fixtures/sample-record/valid/with-note.json +5 -0
  505. package/schema/fixtures/values/invalid/class-shaped.json +9 -0
  506. package/schema/fixtures/values/invalid/duplicate-entry.json +4 -0
  507. package/schema/fixtures/values/invalid/non-string-item.json +4 -0
  508. package/schema/fixtures/values/invalid/over-cap.json +26 -0
  509. package/schema/fixtures/values/invalid/unknown-key.json +5 -0
  510. package/schema/fixtures/values/invalid/version-string.json +1 -0
  511. package/schema/fixtures/values/valid/empty-lists.json +7 -0
  512. package/schema/fixtures/values/valid/full.json +20 -0
  513. package/schema/fixtures/values/valid/minimal.json +1 -0
  514. package/schema/fixtures/values-md/invalid/schema-invalid.md +62 -0
  515. package/schema/fixtures/values-md/invalid/two-blocks.md +69 -0
  516. package/schema/fixtures/values-md/invalid/unterminated.md +61 -0
  517. package/schema/fixtures/values-md/invalid/yaml-error.md +63 -0
  518. package/schema/fixtures/values-md/valid/absent.md +50 -0
  519. package/schema/fixtures/values-md/valid/with-values.md +79 -0
  520. package/schema/policy.schema.json +481 -0
  521. package/schema/sample-record.schema.json +26 -0
  522. package/schema/values.schema.json +55 -0
@@ -0,0 +1,475 @@
1
+ /**
2
+ * `approval setup adapter <name>` — fill the vault for one adapter (APRV-78).
3
+ *
4
+ * SPEC.md §10.4 gives adapters an encrypted vault and `approval vault set` as
5
+ * the way in, and that verb is deliberately austere: one credential, one call,
6
+ * no prompt, the value from stdin or a named variable. It is the right shape
7
+ * for a script and the wrong shape for a person, who has to know that the email
8
+ * adapter wants five values, what each of them is called, which of them are
9
+ * secrets, that the port must be a port and the security setting one of three
10
+ * words, and that the user and the password are both-or-neither. All of that
11
+ * was written down only inside `adapters/email.ts`'s `act`, where nobody
12
+ * setting a machine up can read it.
13
+ *
14
+ * This verb reads the adapter's own manifest instead. The conversation is
15
+ * `cli/setup-flow.ts` and knows nothing about SMTP; the manifest is
16
+ * `EMAIL_CREDENTIAL_SPECS` and knows nothing about vaults or terminals; this
17
+ * file is the ten lines that join them, plus the two things that are genuinely
18
+ * about the pairing: what to do with the passphrase, and how to prove the
19
+ * result without sending anything.
20
+ *
21
+ * ## Where the values go, and where they do NOT
22
+ *
23
+ * **Into the vault, always.** Not the OS keystore, which is where `setup
24
+ * vault|sampling|channel <name>` put their secrets, and not `.approval/env`. The
25
+ * distinction is the one §10.4 draws: `.approval/env` holds what unlocks the
26
+ * machine (the human identity, the passphrase's source, the channel's token),
27
+ * and the vault holds what a gated adapter SPENDS inside a verified-token
28
+ * window. An SMTP password in `.approval/env` would be readable by
29
+ * `approval env` on demand, which is exactly the journey the vault exists to
30
+ * forbid.
31
+ *
32
+ * ## The passphrase is read, never established
33
+ *
34
+ * From the shell environment, under the name the policy declares, through
35
+ * {@link passphraseFrom} — and from nowhere else. **This verb never resolves
36
+ * `.approval/env` itself** (SPEC.md §11.1 invariant 7: no command loads that
37
+ * file implicitly, because a working-tree file any process read on its own
38
+ * would let anything able to write it act as you). It does READ the file, for
39
+ * one thing only: whether a line for the passphrase variable exists, which
40
+ * decides whether the refusal tells you to run `approval setup vault` or just
41
+ * to `eval "$(approval env)"`. A key's PRESENCE is not its value, and
42
+ * `planReplacements` has always read the file for exactly that.
43
+ *
44
+ * ## Verification sends nothing
45
+ *
46
+ * The proof is {@link probeSmtp}: the same session `sendMail` runs, up to and
47
+ * including AUTH, and then QUIT. It proves the host resolves, the port answers,
48
+ * the TLS mode is the one the server offers, and the credential is accepted. It
49
+ * does not prove a message would be delivered, and it puts no message on the
50
+ * wire — a setup verb that emailed somebody to prove itself would be a verb
51
+ * people run once and then avoid, which is `approval doctor`'s argument for
52
+ * calling `getMe` and nothing else.
53
+ *
54
+ * It is OFFERED, defaulting to YES, and a failure does not delete anything: the
55
+ * values stay, the refusal names the SMTP code and the server's first line
56
+ * (redacted), and the undo is printed as `approval vault remove <name>`. Values
57
+ * discarded by a wizard because a laptop was on a captive portal would be five
58
+ * more things to type.
59
+ *
60
+ * A PARTIAL RE-RUN is offered the same proof over the STORED set (APRV-99). It
61
+ * holds only what it just collected, so it reads the rest through
62
+ * {@link readEmailSmtpConfig} over a {@link vaultCredentialProvider}: the exact
63
+ * path `approval adapter email` takes at send time, in this process, printed by
64
+ * nothing. That is not a hole in "there is no verb that reads a credential
65
+ * out" — that rule is about what reaches a terminal, and nothing here does.
66
+ * Rotating an app password is the common case for this verb, and a probe no
67
+ * wider than the send it proves is the difference between a rotation you have
68
+ * checked and one you find out about from a bounce.
69
+ */
70
+ import { envFilePathFor, readEnvFile } from "../core/env-file.js";
71
+ import { passphraseEnvFor, passphraseFrom, vaultExists, vaultPathFor } from "../core/vault.js";
72
+ import { DEFAULT_CREDENTIAL_NAMES, EMAIL_CREDENTIAL_SPECS, checkEmailCredentialSet, readEmailSmtpConfig, } from "../adapters/email.js";
73
+ import { AGENTMAIL_CREDENTIAL_SPECS, AGENTMAIL_SEND_PERMISSIONS, DEFAULT_AGENTMAIL_CREDENTIAL_NAMES, probeAgentmail, readAgentmailConfig, } from "../adapters/agentmail.js";
74
+ import { vaultCredentialProvider } from "../adapters/vault-provider.js";
75
+ import { isSmtpSecurity, probeSmtp } from "../adapters/smtp.js";
76
+ import { EXIT_OK } from "./exit-codes.js";
77
+ import { SETUP_ADAPTER_AGENTMAIL_HELP, SETUP_ADAPTER_EMAIL_HELP, SETUP_ADAPTER_HELP, } from "./help.js";
78
+ import { refusal as renderRefusal, style } from "./style.js";
79
+ import { confirmUntil } from "./prompt.js";
80
+ import { front, requireHuman, usageError, } from "./setup-common.js";
81
+ import { runCredentialFlow, vaultDestination, } from "./setup-flow.js";
82
+ /** The keystore read form for this machine, defaulting to the macOS one. */
83
+ function readBackCommand(kind, item) {
84
+ return kind === "secret-service"
85
+ ? `secret-tool lookup approval ${item}`
86
+ : `security find-generic-password -a "$USER" -s ${item} -w`;
87
+ }
88
+ /**
89
+ * The scripted path, GENERATED FROM THE MANIFEST rather than written out.
90
+ *
91
+ * A hand-written hint is a list of five commands that has to be edited every
92
+ * time the manifest changes and will not be. Generating it means the refusal an
93
+ * operator copies is, by construction, the set of names the adapter actually
94
+ * reads.
95
+ *
96
+ * The secret's line takes its value from the keystore's own reader, so the
97
+ * password is never an argument on any line printed here — the rule the rest of
98
+ * `setup` follows, applied to a verb whose whole subject is credentials.
99
+ */
100
+ function manifestHint(specs, context) {
101
+ const lines = [
102
+ ` # 1. establish the vault passphrase in ${context.passphraseEnv} and put it in this`,
103
+ ` # shell. Every line below reads it from the environment and nowhere else:`,
104
+ ` approval setup vault --as human:<id>`,
105
+ ` eval "$(approval env)"`,
106
+ ``,
107
+ ` # 2. store each credential. The VALUE is never a command-line argument:`,
108
+ ` # --value-env names a variable, and the variable is set for that one call.`,
109
+ ];
110
+ for (const spec of specs) {
111
+ const call = `approval vault set ${spec.name} --value-env V --as human:<id>`;
112
+ if (spec.kind === "secret") {
113
+ lines.push(` V="$(${readBackCommand(context.kind, "<your-item>")})" \\`, ` ${call}`);
114
+ }
115
+ else {
116
+ const placeholder = spec.default ?? `<${spec.label.replace(/\s+/gu, "-")}>`;
117
+ lines.push(` V='${placeholder}' ${call}`);
118
+ }
119
+ }
120
+ return lines.join("\n");
121
+ }
122
+ /** Replace every occurrence of each secret. Nothing leaves this file with one. */
123
+ function redactor(secrets) {
124
+ const present = secrets.filter((secret) => secret.length > 0);
125
+ return (text) => {
126
+ let out = text;
127
+ for (const secret of present)
128
+ out = out.split(secret).join("<redacted>");
129
+ return out;
130
+ };
131
+ }
132
+ /** Today's refusal for a partial run, kept verbatim as the fallback (APRV-99). */
133
+ function partialRefusal(skipped) {
134
+ return `\nnot verified: ${skipped.join(", ")} ${skipped.length === 1 ? "was" : "were"} left alone this run, so this verb does not hold the whole\nconfiguration, and it will not read the missing values back — there is no verb in\nthis CLI that reads a credential out of the vault. Re-run and replace all of them\nto probe the server.\n`;
135
+ }
136
+ /**
137
+ * The session itself, and the two sentences it can end with.
138
+ *
139
+ * Shared by the first-run path and the stored-configuration path (APRV-99) so
140
+ * that a probe reports the same way whichever set it ran over: an operator
141
+ * rotating an app password is owed the proof they get on day one, in the words
142
+ * they got it in. `undo` is the list of names this run stored, because the undo
143
+ * for a failed probe is removing what was just written and nothing else.
144
+ */
145
+ async function probeAndReport(config, scrub, probe, undo) {
146
+ const result = await probe({
147
+ host: config.host,
148
+ port: config.port,
149
+ security: config.security,
150
+ ...(config.user === undefined ? {} : { user: config.user }),
151
+ ...(config.password === undefined ? {} : { password: config.password }),
152
+ tlsRejectUnauthorized: true,
153
+ redact: scrub,
154
+ });
155
+ if (result.ok) {
156
+ return {
157
+ ok: true,
158
+ detail: `\nverified: ${config.host}:${String(config.port)} answered over ${config.security}, ${result.authenticated === null
159
+ ? "with no login (neither a user nor a password is stored)"
160
+ : `and accepted the credential over AUTH ${result.authenticated}`}.\nNo message was sent: the session ran to AUTH and then QUIT.\n`,
161
+ };
162
+ }
163
+ const lines = undo.map((name) => ` approval vault remove ${name} --as human:<id>`).join("\n");
164
+ return {
165
+ ok: false,
166
+ // APRV-102: the one refusal shape, here too. A probe failure is the last
167
+ // thing this verb prints before the operator decides what to fix.
168
+ detail: `${renderRefusal(style(), result.code, scrub(result.message))}\n\nThe values ARE stored — a probe that failed because a laptop is behind a captive\nportal is not a reason to make you type five things again. Fix the server or the\nsetting and re-run this verb, or undo it by hand:\n\n${lines}\n`,
169
+ };
170
+ }
171
+ /**
172
+ * The partial re-run: offer to probe the configuration IN THE VAULT (APRV-99).
173
+ *
174
+ * This verb used to stop here, on the argument that it did not hold the whole
175
+ * configuration and that reading the rest back is the thing there is no verb
176
+ * for. The first half is true and the second half was the wrong inference.
177
+ * There is no verb that PRINTS a credential, and there still is not; but the
178
+ * email adapter reads all five out of the vault on every send, through
179
+ * {@link readEmailSmtpConfig} over a {@link vaultCredentialProvider}, and this
180
+ * function does exactly that and nothing more. The values are read into this
181
+ * process, handed to the same SMTP session `sendMail` opens, and dropped. No
182
+ * count, no prefix, no length, no value reaches a stream — the suite sweeps
183
+ * every captured byte for the fixture secrets on this path too. A probe that is
184
+ * no wider than the send it is proving does not widen the exposure; rotating an
185
+ * app password is the common case for this verb and it deserves the proof.
186
+ *
187
+ * When the vault will not open, or what it holds is not usable configuration,
188
+ * the answer is today's refusal verbatim plus one line naming why the probe
189
+ * could not run. The provider's sentences name the variable, the path and the
190
+ * credential NAME, never a value, and they are scrubbed with this run's own
191
+ * values before they are printed anyway.
192
+ */
193
+ async function verifyStored(values, context) {
194
+ const refusal = partialRefusal(context.skipped);
195
+ const scrub = redactor(Object.values(values));
196
+ if (!confirmUntil(context.streams, context.prompter, `open an SMTP session using the stored configuration to check it?`, true)) {
197
+ return { ok: true, declined: true, detail: refusal };
198
+ }
199
+ const configured = readEmailSmtpConfig(context.credentials, DEFAULT_CREDENTIAL_NAMES);
200
+ if (!configured.ok) {
201
+ return {
202
+ ok: true,
203
+ declined: true,
204
+ detail: `${refusal}\nthe probe could not run: ${scrub(configured.message)}\n`,
205
+ };
206
+ }
207
+ return probeAndReport(configured.config, redactor([...Object.values(values), ...configured.secrets]), context.probe, context.written);
208
+ }
209
+ /**
210
+ * The email adapter's verification: one SMTP session that sends nothing.
211
+ *
212
+ * A run that collected the whole picture probes what it collected. A partial
213
+ * re-run hands off to {@link verifyStored}, which offers to probe what is in
214
+ * the vault, read the way the adapter reads it.
215
+ */
216
+ async function verifyEmail(values, context) {
217
+ const names = DEFAULT_CREDENTIAL_NAMES;
218
+ if (context.skipped.length > 0)
219
+ return verifyStored(values, context);
220
+ const host = values[names.host];
221
+ const port = Number(values[names.port]);
222
+ const security = values[names.security];
223
+ if (host === undefined || !Number.isInteger(port) || !isSmtpSecurity(security)) {
224
+ return {
225
+ ok: true,
226
+ declined: true,
227
+ detail: `\nnot verified: the run did not collect ${names.host}, ${names.port} and ${names.security}\n`,
228
+ };
229
+ }
230
+ const user = values[names.user];
231
+ const password = values[names.password];
232
+ const scrub = redactor([user ?? "", password ?? ""]);
233
+ if (!context.prompter.confirm(`open an SMTP session to ${host}:${String(port)} to check it? Nothing is sent`, false)) {
234
+ return {
235
+ ok: true,
236
+ declined: true,
237
+ detail: `\nstored and unverified: no connection was made. \`approval doctor\` does not probe SMTP\neither; the first proof will be the first \`approval adapter email\` send.\n`,
238
+ };
239
+ }
240
+ return probeAndReport({
241
+ host,
242
+ port,
243
+ security: security,
244
+ ...(user === undefined ? {} : { user }),
245
+ ...(password === undefined ? {} : { password }),
246
+ }, scrub, context.probe, [names.host, names.port, names.security, names.user, names.password].filter((name) => values[name] !== undefined));
247
+ }
248
+ // ---------------------------------------------------------------------------
249
+ // agentmail (APRV-223)
250
+ // ---------------------------------------------------------------------------
251
+ /**
252
+ * What the probe can say about the stored key's own permissions.
253
+ *
254
+ * Three answers and not two, because "not disclosed" is not "none". AgentMail
255
+ * keys carry `draft_send` and `message_send` as separate booleans and the whole
256
+ * deployment this adapter assumes rests on the vault's key holding both while
257
+ * the agent's key holds neither. The inbox read this probe already makes is the
258
+ * only call it will make: probing a second endpoint nobody has confirmed exists
259
+ * would turn its 404 into a permissions verdict, which is a worse answer than
260
+ * saying plainly that the check could not be made. So a run that learns nothing
261
+ * prints the reminder, and only a disclosure names a missing permission.
262
+ */
263
+ function permissionsLine(disclosed) {
264
+ if (disclosed === null) {
265
+ return `AgentMail disclosed no permissions for this key here, so nothing was checked: the key you\njust stored must carry ${AGENTMAIL_SEND_PERMISSIONS.join(" and ")}, and the key your AGENT holds must not.`;
266
+ }
267
+ const missing = AGENTMAIL_SEND_PERMISSIONS.filter((name) => !disclosed.includes(name));
268
+ if (missing.length === 0) {
269
+ return `The key carries ${AGENTMAIL_SEND_PERMISSIONS.join(" and ")}, which is what a granted send spends.`;
270
+ }
271
+ return `WARNING: this key does not carry ${missing.join(" and ")}. \`approval adapter agentmail\`\nwill be refused agentmail-unauthorized at send time, AFTER a human has granted it.\nStore a key that can send, and leave the one without those permissions to the agent.`;
272
+ }
273
+ /**
274
+ * The AgentMail proof: `GET /v0/inboxes/{inbox_id}`, and nothing else.
275
+ *
276
+ * The same read `act` makes before every direct send, for the same two reasons:
277
+ * it establishes that the key opens this inbox, and it reports the address the
278
+ * inbox sends as, which is the address every approved message will actually
279
+ * come from. It puts no message anywhere.
280
+ */
281
+ async function probeAgentmailAndReport(config, scrub, probe, apiBase, undo) {
282
+ const result = await probe(config, apiBase === undefined ? {} : { apiBase });
283
+ if (result.ok) {
284
+ return {
285
+ ok: true,
286
+ detail: `\nverified: the key opened the inbox ${config.inboxId}, which sends as ${result.address}.\nNo message was sent: the probe is one GET of the inbox.\n${permissionsLine(result.permissions)}\n`,
287
+ };
288
+ }
289
+ const lines = undo.map((name) => ` approval vault remove ${name} --as human:<id>`).join("\n");
290
+ return {
291
+ ok: false,
292
+ detail: `${renderRefusal(style(), result.code, scrub(result.message))}\n\nThe values ARE stored — a probe that failed because a laptop is behind a captive\nportal is not a reason to make you type them again. Fix the key or the inbox id\nand re-run this verb, or undo it by hand:\n\n${lines}\n`,
293
+ };
294
+ }
295
+ /**
296
+ * `setup adapter agentmail`'s verification.
297
+ *
298
+ * One shape for both runs, unlike the email adapter's: this manifest is two
299
+ * values, so a partial re-run is a rotation of the key with the inbox left
300
+ * alone, and the read that proves it is the same one either way. It goes
301
+ * through {@link readAgentmailConfig} over the vault whenever the run does not
302
+ * hold both values, which is the exact path `approval adapter agentmail` takes
303
+ * at send time and prints nothing.
304
+ */
305
+ async function verifyAgentmail(values, context) {
306
+ const names = DEFAULT_AGENTMAIL_CREDENTIAL_NAMES;
307
+ const probe = probeAgentmail;
308
+ const scrub = redactor(Object.values(values));
309
+ if (!confirmUntil(context.streams, context.prompter, `read the inbox from AgentMail to check the key? Nothing is sent`, true)) {
310
+ return {
311
+ ok: true,
312
+ declined: true,
313
+ detail: `\nstored and unverified: no request was made. The first proof will be the first\n\`approval adapter agentmail\` send, which is a proof a human has already granted.\n`,
314
+ };
315
+ }
316
+ const inboxId = values[names.inboxId];
317
+ const apiKey = values[names.apiKey];
318
+ if (inboxId !== undefined && apiKey !== undefined) {
319
+ return probeAgentmailAndReport({ inboxId, apiKey }, scrub, probe, context.apiBase, context.written);
320
+ }
321
+ // A partial re-run: read what the vault holds, the way the adapter reads it.
322
+ const configured = readAgentmailConfig(context.credentials, names);
323
+ if (!configured.ok) {
324
+ return {
325
+ ok: true,
326
+ declined: true,
327
+ detail: `${partialRefusal(context.skipped)}\nthe probe could not run: ${scrub(configured.message)}\n`,
328
+ };
329
+ }
330
+ return probeAgentmailAndReport(configured.config, redactor([...Object.values(values), ...configured.secrets]), probe, context.apiBase, context.written);
331
+ }
332
+ /** Every adapter this verb can configure. Keyed by the `adapter <name>` name. */
333
+ export const ADAPTER_SETUPS = {
334
+ email: {
335
+ specs: EMAIL_CREDENTIAL_SPECS,
336
+ check: (values, kept) => checkEmailCredentialSet(values, DEFAULT_CREDENTIAL_NAMES, kept),
337
+ summary: "the SMTP settings `approval adapter email` reads inside the verified-token window",
338
+ help: SETUP_ADAPTER_EMAIL_HELP,
339
+ hint: (context) => manifestHint(EMAIL_CREDENTIAL_SPECS, context),
340
+ verify: verifyEmail,
341
+ nextSteps: [
342
+ `Check the names (never the values) with:`,
343
+ ``,
344
+ ` approval vault list --as human:<id>`,
345
+ ``,
346
+ `The adapter reads them itself, inside the token window; nothing else does.`,
347
+ ],
348
+ },
349
+ agentmail: {
350
+ specs: AGENTMAIL_CREDENTIAL_SPECS,
351
+ summary: "the AgentMail inbox and sending key `approval adapter agentmail` reads inside the verified-token window",
352
+ help: SETUP_ADAPTER_AGENTMAIL_HELP,
353
+ hint: (context) => manifestHint(AGENTMAIL_CREDENTIAL_SPECS, context),
354
+ verify: verifyAgentmail,
355
+ nextSteps: [
356
+ `Check the names (never the values) with:`,
357
+ ``,
358
+ ` approval vault list --as human:<id>`,
359
+ ``,
360
+ `The key stored here is the one that CAN send. Give the agent a different key,`,
361
+ `without ${AGENTMAIL_SEND_PERMISSIONS.join(" or ")}, in AGENTMAIL_API_KEY: that key composes`,
362
+ `drafts, and \`approval payload agentmail-draft\` snapshots one for a human to read.`,
363
+ ],
364
+ },
365
+ };
366
+ /** The known names, sorted, for a usage error and for the help text. */
367
+ export function knownAdapterNames() {
368
+ return Object.keys(ADAPTER_SETUPS).sort();
369
+ }
370
+ // ---------------------------------------------------------------------------
371
+ // The verb
372
+ // ---------------------------------------------------------------------------
373
+ /**
374
+ * The refusal for an unset passphrase.
375
+ *
376
+ * Two shapes, and the difference is a diagnosis: no vault file AND no line for
377
+ * the variable means nobody has ever established one, so the repair starts with
378
+ * `approval setup vault`. Anything else means the passphrase exists and this
379
+ * shell has not evaluated it, so the repair is one line. A verb that printed
380
+ * both every time would train the operator to skim past the one that mattered.
381
+ */
382
+ function passphraseHint(variable, logPath, envPath) {
383
+ const file = readEnvFile(envPath);
384
+ // Reading the file for a KEY'S PRESENCE, never for a value, and never
385
+ // resolving it: SPEC.md §11.1 invariant 7 forbids the resolution, not the
386
+ // stat. An unreadable file is treated as "no line", which is the fail-closed
387
+ // reading: it produces the longer hint, never the shorter one.
388
+ const hasLine = file.ok && file.entries.some((entry) => entry.key === variable);
389
+ const established = hasLine || vaultExists(vaultPathFor(logPath));
390
+ return established
391
+ ? `The passphrase is recorded but not in this shell. Establish it with:\n\n eval "$(approval env)"`
392
+ : `Nobody has established a vault passphrase here. Do that first, then evaluate it:\n\n approval setup vault --as human:<id>\n eval "$(approval env)"`;
393
+ }
394
+ /**
395
+ * `approval setup adapter <name>` — the interactive writer for one adapter's
396
+ * credentials. HUMAN-ONLY.
397
+ *
398
+ * `argv` starts at the adapter's name: `commandSetup` has already eaten
399
+ * `adapter`.
400
+ */
401
+ export async function commandSetupAdapter(argv, streams, cwd, deps = {}) {
402
+ const json = argv.includes("--json");
403
+ const name = argv[0];
404
+ // The name is resolved BEFORE the terminal check, so that a typo is answered
405
+ // with "here are the adapters" rather than with a lecture about pipes.
406
+ if (name === "--help" || name === "-h" || name === "help") {
407
+ streams.out(`${SETUP_ADAPTER_HELP}\n`);
408
+ return EXIT_OK;
409
+ }
410
+ if (name === undefined || name.startsWith("-")) {
411
+ return usageError(streams, json, `missing <name> for \`approval setup adapter\`; known adapters: ${knownAdapterNames().join(", ")}`, SETUP_ADAPTER_HELP);
412
+ }
413
+ // Own keys only, for the reason `cli/adapter.ts` gives (APRV-223): every
414
+ // string names something on `Object.prototype` before it names an adapter.
415
+ const entry = Object.hasOwn(ADAPTER_SETUPS, name) ? ADAPTER_SETUPS[name] : undefined;
416
+ if (entry === undefined) {
417
+ return usageError(streams, json, `unknown adapter ${JSON.stringify(name)}; known adapters: ${knownAdapterNames().join(", ")}`, SETUP_ADAPTER_HELP);
418
+ }
419
+ // The adapter's own help, from the table entry the name resolved to: the
420
+ // generic SETUP_ADAPTER_HELP is for the errors that happen BEFORE a name
421
+ // resolves, and for nothing after this line.
422
+ const helpText = entry.help;
423
+ const outcome = front(`adapter ${name}`, argv.slice(1), streams, cwd, deps, helpText, (context) => entry.hint(context));
424
+ if (outcome.kind === "handled")
425
+ return outcome.code;
426
+ const context = outcome;
427
+ const extra = context.positionals[0];
428
+ if (extra !== undefined) {
429
+ return usageError(streams, false, `unexpected argument ${JSON.stringify(extra)}`, helpText);
430
+ }
431
+ const human = requireHuman(context.flags, streams, helpText, `adapter ${name}`);
432
+ if (!human.ok)
433
+ return human.code;
434
+ // The passphrase, from the SHELL environment under the policy's name. Never
435
+ // from `.approval/env` directly: §11.1 invariant 7.
436
+ const variable = passphraseEnvFor(context.load);
437
+ const passphrase = passphraseFrom(variable, deps.env ?? process.env);
438
+ if (passphrase === null) {
439
+ return usageError(streams, false, `${variable} is unset or empty: the vault passphrase is read from that environment variable and from nowhere else, and this verb creates nothing without it. Nothing was stored and no vault was created.\n\n${passphraseHint(variable, context.logPath, envFilePathFor(context.logPath))}`, helpText);
440
+ }
441
+ const vaultPath = vaultPathFor(context.logPath);
442
+ const probe = deps.probe ?? probeSmtp;
443
+ // The adapter's own reader over the same vault, for the partial-re-run probe
444
+ // (APRV-99). Built here and not in the hook so that this file keeps the one
445
+ // fact the hook has no business knowing: which file, and under which
446
+ // variable. Lazy, so a first run never opens it.
447
+ const credentials = deps.credentials ??
448
+ vaultCredentialProvider({ vaultPath }, { passphraseEnv: variable, env: deps.env ?? process.env });
449
+ const result = await runCredentialFlow({
450
+ streams,
451
+ prompter: context.prompter,
452
+ specs: entry.specs,
453
+ destination: vaultDestination(vaultPath, passphrase),
454
+ labels: {
455
+ title: `approval setup adapter ${name} — ${entry.summary}.`,
456
+ prereq: `The values go into the VAULT, not into the OS keystore and not into\n.approval/env: what this verb stores is what a gated adapter spends inside a\nverified-token window. Nothing here appends to the log or attests anything.`,
457
+ nextSteps: entry.nextSteps,
458
+ },
459
+ hooks: {
460
+ ...(entry.check === undefined ? {} : { check: entry.check }),
461
+ verify: (values, progress) => entry.verify(values, {
462
+ written: progress.written,
463
+ skipped: progress.skipped,
464
+ streams,
465
+ prompter: context.prompter,
466
+ probe,
467
+ ...(deps.apiBase === undefined ? {} : { apiBase: deps.apiBase }),
468
+ credentials,
469
+ }),
470
+ },
471
+ });
472
+ // The flow decided the code; this verb adds nothing to it.
473
+ return result.code;
474
+ }
475
+ //# sourceMappingURL=setup-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-adapter.js","sourceRoot":"","sources":["../../../src/cli/setup-adapter.ts"],"names":[],"mappings":"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"}