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,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The CLI edge of `approval log checkpoint` (APRV-220).
|
|
3
|
+
*
|
|
4
|
+
* As everywhere else in this CLI, no logic lives here: `core/checkpoint.ts`
|
|
5
|
+
* signs and appends, and this file splits argv, decides WHERE the private key
|
|
6
|
+
* may come from, maps the result onto the frozen exit table, and decides what a
|
|
7
|
+
* terminal sees.
|
|
8
|
+
*
|
|
9
|
+
* ## Where the key may come from, and why that decision is NOT here any more
|
|
10
|
+
*
|
|
11
|
+
* `core/checkpoint.ts` takes the private key as a value and reads it from
|
|
12
|
+
* nowhere. That is deliberate: custody is a policy question, and answering it in
|
|
13
|
+
* one place means there is one file to read to learn every way a checkpoint key
|
|
14
|
+
* can reach a signature. Until APRV-257 that file was this one, because a
|
|
15
|
+
* terminal was the only place a checkpoint could be signed. The channel tap
|
|
16
|
+
* added two more callers, so the decision MOVED to `cli/checkpoint-tap.ts`
|
|
17
|
+
* rather than being copied into them, and this verb resolves its key with
|
|
18
|
+
* everyone else's function. The property is unchanged; the file holding it is
|
|
19
|
+
* not.
|
|
20
|
+
*/
|
|
21
|
+
import { isAbsolute, resolve } from "node:path";
|
|
22
|
+
import { appendCheckpoint } from "../core/checkpoint.js";
|
|
23
|
+
import { HUMAN_ACTOR_ENV, resolveHumanActor } from "../core/attest.js";
|
|
24
|
+
import { resolveCheckpointKey } from "./checkpoint-tap.js";
|
|
25
|
+
import { boolFlag, parseFlags, stringFlag } from "./args.js";
|
|
26
|
+
import { EXIT_INTEGRITY, EXIT_IO, EXIT_OK, EXIT_USAGE } from "./exit-codes.js";
|
|
27
|
+
import { LOG_CHECKPOINT_HELP } from "./help.js";
|
|
28
|
+
import { refusal as renderRefusal, style } from "./style.js";
|
|
29
|
+
import { usageErrorText } from "./usage.js";
|
|
30
|
+
const CHECKPOINT_FLAGS = {
|
|
31
|
+
"--log": "string",
|
|
32
|
+
"--as": "string",
|
|
33
|
+
"--key-file": "string",
|
|
34
|
+
"--vault": "string",
|
|
35
|
+
"--policy": "string",
|
|
36
|
+
"--dir": "string",
|
|
37
|
+
"--json": "boolean",
|
|
38
|
+
"--help": "boolean",
|
|
39
|
+
"-h": "boolean",
|
|
40
|
+
};
|
|
41
|
+
const DEFAULT_LOG_PATH = ".approval/log/events.jsonl";
|
|
42
|
+
function absolute(path, cwd) {
|
|
43
|
+
return isAbsolute(path) ? path : resolve(cwd, path);
|
|
44
|
+
}
|
|
45
|
+
function usageError(streams, json, message) {
|
|
46
|
+
if (json)
|
|
47
|
+
streams.err(`${JSON.stringify({ ok: false, error: { code: "usage", message } })}\n`);
|
|
48
|
+
else
|
|
49
|
+
streams.err(usageErrorText(message, LOG_CHECKPOINT_HELP));
|
|
50
|
+
return EXIT_USAGE;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The exit code for a refusal.
|
|
54
|
+
*
|
|
55
|
+
* `log-corrupt` and `log-torn-tail` are integrity facts about the chain and go
|
|
56
|
+
* where `log verify` puts them; everything else here is a filesystem, key, or
|
|
57
|
+
* writer fact, which is exit 4. Nothing in this verb reports a missing key as
|
|
58
|
+
* corruption: an operator without a key has not got a broken log.
|
|
59
|
+
*/
|
|
60
|
+
function refusalExit(code) {
|
|
61
|
+
return code === "log-corrupt" || code === "log-torn-tail" ? EXIT_INTEGRITY : EXIT_IO;
|
|
62
|
+
}
|
|
63
|
+
export function commandLogCheckpoint(argv, streams, cwd) {
|
|
64
|
+
const json = argv.includes("--json");
|
|
65
|
+
const parsed = parseFlags(argv, CHECKPOINT_FLAGS);
|
|
66
|
+
if (!parsed.ok)
|
|
67
|
+
return usageError(streams, json, parsed.message);
|
|
68
|
+
if (boolFlag(parsed.flags, "--help") || boolFlag(parsed.flags, "-h")) {
|
|
69
|
+
streams.out(`${LOG_CHECKPOINT_HELP}\n`);
|
|
70
|
+
return EXIT_OK;
|
|
71
|
+
}
|
|
72
|
+
const extra = parsed.positionals[0];
|
|
73
|
+
if (extra !== undefined) {
|
|
74
|
+
return usageError(streams, json, `unexpected argument ${JSON.stringify(extra)}`);
|
|
75
|
+
}
|
|
76
|
+
// The human-only rule, spelled the way `policy attest` and `vault set` spell
|
|
77
|
+
// it. Refused here before any key is read, so a wrong identity never reaches
|
|
78
|
+
// the vault: an agent that could open the vault by getting the actor wrong
|
|
79
|
+
// would be an agent that could open the vault.
|
|
80
|
+
const asFlag = stringFlag(parsed.flags, "--as");
|
|
81
|
+
const actor = resolveHumanActor(asFlag === null ? {} : { actor: asFlag });
|
|
82
|
+
if (actor === null) {
|
|
83
|
+
return usageError(streams, json, asFlag === null
|
|
84
|
+
? `no human identity: set ${HUMAN_ACTOR_ENV}=human:<id> or pass --as human:<id>`
|
|
85
|
+
: `--as expects a human identity matching human:<id>, got ${JSON.stringify(asFlag)}; \`approval log checkpoint\` is human-only and an agent: or system: actor cannot perform it`);
|
|
86
|
+
}
|
|
87
|
+
const logFlag = stringFlag(parsed.flags, "--log");
|
|
88
|
+
const logPath = logFlag === null ? absolute(DEFAULT_LOG_PATH, cwd) : absolute(logFlag, cwd);
|
|
89
|
+
const policyFlag = stringFlag(parsed.flags, "--policy");
|
|
90
|
+
const dirFlag = stringFlag(parsed.flags, "--dir");
|
|
91
|
+
const policyWhere = policyFlag !== null
|
|
92
|
+
? { file: absolute(policyFlag, cwd) }
|
|
93
|
+
: { dir: dirFlag === null ? cwd : absolute(dirFlag, cwd) };
|
|
94
|
+
const key = resolveCheckpointKey(stringFlag(parsed.flags, "--key-file"), logPath, stringFlag(parsed.flags, "--vault"), policyWhere, cwd);
|
|
95
|
+
if (!key.ok)
|
|
96
|
+
return reportRefusal(key.code, key.message, streams, json);
|
|
97
|
+
const result = appendCheckpoint(logPath, key.privateKey, actor);
|
|
98
|
+
if (!result.ok)
|
|
99
|
+
return reportRefusal(result.code, result.message, streams, json);
|
|
100
|
+
return reportSigned(result, streams, json);
|
|
101
|
+
}
|
|
102
|
+
function reportRefusal(code, message, streams, json) {
|
|
103
|
+
if (json) {
|
|
104
|
+
streams.err(`${JSON.stringify({ ok: false, error: { code, message } })}\n`);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
streams.err(`${renderRefusal(style({ json }), code, message)}\n`);
|
|
108
|
+
}
|
|
109
|
+
return refusalExit(code);
|
|
110
|
+
}
|
|
111
|
+
function reportSigned(result, streams, json) {
|
|
112
|
+
if (json) {
|
|
113
|
+
streams.out(`${JSON.stringify({
|
|
114
|
+
ok: true,
|
|
115
|
+
seq: result.record.seq,
|
|
116
|
+
signed: { seq: result.head.seq, hash: result.head.hash },
|
|
117
|
+
key_sha256: result.fingerprint,
|
|
118
|
+
actor: result.record.actor,
|
|
119
|
+
ts: result.record.ts,
|
|
120
|
+
})}\n`);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
streams.out(`checkpoint ${String(result.record.seq)}: signed head seq ${String(result.head.seq)} ${result.head.hash}\n`);
|
|
124
|
+
streams.out(`key ${result.fingerprint}, signed by ${result.record.actor}\n`);
|
|
125
|
+
}
|
|
126
|
+
return EXIT_OK;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=log-checkpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-checkpoint.js","sourceRoot":"","sources":["../../../src/cli/log-checkpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval log sync` (APRV-125) — the pull half of the log ritual, as a verb.
|
|
3
|
+
*
|
|
4
|
+
* ## The ritual this replaces
|
|
5
|
+
*
|
|
6
|
+
* Bringing the committed log up to date used to be a hand-run sequence: stash
|
|
7
|
+
* the working `events.jsonl`, pull, pop the stash, hope. It was our own
|
|
8
|
+
* sanctioned runbook and it was dangerous three ways.
|
|
9
|
+
*
|
|
10
|
+
* 1. It rewound the working log through git while a daemon held it open for
|
|
11
|
+
* append. That is fork 2 of 2026-08-20 (APRV-104's notes): a rewound file
|
|
12
|
+
* under a live appender, and two chains where there was one.
|
|
13
|
+
* 2. It reached the approver's phone as `policy.edit` over a protected path —
|
|
14
|
+
* a true label that told the human nothing about what was happening.
|
|
15
|
+
* 3. `git stash pop` can conflict, and on the day it did, it left conflict
|
|
16
|
+
* markers inside the log file mid-ceremony.
|
|
17
|
+
*
|
|
18
|
+
* The precedent for turning it into a verb is `policy amend` after the seq 2
|
|
19
|
+
* incident: when a hand-ritual proves dangerous, it becomes deterministic code
|
|
20
|
+
* the gate can read.
|
|
21
|
+
*
|
|
22
|
+
* ## The sequence, and why each step is where it is
|
|
23
|
+
*
|
|
24
|
+
* Everything below runs inside ONE hold of the append lockfile. The lock is
|
|
25
|
+
* usually taken per-append; here it spans the whole operation, because an
|
|
26
|
+
* append landing between the snapshot and the restore is precisely the
|
|
27
|
+
* interleaving that forks a chain.
|
|
28
|
+
*
|
|
29
|
+
* 1. **Primary checkout only.** The committed log has one home. A worktree has
|
|
30
|
+
* no business synchronizing it, and `log-sync-not-primary` says so.
|
|
31
|
+
* 2. **Verify before touching anything.** The working chain is walked and its
|
|
32
|
+
* head recorded. Nothing is decided from a log that does not verify.
|
|
33
|
+
* 3. **Snapshot, not stash.** The working log is copied aside, atomically, to
|
|
34
|
+
* a file inside `.approval/`. `git stash` is never used, and the log never
|
|
35
|
+
* routes through git state mutation.
|
|
36
|
+
* 4. **Baseline.** The working LOG is set to the bytes git has at `HEAD`, so
|
|
37
|
+
* the path is clean and a fast-forward merge can move over it. This is a
|
|
38
|
+
* plain write of bytes we already hold, not a checkout: the snapshot from
|
|
39
|
+
* step 3 is the only copy that matters and it is already safe. The queue
|
|
40
|
+
* projection is deliberately NOT baselined here; see the section below.
|
|
41
|
+
* 5. **Fetch, then a fast-forward CHECK, then the projections are discarded,
|
|
42
|
+
* then the merge.** A non-fast-forward is named and refused rather than
|
|
43
|
+
* merged; a merge commit over a log is a merge of two hash chains, which is
|
|
44
|
+
* not a thing that exists.
|
|
45
|
+
* 6. **Payload reconciliation, between the check and the merge.** See the
|
|
46
|
+
* section below: untracked payload files the incoming tree also carries are
|
|
47
|
+
* proved byte-identical and then removed, so the fast-forward has a clean
|
|
48
|
+
* path to write them onto.
|
|
49
|
+
* 7. **Reconcile.** The committed chain must be a prefix of the snapshot, or
|
|
50
|
+
* equal to it, or an extension of it. Anything else is a fork:
|
|
51
|
+
* `log-diverged`, both heads, the first divergent seq, snapshot restored,
|
|
52
|
+
* nothing else touched. The comparison is `core/log-reconcile.ts`, shared
|
|
53
|
+
* with doctor's `log-drift` check.
|
|
54
|
+
* 8. **Projections are REBUILT, never copied back.** QUEUE.md is re-rendered
|
|
55
|
+
* from the reconciled log and the index is reindexed from it. The direction
|
|
56
|
+
* is load-bearing: a projection restored from before the pull would be a
|
|
57
|
+
* screenshot asserting something the log no longer says.
|
|
58
|
+
* 9. **Post-verify**, and only then is the snapshot removed.
|
|
59
|
+
*
|
|
60
|
+
* Any failure at any step restores the snapshot before returning. The working
|
|
61
|
+
* log is never left in a half state, and the snapshot outlives every failure
|
|
62
|
+
* path that could need it.
|
|
63
|
+
*
|
|
64
|
+
* ## Untracked payload files, and why the merge used to stop on them (APRV-225)
|
|
65
|
+
*
|
|
66
|
+
* On 2026-09-02, after a records advance to seq 11361 merged, `log sync` in the
|
|
67
|
+
* primary checkout refused `log-sync-git-failed`: `git merge --ff-only` will not
|
|
68
|
+
* write over an untracked working-tree file, and the advance had committed 33
|
|
69
|
+
* payload files that this checkout already held untracked. Every one of them was
|
|
70
|
+
* byte-identical to the incoming blob — they are content-addressed, so identical
|
|
71
|
+
* by construction — and the only way forward was a hand step: move them aside,
|
|
72
|
+
* sync, put them back.
|
|
73
|
+
*
|
|
74
|
+
* That hand step is now step 6, on the same reasoning as the whole verb: when a
|
|
75
|
+
* hand-ritual is provably safe, it becomes deterministic code, and when it is
|
|
76
|
+
* NOT provably safe it refuses rather than guessing. The proof is per file, and
|
|
77
|
+
* every part of it runs before a single byte is removed:
|
|
78
|
+
*
|
|
79
|
+
* - the local file is **self-addressed** — SHA-256 of its bytes is its own name
|
|
80
|
+
* (the store writes RFC 8785 canonical bytes, so this holds for anything
|
|
81
|
+
* `storePayload` wrote); the `{"$ref": …}` reference form is the store's
|
|
82
|
+
* documented exception and is carried on byte equality alone.
|
|
83
|
+
* - the local bytes **equal the incoming blob**, compared as bytes read through
|
|
84
|
+
* `git show`. Not git's blob id: that is SHA-1 over a header plus the content
|
|
85
|
+
* and has nothing to do with the SHA-256 content address the store uses, so
|
|
86
|
+
* comparing names to blob ids would be comparing two different hashes of two
|
|
87
|
+
* different things and calling the disagreement a fork.
|
|
88
|
+
*
|
|
89
|
+
* A payload that fails either test refuses `log-sync-payload-mismatch`, naming
|
|
90
|
+
* the file. A payload is the material evidence an approval bound to: two
|
|
91
|
+
* different versions of one is not a merge conflict to be resolved, it is a
|
|
92
|
+
* question about which bytes a human said yes to. Nothing is merged, nothing is
|
|
93
|
+
* appended, and the working tree is left as it was found.
|
|
94
|
+
*
|
|
95
|
+
* A local payload the incoming tree does **not** carry is not this verb's
|
|
96
|
+
* business and is not touched: it blocks nothing, and it is very likely a
|
|
97
|
+
* payload this checkout has recorded and not yet advanced.
|
|
98
|
+
*
|
|
99
|
+
* ## The queue projection is disposable, and discarded LATE (APRV-292)
|
|
100
|
+
*
|
|
101
|
+
* On 2026-09-07, after a records pull request that carried `.approval/QUEUE.md`
|
|
102
|
+
* as well as the log, `log sync` refused twice with git's "local changes to
|
|
103
|
+
* .approval/QUEUE.md would be overwritten", the second time immediately after a
|
|
104
|
+
* hand-run `git checkout -- .approval/QUEUE.md`. The hand step was not wrong,
|
|
105
|
+
* it was just early: the running daemon re-rendered the projection again before
|
|
106
|
+
* the fast-forward reached it.
|
|
107
|
+
*
|
|
108
|
+
* The two files are exposed to different writers, which is why they are handled
|
|
109
|
+
* differently. Nothing can append to the log while this verb runs — sync holds
|
|
110
|
+
* the append lock for the whole ceremony, and every appender takes it. Nothing
|
|
111
|
+
* at all holds the projection: `channels/render-queue.ts`'s `writeQueue` renders
|
|
112
|
+
* and renames `QUEUE.md` on every daemon tick, under no lock, by design (the
|
|
113
|
+
* TTL countdowns in it move even when the log does not, so the file is rewritten
|
|
114
|
+
* whether or not anything was appended). A
|
|
115
|
+
* projection baselined at step 4 can therefore be dirty again by the time `git
|
|
116
|
+
* merge --ff-only` looks at it, and a stale render is enough to stop a pull of
|
|
117
|
+
* the log.
|
|
118
|
+
*
|
|
119
|
+
* So the projection is not baselined with the log. It is **discarded** as the
|
|
120
|
+
* last statement before the merge, which is the narrowest window this verb can
|
|
121
|
+
* offer, and when the merge fails with a projection dirty again the discard and
|
|
122
|
+
* the merge are retried exactly once. What is discarded is a rendering of the
|
|
123
|
+
* log, rebuilt at step 8 from the reconciled log, so there is nothing here to
|
|
124
|
+
* weigh: a projection carries no truth of its own and losing the last render
|
|
125
|
+
* costs nothing but the render. A projection git neither has at `HEAD` nor
|
|
126
|
+
* carries in the incoming tree is left alone, because it can stop no merge —
|
|
127
|
+
* `.approval/index.sqlite` is gitignored, and clearing a cache that blocks
|
|
128
|
+
* nothing would only make the next reader rebuild it.
|
|
129
|
+
*
|
|
130
|
+
* The snapshot the queue still gets is for the REFUSAL path alone: a refusal
|
|
131
|
+
* leaves the whole working tree as it was found, log and projection together.
|
|
132
|
+
* No success path ever copies it back — see step 8.
|
|
133
|
+
*
|
|
134
|
+
* ## This verb appends no event
|
|
135
|
+
*
|
|
136
|
+
* The log records decisions with real-world consequence. A fast-forward pull of
|
|
137
|
+
* the file the log lives in is housekeeping on the container, not a decision
|
|
138
|
+
* about the world, and an event for it would be the log narrating its own
|
|
139
|
+
* filesystem. Nothing here calls `appendEvent`, and the tests pin that the head
|
|
140
|
+
* seq is unchanged by a successful sync (SPEC §10.1, amended APRV-125).
|
|
141
|
+
*/
|
|
142
|
+
import { type LogDrift, type LogRelation } from "../core/log-reconcile.js";
|
|
143
|
+
import type { LogHead } from "../core/verify.js";
|
|
144
|
+
/**
|
|
145
|
+
* The steps, named. They are a public shape because the failure-injection hook
|
|
146
|
+
* takes one, and because a refusal says which step it stopped at.
|
|
147
|
+
*/
|
|
148
|
+
export declare const LOG_SYNC_STEPS: readonly ["primary", "verify", "snapshot", "baseline", "fetch", "ff-check", "payloads", "merge", "reconcile", "projections", "post-verify"];
|
|
149
|
+
export type LogSyncStep = (typeof LOG_SYNC_STEPS)[number];
|
|
150
|
+
/**
|
|
151
|
+
* Machine-readable refusal codes. Frozen public API, printed in the help.
|
|
152
|
+
*
|
|
153
|
+
* `log-diverged` is the one that matters and the one the runbook is written
|
|
154
|
+
* for: it is the only outcome here that means a human has to reconcile two
|
|
155
|
+
* chains by hand, because nothing in this codebase may do it for them.
|
|
156
|
+
*/
|
|
157
|
+
export declare const LOG_SYNC_REFUSAL_CODES: readonly ["log-sync-not-primary", "log-sync-no-branch", "log-sync-unverified", "log-sync-not-fast-forward", "log-sync-payload-mismatch", "log-diverged", "log-sync-locked", "log-sync-git-failed", "log-sync-projection-failed", "log-sync-restore-failed", "log-sync-io"];
|
|
158
|
+
export type LogSyncRefusalCode = (typeof LOG_SYNC_REFUSAL_CODES)[number];
|
|
159
|
+
/** Test-only seams. Nothing in the CLI sets these; the suites do. */
|
|
160
|
+
export interface LogSyncHooks {
|
|
161
|
+
/**
|
|
162
|
+
* Fail just before this step runs, as an injected I/O error would.
|
|
163
|
+
*
|
|
164
|
+
* This exists so the snapshot-restore guarantee can be tested per step
|
|
165
|
+
* rather than argued for. It is a parameter of the FUNCTION and not a CLI
|
|
166
|
+
* flag on purpose: the shipped surface has no way to ask for a failure.
|
|
167
|
+
*/
|
|
168
|
+
failBefore?: LogSyncStep;
|
|
169
|
+
/**
|
|
170
|
+
* Run `run` just before `step`, as a concurrent writer would (APRV-292).
|
|
171
|
+
*
|
|
172
|
+
* The daemon rewrites `QUEUE.md` under no lock, so "the projection is dirty
|
|
173
|
+
* again between the baseline and the merge" is a real interleaving and not a
|
|
174
|
+
* hypothesis. A test that cannot produce it can only assert that the code
|
|
175
|
+
* looks right. Like {@link failBefore} this is a parameter of the function and
|
|
176
|
+
* never a CLI flag: the shipped surface has no way to ask for interference.
|
|
177
|
+
*/
|
|
178
|
+
interfere?: {
|
|
179
|
+
step: LogSyncStep;
|
|
180
|
+
run: () => void;
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
export interface LogSyncOptions {
|
|
184
|
+
cwd: string;
|
|
185
|
+
/** Remote to fetch from. Default `origin`. */
|
|
186
|
+
remote?: string;
|
|
187
|
+
/** Branch to fast-forward onto. Default: the checked-out branch. */
|
|
188
|
+
branch?: string | null;
|
|
189
|
+
hooks?: LogSyncHooks;
|
|
190
|
+
}
|
|
191
|
+
/** What a successful sync did. The `--json` success shape is built from this. */
|
|
192
|
+
export interface LogSyncReport {
|
|
193
|
+
root: string;
|
|
194
|
+
logPath: string;
|
|
195
|
+
remote: string;
|
|
196
|
+
branch: string;
|
|
197
|
+
commitBefore: string;
|
|
198
|
+
commitAfter: string;
|
|
199
|
+
/** How many commits the fast-forward brought in. */
|
|
200
|
+
pulled: number;
|
|
201
|
+
headBefore: LogHead | null;
|
|
202
|
+
headAfter: LogHead | null;
|
|
203
|
+
relation: LogRelation;
|
|
204
|
+
ahead: number;
|
|
205
|
+
behind: number;
|
|
206
|
+
/** True when the snapshot was written back (the working chain was ahead). */
|
|
207
|
+
restored: boolean;
|
|
208
|
+
/**
|
|
209
|
+
* How many untracked payload files were proved byte-identical to the incoming
|
|
210
|
+
* tree and stood aside so the fast-forward could write them (APRV-225).
|
|
211
|
+
*/
|
|
212
|
+
payloadsReconciled: number;
|
|
213
|
+
queue: {
|
|
214
|
+
path: string;
|
|
215
|
+
bytes: number;
|
|
216
|
+
};
|
|
217
|
+
index: "rebuilt" | "absent";
|
|
218
|
+
}
|
|
219
|
+
export type LogSyncResult = {
|
|
220
|
+
ok: true;
|
|
221
|
+
report: LogSyncReport;
|
|
222
|
+
} | {
|
|
223
|
+
ok: false;
|
|
224
|
+
code: LogSyncRefusalCode;
|
|
225
|
+
message: string;
|
|
226
|
+
/** The step that refused, for the report and the tests. */
|
|
227
|
+
step: LogSyncStep;
|
|
228
|
+
/** Present on `log-diverged`: the whole comparison. */
|
|
229
|
+
drift?: LogDrift;
|
|
230
|
+
/** Verbatim git output, for a runbook's quote block. */
|
|
231
|
+
quote?: readonly string[];
|
|
232
|
+
/** True when the working log is back exactly as it was found. */
|
|
233
|
+
restored: boolean;
|
|
234
|
+
};
|
|
235
|
+
/**
|
|
236
|
+
* `approval log sync`, as a function.
|
|
237
|
+
*
|
|
238
|
+
* The CLI wrapper does argv, exit codes, and formatting; everything that could
|
|
239
|
+
* damage a log is here, in one sequence, with one restore path.
|
|
240
|
+
*/
|
|
241
|
+
export declare function logSync(options: LogSyncOptions): LogSyncResult;
|
|
242
|
+
/** A commit, as a human reads one. */
|
|
243
|
+
export declare function short(commit: string): string;
|