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,506 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The verified-head snapshot (APRV-188): what a process that already walked the
|
|
3
|
+
* log publishes, so the next process does not have to walk it again.
|
|
4
|
+
*
|
|
5
|
+
* ## The cost this removes
|
|
6
|
+
*
|
|
7
|
+
* Every hook-gated tool call is a fresh process with an empty
|
|
8
|
+
* {@link VerifiedReadCache}, so it verifies the log from genesis before it may
|
|
9
|
+
* decide anything. APRV-186 and APRV-206 made that walk as cheap as a walk can
|
|
10
|
+
* be; what they could not change is that it is O(records) per gated command.
|
|
11
|
+
* Measured on this repository's shape at 10k records: 65 ms of the 371 ms a
|
|
12
|
+
* gated invocation costs, growing at 6.5 ms per thousand records, which is the
|
|
13
|
+
* term that turns into seconds as a log grows. The daemon, meanwhile, holds a
|
|
14
|
+
* warm cache and re-verifies only the tail on every tick. This module is how
|
|
15
|
+
* what it verified reaches the next hook process.
|
|
16
|
+
*
|
|
17
|
+
* ## Why a file and not a socket
|
|
18
|
+
*
|
|
19
|
+
* The hook's request path is synchronous end to end — `commandHook` returns an
|
|
20
|
+
* exit code, and the wait loop sleeps synchronously — so a `node:net` client
|
|
21
|
+
* could not be awaited from it, and a `spawnSync` helper to do the awaiting
|
|
22
|
+
* would cost more node startup (20-40 ms) than the walk it saves. A published
|
|
23
|
+
* file needs one `readFileSync`. It also spawns no child and opens no socket,
|
|
24
|
+
* so there is no environment to scrub (APRV-205) and no fd to leak.
|
|
25
|
+
*
|
|
26
|
+
* ## What a snapshot is, and what it is emphatically not
|
|
27
|
+
*
|
|
28
|
+
* It is an **endorsement of bytes**. It says: *the first `byte_length` bytes of
|
|
29
|
+
* this log, whose SHA-256 is this, verified clean, and they end at this head.*
|
|
30
|
+
* It carries no records, and a reader never learns anything from it that it
|
|
31
|
+
* cannot check against the log file in its own hands. A reader that cannot
|
|
32
|
+
* re-prove every one of those claims ignores the file and walks the log, which
|
|
33
|
+
* is the behaviour with no snapshot at all.
|
|
34
|
+
*
|
|
35
|
+
* ## Global invariant 1, "enforcement paths read only verified records"
|
|
36
|
+
*
|
|
37
|
+
* This is the invariant the module touches, so the argument is written out
|
|
38
|
+
* rather than assumed. The structure is APRV-43's, with the verifier in another
|
|
39
|
+
* process:
|
|
40
|
+
*
|
|
41
|
+
* - {@link admitSnapshot} hashes the prefix bytes **it read itself** and
|
|
42
|
+
* requires the digest the snapshot names. That is what makes "the bytes the
|
|
43
|
+
* publisher verified" and "the bytes on disk now" the same bytes; it is the
|
|
44
|
+
* identical proof the in-process cache pays on every cached read, and no
|
|
45
|
+
* amount of `stat` substitutes for it.
|
|
46
|
+
* - The reader parses the prefix lines itself and re-derives the head and the
|
|
47
|
+
* line count from its own parse. A snapshot naming a different head, or a
|
|
48
|
+
* different number of lines, is rejected by the reader's own arithmetic.
|
|
49
|
+
* - The reader then re-checks the chain links (`alg`, `seq` succession, `prev`
|
|
50
|
+
* linkage, hash shape) over those parsed records. This is a deliberate
|
|
51
|
+
* SUBSET of `core/verify.ts`'s ladder and never a replacement for it: it can
|
|
52
|
+
* only reject. `core/verify.ts` remains the one implementation of the
|
|
53
|
+
* verdict, and the appended tail beyond the prefix is walked by it in full.
|
|
54
|
+
* - What is therefore taken on the publisher's word is exactly two checks over
|
|
55
|
+
* bytes already proved identical: the `event` schema validation and the
|
|
56
|
+
* per-record hash recompute.
|
|
57
|
+
*
|
|
58
|
+
* **Why that residue is not a new capability.** A snapshot can only endorse
|
|
59
|
+
* bytes that are already in the log file. To exploit the residue an attacker
|
|
60
|
+
* must write `verified-head.json`, which sits in the same directory as
|
|
61
|
+
* `events.jsonl` under the same permissions — and the chain is unkeyed, so an
|
|
62
|
+
* attacker who can write that directory can simply recompute a self-consistent
|
|
63
|
+
* forged log, which passes a *cold* walk too. The snapshot grants nothing that
|
|
64
|
+
* write access to the log directory did not already grant. The ownership and
|
|
65
|
+
* permission checks in {@link readSnapshot} are what keep that sentence true
|
|
66
|
+
* under a loose umask: a snapshot any other user could have written is refused
|
|
67
|
+
* before it is read.
|
|
68
|
+
*
|
|
69
|
+
* Fail closed throughout. Every check here can only reject, every rejection
|
|
70
|
+
* falls back to the cold walk, and nothing in this module can turn a log that
|
|
71
|
+
* does not verify into a verdict — the reader either proves the prefix or walks
|
|
72
|
+
* it.
|
|
73
|
+
*/
|
|
74
|
+
import { createHash } from "node:crypto";
|
|
75
|
+
import { chmodSync, openSync, readFileSync, readSync, realpathSync, renameSync, fstatSync, closeSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
76
|
+
import { dirname, join, resolve } from "node:path";
|
|
77
|
+
/** The snapshot format version. A reader admits exactly this one. */
|
|
78
|
+
export const SNAPSHOT_VERSION = 1;
|
|
79
|
+
/** The hash scheme every record declares; a link check rejects anything else. */
|
|
80
|
+
const ALG = "sha256/jcs";
|
|
81
|
+
const NEWLINE = 0x0a;
|
|
82
|
+
const HEX64 = /^[0-9a-f]{64}$/u;
|
|
83
|
+
/**
|
|
84
|
+
* Where the snapshot for `logPath` lives: beside the log, named for what it is.
|
|
85
|
+
*
|
|
86
|
+
* Derived, never configured. One log has one snapshot, and a reader that had to
|
|
87
|
+
* be *told* where to look could be pointed at a snapshot for another log — a
|
|
88
|
+
* mistake the `log` field would catch and that this removes entirely.
|
|
89
|
+
*/
|
|
90
|
+
export function snapshotPathFor(logPath) {
|
|
91
|
+
return join(dirname(resolve(logPath)), "verified-head.json");
|
|
92
|
+
}
|
|
93
|
+
function sha256(bytes) {
|
|
94
|
+
return createHash("sha256").update(bytes).digest("hex");
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The identity of a path, for the "is this the same log" comparison.
|
|
98
|
+
*
|
|
99
|
+
* `realpath`, because the publisher and the reader routinely reach one log by
|
|
100
|
+
* two spellings: a daemon started in `/var/folders/...` and a hook whose `cwd`
|
|
101
|
+
* Node has already resolved to `/private/var/folders/...` are the same file, and
|
|
102
|
+
* comparing the spellings would refuse every snapshot on macOS's aliased temp
|
|
103
|
+
* directories, and anywhere a checkout sits behind a symlink. Both sides call
|
|
104
|
+
* this, so the aliases collapse together or not at all.
|
|
105
|
+
*
|
|
106
|
+
* A path that cannot be resolved (the file is gone) falls back to `resolve`,
|
|
107
|
+
* which can only make the comparison stricter.
|
|
108
|
+
*/
|
|
109
|
+
function pathIdentity(path) {
|
|
110
|
+
try {
|
|
111
|
+
return realpathSync(resolve(path));
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return resolve(path);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// Publishing
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
/**
|
|
121
|
+
* What this process last published for a log: the endorsement, not the file.
|
|
122
|
+
*
|
|
123
|
+
* A clean read of an unchanged log endorses the same bytes it endorsed last
|
|
124
|
+
* time, and writing that fact again is a rename into a directory the daemon
|
|
125
|
+
* itself watches — which schedules a tick, which reads, which publishes
|
|
126
|
+
* (APRV-211: measured at 18 ticks in 45 seconds with a ten-minute interval and
|
|
127
|
+
* no external writer). The memo is a **write suppressor and never an admission
|
|
128
|
+
* rule**: nothing is read from it, no reader is affected by it, and the worst a
|
|
129
|
+
* stale entry can do is leave a correct snapshot on disk unrewritten.
|
|
130
|
+
*/
|
|
131
|
+
const published = new Map();
|
|
132
|
+
/** Forget what this process published. For tests, and for {@link clearSnapshot}. */
|
|
133
|
+
export function forgetPublishedSnapshots(logPath) {
|
|
134
|
+
if (logPath === undefined)
|
|
135
|
+
published.clear();
|
|
136
|
+
else
|
|
137
|
+
published.delete(pathIdentity(logPath));
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Publish a snapshot for a log the caller has just verified clean.
|
|
141
|
+
*
|
|
142
|
+
* `raw` must be the exact bytes the caller verified, `sha256` their digest,
|
|
143
|
+
* `head` the head that walk produced and `lines` its record count: this function
|
|
144
|
+
* checks none of that and cannot — it is the caller's own verification being
|
|
145
|
+
* published. Every caller is therefore immediately after a `clean` verdict over
|
|
146
|
+
* these bytes. The digest is a parameter rather than a recomputation because the
|
|
147
|
+
* caller has just proved it (APRV-206's argument, and APRV-211's measurement:
|
|
148
|
+
* hashing megabytes twice per read was 45% of a tick).
|
|
149
|
+
*
|
|
150
|
+
* The write is atomic (a temp file in the same directory, then `rename`) so a
|
|
151
|
+
* reader never sees half a snapshot, and mode 0600 so the ownership argument in
|
|
152
|
+
* the module header holds. Any failure is swallowed: a snapshot is an
|
|
153
|
+
* optimization, and a daemon must not die because a cache file could not be
|
|
154
|
+
* written. The return value says whether it landed, for the tests and the
|
|
155
|
+
* doctor row; `false` also covers "these exact bytes are already published",
|
|
156
|
+
* which is a write skipped rather than a write that failed.
|
|
157
|
+
*/
|
|
158
|
+
export function publishSnapshot(logPath, raw, digest, lines, head, schemaDir, now = () => new Date().toISOString()) {
|
|
159
|
+
return publishVerifiedPrefix(logPath, raw.length, raw.length > 0 && raw[raw.length - 1] === NEWLINE, digest, lines, head, schemaDir, now);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* {@link publishSnapshot} for a caller that never held the whole file.
|
|
163
|
+
*
|
|
164
|
+
* The incremental read (APRV-217) reads the head line and the appended bytes
|
|
165
|
+
* and proves the digest from a carried hash state, so it has the two facts this
|
|
166
|
+
* function needs — how long the verified prefix is and whether it ends at a
|
|
167
|
+
* line boundary — without a buffer of the log to derive them from. Nothing else
|
|
168
|
+
* differs: the same suppression memo, the same atomic 0600 write, the same
|
|
169
|
+
* snapshot fields. `publishSnapshot` is this function with those two facts read
|
|
170
|
+
* off a buffer.
|
|
171
|
+
*/
|
|
172
|
+
export function publishVerifiedPrefix(logPath, byteLength, endsWithNewline, digest, lines, head, schemaDir, now = () => new Date().toISOString()) {
|
|
173
|
+
// A prefix that does not end at a line boundary cannot be resumed from, so it
|
|
174
|
+
// is never published. In practice a clean log always ends with a newline.
|
|
175
|
+
if (byteLength === 0 || !endsWithNewline)
|
|
176
|
+
return false;
|
|
177
|
+
const identity = pathIdentity(logPath);
|
|
178
|
+
const last = published.get(identity);
|
|
179
|
+
if (last !== undefined && last.byteLength === byteLength && last.sha256 === digest)
|
|
180
|
+
return false;
|
|
181
|
+
const snapshot = {
|
|
182
|
+
v: SNAPSHOT_VERSION,
|
|
183
|
+
log: identity,
|
|
184
|
+
schema_dir: schemaDir === undefined ? "" : pathIdentity(schemaDir),
|
|
185
|
+
byte_length: byteLength,
|
|
186
|
+
sha256: digest,
|
|
187
|
+
lines,
|
|
188
|
+
head,
|
|
189
|
+
verified_at: now(),
|
|
190
|
+
pid: process.pid,
|
|
191
|
+
};
|
|
192
|
+
const target = snapshotPathFor(logPath);
|
|
193
|
+
const temp = `${target}.${String(process.pid)}.tmp`;
|
|
194
|
+
try {
|
|
195
|
+
writeFileSync(temp, `${JSON.stringify(snapshot)}\n`, { mode: 0o600 });
|
|
196
|
+
// Explicit, because `mode` on writeFileSync is masked by the umask and only
|
|
197
|
+
// applies when the file is created: a temp file left by a previous crash
|
|
198
|
+
// would otherwise keep whatever mode it had.
|
|
199
|
+
chmodSync(temp, 0o600);
|
|
200
|
+
renameSync(temp, target);
|
|
201
|
+
published.set(identity, { byteLength, sha256: digest });
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
try {
|
|
206
|
+
unlinkSync(temp);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// Nothing to clean up, or nothing we may clean up. Either way the
|
|
210
|
+
// snapshot simply does not exist, which every reader handles.
|
|
211
|
+
}
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function reject(reason, detail) {
|
|
216
|
+
return { ok: false, reason, detail };
|
|
217
|
+
}
|
|
218
|
+
function isPositiveInt(value) {
|
|
219
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
220
|
+
}
|
|
221
|
+
/** Strict field-by-field validation. Anything unexpected is a rejection. */
|
|
222
|
+
function parseSnapshot(text) {
|
|
223
|
+
let parsed;
|
|
224
|
+
try {
|
|
225
|
+
parsed = JSON.parse(text);
|
|
226
|
+
}
|
|
227
|
+
catch (cause) {
|
|
228
|
+
return reject("malformed", cause instanceof Error ? cause.message : String(cause));
|
|
229
|
+
}
|
|
230
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
231
|
+
return reject("malformed", "the snapshot is not a JSON object");
|
|
232
|
+
}
|
|
233
|
+
const raw = parsed;
|
|
234
|
+
if (raw["v"] !== SNAPSHOT_VERSION) {
|
|
235
|
+
return reject("version", `snapshot version ${JSON.stringify(raw["v"])} is not ${String(SNAPSHOT_VERSION)}`);
|
|
236
|
+
}
|
|
237
|
+
if (typeof raw["log"] !== "string" || raw["log"].length === 0) {
|
|
238
|
+
return reject("malformed", "log is missing or not a string");
|
|
239
|
+
}
|
|
240
|
+
if (typeof raw["schema_dir"] !== "string") {
|
|
241
|
+
return reject("malformed", "schema_dir is missing or not a string");
|
|
242
|
+
}
|
|
243
|
+
if (!isPositiveInt(raw["byte_length"])) {
|
|
244
|
+
return reject("malformed", "byte_length is missing or not a positive integer");
|
|
245
|
+
}
|
|
246
|
+
if (typeof raw["sha256"] !== "string" || !HEX64.test(raw["sha256"])) {
|
|
247
|
+
return reject("malformed", "sha256 is missing or not a 64-character hex digest");
|
|
248
|
+
}
|
|
249
|
+
if (!isPositiveInt(raw["lines"])) {
|
|
250
|
+
return reject("malformed", "lines is missing or not a positive integer");
|
|
251
|
+
}
|
|
252
|
+
const head = raw["head"];
|
|
253
|
+
if (typeof head !== "object" || head === null || Array.isArray(head)) {
|
|
254
|
+
return reject("malformed", "head is missing or not an object");
|
|
255
|
+
}
|
|
256
|
+
const headRecord = head;
|
|
257
|
+
if (!isPositiveInt(headRecord["seq"])) {
|
|
258
|
+
return reject("malformed", "head.seq is missing or not a positive integer");
|
|
259
|
+
}
|
|
260
|
+
if (typeof headRecord["hash"] !== "string" || !HEX64.test(headRecord["hash"])) {
|
|
261
|
+
return reject("malformed", "head.hash is missing or not a 64-character hex digest");
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
ok: true,
|
|
265
|
+
snapshot: {
|
|
266
|
+
v: SNAPSHOT_VERSION,
|
|
267
|
+
log: raw["log"],
|
|
268
|
+
schema_dir: raw["schema_dir"],
|
|
269
|
+
byte_length: raw["byte_length"],
|
|
270
|
+
sha256: raw["sha256"],
|
|
271
|
+
lines: raw["lines"],
|
|
272
|
+
head: { seq: headRecord["seq"], hash: headRecord["hash"] },
|
|
273
|
+
verified_at: typeof raw["verified_at"] === "string" ? raw["verified_at"] : "",
|
|
274
|
+
pid: typeof raw["pid"] === "number" ? raw["pid"] : 0,
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Read the snapshot for `logPath`, refusing one this user did not write.
|
|
280
|
+
*
|
|
281
|
+
* The ownership and permission checks are taken from the open file descriptor
|
|
282
|
+
* rather than from the path, so what is checked and what is read are the same
|
|
283
|
+
* inode: a snapshot swapped between the `stat` and the read cannot be admitted
|
|
284
|
+
* on the strength of the file that used to be there.
|
|
285
|
+
*/
|
|
286
|
+
export function readSnapshot(logPath) {
|
|
287
|
+
const path = snapshotPathFor(logPath);
|
|
288
|
+
let fd;
|
|
289
|
+
try {
|
|
290
|
+
fd = openSync(path, "r");
|
|
291
|
+
}
|
|
292
|
+
catch (cause) {
|
|
293
|
+
const code = cause.code;
|
|
294
|
+
if (code === "ENOENT")
|
|
295
|
+
return reject("absent", `no snapshot at ${path}`);
|
|
296
|
+
return reject("unreadable", `snapshot ${path} could not be opened: ${String(code)}`);
|
|
297
|
+
}
|
|
298
|
+
try {
|
|
299
|
+
const stats = fstatSync(fd);
|
|
300
|
+
if (!stats.isFile())
|
|
301
|
+
return reject("not-a-file", `${path} is not a regular file`);
|
|
302
|
+
// Who wrote it. `process.geteuid` is absent on Windows, where the check
|
|
303
|
+
// cannot be made and the file is refused rather than trusted.
|
|
304
|
+
const euid = typeof process.geteuid === "function" ? process.geteuid() : null;
|
|
305
|
+
if (euid === null) {
|
|
306
|
+
return reject("foreign-owner", "file ownership cannot be established on this platform");
|
|
307
|
+
}
|
|
308
|
+
if (stats.uid !== euid) {
|
|
309
|
+
return reject("foreign-owner", `${path} is owned by uid ${String(stats.uid)}, not by this user (${String(euid)})`);
|
|
310
|
+
}
|
|
311
|
+
if ((stats.mode & 0o022) !== 0) {
|
|
312
|
+
return reject("loose-permissions", `${path} is writable by group or other (mode ${(stats.mode & 0o777).toString(8)})`);
|
|
313
|
+
}
|
|
314
|
+
// A snapshot is a few hundred bytes; a huge file here is not one.
|
|
315
|
+
if (stats.size > 64 * 1024) {
|
|
316
|
+
return reject("malformed", `${path} is ${String(stats.size)} bytes, far larger than a snapshot`);
|
|
317
|
+
}
|
|
318
|
+
const buffer = Buffer.allocUnsafe(stats.size);
|
|
319
|
+
let read = 0;
|
|
320
|
+
while (read < stats.size) {
|
|
321
|
+
const got = readSync(fd, buffer, read, stats.size - read, read);
|
|
322
|
+
if (got === 0)
|
|
323
|
+
break;
|
|
324
|
+
read += got;
|
|
325
|
+
}
|
|
326
|
+
if (read !== stats.size)
|
|
327
|
+
return reject("unreadable", `${path} ended early`);
|
|
328
|
+
return parseSnapshot(buffer.toString("utf8"));
|
|
329
|
+
}
|
|
330
|
+
catch (cause) {
|
|
331
|
+
return reject("unreadable", cause instanceof Error ? cause.message : String(cause));
|
|
332
|
+
}
|
|
333
|
+
finally {
|
|
334
|
+
try {
|
|
335
|
+
closeSync(fd);
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
// Already closed; nothing to release.
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
// ---------------------------------------------------------------------------
|
|
343
|
+
// Admission
|
|
344
|
+
// ---------------------------------------------------------------------------
|
|
345
|
+
/**
|
|
346
|
+
* The chain links, re-checked over records the reader parsed itself.
|
|
347
|
+
*
|
|
348
|
+
* A SUBSET of `core/verify.ts`'s ladder — `alg`, the shape of `hash`, `seq`
|
|
349
|
+
* succession from 1, and `prev` linkage — and never a substitute for it. It can
|
|
350
|
+
* only reject, it is not consulted for any verdict, and everything it does not
|
|
351
|
+
* check (the `event` schema, the per-record hash recompute) is the residue the
|
|
352
|
+
* module header accounts for. It costs about a millisecond at ten thousand
|
|
353
|
+
* records and turns a buggy or stale publisher into a fallback rather than into
|
|
354
|
+
* a bad read.
|
|
355
|
+
*/
|
|
356
|
+
function linksHold(records, expected) {
|
|
357
|
+
let previousHash = null;
|
|
358
|
+
for (const [index, record] of records.entries()) {
|
|
359
|
+
const seq = index + 1;
|
|
360
|
+
const raw = record;
|
|
361
|
+
if (raw["alg"] !== ALG) {
|
|
362
|
+
return `record ${String(seq)} declares alg ${JSON.stringify(raw["alg"])}, not ${ALG}`;
|
|
363
|
+
}
|
|
364
|
+
if (typeof raw["hash"] !== "string" || !HEX64.test(raw["hash"])) {
|
|
365
|
+
return `record ${String(seq)} has no 64-character hex hash`;
|
|
366
|
+
}
|
|
367
|
+
if (raw["seq"] !== seq) {
|
|
368
|
+
return `record at position ${String(seq)} declares seq ${JSON.stringify(raw["seq"])}`;
|
|
369
|
+
}
|
|
370
|
+
const prev = raw["prev"];
|
|
371
|
+
if (previousHash === null) {
|
|
372
|
+
if (prev !== null)
|
|
373
|
+
return "the first record does not have a null prev";
|
|
374
|
+
}
|
|
375
|
+
else if (prev !== previousHash) {
|
|
376
|
+
return `record ${String(seq)} prev does not link to record ${String(seq - 1)}`;
|
|
377
|
+
}
|
|
378
|
+
previousHash = raw["hash"];
|
|
379
|
+
}
|
|
380
|
+
const last = records[records.length - 1];
|
|
381
|
+
if (last === undefined)
|
|
382
|
+
return "the prefix holds no records";
|
|
383
|
+
if (last.seq !== expected.seq || last.hash !== expected.hash) {
|
|
384
|
+
return `the prefix ends at seq ${String(last.seq)}, not at the claimed head seq ${String(expected.seq)}`;
|
|
385
|
+
}
|
|
386
|
+
return null;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Decide whether `snapshot` may stand for the first bytes of `raw`, and return
|
|
390
|
+
* the {@link VerifiedPrefix} a resumed walk chains onto when it may.
|
|
391
|
+
*
|
|
392
|
+
* `raw` is the caller's own read of the whole log. Every check below is made
|
|
393
|
+
* against those bytes; nothing is re-`stat`ed, re-read, or taken from the
|
|
394
|
+
* snapshot without being re-derived. The order is cheapest-first, but only the
|
|
395
|
+
* digest is load-bearing — everything before it rejects an obviously
|
|
396
|
+
* inapplicable snapshot without hashing megabytes, and everything after it
|
|
397
|
+
* re-derives from the reader's own parse what the snapshot merely claimed.
|
|
398
|
+
*/
|
|
399
|
+
export function admitSnapshot(logPath, raw, snapshot, schemaDir) {
|
|
400
|
+
const identity = pathIdentity(logPath);
|
|
401
|
+
if (snapshot.log !== identity) {
|
|
402
|
+
return reject("other-log", `the snapshot describes ${snapshot.log}, not ${identity}`);
|
|
403
|
+
}
|
|
404
|
+
const schemaKey = schemaDir === undefined ? "" : pathIdentity(schemaDir);
|
|
405
|
+
if (snapshot.schema_dir !== schemaKey) {
|
|
406
|
+
return reject("other-schema-dir", `the snapshot was verified against schemas in ${JSON.stringify(snapshot.schema_dir)}, this read uses ${JSON.stringify(schemaKey)}`);
|
|
407
|
+
}
|
|
408
|
+
// The log is append-only: a file shorter than the endorsed prefix cannot
|
|
409
|
+
// contain it, and must be walked cold so the head reported is the file's own.
|
|
410
|
+
if (raw.length < snapshot.byte_length) {
|
|
411
|
+
return reject("shorter-file", `the log is ${String(raw.length)} bytes, shorter than the endorsed prefix of ${String(snapshot.byte_length)}`);
|
|
412
|
+
}
|
|
413
|
+
if (raw[snapshot.byte_length - 1] !== NEWLINE) {
|
|
414
|
+
return reject("not-line-aligned", "the endorsed prefix does not end at a line boundary");
|
|
415
|
+
}
|
|
416
|
+
// The proof.
|
|
417
|
+
const digest = sha256(raw.subarray(0, snapshot.byte_length));
|
|
418
|
+
if (digest !== snapshot.sha256) {
|
|
419
|
+
return reject("digest-mismatch", "the log's first bytes are not the bytes the snapshot endorses");
|
|
420
|
+
}
|
|
421
|
+
// Everything from here is re-derived from the reader's own parse of those
|
|
422
|
+
// bytes. A snapshot that lied about the head or the record count is caught
|
|
423
|
+
// here, by arithmetic, not by trust.
|
|
424
|
+
const text = Buffer.from(raw.buffer, raw.byteOffset, snapshot.byte_length).toString("utf8");
|
|
425
|
+
const records = [];
|
|
426
|
+
let start = 0;
|
|
427
|
+
for (;;) {
|
|
428
|
+
const newline = text.indexOf("\n", start);
|
|
429
|
+
if (newline < 0)
|
|
430
|
+
break;
|
|
431
|
+
const line = text.slice(start, newline);
|
|
432
|
+
start = newline + 1;
|
|
433
|
+
if (line.trim().length === 0)
|
|
434
|
+
return reject("malformed", "the endorsed prefix holds a blank line");
|
|
435
|
+
let value;
|
|
436
|
+
try {
|
|
437
|
+
value = JSON.parse(line);
|
|
438
|
+
}
|
|
439
|
+
catch (cause) {
|
|
440
|
+
return reject("malformed", `line ${String(records.length + 1)} of the endorsed prefix is not valid JSON: ${cause instanceof Error ? cause.message : String(cause)}`);
|
|
441
|
+
}
|
|
442
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
443
|
+
return reject("malformed", `line ${String(records.length + 1)} of the endorsed prefix is not a JSON object`);
|
|
444
|
+
}
|
|
445
|
+
records.push(value);
|
|
446
|
+
}
|
|
447
|
+
if (records.length !== snapshot.lines) {
|
|
448
|
+
return reject("line-count-mismatch", `the endorsed prefix holds ${String(records.length)} lines, not the ${String(snapshot.lines)} claimed`);
|
|
449
|
+
}
|
|
450
|
+
const broken = linksHold(records, snapshot.head);
|
|
451
|
+
if (broken !== null) {
|
|
452
|
+
// A head that does not match what the bytes say is the signature of a
|
|
453
|
+
// publisher serving something other than what it verified.
|
|
454
|
+
const reason = broken.includes("claimed head") ? "head-mismatch" : "chain-broken";
|
|
455
|
+
return reject(reason, broken);
|
|
456
|
+
}
|
|
457
|
+
return {
|
|
458
|
+
ok: true,
|
|
459
|
+
digest,
|
|
460
|
+
prefix: {
|
|
461
|
+
byteLength: snapshot.byte_length,
|
|
462
|
+
lines: snapshot.lines,
|
|
463
|
+
head: snapshot.head,
|
|
464
|
+
records,
|
|
465
|
+
},
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* {@link readSnapshot} then {@link admitSnapshot}: the whole path a reader takes.
|
|
470
|
+
*
|
|
471
|
+
* Returns the prefix to resume behind, or the reason there is none. Every reason
|
|
472
|
+
* means "walk the log", which is what the caller does with no snapshot at all.
|
|
473
|
+
*/
|
|
474
|
+
export function snapshotPrefix(logPath, raw, schemaDir) {
|
|
475
|
+
const read = readSnapshot(logPath);
|
|
476
|
+
if (!read.ok)
|
|
477
|
+
return read;
|
|
478
|
+
return admitSnapshot(logPath, raw, read.snapshot, schemaDir);
|
|
479
|
+
}
|
|
480
|
+
/** Read the snapshot's own text, for the doctor row. Never throws. */
|
|
481
|
+
export function snapshotSummary(logPath) {
|
|
482
|
+
return readSnapshot(logPath);
|
|
483
|
+
}
|
|
484
|
+
/** Remove a snapshot. Used by tests and by anything that invalidates one. */
|
|
485
|
+
export function clearSnapshot(logPath) {
|
|
486
|
+
// The memo describes a file; removing the file removes what it described, and
|
|
487
|
+
// the next clean read must publish again rather than believe this process's
|
|
488
|
+
// own bookkeeping.
|
|
489
|
+
forgetPublishedSnapshots(logPath);
|
|
490
|
+
try {
|
|
491
|
+
unlinkSync(snapshotPathFor(logPath));
|
|
492
|
+
}
|
|
493
|
+
catch {
|
|
494
|
+
// Absent is the desired state.
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
/** Read the log's bytes, for callers that want the same view a reader admits. */
|
|
498
|
+
export function logBytes(logPath) {
|
|
499
|
+
try {
|
|
500
|
+
return readFileSync(logPath);
|
|
501
|
+
}
|
|
502
|
+
catch {
|
|
503
|
+
return null;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
//# sourceMappingURL=verified-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verified-snapshot.js","sourceRoot":"","sources":["../../../src/core/verified-snapshot.ts"],"names":[],"mappings":"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"}
|