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,473 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval setup` — the interactive configuration family (SPEC.md §5.2, §10.1).
|
|
3
|
+
*
|
|
4
|
+
* APRV-73 gave `.approval/env` a format and `approval env` a reader. This verb
|
|
5
|
+
* is the writer, and it is the only one: it establishes the things an operator
|
|
6
|
+
* must have before any gate operation works — a declared human identity, a
|
|
7
|
+
* vault passphrase, a sampling secret, a live Telegram bot and chat, and an
|
|
8
|
+
* adapter's credentials — by putting each VALUE where that kind of value
|
|
9
|
+
* belongs and each SOURCE in `.approval/env`.
|
|
10
|
+
*
|
|
11
|
+
* ## Who lives where
|
|
12
|
+
*
|
|
13
|
+
* This file holds the three subcommands whose subject is a value this runtime
|
|
14
|
+
* MINTS or a name it records, plus the dispatch:
|
|
15
|
+
*
|
|
16
|
+
* ```
|
|
17
|
+
* setup identity # APPROVAL_HUMAN, in this file
|
|
18
|
+
* setup vault # the vault passphrase, in this file
|
|
19
|
+
* setup sampling # the audit sampling secret, in this file
|
|
20
|
+
* setup checkpoint # cli/setup-checkpoint.ts (the vault + a print)
|
|
21
|
+
* setup channel <name> # cli/setup-channel.ts (keystore + .approval/env)
|
|
22
|
+
* setup adapter <name> # cli/setup-adapter.ts (the vault)
|
|
23
|
+
* setup service # cli/setup-service.ts (a launchd/systemd unit)
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* The last two are **two nouns and not one list**, and the split is SPEC.md
|
|
27
|
+
* §4's: a CHANNEL surfaces requests and collects decisions and holds no state,
|
|
28
|
+
* so its setup fills the keystore and `.approval/env`; an ADAPTER executes side
|
|
29
|
+
* effects and holds credentials, so its setup fills the vault.
|
|
30
|
+
* An older build spelled the Telegram one without the `channel` noun, and that
|
|
31
|
+
* form is gone (APRV-79): the dispatch answers it with the new one and exits 2
|
|
32
|
+
* rather than aliasing it, because an alias would leave two spellings of a
|
|
33
|
+
* distinction the SPEC draws on purpose.
|
|
34
|
+
*
|
|
35
|
+
* Everything the three files share — the dependency bag, the keystore seam, the
|
|
36
|
+
* front matter, the human-only gate, the service names, the plaintext-literal
|
|
37
|
+
* offer — is `cli/setup-common.ts`, which imports from none of them. The
|
|
38
|
+
* conversation `setup channel|adapter` both run is `cli/setup-flow.ts`.
|
|
39
|
+
*
|
|
40
|
+
* ## The order these run in
|
|
41
|
+
*
|
|
42
|
+
* Nothing enforced it and nothing said it, which APRV-76 noticed the hard way.
|
|
43
|
+
* It is:
|
|
44
|
+
*
|
|
45
|
+
* ```
|
|
46
|
+
* approval init # the directory and the .gitignore
|
|
47
|
+
* (write APPROVAL.md) # the policy NAMES every variable below
|
|
48
|
+
* approval setup identity # APPROVAL_HUMAN
|
|
49
|
+
* approval setup vault # the passphrase, into the keystore
|
|
50
|
+
* eval "$(approval env)" # the ONLY thing that puts them in a shell
|
|
51
|
+
* approval setup adapter <name> # the adapter's credentials, into the vault
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* The policy comes before every `setup`, because each of them reads variable
|
|
55
|
+
* NAMES out of it. The `eval` comes before `setup adapter`, because that
|
|
56
|
+
* subcommand needs the passphrase's VALUE in the environment and will not read
|
|
57
|
+
* `.approval/env` to get it (§11.1 invariant 7). `setup sampling` and
|
|
58
|
+
* `setup channel telegram` slot in anywhere after the policy.
|
|
59
|
+
*
|
|
60
|
+
* ## What this verb is not allowed to do
|
|
61
|
+
*
|
|
62
|
+
* **It never appends to the log, never attests, and never edits `APPROVAL.md`.**
|
|
63
|
+
* Configuration is not an authorized action, and the log is the record of
|
|
64
|
+
* authorized actions; a "telegram configured" event would be a line in the one
|
|
65
|
+
* file this project promises never to rewrite, saying something the log has no
|
|
66
|
+
* business knowing. `tests/cli-setup.test.ts` byte-compares `events.jsonl`
|
|
67
|
+
* across a complete run of every subcommand to keep that true by assertion.
|
|
68
|
+
* When a policy line is needed (the sampling secret's name), this verb PRINTS
|
|
69
|
+
* the `approval policy amend` invocation and stops: an amendment is a human
|
|
70
|
+
* ceremony with an attestation at the end of it, and a setup wizard that
|
|
71
|
+
* silently edited an attested policy would be forging the sign-off.
|
|
72
|
+
*
|
|
73
|
+
* It writes exactly three things: lines in `.approval/env`, through a writer
|
|
74
|
+
* that preserves every other line and comment (`core/env-file.ts`), items in
|
|
75
|
+
* the OS keystore, and entries in the vault (`setup adapter` only).
|
|
76
|
+
*
|
|
77
|
+
* ## Interactive or nothing
|
|
78
|
+
*
|
|
79
|
+
* Every subcommand refuses when stdin is not a terminal, or when `--json` was
|
|
80
|
+
* given, and exits 2 printing THE EXACT NON-INTERACTIVE ALTERNATIVE — the
|
|
81
|
+
* `security add-generic-password` line to run, or the `.approval/env` line to
|
|
82
|
+
* add, or the `export` to put in a shell profile. This is not a wizard being
|
|
83
|
+
* precious about its terminal. A `setup` that could be driven from a pipe would
|
|
84
|
+
* be a way for a CI job or an agent to write `APPROVAL_HUMAN` and a keystore
|
|
85
|
+
* item, which is precisely the boundary §11 draws: identity is config-declared,
|
|
86
|
+
* so establishing it must be an act of the human at the machine. The refusal
|
|
87
|
+
* text is the documented scripted path, so nobody has to reverse-engineer one.
|
|
88
|
+
*
|
|
89
|
+
* `setup identity` is EXEMPT from the human-only `--as` gate that every other
|
|
90
|
+
* subcommand carries, and the exemption is not a hole: identity is what that
|
|
91
|
+
* gate reads. A verb that demanded `APPROVAL_HUMAN` before it would let you set
|
|
92
|
+
* `APPROVAL_HUMAN` could only ever be run by someone who did not need it. The
|
|
93
|
+
* control on this path is the terminal itself.
|
|
94
|
+
*
|
|
95
|
+
* ## Answers, and answering again (APRV-90)
|
|
96
|
+
*
|
|
97
|
+
* Every typed question in this family runs through `prompt.ts`'s `askUntil`: a
|
|
98
|
+
* wrong answer is one line saying what was wrong and the same question again,
|
|
99
|
+
* never an exit code with a help page under it. `setup identity` also
|
|
100
|
+
* NORMALISES what it is given — `carter` is recorded as `human:carter`, and
|
|
101
|
+
* `human:carter` is taken as it stands ({@link identityFromAnswer}). The prompt
|
|
102
|
+
* still prints the `human:` prefix, because the prefix is what distinguishes
|
|
103
|
+
* the actor kinds the human-only verbs refuse, but nobody has to retype a
|
|
104
|
+
* prefix the question already showed them. `agent:` and `system:` are refused
|
|
105
|
+
* with the sentence that names why, as a reason to answer again.
|
|
106
|
+
*
|
|
107
|
+
* ## Where a secret goes, and how it gets there
|
|
108
|
+
*
|
|
109
|
+
* Three service names, one per secret, documented so an operator can find them
|
|
110
|
+
* with `security find-generic-password` or `secret-tool lookup` by hand:
|
|
111
|
+
* `approval-tg-token`, `approval-vault-passphrase`, `approval-sampling-secret`.
|
|
112
|
+
*
|
|
113
|
+
* - **macOS** (`darwin` and `security` on PATH) → `keychain:<service>`;
|
|
114
|
+
* - **Linux with `secret-tool`** → `secret-service:<service>` (the same string
|
|
115
|
+
* is the label, so the two platforms name one secret one way);
|
|
116
|
+
* - **neither** → the operator is OFFERED a plaintext literal in
|
|
117
|
+
* `.approval/env`, and must type `yes` in full to take it, having been shown
|
|
118
|
+
* the same warning `approval env --check` will print at them forever after.
|
|
119
|
+
* §5.2 permits literals for a stated reason, and refusing here would only
|
|
120
|
+
* move the value into a shell profile where nothing can see it to report it.
|
|
121
|
+
*
|
|
122
|
+
* **A value the operator already holds is never handled by this process.** The
|
|
123
|
+
* Telegram token on macOS is collected by `security`'s OWN no-echo prompt: we
|
|
124
|
+
* spawn `security add-generic-password … -w` WITH NO VALUE and with inherited
|
|
125
|
+
* stdio, Apple's prompt reads it from the terminal, and the token reaches this
|
|
126
|
+
* runtime only afterwards, on the stdout of a `find-generic-password -w` read
|
|
127
|
+
* that puts nothing in an argv either. Off macOS it comes through
|
|
128
|
+
* `Prompter.readSecret`, which at least keeps it off the screen.
|
|
129
|
+
*
|
|
130
|
+
* **A value we generate ourselves is a different question**, and it is the one
|
|
131
|
+
* place this family makes a trade rather than following a rule. The vault
|
|
132
|
+
* passphrase and the sampling secret are `randomBytes(32)`, minted in this
|
|
133
|
+
* process, so they are already in this process and there is nobody to prompt.
|
|
134
|
+
* They reach the keystore by STDIN first: `security add-generic-password -w`
|
|
135
|
+
* with the value written to its stdin twice (the prompt asks for confirmation),
|
|
136
|
+
* and `secret-tool store`, which documents stdin as its input. Only if the
|
|
137
|
+
* stdin form FAILS does the fallback put the value in an argv (`-w <value>`),
|
|
138
|
+
* and then the outcome says so out loud. That residual exposure is a value
|
|
139
|
+
* minted one millisecond earlier, never used, visible in `ps` to the same user
|
|
140
|
+
* who is running the command and to root — which is the boundary §11 already
|
|
141
|
+
* declares undefended. It is accepted for generated values and for nothing
|
|
142
|
+
* else: no path in this family ever puts an operator's own token in an argv.
|
|
143
|
+
*
|
|
144
|
+
* **And there is one standing exception to the rule above, which
|
|
145
|
+
* `setup adapter <name>` takes.** A credential bound for the VAULT must pass
|
|
146
|
+
* through this process, because the vault is not a helper with a prompt: it is
|
|
147
|
+
* a file this runtime encrypts, so `setCredential` needs the bytes. There is
|
|
148
|
+
* nothing to delegate the typing to and no third party to hold the value. The
|
|
149
|
+
* secret is read with `Prompter.readSecret` (no echo), handed straight to the
|
|
150
|
+
* cipher, and never printed, logged, or placed in an argv — which is exactly
|
|
151
|
+
* what `approval vault set` already does when a human pastes a credential onto
|
|
152
|
+
* its stdin. The rule is "never handle a value someone else can hold for you";
|
|
153
|
+
* for the vault nobody can, so it is stated here rather than left to look like
|
|
154
|
+
* an oversight.
|
|
155
|
+
*
|
|
156
|
+
* ## Seams
|
|
157
|
+
*
|
|
158
|
+
* The prompter, the keystore, and `fetch` are injected. The alternative is a
|
|
159
|
+
* test suite that needs a terminal, writes to the developer's real Keychain,
|
|
160
|
+
* and talks to the real Bot API — and the third of those would put a real bot
|
|
161
|
+
* token in a test run. `tests/cli-setup.test.ts` drives all three through fakes
|
|
162
|
+
* and the mock Bot API on loopback, and the spawned-CLI cases never get past
|
|
163
|
+
* the terminal check, so nothing under `npm test` can reach a keystore at all.
|
|
164
|
+
*/
|
|
165
|
+
import { HUMAN_ACTOR_ENV, resolveHumanActor } from "../core/attest.js";
|
|
166
|
+
import { readEnvFile, upsertEnvFileEntries } from "../core/env-file.js";
|
|
167
|
+
import { passphraseEnvFor, vaultExists, vaultPathFor } from "../core/vault.js";
|
|
168
|
+
import { EXIT_IO, EXIT_OK } from "./exit-codes.js";
|
|
169
|
+
import { SETUP_CHANNEL_HELP, SETUP_HELP, SETUP_IDENTITY_HELP, SETUP_SAMPLING_HELP, SETUP_VAULT_HELP, } from "./help.js";
|
|
170
|
+
import { commandSetupAdapter } from "./setup-adapter.js";
|
|
171
|
+
import { commandSetupCheckpoint } from "./setup-checkpoint.js";
|
|
172
|
+
import { RENAMED_NOTICE, commandSetupChannel } from "./setup-channel.js";
|
|
173
|
+
import { commandSetupService } from "./setup-service.js";
|
|
174
|
+
import { DEFAULT_SAMPLING_ENV, emitRefusal, front, offerLiteral, promptRefusal, requireHuman, retrievalCommand, samplingEnvName, schemeFor, storageCommand, usageError, } from "./setup-common.js";
|
|
175
|
+
import { PLAN_PHRASES, planWrites, reportLeftAlone } from "./setup-flow.js";
|
|
176
|
+
import { askUntil } from "./prompt.js";
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// Replacing what is already there
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
/**
|
|
181
|
+
* Which of `keys` already have a line, asked about BEFORE any work is done.
|
|
182
|
+
*
|
|
183
|
+
* Up front rather than at write time so that declining costs nothing: a
|
|
184
|
+
* confirmation asked after the keystore item had already been replaced would be
|
|
185
|
+
* a question whose "no" no longer means anything.
|
|
186
|
+
*
|
|
187
|
+
* **No previous VALUE is ever printed**, not even for `APPROVAL_HUMAN`, whose
|
|
188
|
+
* value is not a secret. The file may legitimately hold a plaintext literal on
|
|
189
|
+
* any line (§5.2), the operator chose that with a warning, and a verb that
|
|
190
|
+
* echoed "replacing 7654321:AA…?" would undo the choice on their behalf.
|
|
191
|
+
*
|
|
192
|
+
* The asking itself is {@link planWrites} (APRV-78), shared with the credential
|
|
193
|
+
* flow `setup channel|adapter` run. What stays here is the part that is about
|
|
194
|
+
* THIS file: reading it, and turning a read refusal into a refusal the caller
|
|
195
|
+
* can return. The sentences are unchanged, deliberately — an operator who has
|
|
196
|
+
* run `setup` before should not be told the same fact in new words.
|
|
197
|
+
*/
|
|
198
|
+
function planReplacements(streams, prompter, envPath, keys) {
|
|
199
|
+
const file = readEnvFile(envPath);
|
|
200
|
+
if (!file.ok)
|
|
201
|
+
return { ok: false, refusal: file };
|
|
202
|
+
const present = new Set(file.entries.map((entry) => entry.key));
|
|
203
|
+
const plan = planWrites(streams, prompter, present, envPath, keys, PLAN_PHRASES["env-file"]);
|
|
204
|
+
return { ok: true, write: plan.write, skipped: plan.skipped };
|
|
205
|
+
}
|
|
206
|
+
/** Report what was left alone, so a re-run's "no" is visible in the output. */
|
|
207
|
+
function reportSkipped(streams, envPath, skipped) {
|
|
208
|
+
reportLeftAlone(streams, envPath, skipped, PLAN_PHRASES["env-file"]);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Write the lines that survived {@link planReplacements}, and report.
|
|
212
|
+
*
|
|
213
|
+
* `values` may contain a plaintext secret on the no-keystore path, so the
|
|
214
|
+
* report names the KEY and the SOURCE FORM and never the line's value.
|
|
215
|
+
*/
|
|
216
|
+
function writeLines(streams, envPath, wanted, allowed) {
|
|
217
|
+
const entries = wanted.filter((entry) => allowed.includes(entry.key));
|
|
218
|
+
if (entries.length === 0)
|
|
219
|
+
return { ok: true, wrote: 0 };
|
|
220
|
+
const result = upsertEnvFileEntries(envPath, entries.map((entry) => ({ key: entry.key, value: entry.value })));
|
|
221
|
+
if (!result.ok)
|
|
222
|
+
return { ok: false, code: emitRefusal(streams, result) };
|
|
223
|
+
if (result.created)
|
|
224
|
+
streams.out(`created ${envPath} (mode 0600)\n`);
|
|
225
|
+
for (const entry of entries) {
|
|
226
|
+
streams.out(` ${entry.key} -> ${entry.describe}\n`);
|
|
227
|
+
}
|
|
228
|
+
return { ok: true, wrote: entries.length };
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Put a GENERATED secret where this machine keeps secrets, and say where.
|
|
232
|
+
*
|
|
233
|
+
* `null` means the operator declined the plaintext offer, or the keystore
|
|
234
|
+
* refused; either way nothing was written and the caller stops.
|
|
235
|
+
*
|
|
236
|
+
* This stays in this file rather than in `setup-common.ts` because `vault` and
|
|
237
|
+
* `sampling` are the only two subcommands that MINT a value: a channel's token
|
|
238
|
+
* and an adapter's password are the operator's, and the whole argument in the
|
|
239
|
+
* module doc turns on that difference.
|
|
240
|
+
*/
|
|
241
|
+
function storeGeneratedSecret(streams, context, service, what) {
|
|
242
|
+
if (context.backend === "none") {
|
|
243
|
+
const value = context.generate();
|
|
244
|
+
if (!offerLiteral(streams, context.prompter, context.envPath, what))
|
|
245
|
+
return null;
|
|
246
|
+
return { value, describe: `a plaintext literal in ${context.envPath} (PLAINTEXT)` };
|
|
247
|
+
}
|
|
248
|
+
const value = context.generate();
|
|
249
|
+
const outcome = context.keystore.storeGenerated(service, value);
|
|
250
|
+
if (!outcome.ok) {
|
|
251
|
+
streams.err(`approval: the ${what} could not be stored (${outcome.message}); nothing was written to ${context.envPath}\n`);
|
|
252
|
+
return { failed: true, code: EXIT_IO };
|
|
253
|
+
}
|
|
254
|
+
streams.out(`stored a freshly generated ${what} as ${schemeFor(context.backend, service) ?? service}\n`);
|
|
255
|
+
if (outcome.viaArgv) {
|
|
256
|
+
streams.out(` note: this build of the helper would not take the value on stdin, so it went\n through its argv and was briefly visible in \`ps\` to your own user. That is\n accepted for a value generated one moment earlier and never used; a token you\n brought with you is never passed that way.\n`);
|
|
257
|
+
}
|
|
258
|
+
streams.out(` read it back with: ${retrievalCommand(context.backend, service)}\n`);
|
|
259
|
+
return {
|
|
260
|
+
value: schemeFor(context.backend, service),
|
|
261
|
+
describe: schemeFor(context.backend, service),
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
// ---------------------------------------------------------------------------
|
|
265
|
+
// approval setup identity
|
|
266
|
+
// ---------------------------------------------------------------------------
|
|
267
|
+
/**
|
|
268
|
+
* One typed answer to `human identity (human:<id>):`, as an identity (APRV-90).
|
|
269
|
+
*
|
|
270
|
+
* **A bare id is accepted and normalised.** The prompt prints the `human:`
|
|
271
|
+
* prefix because the prefix is load-bearing — actors are `human:`, `agent:` or
|
|
272
|
+
* `system:`, and the human-only verbs refuse the other two — so an operator who
|
|
273
|
+
* has never read SPEC.md §11 learns the shape from the question itself. Making
|
|
274
|
+
* them retype a prefix the prompt just printed adds a failure path and teaches
|
|
275
|
+
* nothing further, so `carter` becomes `human:carter` and `human:carter` is
|
|
276
|
+
* taken as it stands.
|
|
277
|
+
*
|
|
278
|
+
* An answer with a colon in it is taken as a FULL actor and validated as one,
|
|
279
|
+
* which is what makes `agent:claude` a refusal rather than `human:agent:claude`.
|
|
280
|
+
* That refusal is a reason handed back to {@link askUntil}, so the operator is
|
|
281
|
+
* asked again rather than dropped out of the verb.
|
|
282
|
+
*/
|
|
283
|
+
export function identityFromAnswer(answer) {
|
|
284
|
+
const typed = answer.trim();
|
|
285
|
+
if (typed.length === 0) {
|
|
286
|
+
return {
|
|
287
|
+
ok: false,
|
|
288
|
+
reason: `nothing was entered; type your id (for example carter, which is recorded as human:carter)`,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
const candidate = typed.includes(":") ? typed : `human:${typed}`;
|
|
292
|
+
if (resolveHumanActor({ actor: candidate }) === null) {
|
|
293
|
+
return {
|
|
294
|
+
ok: false,
|
|
295
|
+
reason: `${JSON.stringify(typed)} is not a human identity: it must match ^human:.+ (for example human:alice, or just alice). An agent: or system: actor cannot be declared here — those are what the human-only verbs refuse`,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
return { ok: true, value: candidate };
|
|
299
|
+
}
|
|
300
|
+
const IDENTITY_HINT = (where) => ` # in your shell profile, which is where a declared identity belongs:\n export ${HUMAN_ACTOR_ENV}=human:<id>\n\n # or, recorded for \`approval env\` to hand back to you:\n printf '%s\\n' '${HUMAN_ACTOR_ENV}=human:<id>' >> ${where.envPath}\n chmod 600 ${where.envPath}`;
|
|
301
|
+
/**
|
|
302
|
+
* `approval setup identity` — declare who the human is.
|
|
303
|
+
*
|
|
304
|
+
* EXEMPT from the human-only gate, and the module doc says why: this is the
|
|
305
|
+
* verb that creates the thing the gate reads.
|
|
306
|
+
*/
|
|
307
|
+
export function commandSetupIdentity(argv, streams, cwd, deps = {}) {
|
|
308
|
+
const outcome = front("identity", argv, streams, cwd, deps, SETUP_IDENTITY_HELP, IDENTITY_HINT);
|
|
309
|
+
if (outcome.kind === "handled")
|
|
310
|
+
return outcome.code;
|
|
311
|
+
const context = outcome;
|
|
312
|
+
const extra = context.positionals[0];
|
|
313
|
+
if (extra !== undefined) {
|
|
314
|
+
return usageError(streams, false, `unexpected argument ${JSON.stringify(extra)}`, SETUP_IDENTITY_HELP);
|
|
315
|
+
}
|
|
316
|
+
streams.out(`approval setup identity — declares WHO the human is, in ${HUMAN_ACTOR_ENV}.\n\nIdentity here is declared, not proved: anyone who can set this variable and\nwrite to the log can act as this human. Nothing is appended to the log by this\nverb.\n\n`);
|
|
317
|
+
const plan = planReplacements(streams, context.prompter, context.envPath, [HUMAN_ACTOR_ENV]);
|
|
318
|
+
if (!plan.ok)
|
|
319
|
+
return emitRefusal(streams, plan.refusal);
|
|
320
|
+
if (plan.write.length === 0) {
|
|
321
|
+
reportSkipped(streams, context.envPath, plan.skipped);
|
|
322
|
+
return EXIT_OK;
|
|
323
|
+
}
|
|
324
|
+
const asked = askUntil(streams, context.prompter, `human identity (human:<id>, or just <id>): `, identityFromAnswer);
|
|
325
|
+
if (!asked.ok) {
|
|
326
|
+
// One line, and no help page: the question was on screen and the answer to
|
|
327
|
+
// it was wrong or withdrawn, which is not a mangled command line (APRV-90).
|
|
328
|
+
return promptRefusal(streams, asked.reason === "aborted"
|
|
329
|
+
? "no identity was entered; nothing was written"
|
|
330
|
+
: `no human identity after ${String(asked.attempts)} attempts; nothing was written`);
|
|
331
|
+
}
|
|
332
|
+
const identity = asked.value;
|
|
333
|
+
const written = writeLines(streams, context.envPath, [{ key: HUMAN_ACTOR_ENV, value: identity, describe: identity }], plan.write);
|
|
334
|
+
if (!written.ok)
|
|
335
|
+
return written.code;
|
|
336
|
+
reportSkipped(streams, context.envPath, plan.skipped);
|
|
337
|
+
streams.out(`\nThat line is INERT until you evaluate it: no verb reads ${context.envPath} on its\nown. Establish it in this shell with:\n\n eval "$(approval env)"\n`);
|
|
338
|
+
return EXIT_OK;
|
|
339
|
+
}
|
|
340
|
+
// ---------------------------------------------------------------------------
|
|
341
|
+
// approval setup vault
|
|
342
|
+
// ---------------------------------------------------------------------------
|
|
343
|
+
const VAULT_HINT = (where) => ` # 1. store a passphrase you generated yourself (no value on this command line;\n # the helper prompts for it with no echo):\n ${storageCommand(where.kind === "none" ? "keychain" : where.kind, where.services.vaultPassphrase)}\n\n # 2. record where it lives (the name carries this instance's id; see \`approval doctor\`):\n printf '%s\\n' '${where.passphraseEnv}=${schemeFor(where.kind === "none" ? "keychain" : where.kind, where.services.vaultPassphrase) ?? ""}' >> ${where.envPath}\n chmod 600 ${where.envPath}`;
|
|
344
|
+
/** `approval setup vault` — mint and store the vault passphrase. HUMAN-ONLY. */
|
|
345
|
+
export function commandSetupVault(argv, streams, cwd, deps = {}) {
|
|
346
|
+
const outcome = front("vault", argv, streams, cwd, deps, SETUP_VAULT_HELP, VAULT_HINT);
|
|
347
|
+
if (outcome.kind === "handled")
|
|
348
|
+
return outcome.code;
|
|
349
|
+
const context = outcome;
|
|
350
|
+
const human = requireHuman(context.flags, streams, SETUP_VAULT_HELP, "vault");
|
|
351
|
+
if (!human.ok)
|
|
352
|
+
return human.code;
|
|
353
|
+
const variable = passphraseEnvFor(context.load);
|
|
354
|
+
streams.out(`approval setup vault — mints the passphrase for ${vaultPathFor(context.logPath)} and puts\nit where this machine keeps secrets. The policy names the VARIABLE\n(vault.passphrase_env${variable === "APPROVAL_VAULT_PASSPHRASE" ? ", defaulted here" : ""}) and never the value.\n\n`);
|
|
355
|
+
// A vault already encrypted under a different passphrase is not recoverable
|
|
356
|
+
// from a new one, and this verb generates rather than asks, so the warning
|
|
357
|
+
// has to come before the generation and not after it.
|
|
358
|
+
if (vaultExists(vaultPathFor(context.logPath))) {
|
|
359
|
+
streams.out(`WARNING: ${vaultPathFor(context.logPath)} already exists. It is encrypted under the\npassphrase you are about to REPLACE, and a vault cannot be re-keyed by changing\nthe variable: every credential in it becomes unreadable. Store the current\npassphrase somewhere first, or remove the vault, if you mean to continue.\n\n`);
|
|
360
|
+
if (!context.prompter.confirm("generate a new passphrase anyway?")) {
|
|
361
|
+
streams.out("aborted: nothing was generated, stored, or written\n");
|
|
362
|
+
return EXIT_OK;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
const plan = planReplacements(streams, context.prompter, context.envPath, [variable]);
|
|
366
|
+
if (!plan.ok)
|
|
367
|
+
return emitRefusal(streams, plan.refusal);
|
|
368
|
+
if (plan.write.length === 0) {
|
|
369
|
+
reportSkipped(streams, context.envPath, plan.skipped);
|
|
370
|
+
return EXIT_OK;
|
|
371
|
+
}
|
|
372
|
+
const stored = storeGeneratedSecret(streams, context, context.services.vaultPassphrase, "vault passphrase");
|
|
373
|
+
if (stored === null)
|
|
374
|
+
return EXIT_OK;
|
|
375
|
+
if ("failed" in stored)
|
|
376
|
+
return stored.code;
|
|
377
|
+
const written = writeLines(streams, context.envPath, [{ key: variable, value: stored.value, describe: stored.describe }], plan.write);
|
|
378
|
+
if (!written.ok)
|
|
379
|
+
return written.code;
|
|
380
|
+
reportSkipped(streams, context.envPath, plan.skipped);
|
|
381
|
+
streams.out(`\nThe passphrase is in ${variable}, and its value was not printed here or anywhere\nelse — there is no verb in this CLI that prints it. Establish it with:\n\n eval "$(approval env)"\n\nthen \`approval vault set <name>\` will work.\n`);
|
|
382
|
+
return EXIT_OK;
|
|
383
|
+
}
|
|
384
|
+
// ---------------------------------------------------------------------------
|
|
385
|
+
// approval setup sampling
|
|
386
|
+
// ---------------------------------------------------------------------------
|
|
387
|
+
const SAMPLING_HINT = (where) => ` # 1. store the secret (the helper prompts; no value on this command line):\n ${storageCommand(where.kind === "none" ? "keychain" : where.kind, where.services.samplingSecret)}\n\n # 2. record where it lives (the name carries this instance's id; see \`approval doctor\`):\n printf '%s\\n' '${where.samplingEnv}=${schemeFor(where.kind === "none" ? "keychain" : where.kind, where.services.samplingSecret) ?? ""}' >> ${where.envPath}\n chmod 600 ${where.envPath}\n\n # 3. name the variable in the policy, through the amendment ceremony:\n # audit: { sampling_secret_env: ${where.samplingEnv} }\n approval policy amend`;
|
|
388
|
+
/** `approval setup sampling` — mint and store the audit sampling secret. HUMAN-ONLY. */
|
|
389
|
+
export function commandSetupSampling(argv, streams, cwd, deps = {}) {
|
|
390
|
+
const outcome = front("sampling", argv, streams, cwd, deps, SETUP_SAMPLING_HELP, SAMPLING_HINT);
|
|
391
|
+
if (outcome.kind === "handled")
|
|
392
|
+
return outcome.code;
|
|
393
|
+
const context = outcome;
|
|
394
|
+
const human = requireHuman(context.flags, streams, SETUP_SAMPLING_HELP, "sampling");
|
|
395
|
+
if (!human.ok)
|
|
396
|
+
return human.code;
|
|
397
|
+
const declared = samplingEnvName(context.load);
|
|
398
|
+
const variable = declared ?? DEFAULT_SAMPLING_ENV;
|
|
399
|
+
streams.out(`approval setup sampling — mints the operator-held secret that selects which\nsupervised actions are sampled for retrospective review.\n\nSelection is HMAC-SHA-256 over the event hash under this secret. Seeding from\nevent content alone is forbidden: the agent authoring the event controls that\ncontent and could search it until its action falls outside the sample.\n\n`);
|
|
400
|
+
const plan = planReplacements(streams, context.prompter, context.envPath, [variable]);
|
|
401
|
+
if (!plan.ok)
|
|
402
|
+
return emitRefusal(streams, plan.refusal);
|
|
403
|
+
if (plan.write.length === 0) {
|
|
404
|
+
reportSkipped(streams, context.envPath, plan.skipped);
|
|
405
|
+
return EXIT_OK;
|
|
406
|
+
}
|
|
407
|
+
const stored = storeGeneratedSecret(streams, context, context.services.samplingSecret, "sampling secret");
|
|
408
|
+
if (stored === null)
|
|
409
|
+
return EXIT_OK;
|
|
410
|
+
if ("failed" in stored)
|
|
411
|
+
return stored.code;
|
|
412
|
+
const written = writeLines(streams, context.envPath, [{ key: variable, value: stored.value, describe: stored.describe }], plan.write);
|
|
413
|
+
if (!written.ok)
|
|
414
|
+
return written.code;
|
|
415
|
+
reportSkipped(streams, context.envPath, plan.skipped);
|
|
416
|
+
if (declared === null) {
|
|
417
|
+
// The value is in place and the sampler is still off, which is the honest
|
|
418
|
+
// report: §5.2 turns sampling on from the POLICY, and this verb does not
|
|
419
|
+
// edit a policy file. What it can do is hand over the exact ceremony.
|
|
420
|
+
streams.out(`\nYour policy names no audit.sampling_secret_env, so the secret was recorded under\nthe conventional name ${variable} and SAMPLING IS STILL OFF. It stays off until\nthe policy names the variable — a policy that names none disables sampling, and\nthis verb does not edit an attested policy file.\n\nAdd this block, through the ceremony that attests it:\n\n audit:\n sampling_secret_env: ${variable}\n\n approval policy amend\n`);
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
streams.out(`\nYour policy already names ${variable} (audit.sampling_secret_env), so sampling is\nlive once the variable is in the environment:\n\n eval "$(approval env)"\n`);
|
|
424
|
+
}
|
|
425
|
+
return EXIT_OK;
|
|
426
|
+
}
|
|
427
|
+
// ---------------------------------------------------------------------------
|
|
428
|
+
// Dispatch
|
|
429
|
+
// ---------------------------------------------------------------------------
|
|
430
|
+
/** `approval setup <identity|vault|sampling|channel <name>|adapter <name>>`. */
|
|
431
|
+
export function commandSetup(argv, streams, cwd, deps = {}) {
|
|
432
|
+
const sub = argv[0];
|
|
433
|
+
const rest = argv.slice(1);
|
|
434
|
+
const json = argv.includes("--json");
|
|
435
|
+
if (sub === undefined) {
|
|
436
|
+
return usageError(streams, json, "missing subcommand for `approval setup`", SETUP_HELP);
|
|
437
|
+
}
|
|
438
|
+
if (sub === "--help" || sub === "-h" || sub === "help") {
|
|
439
|
+
streams.out(`${SETUP_HELP}\n`);
|
|
440
|
+
return EXIT_OK;
|
|
441
|
+
}
|
|
442
|
+
if (sub === "identity")
|
|
443
|
+
return commandSetupIdentity(rest, streams, cwd, deps);
|
|
444
|
+
if (sub === "vault")
|
|
445
|
+
return commandSetupVault(rest, streams, cwd, deps);
|
|
446
|
+
if (sub === "sampling")
|
|
447
|
+
return commandSetupSampling(rest, streams, cwd, deps);
|
|
448
|
+
// APRV-257. The fourth subcommand whose subject is a value this runtime
|
|
449
|
+
// MINTS, and the first whose public half belongs in APPROVAL.md rather than
|
|
450
|
+
// in `.approval/env`. It prints that half and the amendment ceremony and
|
|
451
|
+
// edits no policy file, exactly as `setup sampling` does with its variable
|
|
452
|
+
// name — the private half goes to the vault, like an adapter's credentials.
|
|
453
|
+
if (sub === "checkpoint")
|
|
454
|
+
return commandSetupCheckpoint(rest, streams, cwd, deps);
|
|
455
|
+
// `channel` and `adapter` are the two subcommands with a subject of their
|
|
456
|
+
// own: the name selects the entry, so it is a positional and not a flag.
|
|
457
|
+
if (sub === "channel")
|
|
458
|
+
return commandSetupChannel(rest, streams, cwd, deps);
|
|
459
|
+
if (sub === "adapter")
|
|
460
|
+
return commandSetupAdapter(rest, streams, cwd, deps);
|
|
461
|
+
// APRV-110. The one subcommand whose subject is neither a value this runtime
|
|
462
|
+
// mints nor a credential the operator holds: it writes the unit file that
|
|
463
|
+
// starts `approval up` at login, and it never copies a value into it.
|
|
464
|
+
if (sub === "service")
|
|
465
|
+
return commandSetupService(rest, streams, cwd, deps);
|
|
466
|
+
// The one former spelling that gets a sentence rather than "unknown
|
|
467
|
+
// subcommand". It is NOT an alias: it refuses at exit 2 and says what to run.
|
|
468
|
+
// See {@link RENAMED_NOTICE} and this file's module doc.
|
|
469
|
+
if (sub === "telegram")
|
|
470
|
+
return usageError(streams, json, RENAMED_NOTICE, SETUP_CHANNEL_HELP);
|
|
471
|
+
return usageError(streams, json, `unknown subcommand ${JSON.stringify(sub)} for \`approval setup\``, SETUP_HELP);
|
|
472
|
+
}
|
|
473
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/setup.ts"],"names":[],"mappings":"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"}
|