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,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monetary amounts in hashed material (APRV-121).
|
|
3
|
+
*
|
|
4
|
+
* ## The representation, and why
|
|
5
|
+
*
|
|
6
|
+
* Every USD amount that enters hashed material — an envelope's
|
|
7
|
+
* `actions[].est_cost_usd` and `budget.max_cost_usd`, the `est_cost_usd` the
|
|
8
|
+
* gate records on `approval.requested`, `approval.granted`, `execution.started`
|
|
9
|
+
* and `budget.exceeded`, and the `est_cost_usd` an execution token binds to —
|
|
10
|
+
* is a **decimal string**: `"0"`, `"0.02"`, `"1200.5"`. Not a JSON number.
|
|
11
|
+
*
|
|
12
|
+
* RFC 8785 pins ES6 number serialization, so a single TypeScript runtime is
|
|
13
|
+
* internally consistent with itself. Cross-language it is not: the fast-path of
|
|
14
|
+
* SPEC.md §13 and any second implementation must reproduce the same bytes from
|
|
15
|
+
* the same value, and float formatting is precisely where that breaks. A
|
|
16
|
+
* decimal string has one spelling, and every language agrees on it because
|
|
17
|
+
* nobody has to reserialize anything.
|
|
18
|
+
*
|
|
19
|
+
* **String decimal, not integer minor units.** Both remove the float; the
|
|
20
|
+
* choice is about what a human writes and reads. The field is named
|
|
21
|
+
* `est_cost_usd` and a task author writes it in YAML frontmatter next to a
|
|
22
|
+
* one-line summary; `est_cost_usd: "0.02"` still says two cents, while
|
|
23
|
+
* `est_cost_usd: 20000` says nothing without knowing the exponent this project
|
|
24
|
+
* picked, and picking one commits the format to a currency decision (USD has
|
|
25
|
+
* two decimal places, other currencies do not) that the field name does not
|
|
26
|
+
* make. The string also round-trips into and out of a channel message, a CLI
|
|
27
|
+
* table, and a policy discussion without a conversion anyone can get wrong.
|
|
28
|
+
*
|
|
29
|
+
* ## The canonical form
|
|
30
|
+
*
|
|
31
|
+
* {@link USD_STRING_PATTERN}: an optional integer part with no leading zeros,
|
|
32
|
+
* an optional fraction of one to six digits, no sign, no exponent, no trailing
|
|
33
|
+
* dot, no trailing zeros beyond the last significant digit. One value, one
|
|
34
|
+
* spelling — `"0.10"` and `"0.1"` cannot both be written, so two records
|
|
35
|
+
* carrying the same amount always hash the same way.
|
|
36
|
+
*
|
|
37
|
+
* Six fractional digits is the resolution, matching the micro-USD unit the
|
|
38
|
+
* arithmetic below runs in. It is far finer than any real amount and far
|
|
39
|
+
* coarser than IEEE-754 drift.
|
|
40
|
+
*
|
|
41
|
+
* ## The arithmetic
|
|
42
|
+
*
|
|
43
|
+
* All budget arithmetic runs in **integer micro-USD**. A decimal string parses
|
|
44
|
+
* to micros by integer string manipulation, never through a double, so no
|
|
45
|
+
* rounding happens on the way in and none is possible on the way back out.
|
|
46
|
+
* Sums, comparisons, and remainders are exact integers: `"0.1" + "0.2"` is
|
|
47
|
+
* `"0.3"`, and a window of ten thousand two-cent actions is exactly `"200"`
|
|
48
|
+
* rather than a value that depends on the order they were added in.
|
|
49
|
+
*
|
|
50
|
+
* ## Historical compatibility (SPEC.md §8, additive-change precedent)
|
|
51
|
+
*
|
|
52
|
+
* The log is append-only, so records written before this change carry JSON
|
|
53
|
+
* numbers and must keep validating, verifying, and feeding budget math exactly
|
|
54
|
+
* as before. Every reader here therefore accepts both forms: a decimal string
|
|
55
|
+
* (the only form the write boundary now admits) and a finite non-negative JSON
|
|
56
|
+
* number (the historical form). A historical number converts to micros by
|
|
57
|
+
* `Math.round(value * 1e6)`, which is deterministic for every amount the old
|
|
58
|
+
* write boundary could have admitted. The write boundary is the only place the
|
|
59
|
+
* two forms are told apart: `schema/*.schema.json` types the fields as decimal
|
|
60
|
+
* strings, and `validate(..., { mode: "historical" })` is the one documented
|
|
61
|
+
* relaxation, used by the verifier and nothing else.
|
|
62
|
+
*/
|
|
63
|
+
/** Micro-USD per USD: the resolution of every amount in this module. */
|
|
64
|
+
export declare const USD_MICROS_SCALE = 1000000;
|
|
65
|
+
/** Fractional digits the canonical form admits (the micro-USD resolution). */
|
|
66
|
+
export declare const USD_FRACTION_DIGITS = 6;
|
|
67
|
+
/**
|
|
68
|
+
* The canonical decimal-string form, as a JSON Schema `pattern` source.
|
|
69
|
+
*
|
|
70
|
+
* Exported so the schemas and the runtime cannot drift: `tests/money.test.ts`
|
|
71
|
+
* asserts the schema files carry exactly this string.
|
|
72
|
+
*/
|
|
73
|
+
export declare const USD_STRING_PATTERN = "^(0|[1-9][0-9]*)(\\.[0-9]{0,5}[1-9])?$";
|
|
74
|
+
/** Is `value` a canonical decimal USD string? */
|
|
75
|
+
export declare function isUsdString(value: unknown): value is string;
|
|
76
|
+
/**
|
|
77
|
+
* A canonical decimal string as integer micro-USD, or `null` when the string is
|
|
78
|
+
* not canonical.
|
|
79
|
+
*
|
|
80
|
+
* Parsed by integer arithmetic on the digits: the fraction is padded to six
|
|
81
|
+
* places and the two halves are combined, so the double never sees the value.
|
|
82
|
+
*/
|
|
83
|
+
export declare function usdStringToMicros(value: string): number | null;
|
|
84
|
+
/**
|
|
85
|
+
* A historical JSON number as integer micro-USD, or `null` when it is not a
|
|
86
|
+
* usable amount (non-finite, negative, or beyond the safe-integer range once
|
|
87
|
+
* scaled).
|
|
88
|
+
*
|
|
89
|
+
* `Math.round` is the documented conversion. It is deterministic, and for every
|
|
90
|
+
* value the pre-APRV-121 write boundary admitted (`minimum: 0`, ES6-serialized)
|
|
91
|
+
* it lands on the micro the author wrote.
|
|
92
|
+
*/
|
|
93
|
+
export declare function usdNumberToMicros(value: number): number | null;
|
|
94
|
+
/**
|
|
95
|
+
* Either accepted form as integer micro-USD, or `null` when the value is not a
|
|
96
|
+
* usable amount.
|
|
97
|
+
*
|
|
98
|
+
* This is the reader every enforcement path uses. It accepts the historical
|
|
99
|
+
* number deliberately: a record already in the log must feed budget math
|
|
100
|
+
* identically to before this change.
|
|
101
|
+
*/
|
|
102
|
+
export declare function usdToMicros(value: unknown): number | null;
|
|
103
|
+
/** Integer micro-USD as the canonical decimal string. */
|
|
104
|
+
export declare function microsToUsdString(micros: number): string;
|
|
105
|
+
/**
|
|
106
|
+
* Integer micro-USD as a JSON number, for **display and CLI output only**.
|
|
107
|
+
*
|
|
108
|
+
* Never write the result of this function into hashed material: that is the
|
|
109
|
+
* float this module exists to remove. Budget verdicts report through it because
|
|
110
|
+
* a verdict is a rendered explanation of a decision the integers already made.
|
|
111
|
+
*/
|
|
112
|
+
export declare function microsToUsdNumber(micros: number): number;
|
|
113
|
+
/**
|
|
114
|
+
* Either accepted form as a canonical decimal string, or `null` when the value
|
|
115
|
+
* is not a usable amount.
|
|
116
|
+
*
|
|
117
|
+
* The normalizer at every boundary where an amount arrives from outside: a task
|
|
118
|
+
* envelope, a CLI flag, a historical log record.
|
|
119
|
+
*/
|
|
120
|
+
export declare function normalizeUsd(value: unknown): string | null;
|
|
121
|
+
/**
|
|
122
|
+
* Either accepted form as a canonical decimal string, defaulting to `"0"`.
|
|
123
|
+
*
|
|
124
|
+
* The budgets contract of `core/budgets.ts` requires `est_cost_usd` on every
|
|
125
|
+
* consuming event, and an action that declared no cost is recorded as `"0"` —
|
|
126
|
+
* an authorization with no declared cost is still an authorization.
|
|
127
|
+
*/
|
|
128
|
+
export declare function usdOrZero(value: unknown): string;
|
|
129
|
+
/**
|
|
130
|
+
* Either accepted form as a JSON number, for **display surfaces only**: a
|
|
131
|
+
* channel card, a CLI table, a `--json` field a human reads.
|
|
132
|
+
*
|
|
133
|
+
* `0` for anything unusable, so a renderer never has to decide what to print
|
|
134
|
+
* for a malformed amount. Same warning as {@link microsToUsdNumber}: the result
|
|
135
|
+
* of this function must never be written into hashed material.
|
|
136
|
+
*/
|
|
137
|
+
export declare function usdNumber(value: unknown): number;
|
|
138
|
+
/**
|
|
139
|
+
* Either accepted form as a JSON number, or `null` when there is no amount.
|
|
140
|
+
*
|
|
141
|
+
* The display counterpart of {@link normalizeUsd}: it keeps "declared nothing"
|
|
142
|
+
* distinct from "declared zero", which is a distinction the queue's own columns
|
|
143
|
+
* make.
|
|
144
|
+
*/
|
|
145
|
+
export declare function usdNumberOrNull(value: unknown): number | null;
|
|
146
|
+
/** An amount as accepted from a caller: canonical string, or historical number. */
|
|
147
|
+
export type UsdInput = string | number;
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monetary amounts in hashed material (APRV-121).
|
|
3
|
+
*
|
|
4
|
+
* ## The representation, and why
|
|
5
|
+
*
|
|
6
|
+
* Every USD amount that enters hashed material — an envelope's
|
|
7
|
+
* `actions[].est_cost_usd` and `budget.max_cost_usd`, the `est_cost_usd` the
|
|
8
|
+
* gate records on `approval.requested`, `approval.granted`, `execution.started`
|
|
9
|
+
* and `budget.exceeded`, and the `est_cost_usd` an execution token binds to —
|
|
10
|
+
* is a **decimal string**: `"0"`, `"0.02"`, `"1200.5"`. Not a JSON number.
|
|
11
|
+
*
|
|
12
|
+
* RFC 8785 pins ES6 number serialization, so a single TypeScript runtime is
|
|
13
|
+
* internally consistent with itself. Cross-language it is not: the fast-path of
|
|
14
|
+
* SPEC.md §13 and any second implementation must reproduce the same bytes from
|
|
15
|
+
* the same value, and float formatting is precisely where that breaks. A
|
|
16
|
+
* decimal string has one spelling, and every language agrees on it because
|
|
17
|
+
* nobody has to reserialize anything.
|
|
18
|
+
*
|
|
19
|
+
* **String decimal, not integer minor units.** Both remove the float; the
|
|
20
|
+
* choice is about what a human writes and reads. The field is named
|
|
21
|
+
* `est_cost_usd` and a task author writes it in YAML frontmatter next to a
|
|
22
|
+
* one-line summary; `est_cost_usd: "0.02"` still says two cents, while
|
|
23
|
+
* `est_cost_usd: 20000` says nothing without knowing the exponent this project
|
|
24
|
+
* picked, and picking one commits the format to a currency decision (USD has
|
|
25
|
+
* two decimal places, other currencies do not) that the field name does not
|
|
26
|
+
* make. The string also round-trips into and out of a channel message, a CLI
|
|
27
|
+
* table, and a policy discussion without a conversion anyone can get wrong.
|
|
28
|
+
*
|
|
29
|
+
* ## The canonical form
|
|
30
|
+
*
|
|
31
|
+
* {@link USD_STRING_PATTERN}: an optional integer part with no leading zeros,
|
|
32
|
+
* an optional fraction of one to six digits, no sign, no exponent, no trailing
|
|
33
|
+
* dot, no trailing zeros beyond the last significant digit. One value, one
|
|
34
|
+
* spelling — `"0.10"` and `"0.1"` cannot both be written, so two records
|
|
35
|
+
* carrying the same amount always hash the same way.
|
|
36
|
+
*
|
|
37
|
+
* Six fractional digits is the resolution, matching the micro-USD unit the
|
|
38
|
+
* arithmetic below runs in. It is far finer than any real amount and far
|
|
39
|
+
* coarser than IEEE-754 drift.
|
|
40
|
+
*
|
|
41
|
+
* ## The arithmetic
|
|
42
|
+
*
|
|
43
|
+
* All budget arithmetic runs in **integer micro-USD**. A decimal string parses
|
|
44
|
+
* to micros by integer string manipulation, never through a double, so no
|
|
45
|
+
* rounding happens on the way in and none is possible on the way back out.
|
|
46
|
+
* Sums, comparisons, and remainders are exact integers: `"0.1" + "0.2"` is
|
|
47
|
+
* `"0.3"`, and a window of ten thousand two-cent actions is exactly `"200"`
|
|
48
|
+
* rather than a value that depends on the order they were added in.
|
|
49
|
+
*
|
|
50
|
+
* ## Historical compatibility (SPEC.md §8, additive-change precedent)
|
|
51
|
+
*
|
|
52
|
+
* The log is append-only, so records written before this change carry JSON
|
|
53
|
+
* numbers and must keep validating, verifying, and feeding budget math exactly
|
|
54
|
+
* as before. Every reader here therefore accepts both forms: a decimal string
|
|
55
|
+
* (the only form the write boundary now admits) and a finite non-negative JSON
|
|
56
|
+
* number (the historical form). A historical number converts to micros by
|
|
57
|
+
* `Math.round(value * 1e6)`, which is deterministic for every amount the old
|
|
58
|
+
* write boundary could have admitted. The write boundary is the only place the
|
|
59
|
+
* two forms are told apart: `schema/*.schema.json` types the fields as decimal
|
|
60
|
+
* strings, and `validate(..., { mode: "historical" })` is the one documented
|
|
61
|
+
* relaxation, used by the verifier and nothing else.
|
|
62
|
+
*/
|
|
63
|
+
/** Micro-USD per USD: the resolution of every amount in this module. */
|
|
64
|
+
export const USD_MICROS_SCALE = 1_000_000;
|
|
65
|
+
/** Fractional digits the canonical form admits (the micro-USD resolution). */
|
|
66
|
+
export const USD_FRACTION_DIGITS = 6;
|
|
67
|
+
/**
|
|
68
|
+
* The canonical decimal-string form, as a JSON Schema `pattern` source.
|
|
69
|
+
*
|
|
70
|
+
* Exported so the schemas and the runtime cannot drift: `tests/money.test.ts`
|
|
71
|
+
* asserts the schema files carry exactly this string.
|
|
72
|
+
*/
|
|
73
|
+
export const USD_STRING_PATTERN = "^(0|[1-9][0-9]*)(\\.[0-9]{0,5}[1-9])?$";
|
|
74
|
+
const CANONICAL = /^(0|[1-9][0-9]*)(\.([0-9]{0,5}[1-9]))?$/u;
|
|
75
|
+
/** Is `value` a canonical decimal USD string? */
|
|
76
|
+
export function isUsdString(value) {
|
|
77
|
+
return typeof value === "string" && CANONICAL.test(value);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* A canonical decimal string as integer micro-USD, or `null` when the string is
|
|
81
|
+
* not canonical.
|
|
82
|
+
*
|
|
83
|
+
* Parsed by integer arithmetic on the digits: the fraction is padded to six
|
|
84
|
+
* places and the two halves are combined, so the double never sees the value.
|
|
85
|
+
*/
|
|
86
|
+
export function usdStringToMicros(value) {
|
|
87
|
+
const match = CANONICAL.exec(value);
|
|
88
|
+
if (match === null)
|
|
89
|
+
return null;
|
|
90
|
+
const whole = match[1] ?? "0";
|
|
91
|
+
const fraction = (match[3] ?? "").padEnd(USD_FRACTION_DIGITS, "0");
|
|
92
|
+
const micros = Number(whole) * USD_MICROS_SCALE + Number(fraction);
|
|
93
|
+
return Number.isSafeInteger(micros) ? micros : null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* A historical JSON number as integer micro-USD, or `null` when it is not a
|
|
97
|
+
* usable amount (non-finite, negative, or beyond the safe-integer range once
|
|
98
|
+
* scaled).
|
|
99
|
+
*
|
|
100
|
+
* `Math.round` is the documented conversion. It is deterministic, and for every
|
|
101
|
+
* value the pre-APRV-121 write boundary admitted (`minimum: 0`, ES6-serialized)
|
|
102
|
+
* it lands on the micro the author wrote.
|
|
103
|
+
*/
|
|
104
|
+
export function usdNumberToMicros(value) {
|
|
105
|
+
if (!Number.isFinite(value) || value < 0)
|
|
106
|
+
return null;
|
|
107
|
+
const micros = Math.round(value * USD_MICROS_SCALE);
|
|
108
|
+
return Number.isSafeInteger(micros) ? micros : null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Either accepted form as integer micro-USD, or `null` when the value is not a
|
|
112
|
+
* usable amount.
|
|
113
|
+
*
|
|
114
|
+
* This is the reader every enforcement path uses. It accepts the historical
|
|
115
|
+
* number deliberately: a record already in the log must feed budget math
|
|
116
|
+
* identically to before this change.
|
|
117
|
+
*/
|
|
118
|
+
export function usdToMicros(value) {
|
|
119
|
+
if (typeof value === "string")
|
|
120
|
+
return usdStringToMicros(value);
|
|
121
|
+
if (typeof value === "number")
|
|
122
|
+
return usdNumberToMicros(value);
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
/** Integer micro-USD as the canonical decimal string. */
|
|
126
|
+
export function microsToUsdString(micros) {
|
|
127
|
+
if (!Number.isFinite(micros))
|
|
128
|
+
return "0";
|
|
129
|
+
const rounded = Math.round(micros);
|
|
130
|
+
const negative = rounded < 0;
|
|
131
|
+
const magnitude = Math.abs(rounded);
|
|
132
|
+
const whole = Math.floor(magnitude / USD_MICROS_SCALE);
|
|
133
|
+
const fraction = String(magnitude % USD_MICROS_SCALE)
|
|
134
|
+
.padStart(USD_FRACTION_DIGITS, "0")
|
|
135
|
+
.replace(/0+$/u, "");
|
|
136
|
+
const text = fraction === "" ? String(whole) : `${String(whole)}.${fraction}`;
|
|
137
|
+
// A negative amount is not a canonical value and never enters hashed
|
|
138
|
+
// material; it exists only as budget headroom already spent, which the
|
|
139
|
+
// verdict reports as a number rather than through this function.
|
|
140
|
+
return negative ? `-${text}` : text;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Integer micro-USD as a JSON number, for **display and CLI output only**.
|
|
144
|
+
*
|
|
145
|
+
* Never write the result of this function into hashed material: that is the
|
|
146
|
+
* float this module exists to remove. Budget verdicts report through it because
|
|
147
|
+
* a verdict is a rendered explanation of a decision the integers already made.
|
|
148
|
+
*/
|
|
149
|
+
export function microsToUsdNumber(micros) {
|
|
150
|
+
return Math.round(micros) / USD_MICROS_SCALE;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Either accepted form as a canonical decimal string, or `null` when the value
|
|
154
|
+
* is not a usable amount.
|
|
155
|
+
*
|
|
156
|
+
* The normalizer at every boundary where an amount arrives from outside: a task
|
|
157
|
+
* envelope, a CLI flag, a historical log record.
|
|
158
|
+
*/
|
|
159
|
+
export function normalizeUsd(value) {
|
|
160
|
+
const micros = usdToMicros(value);
|
|
161
|
+
return micros === null ? null : microsToUsdString(micros);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Either accepted form as a canonical decimal string, defaulting to `"0"`.
|
|
165
|
+
*
|
|
166
|
+
* The budgets contract of `core/budgets.ts` requires `est_cost_usd` on every
|
|
167
|
+
* consuming event, and an action that declared no cost is recorded as `"0"` —
|
|
168
|
+
* an authorization with no declared cost is still an authorization.
|
|
169
|
+
*/
|
|
170
|
+
export function usdOrZero(value) {
|
|
171
|
+
return normalizeUsd(value) ?? "0";
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Either accepted form as a JSON number, for **display surfaces only**: a
|
|
175
|
+
* channel card, a CLI table, a `--json` field a human reads.
|
|
176
|
+
*
|
|
177
|
+
* `0` for anything unusable, so a renderer never has to decide what to print
|
|
178
|
+
* for a malformed amount. Same warning as {@link microsToUsdNumber}: the result
|
|
179
|
+
* of this function must never be written into hashed material.
|
|
180
|
+
*/
|
|
181
|
+
export function usdNumber(value) {
|
|
182
|
+
return microsToUsdNumber(usdToMicros(value) ?? 0);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Either accepted form as a JSON number, or `null` when there is no amount.
|
|
186
|
+
*
|
|
187
|
+
* The display counterpart of {@link normalizeUsd}: it keeps "declared nothing"
|
|
188
|
+
* distinct from "declared zero", which is a distinction the queue's own columns
|
|
189
|
+
* make.
|
|
190
|
+
*/
|
|
191
|
+
export function usdNumberOrNull(value) {
|
|
192
|
+
const micros = usdToMicros(value);
|
|
193
|
+
return micros === null ? null : microsToUsdNumber(micros);
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=money.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"money.js","sourceRoot":"","sources":["../../../src/core/money.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the payload store holds, read against what the log says about it
|
|
3
|
+
* (APRV-41's counts, APRV-59's home for them).
|
|
4
|
+
*
|
|
5
|
+
* The census is a *reporting* question, asked by `approval doctor` and by
|
|
6
|
+
* `approval status`, and answered from two sources that can disagree: the files
|
|
7
|
+
* under `.approval/payloads/` and the records of `events.jsonl`. It decides
|
|
8
|
+
* nothing and deletes nothing. The daemon's pruner (`daemon/prune.ts`) is the
|
|
9
|
+
* only caller allowed to act on the same facts, and it derives its plan through
|
|
10
|
+
* the two helpers exported here so that the counts a reader is shown and the
|
|
11
|
+
* files the daemon would remove are computed by one piece of code.
|
|
12
|
+
*
|
|
13
|
+
* ## Why this lives in `core/` and not beside the pruner
|
|
14
|
+
*
|
|
15
|
+
* The CLI reports these numbers, and a CLI verb reaching into `daemon/` to do it
|
|
16
|
+
* is the wrong direction: `daemon/` is a caller of the core, never a dependency
|
|
17
|
+
* of the surfaces. This module is that shared core. Nothing here reads a clock,
|
|
18
|
+
* loads a policy, appends an event, or unlinks a file.
|
|
19
|
+
*
|
|
20
|
+
* ## Why not in `core/payload-store.ts`
|
|
21
|
+
*
|
|
22
|
+
* The store module is deliberately ignorant of the log ("Nothing here opens
|
|
23
|
+
* `events.jsonl`"): it addresses bytes by hash and verifies them, and that
|
|
24
|
+
* narrowness is what makes it safe to call from every channel. The census is the
|
|
25
|
+
* opposite kind of thing, a comparison between the log and the store, so it gets
|
|
26
|
+
* its own module rather than teaching the store to read events.
|
|
27
|
+
*/
|
|
28
|
+
import type { EventRecord } from "./log.js";
|
|
29
|
+
/** Hashes a `payload.pruned` record already names. */
|
|
30
|
+
export declare function prunedHashes(records: EventRecord[]): Set<string>;
|
|
31
|
+
export interface Binding {
|
|
32
|
+
/** Action keys that declared this hash. */
|
|
33
|
+
actionKeys: Set<string>;
|
|
34
|
+
/** A record named the hash without an action key: bound, but unattributable. */
|
|
35
|
+
unattributed: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Every hash any record binds to, mapped to the actions that declared it.
|
|
39
|
+
*
|
|
40
|
+
* Two attributions are understood, because they are the two the runtime writes:
|
|
41
|
+
* a `payload_hash` beside a record's own `action_key` (`approval.requested` and
|
|
42
|
+
* `approval.granted` carry it there), and the `payload_hash` of each action
|
|
43
|
+
* inside a `task.registered` envelope, attributed to that action's
|
|
44
|
+
* `idempotency_key` — which is where a *registered but not yet requested* action
|
|
45
|
+
* declares its bytes. Without the second, a payload stored at registration time
|
|
46
|
+
* would look like residue nothing bound and be pruned out from under the request
|
|
47
|
+
* about to be made for it.
|
|
48
|
+
*
|
|
49
|
+
* Everything else is caught by a deep scan and deliberately treated as a
|
|
50
|
+
* binding this module cannot attribute: an unattributable binding is never
|
|
51
|
+
* prunable, so an event shape nobody here anticipated makes a payload immortal
|
|
52
|
+
* rather than making it disposable. The only event exempt from the scan is
|
|
53
|
+
* `payload.pruned`, whose whole job is to name bytes that are going.
|
|
54
|
+
*/
|
|
55
|
+
export declare function bindingsOf(records: EventRecord[]): Map<string, Binding>;
|
|
56
|
+
export interface PayloadStoreCensus {
|
|
57
|
+
/** Files the store currently holds, by hash. */
|
|
58
|
+
files: number;
|
|
59
|
+
/** Distinct hashes a `payload.pruned` event names — evidence that outlived bytes. */
|
|
60
|
+
pruned: number;
|
|
61
|
+
/** Files present that no record binds: head-moved residue, prunable when enabled. */
|
|
62
|
+
orphans: number;
|
|
63
|
+
/** Files present whose prune event is already logged (a crash mid-prune). */
|
|
64
|
+
awaitingRemoval: number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Count what the store holds against what the log says about it.
|
|
68
|
+
*
|
|
69
|
+
* Honest in both directions and about both failure modes: `pruned` is a fact of
|
|
70
|
+
* the log (it stays true forever, whatever the store does), `orphans` and
|
|
71
|
+
* `awaitingRemoval` are facts about the disagreement between the two. None of
|
|
72
|
+
* them is a health verdict; a reader is being told what is there.
|
|
73
|
+
*/
|
|
74
|
+
export declare function payloadStoreCensus(records: EventRecord[], storeDir: string): PayloadStoreCensus;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the payload store holds, read against what the log says about it
|
|
3
|
+
* (APRV-41's counts, APRV-59's home for them).
|
|
4
|
+
*
|
|
5
|
+
* The census is a *reporting* question, asked by `approval doctor` and by
|
|
6
|
+
* `approval status`, and answered from two sources that can disagree: the files
|
|
7
|
+
* under `.approval/payloads/` and the records of `events.jsonl`. It decides
|
|
8
|
+
* nothing and deletes nothing. The daemon's pruner (`daemon/prune.ts`) is the
|
|
9
|
+
* only caller allowed to act on the same facts, and it derives its plan through
|
|
10
|
+
* the two helpers exported here so that the counts a reader is shown and the
|
|
11
|
+
* files the daemon would remove are computed by one piece of code.
|
|
12
|
+
*
|
|
13
|
+
* ## Why this lives in `core/` and not beside the pruner
|
|
14
|
+
*
|
|
15
|
+
* The CLI reports these numbers, and a CLI verb reaching into `daemon/` to do it
|
|
16
|
+
* is the wrong direction: `daemon/` is a caller of the core, never a dependency
|
|
17
|
+
* of the surfaces. This module is that shared core. Nothing here reads a clock,
|
|
18
|
+
* loads a policy, appends an event, or unlinks a file.
|
|
19
|
+
*
|
|
20
|
+
* ## Why not in `core/payload-store.ts`
|
|
21
|
+
*
|
|
22
|
+
* The store module is deliberately ignorant of the log ("Nothing here opens
|
|
23
|
+
* `events.jsonl`"): it addresses bytes by hash and verifies them, and that
|
|
24
|
+
* narrowness is what makes it safe to call from every channel. The census is the
|
|
25
|
+
* opposite kind of thing, a comparison between the log and the store, so it gets
|
|
26
|
+
* its own module rather than teaching the store to read events.
|
|
27
|
+
*/
|
|
28
|
+
import { isPayloadHash } from "./payload.js";
|
|
29
|
+
import { listStoredPayloadHashes } from "./payload-store.js";
|
|
30
|
+
import { payloadOf } from "./state.js";
|
|
31
|
+
/** Hashes a `payload.pruned` record already names. */
|
|
32
|
+
export function prunedHashes(records) {
|
|
33
|
+
const pruned = new Set();
|
|
34
|
+
for (const record of records) {
|
|
35
|
+
if (record.event !== "payload.pruned")
|
|
36
|
+
continue;
|
|
37
|
+
const hash = payloadOf(record)["payload_hash"];
|
|
38
|
+
if (isPayloadHash(hash))
|
|
39
|
+
pruned.add(hash);
|
|
40
|
+
}
|
|
41
|
+
return pruned;
|
|
42
|
+
}
|
|
43
|
+
/** Every payload-hash-shaped string anywhere inside a value. */
|
|
44
|
+
function hashesWithin(value, found) {
|
|
45
|
+
if (isPayloadHash(value)) {
|
|
46
|
+
found.add(value);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (Array.isArray(value)) {
|
|
50
|
+
for (const item of value)
|
|
51
|
+
hashesWithin(item, found);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (typeof value === "object" && value !== null) {
|
|
55
|
+
for (const item of Object.values(value))
|
|
56
|
+
hashesWithin(item, found);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Every hash any record binds to, mapped to the actions that declared it.
|
|
61
|
+
*
|
|
62
|
+
* Two attributions are understood, because they are the two the runtime writes:
|
|
63
|
+
* a `payload_hash` beside a record's own `action_key` (`approval.requested` and
|
|
64
|
+
* `approval.granted` carry it there), and the `payload_hash` of each action
|
|
65
|
+
* inside a `task.registered` envelope, attributed to that action's
|
|
66
|
+
* `idempotency_key` — which is where a *registered but not yet requested* action
|
|
67
|
+
* declares its bytes. Without the second, a payload stored at registration time
|
|
68
|
+
* would look like residue nothing bound and be pruned out from under the request
|
|
69
|
+
* about to be made for it.
|
|
70
|
+
*
|
|
71
|
+
* Everything else is caught by a deep scan and deliberately treated as a
|
|
72
|
+
* binding this module cannot attribute: an unattributable binding is never
|
|
73
|
+
* prunable, so an event shape nobody here anticipated makes a payload immortal
|
|
74
|
+
* rather than making it disposable. The only event exempt from the scan is
|
|
75
|
+
* `payload.pruned`, whose whole job is to name bytes that are going.
|
|
76
|
+
*/
|
|
77
|
+
export function bindingsOf(records) {
|
|
78
|
+
const bindings = new Map();
|
|
79
|
+
const bindingFor = (hash) => {
|
|
80
|
+
let binding = bindings.get(hash);
|
|
81
|
+
if (binding === undefined) {
|
|
82
|
+
binding = { actionKeys: new Set(), unattributed: false };
|
|
83
|
+
bindings.set(hash, binding);
|
|
84
|
+
}
|
|
85
|
+
return binding;
|
|
86
|
+
};
|
|
87
|
+
for (const record of records) {
|
|
88
|
+
if (record.event === "payload.pruned")
|
|
89
|
+
continue;
|
|
90
|
+
const payload = payloadOf(record);
|
|
91
|
+
const attributed = new Set();
|
|
92
|
+
const own = payload["payload_hash"];
|
|
93
|
+
const key = record.action_key;
|
|
94
|
+
if (isPayloadHash(own) && typeof key === "string" && key.length > 0) {
|
|
95
|
+
bindingFor(own).actionKeys.add(key);
|
|
96
|
+
attributed.add(own);
|
|
97
|
+
}
|
|
98
|
+
const actions = payload["actions"];
|
|
99
|
+
if (Array.isArray(actions)) {
|
|
100
|
+
for (const action of actions) {
|
|
101
|
+
if (typeof action !== "object" || action === null)
|
|
102
|
+
continue;
|
|
103
|
+
const item = action;
|
|
104
|
+
const hash = item["payload_hash"];
|
|
105
|
+
const declaredKey = item["idempotency_key"];
|
|
106
|
+
if (!isPayloadHash(hash))
|
|
107
|
+
continue;
|
|
108
|
+
if (typeof declaredKey === "string" && declaredKey.length > 0) {
|
|
109
|
+
bindingFor(hash).actionKeys.add(declaredKey);
|
|
110
|
+
attributed.add(hash);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const mentioned = new Set();
|
|
115
|
+
hashesWithin(payload, mentioned);
|
|
116
|
+
for (const hash of mentioned) {
|
|
117
|
+
if (attributed.has(hash))
|
|
118
|
+
continue;
|
|
119
|
+
bindingFor(hash).unattributed = true;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return bindings;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Count what the store holds against what the log says about it.
|
|
126
|
+
*
|
|
127
|
+
* Honest in both directions and about both failure modes: `pruned` is a fact of
|
|
128
|
+
* the log (it stays true forever, whatever the store does), `orphans` and
|
|
129
|
+
* `awaitingRemoval` are facts about the disagreement between the two. None of
|
|
130
|
+
* them is a health verdict; a reader is being told what is there.
|
|
131
|
+
*/
|
|
132
|
+
export function payloadStoreCensus(records, storeDir) {
|
|
133
|
+
const present = listStoredPayloadHashes(storeDir);
|
|
134
|
+
const pruned = prunedHashes(records);
|
|
135
|
+
const bindings = bindingsOf(records);
|
|
136
|
+
let orphans = 0;
|
|
137
|
+
let awaitingRemoval = 0;
|
|
138
|
+
for (const hash of present) {
|
|
139
|
+
if (pruned.has(hash))
|
|
140
|
+
awaitingRemoval += 1;
|
|
141
|
+
else if (!bindings.has(hash))
|
|
142
|
+
orphans += 1;
|
|
143
|
+
}
|
|
144
|
+
return { files: present.length, pruned: pruned.size, orphans, awaitingRemoval };
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=payload-census.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload-census.js","sourceRoot":"","sources":["../../../src/core/payload-census.ts"],"names":[],"mappings":"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"}
|