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,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt layout: which INFORMATIONAL rows a channel puts in front of an
|
|
3
|
+
* approver, as a policy decision rather than a code decision (APRV-218).
|
|
4
|
+
*
|
|
5
|
+
* SPEC.md §5.2 gains `channels.<name>.prompt`; SPEC.md §10.3 already says a
|
|
6
|
+
* channel holds no truth, and this module is what keeps that so — the block
|
|
7
|
+
* decides what is SHOWN, never what is true, and every field it can reach was
|
|
8
|
+
* already on the `ChannelRequest` and already in `--json`, `approval queue` and
|
|
9
|
+
* the web page. Nothing here reads the log, and no key added here lets a
|
|
10
|
+
* channel learn anything about it.
|
|
11
|
+
*
|
|
12
|
+
* ## Why this is a policy key at all
|
|
13
|
+
*
|
|
14
|
+
* The Telegram prompt was slimmed deliberately: APRV-143 dropped the `ttl` row
|
|
15
|
+
* because the `waiting … expires HH:MM UTC` line already states the deadline,
|
|
16
|
+
* and APRV-163 dropped six bookkeeping rows and made three health rows render
|
|
17
|
+
* only when abnormal. That layout fits ONE operator's workflow. Another wants
|
|
18
|
+
* the budget line on every prompt, or the TTL as a duration, or the task id
|
|
19
|
+
* always visible. Those are preferences about a screen, and preferences about a
|
|
20
|
+
* screen belong in the policy file beside the other things an operator chooses,
|
|
21
|
+
* not in a `git blame` argument about a default.
|
|
22
|
+
*
|
|
23
|
+
* ## What a layout may NOT do
|
|
24
|
+
*
|
|
25
|
+
* A layout chooses among rows the approver may read. It cannot touch what the
|
|
26
|
+
* approver SIGNS. Three things are therefore out of its reach entirely:
|
|
27
|
+
*
|
|
28
|
+
* 1. **The canonical block** (SPEC.md §9's "what you see is what you sign") is
|
|
29
|
+
* not a row. It carries the payload bytes, the renderer version, the class,
|
|
30
|
+
* the kind and the bound `payload sha256`, it is rendered verbatim, and no
|
|
31
|
+
* key in this module can reorder, shorten, or remove it.
|
|
32
|
+
* 2. **The computed/claimed split.** A row's side of the boundary is a property
|
|
33
|
+
* of the field (`TaggedField.kind`), not of the layout. `rows` reorders; it
|
|
34
|
+
* cannot move a claimed line into the computed block, because a channel
|
|
35
|
+
* partitions by kind AFTER it applies the order. That is the property
|
|
36
|
+
* APRV-144's CLAIMED heading exists for, and a test pins it.
|
|
37
|
+
* 3. **{@link REQUIRED_PROMPT_ROWS}**, the rows the contract marks as required
|
|
38
|
+
* for a decision. Naming one in `hide` is a policy that fails to load.
|
|
39
|
+
*
|
|
40
|
+
* The buttons are not a row either, for the same reason the block is not: a
|
|
41
|
+
* prompt with no way to answer it is not a prompt.
|
|
42
|
+
*
|
|
43
|
+
* ## Fail directions
|
|
44
|
+
*
|
|
45
|
+
* Soft on ABSENCE, closed on INVALIDITY, which is the split every other policy
|
|
46
|
+
* key in this runtime keeps. No `prompt` block, or a policy that did not load,
|
|
47
|
+
* means today's rows: a layout is not a permission, and an unrelated typo in a
|
|
48
|
+
* class rule must not silently redecorate a phone screen. An unknown row name
|
|
49
|
+
* or a required row in `hide` is a statement the runtime cannot honour, so the
|
|
50
|
+
* WHOLE policy fails schema validation and every class resolves to `manual` —
|
|
51
|
+
* the operator repairs the file, and until they do the gate is at its
|
|
52
|
+
* strictest.
|
|
53
|
+
*
|
|
54
|
+
* Pure: no clock, no IO, no environment. It sits in `core/` rather than in
|
|
55
|
+
* `channels/` for `core/telegram-config.ts`'s reason — more than one layer asks
|
|
56
|
+
* "which rows does this policy want?" and none of them may answer differently —
|
|
57
|
+
* and it imports nothing from `channels/`, so `tests/layering.test.ts` stays
|
|
58
|
+
* true. The row names below are the `ChannelRequest` member names spelled as
|
|
59
|
+
* plain strings for exactly that reason.
|
|
60
|
+
*/
|
|
61
|
+
import type { Policy, PolicyLoadResult } from "./policy-load.js";
|
|
62
|
+
import type { ValidationError } from "./validate.js";
|
|
63
|
+
/**
|
|
64
|
+
* The row vocabulary: every `ChannelRequest` member a channel renders as a row.
|
|
65
|
+
*
|
|
66
|
+
* Closed, and closed for `delivery`'s reason (APRV-216): a name this runtime
|
|
67
|
+
* cannot place is a row the author believes is in force that nothing reads, and
|
|
68
|
+
* guessing at it would be the silent no-op the whole policy schema is shaped to
|
|
69
|
+
* prevent.
|
|
70
|
+
*
|
|
71
|
+
* `fullPayload` is deliberately ABSENT. The canonical block is not a row.
|
|
72
|
+
*/
|
|
73
|
+
export declare const PROMPT_ROWS: readonly ["action_key", "task", "class", "command_breakdown", "protected_path", "policy_diff", "policy_load", "autonomy", "provenance", "state", "requested_ts", "waiting", "ttl_remaining_ms", "payload_hash", "attestation", "budgets", "chain", "token_delivery", "est_cost_usd", "gloss", "summary", "rationale", "confidence"];
|
|
74
|
+
/** One row name from {@link PROMPT_ROWS}. */
|
|
75
|
+
export type PromptRow = (typeof PROMPT_ROWS)[number];
|
|
76
|
+
/** Whether a string is a row name this runtime knows how to place. */
|
|
77
|
+
export declare function isPromptRow(value: unknown): value is PromptRow;
|
|
78
|
+
/**
|
|
79
|
+
* The rows an operator may reorder but never remove.
|
|
80
|
+
*
|
|
81
|
+
* Each is required for a DECISION rather than for a screen. `action_key`
|
|
82
|
+
* identifies which request the gesture answers; `class` is the resolution the
|
|
83
|
+
* whole gate turns on; `command_breakdown` and `protected_path` are APRV-144
|
|
84
|
+
* and APRV-143's answer to "what does this command actually do, and which
|
|
85
|
+
* protected path earned the class", derived from the bound bytes by the same
|
|
86
|
+
* classifier the hook decided with; `policy_diff` and `policy_load` are what
|
|
87
|
+
* SPEC.md §10.3 requires of an attestation prompt, where "a prompt carrying
|
|
88
|
+
* only a hash asks a human to sign for sixty-four characters and is a
|
|
89
|
+
* conformance failure".
|
|
90
|
+
*
|
|
91
|
+
* `payload_hash` is NOT here, and its absence is not an oversight. The bound
|
|
92
|
+
* hash is stated inside the canonical block on every channel, and the block is
|
|
93
|
+
* out of a layout's reach, so an operator who hides the row removes a
|
|
94
|
+
* duplicate rather than the binding. Telegram's default layout already does
|
|
95
|
+
* exactly that (APRV-163).
|
|
96
|
+
*
|
|
97
|
+
* A required row a request does not CARRY renders nothing, as it does today.
|
|
98
|
+
* Requirement is about what a policy may instruct, not about what a particular
|
|
99
|
+
* request happens to hold.
|
|
100
|
+
*/
|
|
101
|
+
export declare const REQUIRED_PROMPT_ROWS: readonly PromptRow[];
|
|
102
|
+
/**
|
|
103
|
+
* How a row renders when nothing in the policy says otherwise.
|
|
104
|
+
*
|
|
105
|
+
* - `always` — on every prompt the request carries the field for.
|
|
106
|
+
* - `abnormal` — only when the value is the reason to look. APRV-163's
|
|
107
|
+
* argument: a row that says "everything is fine" on every ordinary request is
|
|
108
|
+
* a row a reader learns to skip, and the skipping does not stop on the one
|
|
109
|
+
* request where it says something else.
|
|
110
|
+
* - `off` — the channel does not render it by default. The field still travels
|
|
111
|
+
* on the request, so `--json`, `approval queue` and the web page carry it.
|
|
112
|
+
*/
|
|
113
|
+
export type RowVisibility = "always" | "abnormal" | "off";
|
|
114
|
+
/** A resolved layout: the order rows render in, and each row's visibility. */
|
|
115
|
+
export interface PromptLayout {
|
|
116
|
+
/** Every row in {@link PROMPT_ROWS}, in render order. */
|
|
117
|
+
order: readonly PromptRow[];
|
|
118
|
+
/** Visibility per row. Total: every row name has an entry. */
|
|
119
|
+
visibility: Readonly<Record<PromptRow, RowVisibility>>;
|
|
120
|
+
}
|
|
121
|
+
/** The channels this runtime ships (SPEC.md §10.3). */
|
|
122
|
+
export declare const PROMPT_CHANNELS: readonly ["cli", "web", "telegram"];
|
|
123
|
+
/** One of the three shipped channel names. */
|
|
124
|
+
export type PromptChannel = (typeof PROMPT_CHANNELS)[number];
|
|
125
|
+
/**
|
|
126
|
+
* Telegram's default layout: the slimmed phone prompt, exactly as APRV-143 and
|
|
127
|
+
* APRV-163 left it.
|
|
128
|
+
*
|
|
129
|
+
* The ORDER of the rows that render is load-bearing and must not drift: it is
|
|
130
|
+
* the sequence a reader's eye has learned. The `off` rows are interleaved where
|
|
131
|
+
* they belong if an operator turns them on, which costs nothing while they are
|
|
132
|
+
* off and saves an operator from writing a `rows` list to get a sensible
|
|
133
|
+
* position.
|
|
134
|
+
*
|
|
135
|
+
* `action_key` is `off` here because Telegram renders it STRUCTURALLY, as the
|
|
136
|
+
* message's second line in a `<code>` span. It is required, so it cannot be
|
|
137
|
+
* hidden, and it is not a bullet, so promoting it changes nothing.
|
|
138
|
+
*/
|
|
139
|
+
export declare const TELEGRAM_PROMPT_LAYOUT: PromptLayout;
|
|
140
|
+
/**
|
|
141
|
+
* The CLI channel's default layout: every row the request carries.
|
|
142
|
+
*
|
|
143
|
+
* A terminal has room, and a one-shot rendering an operator asked for by typing
|
|
144
|
+
* a verb is not the place to economise on lines the way a push notification is.
|
|
145
|
+
*/
|
|
146
|
+
export declare const CLI_PROMPT_LAYOUT: PromptLayout;
|
|
147
|
+
/** The web channel's default layout. Same reasoning as the CLI's: a page scrolls. */
|
|
148
|
+
export declare const WEB_PROMPT_LAYOUT: PromptLayout;
|
|
149
|
+
/** Default layout per shipped channel. What an absent `prompt` block means. */
|
|
150
|
+
export declare const DEFAULT_PROMPT_LAYOUTS: Readonly<Record<PromptChannel, PromptLayout>>;
|
|
151
|
+
/**
|
|
152
|
+
* A `channels.<name>.prompt` block as a policy may write it.
|
|
153
|
+
*
|
|
154
|
+
* Three keys, and each does ONE thing, because a key that both orders and
|
|
155
|
+
* hides would leave an operator guessing which of the two a short list meant:
|
|
156
|
+
*
|
|
157
|
+
* - `rows` — ORDER ONLY. The rows it names render in that order, ahead of every
|
|
158
|
+
* row it does not name; those keep their default relative order behind them.
|
|
159
|
+
* It is never a whitelist, so a `ChannelRequest` widened by a later task
|
|
160
|
+
* cannot silently lose a field to a list written before that field existed —
|
|
161
|
+
* the same property `orderedFields` has held since APRV-23.
|
|
162
|
+
* - `always` — visibility UP. A row that is `abnormal` or `off` by default
|
|
163
|
+
* renders on every prompt.
|
|
164
|
+
* - `hide` — visibility DOWN. A row never renders. Refused for
|
|
165
|
+
* {@link REQUIRED_PROMPT_ROWS}.
|
|
166
|
+
*
|
|
167
|
+
* `always` and `hide` naming the same row is refused rather than resolved by
|
|
168
|
+
* precedence: a policy that says both things about one row has an author who
|
|
169
|
+
* believes one of them, and picking for them is the guess this schema does not
|
|
170
|
+
* make.
|
|
171
|
+
*/
|
|
172
|
+
export interface PromptBlock {
|
|
173
|
+
rows?: PromptRow[];
|
|
174
|
+
always?: PromptRow[];
|
|
175
|
+
hide?: PromptRow[];
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* The layout in force for `channel`.
|
|
179
|
+
*
|
|
180
|
+
* Fail-soft in the same direction as `telegramDeliveryFor`: a policy that did
|
|
181
|
+
* not load declares nothing, an absent block declares nothing, and a layout is
|
|
182
|
+
* not a permission. Anything structurally wrong that reaches here (a hand-built
|
|
183
|
+
* load result, a key from a later version) falls back to the default rather
|
|
184
|
+
* than being guessed at — a LOADED policy cannot carry such a block, because
|
|
185
|
+
* {@link promptBlockErrors} refuses it at load.
|
|
186
|
+
*/
|
|
187
|
+
export declare function promptLayoutFor(load: PolicyLoadResult, channel: string): PromptLayout;
|
|
188
|
+
/**
|
|
189
|
+
* Apply a block to a layout. Pure, total, and exported so a caller holding a
|
|
190
|
+
* block already can resolve it without going back through a policy file, which
|
|
191
|
+
* is what the tests do and what a future `approval policy explain` of a channel
|
|
192
|
+
* would need. Nothing outside the tests calls it today, and that is fine: the
|
|
193
|
+
* split keeps {@link promptLayoutFor} to one job, reading the block.
|
|
194
|
+
*/
|
|
195
|
+
export declare function applyPromptBlock(base: PromptLayout, block: PromptBlock): PromptLayout;
|
|
196
|
+
/** The machine-readable reasons a `prompt` block refuses (APRV-218). */
|
|
197
|
+
export declare const PROMPT_BLOCK_ERROR_KEYWORDS: readonly [
|
|
198
|
+
/** A row name this runtime cannot place. */
|
|
199
|
+
"prompt-row-unknown",
|
|
200
|
+
/** {@link REQUIRED_PROMPT_ROWS} named in `hide`. */
|
|
201
|
+
"prompt-row-required",
|
|
202
|
+
/** `rows`, `always` or `hide` is not an array of strings. */
|
|
203
|
+
"prompt-block-shape",
|
|
204
|
+
/** One row named by both `always` and `hide`. */
|
|
205
|
+
"prompt-row-conflict",
|
|
206
|
+
/** A key the `prompt` block does not define. */
|
|
207
|
+
"prompt-key-unknown"];
|
|
208
|
+
/**
|
|
209
|
+
* Validate every `channels.<name>.prompt` in a policy. Empty means clean.
|
|
210
|
+
*
|
|
211
|
+
* This runs on top of the JSON Schema rather than instead of it, and the
|
|
212
|
+
* duplication is deliberate. The schema types the three channels this runtime
|
|
213
|
+
* ships and closes the row enum there, which is where SPEC.md §8's
|
|
214
|
+
* validate-at-the-write-boundary rule wants it; but `channels` admits UNKNOWN
|
|
215
|
+
* channel names as free-form objects on purpose, so a third-party transport
|
|
216
|
+
* plugin does not invalidate a whole policy, and a `prompt` block written under
|
|
217
|
+
* such a name would otherwise reach a renderer unchecked. Both nets return the
|
|
218
|
+
* same verdict — the policy does not load, everything is `manual` — so an
|
|
219
|
+
* operator never has to know which one caught them.
|
|
220
|
+
*/
|
|
221
|
+
export declare function promptBlockErrors(policy: Policy): ValidationError[];
|
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt layout: which INFORMATIONAL rows a channel puts in front of an
|
|
3
|
+
* approver, as a policy decision rather than a code decision (APRV-218).
|
|
4
|
+
*
|
|
5
|
+
* SPEC.md §5.2 gains `channels.<name>.prompt`; SPEC.md §10.3 already says a
|
|
6
|
+
* channel holds no truth, and this module is what keeps that so — the block
|
|
7
|
+
* decides what is SHOWN, never what is true, and every field it can reach was
|
|
8
|
+
* already on the `ChannelRequest` and already in `--json`, `approval queue` and
|
|
9
|
+
* the web page. Nothing here reads the log, and no key added here lets a
|
|
10
|
+
* channel learn anything about it.
|
|
11
|
+
*
|
|
12
|
+
* ## Why this is a policy key at all
|
|
13
|
+
*
|
|
14
|
+
* The Telegram prompt was slimmed deliberately: APRV-143 dropped the `ttl` row
|
|
15
|
+
* because the `waiting … expires HH:MM UTC` line already states the deadline,
|
|
16
|
+
* and APRV-163 dropped six bookkeeping rows and made three health rows render
|
|
17
|
+
* only when abnormal. That layout fits ONE operator's workflow. Another wants
|
|
18
|
+
* the budget line on every prompt, or the TTL as a duration, or the task id
|
|
19
|
+
* always visible. Those are preferences about a screen, and preferences about a
|
|
20
|
+
* screen belong in the policy file beside the other things an operator chooses,
|
|
21
|
+
* not in a `git blame` argument about a default.
|
|
22
|
+
*
|
|
23
|
+
* ## What a layout may NOT do
|
|
24
|
+
*
|
|
25
|
+
* A layout chooses among rows the approver may read. It cannot touch what the
|
|
26
|
+
* approver SIGNS. Three things are therefore out of its reach entirely:
|
|
27
|
+
*
|
|
28
|
+
* 1. **The canonical block** (SPEC.md §9's "what you see is what you sign") is
|
|
29
|
+
* not a row. It carries the payload bytes, the renderer version, the class,
|
|
30
|
+
* the kind and the bound `payload sha256`, it is rendered verbatim, and no
|
|
31
|
+
* key in this module can reorder, shorten, or remove it.
|
|
32
|
+
* 2. **The computed/claimed split.** A row's side of the boundary is a property
|
|
33
|
+
* of the field (`TaggedField.kind`), not of the layout. `rows` reorders; it
|
|
34
|
+
* cannot move a claimed line into the computed block, because a channel
|
|
35
|
+
* partitions by kind AFTER it applies the order. That is the property
|
|
36
|
+
* APRV-144's CLAIMED heading exists for, and a test pins it.
|
|
37
|
+
* 3. **{@link REQUIRED_PROMPT_ROWS}**, the rows the contract marks as required
|
|
38
|
+
* for a decision. Naming one in `hide` is a policy that fails to load.
|
|
39
|
+
*
|
|
40
|
+
* The buttons are not a row either, for the same reason the block is not: a
|
|
41
|
+
* prompt with no way to answer it is not a prompt.
|
|
42
|
+
*
|
|
43
|
+
* ## Fail directions
|
|
44
|
+
*
|
|
45
|
+
* Soft on ABSENCE, closed on INVALIDITY, which is the split every other policy
|
|
46
|
+
* key in this runtime keeps. No `prompt` block, or a policy that did not load,
|
|
47
|
+
* means today's rows: a layout is not a permission, and an unrelated typo in a
|
|
48
|
+
* class rule must not silently redecorate a phone screen. An unknown row name
|
|
49
|
+
* or a required row in `hide` is a statement the runtime cannot honour, so the
|
|
50
|
+
* WHOLE policy fails schema validation and every class resolves to `manual` —
|
|
51
|
+
* the operator repairs the file, and until they do the gate is at its
|
|
52
|
+
* strictest.
|
|
53
|
+
*
|
|
54
|
+
* Pure: no clock, no IO, no environment. It sits in `core/` rather than in
|
|
55
|
+
* `channels/` for `core/telegram-config.ts`'s reason — more than one layer asks
|
|
56
|
+
* "which rows does this policy want?" and none of them may answer differently —
|
|
57
|
+
* and it imports nothing from `channels/`, so `tests/layering.test.ts` stays
|
|
58
|
+
* true. The row names below are the `ChannelRequest` member names spelled as
|
|
59
|
+
* plain strings for exactly that reason.
|
|
60
|
+
*/
|
|
61
|
+
/**
|
|
62
|
+
* The row vocabulary: every `ChannelRequest` member a channel renders as a row.
|
|
63
|
+
*
|
|
64
|
+
* Closed, and closed for `delivery`'s reason (APRV-216): a name this runtime
|
|
65
|
+
* cannot place is a row the author believes is in force that nothing reads, and
|
|
66
|
+
* guessing at it would be the silent no-op the whole policy schema is shaped to
|
|
67
|
+
* prevent.
|
|
68
|
+
*
|
|
69
|
+
* `fullPayload` is deliberately ABSENT. The canonical block is not a row.
|
|
70
|
+
*/
|
|
71
|
+
export const PROMPT_ROWS = [
|
|
72
|
+
"action_key",
|
|
73
|
+
"task",
|
|
74
|
+
"class",
|
|
75
|
+
"command_breakdown",
|
|
76
|
+
"protected_path",
|
|
77
|
+
"policy_diff",
|
|
78
|
+
"policy_load",
|
|
79
|
+
"autonomy",
|
|
80
|
+
"provenance",
|
|
81
|
+
"state",
|
|
82
|
+
"requested_ts",
|
|
83
|
+
"waiting",
|
|
84
|
+
"ttl_remaining_ms",
|
|
85
|
+
"payload_hash",
|
|
86
|
+
"attestation",
|
|
87
|
+
"budgets",
|
|
88
|
+
"chain",
|
|
89
|
+
"token_delivery",
|
|
90
|
+
"est_cost_usd",
|
|
91
|
+
"gloss",
|
|
92
|
+
"summary",
|
|
93
|
+
"rationale",
|
|
94
|
+
"confidence",
|
|
95
|
+
];
|
|
96
|
+
/** Whether a string is a row name this runtime knows how to place. */
|
|
97
|
+
export function isPromptRow(value) {
|
|
98
|
+
return typeof value === "string" && PROMPT_ROWS.includes(value);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The rows an operator may reorder but never remove.
|
|
102
|
+
*
|
|
103
|
+
* Each is required for a DECISION rather than for a screen. `action_key`
|
|
104
|
+
* identifies which request the gesture answers; `class` is the resolution the
|
|
105
|
+
* whole gate turns on; `command_breakdown` and `protected_path` are APRV-144
|
|
106
|
+
* and APRV-143's answer to "what does this command actually do, and which
|
|
107
|
+
* protected path earned the class", derived from the bound bytes by the same
|
|
108
|
+
* classifier the hook decided with; `policy_diff` and `policy_load` are what
|
|
109
|
+
* SPEC.md §10.3 requires of an attestation prompt, where "a prompt carrying
|
|
110
|
+
* only a hash asks a human to sign for sixty-four characters and is a
|
|
111
|
+
* conformance failure".
|
|
112
|
+
*
|
|
113
|
+
* `payload_hash` is NOT here, and its absence is not an oversight. The bound
|
|
114
|
+
* hash is stated inside the canonical block on every channel, and the block is
|
|
115
|
+
* out of a layout's reach, so an operator who hides the row removes a
|
|
116
|
+
* duplicate rather than the binding. Telegram's default layout already does
|
|
117
|
+
* exactly that (APRV-163).
|
|
118
|
+
*
|
|
119
|
+
* A required row a request does not CARRY renders nothing, as it does today.
|
|
120
|
+
* Requirement is about what a policy may instruct, not about what a particular
|
|
121
|
+
* request happens to hold.
|
|
122
|
+
*/
|
|
123
|
+
export const REQUIRED_PROMPT_ROWS = [
|
|
124
|
+
"action_key",
|
|
125
|
+
"class",
|
|
126
|
+
"command_breakdown",
|
|
127
|
+
"protected_path",
|
|
128
|
+
"policy_diff",
|
|
129
|
+
"policy_load",
|
|
130
|
+
];
|
|
131
|
+
/** The channels this runtime ships (SPEC.md §10.3). */
|
|
132
|
+
export const PROMPT_CHANNELS = ["cli", "web", "telegram"];
|
|
133
|
+
function layoutOf(order, visibility) {
|
|
134
|
+
const full = {};
|
|
135
|
+
for (const row of PROMPT_ROWS)
|
|
136
|
+
full[row] = visibility[row] ?? "off";
|
|
137
|
+
return { order, visibility: full };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Telegram's default layout: the slimmed phone prompt, exactly as APRV-143 and
|
|
141
|
+
* APRV-163 left it.
|
|
142
|
+
*
|
|
143
|
+
* The ORDER of the rows that render is load-bearing and must not drift: it is
|
|
144
|
+
* the sequence a reader's eye has learned. The `off` rows are interleaved where
|
|
145
|
+
* they belong if an operator turns them on, which costs nothing while they are
|
|
146
|
+
* off and saves an operator from writing a `rows` list to get a sensible
|
|
147
|
+
* position.
|
|
148
|
+
*
|
|
149
|
+
* `action_key` is `off` here because Telegram renders it STRUCTURALLY, as the
|
|
150
|
+
* message's second line in a `<code>` span. It is required, so it cannot be
|
|
151
|
+
* hidden, and it is not a bullet, so promoting it changes nothing.
|
|
152
|
+
*/
|
|
153
|
+
export const TELEGRAM_PROMPT_LAYOUT = layoutOf([
|
|
154
|
+
"action_key",
|
|
155
|
+
"task",
|
|
156
|
+
"class",
|
|
157
|
+
"command_breakdown",
|
|
158
|
+
"protected_path",
|
|
159
|
+
"policy_diff",
|
|
160
|
+
"policy_load",
|
|
161
|
+
"autonomy",
|
|
162
|
+
"budgets",
|
|
163
|
+
"attestation",
|
|
164
|
+
"provenance",
|
|
165
|
+
"state",
|
|
166
|
+
"requested_ts",
|
|
167
|
+
"waiting",
|
|
168
|
+
"ttl_remaining_ms",
|
|
169
|
+
"payload_hash",
|
|
170
|
+
"chain",
|
|
171
|
+
"token_delivery",
|
|
172
|
+
"gloss",
|
|
173
|
+
"summary",
|
|
174
|
+
"est_cost_usd",
|
|
175
|
+
"rationale",
|
|
176
|
+
"confidence",
|
|
177
|
+
], {
|
|
178
|
+
class: "always",
|
|
179
|
+
command_breakdown: "always",
|
|
180
|
+
protected_path: "always",
|
|
181
|
+
policy_diff: "always",
|
|
182
|
+
policy_load: "always",
|
|
183
|
+
autonomy: "abnormal",
|
|
184
|
+
budgets: "abnormal",
|
|
185
|
+
attestation: "abnormal",
|
|
186
|
+
waiting: "always",
|
|
187
|
+
gloss: "always",
|
|
188
|
+
summary: "always",
|
|
189
|
+
est_cost_usd: "always",
|
|
190
|
+
rationale: "always",
|
|
191
|
+
confidence: "always",
|
|
192
|
+
});
|
|
193
|
+
/**
|
|
194
|
+
* The order the terminal and the page have used since APRV-23: computed
|
|
195
|
+
* identity and authority first, claimed persuasion last, so a reader who stops
|
|
196
|
+
* halfway has read the runtime's answer and not the agent's pitch.
|
|
197
|
+
*
|
|
198
|
+
* `token_delivery` sits at the end because that is where it lands today —
|
|
199
|
+
* neither channel's `FIELD_ORDER` named it, and both append a member they do
|
|
200
|
+
* not list. Naming it here makes it reachable by `hide` and `rows` without
|
|
201
|
+
* moving it.
|
|
202
|
+
*/
|
|
203
|
+
const FULL_ROW_ORDER = [
|
|
204
|
+
"action_key",
|
|
205
|
+
"task",
|
|
206
|
+
"class",
|
|
207
|
+
"command_breakdown",
|
|
208
|
+
"protected_path",
|
|
209
|
+
"policy_diff",
|
|
210
|
+
"policy_load",
|
|
211
|
+
"autonomy",
|
|
212
|
+
"provenance",
|
|
213
|
+
"state",
|
|
214
|
+
"requested_ts",
|
|
215
|
+
"waiting",
|
|
216
|
+
"ttl_remaining_ms",
|
|
217
|
+
"payload_hash",
|
|
218
|
+
"attestation",
|
|
219
|
+
"budgets",
|
|
220
|
+
"chain",
|
|
221
|
+
"est_cost_usd",
|
|
222
|
+
"gloss",
|
|
223
|
+
"summary",
|
|
224
|
+
"rationale",
|
|
225
|
+
"confidence",
|
|
226
|
+
"token_delivery",
|
|
227
|
+
];
|
|
228
|
+
const ALL_ALWAYS = Object.fromEntries(PROMPT_ROWS.map((row) => [row, "always"]));
|
|
229
|
+
/**
|
|
230
|
+
* The CLI channel's default layout: every row the request carries.
|
|
231
|
+
*
|
|
232
|
+
* A terminal has room, and a one-shot rendering an operator asked for by typing
|
|
233
|
+
* a verb is not the place to economise on lines the way a push notification is.
|
|
234
|
+
*/
|
|
235
|
+
export const CLI_PROMPT_LAYOUT = layoutOf(FULL_ROW_ORDER, ALL_ALWAYS);
|
|
236
|
+
/** The web channel's default layout. Same reasoning as the CLI's: a page scrolls. */
|
|
237
|
+
export const WEB_PROMPT_LAYOUT = layoutOf(FULL_ROW_ORDER, ALL_ALWAYS);
|
|
238
|
+
/** Default layout per shipped channel. What an absent `prompt` block means. */
|
|
239
|
+
export const DEFAULT_PROMPT_LAYOUTS = {
|
|
240
|
+
cli: CLI_PROMPT_LAYOUT,
|
|
241
|
+
web: WEB_PROMPT_LAYOUT,
|
|
242
|
+
telegram: TELEGRAM_PROMPT_LAYOUT,
|
|
243
|
+
};
|
|
244
|
+
/**
|
|
245
|
+
* The layout in force for `channel`.
|
|
246
|
+
*
|
|
247
|
+
* Fail-soft in the same direction as `telegramDeliveryFor`: a policy that did
|
|
248
|
+
* not load declares nothing, an absent block declares nothing, and a layout is
|
|
249
|
+
* not a permission. Anything structurally wrong that reaches here (a hand-built
|
|
250
|
+
* load result, a key from a later version) falls back to the default rather
|
|
251
|
+
* than being guessed at — a LOADED policy cannot carry such a block, because
|
|
252
|
+
* {@link promptBlockErrors} refuses it at load.
|
|
253
|
+
*/
|
|
254
|
+
export function promptLayoutFor(load, channel) {
|
|
255
|
+
const base = DEFAULT_PROMPT_LAYOUTS[channel] ?? CLI_PROMPT_LAYOUT;
|
|
256
|
+
if (!load.ok)
|
|
257
|
+
return base;
|
|
258
|
+
const block = readBlock(load.policy.channels?.[channel]);
|
|
259
|
+
if (block === null)
|
|
260
|
+
return base;
|
|
261
|
+
return applyPromptBlock(base, block);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Apply a block to a layout. Pure, total, and exported so a caller holding a
|
|
265
|
+
* block already can resolve it without going back through a policy file, which
|
|
266
|
+
* is what the tests do and what a future `approval policy explain` of a channel
|
|
267
|
+
* would need. Nothing outside the tests calls it today, and that is fine: the
|
|
268
|
+
* split keeps {@link promptLayoutFor} to one job, reading the block.
|
|
269
|
+
*/
|
|
270
|
+
export function applyPromptBlock(base, block) {
|
|
271
|
+
const named = (block.rows ?? []).filter(isPromptRow);
|
|
272
|
+
const order = [];
|
|
273
|
+
for (const row of named)
|
|
274
|
+
if (!order.includes(row))
|
|
275
|
+
order.push(row);
|
|
276
|
+
for (const row of base.order)
|
|
277
|
+
if (!order.includes(row))
|
|
278
|
+
order.push(row);
|
|
279
|
+
const visibility = { ...base.visibility };
|
|
280
|
+
for (const row of block.always ?? [])
|
|
281
|
+
if (isPromptRow(row))
|
|
282
|
+
visibility[row] = "always";
|
|
283
|
+
for (const row of block.hide ?? [])
|
|
284
|
+
if (isPromptRow(row))
|
|
285
|
+
visibility[row] = "off";
|
|
286
|
+
return { order, visibility };
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* The `prompt` block under one channel entry, or `null` when there is none.
|
|
290
|
+
*
|
|
291
|
+
* Structural only. Every semantic check lives in {@link promptBlockErrors} and
|
|
292
|
+
* has already run at load, so a block reaching here from a loaded policy is
|
|
293
|
+
* known-good; this function's `null` returns are for the hand-built and
|
|
294
|
+
* future-version cases the fail-soft rule above covers.
|
|
295
|
+
*/
|
|
296
|
+
function readBlock(entry) {
|
|
297
|
+
if (entry === null || typeof entry !== "object")
|
|
298
|
+
return null;
|
|
299
|
+
const raw = entry["prompt"];
|
|
300
|
+
if (raw === null || raw === undefined || typeof raw !== "object" || Array.isArray(raw))
|
|
301
|
+
return null;
|
|
302
|
+
const block = raw;
|
|
303
|
+
const list = (key) => {
|
|
304
|
+
const value = block[key];
|
|
305
|
+
if (!Array.isArray(value))
|
|
306
|
+
return undefined;
|
|
307
|
+
return value.filter(isPromptRow);
|
|
308
|
+
};
|
|
309
|
+
const rows = list("rows");
|
|
310
|
+
const always = list("always");
|
|
311
|
+
const hide = list("hide");
|
|
312
|
+
return {
|
|
313
|
+
...(rows === undefined ? {} : { rows }),
|
|
314
|
+
...(always === undefined ? {} : { always }),
|
|
315
|
+
...(hide === undefined ? {} : { hide }),
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
/** The machine-readable reasons a `prompt` block refuses (APRV-218). */
|
|
319
|
+
export const PROMPT_BLOCK_ERROR_KEYWORDS = [
|
|
320
|
+
/** A row name this runtime cannot place. */
|
|
321
|
+
"prompt-row-unknown",
|
|
322
|
+
/** {@link REQUIRED_PROMPT_ROWS} named in `hide`. */
|
|
323
|
+
"prompt-row-required",
|
|
324
|
+
/** `rows`, `always` or `hide` is not an array of strings. */
|
|
325
|
+
"prompt-block-shape",
|
|
326
|
+
/** One row named by both `always` and `hide`. */
|
|
327
|
+
"prompt-row-conflict",
|
|
328
|
+
/** A key the `prompt` block does not define. */
|
|
329
|
+
"prompt-key-unknown",
|
|
330
|
+
];
|
|
331
|
+
const PROMPT_BLOCK_KEYS = ["rows", "always", "hide"];
|
|
332
|
+
/**
|
|
333
|
+
* Validate every `channels.<name>.prompt` in a policy. Empty means clean.
|
|
334
|
+
*
|
|
335
|
+
* This runs on top of the JSON Schema rather than instead of it, and the
|
|
336
|
+
* duplication is deliberate. The schema types the three channels this runtime
|
|
337
|
+
* ships and closes the row enum there, which is where SPEC.md §8's
|
|
338
|
+
* validate-at-the-write-boundary rule wants it; but `channels` admits UNKNOWN
|
|
339
|
+
* channel names as free-form objects on purpose, so a third-party transport
|
|
340
|
+
* plugin does not invalidate a whole policy, and a `prompt` block written under
|
|
341
|
+
* such a name would otherwise reach a renderer unchecked. Both nets return the
|
|
342
|
+
* same verdict — the policy does not load, everything is `manual` — so an
|
|
343
|
+
* operator never has to know which one caught them.
|
|
344
|
+
*/
|
|
345
|
+
export function promptBlockErrors(policy) {
|
|
346
|
+
const errors = [];
|
|
347
|
+
const channels = policy.channels;
|
|
348
|
+
if (channels === undefined || channels === null || typeof channels !== "object")
|
|
349
|
+
return errors;
|
|
350
|
+
for (const channel of Object.keys(channels).sort()) {
|
|
351
|
+
const entry = channels[channel];
|
|
352
|
+
if (entry === null || typeof entry !== "object" || Array.isArray(entry))
|
|
353
|
+
continue;
|
|
354
|
+
const raw = entry["prompt"];
|
|
355
|
+
if (raw === undefined)
|
|
356
|
+
continue;
|
|
357
|
+
const at = `/channels/${channel}/prompt`;
|
|
358
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
|
|
359
|
+
errors.push({
|
|
360
|
+
path: at,
|
|
361
|
+
keyword: "prompt-block-shape",
|
|
362
|
+
message: "expected an object with any of `rows`, `always`, `hide`",
|
|
363
|
+
});
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
366
|
+
const block = raw;
|
|
367
|
+
for (const key of Object.keys(block).sort()) {
|
|
368
|
+
if (!PROMPT_BLOCK_KEYS.includes(key)) {
|
|
369
|
+
errors.push({
|
|
370
|
+
path: `${at}/${key}`,
|
|
371
|
+
keyword: "prompt-key-unknown",
|
|
372
|
+
message: `unknown key; the prompt block defines ${PROMPT_BLOCK_KEYS.join(", ")}`,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
const seen = {};
|
|
377
|
+
for (const key of PROMPT_BLOCK_KEYS) {
|
|
378
|
+
const value = block[key];
|
|
379
|
+
if (value === undefined)
|
|
380
|
+
continue;
|
|
381
|
+
if (!Array.isArray(value)) {
|
|
382
|
+
errors.push({
|
|
383
|
+
path: `${at}/${key}`,
|
|
384
|
+
keyword: "prompt-block-shape",
|
|
385
|
+
message: "expected an array of row names",
|
|
386
|
+
});
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
const names = new Set();
|
|
390
|
+
value.forEach((row, index) => {
|
|
391
|
+
if (!isPromptRow(row)) {
|
|
392
|
+
errors.push({
|
|
393
|
+
path: `${at}/${key}/${String(index)}`,
|
|
394
|
+
keyword: "prompt-row-unknown",
|
|
395
|
+
message: `unknown row name ${JSON.stringify(row)}; known rows are ${PROMPT_ROWS.join(", ")}`,
|
|
396
|
+
});
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
names.add(row);
|
|
400
|
+
if (key === "hide" && REQUIRED_PROMPT_ROWS.includes(row)) {
|
|
401
|
+
errors.push({
|
|
402
|
+
path: `${at}/${key}/${String(index)}`,
|
|
403
|
+
keyword: "prompt-row-required",
|
|
404
|
+
message: `row ${JSON.stringify(row)} is required for a decision and may be reordered but not hidden; required rows are ${REQUIRED_PROMPT_ROWS.join(", ")}`,
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
seen[key] = names;
|
|
409
|
+
}
|
|
410
|
+
for (const row of seen["always"] ?? new Set()) {
|
|
411
|
+
if (seen["hide"]?.has(row) === true) {
|
|
412
|
+
errors.push({
|
|
413
|
+
path: `${at}/hide`,
|
|
414
|
+
keyword: "prompt-row-conflict",
|
|
415
|
+
message: `row ${JSON.stringify(row)} is named by both \`always\` and \`hide\`; say one of them`,
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
return errors;
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=prompt-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-layout.js","sourceRoot":"","sources":["../../../src/core/prompt-layout.ts"],"names":[],"mappings":"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"}
|