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.
- package/LICENSE +176 -0
- package/NOTICE +5 -0
- package/README.md +940 -4
- package/SPEC.md +476 -34
- package/cli.js +29 -3
- package/dist/src/adapters/agentmail.d.ts +426 -0
- package/dist/src/adapters/agentmail.js +1200 -0
- package/dist/src/adapters/agentmail.js.map +1 -0
- package/dist/src/adapters/conformance.d.ts +149 -0
- package/dist/src/adapters/conformance.js +461 -0
- package/dist/src/adapters/conformance.js.map +1 -0
- package/dist/src/adapters/contract.d.ts +628 -0
- package/dist/src/adapters/contract.js +1035 -0
- package/dist/src/adapters/contract.js.map +1 -0
- package/dist/src/adapters/email.d.ts +324 -0
- package/dist/src/adapters/email.js +749 -0
- package/dist/src/adapters/email.js.map +1 -0
- package/dist/src/adapters/env-passphrase.d.ts +93 -0
- package/dist/src/adapters/env-passphrase.js +132 -0
- package/dist/src/adapters/env-passphrase.js.map +1 -0
- package/dist/src/adapters/public.d.ts +11 -0
- package/dist/src/adapters/public.js +11 -0
- package/dist/src/adapters/public.js.map +1 -0
- package/dist/src/adapters/registry.d.ts +59 -0
- package/dist/src/adapters/registry.js +77 -0
- package/dist/src/adapters/registry.js.map +1 -0
- package/dist/src/adapters/smtp.d.ts +213 -0
- package/dist/src/adapters/smtp.js +499 -0
- package/dist/src/adapters/smtp.js.map +1 -0
- package/dist/src/adapters/vault-provider.d.ts +114 -0
- package/dist/src/adapters/vault-provider.js +161 -0
- package/dist/src/adapters/vault-provider.js.map +1 -0
- package/dist/src/adapters/zzz.d.ts +66 -0
- package/dist/src/adapters/zzz.js +299 -0
- package/dist/src/adapters/zzz.js.map +1 -0
- package/dist/src/channels/batch.d.ts +109 -0
- package/dist/src/channels/batch.js +121 -0
- package/dist/src/channels/batch.js.map +1 -0
- package/dist/src/channels/cli.d.ts +193 -0
- package/dist/src/channels/cli.js +468 -0
- package/dist/src/channels/cli.js.map +1 -0
- package/dist/src/channels/conformance.d.ts +92 -0
- package/dist/src/channels/conformance.js +445 -0
- package/dist/src/channels/conformance.js.map +1 -0
- package/dist/src/channels/contract.d.ts +623 -0
- package/dist/src/channels/contract.js +494 -0
- package/dist/src/channels/contract.js.map +1 -0
- package/dist/src/channels/payload-view.d.ts +35 -0
- package/dist/src/channels/payload-view.js +43 -0
- package/dist/src/channels/payload-view.js.map +1 -0
- package/dist/src/channels/render-queue.d.ts +149 -0
- package/dist/src/channels/render-queue.js +564 -0
- package/dist/src/channels/render-queue.js.map +1 -0
- package/dist/src/channels/tagging.d.ts +196 -0
- package/dist/src/channels/tagging.js +723 -0
- package/dist/src/channels/tagging.js.map +1 -0
- package/dist/src/channels/telegram.d.ts +1832 -0
- package/dist/src/channels/telegram.js +3190 -0
- package/dist/src/channels/telegram.js.map +1 -0
- package/dist/src/channels/web.d.ts +341 -0
- package/dist/src/channels/web.js +903 -0
- package/dist/src/channels/web.js.map +1 -0
- package/dist/src/cli/adapter.d.ts +90 -0
- package/dist/src/cli/adapter.js +288 -0
- package/dist/src/cli/adapter.js.map +1 -0
- package/dist/src/cli/amend.d.ts +59 -0
- package/dist/src/cli/amend.js +2171 -0
- package/dist/src/cli/amend.js.map +1 -0
- package/dist/src/cli/args.d.ts +43 -0
- package/dist/src/cli/args.js +86 -0
- package/dist/src/cli/args.js.map +1 -0
- package/dist/src/cli/attest.d.ts +41 -0
- package/dist/src/cli/attest.js +307 -0
- package/dist/src/cli/attest.js.map +1 -0
- package/dist/src/cli/audit-card.d.ts +62 -0
- package/dist/src/cli/audit-card.js +201 -0
- package/dist/src/cli/audit-card.js.map +1 -0
- package/dist/src/cli/audit.d.ts +59 -0
- package/dist/src/cli/audit.js +460 -0
- package/dist/src/cli/audit.js.map +1 -0
- package/dist/src/cli/channel-telegram.d.ts +806 -0
- package/dist/src/cli/channel-telegram.js +2063 -0
- package/dist/src/cli/channel-telegram.js.map +1 -0
- package/dist/src/cli/channel-web.d.ts +131 -0
- package/dist/src/cli/channel-web.js +357 -0
- package/dist/src/cli/channel-web.js.map +1 -0
- package/dist/src/cli/channel.d.ts +71 -0
- package/dist/src/cli/channel.js +438 -0
- package/dist/src/cli/channel.js.map +1 -0
- package/dist/src/cli/checkpoint-tap.d.ts +169 -0
- package/dist/src/cli/checkpoint-tap.js +238 -0
- package/dist/src/cli/checkpoint-tap.js.map +1 -0
- package/dist/src/cli/codex.d.ts +2 -0
- package/dist/src/cli/codex.js +172 -0
- package/dist/src/cli/codex.js.map +1 -0
- package/dist/src/cli/coverage.d.ts +61 -0
- package/dist/src/cli/coverage.js +343 -0
- package/dist/src/cli/coverage.js.map +1 -0
- package/dist/src/cli/daemon.d.ts +120 -0
- package/dist/src/cli/daemon.js +631 -0
- package/dist/src/cli/daemon.js.map +1 -0
- package/dist/src/cli/doctor.d.ts +129 -0
- package/dist/src/cli/doctor.js +2762 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/env.d.ts +65 -0
- package/dist/src/cli/env.js +302 -0
- package/dist/src/cli/env.js.map +1 -0
- package/dist/src/cli/execute.d.ts +202 -0
- package/dist/src/cli/execute.js +1682 -0
- package/dist/src/cli/execute.js.map +1 -0
- package/dist/src/cli/exit-codes.d.ts +73 -0
- package/dist/src/cli/exit-codes.js +82 -0
- package/dist/src/cli/exit-codes.js.map +1 -0
- package/dist/src/cli/feedback.d.ts +60 -0
- package/dist/src/cli/feedback.js +205 -0
- package/dist/src/cli/feedback.js.map +1 -0
- package/dist/src/cli/gate-window.d.ts +40 -0
- package/dist/src/cli/gate-window.js +294 -0
- package/dist/src/cli/gate-window.js.map +1 -0
- package/dist/src/cli/gate.d.ts +68 -0
- package/dist/src/cli/gate.js +557 -0
- package/dist/src/cli/gate.js.map +1 -0
- package/dist/src/cli/git-scope.d.ts +190 -0
- package/dist/src/cli/git-scope.js +295 -0
- package/dist/src/cli/git-scope.js.map +1 -0
- package/dist/src/cli/gloss-attach.d.ts +85 -0
- package/dist/src/cli/gloss-attach.js +107 -0
- package/dist/src/cli/gloss-attach.js.map +1 -0
- package/dist/src/cli/gloss-codex-child.d.ts +9 -0
- package/dist/src/cli/gloss-codex-child.js +149 -0
- package/dist/src/cli/gloss-codex-child.js.map +1 -0
- package/dist/src/cli/gloss-codex.d.ts +24 -0
- package/dist/src/cli/gloss-codex.js +255 -0
- package/dist/src/cli/gloss-codex.js.map +1 -0
- package/dist/src/cli/gloss-options.d.ts +42 -0
- package/dist/src/cli/gloss-options.js +79 -0
- package/dist/src/cli/gloss-options.js.map +1 -0
- package/dist/src/cli/gloss.d.ts +265 -0
- package/dist/src/cli/gloss.js +362 -0
- package/dist/src/cli/gloss.js.map +1 -0
- package/dist/src/cli/help.d.ts +103 -0
- package/dist/src/cli/help.js +2339 -0
- package/dist/src/cli/help.js.map +1 -0
- package/dist/src/cli/hook-codex.d.ts +78 -0
- package/dist/src/cli/hook-codex.js +167 -0
- package/dist/src/cli/hook-codex.js.map +1 -0
- package/dist/src/cli/hook.d.ts +331 -0
- package/dist/src/cli/hook.js +2849 -0
- package/dist/src/cli/hook.js.map +1 -0
- package/dist/src/cli/import.d.ts +35 -0
- package/dist/src/cli/import.js +175 -0
- package/dist/src/cli/import.js.map +1 -0
- package/dist/src/cli/init.d.ts +84 -0
- package/dist/src/cli/init.js +336 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/instructions.d.ts +23 -0
- package/dist/src/cli/instructions.js +262 -0
- package/dist/src/cli/instructions.js.map +1 -0
- package/dist/src/cli/journal.d.ts +41 -0
- package/dist/src/cli/journal.js +238 -0
- package/dist/src/cli/journal.js.map +1 -0
- package/dist/src/cli/log-advance.d.ts +287 -0
- package/dist/src/cli/log-advance.js +840 -0
- package/dist/src/cli/log-advance.js.map +1 -0
- package/dist/src/cli/log-anchor.d.ts +176 -0
- package/dist/src/cli/log-anchor.js +387 -0
- package/dist/src/cli/log-anchor.js.map +1 -0
- package/dist/src/cli/log-checkpoint.d.ts +22 -0
- package/dist/src/cli/log-checkpoint.js +128 -0
- package/dist/src/cli/log-checkpoint.js.map +1 -0
- package/dist/src/cli/log-sync.d.ts +243 -0
- package/dist/src/cli/log-sync.js +849 -0
- package/dist/src/cli/log-sync.js.map +1 -0
- package/dist/src/cli/log-verbs.d.ts +16 -0
- package/dist/src/cli/log-verbs.js +360 -0
- package/dist/src/cli/log-verbs.js.map +1 -0
- package/dist/src/cli/long-help.d.ts +70 -0
- package/dist/src/cli/long-help.js +148 -0
- package/dist/src/cli/long-help.js.map +1 -0
- package/dist/src/cli/main.d.ts +77 -0
- package/dist/src/cli/main.js +1206 -0
- package/dist/src/cli/main.js.map +1 -0
- package/dist/src/cli/mcp.d.ts +52 -0
- package/dist/src/cli/mcp.js +306 -0
- package/dist/src/cli/mcp.js.map +1 -0
- package/dist/src/cli/paths.d.ts +56 -0
- package/dist/src/cli/paths.js +79 -0
- package/dist/src/cli/paths.js.map +1 -0
- package/dist/src/cli/payload.d.ts +58 -0
- package/dist/src/cli/payload.js +253 -0
- package/dist/src/cli/payload.js.map +1 -0
- package/dist/src/cli/policy.d.ts +43 -0
- package/dist/src/cli/policy.js +229 -0
- package/dist/src/cli/policy.js.map +1 -0
- package/dist/src/cli/preflight.d.ts +363 -0
- package/dist/src/cli/preflight.js +1175 -0
- package/dist/src/cli/preflight.js.map +1 -0
- package/dist/src/cli/progress.d.ts +78 -0
- package/dist/src/cli/progress.js +112 -0
- package/dist/src/cli/progress.js.map +1 -0
- package/dist/src/cli/prompt.d.ts +209 -0
- package/dist/src/cli/prompt.js +312 -0
- package/dist/src/cli/prompt.js.map +1 -0
- package/dist/src/cli/quickstart.d.ts +46 -0
- package/dist/src/cli/quickstart.js +297 -0
- package/dist/src/cli/quickstart.js.map +1 -0
- package/dist/src/cli/records.d.ts +34 -0
- package/dist/src/cli/records.js +66 -0
- package/dist/src/cli/records.js.map +1 -0
- package/dist/src/cli/render.d.ts +22 -0
- package/dist/src/cli/render.js +132 -0
- package/dist/src/cli/render.js.map +1 -0
- package/dist/src/cli/sandbox.d.ts +51 -0
- package/dist/src/cli/sandbox.js +150 -0
- package/dist/src/cli/sandbox.js.map +1 -0
- package/dist/src/cli/scaffold.d.ts +79 -0
- package/dist/src/cli/scaffold.js +137 -0
- package/dist/src/cli/scaffold.js.map +1 -0
- package/dist/src/cli/setup-adapter.d.ts +137 -0
- package/dist/src/cli/setup-adapter.js +509 -0
- package/dist/src/cli/setup-adapter.js.map +1 -0
- package/dist/src/cli/setup-channel.d.ts +117 -0
- package/dist/src/cli/setup-channel.js +635 -0
- package/dist/src/cli/setup-channel.js.map +1 -0
- package/dist/src/cli/setup-checkpoint.d.ts +57 -0
- package/dist/src/cli/setup-checkpoint.js +196 -0
- package/dist/src/cli/setup-checkpoint.js.map +1 -0
- package/dist/src/cli/setup-common.d.ts +275 -0
- package/dist/src/cli/setup-common.js +376 -0
- package/dist/src/cli/setup-common.js.map +1 -0
- package/dist/src/cli/setup-flow.d.ts +287 -0
- package/dist/src/cli/setup-flow.js +476 -0
- package/dist/src/cli/setup-flow.js.map +1 -0
- package/dist/src/cli/setup-service.d.ts +96 -0
- package/dist/src/cli/setup-service.js +308 -0
- package/dist/src/cli/setup-service.js.map +1 -0
- package/dist/src/cli/setup.d.ts +202 -0
- package/dist/src/cli/setup.js +473 -0
- package/dist/src/cli/setup.js.map +1 -0
- package/dist/src/cli/style.d.ts +320 -0
- package/dist/src/cli/style.js +469 -0
- package/dist/src/cli/style.js.map +1 -0
- package/dist/src/cli/token.d.ts +39 -0
- package/dist/src/cli/token.js +274 -0
- package/dist/src/cli/token.js.map +1 -0
- package/dist/src/cli/up.d.ts +155 -0
- package/dist/src/cli/up.js +849 -0
- package/dist/src/cli/up.js.map +1 -0
- package/dist/src/cli/usage.d.ts +37 -0
- package/dist/src/cli/usage.js +91 -0
- package/dist/src/cli/usage.js.map +1 -0
- package/dist/src/cli/values.d.ts +40 -0
- package/dist/src/cli/values.js +189 -0
- package/dist/src/cli/values.js.map +1 -0
- package/dist/src/cli/vault.d.ts +59 -0
- package/dist/src/cli/vault.js +362 -0
- package/dist/src/cli/vault.js.map +1 -0
- package/dist/src/cli/verb-registry.d.ts +76 -0
- package/dist/src/cli/verb-registry.js +2341 -0
- package/dist/src/cli/verb-registry.js.map +1 -0
- package/dist/src/cli/wordmark.d.ts +31 -0
- package/dist/src/cli/wordmark.js +52 -0
- package/dist/src/cli/wordmark.js.map +1 -0
- package/dist/src/codex/doctor.d.ts +13 -0
- package/dist/src/codex/doctor.js +41 -0
- package/dist/src/codex/doctor.js.map +1 -0
- package/dist/src/codex/manifest.d.ts +49 -0
- package/dist/src/codex/manifest.js +103 -0
- package/dist/src/codex/manifest.js.map +1 -0
- package/dist/src/codex/templates.d.ts +41 -0
- package/dist/src/codex/templates.js +319 -0
- package/dist/src/codex/templates.js.map +1 -0
- package/dist/src/codex/trust.d.ts +19 -0
- package/dist/src/codex/trust.js +183 -0
- package/dist/src/codex/trust.js.map +1 -0
- package/dist/src/codex/workspace-plan.d.ts +131 -0
- package/dist/src/codex/workspace-plan.js +561 -0
- package/dist/src/codex/workspace-plan.js.map +1 -0
- package/dist/src/core/actor.d.ts +2 -0
- package/dist/src/core/actor.js +5 -0
- package/dist/src/core/actor.js.map +1 -0
- package/dist/src/core/advance-cycle.d.ts +170 -0
- package/dist/src/core/advance-cycle.js +200 -0
- package/dist/src/core/advance-cycle.js.map +1 -0
- package/dist/src/core/agents-md.d.ts +276 -0
- package/dist/src/core/agents-md.js +747 -0
- package/dist/src/core/agents-md.js.map +1 -0
- package/dist/src/core/apply-patch.d.ts +49 -0
- package/dist/src/core/apply-patch.js +266 -0
- package/dist/src/core/apply-patch.js.map +1 -0
- package/dist/src/core/attest.d.ts +420 -0
- package/dist/src/core/attest.js +589 -0
- package/dist/src/core/attest.js.map +1 -0
- package/dist/src/core/audit.d.ts +492 -0
- package/dist/src/core/audit.js +882 -0
- package/dist/src/core/audit.js.map +1 -0
- package/dist/src/core/budgets.d.ts +238 -0
- package/dist/src/core/budgets.js +449 -0
- package/dist/src/core/budgets.js.map +1 -0
- package/dist/src/core/checkpoint.d.ts +500 -0
- package/dist/src/core/checkpoint.js +738 -0
- package/dist/src/core/checkpoint.js.map +1 -0
- package/dist/src/core/child-env.d.ts +88 -0
- package/dist/src/core/child-env.js +86 -0
- package/dist/src/core/child-env.js.map +1 -0
- package/dist/src/core/clock.d.ts +52 -0
- package/dist/src/core/clock.js +43 -0
- package/dist/src/core/clock.js.map +1 -0
- package/dist/src/core/command-class.d.ts +543 -0
- package/dist/src/core/command-class.js +2356 -0
- package/dist/src/core/command-class.js.map +1 -0
- package/dist/src/core/coverage-sources/adapter.d.ts +40 -0
- package/dist/src/core/coverage-sources/adapter.js +71 -0
- package/dist/src/core/coverage-sources/adapter.js.map +1 -0
- package/dist/src/core/coverage-sources/gh.d.ts +48 -0
- package/dist/src/core/coverage-sources/gh.js +136 -0
- package/dist/src/core/coverage-sources/gh.js.map +1 -0
- package/dist/src/core/coverage-sources/git.d.ts +101 -0
- package/dist/src/core/coverage-sources/git.js +269 -0
- package/dist/src/core/coverage-sources/git.js.map +1 -0
- package/dist/src/core/coverage.d.ts +217 -0
- package/dist/src/core/coverage.js +337 -0
- package/dist/src/core/coverage.js.map +1 -0
- package/dist/src/core/credential-spec.d.ts +72 -0
- package/dist/src/core/credential-spec.js +23 -0
- package/dist/src/core/credential-spec.js.map +1 -0
- package/dist/src/core/dark-session.d.ts +331 -0
- package/dist/src/core/dark-session.js +714 -0
- package/dist/src/core/dark-session.js.map +1 -0
- package/dist/src/core/decision-refusal.d.ts +185 -0
- package/dist/src/core/decision-refusal.js +265 -0
- package/dist/src/core/decision-refusal.js.map +1 -0
- package/dist/src/core/env-file.d.ts +450 -0
- package/dist/src/core/env-file.js +837 -0
- package/dist/src/core/env-file.js.map +1 -0
- package/dist/src/core/execute.d.ts +858 -0
- package/dist/src/core/execute.js +1271 -0
- package/dist/src/core/execute.js.map +1 -0
- package/dist/src/core/frontmatter.d.ts +78 -0
- package/dist/src/core/frontmatter.js +100 -0
- package/dist/src/core/frontmatter.js.map +1 -0
- package/dist/src/core/gate-window.d.ts +312 -0
- package/dist/src/core/gate-window.js +506 -0
- package/dist/src/core/gate-window.js.map +1 -0
- package/dist/src/core/gate.d.ts +1364 -0
- package/dist/src/core/gate.js +3002 -0
- package/dist/src/core/gate.js.map +1 -0
- package/dist/src/core/git-run.d.ts +73 -0
- package/dist/src/core/git-run.js +93 -0
- package/dist/src/core/git-run.js.map +1 -0
- package/dist/src/core/harness-version.d.ts +157 -0
- package/dist/src/core/harness-version.js +211 -0
- package/dist/src/core/harness-version.js.map +1 -0
- package/dist/src/core/harness-wait.d.ts +55 -0
- package/dist/src/core/harness-wait.js +58 -0
- package/dist/src/core/harness-wait.js.map +1 -0
- package/dist/src/core/head-retry.d.ts +107 -0
- package/dist/src/core/head-retry.js +121 -0
- package/dist/src/core/head-retry.js.map +1 -0
- package/dist/src/core/instance.d.ts +253 -0
- package/dist/src/core/instance.js +319 -0
- package/dist/src/core/instance.js.map +1 -0
- package/dist/src/core/intake-limits.d.ts +247 -0
- package/dist/src/core/intake-limits.js +350 -0
- package/dist/src/core/intake-limits.js.map +1 -0
- package/dist/src/core/jcs.d.ts +52 -0
- package/dist/src/core/jcs.js +132 -0
- package/dist/src/core/jcs.js.map +1 -0
- package/dist/src/core/journal.d.ts +144 -0
- package/dist/src/core/journal.js +200 -0
- package/dist/src/core/journal.js.map +1 -0
- package/dist/src/core/live-draw.d.ts +436 -0
- package/dist/src/core/live-draw.js +703 -0
- package/dist/src/core/live-draw.js.map +1 -0
- package/dist/src/core/log-reconcile.d.ts +89 -0
- package/dist/src/core/log-reconcile.js +136 -0
- package/dist/src/core/log-reconcile.js.map +1 -0
- package/dist/src/core/log-subscribe.d.ts +36 -0
- package/dist/src/core/log-subscribe.js +162 -0
- package/dist/src/core/log-subscribe.js.map +1 -0
- package/dist/src/core/log.d.ts +278 -0
- package/dist/src/core/log.js +546 -0
- package/dist/src/core/log.js.map +1 -0
- package/dist/src/core/loop.d.ts +274 -0
- package/dist/src/core/loop.js +487 -0
- package/dist/src/core/loop.js.map +1 -0
- package/dist/src/core/md-fence.d.ts +41 -0
- package/dist/src/core/md-fence.js +74 -0
- package/dist/src/core/md-fence.js.map +1 -0
- package/dist/src/core/money.d.ts +147 -0
- package/dist/src/core/money.js +195 -0
- package/dist/src/core/money.js.map +1 -0
- package/dist/src/core/payload-census.d.ts +74 -0
- package/dist/src/core/payload-census.js +146 -0
- package/dist/src/core/payload-census.js.map +1 -0
- package/dist/src/core/payload-store.d.ts +175 -0
- package/dist/src/core/payload-store.js +340 -0
- package/dist/src/core/payload-store.js.map +1 -0
- package/dist/src/core/payload.d.ts +71 -0
- package/dist/src/core/payload.js +80 -0
- package/dist/src/core/payload.js.map +1 -0
- package/dist/src/core/policy-diff.d.ts +292 -0
- package/dist/src/core/policy-diff.js +588 -0
- package/dist/src/core/policy-diff.js.map +1 -0
- package/dist/src/core/policy-expectations.d.ts +199 -0
- package/dist/src/core/policy-expectations.js +394 -0
- package/dist/src/core/policy-expectations.js.map +1 -0
- package/dist/src/core/policy-explain.d.ts +150 -0
- package/dist/src/core/policy-explain.js +258 -0
- package/dist/src/core/policy-explain.js.map +1 -0
- package/dist/src/core/policy-load.d.ts +527 -0
- package/dist/src/core/policy-load.js +536 -0
- package/dist/src/core/policy-load.js.map +1 -0
- package/dist/src/core/policy-match.d.ts +281 -0
- package/dist/src/core/policy-match.js +478 -0
- package/dist/src/core/policy-match.js.map +1 -0
- package/dist/src/core/policy-proposal.d.ts +265 -0
- package/dist/src/core/policy-proposal.js +458 -0
- package/dist/src/core/policy-proposal.js.map +1 -0
- package/dist/src/core/prompt-layout.d.ts +221 -0
- package/dist/src/core/prompt-layout.js +422 -0
- package/dist/src/core/prompt-layout.js.map +1 -0
- package/dist/src/core/protected-path-guard.d.ts +453 -0
- package/dist/src/core/protected-path-guard.js +1566 -0
- package/dist/src/core/protected-path-guard.js.map +1 -0
- package/dist/src/core/registration.d.ts +25 -0
- package/dist/src/core/registration.js +39 -0
- package/dist/src/core/registration.js.map +1 -0
- package/dist/src/core/reindex.d.ts +99 -0
- package/dist/src/core/reindex.js +336 -0
- package/dist/src/core/reindex.js.map +1 -0
- package/dist/src/core/sampler.d.ts +313 -0
- package/dist/src/core/sampler.js +388 -0
- package/dist/src/core/sampler.js.map +1 -0
- package/dist/src/core/sandbox.d.ts +290 -0
- package/dist/src/core/sandbox.js +424 -0
- package/dist/src/core/sandbox.js.map +1 -0
- package/dist/src/core/seal.d.ts +165 -0
- package/dist/src/core/seal.js +290 -0
- package/dist/src/core/seal.js.map +1 -0
- package/dist/src/core/state.d.ts +505 -0
- package/dist/src/core/state.js +1009 -0
- package/dist/src/core/state.js.map +1 -0
- package/dist/src/core/task-file.d.ts +185 -0
- package/dist/src/core/task-file.js +464 -0
- package/dist/src/core/task-file.js.map +1 -0
- package/dist/src/core/telegram-config.d.ts +93 -0
- package/dist/src/core/telegram-config.js +114 -0
- package/dist/src/core/telegram-config.js.map +1 -0
- package/dist/src/core/token.d.ts +409 -0
- package/dist/src/core/token.js +561 -0
- package/dist/src/core/token.js.map +1 -0
- package/dist/src/core/validate.d.ts +138 -0
- package/dist/src/core/validate.js +0 -0
- package/dist/src/core/validate.js.map +1 -0
- package/dist/src/core/values.d.ts +137 -0
- package/dist/src/core/values.js +153 -0
- package/dist/src/core/values.js.map +1 -0
- package/dist/src/core/vault.d.ts +291 -0
- package/dist/src/core/vault.js +612 -0
- package/dist/src/core/vault.js.map +1 -0
- package/dist/src/core/verified-snapshot.d.ts +204 -0
- package/dist/src/core/verified-snapshot.js +506 -0
- package/dist/src/core/verified-snapshot.js.map +1 -0
- package/dist/src/core/verify.d.ts +336 -0
- package/dist/src/core/verify.js +549 -0
- package/dist/src/core/verify.js.map +1 -0
- package/dist/src/core/version.d.ts +8 -0
- package/dist/src/core/version.js +9 -0
- package/dist/src/core/version.js.map +1 -0
- package/dist/src/core/wysiwys.d.ts +370 -0
- package/dist/src/core/wysiwys.js +728 -0
- package/dist/src/core/wysiwys.js.map +1 -0
- package/dist/src/daemon/advance-child.d.ts +39 -0
- package/dist/src/daemon/advance-child.js +78 -0
- package/dist/src/daemon/advance-child.js.map +1 -0
- package/dist/src/daemon/advance.d.ts +466 -0
- package/dist/src/daemon/advance.js +849 -0
- package/dist/src/daemon/advance.js.map +1 -0
- package/dist/src/daemon/audit.d.ts +87 -0
- package/dist/src/daemon/audit.js +90 -0
- package/dist/src/daemon/audit.js.map +1 -0
- package/dist/src/daemon/daemon.d.ts +1180 -0
- package/dist/src/daemon/daemon.js +1988 -0
- package/dist/src/daemon/daemon.js.map +1 -0
- package/dist/src/daemon/dark-session.d.ts +64 -0
- package/dist/src/daemon/dark-session.js +119 -0
- package/dist/src/daemon/dark-session.js.map +1 -0
- package/dist/src/daemon/draw-child.d.ts +36 -0
- package/dist/src/daemon/draw-child.js +132 -0
- package/dist/src/daemon/draw-child.js.map +1 -0
- package/dist/src/daemon/draw.d.ts +154 -0
- package/dist/src/daemon/draw.js +458 -0
- package/dist/src/daemon/draw.js.map +1 -0
- package/dist/src/daemon/git-evidence.d.ts +173 -0
- package/dist/src/daemon/git-evidence.js +345 -0
- package/dist/src/daemon/git-evidence.js.map +1 -0
- package/dist/src/daemon/projection.d.ts +180 -0
- package/dist/src/daemon/projection.js +233 -0
- package/dist/src/daemon/projection.js.map +1 -0
- package/dist/src/daemon/prune.d.ts +207 -0
- package/dist/src/daemon/prune.js +376 -0
- package/dist/src/daemon/prune.js.map +1 -0
- package/dist/src/mcp/http.d.ts +113 -0
- package/dist/src/mcp/http.js +343 -0
- package/dist/src/mcp/http.js.map +1 -0
- package/dist/src/mcp/server.d.ts +265 -0
- package/dist/src/mcp/server.js +602 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/docs/adapter-api.md +106 -0
- package/docs/cli-reference.md +5716 -0
- package/docs/codex-enforced-session.md +30 -0
- package/package.json +53 -4
- package/schema/.gitkeep +0 -0
- package/schema/LICENSE +117 -0
- package/schema/codex-instance.schema.json +82 -0
- package/schema/envelope.schema.json +137 -0
- package/schema/event.schema.json +1811 -0
- package/schema/fixtures/codex-instance/invalid/unpinned-codex-version.json +40 -0
- package/schema/fixtures/codex-instance/valid/canonical.json +40 -0
- package/schema/fixtures/envelope/invalid/action-missing-idempotency-key.json +15 -0
- package/schema/fixtures/envelope/invalid/action-unknown-class-format.json +14 -0
- package/schema/fixtures/envelope/invalid/confidence-out-of-range.json +11 -0
- package/schema/fixtures/envelope/invalid/est-cost-bare-number.json +14 -0
- package/schema/fixtures/envelope/invalid/est-cost-noncanonical-string.json +14 -0
- package/schema/fixtures/envelope/invalid/malformed-assignee.json +10 -0
- package/schema/fixtures/envelope/invalid/malformed-created-by.json +7 -0
- package/schema/fixtures/envelope/invalid/malformed-max-latency.json +11 -0
- package/schema/fixtures/envelope/invalid/malformed-payload-hash.json +14 -0
- package/schema/fixtures/envelope/invalid/max-cost-bare-number.json +11 -0
- package/schema/fixtures/envelope/invalid/missing-origin.json +3 -0
- package/schema/fixtures/envelope/invalid/negative-est-cost.json +14 -0
- package/schema/fixtures/envelope/invalid/unknown-state.json +7 -0
- package/schema/fixtures/envelope/invalid/unknown-top-level-field.json +8 -0
- package/schema/fixtures/envelope/valid/action-payload-hash.json +17 -0
- package/schema/fixtures/envelope/valid/actions-without-budget.json +18 -0
- package/schema/fixtures/envelope/valid/canonical.json +25 -0
- package/schema/fixtures/envelope/valid/minimal.json +7 -0
- package/schema/fixtures/envelope/valid/multi-action-executed.json +30 -0
- package/schema/fixtures/envelope/valid/record-write-stage.json +22 -0
- package/schema/fixtures/event/invalid/approval-granted-agent-actor.json +15 -0
- package/schema/fixtures/event/invalid/approval-granted-empty-batch-delivery-id.json +17 -0
- package/schema/fixtures/event/invalid/approval-granted-fifth-reaction.json +16 -0
- package/schema/fixtures/event/invalid/approval-granted-missing-actor.json +14 -0
- package/schema/fixtures/event/invalid/approval-requested-missing-action-key.json +14 -0
- package/schema/fixtures/event/invalid/approval-withdrawn-agent-policy-drift.json +15 -0
- package/schema/fixtures/event/invalid/approval-withdrawn-missing-reason.json +15 -0
- package/schema/fixtures/event/invalid/approval-withdrawn-system-actor.json +15 -0
- package/schema/fixtures/event/invalid/audit-decision-refused-human-actor.json +17 -0
- package/schema/fixtures/event/invalid/audit-decision-refused-missing-code.json +16 -0
- package/schema/fixtures/event/invalid/audit-reviewed-agent-actor.json +15 -0
- package/schema/fixtures/event/invalid/audit-reviewed-loved-no-note.json +16 -0
- package/schema/fixtures/event/invalid/audit-reviewed-system-actor.json +15 -0
- package/schema/fixtures/event/invalid/bad-actor-prefix.json +15 -0
- package/schema/fixtures/event/invalid/est-cost-bare-number.json +17 -0
- package/schema/fixtures/event/invalid/execution-completed-fabricated-exit-code.json +16 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-empty-id.json +18 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-extra-field.json +19 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-id-not-string.json +18 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-missing-adapter.json +17 -0
- package/schema/fixtures/event/invalid/execution-failed-open-reported-by.json +16 -0
- package/schema/fixtures/event/invalid/execution-indeterminate-open-reason.json +14 -0
- package/schema/fixtures/event/invalid/execution-reconciled-agent-actor.json +17 -0
- package/schema/fixtures/event/invalid/execution-started-negative-env-stripped.json +16 -0
- package/schema/fixtures/event/invalid/gate-bypassed-missing-opened-seq.json +15 -0
- package/schema/fixtures/event/invalid/gate-closed-non-integer-opened-seq.json +13 -0
- package/schema/fixtures/event/invalid/gate-opened-agent-actor.json +16 -0
- package/schema/fixtures/event/invalid/gate-organ-attested-absolute-path.json +14 -0
- package/schema/fixtures/event/invalid/gate-organ-attested-agent-actor.json +14 -0
- package/schema/fixtures/event/invalid/gate-organ-attested-missing-organ-path.json +13 -0
- package/schema/fixtures/event/invalid/harness-unknown-kind.json +18 -0
- package/schema/fixtures/event/invalid/harness-version-multiline.json +16 -0
- package/schema/fixtures/event/invalid/log-checkpoint-agent-actor.json +17 -0
- package/schema/fixtures/event/invalid/log-checkpoint-missing-signature.json +16 -0
- package/schema/fixtures/event/invalid/log-checkpoint-short-signed-hash.json +17 -0
- package/schema/fixtures/event/invalid/log-checkpoint-unknown-signature-alg.json +17 -0
- package/schema/fixtures/event/invalid/malformed-ts.json +15 -0
- package/schema/fixtures/event/invalid/missing-alg.json +14 -0
- package/schema/fixtures/event/invalid/missing-hash.json +14 -0
- package/schema/fixtures/event/invalid/non-integer-seq.json +15 -0
- package/schema/fixtures/event/invalid/payload-pruned-human-actor.json +14 -0
- package/schema/fixtures/event/invalid/payload-pruned-missing-hash.json +14 -0
- package/schema/fixtures/event/invalid/policy-declined-agent-actor.json +15 -0
- package/schema/fixtures/event/invalid/policy-proposed-missing-diff.json +19 -0
- package/schema/fixtures/event/invalid/policy-proposed-system-actor.json +26 -0
- package/schema/fixtures/event/invalid/short-hash.json +15 -0
- package/schema/fixtures/event/invalid/unknown-alg.json +15 -0
- package/schema/fixtures/event/invalid/unknown-event-type.json +15 -0
- package/schema/fixtures/event/invalid/unknown-top-level-field.json +16 -0
- package/schema/fixtures/event/valid/approval-expired.json +15 -0
- package/schema/fixtures/event/valid/approval-granted-batch.json +19 -0
- package/schema/fixtures/event/valid/approval-granted-reaction.json +16 -0
- package/schema/fixtures/event/valid/approval-granted.json +15 -0
- package/schema/fixtures/event/valid/approval-rejected.json +15 -0
- package/schema/fixtures/event/valid/approval-requested.json +19 -0
- package/schema/fixtures/event/valid/approval-revoked.json +15 -0
- package/schema/fixtures/event/valid/approval-withdrawn-policy-drift.json +17 -0
- package/schema/fixtures/event/valid/approval-withdrawn.json +16 -0
- package/schema/fixtures/event/valid/audit-decision-refused.json +20 -0
- package/schema/fixtures/event/valid/audit-reviewed-reaction.json +17 -0
- package/schema/fixtures/event/valid/audit-reviewed.json +15 -0
- package/schema/fixtures/event/valid/audit-sampled.json +14 -0
- package/schema/fixtures/event/valid/budget-exceeded.json +21 -0
- package/schema/fixtures/event/valid/envelope-drift.json +16 -0
- package/schema/fixtures/event/valid/execution-completed-harness-report.json +16 -0
- package/schema/fixtures/event/valid/execution-completed-provider-ref.json +18 -0
- package/schema/fixtures/event/valid/execution-completed.json +15 -0
- package/schema/fixtures/event/valid/execution-failed-harness-report.json +16 -0
- package/schema/fixtures/event/valid/execution-failed.json +15 -0
- package/schema/fixtures/event/valid/execution-indeterminate.json +15 -0
- package/schema/fixtures/event/valid/execution-reconciled.json +17 -0
- package/schema/fixtures/event/valid/execution-started-env-stripped.json +17 -0
- package/schema/fixtures/event/valid/execution-started.json +14 -0
- package/schema/fixtures/event/valid/gate-bypassed-harness-version.json +18 -0
- package/schema/fixtures/event/valid/gate-bypassed.json +19 -0
- package/schema/fixtures/event/valid/gate-closed.json +14 -0
- package/schema/fixtures/event/valid/gate-opened.json +16 -0
- package/schema/fixtures/event/valid/gate-organ-attested.json +14 -0
- package/schema/fixtures/event/valid/genesis-null-prev.json +14 -0
- package/schema/fixtures/event/valid/log-checkpoint.json +17 -0
- package/schema/fixtures/event/valid/payload-pruned-orphan.json +13 -0
- package/schema/fixtures/event/valid/payload-pruned.json +17 -0
- package/schema/fixtures/event/valid/policy-declined.json +16 -0
- package/schema/fixtures/event/valid/policy-proposed.json +35 -0
- package/schema/fixtures/event/valid/policy-updated.json +14 -0
- package/schema/fixtures/event/valid/reconciliation-required.json +18 -0
- package/schema/fixtures/event/valid/reconciliation-satisfied.json +17 -0
- package/schema/fixtures/event/valid/route-accepted.json +15 -0
- package/schema/fixtures/event/valid/route-proposed.json +16 -0
- package/schema/fixtures/event/valid/spec-example.json +15 -0
- package/schema/fixtures/event/valid/task-registered-harness-version.json +23 -0
- package/schema/fixtures/event/valid/task-registered.json +14 -0
- package/schema/fixtures/hash/known-answer-pre-121.json +74 -0
- package/schema/fixtures/hash/known-answer.json +74 -0
- package/schema/fixtures/policy/invalid/bad-approval-ttl.json +7 -0
- package/schema/fixtures/policy/invalid/bad-web-port.json +4 -0
- package/schema/fixtures/policy/invalid/checkpoint-key-not-base64.json +6 -0
- package/schema/fixtures/policy/invalid/class-rule-missing-autonomy.json +9 -0
- package/schema/fixtures/policy/invalid/empty-class-key.json +6 -0
- package/schema/fixtures/policy/invalid/live-rate-on-human-only.json +7 -0
- package/schema/fixtures/policy/invalid/malformed-class-key.json +6 -0
- package/schema/fixtures/policy/invalid/missing-version.json +8 -0
- package/schema/fixtures/policy/invalid/negative-limit.json +9 -0
- package/schema/fixtures/policy/invalid/non-numeric-limit.json +9 -0
- package/schema/fixtures/policy/invalid/non-positive-max-pending.json +9 -0
- package/schema/fixtures/policy/invalid/on-expiry-grant.json +8 -0
- package/schema/fixtures/policy/invalid/payload-retention-bare-number.json +4 -0
- package/schema/fixtures/policy/invalid/payload-retention-compound.json +4 -0
- package/schema/fixtures/policy/invalid/payload-retention-fractional.json +4 -0
- package/schema/fixtures/policy/invalid/payload-retention-zero.json +4 -0
- package/schema/fixtures/policy/invalid/protected-paths-escape.json +4 -0
- package/schema/fixtures/policy/invalid/protected-paths-glob.json +4 -0
- package/schema/fixtures/policy/invalid/retro-rate-on-human-only.json +7 -0
- package/schema/fixtures/policy/invalid/retro-rate-on-manual.json +7 -0
- package/schema/fixtures/policy/invalid/retro-rate-zero.json +7 -0
- package/schema/fixtures/policy/invalid/sample-rate-too-high.json +5 -0
- package/schema/fixtures/policy/invalid/sampling-secret-env-empty.json +7 -0
- package/schema/fixtures/policy/invalid/sampling-secret-env-not-string.json +6 -0
- package/schema/fixtures/policy/invalid/skew-tolerance-compound.json +6 -0
- package/schema/fixtures/policy/invalid/unknown-autonomy.json +7 -0
- package/schema/fixtures/policy/invalid/unknown-class-rule-key.json +6 -0
- package/schema/fixtures/policy/invalid/unknown-top-level-key.json +7 -0
- package/schema/fixtures/policy/invalid/vault-passphrase-env-empty.json +6 -0
- package/schema/fixtures/policy/invalid/vault-passphrase-literal.json +6 -0
- package/schema/fixtures/policy/invalid/version-not-string.json +4 -0
- package/schema/fixtures/policy/valid/canonical.json +47 -0
- package/schema/fixtures/policy/valid/checkpoint-keys.json +18 -0
- package/schema/fixtures/policy/valid/class-approvers-limits.json +25 -0
- package/schema/fixtures/policy/valid/class-retro-rate.json +17 -0
- package/schema/fixtures/policy/valid/global-budgets.json +19 -0
- package/schema/fixtures/policy/valid/human-only.json +9 -0
- package/schema/fixtures/policy/valid/minimal.json +6 -0
- package/schema/fixtures/policy/valid/protected-paths.json +10 -0
- package/schema/fixtures/policy/valid/record-namespace.json +13 -0
- package/schema/fixtures/policy/valid/request-volume-limits.json +26 -0
- package/schema/fixtures/policy/valid/retention-and-sampling-secret.json +16 -0
- package/schema/fixtures/policy/valid/skew-tolerance.json +15 -0
- package/schema/fixtures/policy/valid/vault-passphrase-env.json +14 -0
- package/schema/fixtures/policy/valid/wildcards.json +15 -0
- package/schema/fixtures/policy-md/invalid/alias-bomb.md +15 -0
- package/schema/fixtures/policy-md/invalid/no-fence.md +7 -0
- package/schema/fixtures/policy-md/invalid/protected-route-not-a-subclass.md +16 -0
- package/schema/fixtures/policy-md/invalid/schema-invalid-autonomy.md +16 -0
- package/schema/fixtures/policy-md/invalid/schema-invalid-read-proof.md +17 -0
- package/schema/fixtures/policy-md/invalid/two-fences.md +19 -0
- package/schema/fixtures/policy-md/invalid/unclosed-fence.md +11 -0
- package/schema/fixtures/policy-md/invalid/wrong-info-string.md +11 -0
- package/schema/fixtures/policy-md/invalid/yaml-syntax-error.md +13 -0
- package/schema/fixtures/policy-md/precedence/both/APPROVAL.md +7 -0
- package/schema/fixtures/policy-md/precedence/both/APPROVALS.md +7 -0
- package/schema/fixtures/policy-md/precedence/fallback-only/APPROVALS.md +7 -0
- package/schema/fixtures/policy-md/valid/canonical.md +50 -0
- package/schema/fixtures/policy-md/valid/daemon-read-proof.md +18 -0
- package/schema/fixtures/policy-md/valid/minimal.md +3 -0
- package/schema/fixtures/policy-md/valid/prose-lookalikes.md +54 -0
- package/schema/fixtures/policy-md/valid/routed-protected-paths.md +49 -0
- package/schema/fixtures/policy-md/valid/with-values.md +79 -0
- package/schema/fixtures/sample-record/invalid/bad-date-time.json +4 -0
- package/schema/fixtures/sample-record/invalid/missing-required-field.json +3 -0
- package/schema/fixtures/sample-record/invalid/unknown-top-level-field.json +5 -0
- package/schema/fixtures/sample-record/invalid/wrong-type.json +4 -0
- package/schema/fixtures/sample-record/valid/minimal.json +4 -0
- package/schema/fixtures/sample-record/valid/with-note.json +5 -0
- package/schema/fixtures/values/invalid/class-shaped.json +9 -0
- package/schema/fixtures/values/invalid/duplicate-entry.json +4 -0
- package/schema/fixtures/values/invalid/non-string-item.json +4 -0
- package/schema/fixtures/values/invalid/over-cap.json +26 -0
- package/schema/fixtures/values/invalid/unknown-key.json +5 -0
- package/schema/fixtures/values/invalid/version-string.json +1 -0
- package/schema/fixtures/values/valid/empty-lists.json +7 -0
- package/schema/fixtures/values/valid/full.json +20 -0
- package/schema/fixtures/values/valid/minimal.json +1 -0
- package/schema/fixtures/values-md/invalid/schema-invalid.md +62 -0
- package/schema/fixtures/values-md/invalid/two-blocks.md +69 -0
- package/schema/fixtures/values-md/invalid/unterminated.md +61 -0
- package/schema/fixtures/values-md/invalid/yaml-error.md +63 -0
- package/schema/fixtures/values-md/valid/absent.md +50 -0
- package/schema/fixtures/values-md/valid/with-values.md +79 -0
- package/schema/policy.schema.json +501 -0
- package/schema/sample-record.schema.json +26 -0
- package/schema/values.schema.json +55 -0
- package/templates/codex/README.md +9 -0
|
@@ -0,0 +1,509 @@
|
|
|
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 { probeZzz, ZZZ_CREDENTIAL_SPECS, ZZZ_TOKEN_NAME, } from "../adapters/zzz.js";
|
|
75
|
+
import { vaultCredentialProvider } from "../adapters/vault-provider.js";
|
|
76
|
+
import { isSmtpSecurity, probeSmtp } from "../adapters/smtp.js";
|
|
77
|
+
import { EXIT_OK } from "./exit-codes.js";
|
|
78
|
+
import { SETUP_ADAPTER_AGENTMAIL_HELP, SETUP_ADAPTER_EMAIL_HELP, SETUP_ADAPTER_HELP, SETUP_ADAPTER_ZZZ_HELP, } from "./help.js";
|
|
79
|
+
import { refusal as renderRefusal, style } from "./style.js";
|
|
80
|
+
import { confirmUntil } from "./prompt.js";
|
|
81
|
+
import { front, requireHuman, usageError, } from "./setup-common.js";
|
|
82
|
+
import { runCredentialFlow, vaultDestination, } from "./setup-flow.js";
|
|
83
|
+
/** The keystore read form for this machine, defaulting to the macOS one. */
|
|
84
|
+
function readBackCommand(kind, item) {
|
|
85
|
+
return kind === "secret-service"
|
|
86
|
+
? `secret-tool lookup approval ${item}`
|
|
87
|
+
: `security find-generic-password -a "$USER" -s ${item} -w`;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The scripted path, GENERATED FROM THE MANIFEST rather than written out.
|
|
91
|
+
*
|
|
92
|
+
* A hand-written hint is a list of five commands that has to be edited every
|
|
93
|
+
* time the manifest changes and will not be. Generating it means the refusal an
|
|
94
|
+
* operator copies is, by construction, the set of names the adapter actually
|
|
95
|
+
* reads.
|
|
96
|
+
*
|
|
97
|
+
* The secret's line takes its value from the keystore's own reader, so the
|
|
98
|
+
* password is never an argument on any line printed here — the rule the rest of
|
|
99
|
+
* `setup` follows, applied to a verb whose whole subject is credentials.
|
|
100
|
+
*/
|
|
101
|
+
function manifestHint(specs, context) {
|
|
102
|
+
const lines = [
|
|
103
|
+
` # 1. establish the vault passphrase in ${context.passphraseEnv} and put it in this`,
|
|
104
|
+
` # shell. Every line below reads it from the environment and nowhere else:`,
|
|
105
|
+
` approval setup vault --as human:<id>`,
|
|
106
|
+
` eval "$(approval env)"`,
|
|
107
|
+
``,
|
|
108
|
+
` # 2. store each credential. The VALUE is never a command-line argument:`,
|
|
109
|
+
` # --value-env names a variable, and the variable is set for that one call.`,
|
|
110
|
+
];
|
|
111
|
+
for (const spec of specs) {
|
|
112
|
+
const call = `approval vault set ${spec.name} --value-env V --as human:<id>`;
|
|
113
|
+
if (spec.kind === "secret") {
|
|
114
|
+
lines.push(` V="$(${readBackCommand(context.kind, "<your-item>")})" \\`, ` ${call}`);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
const placeholder = spec.default ?? `<${spec.label.replace(/\s+/gu, "-")}>`;
|
|
118
|
+
lines.push(` V='${placeholder}' ${call}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return lines.join("\n");
|
|
122
|
+
}
|
|
123
|
+
/** Replace every occurrence of each secret. Nothing leaves this file with one. */
|
|
124
|
+
function redactor(secrets) {
|
|
125
|
+
const present = secrets.filter((secret) => secret.length > 0);
|
|
126
|
+
return (text) => {
|
|
127
|
+
let out = text;
|
|
128
|
+
for (const secret of present)
|
|
129
|
+
out = out.split(secret).join("<redacted>");
|
|
130
|
+
return out;
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/** Today's refusal for a partial run, kept verbatim as the fallback (APRV-99). */
|
|
134
|
+
function partialRefusal(skipped) {
|
|
135
|
+
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`;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The session itself, and the two sentences it can end with.
|
|
139
|
+
*
|
|
140
|
+
* Shared by the first-run path and the stored-configuration path (APRV-99) so
|
|
141
|
+
* that a probe reports the same way whichever set it ran over: an operator
|
|
142
|
+
* rotating an app password is owed the proof they get on day one, in the words
|
|
143
|
+
* they got it in. `undo` is the list of names this run stored, because the undo
|
|
144
|
+
* for a failed probe is removing what was just written and nothing else.
|
|
145
|
+
*/
|
|
146
|
+
async function probeAndReport(config, scrub, probe, undo) {
|
|
147
|
+
const result = await probe({
|
|
148
|
+
host: config.host,
|
|
149
|
+
port: config.port,
|
|
150
|
+
security: config.security,
|
|
151
|
+
...(config.user === undefined ? {} : { user: config.user }),
|
|
152
|
+
...(config.password === undefined ? {} : { password: config.password }),
|
|
153
|
+
tlsRejectUnauthorized: true,
|
|
154
|
+
redact: scrub,
|
|
155
|
+
});
|
|
156
|
+
if (result.ok) {
|
|
157
|
+
return {
|
|
158
|
+
ok: true,
|
|
159
|
+
detail: `\nverified: ${config.host}:${String(config.port)} answered over ${config.security}, ${result.authenticated === null
|
|
160
|
+
? "with no login (neither a user nor a password is stored)"
|
|
161
|
+
: `and accepted the credential over AUTH ${result.authenticated}`}.\nNo message was sent: the session ran to AUTH and then QUIT.\n`,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
const lines = undo.map((name) => ` approval vault remove ${name} --as human:<id>`).join("\n");
|
|
165
|
+
return {
|
|
166
|
+
ok: false,
|
|
167
|
+
// APRV-102: the one refusal shape, here too. A probe failure is the last
|
|
168
|
+
// thing this verb prints before the operator decides what to fix.
|
|
169
|
+
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`,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* The partial re-run: offer to probe the configuration IN THE VAULT (APRV-99).
|
|
174
|
+
*
|
|
175
|
+
* This verb used to stop here, on the argument that it did not hold the whole
|
|
176
|
+
* configuration and that reading the rest back is the thing there is no verb
|
|
177
|
+
* for. The first half is true and the second half was the wrong inference.
|
|
178
|
+
* There is no verb that PRINTS a credential, and there still is not; but the
|
|
179
|
+
* email adapter reads all five out of the vault on every send, through
|
|
180
|
+
* {@link readEmailSmtpConfig} over a {@link vaultCredentialProvider}, and this
|
|
181
|
+
* function does exactly that and nothing more. The values are read into this
|
|
182
|
+
* process, handed to the same SMTP session `sendMail` opens, and dropped. No
|
|
183
|
+
* count, no prefix, no length, no value reaches a stream — the suite sweeps
|
|
184
|
+
* every captured byte for the fixture secrets on this path too. A probe that is
|
|
185
|
+
* no wider than the send it is proving does not widen the exposure; rotating an
|
|
186
|
+
* app password is the common case for this verb and it deserves the proof.
|
|
187
|
+
*
|
|
188
|
+
* When the vault will not open, or what it holds is not usable configuration,
|
|
189
|
+
* the answer is today's refusal verbatim plus one line naming why the probe
|
|
190
|
+
* could not run. The provider's sentences name the variable, the path and the
|
|
191
|
+
* credential NAME, never a value, and they are scrubbed with this run's own
|
|
192
|
+
* values before they are printed anyway.
|
|
193
|
+
*/
|
|
194
|
+
async function verifyStored(values, context) {
|
|
195
|
+
const refusal = partialRefusal(context.skipped);
|
|
196
|
+
const scrub = redactor(Object.values(values));
|
|
197
|
+
if (!confirmUntil(context.streams, context.prompter, `open an SMTP session using the stored configuration to check it?`, true)) {
|
|
198
|
+
return { ok: true, declined: true, detail: refusal };
|
|
199
|
+
}
|
|
200
|
+
const configured = readEmailSmtpConfig(context.credentials, DEFAULT_CREDENTIAL_NAMES);
|
|
201
|
+
if (!configured.ok) {
|
|
202
|
+
return {
|
|
203
|
+
ok: true,
|
|
204
|
+
declined: true,
|
|
205
|
+
detail: `${refusal}\nthe probe could not run: ${scrub(configured.message)}\n`,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
return probeAndReport(configured.config, redactor([...Object.values(values), ...configured.secrets]), context.probe, context.written);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* The email adapter's verification: one SMTP session that sends nothing.
|
|
212
|
+
*
|
|
213
|
+
* A run that collected the whole picture probes what it collected. A partial
|
|
214
|
+
* re-run hands off to {@link verifyStored}, which offers to probe what is in
|
|
215
|
+
* the vault, read the way the adapter reads it.
|
|
216
|
+
*/
|
|
217
|
+
async function verifyEmail(values, context) {
|
|
218
|
+
const names = DEFAULT_CREDENTIAL_NAMES;
|
|
219
|
+
if (context.skipped.length > 0)
|
|
220
|
+
return verifyStored(values, context);
|
|
221
|
+
const host = values[names.host];
|
|
222
|
+
const port = Number(values[names.port]);
|
|
223
|
+
const security = values[names.security];
|
|
224
|
+
if (host === undefined || !Number.isInteger(port) || !isSmtpSecurity(security)) {
|
|
225
|
+
return {
|
|
226
|
+
ok: true,
|
|
227
|
+
declined: true,
|
|
228
|
+
detail: `\nnot verified: the run did not collect ${names.host}, ${names.port} and ${names.security}\n`,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
const user = values[names.user];
|
|
232
|
+
const password = values[names.password];
|
|
233
|
+
const scrub = redactor([user ?? "", password ?? ""]);
|
|
234
|
+
if (!context.prompter.confirm(`open an SMTP session to ${host}:${String(port)} to check it? Nothing is sent`, false)) {
|
|
235
|
+
return {
|
|
236
|
+
ok: true,
|
|
237
|
+
declined: true,
|
|
238
|
+
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`,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
return probeAndReport({
|
|
242
|
+
host,
|
|
243
|
+
port,
|
|
244
|
+
security: security,
|
|
245
|
+
...(user === undefined ? {} : { user }),
|
|
246
|
+
...(password === undefined ? {} : { password }),
|
|
247
|
+
}, scrub, context.probe, [names.host, names.port, names.security, names.user, names.password].filter((name) => values[name] !== undefined));
|
|
248
|
+
}
|
|
249
|
+
// ---------------------------------------------------------------------------
|
|
250
|
+
// agentmail (APRV-223)
|
|
251
|
+
// ---------------------------------------------------------------------------
|
|
252
|
+
/**
|
|
253
|
+
* What the probe can say about the stored key's own permissions.
|
|
254
|
+
*
|
|
255
|
+
* Three answers and not two, because "not disclosed" is not "none". AgentMail
|
|
256
|
+
* keys carry `draft_send` and `message_send` as separate booleans and the whole
|
|
257
|
+
* deployment this adapter assumes rests on the vault's key holding both while
|
|
258
|
+
* the agent's key holds neither. The inbox read this probe already makes is the
|
|
259
|
+
* only call it will make: probing a second endpoint nobody has confirmed exists
|
|
260
|
+
* would turn its 404 into a permissions verdict, which is a worse answer than
|
|
261
|
+
* saying plainly that the check could not be made. So a run that learns nothing
|
|
262
|
+
* prints the reminder, and only a disclosure names a missing permission.
|
|
263
|
+
*/
|
|
264
|
+
function permissionsLine(disclosed) {
|
|
265
|
+
if (disclosed === null) {
|
|
266
|
+
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.`;
|
|
267
|
+
}
|
|
268
|
+
const missing = AGENTMAIL_SEND_PERMISSIONS.filter((name) => !disclosed.includes(name));
|
|
269
|
+
if (missing.length === 0) {
|
|
270
|
+
return `The key carries ${AGENTMAIL_SEND_PERMISSIONS.join(" and ")}, which is what a granted send spends.`;
|
|
271
|
+
}
|
|
272
|
+
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.`;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* The AgentMail proof: `GET /v0/inboxes/{inbox_id}`, and nothing else.
|
|
276
|
+
*
|
|
277
|
+
* The same read `act` makes before every direct send, for the same two reasons:
|
|
278
|
+
* it establishes that the key opens this inbox, and it reports the address the
|
|
279
|
+
* inbox sends as, which is the address every approved message will actually
|
|
280
|
+
* come from. It puts no message anywhere.
|
|
281
|
+
*/
|
|
282
|
+
async function probeAgentmailAndReport(config, scrub, probe, apiBase, undo) {
|
|
283
|
+
const result = await probe(config, apiBase === undefined ? {} : { apiBase });
|
|
284
|
+
if (result.ok) {
|
|
285
|
+
return {
|
|
286
|
+
ok: true,
|
|
287
|
+
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`,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
const lines = undo.map((name) => ` approval vault remove ${name} --as human:<id>`).join("\n");
|
|
291
|
+
return {
|
|
292
|
+
ok: false,
|
|
293
|
+
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`,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* `setup adapter agentmail`'s verification.
|
|
298
|
+
*
|
|
299
|
+
* One shape for both runs, unlike the email adapter's: this manifest is two
|
|
300
|
+
* values, so a partial re-run is a rotation of the key with the inbox left
|
|
301
|
+
* alone, and the read that proves it is the same one either way. It goes
|
|
302
|
+
* through {@link readAgentmailConfig} over the vault whenever the run does not
|
|
303
|
+
* hold both values, which is the exact path `approval adapter agentmail` takes
|
|
304
|
+
* at send time and prints nothing.
|
|
305
|
+
*/
|
|
306
|
+
async function verifyAgentmail(values, context) {
|
|
307
|
+
const names = DEFAULT_AGENTMAIL_CREDENTIAL_NAMES;
|
|
308
|
+
const probe = probeAgentmail;
|
|
309
|
+
const scrub = redactor(Object.values(values));
|
|
310
|
+
if (!confirmUntil(context.streams, context.prompter, `read the inbox from AgentMail to check the key? Nothing is sent`, true)) {
|
|
311
|
+
return {
|
|
312
|
+
ok: true,
|
|
313
|
+
declined: true,
|
|
314
|
+
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`,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
const inboxId = values[names.inboxId];
|
|
318
|
+
const apiKey = values[names.apiKey];
|
|
319
|
+
if (inboxId !== undefined && apiKey !== undefined) {
|
|
320
|
+
return probeAgentmailAndReport({ inboxId, apiKey }, scrub, probe, context.apiBase, context.written);
|
|
321
|
+
}
|
|
322
|
+
// A partial re-run: read what the vault holds, the way the adapter reads it.
|
|
323
|
+
const configured = readAgentmailConfig(context.credentials, names);
|
|
324
|
+
if (!configured.ok) {
|
|
325
|
+
return {
|
|
326
|
+
ok: true,
|
|
327
|
+
declined: true,
|
|
328
|
+
detail: `${partialRefusal(context.skipped)}\nthe probe could not run: ${scrub(configured.message)}\n`,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
return probeAgentmailAndReport(configured.config, redactor([...Object.values(values), ...configured.secrets]), probe, context.apiBase, context.written);
|
|
332
|
+
}
|
|
333
|
+
async function verifyZzz(values, context) {
|
|
334
|
+
if (!confirmUntil(context.streams, context.prompter, "ask zzz.bot to authenticate the stored token with one read-only room-list request? Nothing is posted", true)) {
|
|
335
|
+
return { ok: true, declined: true, detail: "\nstored and unverified: no request was made.\n" };
|
|
336
|
+
}
|
|
337
|
+
const current = values[ZZZ_TOKEN_NAME] === undefined
|
|
338
|
+
? context.credentials.get(ZZZ_TOKEN_NAME)
|
|
339
|
+
: { ok: true, value: values[ZZZ_TOKEN_NAME] };
|
|
340
|
+
if (!current.ok)
|
|
341
|
+
return { ok: false, detail: `${renderRefusal(style(), current.code, current.message)}\n` };
|
|
342
|
+
const result = await probeZzz(current.value, context.apiBase === undefined ? {} : { origins: { production: context.apiBase } });
|
|
343
|
+
if (result.ok) {
|
|
344
|
+
return {
|
|
345
|
+
ok: true,
|
|
346
|
+
detail: "\nverified: zzz.bot accepted the token on one read-only room-list request. No message was posted. This does not prove write scope, room membership, or private-room workflow evidence; those are checked by zzz.bot when the approved message is sent.\n",
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
return { ok: false, detail: `${renderRefusal(style(), result.code, result.message)}\nThe value remains stored; replace it or retry the probe after connectivity is restored.\n` };
|
|
350
|
+
}
|
|
351
|
+
/** Every adapter this verb can configure. Keyed by the `adapter <name>` name. */
|
|
352
|
+
export const ADAPTER_SETUPS = {
|
|
353
|
+
email: {
|
|
354
|
+
specs: EMAIL_CREDENTIAL_SPECS,
|
|
355
|
+
check: (values, kept) => checkEmailCredentialSet(values, DEFAULT_CREDENTIAL_NAMES, kept),
|
|
356
|
+
summary: "the SMTP settings `approval adapter email` reads inside the verified execution window",
|
|
357
|
+
help: SETUP_ADAPTER_EMAIL_HELP,
|
|
358
|
+
hint: (context) => manifestHint(EMAIL_CREDENTIAL_SPECS, context),
|
|
359
|
+
verify: verifyEmail,
|
|
360
|
+
nextSteps: [
|
|
361
|
+
`Check the names (never the values) with:`,
|
|
362
|
+
``,
|
|
363
|
+
` approval vault list --as human:<id>`,
|
|
364
|
+
``,
|
|
365
|
+
`The adapter reads them itself, inside the verified execution window; nothing else does.`,
|
|
366
|
+
],
|
|
367
|
+
},
|
|
368
|
+
agentmail: {
|
|
369
|
+
specs: AGENTMAIL_CREDENTIAL_SPECS,
|
|
370
|
+
summary: "the AgentMail inbox and sending key `approval adapter agentmail` reads inside the verified execution window",
|
|
371
|
+
help: SETUP_ADAPTER_AGENTMAIL_HELP,
|
|
372
|
+
hint: (context) => manifestHint(AGENTMAIL_CREDENTIAL_SPECS, context),
|
|
373
|
+
verify: verifyAgentmail,
|
|
374
|
+
nextSteps: [
|
|
375
|
+
`Check the names (never the values) with:`,
|
|
376
|
+
``,
|
|
377
|
+
` approval vault list --as human:<id>`,
|
|
378
|
+
``,
|
|
379
|
+
`The key stored here is the one that CAN send. Give the agent a different key,`,
|
|
380
|
+
`without ${AGENTMAIL_SEND_PERMISSIONS.join(" or ")}, in AGENTMAIL_API_KEY: that key composes`,
|
|
381
|
+
`drafts, and \`approval payload agentmail-draft\` snapshots one for a human to read.`,
|
|
382
|
+
],
|
|
383
|
+
},
|
|
384
|
+
zzz: {
|
|
385
|
+
specs: ZZZ_CREDENTIAL_SPECS,
|
|
386
|
+
summary: "the invited zzz.bot agent token `approval adapter zzz` reads inside the verified execution window",
|
|
387
|
+
help: SETUP_ADAPTER_ZZZ_HELP,
|
|
388
|
+
hint: (context) => manifestHint(ZZZ_CREDENTIAL_SPECS, context),
|
|
389
|
+
verify: verifyZzz,
|
|
390
|
+
nextSteps: [
|
|
391
|
+
`Check the credential name (never its value) with:`,
|
|
392
|
+
``,
|
|
393
|
+
` approval vault list --as human:<id>`,
|
|
394
|
+
``,
|
|
395
|
+
`Keep this write-capable token out of the agent environment. For a private room,`,
|
|
396
|
+
`zzz.bot also requires active membership and accepted approval.md workflow evidence.`,
|
|
397
|
+
],
|
|
398
|
+
},
|
|
399
|
+
};
|
|
400
|
+
/** The known names, sorted, for a usage error and for the help text. */
|
|
401
|
+
export function knownAdapterNames() {
|
|
402
|
+
return Object.keys(ADAPTER_SETUPS).sort();
|
|
403
|
+
}
|
|
404
|
+
// ---------------------------------------------------------------------------
|
|
405
|
+
// The verb
|
|
406
|
+
// ---------------------------------------------------------------------------
|
|
407
|
+
/**
|
|
408
|
+
* The refusal for an unset passphrase.
|
|
409
|
+
*
|
|
410
|
+
* Two shapes, and the difference is a diagnosis: no vault file AND no line for
|
|
411
|
+
* the variable means nobody has ever established one, so the repair starts with
|
|
412
|
+
* `approval setup vault`. Anything else means the passphrase exists and this
|
|
413
|
+
* shell has not evaluated it, so the repair is one line. A verb that printed
|
|
414
|
+
* both every time would train the operator to skim past the one that mattered.
|
|
415
|
+
*/
|
|
416
|
+
function passphraseHint(variable, logPath, envPath) {
|
|
417
|
+
const file = readEnvFile(envPath);
|
|
418
|
+
// Reading the file for a KEY'S PRESENCE, never for a value, and never
|
|
419
|
+
// resolving it: SPEC.md §11.1 invariant 7 forbids the resolution, not the
|
|
420
|
+
// stat. An unreadable file is treated as "no line", which is the fail-closed
|
|
421
|
+
// reading: it produces the longer hint, never the shorter one.
|
|
422
|
+
const hasLine = file.ok && file.entries.some((entry) => entry.key === variable);
|
|
423
|
+
const established = hasLine || vaultExists(vaultPathFor(logPath));
|
|
424
|
+
return established
|
|
425
|
+
? `The passphrase is recorded but not in this shell. Establish it with:\n\n eval "$(approval env)"`
|
|
426
|
+
: `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)"`;
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* `approval setup adapter <name>` — the interactive writer for one adapter's
|
|
430
|
+
* credentials. HUMAN-ONLY.
|
|
431
|
+
*
|
|
432
|
+
* `argv` starts at the adapter's name: `commandSetup` has already eaten
|
|
433
|
+
* `adapter`.
|
|
434
|
+
*/
|
|
435
|
+
export async function commandSetupAdapter(argv, streams, cwd, deps = {}) {
|
|
436
|
+
const json = argv.includes("--json");
|
|
437
|
+
const name = argv[0];
|
|
438
|
+
// The name is resolved BEFORE the terminal check, so that a typo is answered
|
|
439
|
+
// with "here are the adapters" rather than with a lecture about pipes.
|
|
440
|
+
if (name === "--help" || name === "-h" || name === "help") {
|
|
441
|
+
streams.out(`${SETUP_ADAPTER_HELP}\n`);
|
|
442
|
+
return EXIT_OK;
|
|
443
|
+
}
|
|
444
|
+
if (name === undefined || name.startsWith("-")) {
|
|
445
|
+
return usageError(streams, json, `missing <name> for \`approval setup adapter\`; known adapters: ${knownAdapterNames().join(", ")}`, SETUP_ADAPTER_HELP);
|
|
446
|
+
}
|
|
447
|
+
// Own keys only, for the reason `cli/adapter.ts` gives (APRV-223): every
|
|
448
|
+
// string names something on `Object.prototype` before it names an adapter.
|
|
449
|
+
const entry = Object.hasOwn(ADAPTER_SETUPS, name) ? ADAPTER_SETUPS[name] : undefined;
|
|
450
|
+
if (entry === undefined) {
|
|
451
|
+
return usageError(streams, json, `unknown adapter ${JSON.stringify(name)}; known adapters: ${knownAdapterNames().join(", ")}`, SETUP_ADAPTER_HELP);
|
|
452
|
+
}
|
|
453
|
+
// The adapter's own help, from the table entry the name resolved to: the
|
|
454
|
+
// generic SETUP_ADAPTER_HELP is for the errors that happen BEFORE a name
|
|
455
|
+
// resolves, and for nothing after this line.
|
|
456
|
+
const helpText = entry.help;
|
|
457
|
+
const outcome = front(`adapter ${name}`, argv.slice(1), streams, cwd, deps, helpText, (context) => entry.hint(context));
|
|
458
|
+
if (outcome.kind === "handled")
|
|
459
|
+
return outcome.code;
|
|
460
|
+
const context = outcome;
|
|
461
|
+
const extra = context.positionals[0];
|
|
462
|
+
if (extra !== undefined) {
|
|
463
|
+
return usageError(streams, false, `unexpected argument ${JSON.stringify(extra)}`, helpText);
|
|
464
|
+
}
|
|
465
|
+
const human = requireHuman(context.flags, streams, helpText, `adapter ${name}`);
|
|
466
|
+
if (!human.ok)
|
|
467
|
+
return human.code;
|
|
468
|
+
// The passphrase, from the SHELL environment under the policy's name. Never
|
|
469
|
+
// from `.approval/env` directly: §11.1 invariant 7.
|
|
470
|
+
const variable = passphraseEnvFor(context.load);
|
|
471
|
+
const passphrase = passphraseFrom(variable, deps.env ?? process.env);
|
|
472
|
+
if (passphrase === null) {
|
|
473
|
+
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);
|
|
474
|
+
}
|
|
475
|
+
const vaultPath = vaultPathFor(context.logPath);
|
|
476
|
+
const probe = deps.probe ?? probeSmtp;
|
|
477
|
+
// The adapter's own reader over the same vault, for the partial-re-run probe
|
|
478
|
+
// (APRV-99). Built here and not in the hook so that this file keeps the one
|
|
479
|
+
// fact the hook has no business knowing: which file, and under which
|
|
480
|
+
// variable. Lazy, so a first run never opens it.
|
|
481
|
+
const credentials = deps.credentials ??
|
|
482
|
+
vaultCredentialProvider({ vaultPath }, { passphraseEnv: variable, env: deps.env ?? process.env });
|
|
483
|
+
const result = await runCredentialFlow({
|
|
484
|
+
streams,
|
|
485
|
+
prompter: context.prompter,
|
|
486
|
+
specs: entry.specs,
|
|
487
|
+
destination: vaultDestination(vaultPath, passphrase),
|
|
488
|
+
labels: {
|
|
489
|
+
title: `approval setup adapter ${name} — ${entry.summary}.`,
|
|
490
|
+
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.`,
|
|
491
|
+
nextSteps: entry.nextSteps,
|
|
492
|
+
},
|
|
493
|
+
hooks: {
|
|
494
|
+
...(entry.check === undefined ? {} : { check: entry.check }),
|
|
495
|
+
verify: (values, progress) => entry.verify(values, {
|
|
496
|
+
written: progress.written,
|
|
497
|
+
skipped: progress.skipped,
|
|
498
|
+
streams,
|
|
499
|
+
prompter: context.prompter,
|
|
500
|
+
probe,
|
|
501
|
+
...(deps.apiBase === undefined ? {} : { apiBase: deps.apiBase }),
|
|
502
|
+
credentials,
|
|
503
|
+
}),
|
|
504
|
+
},
|
|
505
|
+
});
|
|
506
|
+
// The flow decided the code; this verb adds nothing to it.
|
|
507
|
+
return result.code;
|
|
508
|
+
}
|
|
509
|
+
//# 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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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval setup channel <name>` — configure one channel (APRV-79).
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md §4 draws a line this verb's NAME now carries: a **channel** surfaces
|
|
5
|
+
* requests and collects decisions and holds no state; an **adapter** executes
|
|
6
|
+
* side effects and holds credentials. `approval setup adapter <name>` (APRV-78)
|
|
7
|
+
* fills the VAULT from an adapter's manifest. This verb fills the OS keystore
|
|
8
|
+
* and `.approval/env` from a channel's, because what a channel needs is not a
|
|
9
|
+
* credential an action spends inside a token window: it is the transport
|
|
10
|
+
* credential that lets the runtime ask a human anything at all.
|
|
11
|
+
*
|
|
12
|
+
* An older build spelled the Telegram one without the `channel` noun. That form
|
|
13
|
+
* is gone rather than aliased — the dispatch in `cli/setup.ts` answers it at
|
|
14
|
+
* exit 2 with the new one, in {@link RENAMED_NOTICE} — because two spellings of
|
|
15
|
+
* a distinction the SPEC draws on purpose is exactly how the distinction stops
|
|
16
|
+
* being drawn.
|
|
17
|
+
*
|
|
18
|
+
* ## What Telegram's flow keeps, unchanged
|
|
19
|
+
*
|
|
20
|
+
* The conversation is now `cli/setup-flow.ts`'s, the same one `setup adapter`
|
|
21
|
+
* runs, over the manifest `core/telegram-config.ts` declares. Everything that
|
|
22
|
+
* was a decision rather than a phrasing survives it, and each of these is
|
|
23
|
+
* asserted in `tests/cli-setup.test.ts`:
|
|
24
|
+
*
|
|
25
|
+
* - **`getMe` happens before anything is written.** It runs at the END of the
|
|
26
|
+
* token's collection (step five of the flow), not after the write (step
|
|
27
|
+
* seven), so a token the Bot API refuses costs the operator one line of
|
|
28
|
+
* output and leaves `.approval/env` untouched. The chat discovery below it
|
|
29
|
+
* also needs the bot's username, and asking `getMe` for it is the same call.
|
|
30
|
+
* - **No `getUpdates` from this verb carries an offset, ever.** An offset is an
|
|
31
|
+
* ACKNOWLEDGEMENT: it tells the Bot API that everything below it may be
|
|
32
|
+
* discarded, and a decision tap consumed here would never reach the listener
|
|
33
|
+
* that was waiting for it. `allowed_updates` is `["message"]`, so a pending
|
|
34
|
+
* `callback_query` is not even delivered to this process.
|
|
35
|
+
* - **The token is never typed into this process** on a machine with a
|
|
36
|
+
* keystore: the helper's own no-echo prompt collects it and this runtime
|
|
37
|
+
* learns it by reading the item back on stdout.
|
|
38
|
+
* - **The chat id is a literal.** A chat id is not a secret; the token is.
|
|
39
|
+
* - "send the bot a message", the 409 hint, the manual-curl refusal when nothing
|
|
40
|
+
* arrives, and the optional send-a-test-message proof that defaults to NO.
|
|
41
|
+
* What changed in APRV-96 is only WHEN the read happens: the verb long-polls
|
|
42
|
+
* continuously until a message arrives or {@link DISCOVERY_DEADLINE_MS}
|
|
43
|
+
* passes, instead of asking the operator to press Enter between reads.
|
|
44
|
+
*
|
|
45
|
+
* ## Where the two hooks sit, and why
|
|
46
|
+
*
|
|
47
|
+
* The flow asks its questions in one fixed order, and Telegram's shape falls
|
|
48
|
+
* out of it: the token is `collect`, because a human supplies it; the chat id is
|
|
49
|
+
* `discover`, because the SERVICE supplies it and the human's only part is
|
|
50
|
+
* sending a message and picking from what arrived. That is the hook APRV-78
|
|
51
|
+
* reserved and did not call. The proof is `verify`, which runs after the write —
|
|
52
|
+
* later than the old hand-rolled flow ran it, and correct in the same way the
|
|
53
|
+
* adapter's SMTP probe is: what is being proved is the stored configuration.
|
|
54
|
+
*/
|
|
55
|
+
import type { CredentialSpec } from "../core/credential-spec.js";
|
|
56
|
+
import type { PolicyLoadResult } from "../core/policy-load.js";
|
|
57
|
+
import type { Streams } from "./main.js";
|
|
58
|
+
import { type Context, type HintContext, type SetupDeps } from "./setup-common.js";
|
|
59
|
+
import { type FlowHooks } from "./setup-flow.js";
|
|
60
|
+
/**
|
|
61
|
+
* The Telegram-only dependency, kept local to this file ON PURPOSE.
|
|
62
|
+
*
|
|
63
|
+
* `SetupDeps` is `setup-common.ts`'s, shared by every subcommand, and a
|
|
64
|
+
* discovery deadline is not something `setup vault` or `setup adapter email`
|
|
65
|
+
* has any meaning for. Tests inject a short one so the deadline path costs the
|
|
66
|
+
* suite milliseconds rather than a minute and a half; no operator has a reason
|
|
67
|
+
* to change it, so it is not a flag either.
|
|
68
|
+
*/
|
|
69
|
+
export interface ChannelSetupDeps extends SetupDeps {
|
|
70
|
+
/** The chat-discovery deadline in ms. {@link DISCOVERY_DEADLINE_MS} default. */
|
|
71
|
+
discoveryDeadlineMs?: number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The refusal for the OLD spelling, as one constant on one line.
|
|
75
|
+
*
|
|
76
|
+
* One line and one identifier, because `tests/setup-rename.test.ts` sweeps
|
|
77
|
+
* `src/`, `docs/`, `examples/`, `README.md` and `SPEC.md` for the bare phrase
|
|
78
|
+
* and exempts exactly the lines that also name `RENAMED_NOTICE`. That is the
|
|
79
|
+
* whole exemption mechanism: a future line that reintroduces the old spelling
|
|
80
|
+
* cannot claim the exemption without saying this constant's name out loud.
|
|
81
|
+
*/
|
|
82
|
+
export declare const RENAMED_NOTICE = "`approval setup telegram` is now `approval setup channel telegram`, and there is no alias. A channel surfaces requests and collects decisions and holds no state; an adapter executes side effects and holds credentials. The two setup verbs fill different stores, so a channel's name belongs under `channel` (the OS keystore and .approval/env) and an adapter's under `adapter` (the vault)";
|
|
83
|
+
/** One channel, as this verb needs to see it. Symmetric with ADAPTER_SETUPS. */
|
|
84
|
+
export interface ChannelSetupEntry {
|
|
85
|
+
/** The manifest, declared by the channel itself, resolved against the policy. */
|
|
86
|
+
specs(load: PolicyLoadResult): readonly CredentialSpec[];
|
|
87
|
+
/** One line of what this channel is, for the title. */
|
|
88
|
+
summary: string;
|
|
89
|
+
/** The prerequisite paragraph, printed under the title. */
|
|
90
|
+
prereq: string;
|
|
91
|
+
/** The non-interactive path: the exact commands, generated. */
|
|
92
|
+
hint(context: HintContext): string;
|
|
93
|
+
/** The channel-specific conversation, as the flow's hooks. */
|
|
94
|
+
hooks(context: Context, deps: SetupDeps, streams: Streams, helpText: string): FlowHooks;
|
|
95
|
+
/** What to tell the operator to do next. */
|
|
96
|
+
nextSteps: readonly string[];
|
|
97
|
+
/** The per-channel help, for `--help` and for every refusal. */
|
|
98
|
+
help: string;
|
|
99
|
+
}
|
|
100
|
+
/** Every channel this verb can configure. Keyed by the `channel <name>` name. */
|
|
101
|
+
export declare const CHANNEL_SETUPS: Record<string, ChannelSetupEntry>;
|
|
102
|
+
/** The known names, sorted, for a usage error and for the help text. */
|
|
103
|
+
export declare function knownChannelNames(): string[];
|
|
104
|
+
/**
|
|
105
|
+
* `approval setup channel <name>` — the interactive writer for one channel's
|
|
106
|
+
* transport credentials. HUMAN-ONLY.
|
|
107
|
+
*
|
|
108
|
+
* The human-only gate is NEW in APRV-79. The Telegram help text had said
|
|
109
|
+
* HUMAN-ONLY since APRV-74 and nothing enforced it: the verb stores a bot
|
|
110
|
+
* credential and writes `.approval/env`, which is exactly what `vault` and
|
|
111
|
+
* `sampling` are gated for, and a help text that claims a control the code does
|
|
112
|
+
* not apply is worse than no claim at all.
|
|
113
|
+
*
|
|
114
|
+
* `argv` starts at the channel's name: `commandSetup` has already eaten
|
|
115
|
+
* `channel`.
|
|
116
|
+
*/
|
|
117
|
+
export declare function commandSetupChannel(argv: string[], streams: Streams, cwd: string, deps?: SetupDeps): Promise<number>;
|