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,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hash-chain verification for `.approval/log/events.jsonl` (SPEC.md §8:
|
|
3
|
+
* "`approval log verify` MUST detect any mutation or truncation").
|
|
4
|
+
*
|
|
5
|
+
* This module is the read side of the append-only log. It re-derives every
|
|
6
|
+
* record's digest from its canonical serialization and walks the `prev` chain
|
|
7
|
+
* and the `seq` succession end to end, reporting the *first* place the log
|
|
8
|
+
* stops being self-consistent.
|
|
9
|
+
*
|
|
10
|
+
* **Read-only, by definition.** Verification opens the log for reading and
|
|
11
|
+
* nothing else: it never truncates, never rewrites, never repairs, and never
|
|
12
|
+
* creates a lockfile. A torn tail is *reported*, never auto-truncated — a log
|
|
13
|
+
* that heals itself is a log that can be made to forget. Repair is a human
|
|
14
|
+
* decision, made explicitly: a later CLI task may offer it behind an explicit
|
|
15
|
+
* flag, but the core provides detection only.
|
|
16
|
+
*
|
|
17
|
+
* **What verification detects.** Any mutation of a record without a full
|
|
18
|
+
* recompute of every descendant; truncation of the tail (with an external
|
|
19
|
+
* anchor); deletion, insertion, reorder, or splice anywhere in the chain;
|
|
20
|
+
* `alg` tampering; a malformed or schema-invalid line; a duplicated or skipped
|
|
21
|
+
* `seq`; a non-genesis first record; and — given an anchor — a fully
|
|
22
|
+
* recomputed forged suffix.
|
|
23
|
+
*
|
|
24
|
+
* **The detection boundary — state it plainly.** A hash chain is
|
|
25
|
+
* tamper-*evident*, not tamper-*proof*. A forger who rewrites record N and then
|
|
26
|
+
* recomputes every descendant (new hash, fixed `prev`) produces a file that is
|
|
27
|
+
* internally self-consistent in every respect, and `verify(logPath)` on that
|
|
28
|
+
* file alone CANNOT distinguish it from an honest log. The same is true of
|
|
29
|
+
* dropping records off the tail: the surviving prefix is a valid chain. Closing
|
|
30
|
+
* that gap requires something the forger does not control:
|
|
31
|
+
*
|
|
32
|
+
* - an externally anchored head — pass {@link VerifyOptions.expectedHead} with
|
|
33
|
+
* a `(seq, hash)` pair recorded elsewhere (a channel message, another host, a
|
|
34
|
+
* human's notes); a mismatch is reported as `head-mismatch`;
|
|
35
|
+
* - a retained copy of the log held outside the writer's reach;
|
|
36
|
+
* - the optional per-event git commits of SPEC.md §8, where the daemon commits
|
|
37
|
+
* each record under its own identity, giving signed, distributed evidence.
|
|
38
|
+
*
|
|
39
|
+
* Three questions that keep arriving separately have one answer (APRV-141, F7):
|
|
40
|
+
* the digest covers each record's CANONICAL CONTENT, its RFC 8785
|
|
41
|
+
* serialization, and never the bytes of the line it was read from, so a
|
|
42
|
+
* re-serialization that changes only byte format verifies clean, a line
|
|
43
|
+
* carrying a duplicate key is settled by the JSON parse that precedes
|
|
44
|
+
* canonicalization rather than by the chain, and an unanchored tail truncation
|
|
45
|
+
* leaves a valid prefix that nothing inside the file can contradict.
|
|
46
|
+
*
|
|
47
|
+
* **Anomalies, which are reported and never enforced (APRV-40).** SPEC.md §8
|
|
48
|
+
* requires that "verification treats gate-type events with implausible skew
|
|
49
|
+
* relative to their neighbors as a reportable anomaly, never silently accepted".
|
|
50
|
+
* Every non-corrupt result therefore carries {@link VerifyResult.anomalies}, a
|
|
51
|
+
* list that says nothing about integrity: a clean log with anomalies is clean,
|
|
52
|
+
* exits 0, and authorizes exactly what it authorized before. The separation is
|
|
53
|
+
* the point. Chain integrity is a proof, skew is a judgment, and folding a
|
|
54
|
+
* judgment into a proof would turn `log verify` into a check people learn to
|
|
55
|
+
* pass a flag to silence. See {@link chainAnomalies}.
|
|
56
|
+
*
|
|
57
|
+
* Determinism: the result is a pure function of (log bytes, schema files,
|
|
58
|
+
* options). No clock, no network, no cross-call state — the anomaly pass reads
|
|
59
|
+
* the records' own timestamps and never the current time.
|
|
60
|
+
*/
|
|
61
|
+
import { type EventRecord, type LogHead } from "./log.js";
|
|
62
|
+
import { type ValidateOptions } from "./validate.js";
|
|
63
|
+
/**
|
|
64
|
+
* A chain head: the last record's position and digest.
|
|
65
|
+
*
|
|
66
|
+
* Defined in `core/log.ts` (the writer needs it for its compare-and-append
|
|
67
|
+
* precondition and cannot import this module) and re-exported here, where
|
|
68
|
+
* readers expect to find it. One definition, one meaning.
|
|
69
|
+
*/
|
|
70
|
+
export type { LogHead };
|
|
71
|
+
/**
|
|
72
|
+
* The skew allowance, in milliseconds, before a backwards step between two
|
|
73
|
+
* gate-typed records is reported.
|
|
74
|
+
*
|
|
75
|
+
* ### Why 2 seconds, and why any number at all
|
|
76
|
+
*
|
|
77
|
+
* Gate-typed timestamps are stamped by `core/clock.ts` at the write boundary. In
|
|
78
|
+
* one process they come from one `Date.now()` and never go backwards. Across
|
|
79
|
+
* processes and hosts — the daemon on one machine, a CLI verb on another, both
|
|
80
|
+
* appending to a shared log — they come from separate wall clocks, and two
|
|
81
|
+
* healthy NTP-disciplined clocks routinely disagree by tens of milliseconds and
|
|
82
|
+
* occasionally by a few hundred during a step correction. A tolerance of zero
|
|
83
|
+
* would therefore report ordinary distributed operation as an anomaly, which is
|
|
84
|
+
* the fastest way to make an anomaly channel ignored.
|
|
85
|
+
*
|
|
86
|
+
* 2000 ms is chosen as roughly an order of magnitude above the disagreement a
|
|
87
|
+
* synchronized fleet actually exhibits, and two to three orders of magnitude
|
|
88
|
+
* below the skew that a *useful* lie requires. The thing this check exists to
|
|
89
|
+
* catch is a timestamp placed to change a judgment: a `ts` inside a lapsed TTL
|
|
90
|
+
* (minutes to hours), or one moved outside a rolling budget window (hours). No
|
|
91
|
+
* attack is bought by 1.9 seconds, and no healthy fleet needs 2.1.
|
|
92
|
+
*
|
|
93
|
+
* It is the DEFAULT rather than the only value since APRV-58: an operator
|
|
94
|
+
* running a single host may tighten it to 250 ms, one running across a WAN with
|
|
95
|
+
* poor time discipline may loosen it to 5 s, and `audit.skew_tolerance` in the
|
|
96
|
+
* policy is where they say so. A policy that declares nothing (or that fails to
|
|
97
|
+
* load at all) leaves this number in force, so the reference runtime still has
|
|
98
|
+
* exactly one value that every reader can see.
|
|
99
|
+
*
|
|
100
|
+
* Widening the tolerance permits nothing: the threshold is report-only in both
|
|
101
|
+
* directions, so a loosened value hides evidence from a human and cannot make
|
|
102
|
+
* any action allowed that was refused before.
|
|
103
|
+
*/
|
|
104
|
+
export declare const GATE_TS_SKEW_TOLERANCE_MS = 2000;
|
|
105
|
+
/**
|
|
106
|
+
* `audit.skew_tolerance` in milliseconds, or the default when it says nothing.
|
|
107
|
+
*
|
|
108
|
+
* Fails closed to the default exactly as `daemon/prune.ts`'s retention read
|
|
109
|
+
* does: a policy that cannot be loaded configures nothing, and for THIS key the
|
|
110
|
+
* safe fallback is the shipped number rather than zero — a zero allowance would
|
|
111
|
+
* report every ordinary clock disagreement as an anomaly, and an anomaly channel
|
|
112
|
+
* that cries wolf is one operators stop reading. An unparseable duration never
|
|
113
|
+
* reaches here: the schema's duration pattern rejects it and `loadPolicy` fails
|
|
114
|
+
* the whole policy, precisely as a bad `defaults.approval_ttl` does.
|
|
115
|
+
*/
|
|
116
|
+
export declare function skewToleranceMsOf(policy: {
|
|
117
|
+
dir?: string;
|
|
118
|
+
file?: string;
|
|
119
|
+
}, schemaDir?: string): number;
|
|
120
|
+
/**
|
|
121
|
+
* Machine-readable anomaly kinds. Closed union, additive-only, each pinned by a
|
|
122
|
+
* test — the same contract every other frozen union in this codebase carries.
|
|
123
|
+
*/
|
|
124
|
+
export declare const CHAIN_ANOMALY_KINDS: readonly [
|
|
125
|
+
/**
|
|
126
|
+
* A gate-typed record's `ts` is earlier than the previous gate-typed record's
|
|
127
|
+
* `ts` by more than {@link GATE_TS_SKEW_TOLERANCE_MS}.
|
|
128
|
+
*
|
|
129
|
+
* One kind covers both directions SPEC.md §8 describes. "Earlier than its
|
|
130
|
+
* predecessor" and "later than its successor" are the same disagreement seen
|
|
131
|
+
* from the two ends of one adjacent pair, and reporting it twice would double
|
|
132
|
+
* every entry without adding a fact.
|
|
133
|
+
*/
|
|
134
|
+
"gate-ts-regression"];
|
|
135
|
+
export type ChainAnomalyKind = (typeof CHAIN_ANOMALY_KINDS)[number];
|
|
136
|
+
/** One reportable oddity in a log that verifies. Never a verdict. */
|
|
137
|
+
export interface ChainAnomaly {
|
|
138
|
+
kind: ChainAnomalyKind;
|
|
139
|
+
/** The record the anomaly is reported against. */
|
|
140
|
+
seq: number;
|
|
141
|
+
ts: string;
|
|
142
|
+
event: string;
|
|
143
|
+
/** The gate-typed record it was compared with. */
|
|
144
|
+
previousSeq: number;
|
|
145
|
+
previousTs: string;
|
|
146
|
+
/** How far back the step is, in milliseconds. Always positive. */
|
|
147
|
+
skewMs: number;
|
|
148
|
+
message: string;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Timestamp anomalies among the gate-typed records of a verified chain.
|
|
152
|
+
*
|
|
153
|
+
* Pure: a function of the records alone, with no clock and no I/O. Comparison is
|
|
154
|
+
* between each gate-typed record and the previous **gate-typed** record, not the
|
|
155
|
+
* previous record of any kind, for the reason {@link isGateTyped} states.
|
|
156
|
+
*
|
|
157
|
+
* This changes no verdict. A log full of anomalies is still `clean` if its chain
|
|
158
|
+
* verifies, still exits 0, and still authorizes exactly what it authorized
|
|
159
|
+
* before. Skew is evidence for a human to weigh, and a verifier that refused on
|
|
160
|
+
* it would be refusing on a heuristic — which is how a tamper-evidence tool
|
|
161
|
+
* starts being run with a flag that turns it off.
|
|
162
|
+
*/
|
|
163
|
+
export declare function chainAnomalies(records: readonly EventRecord[], toleranceMs?: number): ChainAnomaly[];
|
|
164
|
+
/** Machine-readable reason a log failed verification. Closed set. */
|
|
165
|
+
export type VerifyFailureReason = "malformed-line" | "schema-invalid" | "bad-alg" | "hash-mismatch" | "prev-mismatch" | "seq-gap" | "seq-duplicate" | "not-genesis" | "head-mismatch";
|
|
166
|
+
/**
|
|
167
|
+
* Outcome of a verification run. A discriminated union on `status`:
|
|
168
|
+
*
|
|
169
|
+
* - `clean` — every complete line verified; `head` is `null` for an empty or
|
|
170
|
+
* absent log.
|
|
171
|
+
* - `torn-tail` — the file's final line is torn (it is not newline-terminated,
|
|
172
|
+
* i.e. a writer died mid-line) while every complete line before it verifies.
|
|
173
|
+
* This is the crashed-write signature and is deliberately distinct from
|
|
174
|
+
* corruption: it is an incomplete write, not evidence of tampering.
|
|
175
|
+
* - `corrupt` — everything else, reported at the first offending record.
|
|
176
|
+
*/
|
|
177
|
+
export type VerifyResult = {
|
|
178
|
+
status: "clean";
|
|
179
|
+
records: number;
|
|
180
|
+
head: LogHead | null;
|
|
181
|
+
anomalies: ChainAnomaly[];
|
|
182
|
+
} | {
|
|
183
|
+
status: "torn-tail";
|
|
184
|
+
records: number;
|
|
185
|
+
intactThroughSeq: number;
|
|
186
|
+
message: string;
|
|
187
|
+
anomalies: ChainAnomaly[];
|
|
188
|
+
} | {
|
|
189
|
+
status: "corrupt";
|
|
190
|
+
firstBadSeq: number | null;
|
|
191
|
+
reason: VerifyFailureReason;
|
|
192
|
+
message: string;
|
|
193
|
+
anomalies: ChainAnomaly[];
|
|
194
|
+
};
|
|
195
|
+
/** Options accepted by {@link verify}. */
|
|
196
|
+
export interface VerifyOptions extends ValidateOptions {
|
|
197
|
+
/**
|
|
198
|
+
* Externally anchored head. When supplied, a log that verifies internally is
|
|
199
|
+
* additionally required to end at exactly this `(seq, hash)`. This is the
|
|
200
|
+
* only defence against tail truncation and against a fully recomputed forged
|
|
201
|
+
* suffix; see the detection boundary in the module header.
|
|
202
|
+
*/
|
|
203
|
+
expectedHead?: LogHead;
|
|
204
|
+
/**
|
|
205
|
+
* Where the policy carrying `audit.skew_tolerance` lives (APRV-58), with
|
|
206
|
+
* `loadPolicy`'s semantics. Supplied by a caller that has a policy to hand;
|
|
207
|
+
* absent means {@link GATE_TS_SKEW_TOLERANCE_MS}.
|
|
208
|
+
*
|
|
209
|
+
* It reaches exactly one thing, the anomaly threshold, and anomalies change no
|
|
210
|
+
* verdict. Verification's answer to "does this chain hold" is a function of
|
|
211
|
+
* the log bytes and the schemas, and no policy — loadable, absent, hostile, or
|
|
212
|
+
* edited — can move it.
|
|
213
|
+
*/
|
|
214
|
+
policy?: {
|
|
215
|
+
dir?: string;
|
|
216
|
+
file?: string;
|
|
217
|
+
};
|
|
218
|
+
/**
|
|
219
|
+
* The tolerance, already resolved, in milliseconds. Overrides
|
|
220
|
+
* {@link VerifyOptions.policy} when both are given, and exists so the pure
|
|
221
|
+
* paths and the tests can state a threshold without a file on disk.
|
|
222
|
+
*/
|
|
223
|
+
skewToleranceMs?: number;
|
|
224
|
+
/**
|
|
225
|
+
* Called as the walk advances, so a caller can say what is taking so long
|
|
226
|
+
* (APRV-167).
|
|
227
|
+
*
|
|
228
|
+
* `approval policy amend` sat silent for thirty-three seconds re-verifying a
|
|
229
|
+
* three-thousand-record chain before it printed its first line, read as
|
|
230
|
+
* frozen, and was once abandoned mid-ceremony — which left the repository's
|
|
231
|
+
* gate fail-closed for every agent session until somebody tried again. The
|
|
232
|
+
* work was never the problem; the silence was.
|
|
233
|
+
*
|
|
234
|
+
* It OBSERVES and never decides. Nothing in the walk consults it, no verdict,
|
|
235
|
+
* message, line number or record depends on whether it was supplied, and a
|
|
236
|
+
* listener that throws would fail the verification of a sound log — so
|
|
237
|
+
* callers must not throw from it. Counts are absolute over the whole log
|
|
238
|
+
* (a resumed read behind a {@link VerifiedPrefix} reports the same numbers a
|
|
239
|
+
* cold one does) and strictly increasing within one run. The final call
|
|
240
|
+
* reports `done === total` when the chain held, and the length of the
|
|
241
|
+
* verified prefix when it did not — a meter must not claim work that was
|
|
242
|
+
* refused.
|
|
243
|
+
*/
|
|
244
|
+
onProgress?: VerifyProgressListener;
|
|
245
|
+
}
|
|
246
|
+
/** How far along a verification walk is. Counts are records, not bytes. */
|
|
247
|
+
export interface VerifyProgress {
|
|
248
|
+
/** Records verified so far. Monotonically increasing within one run. */
|
|
249
|
+
done: number;
|
|
250
|
+
/** Records this run will cover in total, known before the walk starts. */
|
|
251
|
+
total: number;
|
|
252
|
+
}
|
|
253
|
+
export type VerifyProgressListener = (progress: VerifyProgress) => void;
|
|
254
|
+
/**
|
|
255
|
+
* How many records pass between progress calls.
|
|
256
|
+
*
|
|
257
|
+
* Count-based rather than time-based, and reported here rather than throttled
|
|
258
|
+
* here: this module has no clock, a listener that fires on a deterministic
|
|
259
|
+
* schedule is a listener a test can assert on exactly, and the decision about
|
|
260
|
+
* how often a HUMAN should see a repaint belongs to the thing holding the
|
|
261
|
+
* terminal (`cli/progress.ts`), which is the only layer that knows whether
|
|
262
|
+
* there is one.
|
|
263
|
+
*/
|
|
264
|
+
export declare const PROGRESS_INTERVAL = 250;
|
|
265
|
+
/**
|
|
266
|
+
* A verification run plus the records it verified.
|
|
267
|
+
*
|
|
268
|
+
* `records` holds every record the walk accepted, in log order: the whole log
|
|
269
|
+
* when `result.status` is `clean`, the intact prefix when it is `torn-tail`, and
|
|
270
|
+
* the prefix before the first failure when it is `corrupt` (where it carries no
|
|
271
|
+
* authority and callers must ignore it).
|
|
272
|
+
*/
|
|
273
|
+
export interface VerifiedLog {
|
|
274
|
+
result: VerifyResult;
|
|
275
|
+
records: EventRecord[];
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* {@link verify}, returning the verified records alongside the verdict.
|
|
279
|
+
*
|
|
280
|
+
* This exists so that a reader which needs *both* — the gate, the token module,
|
|
281
|
+
* the executor, via `core/state.ts` — can have one walk produce both, rather
|
|
282
|
+
* than verifying with this module and then parsing the same bytes a second time
|
|
283
|
+
* with a private walk that could disagree with it (APRV-20 finding S1).
|
|
284
|
+
*/
|
|
285
|
+
export declare function verifyWithRecords(logPath: string, options?: VerifyOptions): VerifiedLog;
|
|
286
|
+
/**
|
|
287
|
+
* A prefix of a log that *this process* has already verified in full, together
|
|
288
|
+
* with the evidence needed to resume behind it.
|
|
289
|
+
*
|
|
290
|
+
* Handing one of these to {@link verifyText} skips re-verification of the prefix
|
|
291
|
+
* entirely, which is sound only under the caller's obligation stated on
|
|
292
|
+
* {@link records}: the bytes now on disk in `[0, byteLength)` must be proved
|
|
293
|
+
* byte-identical to the bytes that produced these records. `core/state.ts` is
|
|
294
|
+
* the only caller, and it discharges that obligation by re-hashing the prefix
|
|
295
|
+
* bytes on every use. Verification is a pure function of (bytes, schemas,
|
|
296
|
+
* options), so identical bytes re-verify identically by construction; nothing
|
|
297
|
+
* weaker (a matching size, a matching mtime, a matching head line) implies it.
|
|
298
|
+
*/
|
|
299
|
+
export interface VerifiedPrefix {
|
|
300
|
+
/** Byte length of the prefix. Always immediately after a newline. */
|
|
301
|
+
byteLength: number;
|
|
302
|
+
/** Number of complete lines in the prefix, for file-absolute line numbers. */
|
|
303
|
+
lines: number;
|
|
304
|
+
/** The prefix's chain head, which the resumed walk chains onto. */
|
|
305
|
+
head: LogHead;
|
|
306
|
+
/** The records the prefix verified to, in log order. */
|
|
307
|
+
records: readonly EventRecord[];
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* {@link verifyWithRecords} over text already in hand, optionally resuming
|
|
311
|
+
* behind a {@link VerifiedPrefix}.
|
|
312
|
+
*
|
|
313
|
+
* With `prefix === null`, `text` is the whole log and the walk starts at
|
|
314
|
+
* genesis: this is exactly what {@link verifyWithRecords} does, and the two
|
|
315
|
+
* share every check, message, and line number as a result. With a `prefix`,
|
|
316
|
+
* `text` is the *remainder* of the file (the bytes from `prefix.byteLength` on)
|
|
317
|
+
* and the walk chains onto `prefix.head` with line numbers offset by
|
|
318
|
+
* `prefix.lines`, so a resumed verdict is textually identical to the cold one.
|
|
319
|
+
*
|
|
320
|
+
* Exported for `core/state.ts`'s verified-read cache and for nothing else. Every
|
|
321
|
+
* schema check, hash recompute, `seq` succession check, and `prev` link check
|
|
322
|
+
* still runs on every record the walk covers; resuming changes only *which*
|
|
323
|
+
* records are covered, never how.
|
|
324
|
+
*/
|
|
325
|
+
export declare function verifyText(logPath: string, text: string, options?: VerifyOptions, prefix?: VerifiedPrefix | null): VerifiedLog;
|
|
326
|
+
/**
|
|
327
|
+
* Verify the hash chain of the log at `logPath`.
|
|
328
|
+
*
|
|
329
|
+
* An absent file is an empty log, which is clean with zero records and a `null`
|
|
330
|
+
* head — an audit trail that has recorded nothing is not evidence of tampering.
|
|
331
|
+
*
|
|
332
|
+
* The file is opened for reading only; see the module header for the recovery
|
|
333
|
+
* stance and the detection boundary. This is {@link verifyWithRecords} with the
|
|
334
|
+
* records dropped — one walk, one implementation.
|
|
335
|
+
*/
|
|
336
|
+
export declare function verify(logPath: string, options?: VerifyOptions): VerifyResult;
|