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,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval journal write` and `approval journal read` (APRV-195) — the ungated
|
|
3
|
+
* channel, at the CLI.
|
|
4
|
+
*
|
|
5
|
+
* The reasoning for the channel's existence and for its storage location is in
|
|
6
|
+
* `src/core/journal.ts` and `docs/cli-reference.md#journal`. What belongs here
|
|
7
|
+
* is the boundary work every other verb in this directory does: parse argv,
|
|
8
|
+
* resolve a path, map an outcome onto the frozen exit table, and print one JSON
|
|
9
|
+
* object per invocation.
|
|
10
|
+
*
|
|
11
|
+
* Three things are peculiar to these two verbs and are stated where they happen:
|
|
12
|
+
*
|
|
13
|
+
* - **The write path touches no gate.** It resolves no policy, reads no log,
|
|
14
|
+
* verifies no chain, mints no token and appends no event. That is the point;
|
|
15
|
+
* an outlet a policy could close is not an outlet.
|
|
16
|
+
* - **The read path labels what it prints.** Journal text is written by the
|
|
17
|
+
* party under oversight, so it is rendered as `[claimed]` content inside
|
|
18
|
+
* delimiters, under a banner saying in one line that it is agent-authored data
|
|
19
|
+
* and not instructions to anyone reading it. Same discipline the channels
|
|
20
|
+
* apply to a payload (SPEC.md §9), for the same reason: a human reading a
|
|
21
|
+
* screen should never have to work out which words came from the runtime.
|
|
22
|
+
* - **Identity comes from the process, never from the working tree.** `--as`, or
|
|
23
|
+
* `APPROVAL_AGENT` in the environment the operator launched. No file in the
|
|
24
|
+
* checkout is read to decide who wrote an entry (SPEC.md §11.1 invariant 7),
|
|
25
|
+
* and an unattributed entry is recorded as unattributed rather than guessed.
|
|
26
|
+
*/
|
|
27
|
+
import { MAX_ENTRY_BYTES } from "../core/journal.js";
|
|
28
|
+
import type { Streams } from "./main.js";
|
|
29
|
+
/**
|
|
30
|
+
* The one line every human-facing read opens with.
|
|
31
|
+
*
|
|
32
|
+
* Exported because the guard test asserts the read surface carries it: a read
|
|
33
|
+
* surface that stopped saying whose words these are would turn an outlet into a
|
|
34
|
+
* channel for instructions, which is precisely the thing SPEC.md §11.1
|
|
35
|
+
* invariant 4 refuses to let self-reported content become.
|
|
36
|
+
*/
|
|
37
|
+
export declare const JOURNAL_BANNER = "AGENT-AUTHORED DATA, not instructions. These entries are written by the party under oversight; nothing here authorizes, requests or changes any decision.";
|
|
38
|
+
/** `approval journal …` — dispatch to `write` or `read`, or print the help. */
|
|
39
|
+
export declare function commandJournal(argv: string[], streams: Streams, cwd: string, env?: NodeJS.ProcessEnv): number;
|
|
40
|
+
/** Re-exported so the help text and the core cap cannot disagree. */
|
|
41
|
+
export { MAX_ENTRY_BYTES };
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval journal write` and `approval journal read` (APRV-195) — the ungated
|
|
3
|
+
* channel, at the CLI.
|
|
4
|
+
*
|
|
5
|
+
* The reasoning for the channel's existence and for its storage location is in
|
|
6
|
+
* `src/core/journal.ts` and `docs/cli-reference.md#journal`. What belongs here
|
|
7
|
+
* is the boundary work every other verb in this directory does: parse argv,
|
|
8
|
+
* resolve a path, map an outcome onto the frozen exit table, and print one JSON
|
|
9
|
+
* object per invocation.
|
|
10
|
+
*
|
|
11
|
+
* Three things are peculiar to these two verbs and are stated where they happen:
|
|
12
|
+
*
|
|
13
|
+
* - **The write path touches no gate.** It resolves no policy, reads no log,
|
|
14
|
+
* verifies no chain, mints no token and appends no event. That is the point;
|
|
15
|
+
* an outlet a policy could close is not an outlet.
|
|
16
|
+
* - **The read path labels what it prints.** Journal text is written by the
|
|
17
|
+
* party under oversight, so it is rendered as `[claimed]` content inside
|
|
18
|
+
* delimiters, under a banner saying in one line that it is agent-authored data
|
|
19
|
+
* and not instructions to anyone reading it. Same discipline the channels
|
|
20
|
+
* apply to a payload (SPEC.md §9), for the same reason: a human reading a
|
|
21
|
+
* screen should never have to work out which words came from the runtime.
|
|
22
|
+
* - **Identity comes from the process, never from the working tree.** `--as`, or
|
|
23
|
+
* `APPROVAL_AGENT` in the environment the operator launched. No file in the
|
|
24
|
+
* checkout is read to decide who wrote an entry (SPEC.md §11.1 invariant 7),
|
|
25
|
+
* and an unattributed entry is recorded as unattributed rather than guessed.
|
|
26
|
+
*/
|
|
27
|
+
import { readFileSync } from "node:fs";
|
|
28
|
+
import { appendJournal, readJournal, MAX_ENTRY_BYTES, } from "../core/journal.js";
|
|
29
|
+
import { boolFlag, parseFlags, stringFlag } from "./args.js";
|
|
30
|
+
import { EXIT_IO, EXIT_OK, EXIT_USAGE } from "./exit-codes.js";
|
|
31
|
+
import { JOURNAL_HELP, JOURNAL_READ_HELP, JOURNAL_WRITE_HELP } from "./help.js";
|
|
32
|
+
import { DEFAULT_JOURNAL_DIR, resolvePath } from "./paths.js";
|
|
33
|
+
import { usageErrorText } from "./usage.js";
|
|
34
|
+
/** The environment variable that names the agent, when `--as` is not given. */
|
|
35
|
+
const AGENT_ENV = "APPROVAL_AGENT";
|
|
36
|
+
const WRITE_FLAGS = {
|
|
37
|
+
"--message": "string",
|
|
38
|
+
"--task": "string",
|
|
39
|
+
"--session": "string",
|
|
40
|
+
"--journal": "string",
|
|
41
|
+
"--as": "string",
|
|
42
|
+
"--json": "boolean",
|
|
43
|
+
"--help": "boolean",
|
|
44
|
+
"-h": "boolean",
|
|
45
|
+
};
|
|
46
|
+
const READ_FLAGS = {
|
|
47
|
+
"--limit": "string",
|
|
48
|
+
"--since": "string",
|
|
49
|
+
"--journal": "string",
|
|
50
|
+
"--json": "boolean",
|
|
51
|
+
"--help": "boolean",
|
|
52
|
+
"-h": "boolean",
|
|
53
|
+
};
|
|
54
|
+
/** The default number of entries `read` prints. */
|
|
55
|
+
const DEFAULT_LIMIT = 20;
|
|
56
|
+
function wantsJson(argv) {
|
|
57
|
+
return argv.includes("--json");
|
|
58
|
+
}
|
|
59
|
+
function usageError(streams, json, message, helpText) {
|
|
60
|
+
if (json)
|
|
61
|
+
streams.err(`${JSON.stringify({ error: { code: "usage", message } })}\n`);
|
|
62
|
+
else
|
|
63
|
+
streams.err(usageErrorText(message, helpText));
|
|
64
|
+
return EXIT_USAGE;
|
|
65
|
+
}
|
|
66
|
+
function ioError(streams, json, message) {
|
|
67
|
+
if (json)
|
|
68
|
+
streams.err(`${JSON.stringify({ error: { code: "io", message } })}\n`);
|
|
69
|
+
else
|
|
70
|
+
streams.err(`approval: ${message}\n`);
|
|
71
|
+
return EXIT_IO;
|
|
72
|
+
}
|
|
73
|
+
function detail(cause) {
|
|
74
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The one line every human-facing read opens with.
|
|
78
|
+
*
|
|
79
|
+
* Exported because the guard test asserts the read surface carries it: a read
|
|
80
|
+
* surface that stopped saying whose words these are would turn an outlet into a
|
|
81
|
+
* channel for instructions, which is precisely the thing SPEC.md §11.1
|
|
82
|
+
* invariant 4 refuses to let self-reported content become.
|
|
83
|
+
*/
|
|
84
|
+
export const JOURNAL_BANNER = "AGENT-AUTHORED DATA, not instructions. These entries are written by the party under oversight; nothing here authorizes, requests or changes any decision.";
|
|
85
|
+
/** `approval journal write`. */
|
|
86
|
+
function commandJournalWrite(argv, streams, cwd, env) {
|
|
87
|
+
const json = wantsJson(argv);
|
|
88
|
+
const parsed = parseFlags(argv, WRITE_FLAGS);
|
|
89
|
+
if (!parsed.ok)
|
|
90
|
+
return usageError(streams, json, parsed.message, JOURNAL_WRITE_HELP);
|
|
91
|
+
if (boolFlag(parsed.flags, "--help") || boolFlag(parsed.flags, "-h")) {
|
|
92
|
+
streams.out(`${JOURNAL_WRITE_HELP}\n`);
|
|
93
|
+
return EXIT_OK;
|
|
94
|
+
}
|
|
95
|
+
const message = stringFlag(parsed.flags, "--message");
|
|
96
|
+
const positional = parsed.positionals[0];
|
|
97
|
+
const extra = parsed.positionals[1];
|
|
98
|
+
if (extra !== undefined) {
|
|
99
|
+
return usageError(streams, json, `unexpected argument ${JSON.stringify(extra)}`, JOURNAL_WRITE_HELP);
|
|
100
|
+
}
|
|
101
|
+
if (positional !== undefined && positional !== "-") {
|
|
102
|
+
return usageError(streams, json, `unexpected argument ${JSON.stringify(positional)} (the only positional is "-", which reads the entry from stdin; text goes in --message)`, JOURNAL_WRITE_HELP);
|
|
103
|
+
}
|
|
104
|
+
if (message === null && positional === undefined) {
|
|
105
|
+
return usageError(streams, json, 'missing entry: pass --message "<text>", or "-" to read it from stdin', JOURNAL_WRITE_HELP);
|
|
106
|
+
}
|
|
107
|
+
if (message !== null && positional !== undefined) {
|
|
108
|
+
return usageError(streams, json, "--message and - are two ways to give the same entry; pass one", JOURNAL_WRITE_HELP);
|
|
109
|
+
}
|
|
110
|
+
let text;
|
|
111
|
+
if (message !== null) {
|
|
112
|
+
text = message;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
try {
|
|
116
|
+
text = readFileSync(0, "utf8");
|
|
117
|
+
}
|
|
118
|
+
catch (cause) {
|
|
119
|
+
return ioError(streams, json, `stdin could not be read: ${detail(cause)}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const dir = resolvePath(stringFlag(parsed.flags, "--journal"), DEFAULT_JOURNAL_DIR, cwd);
|
|
123
|
+
const actorFlag = stringFlag(parsed.flags, "--as");
|
|
124
|
+
const actorEnv = env[AGENT_ENV];
|
|
125
|
+
const actor = actorFlag !== null && actorFlag.trim().length > 0
|
|
126
|
+
? actorFlag
|
|
127
|
+
: actorEnv !== undefined && actorEnv.trim().length > 0
|
|
128
|
+
? actorEnv
|
|
129
|
+
: undefined;
|
|
130
|
+
const task = stringFlag(parsed.flags, "--task");
|
|
131
|
+
const session = stringFlag(parsed.flags, "--session");
|
|
132
|
+
const outcome = appendJournal(dir, text, {
|
|
133
|
+
...(actor === undefined ? {} : { actor }),
|
|
134
|
+
...(task === null ? {} : { task }),
|
|
135
|
+
...(session === null ? {} : { session }),
|
|
136
|
+
});
|
|
137
|
+
if (!outcome.ok) {
|
|
138
|
+
if (outcome.code === "io")
|
|
139
|
+
return ioError(streams, json, outcome.message);
|
|
140
|
+
return usageError(streams, json, outcome.message, JOURNAL_WRITE_HELP);
|
|
141
|
+
}
|
|
142
|
+
if (json) {
|
|
143
|
+
streams.out(`${JSON.stringify({
|
|
144
|
+
ok: true,
|
|
145
|
+
path: outcome.path,
|
|
146
|
+
ts: outcome.entry.ts,
|
|
147
|
+
actor: outcome.entry.actor,
|
|
148
|
+
bytes: Buffer.byteLength(outcome.entry.text, "utf8"),
|
|
149
|
+
})}\n`);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
streams.out(`journal: entry written to ${outcome.path} as ${outcome.entry.actor}\n`);
|
|
153
|
+
}
|
|
154
|
+
return EXIT_OK;
|
|
155
|
+
}
|
|
156
|
+
/** One entry, rendered for a person. */
|
|
157
|
+
function renderEntry(entry) {
|
|
158
|
+
const attribution = [
|
|
159
|
+
entry.ts,
|
|
160
|
+
entry.actor,
|
|
161
|
+
...(entry.task === undefined ? [] : [`task ${entry.task}`]),
|
|
162
|
+
...(entry.session === undefined ? [] : [`session ${entry.session}`]),
|
|
163
|
+
].join(" ");
|
|
164
|
+
return [`${attribution} [claimed]`, " ---", ...entry.text.split("\n").map((line) => ` ${line}`), " ---"].join("\n");
|
|
165
|
+
}
|
|
166
|
+
/** `approval journal read`. */
|
|
167
|
+
function commandJournalRead(argv, streams, cwd) {
|
|
168
|
+
const json = wantsJson(argv);
|
|
169
|
+
const parsed = parseFlags(argv, READ_FLAGS);
|
|
170
|
+
if (!parsed.ok)
|
|
171
|
+
return usageError(streams, json, parsed.message, JOURNAL_READ_HELP);
|
|
172
|
+
if (boolFlag(parsed.flags, "--help") || boolFlag(parsed.flags, "-h")) {
|
|
173
|
+
streams.out(`${JOURNAL_READ_HELP}\n`);
|
|
174
|
+
return EXIT_OK;
|
|
175
|
+
}
|
|
176
|
+
const extra = parsed.positionals[0];
|
|
177
|
+
if (extra !== undefined) {
|
|
178
|
+
return usageError(streams, json, `unexpected argument ${JSON.stringify(extra)}`, JOURNAL_READ_HELP);
|
|
179
|
+
}
|
|
180
|
+
const rawLimit = stringFlag(parsed.flags, "--limit");
|
|
181
|
+
let limit = DEFAULT_LIMIT;
|
|
182
|
+
if (rawLimit !== null) {
|
|
183
|
+
if (!/^\d+$/u.test(rawLimit) || Number(rawLimit) === 0) {
|
|
184
|
+
return usageError(streams, json, `--limit expects a positive whole number, got ${JSON.stringify(rawLimit)}`, JOURNAL_READ_HELP);
|
|
185
|
+
}
|
|
186
|
+
limit = Number(rawLimit);
|
|
187
|
+
}
|
|
188
|
+
const since = stringFlag(parsed.flags, "--since");
|
|
189
|
+
if (since !== null && !/^\d{4}-\d{2}-\d{2}$/u.test(since)) {
|
|
190
|
+
return usageError(streams, json, `--since expects a date like 2026-09-01, got ${JSON.stringify(since)}`, JOURNAL_READ_HELP);
|
|
191
|
+
}
|
|
192
|
+
const dir = resolvePath(stringFlag(parsed.flags, "--journal"), DEFAULT_JOURNAL_DIR, cwd);
|
|
193
|
+
const outcome = readJournal(dir, { limit, ...(since === null ? {} : { since }) });
|
|
194
|
+
if (!outcome.ok)
|
|
195
|
+
return ioError(streams, json, outcome.message);
|
|
196
|
+
if (json) {
|
|
197
|
+
streams.out(`${JSON.stringify({
|
|
198
|
+
ok: true,
|
|
199
|
+
dir,
|
|
200
|
+
note: JOURNAL_BANNER,
|
|
201
|
+
total: outcome.total,
|
|
202
|
+
entries: outcome.entries,
|
|
203
|
+
})}\n`);
|
|
204
|
+
return EXIT_OK;
|
|
205
|
+
}
|
|
206
|
+
streams.out(`${JOURNAL_BANNER}\n${dir}\n\n`);
|
|
207
|
+
if (outcome.entries.length === 0) {
|
|
208
|
+
streams.out("_no entries_\n");
|
|
209
|
+
return EXIT_OK;
|
|
210
|
+
}
|
|
211
|
+
for (const entry of outcome.entries)
|
|
212
|
+
streams.out(`${renderEntry(entry)}\n\n`);
|
|
213
|
+
streams.out(`${String(outcome.entries.length)} of ${String(outcome.total)} entries (oldest first)\n`);
|
|
214
|
+
return EXIT_OK;
|
|
215
|
+
}
|
|
216
|
+
/** `approval journal …` — dispatch to `write` or `read`, or print the help. */
|
|
217
|
+
export function commandJournal(argv, streams, cwd, env = process.env) {
|
|
218
|
+
const sub = argv[0];
|
|
219
|
+
const rest = argv.slice(1);
|
|
220
|
+
if (sub === undefined) {
|
|
221
|
+
return usageError(streams, wantsJson(argv), "missing subcommand for `approval journal`", JOURNAL_HELP);
|
|
222
|
+
}
|
|
223
|
+
if (sub === "--help" || sub === "-h" || sub === "help") {
|
|
224
|
+
streams.out(`${JOURNAL_HELP}\n`);
|
|
225
|
+
return EXIT_OK;
|
|
226
|
+
}
|
|
227
|
+
switch (sub) {
|
|
228
|
+
case "write":
|
|
229
|
+
return commandJournalWrite(rest, streams, cwd, env);
|
|
230
|
+
case "read":
|
|
231
|
+
return commandJournalRead(rest, streams, cwd);
|
|
232
|
+
default:
|
|
233
|
+
return usageError(streams, wantsJson(argv), `unknown subcommand ${JSON.stringify(sub)} for \`approval journal\``, JOURNAL_HELP);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/** Re-exported so the help text and the core cap cannot disagree. */
|
|
237
|
+
export { MAX_ENTRY_BYTES };
|
|
238
|
+
//# sourceMappingURL=journal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.js","sourceRoot":"","sources":["../../../src/cli/journal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval log advance` (APRV-125) — the commit-and-push half of the log
|
|
3
|
+
* ritual, as a verb.
|
|
4
|
+
*
|
|
5
|
+
* The APRV-92 flow, written down: the log's appends the remote does not have
|
|
6
|
+
* yet are gathered into a commit whose message names the seq range they cover,
|
|
7
|
+
* and pushed to a short-lived records branch that exists for it. Main is
|
|
8
|
+
* protected here, so the commit reaches it through a pull request, and the PR
|
|
9
|
+
* step is `--pr`, which runs the ordinary gated `gh` path. Since APRV-284 that
|
|
10
|
+
* step also ARMS the merge (`gh pr merge <branch> --merge --auto`, off with
|
|
11
|
+
* `--no-auto-merge`): a records pull request carries only evidence paths, so
|
|
12
|
+
* the click it was waiting for was never a review. {@link armAutoMerge} carries
|
|
13
|
+
* the reasoning and the guard that keeps it true.
|
|
14
|
+
*
|
|
15
|
+
* ## The three refusals that are the point
|
|
16
|
+
*
|
|
17
|
+
* **`log-advance-dirty-stage`.** The staged set must be EXACTLY the log, the
|
|
18
|
+
* queue projection, and the payload store — nothing else. The failure this
|
|
19
|
+
* prevents is the one CLAUDE.md's rule is written against: a log commit riding
|
|
20
|
+
* a branch that carries other work. A verb that ran `git add -A` and hoped
|
|
21
|
+
* would be a worse version of the hand-ritual it replaces, so anything else
|
|
22
|
+
* already staged is a refusal and not a thing to unstage. Unstaging someone
|
|
23
|
+
* else's work is not this verb's decision to make.
|
|
24
|
+
*
|
|
25
|
+
* **`log-advance-checkout-required`.** This verb never checks out anything. The
|
|
26
|
+
* checkout is the footgun: a branch switch with an uncommitted working log
|
|
27
|
+
* rewinds `events.jsonl` under whatever holds it open, which is fork 2 of
|
|
28
|
+
* 2026-08-20. It builds the commit with a scratch index and pushes THAT commit
|
|
29
|
+
* to a records branch by refspec, which moves no HEAD and touches no file.
|
|
30
|
+
*
|
|
31
|
+
* ## The base is the remote, not the local branch (APRV-203)
|
|
32
|
+
*
|
|
33
|
+
* The verb used to commit on the branch you were standing on, which made the
|
|
34
|
+
* operator responsible for that branch being current. A checkout whose local
|
|
35
|
+
* `main` was behind origin produced a records commit parented on a stale tip,
|
|
36
|
+
* carrying a tree that silently reverted everything main had merged since. So
|
|
37
|
+
* the verb fetches first and bases its commit on the remote's tip: `git
|
|
38
|
+
* read-tree` fills a scratch index from origin's tree, the log, the queue
|
|
39
|
+
* projection and the payload store are laid over it from the working tree, and
|
|
40
|
+
* `commit-tree` parents the result on origin. HEAD, the operator's index and
|
|
41
|
+
* every file in the working tree are exactly as they were found.
|
|
42
|
+
*
|
|
43
|
+
* **`log-advance-not-primary`.** Same rule as sync's: the committed log has one
|
|
44
|
+
* home, and it is not a worktree.
|
|
45
|
+
*
|
|
46
|
+
* ## One records branch, and one pull request, per day (APRV-204)
|
|
47
|
+
*
|
|
48
|
+
* The daemon advances on a cadence, so an advance is no longer a once-a-day
|
|
49
|
+
* ceremony and the day's records branch usually already exists. When it does,
|
|
50
|
+
* and its log is a prefix of the working log, the commit is parented on THAT
|
|
51
|
+
* branch rather than on the trunk: parenting every advance on the trunk makes
|
|
52
|
+
* the second push of the day a non-fast-forward of a branch a pull request is
|
|
53
|
+
* already open on. `--pr` asks whether an open pull request exists for the head
|
|
54
|
+
* branch before creating one, so a day gets a single pull request that later
|
|
55
|
+
* advances grow.
|
|
56
|
+
*
|
|
57
|
+
* A local branch that is AHEAD of origin with commits this verb did not make is
|
|
58
|
+
* not a refusal: the advance is based on origin either way, and those commits
|
|
59
|
+
* are simply not part of it. What IS refused is a working log that origin's log
|
|
60
|
+
* is not a prefix of, in either direction, because an advance is only ever the
|
|
61
|
+
* records origin does not have yet.
|
|
62
|
+
*
|
|
63
|
+
* ## This verb appends no event
|
|
64
|
+
*
|
|
65
|
+
* For the same reason `log sync` appends none: committing the file the log
|
|
66
|
+
* lives in is housekeeping on the container, not a decision about the world.
|
|
67
|
+
* The commit is already the record of itself, in git, where a reader can see
|
|
68
|
+
* exactly which bytes moved (SPEC §10.1, amended APRV-125).
|
|
69
|
+
*/
|
|
70
|
+
import { type EventRecord } from "../core/log.js";
|
|
71
|
+
import type { LogHead } from "../core/verify.js";
|
|
72
|
+
import { defaultRecordsBranch } from "./log-anchor.js";
|
|
73
|
+
import { type ProgressReporter } from "./progress.js";
|
|
74
|
+
/**
|
|
75
|
+
* The only paths an advance may stage, as git spells them.
|
|
76
|
+
*
|
|
77
|
+
* A closed list, checked in both directions: everything staged must be in it,
|
|
78
|
+
* and nothing outside it may be staged. Widening it is a reviewable diff.
|
|
79
|
+
*/
|
|
80
|
+
export declare const ADVANCE_PATHS: readonly string[];
|
|
81
|
+
/** Machine-readable refusal codes. Frozen public API, printed in the help. */
|
|
82
|
+
export declare const LOG_ADVANCE_REFUSAL_CODES: readonly ["log-advance-not-primary", "log-advance-no-branch", "log-advance-dirty-stage", "log-advance-checkout-required", "log-advance-unverified", "log-advance-locked", "log-advance-fetch-failed", "log-advance-behind-remote", "log-advance-remote-diverged", "log-advance-git-failed", "log-advance-push-rejected", "log-advance-pr-failed", "log-advance-co-author-invalid"];
|
|
83
|
+
export type LogAdvanceRefusalCode = (typeof LOG_ADVANCE_REFUSAL_CODES)[number];
|
|
84
|
+
/** What became of the auto-merge arm. Closed (SPEC.md §11.1 invariant 6). */
|
|
85
|
+
export type AutoMergeState = "armed" | "withheld" | "refused" | "off";
|
|
86
|
+
export interface LogAdvanceOptions {
|
|
87
|
+
cwd: string;
|
|
88
|
+
/** The records branch to push to. Default `records-log-<YYYY-MM-DD>`. */
|
|
89
|
+
branch?: string | null;
|
|
90
|
+
remote?: string;
|
|
91
|
+
/**
|
|
92
|
+
* The remote branch the records commit is parented on. Defaults to the branch
|
|
93
|
+
* the checkout is standing on, which in the primary checkout is the trunk.
|
|
94
|
+
*/
|
|
95
|
+
base?: string | null;
|
|
96
|
+
/** Open the pull request through `gh` as well as pushing. */
|
|
97
|
+
pr?: boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Arm auto-merge on the pull request `--pr` opens or updates (APRV-284).
|
|
100
|
+
*
|
|
101
|
+
* Defaults to true and is read only when {@link pr} is set: there is nothing
|
|
102
|
+
* to arm without a pull request. `false` is the opt-out, and it is an opt-out
|
|
103
|
+
* rather than an opt-in because a records pull request that sits at CLEAN
|
|
104
|
+
* waiting for a hand click is the thing this option exists to remove.
|
|
105
|
+
*/
|
|
106
|
+
autoMerge?: boolean;
|
|
107
|
+
/** Optional display credit. It grants no authority and is never inferred. */
|
|
108
|
+
coAuthor?: string;
|
|
109
|
+
/** Report what would happen and stage, commit, and push nothing. */
|
|
110
|
+
dryRun?: boolean;
|
|
111
|
+
/** The date the default branch name is built from. Injected by the CLI edge. */
|
|
112
|
+
today?: string;
|
|
113
|
+
/**
|
|
114
|
+
* Where the phase narration goes (APRV-167/APRV-203). The CLI edge passes a
|
|
115
|
+
* reporter over stderr, and `--json` passes none: a machine consumer parses
|
|
116
|
+
* one object and progress on its stream would corrupt it.
|
|
117
|
+
*/
|
|
118
|
+
progress?: ProgressReporter;
|
|
119
|
+
}
|
|
120
|
+
export interface LogAdvanceReport {
|
|
121
|
+
root: string;
|
|
122
|
+
/** The branch the checkout is standing on. It is not moved, ever. */
|
|
123
|
+
branch: string;
|
|
124
|
+
recordsBranch: string;
|
|
125
|
+
remote: string;
|
|
126
|
+
/** The remote branch the advance was measured against, and the sha it was at. */
|
|
127
|
+
base: {
|
|
128
|
+
branch: string;
|
|
129
|
+
sha: string;
|
|
130
|
+
} | null;
|
|
131
|
+
/**
|
|
132
|
+
* The commit this advance is actually parented on (APRV-204): the base
|
|
133
|
+
* branch's tip on the first advance of a day, and the day's records branch on
|
|
134
|
+
* every advance after it, so the push fast-forwards the branch the day's pull
|
|
135
|
+
* request is open on.
|
|
136
|
+
*/
|
|
137
|
+
parent?: {
|
|
138
|
+
ref: string;
|
|
139
|
+
sha: string;
|
|
140
|
+
};
|
|
141
|
+
/** True when the parent was the day's existing records branch. */
|
|
142
|
+
reusedRecordsBranch?: boolean;
|
|
143
|
+
/**
|
|
144
|
+
* True when the day's branch existed and did NOT contain the base, so this
|
|
145
|
+
* advance rebuilt it on the base rather than stacking on its tip (APRV-234).
|
|
146
|
+
*/
|
|
147
|
+
rebuilt?: boolean;
|
|
148
|
+
/** The ref and sha the rebuild was parented on, when there was one. */
|
|
149
|
+
rebuiltOn?: {
|
|
150
|
+
ref: string;
|
|
151
|
+
sha: string;
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* The branch this advance would have pushed to, when the rebuilt commit was
|
|
155
|
+
* refused there and a fresh `records-log-<date>-<n>` was opened instead.
|
|
156
|
+
* `null` whenever `recordsBranch` is the branch that was asked for.
|
|
157
|
+
*/
|
|
158
|
+
fallbackFrom?: string | null;
|
|
159
|
+
/** True when this run OPENED the pull request; false when one already stood. */
|
|
160
|
+
prCreated?: boolean;
|
|
161
|
+
/**
|
|
162
|
+
* What became of the auto-merge arm (APRV-284). A closed set, machine-read.
|
|
163
|
+
*
|
|
164
|
+
* - `null` — no pull request step ran at all (`pr` was not asked for, or
|
|
165
|
+
* nothing was owed and nothing was pushed).
|
|
166
|
+
* - `"off"` — the caller turned the arm off (`--no-auto-merge`).
|
|
167
|
+
* - `"armed"` — `gh pr merge <branch> --merge --auto` succeeded: the pull
|
|
168
|
+
* request lands as a merge commit when its checks and its branch rules
|
|
169
|
+
* say so, and never before.
|
|
170
|
+
* - `"withheld"` — THIS verb declined to arm, because the branch it pushed
|
|
171
|
+
* carries something outside {@link ADVANCE_PATHS}. See
|
|
172
|
+
* {@link autoMergeNote}.
|
|
173
|
+
* - `"refused"` — `gh` said no (auto-merge disabled on the repository, a
|
|
174
|
+
* merge queue, a pull request already mergeable). The pull request is open
|
|
175
|
+
* either way, so this is reported and never fatal.
|
|
176
|
+
*/
|
|
177
|
+
autoMerge?: AutoMergeState | null;
|
|
178
|
+
/** Why the arm was withheld or refused, verbatim; `null` when it was not. */
|
|
179
|
+
autoMergeNote?: string | null;
|
|
180
|
+
/** The seq range this advance carries, inclusive; null when nothing is owed. */
|
|
181
|
+
range: {
|
|
182
|
+
from: number;
|
|
183
|
+
to: number;
|
|
184
|
+
} | null;
|
|
185
|
+
committedHead: LogHead | null;
|
|
186
|
+
workingHead: LogHead | null;
|
|
187
|
+
staged: readonly string[];
|
|
188
|
+
message: string;
|
|
189
|
+
commit: string | null;
|
|
190
|
+
pushed: boolean;
|
|
191
|
+
prUrl: string | null;
|
|
192
|
+
dryRun: boolean;
|
|
193
|
+
}
|
|
194
|
+
export type LogAdvanceResult = {
|
|
195
|
+
ok: true;
|
|
196
|
+
report: LogAdvanceReport;
|
|
197
|
+
} | {
|
|
198
|
+
ok: false;
|
|
199
|
+
code: LogAdvanceRefusalCode;
|
|
200
|
+
message: string;
|
|
201
|
+
/** Paths that were staged and should not have been. */
|
|
202
|
+
offending?: readonly string[];
|
|
203
|
+
quote?: readonly string[];
|
|
204
|
+
};
|
|
205
|
+
export { defaultRecordsBranch };
|
|
206
|
+
/** `approval log advance`, as a function. The CLI wrapper formats its answer. */
|
|
207
|
+
export declare function logAdvance(options: LogAdvanceOptions): LogAdvanceResult;
|
|
208
|
+
/** Where the records that are already published end. */
|
|
209
|
+
export interface PublishedState {
|
|
210
|
+
/** The highest seq this chain reaches on a records branch, the trunk, or HEAD. */
|
|
211
|
+
publishedSeq: number;
|
|
212
|
+
/** The working log's head seq. */
|
|
213
|
+
workingSeq: number;
|
|
214
|
+
/** Working records above `publishedSeq`, advance bookkeeping included. */
|
|
215
|
+
pending: number;
|
|
216
|
+
/** The same count with the daemon's own advance cycles removed. */
|
|
217
|
+
substantive: number;
|
|
218
|
+
/**
|
|
219
|
+
* The rev the published head was read from, or `null` when no rev carried a
|
|
220
|
+
* copy of this chain (APRV-210).
|
|
221
|
+
*
|
|
222
|
+
* A row that says "N records are not yet on a records branch" is unreadable
|
|
223
|
+
* without it: a rev that resolved to nothing and a rev that carried nothing
|
|
224
|
+
* are the same number and completely different facts, and the doctor's
|
|
225
|
+
* cadence row reported the first as the second on a log whose first 8,379
|
|
226
|
+
* records had been merged to the trunk an hour earlier.
|
|
227
|
+
*/
|
|
228
|
+
publishedRev: string | null;
|
|
229
|
+
/** Every rev that was consulted, in the order they were tried. */
|
|
230
|
+
revs: readonly string[];
|
|
231
|
+
/**
|
|
232
|
+
* Where the OWED SPAN ends: the highest unpublished seq that is not an
|
|
233
|
+
* advance cycle's own bookkeeping, or {@link publishedSeq} when none is
|
|
234
|
+
* (APRV-211).
|
|
235
|
+
*
|
|
236
|
+
* `workingSeq` was the wrong end of the span for the daemon's idempotency
|
|
237
|
+
* key. One gated attempt appends its own `task.registered` and
|
|
238
|
+
* `approval.requested`, which move the head, so the next tick computed a
|
|
239
|
+
* DIFFERENT key for the SAME owed work and asked the human a second question.
|
|
240
|
+
* Measured over substantive records, the span is stable for exactly as long
|
|
241
|
+
* as the owed work is unchanged, which is what makes one owed advance one
|
|
242
|
+
* question — and it still moves the moment a real record lands, so the
|
|
243
|
+
* payload hash still differs per distinct advance and the `supervised-live`
|
|
244
|
+
* draw is never re-rolled for the same span.
|
|
245
|
+
*
|
|
246
|
+
* Never below `publishedSeq`: a span that ran backwards would name a range
|
|
247
|
+
* the commit could not carry.
|
|
248
|
+
*/
|
|
249
|
+
substantiveSeq: number;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* How much of the working log is already on a records branch or the trunk.
|
|
253
|
+
*
|
|
254
|
+
* Reads git's object store and NEVER the network: this is asked on every daemon
|
|
255
|
+
* tick and by `approval doctor`, and a status question must not depend on a
|
|
256
|
+
* remote being reachable. The revs consulted are the local advance anchors
|
|
257
|
+
* (`refs/approval/advance/*`, which {@link logAdvance} writes before it pushes),
|
|
258
|
+
* the remote-tracking refs for the base branch and the day's records branch, and
|
|
259
|
+
* `HEAD`. The highest head among the copies that are a PREFIX of this chain
|
|
260
|
+
* wins; anything else is ignored, which can only make a caller advance less
|
|
261
|
+
* eagerly.
|
|
262
|
+
*
|
|
263
|
+
* It lives here rather than beside the daemon's cadence because `approval
|
|
264
|
+
* doctor` reports the same number and a CLI module may not import the daemon.
|
|
265
|
+
*/
|
|
266
|
+
export declare function publishedState(root: string, logPath: string, records: readonly EventRecord[], where: {
|
|
267
|
+
remote: string;
|
|
268
|
+
base: string | null;
|
|
269
|
+
}, today: string): PublishedState;
|
|
270
|
+
/** The canonical commit subject. It names the seq range, so the log is findable. */
|
|
271
|
+
export declare function advanceMessage(range: {
|
|
272
|
+
from: number;
|
|
273
|
+
to: number;
|
|
274
|
+
}, branch: string): string;
|
|
275
|
+
/**
|
|
276
|
+
* Validate a display-only Git trailer identity before any mutating step.
|
|
277
|
+
*
|
|
278
|
+
* The accepted form is deliberately one line and one header value. It is never
|
|
279
|
+
* derived from a log actor and never interpreted as gate or GitHub authority.
|
|
280
|
+
*/
|
|
281
|
+
export declare function validateCoAuthor(input: string | undefined): {
|
|
282
|
+
ok: true;
|
|
283
|
+
value: string | null;
|
|
284
|
+
} | {
|
|
285
|
+
ok: false;
|
|
286
|
+
message: string;
|
|
287
|
+
};
|