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,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval payload …` — the bytes an approval binds to (SPEC.md §6.2;
|
|
3
|
+
* APRV-29, APRV-223).
|
|
4
|
+
*
|
|
5
|
+
* Two subcommands, and one argument between them: a grant is over CONTENT.
|
|
6
|
+
* `hash` prints the binding for bytes a caller already holds;
|
|
7
|
+
* `agentmail-draft` produces the bytes for material only the provider holds,
|
|
8
|
+
* by snapshotting one AgentMail draft as the payload the adapter will re-read
|
|
9
|
+
* it against. Neither reads the log, writes a file, or spends anything.
|
|
10
|
+
*
|
|
11
|
+
* ## `payload hash <file|->` — print the content binding for a payload
|
|
12
|
+
*
|
|
13
|
+
* The hash was already the whole mechanism of content binding, and until now the
|
|
14
|
+
* only way to obtain one outside the runtime was to import `core/payload.js` by
|
|
15
|
+
* hand. That is a bad instruction to publish: it puts an internal module path in
|
|
16
|
+
* a demo, it drifts the moment the build layout changes, and — worse — it invites
|
|
17
|
+
* an operator to reimplement "SHA-256 of the JSON" with `JSON.stringify`, which
|
|
18
|
+
* agrees with the runtime right up until a key order changes and then binds to
|
|
19
|
+
* bytes the gate will refuse. One verb, calling the same {@link payloadHash} the
|
|
20
|
+
* gate calls, removes the invitation.
|
|
21
|
+
*
|
|
22
|
+
* **No logic lives here either.** The hash is `core/payload.ts`; this file reads
|
|
23
|
+
* bytes at the edge, parses them, and maps the outcome onto the frozen exit
|
|
24
|
+
* table.
|
|
25
|
+
*
|
|
26
|
+
* ## Why the input must parse
|
|
27
|
+
*
|
|
28
|
+
* §6.2 defines `payload_hash` over the RFC 8785 canonical serialization of the
|
|
29
|
+
* *value*, not over the bytes a file happens to hold. Non-JSON input therefore
|
|
30
|
+
* has no defined hash at all: hashing the raw bytes would produce a plausible
|
|
31
|
+
* 64-hex string that no gate, adapter or second implementation would ever
|
|
32
|
+
* reproduce. So a parse failure is a usage error (exit 2) that says why, and
|
|
33
|
+
* nothing is printed on stdout.
|
|
34
|
+
*
|
|
35
|
+
* ## This verb is the fallback, not the main road
|
|
36
|
+
*
|
|
37
|
+
* `approval request --payload <file>` both stores the bytes in
|
|
38
|
+
* `.approval/payloads/` (APRV-28) and verifies their hash against the declared
|
|
39
|
+
* binding, so a flow that uses it never hashes anything by hand. This verb is for
|
|
40
|
+
* the step *before* that: writing the `payload_hash` into the task file in the
|
|
41
|
+
* first place, and for adapters that must present a binding for material the
|
|
42
|
+
* runtime is not holding.
|
|
43
|
+
*
|
|
44
|
+
* Reads no log, writes no file, appends nothing.
|
|
45
|
+
*/
|
|
46
|
+
import { type AgentmailFetch } from "../adapters/agentmail.js";
|
|
47
|
+
import type { Streams } from "./main.js";
|
|
48
|
+
/** The agent's own AgentMail key. Read here and in no other verb. */
|
|
49
|
+
export declare const AGENTMAIL_API_KEY_ENV = "AGENTMAIL_API_KEY";
|
|
50
|
+
/** The API root override, for a deployment that fronts AgentMail. */
|
|
51
|
+
export declare const AGENTMAIL_API_BASE_ENV = "AGENTMAIL_API_BASE";
|
|
52
|
+
/** Test seam: the environment and the transport, both `undefined` in production. */
|
|
53
|
+
export interface AgentmailDraftDeps {
|
|
54
|
+
env?: NodeJS.ProcessEnv;
|
|
55
|
+
fetch?: AgentmailFetch;
|
|
56
|
+
}
|
|
57
|
+
/** `approval payload …` — dispatch to a subcommand, or print the help. */
|
|
58
|
+
export declare function commandPayload(argv: string[], streams: Streams, cwd: string, deps?: AgentmailDraftDeps): number | Promise<number>;
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval payload …` — the bytes an approval binds to (SPEC.md §6.2;
|
|
3
|
+
* APRV-29, APRV-223).
|
|
4
|
+
*
|
|
5
|
+
* Two subcommands, and one argument between them: a grant is over CONTENT.
|
|
6
|
+
* `hash` prints the binding for bytes a caller already holds;
|
|
7
|
+
* `agentmail-draft` produces the bytes for material only the provider holds,
|
|
8
|
+
* by snapshotting one AgentMail draft as the payload the adapter will re-read
|
|
9
|
+
* it against. Neither reads the log, writes a file, or spends anything.
|
|
10
|
+
*
|
|
11
|
+
* ## `payload hash <file|->` — print the content binding for a payload
|
|
12
|
+
*
|
|
13
|
+
* The hash was already the whole mechanism of content binding, and until now the
|
|
14
|
+
* only way to obtain one outside the runtime was to import `core/payload.js` by
|
|
15
|
+
* hand. That is a bad instruction to publish: it puts an internal module path in
|
|
16
|
+
* a demo, it drifts the moment the build layout changes, and — worse — it invites
|
|
17
|
+
* an operator to reimplement "SHA-256 of the JSON" with `JSON.stringify`, which
|
|
18
|
+
* agrees with the runtime right up until a key order changes and then binds to
|
|
19
|
+
* bytes the gate will refuse. One verb, calling the same {@link payloadHash} the
|
|
20
|
+
* gate calls, removes the invitation.
|
|
21
|
+
*
|
|
22
|
+
* **No logic lives here either.** The hash is `core/payload.ts`; this file reads
|
|
23
|
+
* bytes at the edge, parses them, and maps the outcome onto the frozen exit
|
|
24
|
+
* table.
|
|
25
|
+
*
|
|
26
|
+
* ## Why the input must parse
|
|
27
|
+
*
|
|
28
|
+
* §6.2 defines `payload_hash` over the RFC 8785 canonical serialization of the
|
|
29
|
+
* *value*, not over the bytes a file happens to hold. Non-JSON input therefore
|
|
30
|
+
* has no defined hash at all: hashing the raw bytes would produce a plausible
|
|
31
|
+
* 64-hex string that no gate, adapter or second implementation would ever
|
|
32
|
+
* reproduce. So a parse failure is a usage error (exit 2) that says why, and
|
|
33
|
+
* nothing is printed on stdout.
|
|
34
|
+
*
|
|
35
|
+
* ## This verb is the fallback, not the main road
|
|
36
|
+
*
|
|
37
|
+
* `approval request --payload <file>` both stores the bytes in
|
|
38
|
+
* `.approval/payloads/` (APRV-28) and verifies their hash against the declared
|
|
39
|
+
* binding, so a flow that uses it never hashes anything by hand. This verb is for
|
|
40
|
+
* the step *before* that: writing the `payload_hash` into the task file in the
|
|
41
|
+
* first place, and for adapters that must present a binding for material the
|
|
42
|
+
* runtime is not holding.
|
|
43
|
+
*
|
|
44
|
+
* Reads no log, writes no file, appends nothing.
|
|
45
|
+
*/
|
|
46
|
+
import { readFileSync } from "node:fs";
|
|
47
|
+
import { isAbsolute, resolve as resolvePathSegments } from "node:path";
|
|
48
|
+
import { draftSnapshot, readAgentmailDraft, } from "../adapters/agentmail.js";
|
|
49
|
+
import { canonicalize } from "../core/jcs.js";
|
|
50
|
+
import { payloadHash } from "../core/payload.js";
|
|
51
|
+
import { boolFlag, parseFlags, stringFlag } from "./args.js";
|
|
52
|
+
import { EXIT_INTEGRITY, EXIT_IO, EXIT_OK, EXIT_USAGE } from "./exit-codes.js";
|
|
53
|
+
import { PAYLOAD_AGENTMAIL_DRAFT_HELP, PAYLOAD_HASH_HELP, PAYLOAD_HELP, } from "./help.js";
|
|
54
|
+
import { usageErrorText } from "./usage.js";
|
|
55
|
+
const HASH_FLAGS = {
|
|
56
|
+
"--json": "boolean",
|
|
57
|
+
"--help": "boolean",
|
|
58
|
+
"-h": "boolean",
|
|
59
|
+
};
|
|
60
|
+
function wantsJson(argv) {
|
|
61
|
+
return argv.includes("--json");
|
|
62
|
+
}
|
|
63
|
+
function usageError(streams, json, message, helpText) {
|
|
64
|
+
if (json)
|
|
65
|
+
streams.err(`${JSON.stringify({ error: { code: "usage", message } })}\n`);
|
|
66
|
+
else
|
|
67
|
+
streams.err(usageErrorText(message, helpText));
|
|
68
|
+
return EXIT_USAGE;
|
|
69
|
+
}
|
|
70
|
+
function ioError(streams, json, message) {
|
|
71
|
+
if (json)
|
|
72
|
+
streams.err(`${JSON.stringify({ error: { code: "io", message } })}\n`);
|
|
73
|
+
else
|
|
74
|
+
streams.err(`approval: ${message}\n`);
|
|
75
|
+
return EXIT_IO;
|
|
76
|
+
}
|
|
77
|
+
function detail(cause) {
|
|
78
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
79
|
+
}
|
|
80
|
+
function absolute(value, cwd) {
|
|
81
|
+
return isAbsolute(value) ? value : resolvePathSegments(cwd, value);
|
|
82
|
+
}
|
|
83
|
+
/** `approval payload hash <file|->`. */
|
|
84
|
+
function commandPayloadHash(argv, streams, cwd) {
|
|
85
|
+
const json = wantsJson(argv);
|
|
86
|
+
const parsed = parseFlags(argv, HASH_FLAGS);
|
|
87
|
+
if (!parsed.ok)
|
|
88
|
+
return usageError(streams, json, parsed.message, PAYLOAD_HASH_HELP);
|
|
89
|
+
if (boolFlag(parsed.flags, "--help") || boolFlag(parsed.flags, "-h")) {
|
|
90
|
+
streams.out(`${PAYLOAD_HASH_HELP}\n`);
|
|
91
|
+
return EXIT_OK;
|
|
92
|
+
}
|
|
93
|
+
const source = parsed.positionals[0];
|
|
94
|
+
if (source === undefined) {
|
|
95
|
+
return usageError(streams, json, "missing <file> argument (use - to read the payload from stdin)", PAYLOAD_HASH_HELP);
|
|
96
|
+
}
|
|
97
|
+
const extra = parsed.positionals[1];
|
|
98
|
+
if (extra !== undefined) {
|
|
99
|
+
return usageError(streams, json, `unexpected argument ${JSON.stringify(extra)}`, PAYLOAD_HASH_HELP);
|
|
100
|
+
}
|
|
101
|
+
const where = source === "-" ? "stdin" : absolute(source, cwd);
|
|
102
|
+
let raw;
|
|
103
|
+
try {
|
|
104
|
+
raw = readFileSync(source === "-" ? 0 : where, "utf8");
|
|
105
|
+
}
|
|
106
|
+
catch (cause) {
|
|
107
|
+
return ioError(streams, json, `${where} could not be read: ${detail(cause)}`);
|
|
108
|
+
}
|
|
109
|
+
// Empty input is a usage error, not an I/O one: the read succeeded and there
|
|
110
|
+
// is simply no payload. Hashing "" would be hashing the absence of a payload.
|
|
111
|
+
if (raw.trim().length === 0) {
|
|
112
|
+
return usageError(streams, json, `${where} is empty; there is no payload to hash`, PAYLOAD_HASH_HELP);
|
|
113
|
+
}
|
|
114
|
+
let value;
|
|
115
|
+
try {
|
|
116
|
+
value = JSON.parse(raw);
|
|
117
|
+
}
|
|
118
|
+
catch (cause) {
|
|
119
|
+
return usageError(streams, json, `${where} is not valid JSON: ${detail(cause)}. payload_hash is defined over the RFC 8785 canonical serialization of the payload VALUE, so bytes that do not parse have no defined hash and none was printed`, PAYLOAD_HASH_HELP);
|
|
120
|
+
}
|
|
121
|
+
let hash;
|
|
122
|
+
try {
|
|
123
|
+
hash = payloadHash(value);
|
|
124
|
+
}
|
|
125
|
+
catch (cause) {
|
|
126
|
+
return usageError(streams, json, `${where} could not be canonicalized: ${detail(cause)}. A payload that RFC 8785 cannot serialize cannot be bound to`, PAYLOAD_HASH_HELP);
|
|
127
|
+
}
|
|
128
|
+
if (json)
|
|
129
|
+
streams.out(`${JSON.stringify({ ok: true, hash })}\n`);
|
|
130
|
+
else
|
|
131
|
+
streams.out(`${hash}\n`);
|
|
132
|
+
return EXIT_OK;
|
|
133
|
+
}
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// `payload agentmail-draft` (APRV-223)
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
/** The agent's own AgentMail key. Read here and in no other verb. */
|
|
138
|
+
export const AGENTMAIL_API_KEY_ENV = "AGENTMAIL_API_KEY";
|
|
139
|
+
/** The API root override, for a deployment that fronts AgentMail. */
|
|
140
|
+
export const AGENTMAIL_API_BASE_ENV = "AGENTMAIL_API_BASE";
|
|
141
|
+
const AGENTMAIL_DRAFT_FLAGS = {
|
|
142
|
+
"--api-base": "string",
|
|
143
|
+
"--timeout": "string",
|
|
144
|
+
"--json": "boolean",
|
|
145
|
+
"--help": "boolean",
|
|
146
|
+
"-h": "boolean",
|
|
147
|
+
};
|
|
148
|
+
/** A refusal with a code of its own: exit 1, and a shape an agent can branch on. */
|
|
149
|
+
function refusal(streams, json, code, message) {
|
|
150
|
+
if (json)
|
|
151
|
+
streams.err(`${JSON.stringify({ error: { code, message } })}\n`);
|
|
152
|
+
else
|
|
153
|
+
streams.err(`approval: ${code}: ${message}\n`);
|
|
154
|
+
return EXIT_INTEGRITY;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* `approval payload agentmail-draft <inbox-id> <draft-id>`.
|
|
158
|
+
*
|
|
159
|
+
* The step BEFORE an approval exists: the agent has composed a draft, and what a
|
|
160
|
+
* human should be asked about is the words in it, not the id of a mutable
|
|
161
|
+
* server-side object. This verb reads the draft with the AGENT's key and prints
|
|
162
|
+
* the canonical payload `approval adapter agentmail` will re-read that draft
|
|
163
|
+
* against, so a draft edited between the request and the grant is refused
|
|
164
|
+
* `agentmail-draft-drifted` rather than sent.
|
|
165
|
+
*
|
|
166
|
+
* **It is the one verb in this CLI that reads `AGENTMAIL_API_KEY`**, and that is
|
|
167
|
+
* deliberate: the agent's key composes and cannot send, the vault's key sends
|
|
168
|
+
* and answers only to a grant, and nothing here touches the vault. It appends
|
|
169
|
+
* nothing, spends no token, and puts no message anywhere.
|
|
170
|
+
*/
|
|
171
|
+
async function commandPayloadAgentmailDraft(argv, streams, deps = {}) {
|
|
172
|
+
const json = wantsJson(argv);
|
|
173
|
+
const parsed = parseFlags(argv, AGENTMAIL_DRAFT_FLAGS);
|
|
174
|
+
if (!parsed.ok)
|
|
175
|
+
return usageError(streams, json, parsed.message, PAYLOAD_AGENTMAIL_DRAFT_HELP);
|
|
176
|
+
if (boolFlag(parsed.flags, "--help") || boolFlag(parsed.flags, "-h")) {
|
|
177
|
+
streams.out(`${PAYLOAD_AGENTMAIL_DRAFT_HELP}\n`);
|
|
178
|
+
return EXIT_OK;
|
|
179
|
+
}
|
|
180
|
+
const inboxId = parsed.positionals[0];
|
|
181
|
+
const draftId = parsed.positionals[1];
|
|
182
|
+
if (inboxId === undefined || draftId === undefined) {
|
|
183
|
+
return usageError(streams, json, "missing <inbox-id> <draft-id> arguments", PAYLOAD_AGENTMAIL_DRAFT_HELP);
|
|
184
|
+
}
|
|
185
|
+
const extra = parsed.positionals[2];
|
|
186
|
+
if (extra !== undefined) {
|
|
187
|
+
return usageError(streams, json, `unexpected argument ${JSON.stringify(extra)}`, PAYLOAD_AGENTMAIL_DRAFT_HELP);
|
|
188
|
+
}
|
|
189
|
+
const timeoutFlag = stringFlag(parsed.flags, "--timeout");
|
|
190
|
+
let timeoutMs = null;
|
|
191
|
+
if (timeoutFlag !== null) {
|
|
192
|
+
const value = Number(timeoutFlag);
|
|
193
|
+
if (!Number.isInteger(value) || value <= 0) {
|
|
194
|
+
return usageError(streams, json, `--timeout expects a whole number of milliseconds, got ${JSON.stringify(timeoutFlag)}`, PAYLOAD_AGENTMAIL_DRAFT_HELP);
|
|
195
|
+
}
|
|
196
|
+
timeoutMs = value;
|
|
197
|
+
}
|
|
198
|
+
const env = deps.env ?? process.env;
|
|
199
|
+
const apiKey = (env[AGENTMAIL_API_KEY_ENV] ?? "").trim();
|
|
200
|
+
if (apiKey.length === 0) {
|
|
201
|
+
// A usage error and not a refusal: the command is unrunnable as written,
|
|
202
|
+
// and the repair is in the caller's environment. The CODE is what an agent
|
|
203
|
+
// branches on, so it is the adapter's vocabulary and not the word "usage".
|
|
204
|
+
const message = `${AGENTMAIL_API_KEY_ENV} is unset or empty: this verb reads the AGENT's AgentMail key from that variable and from nowhere else. It never reads the vault, whose key is the one that can send`;
|
|
205
|
+
if (json) {
|
|
206
|
+
streams.err(`${JSON.stringify({ error: { code: "agentmail-api-key-unset", message } })}\n`);
|
|
207
|
+
return EXIT_USAGE;
|
|
208
|
+
}
|
|
209
|
+
return usageError(streams, json, message, PAYLOAD_AGENTMAIL_DRAFT_HELP);
|
|
210
|
+
}
|
|
211
|
+
const apiBase = stringFlag(parsed.flags, "--api-base") ?? env[AGENTMAIL_API_BASE_ENV] ?? null;
|
|
212
|
+
const read = await readAgentmailDraft({
|
|
213
|
+
apiKey,
|
|
214
|
+
inboxId,
|
|
215
|
+
draftId,
|
|
216
|
+
...(deps.fetch === undefined ? {} : { fetch: deps.fetch }),
|
|
217
|
+
...(apiBase === null ? {} : { apiBase }),
|
|
218
|
+
...(timeoutMs === null ? {} : { timeoutMs }),
|
|
219
|
+
});
|
|
220
|
+
if (!read.ok)
|
|
221
|
+
return refusal(streams, json, read.code, read.message);
|
|
222
|
+
const snapshot = draftSnapshot(inboxId, draftId, read.draft);
|
|
223
|
+
if (!snapshot.ok) {
|
|
224
|
+
return refusal(streams, json, "agentmail-draft-unusable", snapshot.message);
|
|
225
|
+
}
|
|
226
|
+
// The canonical serialization itself, because the hash is defined over it and
|
|
227
|
+
// a re-serialization by any other printer is a second answer about what these
|
|
228
|
+
// bytes are. `--json` prints the same bytes: there is no envelope to add,
|
|
229
|
+
// since the payload IS the machine-readable result.
|
|
230
|
+
streams.out(`${canonicalize(snapshot.payload)}\n`);
|
|
231
|
+
return EXIT_OK;
|
|
232
|
+
}
|
|
233
|
+
/** `approval payload …` — dispatch to a subcommand, or print the help. */
|
|
234
|
+
export function commandPayload(argv, streams, cwd, deps = {}) {
|
|
235
|
+
const sub = argv[0];
|
|
236
|
+
const rest = argv.slice(1);
|
|
237
|
+
if (sub === undefined) {
|
|
238
|
+
return usageError(streams, wantsJson(argv), "missing subcommand for `approval payload`", PAYLOAD_HELP);
|
|
239
|
+
}
|
|
240
|
+
if (sub === "--help" || sub === "-h" || sub === "help") {
|
|
241
|
+
streams.out(`${PAYLOAD_HELP}\n`);
|
|
242
|
+
return EXIT_OK;
|
|
243
|
+
}
|
|
244
|
+
switch (sub) {
|
|
245
|
+
case "hash":
|
|
246
|
+
return commandPayloadHash(rest, streams, cwd);
|
|
247
|
+
case "agentmail-draft":
|
|
248
|
+
return commandPayloadAgentmailDraft(rest, streams, deps);
|
|
249
|
+
default:
|
|
250
|
+
return usageError(streams, wantsJson(argv), `unknown subcommand ${JSON.stringify(sub)} for \`approval payload\``, PAYLOAD_HELP);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=payload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload.js","sourceRoot":"","sources":["../../../src/cli/payload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval policy check|test <class>` (SPEC.md §10.1) — print the decision
|
|
3
|
+
* trace for a hypothetical action class.
|
|
4
|
+
*
|
|
5
|
+
* As everywhere else in the CLI, this file holds no policy logic: loading lives
|
|
6
|
+
* in `core/policy-load.ts`, matching in `core/policy-match.ts`, and the trace in
|
|
7
|
+
* `core/policy-explain.ts`. What is decided *here* is the exit code, and one
|
|
8
|
+
* choice in that mapping is load-bearing enough to state plainly.
|
|
9
|
+
*
|
|
10
|
+
* ## A broken policy is an answer, not an error (exit 0)
|
|
11
|
+
*
|
|
12
|
+
* The question this command answers is "what would policy do with this class".
|
|
13
|
+
* When `APPROVAL.md` is missing, unparseable, or schema-invalid, that question
|
|
14
|
+
* still has a complete and correct answer: **manual, everything, because the
|
|
15
|
+
* policy failed to load**. Reporting that as a non-zero exit would push every
|
|
16
|
+
* caller into treating a fail-closed answer as "no answer", and the predictable
|
|
17
|
+
* repair is a caller that retries, falls back, or skips the check — i.e. that
|
|
18
|
+
* routes around the safest possible outcome because the exit code called it a
|
|
19
|
+
* failure. So the fail-closed answer exits 0 like any other, carrying
|
|
20
|
+
* `provenance: "fail-closed"` and `manualBecause: "load-failure"` for callers
|
|
21
|
+
* that need to distinguish a deliberate manual from a broken file. Agents must
|
|
22
|
+
* branch on those fields, never on the exit code.
|
|
23
|
+
*
|
|
24
|
+
* Exit 4 is reserved for its usual meaning: a path that exists and cannot be
|
|
25
|
+
* read. That is a fact about the filesystem, not about the policy, and — as in
|
|
26
|
+
* `paths.ts` — its messages never use the word "corrupt".
|
|
27
|
+
*/
|
|
28
|
+
import { type Explanation } from "../core/policy-explain.js";
|
|
29
|
+
import type { Streams } from "./main.js";
|
|
30
|
+
import { type Style } from "./style.js";
|
|
31
|
+
/**
|
|
32
|
+
* The decision trace, dressed (APRV-93 #2).
|
|
33
|
+
*
|
|
34
|
+
* The trace lines themselves are the SAME STRINGS `--json` publishes in
|
|
35
|
+
* `decisionPath`, which is a frozen shape, so nothing here rewrites one — the
|
|
36
|
+
* only edit is `relPath` on the discovery line, because "the same 70-character
|
|
37
|
+
* absolute path" was half of the original complaint and the human reader has a
|
|
38
|
+
* cwd to resolve against. The trace is `muted` and the answer is not: an
|
|
39
|
+
* operator wants the verdict first and the reasoning when they ask for it.
|
|
40
|
+
*/
|
|
41
|
+
export declare function renderExplainHuman(explanation: Explanation, cwd: string, st?: Style): string;
|
|
42
|
+
/** `approval policy …` — dispatch to `check` / `test`, or print the help. */
|
|
43
|
+
export declare function commandPolicy(argv: string[], streams: Streams, cwd: string): number;
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval policy check|test <class>` (SPEC.md §10.1) — print the decision
|
|
3
|
+
* trace for a hypothetical action class.
|
|
4
|
+
*
|
|
5
|
+
* As everywhere else in the CLI, this file holds no policy logic: loading lives
|
|
6
|
+
* in `core/policy-load.ts`, matching in `core/policy-match.ts`, and the trace in
|
|
7
|
+
* `core/policy-explain.ts`. What is decided *here* is the exit code, and one
|
|
8
|
+
* choice in that mapping is load-bearing enough to state plainly.
|
|
9
|
+
*
|
|
10
|
+
* ## A broken policy is an answer, not an error (exit 0)
|
|
11
|
+
*
|
|
12
|
+
* The question this command answers is "what would policy do with this class".
|
|
13
|
+
* When `APPROVAL.md` is missing, unparseable, or schema-invalid, that question
|
|
14
|
+
* still has a complete and correct answer: **manual, everything, because the
|
|
15
|
+
* policy failed to load**. Reporting that as a non-zero exit would push every
|
|
16
|
+
* caller into treating a fail-closed answer as "no answer", and the predictable
|
|
17
|
+
* repair is a caller that retries, falls back, or skips the check — i.e. that
|
|
18
|
+
* routes around the safest possible outcome because the exit code called it a
|
|
19
|
+
* failure. So the fail-closed answer exits 0 like any other, carrying
|
|
20
|
+
* `provenance: "fail-closed"` and `manualBecause: "load-failure"` for callers
|
|
21
|
+
* that need to distinguish a deliberate manual from a broken file. Agents must
|
|
22
|
+
* branch on those fields, never on the exit code.
|
|
23
|
+
*
|
|
24
|
+
* Exit 4 is reserved for its usual meaning: a path that exists and cannot be
|
|
25
|
+
* read. That is a fact about the filesystem, not about the policy, and — as in
|
|
26
|
+
* `paths.ts` — its messages never use the word "corrupt".
|
|
27
|
+
*/
|
|
28
|
+
import { accessSync, constants, statSync } from "node:fs";
|
|
29
|
+
import { isAbsolute, join, resolve as resolvePathSegments } from "node:path";
|
|
30
|
+
import { explain, isActionClass } from "../core/policy-explain.js";
|
|
31
|
+
import { loadPolicy, POLICY_FILENAMES } from "../core/policy-load.js";
|
|
32
|
+
import { commandPolicyAmend } from "./amend.js";
|
|
33
|
+
import { boolFlag, parseFlags, stringFlag } from "./args.js";
|
|
34
|
+
import { commandPolicyAttest } from "./attest.js";
|
|
35
|
+
import { EXIT_IO, EXIT_OK, EXIT_USAGE } from "./exit-codes.js";
|
|
36
|
+
import { POLICY_CHECK_HELP, POLICY_HELP, POLICY_TEST_HELP } from "./help.js";
|
|
37
|
+
import { relPath, style } from "./style.js";
|
|
38
|
+
import { usageErrorText } from "./usage.js";
|
|
39
|
+
/**
|
|
40
|
+
* `--reversible` takes an explicit `true|false` rather than being a bare
|
|
41
|
+
* boolean, because this command has three distinct states and a bare flag can
|
|
42
|
+
* only express two. "The caller did not say whether this is reversible"
|
|
43
|
+
* (`reversible: null`, no floor — the policy answers on its own terms) is not
|
|
44
|
+
* the same claim as "the caller says it is reversible", and neither is
|
|
45
|
+
* `--reversible false`, which is the only way to ask the question that matters:
|
|
46
|
+
* what does policy do with an action that cannot be undone? A bare `--reversible`
|
|
47
|
+
* would leave the SPEC §7 floor unreachable from the CLI.
|
|
48
|
+
*/
|
|
49
|
+
const FLAGS = {
|
|
50
|
+
"--reversible": "string",
|
|
51
|
+
"--policy": "string",
|
|
52
|
+
"--dir": "string",
|
|
53
|
+
"--json": "boolean",
|
|
54
|
+
"--help": "boolean",
|
|
55
|
+
"-h": "boolean",
|
|
56
|
+
};
|
|
57
|
+
function wantsJson(argv) {
|
|
58
|
+
return argv.includes("--json");
|
|
59
|
+
}
|
|
60
|
+
function usageError(streams, json, message, helpText) {
|
|
61
|
+
if (json)
|
|
62
|
+
streams.err(`${JSON.stringify({ error: { code: "usage", message } })}\n`);
|
|
63
|
+
else
|
|
64
|
+
streams.err(usageErrorText(message, helpText));
|
|
65
|
+
return EXIT_USAGE;
|
|
66
|
+
}
|
|
67
|
+
function ioError(streams, json, message) {
|
|
68
|
+
if (json)
|
|
69
|
+
streams.err(`${JSON.stringify({ error: { code: "io", message } })}\n`);
|
|
70
|
+
else
|
|
71
|
+
streams.err(`approval: ${message}\n`);
|
|
72
|
+
return EXIT_IO;
|
|
73
|
+
}
|
|
74
|
+
function absolute(value, cwd) {
|
|
75
|
+
return isAbsolute(value) ? value : resolvePathSegments(cwd, value);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Readability preflight for a policy path.
|
|
79
|
+
*
|
|
80
|
+
* Absent is deliberately **not** an I/O error: a missing policy file is the
|
|
81
|
+
* fail-closed answer, delivered by `loadPolicy` as `file-missing`. A path that
|
|
82
|
+
* exists but cannot be read (permission bit, or a directory where a file
|
|
83
|
+
* belongs) is a filesystem problem, and reporting it as "manual, policy
|
|
84
|
+
* missing" would tell an operator their policy is absent when it is merely
|
|
85
|
+
* locked.
|
|
86
|
+
*/
|
|
87
|
+
function preflightPolicyFile(path) {
|
|
88
|
+
let stats;
|
|
89
|
+
try {
|
|
90
|
+
stats = statSync(path);
|
|
91
|
+
}
|
|
92
|
+
catch (cause) {
|
|
93
|
+
if (cause.code === "ENOENT")
|
|
94
|
+
return { ok: true };
|
|
95
|
+
return { ok: false, message: `policy ${path} could not be opened: ${detail(cause)}` };
|
|
96
|
+
}
|
|
97
|
+
if (stats.isDirectory()) {
|
|
98
|
+
return { ok: false, message: `policy ${path} is a directory, not a policy file` };
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
accessSync(path, constants.R_OK);
|
|
102
|
+
}
|
|
103
|
+
catch (cause) {
|
|
104
|
+
return { ok: false, message: `policy ${path} is not readable: ${detail(cause)}` };
|
|
105
|
+
}
|
|
106
|
+
return { ok: true };
|
|
107
|
+
}
|
|
108
|
+
function detail(cause) {
|
|
109
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
110
|
+
}
|
|
111
|
+
/** The final human line: the answer, plus the marker that qualifies it. */
|
|
112
|
+
function finalLine(explanation) {
|
|
113
|
+
const autonomy = explanation.outcome.autonomy;
|
|
114
|
+
if (explanation.loadFailure !== null) {
|
|
115
|
+
return `-> ${autonomy} (fail-closed: ${explanation.loadFailure.code})`;
|
|
116
|
+
}
|
|
117
|
+
if (explanation.overridden !== null) {
|
|
118
|
+
const source = explanation.overridden.pattern ?? "defaults.autonomy";
|
|
119
|
+
return `-> ${autonomy} (floor applied over ${source}: ${explanation.overridden.autonomy})`;
|
|
120
|
+
}
|
|
121
|
+
return `-> ${autonomy}`;
|
|
122
|
+
}
|
|
123
|
+
/** Autonomy as a role. `manual` is a decision, never a failure, so it is `warn`. */
|
|
124
|
+
function autonomyRole(autonomy) {
|
|
125
|
+
if (autonomy === "autonomous")
|
|
126
|
+
return "ok";
|
|
127
|
+
if (autonomy === "supervised")
|
|
128
|
+
return "warn";
|
|
129
|
+
return "fail";
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The decision trace, dressed (APRV-93 #2).
|
|
133
|
+
*
|
|
134
|
+
* The trace lines themselves are the SAME STRINGS `--json` publishes in
|
|
135
|
+
* `decisionPath`, which is a frozen shape, so nothing here rewrites one — the
|
|
136
|
+
* only edit is `relPath` on the discovery line, because "the same 70-character
|
|
137
|
+
* absolute path" was half of the original complaint and the human reader has a
|
|
138
|
+
* cwd to resolve against. The trace is `muted` and the answer is not: an
|
|
139
|
+
* operator wants the verdict first and the reasoning when they ask for it.
|
|
140
|
+
*/
|
|
141
|
+
export function renderExplainHuman(explanation, cwd, st = style()) {
|
|
142
|
+
const trace = explanation.decisionPath.map((line) => st.muted(line.startsWith("policy loaded from ")
|
|
143
|
+
? `policy loaded from ${relPath(line.slice("policy loaded from ".length), cwd)}`
|
|
144
|
+
: line));
|
|
145
|
+
const autonomy = explanation.outcome.autonomy;
|
|
146
|
+
const final = finalLine(explanation);
|
|
147
|
+
// The answer word wears the role; everything around it is left plain so the
|
|
148
|
+
// line still reads as one sentence in a pipe.
|
|
149
|
+
const painted = final.replace(autonomy, st.paint(autonomyRole(autonomy), autonomy));
|
|
150
|
+
return `${[...trace, painted].join("\n")}\n`;
|
|
151
|
+
}
|
|
152
|
+
/** One verb's worth of work; `check` and `test` differ only in their help text. */
|
|
153
|
+
function runVerb(argv, streams, cwd, helpText) {
|
|
154
|
+
const json = wantsJson(argv);
|
|
155
|
+
const parsed = parseFlags(argv, FLAGS);
|
|
156
|
+
if (!parsed.ok)
|
|
157
|
+
return usageError(streams, json, parsed.message, helpText);
|
|
158
|
+
if (boolFlag(parsed.flags, "--help") || boolFlag(parsed.flags, "-h")) {
|
|
159
|
+
streams.out(`${helpText}\n`);
|
|
160
|
+
return EXIT_OK;
|
|
161
|
+
}
|
|
162
|
+
const actionClass = parsed.positionals[0];
|
|
163
|
+
if (actionClass === undefined) {
|
|
164
|
+
return usageError(streams, json, "missing <class> argument", helpText);
|
|
165
|
+
}
|
|
166
|
+
const extra = parsed.positionals[1];
|
|
167
|
+
if (extra !== undefined) {
|
|
168
|
+
return usageError(streams, json, `unexpected argument ${JSON.stringify(extra)}`, helpText);
|
|
169
|
+
}
|
|
170
|
+
if (!isActionClass(actionClass)) {
|
|
171
|
+
return usageError(streams, json, `${JSON.stringify(actionClass)} is not a valid action class (lowercase dot-separated segments, no wildcards)`, helpText);
|
|
172
|
+
}
|
|
173
|
+
const reversibleFlag = stringFlag(parsed.flags, "--reversible");
|
|
174
|
+
if (reversibleFlag !== null && reversibleFlag !== "true" && reversibleFlag !== "false") {
|
|
175
|
+
return usageError(streams, json, `--reversible expects true or false, got ${JSON.stringify(reversibleFlag)}`, helpText);
|
|
176
|
+
}
|
|
177
|
+
const policyFlag = stringFlag(parsed.flags, "--policy");
|
|
178
|
+
const dirFlag = stringFlag(parsed.flags, "--dir");
|
|
179
|
+
const dir = dirFlag === null ? cwd : absolute(dirFlag, cwd);
|
|
180
|
+
// `--policy` wins over discovery, exactly as `loadPolicy` treats `file` vs
|
|
181
|
+
// `dir`; the preflight follows the same precedence so the path reported as
|
|
182
|
+
// unreadable is the path that would have been read.
|
|
183
|
+
const options = policyFlag === null ? { dir } : { file: absolute(policyFlag, cwd) };
|
|
184
|
+
const probes = options.file === undefined
|
|
185
|
+
? POLICY_FILENAMES.map((filename) => join(dir, filename))
|
|
186
|
+
: [options.file];
|
|
187
|
+
for (const probe of probes) {
|
|
188
|
+
const check = preflightPolicyFile(probe);
|
|
189
|
+
if (!check.ok)
|
|
190
|
+
return ioError(streams, json, check.message);
|
|
191
|
+
}
|
|
192
|
+
const explanation = explain(loadPolicy(options), actionClass, reversibleFlag === null ? {} : { reversible: reversibleFlag === "true" });
|
|
193
|
+
if (json) {
|
|
194
|
+
streams.out(`${JSON.stringify(explanation)}\n`);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
streams.out(renderExplainHuman(explanation, cwd, style({ json })));
|
|
198
|
+
}
|
|
199
|
+
return EXIT_OK;
|
|
200
|
+
}
|
|
201
|
+
/** `approval policy …` — dispatch to `check` / `test`, or print the help. */
|
|
202
|
+
export function commandPolicy(argv, streams, cwd) {
|
|
203
|
+
const sub = argv[0];
|
|
204
|
+
const rest = argv.slice(1);
|
|
205
|
+
if (sub === undefined) {
|
|
206
|
+
return usageError(streams, wantsJson(argv), "missing subcommand for `approval policy`", POLICY_HELP);
|
|
207
|
+
}
|
|
208
|
+
if (sub === "--help" || sub === "-h" || sub === "help") {
|
|
209
|
+
streams.out(`${POLICY_HELP}\n`);
|
|
210
|
+
return EXIT_OK;
|
|
211
|
+
}
|
|
212
|
+
switch (sub) {
|
|
213
|
+
case "check":
|
|
214
|
+
return runVerb(rest, streams, cwd, POLICY_CHECK_HELP);
|
|
215
|
+
case "test":
|
|
216
|
+
return runVerb(rest, streams, cwd, POLICY_TEST_HELP);
|
|
217
|
+
// The one policy verb that writes: it lives in `attest.ts` because nothing
|
|
218
|
+
// it does — hashing, identity, appending — belongs to the explain path.
|
|
219
|
+
case "attest":
|
|
220
|
+
return commandPolicyAttest(rest, streams, cwd);
|
|
221
|
+
// The amendment ceremony (APRV-30): diff, advise, confirm, attest, commit.
|
|
222
|
+
// It writes too, and for the same reason it lives in its own file.
|
|
223
|
+
case "amend":
|
|
224
|
+
return commandPolicyAmend(rest, streams, cwd);
|
|
225
|
+
default:
|
|
226
|
+
return usageError(streams, wantsJson(argv), `unknown subcommand ${JSON.stringify(sub)} for \`approval policy\``, POLICY_HELP);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/cli/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAE7E,OAAO,EAAE,OAAO,EAAE,aAAa,EAAoB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAA0B,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAyB,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;;GASG;AACH,MAAM,KAAK,GAA6B;IACtC,cAAc,EAAE,QAAQ;IACxB,UAAU,EAAE,QAAQ;IACpB,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF,SAAS,SAAS,CAAC,IAAc;IAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,UAAU,CAAC,OAAgB,EAAE,IAAa,EAAE,OAAe,EAAE,QAAgB;IACpF,IAAI,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;;QAC/E,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,OAAO,CAAC,OAAgB,EAAE,IAAa,EAAE,OAAe;IAC/D,IAAI,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;;QAC5E,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,IAAI,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,GAAW;IAC1C,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC5E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,IAAI,yBAAyB,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;IACxF,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,IAAI,oCAAoC,EAAE,CAAC;IACpF,CAAC;IACD,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,IAAI,qBAAqB,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;IACpF,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,2EAA2E;AAC3E,SAAS,SAAS,CAAC,WAAwB;IACzC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC9C,IAAI,WAAW,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QACrC,OAAO,MAAM,QAAQ,kBAAkB,WAAW,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC;IACzE,CAAC;IACD,IAAI,WAAW,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,IAAI,mBAAmB,CAAC;QACrE,OAAO,MAAM,QAAQ,wBAAwB,MAAM,KAAK,WAAW,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC;IAC7F,CAAC;IACD,OAAO,MAAM,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAED,oFAAoF;AACpF,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,MAAM,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAwB,EACxB,GAAW,EACX,EAAE,GAAU,KAAK,EAAE;IAEnB,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAClD,EAAE,CAAC,KAAK,CACN,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC;QACpC,CAAC,CAAC,sBAAsB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE;QAChF,CAAC,CAAC,IAAI,CACT,CACF,CAAC;IACF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IACrC,4EAA4E;IAC5E,8CAA8C;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpF,OAAO,GAAG,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED,mFAAmF;AACnF,SAAS,OAAO,CAAC,IAAc,EAAE,OAAgB,EAAE,GAAW,EAAE,QAAgB;IAC9E,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE3E,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC1C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,0BAA0B,EAAE,QAAQ,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,uBAAuB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,UAAU,CACf,OAAO,EACP,IAAI,EACJ,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,+EAA+E,EAC7G,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAChE,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,KAAK,MAAM,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;QACvF,OAAO,UAAU,CACf,OAAO,EACP,IAAI,EACJ,2CAA2C,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,EAC3E,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAE5D,2EAA2E;IAC3E,2EAA2E;IAC3E,oDAAoD;IACpD,MAAM,OAAO,GACX,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;IAEtE,MAAM,MAAM,GACV,OAAO,CAAC,IAAI,KAAK,SAAS;QACxB,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,EAAE;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CACzB,UAAU,CAAC,OAAO,CAAC,EACnB,WAAW,EACX,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,cAAc,KAAK,MAAM,EAAE,CACzE,CAAC;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,aAAa,CAAC,IAAc,EAAE,OAAgB,EAAE,GAAW;IACzE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,UAAU,CACf,OAAO,EACP,SAAS,CAAC,IAAI,CAAC,EACf,0CAA0C,EAC1C,WAAW,CACZ,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,IAAI,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC;QACxD,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;QACvD,2EAA2E;QAC3E,wEAAwE;QACxE,KAAK,QAAQ;YACX,OAAO,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QACjD,2EAA2E;QAC3E,mEAAmE;QACnE,KAAK,OAAO;YACV,OAAO,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAChD;YACE,OAAO,UAAU,CACf,OAAO,EACP,SAAS,CAAC,IAAI,CAAC,EACf,sBAAsB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,EACnE,WAAW,CACZ,CAAC;IACN,CAAC;AACH,CAAC"}
|