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,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram configuration NAMES (SPEC.md §5.1 `channels.telegram.token_env` /
|
|
3
|
+
* `chat_id_env`, amended §5.2 by APRV-72).
|
|
4
|
+
*
|
|
5
|
+
* Constants and resolvers live in core, not in `channels/`, because more than
|
|
6
|
+
* one layer needs them: the Telegram CLI, doctor, and `approval env` (APRV-73)
|
|
7
|
+
* all ask "which variable holds the token?" and none of them may answer it
|
|
8
|
+
* differently. Placing them here also keeps `core/` free of any import from
|
|
9
|
+
* `channels/`, in the spirit of `tests/layering.test.ts`.
|
|
10
|
+
*
|
|
11
|
+
* NAMES only, in both directions: a policy that carried the token would be a
|
|
12
|
+
* bot credential in a file agents may read, which is exactly what §5.1's
|
|
13
|
+
* name-indirection exists to prevent. A policy that failed to load names
|
|
14
|
+
* nothing, so the default applies: a variable name is not a permission, and
|
|
15
|
+
* treating it as one would mean an unrelated policy typo locked the operator
|
|
16
|
+
* out of their own channel. This is `passphraseEnvFor`'s argument, verbatim,
|
|
17
|
+
* for the same reason: these are the same kind of key.
|
|
18
|
+
*
|
|
19
|
+
* Nothing here reads `process.env`. The CLI layer takes the name and looks
|
|
20
|
+
* the value up.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* The environment variable the bot token is read from when the policy declares
|
|
24
|
+
* no `channels.telegram.token_env`. A DEFAULT, not a fixed name: see
|
|
25
|
+
* {@link telegramTokenEnvFor}.
|
|
26
|
+
*/
|
|
27
|
+
export const TELEGRAM_TOKEN_ENV = "APPROVAL_TG_TOKEN";
|
|
28
|
+
/**
|
|
29
|
+
* The environment variable the approver chat id is read from when the policy
|
|
30
|
+
* declares no `channels.telegram.chat_id_env`. Also a default.
|
|
31
|
+
*/
|
|
32
|
+
export const TELEGRAM_CHAT_ENV = "APPROVAL_TG_CHAT";
|
|
33
|
+
/** The NAME of the variable this policy says the bot token lives in. */
|
|
34
|
+
export function telegramTokenEnvFor(load) {
|
|
35
|
+
return declaredEnvName(load, "token_env") ?? TELEGRAM_TOKEN_ENV;
|
|
36
|
+
}
|
|
37
|
+
/** The NAME of the variable this policy says the approver chat id lives in. */
|
|
38
|
+
export function telegramChatEnvFor(load) {
|
|
39
|
+
return declaredEnvName(load, "chat_id_env") ?? TELEGRAM_CHAT_ENV;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* What an absent `channels.telegram.delivery` means.
|
|
43
|
+
*
|
|
44
|
+
* Paced, since APRV-216. The incident behind it is the one APRV-196 softened
|
|
45
|
+
* rather than closed: a restart with six pending policy edits put six prompts
|
|
46
|
+
* on a phone at once, and an approver reading a wall of near-identical
|
|
47
|
+
* questions is an approver who taps rather than reads. A default is a claim
|
|
48
|
+
* about which failure is worse, and the worse one here is inattentive approval
|
|
49
|
+
* rather than a slower queue: pacing withholds nothing, because every request
|
|
50
|
+
* stays pending in the log whether or not it has been shown, and `/queue`
|
|
51
|
+
* lists the whole set on demand.
|
|
52
|
+
*/
|
|
53
|
+
export const TELEGRAM_DEFAULT_DELIVERY = "paced";
|
|
54
|
+
/**
|
|
55
|
+
* The delivery mode this policy declares, or the default.
|
|
56
|
+
*
|
|
57
|
+
* Fail-soft in the same direction as the two name resolvers above: a policy
|
|
58
|
+
* that did not load declares nothing, and a delivery mode is not a permission,
|
|
59
|
+
* so an unrelated policy typo must not decide how requests are shown. The
|
|
60
|
+
* schema closes the enum, so a policy that LOADED can only carry one of the
|
|
61
|
+
* two; anything else reaching here (a hand-built load result, a key from a
|
|
62
|
+
* later version) falls back rather than being guessed at.
|
|
63
|
+
*/
|
|
64
|
+
export function telegramDeliveryFor(load) {
|
|
65
|
+
if (!load.ok)
|
|
66
|
+
return TELEGRAM_DEFAULT_DELIVERY;
|
|
67
|
+
const declared = load.policy.channels?.["telegram"]?.["delivery"];
|
|
68
|
+
if (declared === "paced" || declared === "burst")
|
|
69
|
+
return declared;
|
|
70
|
+
return TELEGRAM_DEFAULT_DELIVERY;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The Telegram channel's credential manifest (APRV-79).
|
|
74
|
+
*
|
|
75
|
+
* The same shape an adapter declares (`core/credential-spec.ts`), for the same
|
|
76
|
+
* reason: `approval setup channel telegram` runs the shared conversation in
|
|
77
|
+
* `cli/setup-flow.ts`, and that conversation is DERIVED from a manifest. What
|
|
78
|
+
* differs from an adapter's is the destination and not the vocabulary — a
|
|
79
|
+
* channel's two values go to the OS keystore and `.approval/env`, because a
|
|
80
|
+
* channel holds no state and its token is what unlocks the machine, while an
|
|
81
|
+
* adapter's go to the vault (SPEC.md §4, §10.3, §10.4).
|
|
82
|
+
*
|
|
83
|
+
* The NAMES are the policy's, resolved through the two functions above, so the
|
|
84
|
+
* checklist an operator reads names the variables their own policy declares.
|
|
85
|
+
* A spec carries no value and no default on either entry: the token is the
|
|
86
|
+
* operator's and the chat id is discovered.
|
|
87
|
+
*/
|
|
88
|
+
export function telegramCredentialSpecs(load) {
|
|
89
|
+
return [
|
|
90
|
+
{
|
|
91
|
+
name: telegramTokenEnvFor(load),
|
|
92
|
+
kind: "secret",
|
|
93
|
+
label: "bot token from @BotFather",
|
|
94
|
+
describe: "the bot credential, stored in the OS keystore; this file records only where it lives",
|
|
95
|
+
required: true,
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: telegramChatEnvFor(load),
|
|
99
|
+
kind: "config",
|
|
100
|
+
label: "approver chat id",
|
|
101
|
+
describe: "discovered from the bot's updates, written as a literal: a chat id is not a secret",
|
|
102
|
+
required: true,
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
}
|
|
106
|
+
/** A non-empty string under `channels.telegram.<key>`, or `null`. */
|
|
107
|
+
function declaredEnvName(load, key) {
|
|
108
|
+
if (!load.ok)
|
|
109
|
+
return null;
|
|
110
|
+
const telegram = load.policy.channels?.["telegram"];
|
|
111
|
+
const declared = telegram === undefined ? undefined : telegram[key];
|
|
112
|
+
return typeof declared === "string" && declared.length > 0 ? declared : null;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=telegram-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-config.js","sourceRoot":"","sources":["../../../src/core/telegram-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AAEtD;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AAEpD,wEAAwE;AACxE,MAAM,UAAU,mBAAmB,CAAC,IAAsB;IACxD,OAAO,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,kBAAkB,CAAC;AAClE,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACvD,OAAO,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,iBAAiB,CAAC;AACnE,CAAC;AAiBD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAqB,OAAO,CAAC;AAEnE;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAsB;IACxD,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,yBAAyB,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IAClE,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAC;IAClE,OAAO,yBAAyB,CAAC;AACnC,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAsB;IAC5D,OAAO;QACL;YACE,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC;YAC/B,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,2BAA2B;YAClC,QAAQ,EACN,sFAAsF;YACxF,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC;YAC9B,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,kBAAkB;YACzB,QAAQ,EACN,oFAAoF;YACtF,QAAQ,EAAE,IAAI;SACf;KACF,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,SAAS,eAAe,CAAC,IAAsB,EAAE,GAAW;IAC1D,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpE,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution tokens (SPEC.md §10.4, §11) — the hard-enforcement primitive.
|
|
3
|
+
*
|
|
4
|
+
* An adapter holds credentials and "MUST require a valid, unexpired, single-use
|
|
5
|
+
* execution token bound to the action's `idempotency_key`" (SPEC.md §10.4).
|
|
6
|
+
* This module mints those tokens, decides whether a presented one is still good,
|
|
7
|
+
* and spends it. Everything it knows it derives from the append-only log.
|
|
8
|
+
*
|
|
9
|
+
* ## The five settled properties (human decision, 2026-08-06)
|
|
10
|
+
*
|
|
11
|
+
* 1. **Minted at grant.** There is exactly one mint site: the grant path of
|
|
12
|
+
* `core/gate.ts`'s {@link import("./gate.js").decide}. No other code path
|
|
13
|
+
* creates a token, so a token's existence *is* a human's yes.
|
|
14
|
+
* 2. **Single-use.** Consumption is an `execution.started` event, so the second
|
|
15
|
+
* attempt is refused by reading the log rather than by remembering anything.
|
|
16
|
+
* Double-spend detection is chain-native: it survives a process restart, a
|
|
17
|
+
* different machine, and a lost in-memory cache, because the evidence is the
|
|
18
|
+
* log itself.
|
|
19
|
+
* 3. **Bound to the request, its `idempotency_key`, and its `payload_hash`**
|
|
20
|
+
* (amended SPEC.md §10, A1). A token is looked up by `action_key` — the
|
|
21
|
+
* envelope's `idempotency_key` — and is compared against the hash on *that*
|
|
22
|
+
* action's grant. A token minted for action A therefore cannot be presented
|
|
23
|
+
* for action B: B's grant carries a different hash (or no grant at all), and
|
|
24
|
+
* the comparison fails. The third binding is to the bytes: a consumer states
|
|
25
|
+
* the hash of the payload it is about to execute, and anything but the hash
|
|
26
|
+
* the grant recorded is refused `payload-mismatch`. A grant approves specific
|
|
27
|
+
* bytes; changing them after grant requires a new request. A grant that
|
|
28
|
+
* recorded *no* bytes is refused too — see {@link consumeToken}.
|
|
29
|
+
* 4. **Hash-only in the log.** `approval.granted` carries
|
|
30
|
+
* `payload.token_sha256`; the raw token is returned to the caller of `decide`
|
|
31
|
+
* and to nothing else. Possession is proven by presenting a preimage. An
|
|
32
|
+
* attacker with a copy of the log — the one artifact this system deliberately
|
|
33
|
+
* makes durable, copyable, and auditable — gains no ability to execute.
|
|
34
|
+
* 5. **No separate token TTL in v0.1.** A token dies exactly three ways:
|
|
35
|
+
* execution ({@link consumeToken}), revocation (`approval.revoked`), and the
|
|
36
|
+
* lapse of the *parent request's* TTL (`defaults.approval_ttl`, measured from
|
|
37
|
+
* the `approval.requested` timestamp). Inventing a second, independent clock
|
|
38
|
+
* would create a state where a request is live and its token is not, which no
|
|
39
|
+
* operator could explain from the log.
|
|
40
|
+
*
|
|
41
|
+
* ## Why the parent TTL bounds a *granted* request
|
|
42
|
+
*
|
|
43
|
+
* `requestState` deliberately stops applying the TTL once a decision lands: an
|
|
44
|
+
* answered request is answered. Token liveness is a stricter question than
|
|
45
|
+
* request state, and the settled design gives an approval a shelf life. So
|
|
46
|
+
* {@link tokenStatus} re-applies `requestTs + approval_ttl` to a *granted*
|
|
47
|
+
* request and refuses with `token-expired` past it. This never mutates the
|
|
48
|
+
* derived request state and never writes anything — an aged-out token is simply
|
|
49
|
+
* not spendable, and re-requesting the action is the repair. (Contrast
|
|
50
|
+
* `core/gate.ts`, which materialises `approval.expired` when it discovers a
|
|
51
|
+
* lapse on an *undecided* request. That branch belongs to the gate and this
|
|
52
|
+
* module does not duplicate it: a granted request's `approval.expired` would
|
|
53
|
+
* claim the human never answered.)
|
|
54
|
+
*
|
|
55
|
+
* ## Where this module sits between APRV-16 and APRV-18
|
|
56
|
+
*
|
|
57
|
+
* `core/gate.ts` deliberately appends no `execution.*` event. {@link
|
|
58
|
+
* consumeToken} is the **only sanctioned appender of `execution.started` on the
|
|
59
|
+
* manual path**, and it appends one only after a live token verifies — closing
|
|
60
|
+
* the gap APRV-16 flagged, where a manual action's start event had no guard at
|
|
61
|
+
* all.
|
|
62
|
+
*
|
|
63
|
+
* The supervised/autonomous paths are **not** this function's business. Under
|
|
64
|
+
* the amended SPEC.md §6.3 they produce no approval events and therefore no
|
|
65
|
+
* token; their `execution.started` is appended by APRV-18's `approval run`
|
|
66
|
+
* wrapper, which is also where their budget is charged (see the consumption
|
|
67
|
+
* contract in `core/budgets.ts`). One rule, stated once: *manual actions spend a
|
|
68
|
+
* token here; non-manual actions start there.*
|
|
69
|
+
*
|
|
70
|
+
* ## The budgets contract
|
|
71
|
+
*
|
|
72
|
+
* The appended `execution.started` carries `payload.class` and
|
|
73
|
+
* `payload.est_cost_usd`, **copied from the grant's payload** rather than
|
|
74
|
+
* re-derived. `core/budgets.ts` counts an `execution.started` only when the
|
|
75
|
+
* window holds no `approval.granted` with the same `action_key`, so a manual
|
|
76
|
+
* action that is granted and then consumed is charged exactly once — the grant.
|
|
77
|
+
* Copying rather than re-deriving keeps the two records agreeing about what was
|
|
78
|
+
* authorized even if the task file changed in between.
|
|
79
|
+
*
|
|
80
|
+
* ## Time
|
|
81
|
+
*
|
|
82
|
+
* {@link tokenStatus} and {@link verifyToken} are pure and take `now` as a
|
|
83
|
+
* parameter: they answer a question and write nothing, so a caller asking "was
|
|
84
|
+
* this token live at time T?" is asking something legitimate. {@link
|
|
85
|
+
* consumeToken} *writes*, and `execution.started` is a gate-typed event, so
|
|
86
|
+
* amended SPEC.md §8 (A2) gives its timestamp to the runtime: no `ts`
|
|
87
|
+
* parameter, one read of {@link TokenOptions.clock} at the top, and a spender
|
|
88
|
+
* that cannot choose the moment its own TTL is judged at.
|
|
89
|
+
*/
|
|
90
|
+
import { type ClockOptions } from "./clock.js";
|
|
91
|
+
import { type AppendError, type AppendOptions, type EventRecord } from "./log.js";
|
|
92
|
+
import { type PolicyLoadResult } from "./policy-load.js";
|
|
93
|
+
import type { SandboxState } from "./sandbox.js";
|
|
94
|
+
import { type RequestState } from "./state.js";
|
|
95
|
+
/** Token entropy. 32 bytes = 256 bits, rendered as 64 lowercase hex chars. */
|
|
96
|
+
export declare const TOKEN_BYTES = 32;
|
|
97
|
+
/** The payload key carrying the token's digest, on both grant and start. */
|
|
98
|
+
export declare const TOKEN_HASH_FIELD = "token_sha256";
|
|
99
|
+
/** The payload key carrying the content binding (amended SPEC.md §6.2, §10). */
|
|
100
|
+
export declare const PAYLOAD_HASH_FIELD = "payload_hash";
|
|
101
|
+
/**
|
|
102
|
+
* Mint a token: 32 cryptographically random bytes as lowercase hex.
|
|
103
|
+
*
|
|
104
|
+
* `randomBytes` (CSPRNG), never `Math.random`. The value is a bearer credential
|
|
105
|
+
* for a real-world side effect; 256 bits makes guessing irrelevant next to every
|
|
106
|
+
* other attack in SPEC.md §11's "not defended" list.
|
|
107
|
+
*/
|
|
108
|
+
export declare function mintToken(): string;
|
|
109
|
+
/** The token's SHA-256, lowercase hex — the only form that ever reaches the log. */
|
|
110
|
+
export declare function tokenHash(token: string): string;
|
|
111
|
+
/**
|
|
112
|
+
* Constant-time comparison of two 64-hex digests.
|
|
113
|
+
*
|
|
114
|
+
* Both operands are digests, so a timing leak reveals a prefix of a *hash*, not
|
|
115
|
+
* of a token — but this CLI runs on a shared developer machine beside the very
|
|
116
|
+
* agents it polices, and an oracle that says "your first N hex digits were
|
|
117
|
+
* right" is the kind of affordance that should not exist at all. `timingSafeEqual`
|
|
118
|
+
* costs nothing here and removes the question.
|
|
119
|
+
*
|
|
120
|
+
* Digests are compared as decoded bytes: a malformed stored digest decodes to a
|
|
121
|
+
* different length, which `timingSafeEqual` rejects by throwing, so the length
|
|
122
|
+
* guard comes first and a malformed digest simply fails to match.
|
|
123
|
+
*/
|
|
124
|
+
export declare function digestsEqual(a: string, b: string): boolean;
|
|
125
|
+
/**
|
|
126
|
+
* The token refusals proper — the closed set an agent branches on to learn *why*
|
|
127
|
+
* a token will not execute. Frozen public API, in the same sense the gate's
|
|
128
|
+
* codes and the exit codes are.
|
|
129
|
+
*
|
|
130
|
+
* The four death conditions are distinguishable on purpose: "you presented the
|
|
131
|
+
* wrong string", "this token was already spent", "a human took it back", and
|
|
132
|
+
* "it aged out" call for four different responses (fix the caller, stop
|
|
133
|
+
* retrying, escalate to the human, re-request).
|
|
134
|
+
*/
|
|
135
|
+
export declare const TOKEN_VERIFY_REFUSAL_CODES: readonly [
|
|
136
|
+
/** No grant governs this action key: never requested, awaiting, or rejected. */
|
|
137
|
+
"not-granted",
|
|
138
|
+
/** A grant exists, but the presented token is not its preimage. */
|
|
139
|
+
"token-mismatch",
|
|
140
|
+
/** The token was already spent: an `execution.started` exists for this key. */
|
|
141
|
+
"token-consumed",
|
|
142
|
+
/** The parent request's TTL lapsed. There is no separate token TTL. */
|
|
143
|
+
"token-expired",
|
|
144
|
+
/** A human withdrew the grant (`approval.revoked`). */
|
|
145
|
+
"token-revoked",
|
|
146
|
+
/**
|
|
147
|
+
* The bytes do not match (amended SPEC.md §10, A1). The grant recorded a
|
|
148
|
+
* `payload_hash` and the consumer presented a different one — or none at all,
|
|
149
|
+
* which is the same fact stated by omission: an executor that cannot say what
|
|
150
|
+
* it is about to run has not shown that it is running what was approved.
|
|
151
|
+
*
|
|
152
|
+
* Distinct from `token-mismatch` on purpose. That one says "you are not the
|
|
153
|
+
* party who was approved"; this one says "you are, but that is not what was
|
|
154
|
+
* approved", and the repair is different: request the new payload rather than
|
|
155
|
+
* hunt for a lost token.
|
|
156
|
+
*/
|
|
157
|
+
"payload-mismatch",
|
|
158
|
+
/**
|
|
159
|
+
* The grant was for a harness-executed request and minted no token
|
|
160
|
+
* (APRV-106). Nothing is wrong: the requesting process runs the command
|
|
161
|
+
* itself and never had a token to spend, so there is nothing to present here
|
|
162
|
+
* and nothing to recover. Distinct from `token-mismatch`, which says a
|
|
163
|
+
* digest exists and does not match, and from `not-granted`, which says no
|
|
164
|
+
* authorization exists at all — this one says the authorization exists, is
|
|
165
|
+
* complete, and is not the kind that is spent.
|
|
166
|
+
*/
|
|
167
|
+
"harness-executed"];
|
|
168
|
+
export type TokenVerifyRefusalCode = (typeof TOKEN_VERIFY_REFUSAL_CODES)[number];
|
|
169
|
+
/**
|
|
170
|
+
* Everything {@link consumeToken} can refuse: the verification codes plus the
|
|
171
|
+
* three log/append failures, whose names and meanings are borrowed verbatim from
|
|
172
|
+
* `core/gate.ts` so the CLI can map them onto the frozen exit table identically.
|
|
173
|
+
*/
|
|
174
|
+
export declare const TOKEN_REFUSAL_CODES: readonly ["not-granted", "token-mismatch", "token-consumed", "token-expired", "token-revoked", "payload-mismatch", "harness-executed", "class-human-only", "log-unreadable", "log-torn-tail", "log-corrupt", "append-failed"];
|
|
175
|
+
export type TokenRefusalCode = (typeof TOKEN_REFUSAL_CODES)[number];
|
|
176
|
+
/** Every token failure is one of these. Nothing here throws. */
|
|
177
|
+
export interface TokenRefusal {
|
|
178
|
+
ok: false;
|
|
179
|
+
code: TokenRefusalCode;
|
|
180
|
+
message: string;
|
|
181
|
+
/** The derived request state at refusal time, when one could be derived. */
|
|
182
|
+
state?: RequestState;
|
|
183
|
+
/** The seq of the record that produced the refusal (grant, start, revoke). */
|
|
184
|
+
seq?: number;
|
|
185
|
+
/** The underlying append error, when `code` is `append-failed`. */
|
|
186
|
+
append?: AppendError;
|
|
187
|
+
}
|
|
188
|
+
/** A live, unspent grant and everything a consumer needs to spend it. */
|
|
189
|
+
export interface TokenStatus {
|
|
190
|
+
ok: true;
|
|
191
|
+
actionKey: string;
|
|
192
|
+
/** The task id the grant names; `execution.started` requires it. */
|
|
193
|
+
task: string | null;
|
|
194
|
+
/** The `approval.granted` record's seq — the mint site, for audit. */
|
|
195
|
+
grantSeq: number;
|
|
196
|
+
/** The digest recorded at mint. The raw token is not stored anywhere. */
|
|
197
|
+
tokenSha256: string;
|
|
198
|
+
/** Copied from the grant payload, per the budgets consumption contract. */
|
|
199
|
+
class: string;
|
|
200
|
+
/**
|
|
201
|
+
* Canonical decimal USD string (APRV-121), copied from the grant and written
|
|
202
|
+
* verbatim onto `execution.started`. The value is hashed material at both
|
|
203
|
+
* ends, so it is carried as the string the grant recorded rather than parsed
|
|
204
|
+
* into a number and reserialized.
|
|
205
|
+
*/
|
|
206
|
+
est_cost_usd: string;
|
|
207
|
+
/**
|
|
208
|
+
* The bytes this grant approved (amended SPEC.md §10), or `null` for a grant
|
|
209
|
+
* that recorded none. Unreachable through the gate for a manual action —
|
|
210
|
+
* `request` refuses `payload-hash-required` — so `null` here means a log
|
|
211
|
+
* written by something other than this runtime, or one predating A1.
|
|
212
|
+
*
|
|
213
|
+
* `null` does not mean "unbound and therefore free": {@link consumeToken}
|
|
214
|
+
* refuses such a grant `payload-mismatch` and it can never be spent. This
|
|
215
|
+
* field is `string | null` so a *reader* (`approval token`, a channel) can
|
|
216
|
+
* report the fact; it is never a permission.
|
|
217
|
+
*/
|
|
218
|
+
payloadHash: string | null;
|
|
219
|
+
/** The `approval.requested` timestamp the TTL is measured from. */
|
|
220
|
+
requestTs: string | null;
|
|
221
|
+
}
|
|
222
|
+
export type TokenStatusResult = TokenStatus | TokenRefusal;
|
|
223
|
+
/**
|
|
224
|
+
* Is there a live, unspent token for `actionKey` — and what is its digest?
|
|
225
|
+
*
|
|
226
|
+
* Pure: no I/O, no clock. `now` is the moment the question is asked; `ttlMs` is
|
|
227
|
+
* `defaults.approval_ttl` as the policy loader parsed it, or `null` for a policy
|
|
228
|
+
* that declares no lapse (in which case a granted token stays spendable until it
|
|
229
|
+
* is used or revoked, exactly as an undecided request stays live).
|
|
230
|
+
*
|
|
231
|
+
* Check order, and why:
|
|
232
|
+
*
|
|
233
|
+
* 1. **Revoked**, then **expired-by-derivation**, then **anything not granted**.
|
|
234
|
+
* A withdrawn authorization and a lapsed one are different facts and get
|
|
235
|
+
* different codes; everything else — never requested, still awaiting,
|
|
236
|
+
* rejected — is `not-granted`, because from a token's point of view they are
|
|
237
|
+
* the same absence.
|
|
238
|
+
* 2. **The parent TTL, re-applied to the grant.** See the module header.
|
|
239
|
+
* 3. **The recorded digest.** A grant with no usable `token_sha256` is a grant
|
|
240
|
+
* minted before this module existed (or by something else); it cannot
|
|
241
|
+
* authenticate anything, so it fails closed as `token-mismatch`.
|
|
242
|
+
* 4. **Consumption.** Any `execution.started` for this action key spends it —
|
|
243
|
+
* matching digest or not. The narrow rule (same digest) is what makes
|
|
244
|
+
* double-spend detection chain-native; the broader rule (same action key)
|
|
245
|
+
* enforces SPEC.md §7's single-use idempotency key even against a start event
|
|
246
|
+
* that named no token, and both answer `token-consumed`.
|
|
247
|
+
*/
|
|
248
|
+
export declare function tokenStatus(records: EventRecord[], actionKey: string, now: string, ttlMs?: number | null): TokenStatusResult;
|
|
249
|
+
/**
|
|
250
|
+
* The raw token for `actionKey`, recovered from the log's `token_sealed` with
|
|
251
|
+
* the private key this machine holds — or `null`.
|
|
252
|
+
*
|
|
253
|
+
* `null` means "no token was delivered here", and it means it for every reason
|
|
254
|
+
* at once: the policy is `manual` and nothing was sealed, this is a different
|
|
255
|
+
* machine from the one that requested, the key file has already been unlinked
|
|
256
|
+
* because the token was spent, or the ciphertext does not authenticate. The
|
|
257
|
+
* caller's response is identical in all four cases — fall back to the raw token
|
|
258
|
+
* the granting surface printed — and distinguishing them would be an oracle for
|
|
259
|
+
* a decryption capability nobody should be probing.
|
|
260
|
+
*
|
|
261
|
+
* Recovering a minted token is not minting one. The token still exists only
|
|
262
|
+
* because a human granted it, still binds to the payload, and is still spendable
|
|
263
|
+
* exactly once; what this function replaces is the human carrying it in a
|
|
264
|
+
* clipboard. Nothing here consults, relaxes, or substitutes for
|
|
265
|
+
* {@link verifyToken}: the value returned goes on to be verified against the
|
|
266
|
+
* log's digest like any pasted one.
|
|
267
|
+
*
|
|
268
|
+
* Pure with respect to the LOG (it appends nothing) and reads exactly one file.
|
|
269
|
+
* Never throws.
|
|
270
|
+
*/
|
|
271
|
+
export declare function deliveredToken(records: readonly EventRecord[], actionKey: string, keyDir: string): string | null;
|
|
272
|
+
/**
|
|
273
|
+
* Does `presentedToken` authorize `actionKey` right now?
|
|
274
|
+
*
|
|
275
|
+
* Accepts **iff** all five hold: the latest cycle for the key derives as
|
|
276
|
+
* `granted`; the parent request's TTL has not lapsed; the grant has not been
|
|
277
|
+
* revoked; no `execution.started` has spent it; and `sha256(presentedToken)`
|
|
278
|
+
* equals the digest recorded on the grant, compared in constant time.
|
|
279
|
+
*
|
|
280
|
+
* `ttlMs` is the parsed `defaults.approval_ttl`. It is a parameter rather than a
|
|
281
|
+
* policy read because this function is pure — {@link consumeToken} and the CLI
|
|
282
|
+
* load the policy and hand it in, so a verification can be replayed from the log
|
|
283
|
+
* plus the policy that was in force.
|
|
284
|
+
*/
|
|
285
|
+
export declare function verifyToken(records: EventRecord[], actionKey: string, presentedToken: string, now: string, ttlMs?: number | null): TokenStatusResult;
|
|
286
|
+
/**
|
|
287
|
+
* Where to find the policy whose `approval_ttl` bounds the token — plus the two
|
|
288
|
+
* things a spend now carries that a status read does not.
|
|
289
|
+
*
|
|
290
|
+
* `ts` is not among them, and no longer a parameter of {@link consumeToken}:
|
|
291
|
+
* `execution.started` is a gate-typed event, so amended SPEC.md §8 gives its
|
|
292
|
+
* timestamp to the runtime at the write boundary ({@link ClockOptions}).
|
|
293
|
+
*/
|
|
294
|
+
export interface TokenOptions extends ClockOptions {
|
|
295
|
+
/** Schema directory, passed to the append's write-boundary validation. */
|
|
296
|
+
schemaDir?: string;
|
|
297
|
+
/** Directory to discover `APPROVAL.md` in. Ignored when `policyFile` is set. */
|
|
298
|
+
policyDir?: string;
|
|
299
|
+
/** An explicit policy file, overriding discovery. */
|
|
300
|
+
policyFile?: string;
|
|
301
|
+
/** Lock tuning for the append path. */
|
|
302
|
+
append?: AppendOptions;
|
|
303
|
+
/**
|
|
304
|
+
* The hash of the payload the caller is **about to execute** (amended
|
|
305
|
+
* SPEC.md §10, A1).
|
|
306
|
+
*
|
|
307
|
+
* "Adapters and `approval run` MUST recompute the hash of the payload they
|
|
308
|
+
* are about to execute and MUST refuse, with a distinct machine-readable
|
|
309
|
+
* reason (`payload-mismatch`), when it differs from the hash the grant
|
|
310
|
+
* recorded." That is this field: it is not read from the log, because a value
|
|
311
|
+
* read from the log would prove nothing — the point is that the executor
|
|
312
|
+
* states, independently, what it holds, and the runtime compares.
|
|
313
|
+
*
|
|
314
|
+
* REQUIRED for every spend. Under A1 every manual grant this runtime mints
|
|
315
|
+
* records a `payload_hash`, and a grant that somehow records none is refused
|
|
316
|
+
* outright rather than treated as unbound — so there is no case in which
|
|
317
|
+
* omitting this field succeeds. Omitting it is a mismatch.
|
|
318
|
+
*/
|
|
319
|
+
presentedPayloadHash?: string;
|
|
320
|
+
/**
|
|
321
|
+
* How many credential-bearing variables the executor withheld from the child
|
|
322
|
+
* it is about to spawn (APRV-205), recorded on the `execution.started` this
|
|
323
|
+
* spend appends.
|
|
324
|
+
*
|
|
325
|
+
* The manual path's copy of `ExecuteOptions.envStripped`, and it exists
|
|
326
|
+
* because the manual path's `execution.started` is written HERE rather than
|
|
327
|
+
* in `core/execute.ts`. A count recorded on one of the two start events and
|
|
328
|
+
* not the other would be a field an auditor could not rely on. A count, never
|
|
329
|
+
* a name and never a value.
|
|
330
|
+
*/
|
|
331
|
+
envStripped?: number;
|
|
332
|
+
/**
|
|
333
|
+
* The room the child ran in (APRV-193), recorded on the `execution.started`
|
|
334
|
+
* this spend appends. The manual path's copy of `ExecuteOptions.sandbox`, for
|
|
335
|
+
* the same reason the count above is: a field recorded on one of the two
|
|
336
|
+
* start events and not the other is a field an auditor cannot rely on.
|
|
337
|
+
*/
|
|
338
|
+
sandbox?: SandboxState;
|
|
339
|
+
}
|
|
340
|
+
export type ConsumeResult = {
|
|
341
|
+
ok: true;
|
|
342
|
+
record: EventRecord;
|
|
343
|
+
tokenSha256: string;
|
|
344
|
+
grantSeq: number;
|
|
345
|
+
} | TokenRefusal;
|
|
346
|
+
/** The parsed TTL, or `null` when the policy declares (or can declare) none. */
|
|
347
|
+
export declare function tokenTtlMs(options: TokenOptions): number | null;
|
|
348
|
+
/** The policy this module reads, loaded once per operation. */
|
|
349
|
+
export declare function tokenPolicy(options: TokenOptions): PolicyLoadResult;
|
|
350
|
+
/**
|
|
351
|
+
* Is `actionClass` reserved to human hands under `load` (APRV-185)?
|
|
352
|
+
*
|
|
353
|
+
* Returns the refusal to emit, or `null`. Shared by {@link consumeToken} and by
|
|
354
|
+
* the `approval token` verb, which report the same fact about the same class
|
|
355
|
+
* and must not word it two ways.
|
|
356
|
+
*
|
|
357
|
+
* The §7 irreversibility floor is deliberately not consulted: it raises to
|
|
358
|
+
* `manual` at most and can neither produce `human-only` nor remove it, so the
|
|
359
|
+
* grant's declared `reversible` — which this module does not carry anyway —
|
|
360
|
+
* cannot change this answer.
|
|
361
|
+
*/
|
|
362
|
+
export declare function humanOnlyClassRefusal(load: PolicyLoadResult, actionClass: string | null, whatWasRefused: string): TokenRefusal | null;
|
|
363
|
+
/**
|
|
364
|
+
* Verify every read-only condition of a token spend.
|
|
365
|
+
*
|
|
366
|
+
* Shared by {@link consumeToken} and adapter execution preflight. It appends
|
|
367
|
+
* nothing and grants no authority to act; `consumeToken` re-reads and repeats
|
|
368
|
+
* this check immediately before its compare-and-append.
|
|
369
|
+
*/
|
|
370
|
+
export type TokenSpendStatus = TokenStatus & {
|
|
371
|
+
task: string;
|
|
372
|
+
payloadHash: string;
|
|
373
|
+
};
|
|
374
|
+
export declare function verifyTokenSpend(records: EventRecord[], actionKey: string, presentedToken: string, now: string, load: PolicyLoadResult, presentedPayloadHash?: string): TokenSpendStatus | TokenRefusal;
|
|
375
|
+
/**
|
|
376
|
+
* Spend a token: verify it, then append `execution.started`.
|
|
377
|
+
*
|
|
378
|
+
* **This is the only sanctioned way to append `execution.started` for a manual
|
|
379
|
+
* action.** APRV-16 left that gap open deliberately — the gate appends no
|
|
380
|
+
* execution events — and this function closes it: on the manual path a start
|
|
381
|
+
* event now requires a live, verified, unspent token, so an agent cannot record
|
|
382
|
+
* an execution the human never authorized. Supervised and autonomous actions
|
|
383
|
+
* have no grant and therefore no token; their start event is APRV-18's `approval
|
|
384
|
+
* run` wrapper's job, and calling this for them correctly refuses `not-granted`.
|
|
385
|
+
*
|
|
386
|
+
* The payload is exactly `{class, est_cost_usd, token_sha256, payload_hash}`:
|
|
387
|
+
* the first two because `core/budgets.ts` meters authorization from them, the
|
|
388
|
+
* third because it is what makes the second consumption attempt refusable from
|
|
389
|
+
* the log alone, and the fourth because an auditor should be able to see from
|
|
390
|
+
* the log that what ran is what was approved. All four are copied from the
|
|
391
|
+
* grant, never re-derived. `payload_hash` is unconditional because a grant
|
|
392
|
+
* carrying none is refused (see below) rather than spent.
|
|
393
|
+
*
|
|
394
|
+
* Verification and append are made atomic by compare-and-append (APRV-20 finding
|
|
395
|
+
* B1): this function reads the log itself — never records handed in by a caller —
|
|
396
|
+
* and passes the head it read as `appendEvent`'s `expectedHead`. Two genuinely
|
|
397
|
+
* concurrent consumers of one token therefore cannot both start. Whichever takes
|
|
398
|
+
* the lockfile first appends `execution.started`; the loser finds the head moved
|
|
399
|
+
* under the lock and is refused `append-failed`/`head-moved` with nothing
|
|
400
|
+
* written. The loser is **not** retried here: re-reading would report
|
|
401
|
+
* `token-consumed`, but deciding to look again is the caller's call, and a core
|
|
402
|
+
* that silently retried would hide a double-spend attempt behind a tidy error.
|
|
403
|
+
*
|
|
404
|
+
* `actor` is not pre-validated: the event schema is the authority on actor
|
|
405
|
+
* shape, and a malformed one is refused at the write boundary as
|
|
406
|
+
* `append-failed`, with the schema's own error attached. One rule about actors,
|
|
407
|
+
* enforced in one place.
|
|
408
|
+
*/
|
|
409
|
+
export declare function consumeToken(logPath: string, actionKey: string, presentedToken: string, actor: string, options?: TokenOptions): ConsumeResult;
|