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,420 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy attestation (SPEC.md §5.2, §11) — the mechanical form of "agents MUST
|
|
3
|
+
* NOT be able to modify `APPROVAL.md`".
|
|
4
|
+
*
|
|
5
|
+
* The problem this solves is not that an agent *can* edit the policy file — on
|
|
6
|
+
* a single machine nothing stops it — but that an edited policy would otherwise
|
|
7
|
+
* take effect silently. Attestation closes that: a human runs
|
|
8
|
+
* `approval policy attest`, which appends a `policy.updated` event carrying the
|
|
9
|
+
* SHA-256 of the policy file's exact bytes. From then on the live file either
|
|
10
|
+
* hashes to the latest attestation or it does not, and {@link checkAttestation}
|
|
11
|
+
* says which. Gate operations (request intake, grant recording, token minting —
|
|
12
|
+
* APRV-16) refuse on anything but a match. An edited policy is inoperative
|
|
13
|
+
* until a human re-attests it.
|
|
14
|
+
*
|
|
15
|
+
* ## What this proves, and what it does not
|
|
16
|
+
*
|
|
17
|
+
* Human identity at v0.1 is **config-declared**: `--as human:<id>` or the
|
|
18
|
+
* `APPROVAL_HUMAN` environment variable (see {@link resolveHumanActor}). The
|
|
19
|
+
* trust boundary is the local machine. Anyone who can set that environment
|
|
20
|
+
* variable and write to the log is inside the boundary, so an attestation
|
|
21
|
+
* proves that *someone with local control* signed off — not *who*. There is no
|
|
22
|
+
* cryptographic identity here and this module claims none; that is future work,
|
|
23
|
+
* stated plainly rather than dressed up. What attestation buys, even so, is
|
|
24
|
+
* real: a policy edit made by an agent mid-run cannot become operative without
|
|
25
|
+
* a separate, deliberate, logged human act.
|
|
26
|
+
*
|
|
27
|
+
* ## Fail closed, in this order
|
|
28
|
+
*
|
|
29
|
+
* A policy file that cannot be read is `unreadable`, never `attested`. No
|
|
30
|
+
* attestation at all is `not-attested`. Bytes that do not match the latest
|
|
31
|
+
* attestation are `hash-mismatch`. Only an exact match is `attested`.
|
|
32
|
+
*
|
|
33
|
+
* Everything here is read-only except {@link appendAttestation}, which writes
|
|
34
|
+
* through `core/log.ts`'s `appendEvent` — the one sanctioned append path — and
|
|
35
|
+
* therefore inherits its locking, chain stamping, and write-boundary schema
|
|
36
|
+
* validation. Nothing in this file opens the log itself.
|
|
37
|
+
*/
|
|
38
|
+
import { type ClockOptions } from "./clock.js";
|
|
39
|
+
import { type AppendOptions, type EventRecord } from "./log.js";
|
|
40
|
+
import type { ValidationError } from "./validate.js";
|
|
41
|
+
/** Environment variable naming the human on whose behalf the CLI attests. */
|
|
42
|
+
export declare const HUMAN_ACTOR_ENV = "APPROVAL_HUMAN";
|
|
43
|
+
/**
|
|
44
|
+
* The machine-readable refusal code emitted when policy is not attested.
|
|
45
|
+
*
|
|
46
|
+
* Deliberately distinct from any generic policy-load failure. A caller must be
|
|
47
|
+
* able to tell "the policy says manual" from "the policy is unverified", because
|
|
48
|
+
* the repairs are different: the first is answered by asking a human to approve
|
|
49
|
+
* an action, the second by asking a human to attest a file.
|
|
50
|
+
*/
|
|
51
|
+
export declare const ATTESTATION_REFUSAL = "policy-not-attested";
|
|
52
|
+
/**
|
|
53
|
+
* The payload field carrying the attested policy hash a gate event was decided
|
|
54
|
+
* under (APRV-118, amended SPEC.md §5.2).
|
|
55
|
+
*
|
|
56
|
+
* Written on `approval.requested` and `approval.granted`, and named here rather
|
|
57
|
+
* than in `core/gate.ts` because the value is this module's: it is the SHA-256
|
|
58
|
+
* the live policy file matched when {@link checkAttestation} said `attested`.
|
|
59
|
+
* Pinning it lets a reader of the log answer a question attestation alone cannot
|
|
60
|
+
* — whether the approver decided under the rules the requester was routed by.
|
|
61
|
+
*/
|
|
62
|
+
export declare const POLICY_HASH_FIELD = "policy_sha256";
|
|
63
|
+
/** Is `value` a lowercase-hex SHA-256, the shape {@link POLICY_HASH_FIELD} takes? */
|
|
64
|
+
export declare function isPolicySha256(value: unknown): value is string;
|
|
65
|
+
/** Why an attestation check refused. Mirrors the non-`attested` statuses. */
|
|
66
|
+
export type AttestationRefusalDetail = "not-attested" | "hash-mismatch" | "unreadable";
|
|
67
|
+
/** The refusal a gate operation surfaces to its caller (APRV-16 consumes it). */
|
|
68
|
+
export interface AttestationRefusal {
|
|
69
|
+
code: typeof ATTESTATION_REFUSAL;
|
|
70
|
+
detail: AttestationRefusalDetail;
|
|
71
|
+
message: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Why an attestation append failed: every reason `appendEvent` can give, plus
|
|
75
|
+
* the one rule this module enforces on its own.
|
|
76
|
+
*
|
|
77
|
+
* ### Why `actor-not-human` lives here and not in `core/log.ts`
|
|
78
|
+
*
|
|
79
|
+
* Until APRV-20 pass two the non-human-actor refusal reused `validation`, which
|
|
80
|
+
* conflated two different facts: "the record failed `event.schema.json` at the
|
|
81
|
+
* write boundary" and "the caller is not allowed to perform this verb". A
|
|
82
|
+
* caller branching on `validation` could not tell a malformed event from a
|
|
83
|
+
* forbidden one, and the two call for opposite responses (fix the record;
|
|
84
|
+
* fetch a human).
|
|
85
|
+
*
|
|
86
|
+
* The fix does **not** add the code to `APPEND_ERROR_CODES`. That union is the
|
|
87
|
+
* log writer's vocabulary — the ways a byte can fail to reach the file — and
|
|
88
|
+
* "only humans may attest" is a fact about attestation, not about writing.
|
|
89
|
+
* Widening the writer's union to carry a caller's policy rule would oblige every
|
|
90
|
+
* future append site to consider a code that can only ever come from this one,
|
|
91
|
+
* and would make `core/log.ts` the place people look for permission rules.
|
|
92
|
+
* Instead this module widens the union *for itself*: `AppendResult` remains
|
|
93
|
+
* assignable to {@link AttestationAppendResult}, so nothing downstream is
|
|
94
|
+
* forced to change, and the CLI adds one case.
|
|
95
|
+
*/
|
|
96
|
+
export declare const ATTEST_ERROR_CODES: readonly ["lock-timeout", "corrupt-tail", "validation", "canonicalization", "io", "head-moved", "actor-not-human"];
|
|
97
|
+
export type AttestErrorCode = (typeof ATTEST_ERROR_CODES)[number];
|
|
98
|
+
export interface AttestError {
|
|
99
|
+
code: AttestErrorCode;
|
|
100
|
+
message: string;
|
|
101
|
+
/** Schema errors, present when `code` is "validation". */
|
|
102
|
+
errors?: ValidationError[];
|
|
103
|
+
}
|
|
104
|
+
/** {@link appendAttestation}'s result: `AppendResult` widened by one code. */
|
|
105
|
+
export type AttestationAppendResult = {
|
|
106
|
+
ok: true;
|
|
107
|
+
record: EventRecord;
|
|
108
|
+
line: string;
|
|
109
|
+
} | {
|
|
110
|
+
ok: false;
|
|
111
|
+
error: AttestError;
|
|
112
|
+
};
|
|
113
|
+
/** Options for {@link appendAttestation}: the append's, plus the clock. */
|
|
114
|
+
export interface AttestOptions extends AppendOptions, ClockOptions {
|
|
115
|
+
/**
|
|
116
|
+
* When supplied, append only if the file bytes read by this call have this
|
|
117
|
+
* digest. A ceremony that displayed bytes before asking for confirmation can
|
|
118
|
+
* thereby bind the record to what it showed rather than silently signing a
|
|
119
|
+
* replacement written between display and append.
|
|
120
|
+
*/
|
|
121
|
+
expectedSha256?: string;
|
|
122
|
+
}
|
|
123
|
+
/** The result of comparing the live policy file against the log. */
|
|
124
|
+
export type AttestationStatus = {
|
|
125
|
+
status: "attested";
|
|
126
|
+
seq: number;
|
|
127
|
+
sha256: string;
|
|
128
|
+
} | {
|
|
129
|
+
status: "not-attested";
|
|
130
|
+
} | {
|
|
131
|
+
status: "hash-mismatch";
|
|
132
|
+
attestedSha256: string;
|
|
133
|
+
liveSha256: string;
|
|
134
|
+
seq: number;
|
|
135
|
+
} | {
|
|
136
|
+
status: "unreadable";
|
|
137
|
+
message: string;
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* SHA-256 (lowercase hex) of a file's **exact bytes**.
|
|
141
|
+
*
|
|
142
|
+
* Bytes, not text: no encoding round-trip, no newline normalization, no parse.
|
|
143
|
+
* A policy file that differs only in trailing whitespace is a different policy
|
|
144
|
+
* file as far as attestation is concerned, which is the conservative reading
|
|
145
|
+
* and the only one that survives an adversary who knows what gets normalized.
|
|
146
|
+
*
|
|
147
|
+
* Throws if the file cannot be read; callers that need a status rather than an
|
|
148
|
+
* exception use {@link checkAttestation}, which converts that into
|
|
149
|
+
* `unreadable`.
|
|
150
|
+
*/
|
|
151
|
+
export declare function policyFileHash(path: string): string;
|
|
152
|
+
/**
|
|
153
|
+
* SHA-256 (lowercase hex) of policy bytes a caller has already read.
|
|
154
|
+
*
|
|
155
|
+
* The same digest {@link policyFileHash} computes, over bytes rather than a
|
|
156
|
+
* path. It exists so a gate operation can read `APPROVAL.md` once and hash the
|
|
157
|
+
* exact buffer it is also about to parse (APRV-142): hashing by path a second
|
|
158
|
+
* time would reopen the window where the attestation check and the parse can
|
|
159
|
+
* see different bytes.
|
|
160
|
+
*/
|
|
161
|
+
export declare function policyBytesHash(bytes: Uint8Array): string;
|
|
162
|
+
/**
|
|
163
|
+
* Append a `policy.updated` attestation for `policyPath` to `logPath`.
|
|
164
|
+
*
|
|
165
|
+
* `actor` MUST match `^human:.+`. An `agent:` or `system:` actor is refused
|
|
166
|
+
* before anything is read or written — the refusal is a structured result,
|
|
167
|
+
* never a throw, consistent with the rest of the write path. Its code is
|
|
168
|
+
* `actor-not-human`, this module's own (see {@link ATTEST_ERROR_CODES}): the
|
|
169
|
+
* actor failed the rule *this verb* enforces, which is a different fact from a
|
|
170
|
+
* record failing the event schema, and the two used to share `validation`.
|
|
171
|
+
*
|
|
172
|
+
* The event is deliberately minimal:
|
|
173
|
+
*
|
|
174
|
+
* ```json
|
|
175
|
+
* { "event": "policy.updated", "actor": "human:alice",
|
|
176
|
+
* "payload": { "policy_path": "APPROVAL.md", "sha256": "<64 hex>" } }
|
|
177
|
+
* ```
|
|
178
|
+
*
|
|
179
|
+
* `policy_path` is the **basename**, not the absolute path: the log is meant to
|
|
180
|
+
* be copied, exported, and read on other machines, and an absolute path would
|
|
181
|
+
* leak the writer's home directory into a permanent record while saying nothing
|
|
182
|
+
* a reader can use. `sha256` is the file's byte digest — the field
|
|
183
|
+
* {@link checkAttestation} compares against.
|
|
184
|
+
*
|
|
185
|
+
* `ts` is **not** a parameter. `policy.updated` is one of the gate-typed events
|
|
186
|
+
* of amended SPEC.md §8 (A2), so its timestamp is assigned by the runtime at the
|
|
187
|
+
* write boundary — read once from {@link AttestOptions.clock}, which defaults to
|
|
188
|
+
* the real clock and which tests inject. Attestation is the verb that decides
|
|
189
|
+
* which policy bytes are operative from a moment onward; a caller that could
|
|
190
|
+
* choose that moment could backdate the answer.
|
|
191
|
+
*
|
|
192
|
+
* ## Why this append carries no `expectedHead` (APRV-20 finding B1)
|
|
193
|
+
*
|
|
194
|
+
* Every *other* append site in the codebase reads the log, decides something
|
|
195
|
+
* from what it read, and must therefore prove the log has not moved before it
|
|
196
|
+
* writes. This one does not read the log at all. Its only precondition is the
|
|
197
|
+
* actor check and the policy file's bytes — neither of which the log can
|
|
198
|
+
* invalidate — so there is no check-then-act window to close. A concurrent
|
|
199
|
+
* appender simply means this attestation lands after that record, which is
|
|
200
|
+
* correct: attestation is an unconditional assertion about a file's bytes at a
|
|
201
|
+
* moment, and the *latest* attestation is the one `checkAttestation` honors.
|
|
202
|
+
* Passing a precondition here would only manufacture spurious failures.
|
|
203
|
+
*/
|
|
204
|
+
export declare function appendAttestation(logPath: string, policyPath: string, actor: string, options?: AttestOptions): AttestationAppendResult;
|
|
205
|
+
/**
|
|
206
|
+
* Compare the live policy file against the latest attestation in `records`.
|
|
207
|
+
*
|
|
208
|
+
* `records` is the log in append order, as a caller has already read and
|
|
209
|
+
* verified it; this function does no I/O on the log and never writes. The
|
|
210
|
+
* **latest** attestation wins — re-attesting after an edit is the supported
|
|
211
|
+
* repair, and an older attestation must not be able to vouch for bytes that a
|
|
212
|
+
* newer one already disagreed with.
|
|
213
|
+
*
|
|
214
|
+
* `payload.policy_path` is recorded but deliberately **not** matched against
|
|
215
|
+
* `policyPath`: v0.1 has exactly one policy file per approval home (SPEC.md
|
|
216
|
+
* §5), and a filename filter would let an attestation of `APPROVALS.md` and a
|
|
217
|
+
* live `APPROVAL.md` drift apart silently. Comparing only bytes means the
|
|
218
|
+
* mismatch surfaces as a mismatch.
|
|
219
|
+
*/
|
|
220
|
+
export declare function checkAttestation(records: EventRecord[], policyPath: string): AttestationStatus;
|
|
221
|
+
/** The `unreadable` status for a policy read the caller performed itself. */
|
|
222
|
+
export declare function unreadablePolicyStatus(policyPath: string, cause: string): AttestationStatus;
|
|
223
|
+
/**
|
|
224
|
+
* {@link checkAttestation} against bytes the caller already holds.
|
|
225
|
+
*
|
|
226
|
+
* Same comparison, no read. A gate operation reads the policy file once and
|
|
227
|
+
* passes that one buffer here and to the parser (APRV-142), which is what makes
|
|
228
|
+
* "attested one policy, enforced another" structurally impossible rather than
|
|
229
|
+
* merely unlikely.
|
|
230
|
+
*
|
|
231
|
+
* The `unreadable` status has no counterpart here: bytes that exist were read.
|
|
232
|
+
* A caller whose read failed calls {@link unreadablePolicyStatus} instead, so
|
|
233
|
+
* the fail-closed ordering of {@link checkAttestation} survives the split.
|
|
234
|
+
*/
|
|
235
|
+
export declare function checkAttestationOfBytes(records: EventRecord[], bytes: Uint8Array): AttestationStatus;
|
|
236
|
+
/**
|
|
237
|
+
* The refusal for a non-`attested` status, or `null` when policy is attested.
|
|
238
|
+
*
|
|
239
|
+
* One code (`policy-not-attested`) with a `detail` discriminator, rather than
|
|
240
|
+
* three codes: a caller that wants to refuse needs to branch on one value, and
|
|
241
|
+
* a caller that wants to explain has `detail` and `message`.
|
|
242
|
+
*/
|
|
243
|
+
export declare function attestationRefusal(status: AttestationStatus): AttestationRefusal | null;
|
|
244
|
+
/**
|
|
245
|
+
* The human identity to record as `actor`, or `null` when none is declared.
|
|
246
|
+
*
|
|
247
|
+
* Precedence: `options.actor` (the CLI's `--as`) first, then the
|
|
248
|
+
* `APPROVAL_HUMAN` environment variable. An explicit `--as` that does not match
|
|
249
|
+
* `^human:.+` yields `null` rather than falling back to the environment —
|
|
250
|
+
* silently substituting a different identity for the one the caller typed would
|
|
251
|
+
* be worse than refusing.
|
|
252
|
+
*
|
|
253
|
+
* This is **config-declared identity**. The trust boundary is the local
|
|
254
|
+
* machine: whoever can set `APPROVAL_HUMAN` and write to the log is inside it.
|
|
255
|
+
* v0.1 makes no cryptographic claim about who attested, only that a locally
|
|
256
|
+
* privileged act occurred and was recorded.
|
|
257
|
+
*/
|
|
258
|
+
export declare function resolveHumanActor(options?: {
|
|
259
|
+
actor?: string;
|
|
260
|
+
}): string | null;
|
|
261
|
+
/**
|
|
262
|
+
* The event an ORGAN attestation is: a human's sign-off on the exact bytes of
|
|
263
|
+
* one of the gate's own organ files.
|
|
264
|
+
*
|
|
265
|
+
* ## Why the organs need this at all
|
|
266
|
+
*
|
|
267
|
+
* `.claude/settings.json` and Cursor's hook files classify `policy.core`, and
|
|
268
|
+
* `policy.core` is human-only in this repository's policy and inert to agents
|
|
269
|
+
* by §11.1 invariant 9. So the gate mints NOTHING for them: `core/gate.ts`
|
|
270
|
+
* refuses a human-only class before any record is appended, which means the
|
|
271
|
+
* protected-path guard's `granted-file` and `granted-command` verdicts cannot
|
|
272
|
+
* exist for an organ, however correctly a human edited it. PR #300 is that hole,
|
|
273
|
+
* exactly: a human hand-committed hook entries and CI failed the change because
|
|
274
|
+
* the only evidence the guard could accept was evidence the gate is designed
|
|
275
|
+
* never to produce.
|
|
276
|
+
*
|
|
277
|
+
* Attestation is the primitive that already fits. It records "a human saw these
|
|
278
|
+
* exact bytes", it needs no grant, and it matches CONTENT rather than a path, so
|
|
279
|
+
* the guard can hash the blob at head and ask the log about it.
|
|
280
|
+
*
|
|
281
|
+
* ## Why a separate event type
|
|
282
|
+
*
|
|
283
|
+
* `core/log.ts`'s `EventType` note carries the argument in full. In one line:
|
|
284
|
+
* every reader of the POLICY attestation selects on `event === "policy.updated"`,
|
|
285
|
+
* so a distinct type is invisible to all of them by construction, and
|
|
286
|
+
* {@link checkAttestationOfBytes} returns at the first `sha256`-bearing record
|
|
287
|
+
* it meets scanning backwards — an organ record wearing `policy.updated` would
|
|
288
|
+
* have made a correctly attested policy read as `hash-mismatch`.
|
|
289
|
+
*/
|
|
290
|
+
export declare const ORGAN_ATTESTATION_EVENT: "gate.organ.attested";
|
|
291
|
+
/**
|
|
292
|
+
* The payload field naming which organ was attested.
|
|
293
|
+
*
|
|
294
|
+
* Repository-relative and `/`-separated, never absolute: the log is meant to be
|
|
295
|
+
* copied and read on other machines, and an absolute path would leak the
|
|
296
|
+
* writer's home directory into a permanent record. Unlike the policy
|
|
297
|
+
* attestation, which records a BASENAME because v0.1 has exactly one policy file
|
|
298
|
+
* per approval home, an organ record has to carry the whole relative path —
|
|
299
|
+
* there are several organs, they live in different directories, and the guard's
|
|
300
|
+
* rule is that a digest attested for one path is not evidence for another.
|
|
301
|
+
*/
|
|
302
|
+
export declare const ORGAN_PATH_FIELD = "organ_path";
|
|
303
|
+
/**
|
|
304
|
+
* Why an organ attestation was refused: the policy attestation's codes, plus
|
|
305
|
+
* the two rules this verb has of its own.
|
|
306
|
+
*
|
|
307
|
+
* Two codes and not one, because the repairs are different and a caller must be
|
|
308
|
+
* able to tell them apart. `path-is-policy` means the caller aimed the organ
|
|
309
|
+
* verb at the policy file, whose attestation is `approval policy attest` with no
|
|
310
|
+
* `--organ` and which the gate reads on every operation. `path-not-organ` covers
|
|
311
|
+
* everything else the runtime will not attest this way: the approval home, whose
|
|
312
|
+
* contents are the human's own ceremony surface, and any ordinary file, which is
|
|
313
|
+
* not part of the gate and needs no attestation to be edited.
|
|
314
|
+
*/
|
|
315
|
+
export declare const ORGAN_ATTEST_ERROR_CODES: readonly ["lock-timeout", "corrupt-tail", "validation", "canonicalization", "io", "head-moved", "actor-not-human", "path-not-organ", "path-is-policy"];
|
|
316
|
+
export type OrganAttestErrorCode = (typeof ORGAN_ATTEST_ERROR_CODES)[number];
|
|
317
|
+
export interface OrganAttestError {
|
|
318
|
+
code: OrganAttestErrorCode;
|
|
319
|
+
message: string;
|
|
320
|
+
/** Schema errors, present when `code` is "validation". */
|
|
321
|
+
errors?: ValidationError[];
|
|
322
|
+
}
|
|
323
|
+
/** {@link appendOrganAttestation}'s result: the append's, widened by two codes. */
|
|
324
|
+
export type OrganAttestationAppendResult = {
|
|
325
|
+
ok: true;
|
|
326
|
+
record: EventRecord;
|
|
327
|
+
line: string;
|
|
328
|
+
} | {
|
|
329
|
+
ok: false;
|
|
330
|
+
error: OrganAttestError;
|
|
331
|
+
};
|
|
332
|
+
/**
|
|
333
|
+
* Which file to attest, in the two spellings that are not the same fact.
|
|
334
|
+
*
|
|
335
|
+
* `path` is the identity the record carries and the guard matches on, so it is
|
|
336
|
+
* repository-relative. `root` is where that path is rooted on THIS machine, and
|
|
337
|
+
* it never reaches the log. Splitting them is what keeps an absolute path out
|
|
338
|
+
* of a permanent record without making the record ambiguous about which of
|
|
339
|
+
* several organs it names.
|
|
340
|
+
*/
|
|
341
|
+
export interface OrganTarget {
|
|
342
|
+
/** Repository-relative, e.g. `.claude/settings.json`. */
|
|
343
|
+
path: string;
|
|
344
|
+
/** The checkout `path` is relative to; `join(root, path)` is hashed. */
|
|
345
|
+
root: string;
|
|
346
|
+
}
|
|
347
|
+
/** The identity and digest an organ attestation carries, or `null`. */
|
|
348
|
+
export interface OrganAttestationFields {
|
|
349
|
+
organPath: string;
|
|
350
|
+
sha256: string;
|
|
351
|
+
}
|
|
352
|
+
/** An organ attestation found in the log, with the record it came from. */
|
|
353
|
+
export interface OrganAttestation extends OrganAttestationFields {
|
|
354
|
+
record: EventRecord;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Append a `gate.organ.attested` record for `target` to `logPath`.
|
|
358
|
+
*
|
|
359
|
+
* The rules, all of them refused as structured results and never as throws, in
|
|
360
|
+
* the order they are checked:
|
|
361
|
+
*
|
|
362
|
+
* 1. `actor` MUST match `^human:.+`. Attestation is the verb an agent must not
|
|
363
|
+
* perform, and it is refused here in code and again at the CLI, exactly as
|
|
364
|
+
* {@link appendAttestation} is.
|
|
365
|
+
* 2. The path must be repository-relative: absolute paths and `..` are refused,
|
|
366
|
+
* because the recorded identity has to mean the same file on the machine
|
|
367
|
+
* that later reads the log.
|
|
368
|
+
* 3. The policy file is refused with its own code. It has its own attestation
|
|
369
|
+
* and the gate reads it on every operation; letting the organ verb write a
|
|
370
|
+
* record about it would create a second thing that looks like a policy
|
|
371
|
+
* attestation and is not one.
|
|
372
|
+
* 4. The path must be a gate organ ({@link isGateOrganPath}). Nothing else is
|
|
373
|
+
* attestable this way, so the verb cannot be turned into a general
|
|
374
|
+
* "bless these bytes" primitive for any file at all.
|
|
375
|
+
*
|
|
376
|
+
* The digest is computed by the runtime from the file's exact bytes. There is
|
|
377
|
+
* no parameter for it, which is the same reason there is no `ts` parameter: a
|
|
378
|
+
* caller who could supply the hash could attest bytes nobody read, and a caller
|
|
379
|
+
* who could supply the moment could backdate what was operative when.
|
|
380
|
+
*
|
|
381
|
+
* Like {@link appendAttestation} this append carries no `expectedHead`. It reads
|
|
382
|
+
* nothing from the log, so it has no check-then-act window to close; a
|
|
383
|
+
* concurrent appender only means this record lands after theirs.
|
|
384
|
+
*/
|
|
385
|
+
export declare function appendOrganAttestation(logPath: string, target: OrganTarget, actor: string, options?: AttestOptions): OrganAttestationAppendResult;
|
|
386
|
+
/**
|
|
387
|
+
* Is this record an organ attestation, and which bytes of which file does it
|
|
388
|
+
* vouch for?
|
|
389
|
+
*
|
|
390
|
+
* A record missing either field is ignored, for the reason a `policy.updated`
|
|
391
|
+
* with no `sha256` is ignored: a record that asserts nothing about bytes must
|
|
392
|
+
* never be able to SATISFY a check about bytes. Fail closed.
|
|
393
|
+
*/
|
|
394
|
+
export declare function organAttestationOf(record: EventRecord): OrganAttestationFields | null;
|
|
395
|
+
/**
|
|
396
|
+
* The record in which a human attested THIS digest FOR THIS path, latest first,
|
|
397
|
+
* or `null`.
|
|
398
|
+
*
|
|
399
|
+
* Both halves are required and that is the whole rule: a digest attested for
|
|
400
|
+
* some other organ is not evidence for this one. Two organ files with identical
|
|
401
|
+
* bytes (two checkouts of the same hook entry, say) are still two files, and a
|
|
402
|
+
* human who signed one has said nothing about the other.
|
|
403
|
+
*
|
|
404
|
+
* Unlike the policy attestation there is no "latest wins" supersession here.
|
|
405
|
+
* Every organ attestation stands for the bytes it names: the guard asks about a
|
|
406
|
+
* blob at a commit that may be months old, and the newest attestation of a file
|
|
407
|
+
* says nothing about whether an older set of bytes was once signed off. The
|
|
408
|
+
* gate reads none of these records, so a stale one authorizes nothing on its
|
|
409
|
+
* own — it is evidence about a change, and evidence does not expire the way an
|
|
410
|
+
* operative policy does.
|
|
411
|
+
*/
|
|
412
|
+
export declare function findOrganAttestation(records: readonly EventRecord[], organPath: string, sha256: string): EventRecord | null;
|
|
413
|
+
/**
|
|
414
|
+
* The most recent attestation of `organPath` at ANY digest, or `null`.
|
|
415
|
+
*
|
|
416
|
+
* What a status surface needs to tell "this file has never been attested" from
|
|
417
|
+
* "this file was attested and has been edited since". Nothing enforcing reads
|
|
418
|
+
* it: {@link findOrganAttestation} is the question the guard asks.
|
|
419
|
+
*/
|
|
420
|
+
export declare function latestOrganAttestation(records: readonly EventRecord[], organPath: string): OrganAttestation | null;
|