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,449 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Budget evaluation from the log (SPEC.md §5.2, §8).
|
|
3
|
+
*
|
|
4
|
+
* "An action must pass its class limits AND global budgets. Budget consumption
|
|
5
|
+
* is computed from the log, never from a mutable counter." This module is that
|
|
6
|
+
* computation: given the records of the append-only log, the limits the policy
|
|
7
|
+
* matcher already resolved, the action about to be admitted, and the moment of
|
|
8
|
+
* evaluation, it returns a per-limit verdict and one conjunctive answer.
|
|
9
|
+
*
|
|
10
|
+
* Pure and deterministic: no I/O, no clock, no randomness, no caching. The
|
|
11
|
+
* evaluation timestamp is a **required parameter** — a budget decision that
|
|
12
|
+
* depended on ambient time could not be replayed from the log, and replay is
|
|
13
|
+
* the whole point of computing consumption from the log in the first place.
|
|
14
|
+
* This module also does not re-run class matching: the gate hands in the
|
|
15
|
+
* already-matched limits and the pattern that produced them.
|
|
16
|
+
*
|
|
17
|
+
* ## THE CONSUMPTION CONTRACT — what APRV-16 (the gate) MUST honor
|
|
18
|
+
*
|
|
19
|
+
* Budgets meter **authorization**, not completion. An authorized action
|
|
20
|
+
* consumes budget whether or not it ultimately executes, because the human's
|
|
21
|
+
* decision is the commitment; a runtime that only charged completed actions
|
|
22
|
+
* would let a crashed or hung executor mint unlimited authorizations.
|
|
23
|
+
*
|
|
24
|
+
* The evaluator therefore reads consumption from exactly two event types, and
|
|
25
|
+
* the gate MUST write them accordingly:
|
|
26
|
+
*
|
|
27
|
+
* 1. `approval.granted` — the manual path. A human said yes; budget is spent.
|
|
28
|
+
* 2. `execution.started` — the supervised/autonomous paths. Under the amended
|
|
29
|
+
* §6.3 those paths emit no approval events, so the record that authorizes
|
|
30
|
+
* execution *is* the start event.
|
|
31
|
+
*
|
|
32
|
+
* To avoid charging a manual action twice (granted, then started), an
|
|
33
|
+
* `execution.started` is counted only when the window contains no
|
|
34
|
+
* `approval.granted` bearing the same `action_key`.
|
|
35
|
+
*
|
|
36
|
+
* **The gate MUST record `payload.est_cost_usd` (a decimal USD string since
|
|
37
|
+
* APRV-121, a JSON number in records written before it) and
|
|
38
|
+
* `payload.class` (the action's dotted class string) on every
|
|
39
|
+
* `approval.granted` and `execution.started` event it appends.** Those two
|
|
40
|
+
* payload fields are the entire input to USD accounting and class scoping.
|
|
41
|
+
* A consuming event with no usable `est_cost_usd` contributes **0** to USD
|
|
42
|
+
* sums but still counts as **1** action for `daily_actions` — an authorization
|
|
43
|
+
* with no declared cost is still an authorization. A consuming event with no
|
|
44
|
+
* usable `payload.class` is invisible to class-scoped limits (it cannot be
|
|
45
|
+
* shown to belong to the class) but is still counted by global budgets, which
|
|
46
|
+
* charge every authorization regardless of class.
|
|
47
|
+
*
|
|
48
|
+
* Nothing else consumes. `approval.rejected`, `approval.expired`,
|
|
49
|
+
* `approval.revoked`, and `approval.withdrawn` (APRV-106) consume nothing: an
|
|
50
|
+
* authorization that was refused, lapsed, or never asked for in the end was
|
|
51
|
+
* never a commitment. `execution.completed` and `execution.failed`
|
|
52
|
+
* consume nothing either — they report on a commitment already charged at
|
|
53
|
+
* authorization time, and charging them again would double-count.
|
|
54
|
+
*
|
|
55
|
+
* ## The rolling window (SPEC.md §5.2, rolling-window amendment)
|
|
56
|
+
*
|
|
57
|
+
* A `daily` limit is evaluated over the 24 hours preceding the evaluation
|
|
58
|
+
* moment, not over a calendar day. An event consumes iff
|
|
59
|
+
*
|
|
60
|
+
* evaluationTs - 24h < event.ts <= evaluationTs
|
|
61
|
+
*
|
|
62
|
+
* — half-open at the bottom, closed at the top. An event exactly 24h old has
|
|
63
|
+
* aged out; an event stamped at the evaluation instant is in. The bound is
|
|
64
|
+
* half-open on exactly one side so that consecutive 24h windows tile the
|
|
65
|
+
* timeline without double-counting a boundary event. Timestamps are compared
|
|
66
|
+
* via `Date.parse` on the RFC 3339 strings the schema already guarantees.
|
|
67
|
+
*
|
|
68
|
+
* Rolling, not calendar: a burst that straddles midnight must not have its own
|
|
69
|
+
* tripwire reset underneath it.
|
|
70
|
+
*
|
|
71
|
+
* ## Fail-closed
|
|
72
|
+
*
|
|
73
|
+
* A limit the evaluator does not understand cannot be proven satisfied, so it
|
|
74
|
+
* fails: an unknown limit name yields `pass: false` with an explanatory `note`.
|
|
75
|
+
* The same applies to an unparseable evaluation timestamp (no window can be
|
|
76
|
+
* computed) and to class-scoped rolling limits offered without the class
|
|
77
|
+
* pattern that scopes their consumption. Silence is never a grant.
|
|
78
|
+
*
|
|
79
|
+
* ## What this module does NOT evaluate (APRV-173)
|
|
80
|
+
*
|
|
81
|
+
* `max_pending` and `requests_per_hour` (SPEC.md §5.2) are request-volume
|
|
82
|
+
* limits: they cap the approver's queue rather than the world's exposure, they
|
|
83
|
+
* are counted from `approval.requested` rather than from authorizations, and
|
|
84
|
+
* `core/intake-limits.ts` evaluates them at intake. They are skipped by name
|
|
85
|
+
* here rather than refused as unknown limits, and the skip is exactly the two
|
|
86
|
+
* names that module owns, read from its own exported list. Neither module's
|
|
87
|
+
* silence widens a ceiling: every limit name is evaluated by one of them, or
|
|
88
|
+
* fails closed as unknown in this one.
|
|
89
|
+
*/
|
|
90
|
+
import { microsToUsdString, usdNumberToMicros, usdToMicros, } from "./money.js";
|
|
91
|
+
import { isIntakeLimitName } from "./intake-limits.js";
|
|
92
|
+
import { matchesPattern } from "./policy-match.js";
|
|
93
|
+
/** Length of the rolling `daily` window: 24 hours, in milliseconds. */
|
|
94
|
+
export const WINDOW_MS = 24 * 60 * 60 * 1000;
|
|
95
|
+
/** Event types that authorize execution and therefore consume budget. */
|
|
96
|
+
export const CONSUMING_EVENTS = ["approval.granted", "execution.started"];
|
|
97
|
+
/** Known class-limit names (SPEC.md §5.1). Anything else fails closed. */
|
|
98
|
+
const PER_ACTION_USD = "per_action_usd";
|
|
99
|
+
const DAILY_USD = "daily_usd";
|
|
100
|
+
const DAILY_ACTIONS = "daily_actions";
|
|
101
|
+
/** The verdict label for the envelope's own cap (SPEC.md §6.2 `budget`). */
|
|
102
|
+
export const TASK_MAX_COST_USD = "budget.max_cost_usd";
|
|
103
|
+
/** An internal figure as the string a verdict reports. */
|
|
104
|
+
function render(value, unit) {
|
|
105
|
+
return unit === "usd" ? microsToUsdString(value) : String(Math.round(value));
|
|
106
|
+
}
|
|
107
|
+
/** A payload field read defensively: the log's payload shape is open at v0.1. */
|
|
108
|
+
function payloadOf(record) {
|
|
109
|
+
const payload = record.payload;
|
|
110
|
+
return typeof payload === "object" && payload !== null ? payload : {};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* `payload.est_cost_usd` in micro-USD when it is a usable amount, else `0`.
|
|
114
|
+
*
|
|
115
|
+
* Both forms are read: the canonical decimal string a post-APRV-121 gate writes,
|
|
116
|
+
* and the JSON number every record written before it carries. A historical
|
|
117
|
+
* record therefore feeds this computation exactly as it did before the change.
|
|
118
|
+
*/
|
|
119
|
+
function costOf(record) {
|
|
120
|
+
return usdToMicros(payloadOf(record)["est_cost_usd"]) ?? 0;
|
|
121
|
+
}
|
|
122
|
+
/** `payload.class` when it is a string, else `null` (invisible to class limits). */
|
|
123
|
+
function classOf(record) {
|
|
124
|
+
const value = payloadOf(record)["class"];
|
|
125
|
+
return typeof value === "string" ? value : null;
|
|
126
|
+
}
|
|
127
|
+
/** The action's declared cost in micro-USD, or `0` when it declares none. */
|
|
128
|
+
function requestedCost(action) {
|
|
129
|
+
return usdToMicros(action.est_cost_usd) ?? 0;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Records inside the rolling window, in log order.
|
|
133
|
+
*
|
|
134
|
+
* A record whose `ts` cannot be parsed is **kept**: it cannot be shown to lie
|
|
135
|
+
* outside the window, and the fail-closed reading of an unplaceable
|
|
136
|
+
* authorization is that it counts.
|
|
137
|
+
*/
|
|
138
|
+
function withinWindow(records, evaluationMs) {
|
|
139
|
+
const floor = evaluationMs - WINDOW_MS;
|
|
140
|
+
return records.filter((record) => {
|
|
141
|
+
const ms = Date.parse(record.ts);
|
|
142
|
+
if (Number.isNaN(ms))
|
|
143
|
+
return true;
|
|
144
|
+
return ms > floor && ms <= evaluationMs;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* The authorizations inside the window (see the consumption contract above).
|
|
149
|
+
*
|
|
150
|
+
* `approval.granted` always authorizes. `execution.started` authorizes only
|
|
151
|
+
* when no `approval.granted` in the window carries the same `action_key`,
|
|
152
|
+
* which is the manual-path double-count guard. A start event with no
|
|
153
|
+
* `action_key` cannot be tied to a grant, so it counts — the schema requires
|
|
154
|
+
* `action_key` on execution events, and the fail-closed reading of a record
|
|
155
|
+
* that somehow lacks one is that it is its own authorization.
|
|
156
|
+
*/
|
|
157
|
+
function authorizations(windowed) {
|
|
158
|
+
const grantedKeys = new Set();
|
|
159
|
+
for (const record of windowed) {
|
|
160
|
+
if (record.event === "approval.granted" && record.action_key !== undefined) {
|
|
161
|
+
grantedKeys.add(record.action_key);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return windowed.filter((record) => {
|
|
165
|
+
if (record.event === "approval.granted")
|
|
166
|
+
return true;
|
|
167
|
+
if (record.event !== "execution.started")
|
|
168
|
+
return false;
|
|
169
|
+
return record.action_key === undefined || !grantedKeys.has(record.action_key);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* One limit's verdict, computed in integers and reported as strings.
|
|
174
|
+
*
|
|
175
|
+
* `consumed`, `requested` and `ceiling` arrive in the verdict's unit —
|
|
176
|
+
* micro-USD for money, authorizations for counts — so `remaining` is an exact
|
|
177
|
+
* integer subtraction and `pass` is an exact comparison.
|
|
178
|
+
*/
|
|
179
|
+
function verdict(limit, scope, window, consumed, requested, ceiling, unit, note) {
|
|
180
|
+
const remaining = ceiling - consumed - requested;
|
|
181
|
+
const base = {
|
|
182
|
+
limit,
|
|
183
|
+
scope,
|
|
184
|
+
window,
|
|
185
|
+
consumed: render(consumed, unit),
|
|
186
|
+
requested: render(requested, unit),
|
|
187
|
+
remaining: render(remaining, unit),
|
|
188
|
+
pass: remaining >= 0,
|
|
189
|
+
};
|
|
190
|
+
return note === undefined ? base : { ...base, note };
|
|
191
|
+
}
|
|
192
|
+
/** A fail-closed refusal: nothing measured, nothing granted, reason attached. */
|
|
193
|
+
function refuse(limit, scope, note) {
|
|
194
|
+
return {
|
|
195
|
+
limit,
|
|
196
|
+
scope,
|
|
197
|
+
window: "per-action",
|
|
198
|
+
consumed: "0",
|
|
199
|
+
requested: "0",
|
|
200
|
+
remaining: "0",
|
|
201
|
+
pass: false,
|
|
202
|
+
note,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* A policy ceiling as an exact integer in the limit's own unit, or `null` when
|
|
207
|
+
* the policy wrote something no comparison can be made against.
|
|
208
|
+
*
|
|
209
|
+
* The USD conversion is the documented one from `core/money.ts`: policy files
|
|
210
|
+
* are YAML written by a human (`daily_usd: 100`, `per_action_usd: 0.25`), so
|
|
211
|
+
* their ceilings are JSON numbers by construction and are pinned to a micro
|
|
212
|
+
* here, once, before any arithmetic touches them.
|
|
213
|
+
*/
|
|
214
|
+
function ceilingOf(value, unit) {
|
|
215
|
+
if (unit === "count") {
|
|
216
|
+
return Number.isFinite(value) && value >= 0 ? Math.round(value) : null;
|
|
217
|
+
}
|
|
218
|
+
return usdNumberToMicros(value);
|
|
219
|
+
}
|
|
220
|
+
function tally(events) {
|
|
221
|
+
let usd = 0;
|
|
222
|
+
for (const record of events)
|
|
223
|
+
usd += costOf(record);
|
|
224
|
+
return { usd, actions: events.length };
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Evaluate every applicable budget limit against the log.
|
|
228
|
+
*
|
|
229
|
+
* Conjunctive (SPEC.md §5.2): `pass` is true only when every verdict passes.
|
|
230
|
+
* Verdicts are emitted class limits first (limit names ascending), then global
|
|
231
|
+
* budgets (scope name ascending, limit name ascending within a scope), so the
|
|
232
|
+
* list is byte-stable regardless of policy key order.
|
|
233
|
+
*
|
|
234
|
+
* `records` may be the whole log; only the rolling window is consulted, and the
|
|
235
|
+
* caller is never asked to pre-filter (a caller that filtered wrongly would
|
|
236
|
+
* silently widen the budget).
|
|
237
|
+
*/
|
|
238
|
+
export function evaluateBudgets(records, scope, action, evaluationTs) {
|
|
239
|
+
const classLimits = scope.classLimits ?? {};
|
|
240
|
+
const classLimitNames = Object.keys(classLimits).sort();
|
|
241
|
+
const globalBudgets = scope.globalBudgets ?? {};
|
|
242
|
+
const globalScopeNames = Object.keys(globalBudgets).sort();
|
|
243
|
+
const evaluationMs = Date.parse(evaluationTs);
|
|
244
|
+
if (Number.isNaN(evaluationMs)) {
|
|
245
|
+
// No parseable evaluation moment means no window, and an unmeasurable
|
|
246
|
+
// budget is a refused one. Every applicable limit fails, and says why.
|
|
247
|
+
const verdicts = [];
|
|
248
|
+
const why = `evaluation timestamp "${evaluationTs}" is not a parseable RFC 3339 instant; the rolling window cannot be computed, so no limit can be proven satisfied`;
|
|
249
|
+
// APRV-173: the request-volume names are skipped on this path too, so a
|
|
250
|
+
// limit is owned by exactly one module on every path rather than on most of
|
|
251
|
+
// them. They are not admitted by the omission — `core/intake-limits.ts`
|
|
252
|
+
// fails them closed against the same unparseable instant, and it runs
|
|
253
|
+
// first.
|
|
254
|
+
for (const name of classLimitNames) {
|
|
255
|
+
if (isIntakeLimitName(name))
|
|
256
|
+
continue;
|
|
257
|
+
verdicts.push(refuse(name, "class", why));
|
|
258
|
+
}
|
|
259
|
+
for (const scopeName of globalScopeNames) {
|
|
260
|
+
const budget = globalBudgets[scopeName] ?? {};
|
|
261
|
+
for (const name of Object.keys(budget).sort()) {
|
|
262
|
+
if (isIntakeLimitName(name))
|
|
263
|
+
continue;
|
|
264
|
+
verdicts.push(refuse(`${scopeName}.${name}`, "global", why));
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (verdicts.length === 0) {
|
|
268
|
+
// No limits apply at all: nothing to prove, nothing to refuse.
|
|
269
|
+
return { pass: true, verdicts };
|
|
270
|
+
}
|
|
271
|
+
return { pass: false, verdicts };
|
|
272
|
+
}
|
|
273
|
+
const windowed = authorizations(withinWindow(records, evaluationMs));
|
|
274
|
+
const requested = requestedCost(action);
|
|
275
|
+
const verdicts = [];
|
|
276
|
+
// --- Class limits (the matched rule's `limits`) -------------------------
|
|
277
|
+
if (classLimitNames.length > 0) {
|
|
278
|
+
const pattern = scope.classPattern;
|
|
279
|
+
// Class-scoped consumption counts authorizations of the SAME RULE PATTERN.
|
|
280
|
+
const classEvents = windowed.filter((record) => {
|
|
281
|
+
if (pattern === null)
|
|
282
|
+
return false;
|
|
283
|
+
const recordClass = classOf(record);
|
|
284
|
+
return recordClass !== null && matchesPattern(pattern, recordClass);
|
|
285
|
+
});
|
|
286
|
+
const classConsumption = tally(classEvents);
|
|
287
|
+
for (const name of classLimitNames) {
|
|
288
|
+
const declared = classLimits[name];
|
|
289
|
+
if (declared === undefined)
|
|
290
|
+
continue;
|
|
291
|
+
// APRV-173. The request-volume names of SPEC.md §5.2 are not budget
|
|
292
|
+
// limits and are not unknown ones either: they cap the approver's QUEUE
|
|
293
|
+
// rather than the world's exposure, they are counted from a different set
|
|
294
|
+
// of events, and `core/intake-limits.ts` evaluates them at intake. Passed
|
|
295
|
+
// over here rather than refused, because a policy that declares the
|
|
296
|
+
// vocabulary §5.2 blesses must not have every one of its requests refused
|
|
297
|
+
// `budget-exceeded` by the module that does not own it. The two skip
|
|
298
|
+
// lists are complements: that module evaluates exactly these names and
|
|
299
|
+
// ignores every other, so no limit falls between the two.
|
|
300
|
+
if (isIntakeLimitName(name))
|
|
301
|
+
continue;
|
|
302
|
+
if (name === PER_ACTION_USD || name === DAILY_USD || name === DAILY_ACTIONS) {
|
|
303
|
+
const unit = name === DAILY_ACTIONS ? "count" : "usd";
|
|
304
|
+
const ceiling = ceilingOf(declared, unit);
|
|
305
|
+
if (ceiling === null) {
|
|
306
|
+
verdicts.push(refuse(name, "class", `class limit "${name}" is not a finite non-negative number; a limit that cannot be compared cannot be proven satisfied`));
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
if (name === PER_ACTION_USD) {
|
|
310
|
+
verdicts.push(verdict(name, "class", "per-action", 0, requested, ceiling, unit));
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (scope.classPattern === null) {
|
|
314
|
+
verdicts.push(refuse(name, "class", `class limit "${name}" was supplied without the class pattern that scopes its consumption; the window cannot be attributed, so the limit cannot be proven satisfied`));
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
const consumed = name === DAILY_USD ? classConsumption.usd : classConsumption.actions;
|
|
318
|
+
const add = name === DAILY_USD ? requested : 1;
|
|
319
|
+
verdicts.push(verdict(name, "class", "rolling-24h", consumed, add, ceiling, unit));
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
verdicts.push(refuse(name, "class", `unknown class limit "${name}"; this evaluator understands ${PER_ACTION_USD}, ${DAILY_USD}, and ${DAILY_ACTIONS} only, and a limit it cannot evaluate cannot be proven satisfied`));
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
// --- Global budgets (`policy.budgets`) ---------------------------------
|
|
326
|
+
// Every named scope is evaluated, not just `global`: SPEC.md §5.1 permits
|
|
327
|
+
// additional named scopes sharing the `global` shape, and a budget the
|
|
328
|
+
// author wrote down but the runtime skipped would be a ceiling that silently
|
|
329
|
+
// does not exist. Each charges every authorization in the window regardless
|
|
330
|
+
// of class — that is what makes it global.
|
|
331
|
+
if (globalScopeNames.length > 0) {
|
|
332
|
+
const globalConsumption = tally(windowed);
|
|
333
|
+
for (const scopeName of globalScopeNames) {
|
|
334
|
+
const budget = globalBudgets[scopeName];
|
|
335
|
+
if (budget === undefined)
|
|
336
|
+
continue;
|
|
337
|
+
const record = budget;
|
|
338
|
+
for (const name of Object.keys(record).sort()) {
|
|
339
|
+
// APRV-173, the global half of the same division of labour: a scope's
|
|
340
|
+
// `max_pending` is a queue ceiling evaluated by `core/intake-limits.ts`.
|
|
341
|
+
if (isIntakeLimitName(name))
|
|
342
|
+
continue;
|
|
343
|
+
const declared = record[name];
|
|
344
|
+
const label = `${scopeName}.${name}`;
|
|
345
|
+
const unit = name === DAILY_ACTIONS ? "count" : "usd";
|
|
346
|
+
const ceiling = typeof declared === "number" ? ceilingOf(declared, unit) : null;
|
|
347
|
+
if (ceiling === null) {
|
|
348
|
+
verdicts.push(refuse(label, "global", `budget "${label}" is not a finite non-negative number; a limit that cannot be compared cannot be proven satisfied`));
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
if (name === DAILY_USD) {
|
|
352
|
+
verdicts.push(verdict(label, "global", "rolling-24h", globalConsumption.usd, requested, ceiling, unit));
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
if (name === DAILY_ACTIONS) {
|
|
356
|
+
verdicts.push(verdict(label, "global", "rolling-24h", globalConsumption.actions, 1, ceiling, unit));
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
verdicts.push(refuse(label, "global", `unknown budget limit "${name}"; this evaluator understands ${DAILY_USD} and ${DAILY_ACTIONS} only, and a limit it cannot evaluate cannot be proven satisfied`));
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return { pass: verdicts.every((entry) => entry.pass), verdicts };
|
|
364
|
+
}
|
|
365
|
+
// ---------------------------------------------------------------------------
|
|
366
|
+
// The envelope's own cap (SPEC.md §6.2 `budget.max_cost_usd`) — S2
|
|
367
|
+
// ---------------------------------------------------------------------------
|
|
368
|
+
/**
|
|
369
|
+
* The registered envelope's `budget.max_cost_usd` for `task`, or `null`.
|
|
370
|
+
*
|
|
371
|
+
* Read from the **log**, not from the task file: the file may have been edited
|
|
372
|
+
* since registration, and an agent that could raise its own cap by editing
|
|
373
|
+
* frontmatter after the fact would be authoring the ceiling it is judged by.
|
|
374
|
+
* `register` copies the envelope's `budget` block into the `task.registered`
|
|
375
|
+
* payload for exactly this read. The last registration wins, matching
|
|
376
|
+
* `findDeclaration` in `core/execute.ts`.
|
|
377
|
+
*
|
|
378
|
+
* A cap that is not a finite non-negative number is `null` — absent rather than
|
|
379
|
+
* zero. The schema already refuses those shapes at the write boundary, and
|
|
380
|
+
* inventing a $0 ceiling for a malformed one would refuse every action of the
|
|
381
|
+
* task with a message about money nobody wrote down.
|
|
382
|
+
*/
|
|
383
|
+
export function taskMaxCostUsd(records, task) {
|
|
384
|
+
let found = null;
|
|
385
|
+
for (const record of records) {
|
|
386
|
+
if (record.event !== "task.registered" || record.task !== task)
|
|
387
|
+
continue;
|
|
388
|
+
const budget = payloadOf(record)["budget"];
|
|
389
|
+
if (typeof budget !== "object" || budget === null)
|
|
390
|
+
continue;
|
|
391
|
+
const cap = usdToMicros(budget["max_cost_usd"]);
|
|
392
|
+
if (cap !== null)
|
|
393
|
+
found = cap;
|
|
394
|
+
}
|
|
395
|
+
return found === null ? null : microsToUsdString(found);
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Evaluate the task's own cap: does admitting `action` keep the SUM of this
|
|
399
|
+
* task's authorized `est_cost_usd` at or under `maxCostUsd`?
|
|
400
|
+
*
|
|
401
|
+
* Commitment-based and consumption-identical to {@link evaluateBudgets}: the
|
|
402
|
+
* same two event types authorize (`approval.granted`, and `execution.started`
|
|
403
|
+
* only where no grant carries the same `action_key`), so a manual action that is
|
|
404
|
+
* granted and then started is charged once. The only differences are scope —
|
|
405
|
+
* events of *this task* — and window: there is none. A task cap is a lifetime
|
|
406
|
+
* total, so an envelope that says `max_cost_usd: 0.5` cannot be spent twice by
|
|
407
|
+
* waiting a day.
|
|
408
|
+
*
|
|
409
|
+
* `evaluationTs` is accepted for symmetry with the windowed evaluator and to
|
|
410
|
+
* keep every budget call site shaped alike; it selects no window here and the
|
|
411
|
+
* verdict does not depend on it.
|
|
412
|
+
*/
|
|
413
|
+
export function evaluateTaskBudget(records, task, maxCostUsd, action, _evaluationTs) {
|
|
414
|
+
const ceiling = usdToMicros(maxCostUsd);
|
|
415
|
+
if (ceiling === null) {
|
|
416
|
+
return refuse(TASK_MAX_COST_USD, "task", `the task's own \`budget.max_cost_usd\` is not a usable amount; a cap that cannot be compared cannot be proven satisfied`);
|
|
417
|
+
}
|
|
418
|
+
const consumed = tally(authorizations(records.filter((record) => record.task === task))).usd;
|
|
419
|
+
return verdict(TASK_MAX_COST_USD, "task", "task-total", consumed, requestedCost(action), ceiling, "usd");
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Every applicable budget, conjunctively: class limits, global budgets, and the
|
|
423
|
+
* task envelope's own cap.
|
|
424
|
+
*
|
|
425
|
+
* This is the function the three enforcement points call (`gate.request`,
|
|
426
|
+
* `gate.decide`'s grant path, `execute.startExecution`), so the envelope cap is
|
|
427
|
+
* checked at intake, at grant, and at execution start — the same three moments
|
|
428
|
+
* policy budgets are checked, because a cap enforced at only one of them is a
|
|
429
|
+
* cap a caller can route around by choosing a different door.
|
|
430
|
+
*
|
|
431
|
+
* Verdict order is class limits, then global budgets, then the task cap: the
|
|
432
|
+
* existing byte-stable order with one deterministic addition at the end.
|
|
433
|
+
* `task` may be `null` for a call site that has no task in hand, in which case
|
|
434
|
+
* the cap simply does not apply.
|
|
435
|
+
*/
|
|
436
|
+
export function evaluateBudgetsWithTask(records, scope, action, evaluationTs, task) {
|
|
437
|
+
const base = evaluateBudgets(records, scope, action, evaluationTs);
|
|
438
|
+
if (task === null)
|
|
439
|
+
return base;
|
|
440
|
+
const cap = taskMaxCostUsd(records, task);
|
|
441
|
+
if (cap === null)
|
|
442
|
+
return base;
|
|
443
|
+
const verdicts = [
|
|
444
|
+
...base.verdicts,
|
|
445
|
+
evaluateTaskBudget(records, task, cap, action, evaluationTs),
|
|
446
|
+
];
|
|
447
|
+
return { pass: verdicts.every((entry) => entry.pass), verdicts };
|
|
448
|
+
}
|
|
449
|
+
//# sourceMappingURL=budgets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budgets.js","sourceRoot":"","sources":["../../../src/core/budgets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwFG;AAIH,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,GAEZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,uEAAuE;AACvE,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE7C,yEAAyE;AACzE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,kBAAkB,EAAE,mBAAmB,CAAU,CAAC;AAsFnF,0EAA0E;AAC1E,MAAM,cAAc,GAAG,gBAAgB,CAAC;AACxC,MAAM,SAAS,GAAG,WAAW,CAAC;AAC9B,MAAM,aAAa,GAAG,eAAe,CAAC;AAEtC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AAavD,0DAA0D;AAC1D,SAAS,MAAM,CAAC,KAAa,EAAE,IAAgB;IAC7C,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,iFAAiF;AACjF,SAAS,SAAS,CAAC,MAAmB;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACxE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,MAAM,CAAC,MAAmB;IACjC,OAAO,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,oFAAoF;AACpF,SAAS,OAAO,CAAC,MAAmB;IAClC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,6EAA6E;AAC7E,SAAS,aAAa,CAAC,MAAoB;IACzC,OAAO,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,SAAS,YAAY,CAAC,OAAsB,EAAE,YAAoB;IAChE,MAAM,KAAK,GAAG,YAAY,GAAG,SAAS,CAAC;IACvC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAClC,OAAO,EAAE,GAAG,KAAK,IAAI,EAAE,IAAI,YAAY,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,cAAc,CAAC,QAAuB;IAC7C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,KAAK,KAAK,kBAAkB,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3E,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QAChC,IAAI,MAAM,CAAC,KAAK,KAAK,kBAAkB;YAAE,OAAO,IAAI,CAAC;QACrD,IAAI,MAAM,CAAC,KAAK,KAAK,mBAAmB;YAAE,OAAO,KAAK,CAAC;QACvD,OAAO,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,SAAS,OAAO,CACd,KAAa,EACb,KAAyB,EACzB,MAAoB,EACpB,QAAgB,EAChB,SAAiB,EACjB,OAAe,EACf,IAAgB,EAChB,IAAa;IAEb,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IACjD,MAAM,IAAI,GAAkB;QAC1B,KAAK;QACL,KAAK;QACL,MAAM;QACN,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;QAChC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC;QAClC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC;QAClC,IAAI,EAAE,SAAS,IAAI,CAAC;KACrB,CAAC;IACF,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;AACvD,CAAC;AAED,iFAAiF;AACjF,SAAS,MAAM,CAAC,KAAa,EAAE,KAAyB,EAAE,IAAY;IACpE,OAAO;QACL,KAAK;QACL,KAAK;QACL,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,GAAG;QACb,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,IAAI,EAAE,KAAK;QACX,IAAI;KACL,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,SAAS,CAAC,KAAa,EAAE,IAAgB;IAChD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,CAAC;IACD,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AASD,SAAS,KAAK,CAAC,MAAqB;IAClC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,MAAM,IAAI,MAAM;QAAE,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAsB,EACtB,KAAkB,EAClB,MAAoB,EACpB,YAAoB;IAEpB,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;IAC5C,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC;IAChD,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;IAE3D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/B,sEAAsE;QACtE,uEAAuE;QACvE,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,yBAAyB,YAAY,mHAAmH,CAAC;QACrK,wEAAwE;QACxE,4EAA4E;QAC5E,wEAAwE;QACxE,sEAAsE;QACtE,SAAS;QACT,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,IAAI,iBAAiB,CAAC,IAAI,CAAC;gBAAE,SAAS;YACtC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC9C,IAAI,iBAAiB,CAAC,IAAI,CAAC;oBAAE,SAAS;gBACtC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,SAAS,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,+DAA+D;YAC/D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAClC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACnC,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAExC,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,2EAA2E;IAC3E,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC;QACnC,2EAA2E;QAC3E,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7C,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YACnC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YACpC,OAAO,WAAW,KAAK,IAAI,IAAI,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QACH,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;QAE5C,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,QAAQ,KAAK,SAAS;gBAAE,SAAS;YACrC,oEAAoE;YACpE,wEAAwE;YACxE,0EAA0E;YAC1E,0EAA0E;YAC1E,oEAAoE;YACpE,0EAA0E;YAC1E,qEAAqE;YACrE,uEAAuE;YACvE,0DAA0D;YAC1D,IAAI,iBAAiB,CAAC,IAAI,CAAC;gBAAE,SAAS;YACtC,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC5E,MAAM,IAAI,GAAe,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;gBAClE,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC1C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBACrB,QAAQ,CAAC,IAAI,CACX,MAAM,CACJ,IAAI,EACJ,OAAO,EACP,gBAAgB,IAAI,mGAAmG,CACxH,CACF,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;oBAC5B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;oBACjF,SAAS;gBACX,CAAC;gBACD,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;oBAChC,QAAQ,CAAC,IAAI,CACX,MAAM,CACJ,IAAI,EACJ,OAAO,EACP,gBAAgB,IAAI,gJAAgJ,CACrK,CACF,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,MAAM,QAAQ,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC;gBACtF,MAAM,GAAG,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBACnF,SAAS;YACX,CAAC;YACD,QAAQ,CAAC,IAAI,CACX,MAAM,CACJ,IAAI,EACJ,OAAO,EACP,wBAAwB,IAAI,iCAAiC,cAAc,KAAK,SAAS,SAAS,aAAa,kEAAkE,CAClL,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,uEAAuE;IACvE,6EAA6E;IAC7E,4EAA4E;IAC5E,2CAA2C;IAC3C,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,iBAAiB,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1C,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,MAAM,KAAK,SAAS;gBAAE,SAAS;YACnC,MAAM,MAAM,GAAG,MAAiC,CAAC;YACjD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC9C,sEAAsE;gBACtE,yEAAyE;gBACzE,IAAI,iBAAiB,CAAC,IAAI,CAAC;oBAAE,SAAS;gBACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAe,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;gBAClE,MAAM,OAAO,GACX,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBACrB,QAAQ,CAAC,IAAI,CACX,MAAM,CACJ,KAAK,EACL,QAAQ,EACR,WAAW,KAAK,mGAAmG,CACpH,CACF,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,QAAQ,CAAC,IAAI,CACX,OAAO,CACL,KAAK,EACL,QAAQ,EACR,aAAa,EACb,iBAAiB,CAAC,GAAG,EACrB,SAAS,EACT,OAAO,EACP,IAAI,CACL,CACF,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;oBAC3B,QAAQ,CAAC,IAAI,CACX,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CACrF,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,QAAQ,CAAC,IAAI,CACX,MAAM,CACJ,KAAK,EACL,QAAQ,EACR,yBAAyB,IAAI,iCAAiC,SAAS,QAAQ,aAAa,kEAAkE,CAC/J,CACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;AACnE,CAAC;AAED,8EAA8E;AAC9E,mEAAmE;AACnE,8EAA8E;AAE9E;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAAC,OAAsB,EAAE,IAAY;IACjE,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,KAAK,KAAK,iBAAiB,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;YAAE,SAAS;QACzE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;YAAE,SAAS;QAC5D,MAAM,GAAG,GAAG,WAAW,CAAE,MAAkC,CAAC,cAAc,CAAC,CAAC,CAAC;QAC7E,IAAI,GAAG,KAAK,IAAI;YAAE,KAAK,GAAG,GAAG,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAsB,EACtB,IAAY,EACZ,UAAoB,EACpB,MAAoB,EACpB,aAAqB;IAErB,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,MAAM,CACX,iBAAiB,EACjB,MAAM,EACN,yHAAyH,CAC1H,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CACpB,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CACjE,CAAC,GAAG,CAAC;IACN,OAAO,OAAO,CACZ,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,aAAa,CAAC,MAAM,CAAC,EACrB,OAAO,EACP,KAAK,CACN,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAsB,EACtB,KAAkB,EAClB,MAAoB,EACpB,YAAoB,EACpB,IAAmB;IAEnB,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IACnE,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1C,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,QAAQ,GAAG;QACf,GAAG,IAAI,CAAC,QAAQ;QAChB,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC;KAC7D,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;AACnE,CAAC"}
|