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,476 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The credential-collection flow (SPEC.md §5.2, §10.1, §10.4; APRV-78).
|
|
3
|
+
*
|
|
4
|
+
* `setup identity|vault|sampling|telegram` each hand-rolled their own
|
|
5
|
+
* conversation, and that was right while there were four of them and each was
|
|
6
|
+
* different. `setup adapter <name>` was the first verb whose conversation is
|
|
7
|
+
* DERIVED — from a manifest of {@link CredentialSpec}s an adapter declares — so
|
|
8
|
+
* the conversation itself becomes a function, and this file is that function.
|
|
9
|
+
* APRV-79 made it the second caller's too: `setup channel telegram` runs this
|
|
10
|
+
* flow over the Telegram channel's manifest, into `.approval/env` instead of
|
|
11
|
+
* into the vault, which is what the destination seam was built for.
|
|
12
|
+
*
|
|
13
|
+
* It knows nothing about email, SMTP, Telegram, or the vault's file format. It
|
|
14
|
+
* is handed a list of specs, somewhere to put the values
|
|
15
|
+
* ({@link FlowDestination}), and up to four hooks, and it runs one fixed order:
|
|
16
|
+
*
|
|
17
|
+
* 1. the title and the prerequisite line;
|
|
18
|
+
* 2. **the checklist** — one line per spec, before a single question is asked,
|
|
19
|
+
* so an operator can see the whole shape of what is about to be demanded and
|
|
20
|
+
* where it will land, and abandon at zero cost if it is the wrong vault;
|
|
21
|
+
* 3. **the preflight** ({@link FlowDestination.present}), which for a vault
|
|
22
|
+
* means OPENING it. This is why it is step three and not step six: a wrong
|
|
23
|
+
* passphrase must refuse before the operator has typed a password, not
|
|
24
|
+
* after. The set it returns is also what step four reads;
|
|
25
|
+
* 4. **the replacement plan** ({@link planWrites}), asked up front for the same
|
|
26
|
+
* reason `setup`'s own does: a confirmation asked after the value had been
|
|
27
|
+
* replaced is a question whose "no" no longer means anything. A name the
|
|
28
|
+
* operator declines is never even asked for;
|
|
29
|
+
* 5. **collection**, in manifest order;
|
|
30
|
+
* 6. **the cross-field check** ({@link FlowHooks.check}), before any write, so
|
|
31
|
+
* a half-configured pair costs nothing;
|
|
32
|
+
* 7. **the writes**, in manifest order — which is why an adapter puts its
|
|
33
|
+
* secret last: a destination that refuses half way reports exactly which
|
|
34
|
+
* names landed and stops. **There is no rollback**, deliberately: deleting
|
|
35
|
+
* credentials in response to a write failure is a destructive act taken by a
|
|
36
|
+
* wizard on its own authority, over a store whose previous contents it
|
|
37
|
+
* cannot restore;
|
|
38
|
+
* 8. **verification** ({@link FlowHooks.verify}), after the write, because the
|
|
39
|
+
* thing being verified is the stored configuration; and
|
|
40
|
+
* 9. **the report** — where, how many, which names — and the next steps.
|
|
41
|
+
*
|
|
42
|
+
* **Values are held in this process and printed by nothing.** The flow must
|
|
43
|
+
* hold them: it collected them and it is about to write them. Every line it
|
|
44
|
+
* emits names a CREDENTIAL NAME, a kind, a count, or a path, and the suite in
|
|
45
|
+
* `tests/cli-setup.test.ts` sweeps every captured byte for the fixture secrets
|
|
46
|
+
* with no exemption on this path.
|
|
47
|
+
*/
|
|
48
|
+
import { envFilePathFor, readEnvFile, upsertEnvFileEntries, } from "../core/env-file.js";
|
|
49
|
+
import { listCredentials, setCredential, vaultExists, } from "../core/vault.js";
|
|
50
|
+
import { EXIT_INTEGRITY, EXIT_IO, EXIT_OK, EXIT_USAGE } from "./exit-codes.js";
|
|
51
|
+
import { askUntil } from "./prompt.js";
|
|
52
|
+
import { refusal as renderRefusal, style } from "./style.js";
|
|
53
|
+
/** A vault refusal onto the exit table, exactly as `cli/vault.ts` maps it. */
|
|
54
|
+
function vaultExit(refusal) {
|
|
55
|
+
return {
|
|
56
|
+
code: refusal.code,
|
|
57
|
+
message: refusal.message,
|
|
58
|
+
exitCode: refusal.code === "vault-io" || refusal.code === "vault-write-failed"
|
|
59
|
+
? EXIT_IO
|
|
60
|
+
: EXIT_INTEGRITY,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** An env-file refusal onto the exit table, exactly as `cli/setup.ts` maps it. */
|
|
64
|
+
function envExit(refusal) {
|
|
65
|
+
return {
|
|
66
|
+
code: refusal.code,
|
|
67
|
+
message: refusal.message,
|
|
68
|
+
exitCode: refusal.code === "env-file-io" || refusal.code === "env-file-mode"
|
|
69
|
+
? EXIT_IO
|
|
70
|
+
: EXIT_INTEGRITY,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The encrypted credential store (SPEC.md §10.4).
|
|
75
|
+
*
|
|
76
|
+
* `present()` is where the passphrase is proved. A vault that does not exist
|
|
77
|
+
* yet holds nothing and refuses nothing: the first `write` creates it, which is
|
|
78
|
+
* what `approval vault set` does too. A vault that DOES exist is opened here
|
|
79
|
+
* and nowhere later, so a wrong passphrase costs the operator one line of
|
|
80
|
+
* output rather than five typed values.
|
|
81
|
+
*/
|
|
82
|
+
export function vaultDestination(vaultPath, passphrase) {
|
|
83
|
+
return {
|
|
84
|
+
kind: "vault",
|
|
85
|
+
where: () => vaultPath,
|
|
86
|
+
present() {
|
|
87
|
+
if (!vaultExists(vaultPath))
|
|
88
|
+
return { ok: true, names: new Set() };
|
|
89
|
+
const listed = listCredentials(vaultPath, passphrase);
|
|
90
|
+
if (!listed.ok)
|
|
91
|
+
return { ok: false, ...vaultExit(listed) };
|
|
92
|
+
return { ok: true, names: new Set(listed.names) };
|
|
93
|
+
},
|
|
94
|
+
write(name, value) {
|
|
95
|
+
const stored = setCredential(vaultPath, passphrase, name, value);
|
|
96
|
+
if (!stored.ok)
|
|
97
|
+
return { ok: false, ...vaultExit(stored) };
|
|
98
|
+
return { ok: true };
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The `.approval/env` source map (SPEC.md §5.2).
|
|
104
|
+
*
|
|
105
|
+
* Unused by `setup adapter` — an adapter's credentials go to the vault, never
|
|
106
|
+
* to this file — and used by `setup channel telegram`, which is what a channel's
|
|
107
|
+
* two values are: a source for the token and a literal chat id, both of them
|
|
108
|
+
* things that unlock the machine rather than things an adapter spends.
|
|
109
|
+
*
|
|
110
|
+
* The value written is whatever the caller collected, which on this path is a
|
|
111
|
+
* SOURCE (`keychain:<service>`), an identity, or a chat id. Nothing here decides
|
|
112
|
+
* that; {@link upsertEnvFileEntries} preserves every other line and comment.
|
|
113
|
+
*/
|
|
114
|
+
export function envFileDestination(envPath) {
|
|
115
|
+
return {
|
|
116
|
+
kind: "env-file",
|
|
117
|
+
where: () => envPath,
|
|
118
|
+
present() {
|
|
119
|
+
const file = readEnvFile(envPath);
|
|
120
|
+
if (!file.ok)
|
|
121
|
+
return { ok: false, ...envExit(file) };
|
|
122
|
+
return { ok: true, names: new Set(file.entries.map((entry) => entry.key)) };
|
|
123
|
+
},
|
|
124
|
+
write(name, value) {
|
|
125
|
+
const written = upsertEnvFileEntries(envPath, [{ key: name, value }]);
|
|
126
|
+
if (!written.ok)
|
|
127
|
+
return { ok: false, ...envExit(written) };
|
|
128
|
+
return { ok: true };
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/** The env file for a log path, re-exported so a caller needs one import. */
|
|
133
|
+
export { envFilePathFor };
|
|
134
|
+
/**
|
|
135
|
+
* The two phrasings, kept as data.
|
|
136
|
+
*
|
|
137
|
+
* The env-file wording is BYTE-FOR-BYTE what `setup identity|vault|sampling|
|
|
138
|
+
* telegram` printed before this file existed, because those sentences are
|
|
139
|
+
* asserted on and, more to the point, an operator who has run `setup` before
|
|
140
|
+
* should not be told the same fact in new words for no reason.
|
|
141
|
+
*/
|
|
142
|
+
export const PLAN_PHRASES = {
|
|
143
|
+
"env-file": {
|
|
144
|
+
present: (name, where) => `${name} already has a line in ${where} (its value is not printed here).\n`,
|
|
145
|
+
replace: (name) => `replace the ${name} line?`,
|
|
146
|
+
leftAlone: (names, where) => `left alone in ${where}: ${names.join(", ")} (the existing line${names.length === 1 ? " is" : "s are"} unchanged)\n`,
|
|
147
|
+
},
|
|
148
|
+
vault: {
|
|
149
|
+
present: (name, where) => `${name} is already in ${where} (its value is not printed here).\n`,
|
|
150
|
+
replace: (name) => `replace ${name}?`,
|
|
151
|
+
leftAlone: (names, where) => `left alone in ${where}: ${names.join(", ")} (the existing value${names.length === 1 ? " is" : "s are"} unchanged)\n`,
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* Which names to ask for, given which are already there.
|
|
156
|
+
*
|
|
157
|
+
* Asked BEFORE any work is done, and no previous VALUE is ever printed — not
|
|
158
|
+
* even one that is not a secret. A store may legitimately hold anything under
|
|
159
|
+
* any name, the operator put it there, and a verb that echoed "replacing
|
|
160
|
+
* smtp.user (you@example.net)?" would publish it into a terminal on their
|
|
161
|
+
* behalf.
|
|
162
|
+
*/
|
|
163
|
+
export function planWrites(streams, prompter, present, where, names, phrases) {
|
|
164
|
+
const write = [];
|
|
165
|
+
const skipped = [];
|
|
166
|
+
for (const name of names) {
|
|
167
|
+
if (!present.has(name)) {
|
|
168
|
+
write.push(name);
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
streams.out(phrases.present(name, where));
|
|
172
|
+
if (prompter.confirm(phrases.replace(name)))
|
|
173
|
+
write.push(name);
|
|
174
|
+
else
|
|
175
|
+
skipped.push(name);
|
|
176
|
+
}
|
|
177
|
+
return { write, skipped };
|
|
178
|
+
}
|
|
179
|
+
/** Report what was left alone, so a re-run's "no" is visible in the output. */
|
|
180
|
+
export function reportLeftAlone(streams, where, skipped, phrases) {
|
|
181
|
+
if (skipped.length === 0)
|
|
182
|
+
return;
|
|
183
|
+
streams.out(phrases.leftAlone([...skipped], where));
|
|
184
|
+
}
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
// Picking from a closed set
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
/**
|
|
189
|
+
* A numbered picker over a closed list.
|
|
190
|
+
*
|
|
191
|
+
* Extracted from the Telegram chat picker, which is the same conversation over
|
|
192
|
+
* different nouns: print the options with an index and read a number. Both
|
|
193
|
+
* callers use this one (APRV-79).
|
|
194
|
+
*
|
|
195
|
+
* **An unparseable answer is asked again** (APRV-90). It used to be a refusal,
|
|
196
|
+
* on the argument that a wizard which loops on one question and not the others
|
|
197
|
+
* is unpredictable — the answer to which turned out to be that every question
|
|
198
|
+
* loops, not that none of them does. The options are printed once; only the
|
|
199
|
+
* question repeats, under one line saying which number was not on the list.
|
|
200
|
+
* `ok: false` now means the human withdrew (Ctrl-D) or ran out of attempts, and
|
|
201
|
+
* the message says which.
|
|
202
|
+
*/
|
|
203
|
+
export function pickOne(streams, prompter, options) {
|
|
204
|
+
streams.out(options.heading);
|
|
205
|
+
options.items.forEach((item, index) => {
|
|
206
|
+
const marker = index === options.defaultIndex ? " (default)" : "";
|
|
207
|
+
streams.out(` ${String(index + 1)}. ${options.label(item)}${marker}\n`);
|
|
208
|
+
});
|
|
209
|
+
const range = `1-${String(options.items.length)}`;
|
|
210
|
+
const picked = askUntil(streams, prompter, options.prompt, (answer) => {
|
|
211
|
+
const typed = answer.trim();
|
|
212
|
+
if (typed.length === 0 && options.defaultIndex !== null) {
|
|
213
|
+
return { ok: true, value: options.items[options.defaultIndex] };
|
|
214
|
+
}
|
|
215
|
+
const index = Number.parseInt(typed, 10);
|
|
216
|
+
if (!Number.isInteger(index) || index < 1 || index > options.items.length) {
|
|
217
|
+
return { ok: false, reason: `${JSON.stringify(typed)} is not one of ${range}` };
|
|
218
|
+
}
|
|
219
|
+
return { ok: true, value: options.items[index - 1] };
|
|
220
|
+
});
|
|
221
|
+
if (!picked.ok) {
|
|
222
|
+
return {
|
|
223
|
+
ok: false,
|
|
224
|
+
message: picked.reason === "aborted"
|
|
225
|
+
? `nothing was picked from ${range}`
|
|
226
|
+
: `no answer in ${range} after ${String(picked.attempts)} attempts`,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
return { ok: true, item: picked.value };
|
|
230
|
+
}
|
|
231
|
+
// ---------------------------------------------------------------------------
|
|
232
|
+
// Collection
|
|
233
|
+
// ---------------------------------------------------------------------------
|
|
234
|
+
/**
|
|
235
|
+
* A Google app password as the account page displays it: four groups of four
|
|
236
|
+
* characters separated by single spaces (APRV-97, APRV-98). Matched on SHAPE
|
|
237
|
+
* (`\S{4}` groups, `\s` separators) rather than on an alphabet, because the
|
|
238
|
+
* first field run met a 19-character paste that a `[a-z]`-only pattern did not
|
|
239
|
+
* recognise, and a copy from a browser can carry U+00A0 for the space. The
|
|
240
|
+
* count is printed and the strip is a `[Y/n]` question, so a genuine password
|
|
241
|
+
* of this exact shape that contains spaces is one keystroke from being kept.
|
|
242
|
+
*/
|
|
243
|
+
const DISPLAY_SPACED_APP_PASSWORD = /^\S{4}\s\S{4}\s\S{4}\s\S{4}$/u;
|
|
244
|
+
/** The built-in prompts, one per {@link CredentialSpec.kind}. */
|
|
245
|
+
function collectDefault(streams, prompter, spec) {
|
|
246
|
+
if (spec.kind === "secret") {
|
|
247
|
+
const read = prompter.readSecret(`${spec.label} (not echoed): `);
|
|
248
|
+
if (!read.ok)
|
|
249
|
+
return { kind: "abort", message: `the entry for ${spec.name} was aborted` };
|
|
250
|
+
let value = read.value;
|
|
251
|
+
if (value.length === 0) {
|
|
252
|
+
return spec.required
|
|
253
|
+
? { kind: "abort", message: `${spec.name} is required and nothing was entered` }
|
|
254
|
+
: { kind: "skip" };
|
|
255
|
+
}
|
|
256
|
+
// The count, never the value (APRV-97). What setup collects are app
|
|
257
|
+
// passwords and tokens whose lengths are public, so a count leaks nothing
|
|
258
|
+
// and turns "blind paste, then a provider's 535" into "received 19".
|
|
259
|
+
streams.out(` received ${String(value.length)} character(s)\n`);
|
|
260
|
+
// Outer whitespace is a paste artefact far more often than it is part of a
|
|
261
|
+
// secret (APRV-98: a copy from a web page arrived with a trailing space,
|
|
262
|
+
// and a provider's 535 was the only symptom). It is trimmed, and said.
|
|
263
|
+
const trimmed = value.trim();
|
|
264
|
+
if (trimmed.length !== value.length) {
|
|
265
|
+
streams.out(` trimmed ${String(value.length - trimmed.length)} leading/trailing whitespace character(s); ${String(trimmed.length)} remain\n`);
|
|
266
|
+
value = trimmed;
|
|
267
|
+
}
|
|
268
|
+
if (DISPLAY_SPACED_APP_PASSWORD.test(value)) {
|
|
269
|
+
// Google shows app passwords as four groups with display spaces, and
|
|
270
|
+
// Gmail's AUTH rejects the spaced form. The shape is unmistakable, so
|
|
271
|
+
// the offer defaults to yes; it is still an offer, because a secret
|
|
272
|
+
// that genuinely contains spaces is stored exactly as typed.
|
|
273
|
+
const strip = prompter.confirm(` that is the shape of a Google app password pasted with its display spaces (16 letters shown as 4 groups); store the 16 characters without the spaces?`, false);
|
|
274
|
+
if (strip) {
|
|
275
|
+
value = value.replace(/\s/gu, "");
|
|
276
|
+
streams.out(` storing ${String(value.length)} character(s)\n`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return { kind: "value", value };
|
|
280
|
+
}
|
|
281
|
+
if (spec.kind === "choice") {
|
|
282
|
+
const choices = spec.choices ?? [];
|
|
283
|
+
if (choices.length === 0) {
|
|
284
|
+
return { kind: "abort", message: `${spec.name} declares no choices to pick from` };
|
|
285
|
+
}
|
|
286
|
+
const defaultIndex = choices.findIndex((choice) => choice.value === spec.default);
|
|
287
|
+
const picked = pickOne(streams, prompter, {
|
|
288
|
+
heading: `\n${spec.label} — ${spec.describe}:\n`,
|
|
289
|
+
items: choices,
|
|
290
|
+
label: (choice) => `${choice.value} — ${choice.describe}`,
|
|
291
|
+
prompt: `which one? [1-${String(choices.length)}]: `,
|
|
292
|
+
defaultIndex: defaultIndex === -1 ? null : defaultIndex,
|
|
293
|
+
});
|
|
294
|
+
if (!picked.ok)
|
|
295
|
+
return { kind: "abort", message: `${spec.name}: ${picked.message}` };
|
|
296
|
+
return { kind: "value", value: picked.item.value };
|
|
297
|
+
}
|
|
298
|
+
// A config value, asked until it is one (APRV-90). The spec's OWN validator
|
|
299
|
+
// runs here rather than only after collection, so a mistyped port is one line
|
|
300
|
+
// and the same question instead of an exit code and a help page. The sentence
|
|
301
|
+
// is unchanged either way: it is the adapter's refusal, the one the operator
|
|
302
|
+
// would have been shown at send time.
|
|
303
|
+
const suffix = spec.default === undefined ? "" : ` [${spec.default}]`;
|
|
304
|
+
const asked = askUntil(streams, prompter, `${spec.label}${suffix}: `, (answer) => {
|
|
305
|
+
const typed = answer.trim();
|
|
306
|
+
const value = typed.length === 0 ? (spec.default ?? "") : typed;
|
|
307
|
+
if (value.length === 0) {
|
|
308
|
+
// `null` is "nothing to store", which is legitimate for an optional
|
|
309
|
+
// spec and is the one thing a required spec may not be answered with.
|
|
310
|
+
return spec.required
|
|
311
|
+
? { ok: false, reason: `${spec.name} is required; nothing was entered` }
|
|
312
|
+
: { ok: true, value: null };
|
|
313
|
+
}
|
|
314
|
+
const verdict = spec.validate?.(value) ?? { ok: true };
|
|
315
|
+
return verdict.ok ? { ok: true, value } : { ok: false, reason: verdict.message };
|
|
316
|
+
});
|
|
317
|
+
if (!asked.ok) {
|
|
318
|
+
return {
|
|
319
|
+
kind: "abort",
|
|
320
|
+
message: asked.reason === "aborted"
|
|
321
|
+
? `the entry for ${spec.name} was aborted`
|
|
322
|
+
: `${spec.name}: no valid value after ${String(asked.attempts)} attempts`,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
return asked.value === null ? { kind: "skip" } : { kind: "value", value: asked.value };
|
|
326
|
+
}
|
|
327
|
+
/** The kind, in the one word the checklist prints. */
|
|
328
|
+
function kindWord(spec) {
|
|
329
|
+
if (spec.kind === "secret")
|
|
330
|
+
return "secret";
|
|
331
|
+
if (spec.kind === "choice")
|
|
332
|
+
return "choice";
|
|
333
|
+
return "config";
|
|
334
|
+
}
|
|
335
|
+
// ---------------------------------------------------------------------------
|
|
336
|
+
// The flow
|
|
337
|
+
// ---------------------------------------------------------------------------
|
|
338
|
+
/**
|
|
339
|
+
* Run one credential conversation, start to finish. Never throws.
|
|
340
|
+
*
|
|
341
|
+
* The caller has already done everything that is its own business: flags, the
|
|
342
|
+
* terminal check, the human-only gate, and resolving the passphrase out of the
|
|
343
|
+
* environment. What arrives here is a manifest and somewhere to put it.
|
|
344
|
+
*/
|
|
345
|
+
export async function runCredentialFlow(flow) {
|
|
346
|
+
const { streams, prompter, specs, destination, labels } = flow;
|
|
347
|
+
const hooks = flow.hooks ?? {};
|
|
348
|
+
const where = destination.where();
|
|
349
|
+
const phrases = PLAN_PHRASES[destination.kind];
|
|
350
|
+
const nothing = {
|
|
351
|
+
code: EXIT_OK,
|
|
352
|
+
written: [],
|
|
353
|
+
skipped: [],
|
|
354
|
+
verified: "not-attempted",
|
|
355
|
+
};
|
|
356
|
+
// (1) What this is, and what must already be true.
|
|
357
|
+
streams.out(`${labels.title}\n`);
|
|
358
|
+
if (labels.prereq !== undefined)
|
|
359
|
+
streams.out(`${labels.prereq}\n`);
|
|
360
|
+
// (2) The whole demand, before the first question.
|
|
361
|
+
streams.out(`\nIt will ask for ${String(specs.length)} value(s), all of them into ${where}:\n`);
|
|
362
|
+
for (const spec of specs) {
|
|
363
|
+
streams.out(` ${spec.name} (${kindWord(spec)}${spec.required ? "" : ", optional"}) — ${spec.describe}\n`);
|
|
364
|
+
}
|
|
365
|
+
streams.out("\n");
|
|
366
|
+
// (3) The preflight. For a vault this is where the passphrase is proved, and
|
|
367
|
+
// it is here rather than at the first write so that a wrong one refuses
|
|
368
|
+
// before a password has been typed.
|
|
369
|
+
const present = destination.present();
|
|
370
|
+
if (!present.ok) {
|
|
371
|
+
streams.err(`${renderRefusal(style(), present.code, present.message)}\n`);
|
|
372
|
+
streams.err(` nothing was collected and nothing was written to ${where}\n`);
|
|
373
|
+
return { ...nothing, code: present.exitCode };
|
|
374
|
+
}
|
|
375
|
+
// (4) What is already there, and whether to replace it.
|
|
376
|
+
const plan = planWrites(streams, prompter, present.names, where, specs.map((spec) => spec.name), phrases);
|
|
377
|
+
const wanted = specs.filter((spec) => plan.write.includes(spec.name));
|
|
378
|
+
if (wanted.length === 0) {
|
|
379
|
+
reportLeftAlone(streams, where, plan.skipped, phrases);
|
|
380
|
+
streams.out(`nothing to do: every name is already in ${where}\n`);
|
|
381
|
+
return { ...nothing, skipped: plan.skipped };
|
|
382
|
+
}
|
|
383
|
+
// (5) Collection, in manifest order. A skipped name is never asked for.
|
|
384
|
+
const values = {};
|
|
385
|
+
for (const spec of wanted) {
|
|
386
|
+
let collected = hooks.collect === undefined
|
|
387
|
+
? collectDefault(streams, prompter, spec)
|
|
388
|
+
: await hooks.collect(spec, values);
|
|
389
|
+
// Discovery is the second chance, not the first: a value the operator
|
|
390
|
+
// typed is never overwritten by one the service reported. The hook runs
|
|
391
|
+
// only where collection left a hole, which for a channel is exactly the
|
|
392
|
+
// spec whose value the service is the authority on.
|
|
393
|
+
if (collected.kind === "skip" && hooks.discover !== undefined) {
|
|
394
|
+
collected = await hooks.discover(spec, values);
|
|
395
|
+
}
|
|
396
|
+
if (collected.kind === "refused") {
|
|
397
|
+
// The hook has already said what happened and why, in the words of the
|
|
398
|
+
// far end it was talking to. Nothing is added here.
|
|
399
|
+
return { ...nothing, code: collected.code, skipped: plan.skipped };
|
|
400
|
+
}
|
|
401
|
+
if (collected.kind === "abort") {
|
|
402
|
+
streams.err(`approval: ${collected.message}; nothing was written to ${where}\n`);
|
|
403
|
+
return { ...nothing, code: EXIT_USAGE, skipped: plan.skipped };
|
|
404
|
+
}
|
|
405
|
+
if (collected.kind === "skip") {
|
|
406
|
+
if (spec.required) {
|
|
407
|
+
streams.err(`approval: ${spec.name} is required and no value was given; nothing was written to ${where}\n`);
|
|
408
|
+
return { ...nothing, code: EXIT_USAGE, skipped: plan.skipped };
|
|
409
|
+
}
|
|
410
|
+
continue;
|
|
411
|
+
}
|
|
412
|
+
const verdict = spec.validate?.(collected.value) ?? { ok: true };
|
|
413
|
+
if (!verdict.ok) {
|
|
414
|
+
// The backstop, not the front line (APRV-90). A value the operator TYPED
|
|
415
|
+
// has already been validated inside the prompt loop and asked for again
|
|
416
|
+
// if it did not fit; what reaches here and fails is a value a
|
|
417
|
+
// {@link FlowHooks.collect} or {@link FlowHooks.discover} hook produced,
|
|
418
|
+
// which no re-prompt can fix because no question was asked. The sentence
|
|
419
|
+
// is the adapter's own refusal either way.
|
|
420
|
+
streams.err(`approval: ${spec.name}: ${verdict.message}; nothing was written to ${where}\n`);
|
|
421
|
+
return { ...nothing, code: EXIT_USAGE, skipped: plan.skipped };
|
|
422
|
+
}
|
|
423
|
+
values[spec.name] = collected.value;
|
|
424
|
+
}
|
|
425
|
+
// (6) The cross-field rule, before anything is stored.
|
|
426
|
+
const crossField = hooks.check?.(values, plan.skipped) ?? null;
|
|
427
|
+
if (crossField !== null) {
|
|
428
|
+
streams.err(`approval: ${crossField}; nothing was written to ${where}\n`);
|
|
429
|
+
return { ...nothing, code: EXIT_USAGE, skipped: plan.skipped };
|
|
430
|
+
}
|
|
431
|
+
// (7) The writes, in manifest order, with no rollback on a partial failure.
|
|
432
|
+
const written = [];
|
|
433
|
+
for (const spec of wanted) {
|
|
434
|
+
const value = values[spec.name];
|
|
435
|
+
if (value === undefined)
|
|
436
|
+
continue;
|
|
437
|
+
const stored = destination.write(spec.name, value);
|
|
438
|
+
if (!stored.ok) {
|
|
439
|
+
streams.err(`${renderRefusal(style(), stored.code, stored.message)}\n`);
|
|
440
|
+
streams.err(written.length === 0
|
|
441
|
+
? ` nothing was written to ${where}\n`
|
|
442
|
+
: ` ${String(written.length)} value(s) had already landed in ${where}: ${written.join(", ")}. They are NOT rolled back — undoing a write this verb did not understand would be a destructive act taken on its own authority — so re-run this verb, or remove them by hand\n`);
|
|
443
|
+
return { code: stored.exitCode, written, skipped: plan.skipped, verified: "not-attempted" };
|
|
444
|
+
}
|
|
445
|
+
written.push(spec.name);
|
|
446
|
+
}
|
|
447
|
+
// (8) The proof, against the far end, over what was just stored.
|
|
448
|
+
let verified = "not-attempted";
|
|
449
|
+
let verifyCode = EXIT_OK;
|
|
450
|
+
if (hooks.verify !== undefined) {
|
|
451
|
+
const outcome = await hooks.verify(values, { written, skipped: plan.skipped });
|
|
452
|
+
if (outcome.declined === true) {
|
|
453
|
+
verified = "declined";
|
|
454
|
+
streams.out(outcome.detail);
|
|
455
|
+
}
|
|
456
|
+
else if (outcome.ok) {
|
|
457
|
+
verified = "passed";
|
|
458
|
+
streams.out(outcome.detail);
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
verified = "failed";
|
|
462
|
+
verifyCode = EXIT_INTEGRITY;
|
|
463
|
+
streams.err(outcome.detail);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
// (9) The report. Names, counts, and a path; never a value.
|
|
467
|
+
streams.out(`\nstored ${String(written.length)} value(s) in ${where}: ${written.join(", ")}\n`);
|
|
468
|
+
reportLeftAlone(streams, where, plan.skipped, phrases);
|
|
469
|
+
if (labels.nextSteps !== undefined && labels.nextSteps.length > 0) {
|
|
470
|
+
streams.out("\n");
|
|
471
|
+
for (const line of labels.nextSteps)
|
|
472
|
+
streams.out(`${line}\n`);
|
|
473
|
+
}
|
|
474
|
+
return { code: verifyCode, written, skipped: plan.skipped, verified };
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=setup-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-flow.js","sourceRoot":"","sources":["../../../src/cli/setup-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval setup service` — the login service that runs the ambient runtime
|
|
3
|
+
* (SPEC.md §10.2, APRV-110).
|
|
4
|
+
*
|
|
5
|
+
* `approval up` is a foreground process. This verb writes the one file that
|
|
6
|
+
* makes it start at login and stay started: a launchd user agent on macOS, or a
|
|
7
|
+
* systemd user unit on Linux. It is the fifth member of the `setup` family and
|
|
8
|
+
* it obeys the family's rules — interactive by refusal, human-only, appending
|
|
9
|
+
* nothing to the log, editing no policy — with two of its own.
|
|
10
|
+
*
|
|
11
|
+
* ## It never copies a value
|
|
12
|
+
*
|
|
13
|
+
* A unit file is world-readable configuration that survives reboots and gets
|
|
14
|
+
* backed up. A bot token in one is a bot token in a backup. So the unit NAMES
|
|
15
|
+
* where the environment comes from and never carries it:
|
|
16
|
+
*
|
|
17
|
+
* - by default it runs a WRAPPER the human reads in the printed unit —
|
|
18
|
+
* `eval "$(approval env)"` and then `exec approval up` — so the keystore
|
|
19
|
+
* references stay in the keystore and `approval env` stays the only thing
|
|
20
|
+
* that resolves them (SPEC.md §11.1 invariant 7: nothing loads that file
|
|
21
|
+
* implicitly, and here it is a human's line in a file they approved);
|
|
22
|
+
* - or, with `--env-file`, it points at a file THE OPERATOR AUTHORED, which
|
|
23
|
+
* this verb neither writes nor reads.
|
|
24
|
+
*
|
|
25
|
+
* ## It prints the unit before it writes it, and it does not arm it
|
|
26
|
+
*
|
|
27
|
+
* The whole file goes to stdout first, and nothing is written until the operator
|
|
28
|
+
* confirms. Loading it is a separate act: this verb prints the exact
|
|
29
|
+
* `launchctl` or `systemctl` line and stops there. A login service is a standing
|
|
30
|
+
* capability on someone's machine — it will start a process that holds a
|
|
31
|
+
* credential and can put prompts on a phone — and a wizard that armed one as a
|
|
32
|
+
* side effect of writing a file would be making that decision on the operator's
|
|
33
|
+
* behalf. Printing the command costs one paste and buys an explicit act.
|
|
34
|
+
*
|
|
35
|
+
* ## Logs never go into `.approval/`
|
|
36
|
+
*
|
|
37
|
+
* The service's stdout and stderr go where the operator chooses, defaulting to
|
|
38
|
+
* the platform's own log home. A path inside the approval home is REFUSED:
|
|
39
|
+
* `.approval/` holds the log, the queue projection, the payload store, the
|
|
40
|
+
* vault and the environment source map, and a service that appended its console
|
|
41
|
+
* output beside them would put unverifiable text in the one directory whose
|
|
42
|
+
* contents are supposed to mean something.
|
|
43
|
+
*/
|
|
44
|
+
import type { Streams } from "./main.js";
|
|
45
|
+
import { type SetupDeps } from "./setup-common.js";
|
|
46
|
+
/** The two service managers this verb writes for. */
|
|
47
|
+
export type ServicePlatform = "launchd" | "systemd";
|
|
48
|
+
/** The conventional names. `--label` overrides both. */
|
|
49
|
+
export declare const LAUNCHD_LABEL = "md.approval.up";
|
|
50
|
+
export declare const SYSTEMD_UNIT = "approval-up";
|
|
51
|
+
/** Which manager this machine has, or `null` when it has neither. */
|
|
52
|
+
export declare function platformFor(platform: NodeJS.Platform): ServicePlatform | null;
|
|
53
|
+
/** Where the unit file belongs, for a platform and a label. */
|
|
54
|
+
export declare function unitPathFor(platform: ServicePlatform, label: string, home: string): string;
|
|
55
|
+
/** Where the platform keeps a user's own logs. */
|
|
56
|
+
export declare function defaultLogsDir(platform: ServicePlatform, home: string): string;
|
|
57
|
+
/** The command that arms the written unit, printed and never run. */
|
|
58
|
+
export declare function armCommand(platform: ServicePlatform, label: string, path: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* The command that disarms it, printed before the file is removed.
|
|
61
|
+
*
|
|
62
|
+
* Takes no path, unlike {@link armCommand}: launchd boots a service OUT by its
|
|
63
|
+
* label, and the plist it was booted in from may already be gone.
|
|
64
|
+
*/
|
|
65
|
+
export declare function disarmCommand(platform: ServicePlatform, label: string): string;
|
|
66
|
+
/** Everything a unit is generated from, all of it already resolved. */
|
|
67
|
+
export interface ServicePlan {
|
|
68
|
+
platform: ServicePlatform;
|
|
69
|
+
label: string;
|
|
70
|
+
/** The unit file this would be written to. */
|
|
71
|
+
path: string;
|
|
72
|
+
/** The primary checkout the runtime is started in. */
|
|
73
|
+
workingDir: string;
|
|
74
|
+
/** The `approval` invocation, as argv words. */
|
|
75
|
+
exec: string[];
|
|
76
|
+
/** An operator-authored EnvironmentFile, or `null` for the `approval env` wrapper. */
|
|
77
|
+
envFile: string | null;
|
|
78
|
+
outLog: string;
|
|
79
|
+
errLog: string;
|
|
80
|
+
/** The variable NAMES the runtime will look for. Printed as a comment only. */
|
|
81
|
+
variables: string[];
|
|
82
|
+
}
|
|
83
|
+
/** One `sh -lc` script: the wrapper the operator reads inside the unit. */
|
|
84
|
+
export declare function wrapperScript(plan: ServicePlan): string;
|
|
85
|
+
/** The whole unit file, as the operator will read it and as it will be written. */
|
|
86
|
+
export declare function renderUnit(plan: ServicePlan): string;
|
|
87
|
+
/**
|
|
88
|
+
* The approval invocation this process was started as.
|
|
89
|
+
*
|
|
90
|
+
* `node dist/src/cli/main.js` and the installed `approval` bin are both
|
|
91
|
+
* legitimate, and a unit that named the wrong one would fail at login rather
|
|
92
|
+
* than here. `--exec` overrides for the case neither guess fits.
|
|
93
|
+
*/
|
|
94
|
+
export declare function execWords(override: string | null, argv: readonly string[]): string[];
|
|
95
|
+
/** `approval setup service` — write the login unit. HUMAN-ONLY, INTERACTIVE. */
|
|
96
|
+
export declare function commandSetupService(argv: string[], streams: Streams, cwd: string, deps?: SetupDeps): number;
|