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,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The token verbs: `approval token` (status) and `approval consume` (plumbing).
|
|
3
|
+
*
|
|
4
|
+
* As everywhere else in this CLI, **no logic lives here.** Minting, verification,
|
|
5
|
+
* the death conditions, and the append are all `core/token.ts`; this file
|
|
6
|
+
* resolves paths and identity, chooses an exit code, and formats output.
|
|
7
|
+
*
|
|
8
|
+
* ## `approval token` reports status; it does not print the token
|
|
9
|
+
*
|
|
10
|
+
* SPEC.md §10.1 lists `approval token <action-key> # print single-use execution
|
|
11
|
+
* token if granted`. Under the settled hash-only design (2026-08-06) the log
|
|
12
|
+
* carries `sha256(token)` and the raw token is returned by the grant call and
|
|
13
|
+
* kept nowhere else — so there is nothing for this verb to fetch. It would have
|
|
14
|
+
* to *store* the secret to print it, which is precisely the property the design
|
|
15
|
+
* exists to avoid.
|
|
16
|
+
*
|
|
17
|
+
* The honest reading, and the one implemented here: the token is printed **by
|
|
18
|
+
* `approval grant`**, once; `approval token` answers "is a live, unspent token
|
|
19
|
+
* outstanding for this action, and what is its digest?". That interpretation is
|
|
20
|
+
* flagged in the task notes for human review — it is a reading of the spec, not
|
|
21
|
+
* a silent amendment of it, and §10.4's normative sentence (adapters MUST
|
|
22
|
+
* require a valid, unexpired, single-use token bound to the idempotency key) is
|
|
23
|
+
* unaffected either way.
|
|
24
|
+
*
|
|
25
|
+
* ## `approval consume` is internal
|
|
26
|
+
*
|
|
27
|
+
* It is the seam APRV-18's `approval run` will wrap: verify, append
|
|
28
|
+
* `execution.started`, hand control to the command. It ships now so the token
|
|
29
|
+
* boundary is testable end to end and so an adapter integration can be driven by
|
|
30
|
+
* hand, and its help text says INTERNAL in the first line.
|
|
31
|
+
*
|
|
32
|
+
* Exit codes are the frozen table, mapped exactly as the gate verbs map them: a
|
|
33
|
+
* refusal ("that token will not execute") is 1, because the command was
|
|
34
|
+
* well-formed and the answer is no; only filesystem facts are 4 and only a
|
|
35
|
+
* crashed write is 3.
|
|
36
|
+
*/
|
|
37
|
+
import { isAbsolute, resolve as resolvePathSegments } from "node:path";
|
|
38
|
+
import { HUMAN_ACTOR_ENV, resolveHumanActor } from "../core/attest.js";
|
|
39
|
+
import { normalizeUsd } from "../core/money.js";
|
|
40
|
+
import { isPayloadHash } from "../core/payload.js";
|
|
41
|
+
import { readVerifiedRecords } from "../core/state.js";
|
|
42
|
+
import { consumeToken, humanOnlyClassRefusal, tokenPolicy, tokenStatus, } from "../core/token.js";
|
|
43
|
+
import { boolFlag, parseFlags, stringFlag } from "./args.js";
|
|
44
|
+
import { EXIT_INTEGRITY, EXIT_IO, EXIT_OK, EXIT_TORN_TAIL, EXIT_USAGE, } from "./exit-codes.js";
|
|
45
|
+
import { CONSUME_HELP, TOKEN_HELP } from "./help.js";
|
|
46
|
+
import { DEFAULT_LOG_PATH, resolvePath } from "./paths.js";
|
|
47
|
+
import { refusal as renderRefusal, style } from "./style.js";
|
|
48
|
+
import { usageErrorText } from "./usage.js";
|
|
49
|
+
/** Identity accepted by `consume`: a person or an agent, never the runtime. */
|
|
50
|
+
const PRINCIPAL_ACTOR = /^(human|agent):.+/u;
|
|
51
|
+
const COMMON_FLAGS = {
|
|
52
|
+
"--log": "string",
|
|
53
|
+
"--json": "boolean",
|
|
54
|
+
"--help": "boolean",
|
|
55
|
+
"-h": "boolean",
|
|
56
|
+
"--policy": "string",
|
|
57
|
+
"--dir": "string",
|
|
58
|
+
};
|
|
59
|
+
function absolute(value, cwd) {
|
|
60
|
+
return isAbsolute(value) ? value : resolvePathSegments(cwd, value);
|
|
61
|
+
}
|
|
62
|
+
function usageError(streams, json, message, helpText) {
|
|
63
|
+
if (json)
|
|
64
|
+
streams.err(`${JSON.stringify({ error: { code: "usage", message } })}\n`);
|
|
65
|
+
else
|
|
66
|
+
streams.err(usageErrorText(message, helpText));
|
|
67
|
+
return EXIT_USAGE;
|
|
68
|
+
}
|
|
69
|
+
/** The same split the gate verbs draw: integrity unless the filesystem spoke. */
|
|
70
|
+
function refusalExitCode(refusal) {
|
|
71
|
+
switch (refusal.code) {
|
|
72
|
+
case "log-unreadable":
|
|
73
|
+
return EXIT_IO;
|
|
74
|
+
case "log-torn-tail":
|
|
75
|
+
return EXIT_TORN_TAIL;
|
|
76
|
+
case "append-failed":
|
|
77
|
+
switch (refusal.append?.code) {
|
|
78
|
+
case "corrupt-tail":
|
|
79
|
+
return EXIT_TORN_TAIL;
|
|
80
|
+
case "io":
|
|
81
|
+
case "lock-timeout":
|
|
82
|
+
return EXIT_IO;
|
|
83
|
+
default:
|
|
84
|
+
return EXIT_INTEGRITY;
|
|
85
|
+
}
|
|
86
|
+
default:
|
|
87
|
+
return EXIT_INTEGRITY;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function emitRefusal(streams, json, refusal) {
|
|
91
|
+
if (json) {
|
|
92
|
+
const error = { code: refusal.code, message: refusal.message };
|
|
93
|
+
if (refusal.state !== undefined)
|
|
94
|
+
error["state"] = refusal.state;
|
|
95
|
+
if (refusal.seq !== undefined)
|
|
96
|
+
error["seq"] = refusal.seq;
|
|
97
|
+
streams.err(`${JSON.stringify({ ok: false, error })}\n`);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
streams.err(`${renderRefusal(style({ json }), refusal.code, refusal.message)}\n`);
|
|
101
|
+
}
|
|
102
|
+
return refusalExitCode(refusal);
|
|
103
|
+
}
|
|
104
|
+
function emitJson(streams, value) {
|
|
105
|
+
streams.out(`${JSON.stringify(value)}\n`);
|
|
106
|
+
}
|
|
107
|
+
/** Where policy lives, from `--policy` / `--dir`, with the CLI's cwd default. */
|
|
108
|
+
function tokenOptions(flags, cwd) {
|
|
109
|
+
const policyFlag = stringFlag(flags, "--policy");
|
|
110
|
+
const dirFlag = stringFlag(flags, "--dir");
|
|
111
|
+
if (policyFlag !== null)
|
|
112
|
+
return { policyFile: absolute(policyFlag, cwd) };
|
|
113
|
+
return { policyDir: dirFlag === null ? cwd : absolute(dirFlag, cwd) };
|
|
114
|
+
}
|
|
115
|
+
/** The clock is read here, at the edge, and handed to core. */
|
|
116
|
+
function now() {
|
|
117
|
+
return new Date().toISOString();
|
|
118
|
+
}
|
|
119
|
+
function front(argv, spec, helpText, streams, cwd) {
|
|
120
|
+
const json = argv.includes("--json");
|
|
121
|
+
const parsed = parseFlags(argv, spec);
|
|
122
|
+
if (!parsed.ok) {
|
|
123
|
+
return { kind: "handled", code: usageError(streams, json, parsed.message, helpText) };
|
|
124
|
+
}
|
|
125
|
+
if (boolFlag(parsed.flags, "--help") || boolFlag(parsed.flags, "-h")) {
|
|
126
|
+
streams.out(`${helpText}\n`);
|
|
127
|
+
return { kind: "handled", code: EXIT_OK };
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
kind: "run",
|
|
131
|
+
flags: parsed.flags,
|
|
132
|
+
positionals: parsed.positionals,
|
|
133
|
+
json,
|
|
134
|
+
logPath: resolvePath(stringFlag(parsed.flags, "--log"), DEFAULT_LOG_PATH, cwd),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/** `<action-key>` and nothing else. */
|
|
138
|
+
function actionKeyOf(positionals, streams, json, helpText) {
|
|
139
|
+
const actionKey = positionals[0];
|
|
140
|
+
if (actionKey === undefined) {
|
|
141
|
+
return { ok: false, code: usageError(streams, json, "missing <action-key> argument", helpText) };
|
|
142
|
+
}
|
|
143
|
+
const extra = positionals[1];
|
|
144
|
+
if (extra !== undefined) {
|
|
145
|
+
return {
|
|
146
|
+
ok: false,
|
|
147
|
+
code: usageError(streams, json, `unexpected argument ${JSON.stringify(extra)}`, helpText),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return { ok: true, actionKey };
|
|
151
|
+
}
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
// token
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
export function commandToken(argv, streams, cwd) {
|
|
156
|
+
const outcome = front(argv, COMMON_FLAGS, TOKEN_HELP, streams, cwd);
|
|
157
|
+
if (outcome.kind === "handled")
|
|
158
|
+
return outcome.code;
|
|
159
|
+
const { flags, positionals, json, logPath } = outcome;
|
|
160
|
+
const key = actionKeyOf(positionals, streams, json, TOKEN_HELP);
|
|
161
|
+
if (!key.ok)
|
|
162
|
+
return key.code;
|
|
163
|
+
const read = readVerifiedRecords(logPath);
|
|
164
|
+
if (!read.ok) {
|
|
165
|
+
return emitRefusal(streams, json, {
|
|
166
|
+
ok: false,
|
|
167
|
+
// The read refusal's code is already one of this command's codes
|
|
168
|
+
// (`log-unreadable`, `log-torn-tail`, `log-corrupt`); it is surfaced
|
|
169
|
+
// unchanged so a corrupt log is reported as corruption, not as I/O.
|
|
170
|
+
code: read.code,
|
|
171
|
+
message: read.message,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
const options = tokenOptions(flags, cwd);
|
|
175
|
+
const load = tokenPolicy(options);
|
|
176
|
+
const status = tokenStatus(read.records, key.actionKey, now(), load.ok ? load.durations.approvalTtlMs : null);
|
|
177
|
+
if (!status.ok) {
|
|
178
|
+
// APRV-106. `token` is the verb an operator runs to ask "is there a key for
|
|
179
|
+
// this?", and for a harness-executed grant the answer is a fact rather than
|
|
180
|
+
// a fault: the human decided, and the decision was a permission answer to a
|
|
181
|
+
// process that runs the command itself. Said in one line, above the refusal,
|
|
182
|
+
// so nobody goes looking for a token that was deliberately never minted.
|
|
183
|
+
if (status.code === "harness-executed" && !json) {
|
|
184
|
+
streams.out(`${key.actionKey}: none minted: harness-executed\n`);
|
|
185
|
+
}
|
|
186
|
+
return emitRefusal(streams, json, status);
|
|
187
|
+
}
|
|
188
|
+
// APRV-185. The grant is intact and the token is unspent, and the class it
|
|
189
|
+
// authorizes is one the policy now reserves to human hands — so `live: true`
|
|
190
|
+
// would be a true sentence about the log and a false one about the world.
|
|
191
|
+
// This verb exists to answer "can this be spent?", and the honest answer for
|
|
192
|
+
// a class raised to `human-only` after its grant is no. `core/token.ts`
|
|
193
|
+
// refuses the spend itself with the same code and the same words.
|
|
194
|
+
const reserved = humanOnlyClassRefusal(load, status.class, `the token for action ${status.actionKey}, granted at seq ${status.grantSeq}, is unspent and unspendable`);
|
|
195
|
+
if (reserved !== null)
|
|
196
|
+
return emitRefusal(streams, json, reserved);
|
|
197
|
+
if (json) {
|
|
198
|
+
emitJson(streams, {
|
|
199
|
+
ok: true,
|
|
200
|
+
action_key: status.actionKey,
|
|
201
|
+
state: "granted",
|
|
202
|
+
live: true,
|
|
203
|
+
token_sha256: status.tokenSha256,
|
|
204
|
+
grant_seq: status.grantSeq,
|
|
205
|
+
class: status.class,
|
|
206
|
+
est_cost_usd: status.est_cost_usd,
|
|
207
|
+
payload_hash: status.payloadHash,
|
|
208
|
+
task: status.task,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
streams.out(`${status.actionKey}: granted at seq ${status.grantSeq}, token live and unspent\n` +
|
|
213
|
+
`token_sha256: ${status.tokenSha256}\n` +
|
|
214
|
+
`The raw token was printed once by \`approval grant\` and is stored nowhere — ` +
|
|
215
|
+
`if it was lost, revoke the grant and request the action again.\n`);
|
|
216
|
+
}
|
|
217
|
+
return EXIT_OK;
|
|
218
|
+
}
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
// consume
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
export function commandConsume(argv, streams, cwd) {
|
|
223
|
+
const outcome = front(argv, { ...COMMON_FLAGS, "--token": "string", "--as": "string", "--payload-hash": "string" }, CONSUME_HELP, streams, cwd);
|
|
224
|
+
if (outcome.kind === "handled")
|
|
225
|
+
return outcome.code;
|
|
226
|
+
const { flags, positionals, json, logPath } = outcome;
|
|
227
|
+
const key = actionKeyOf(positionals, streams, json, CONSUME_HELP);
|
|
228
|
+
if (!key.ok)
|
|
229
|
+
return key.code;
|
|
230
|
+
const token = stringFlag(flags, "--token");
|
|
231
|
+
if (token === null) {
|
|
232
|
+
return usageError(streams, json, "missing --token <t>", CONSUME_HELP);
|
|
233
|
+
}
|
|
234
|
+
const asFlag = stringFlag(flags, "--as");
|
|
235
|
+
const actor = asFlag === null ? resolveHumanActor() : asFlag;
|
|
236
|
+
if (actor === null || !PRINCIPAL_ACTOR.test(actor)) {
|
|
237
|
+
if (asFlag !== null) {
|
|
238
|
+
return usageError(streams, json, `--as expects human:<id> or agent:<id>, got ${JSON.stringify(asFlag)}`, CONSUME_HELP);
|
|
239
|
+
}
|
|
240
|
+
return usageError(streams, json, `no identity: set ${HUMAN_ACTOR_ENV}=human:<id> or pass --as human:<id> | agent:<id>`, CONSUME_HELP);
|
|
241
|
+
}
|
|
242
|
+
const payloadHash = stringFlag(flags, "--payload-hash");
|
|
243
|
+
if (payloadHash !== null && !isPayloadHash(payloadHash)) {
|
|
244
|
+
return usageError(streams, json, `--payload-hash expects 64 lowercase hex characters (SHA-256 over the RFC 8785 canonical serialization of the payload), got ${JSON.stringify(payloadHash)}`, CONSUME_HELP);
|
|
245
|
+
}
|
|
246
|
+
const result = consumeToken(logPath, key.actionKey, token, actor, {
|
|
247
|
+
...tokenOptions(flags, cwd),
|
|
248
|
+
...(payloadHash === null ? {} : { presentedPayloadHash: payloadHash }),
|
|
249
|
+
});
|
|
250
|
+
if (!result.ok)
|
|
251
|
+
return emitRefusal(streams, json, result);
|
|
252
|
+
const payload = (result.record.payload ?? {});
|
|
253
|
+
if (json) {
|
|
254
|
+
emitJson(streams, {
|
|
255
|
+
ok: true,
|
|
256
|
+
action_key: key.actionKey,
|
|
257
|
+
event: "execution.started",
|
|
258
|
+
seq: result.record.seq,
|
|
259
|
+
token_sha256: result.tokenSha256,
|
|
260
|
+
grant_seq: result.grantSeq,
|
|
261
|
+
class: payload["class"] ?? null,
|
|
262
|
+
// Reported exactly as the record spells it (APRV-121): the `--json`
|
|
263
|
+
// surface is the log in JSON, so the canonical decimal string travels
|
|
264
|
+
// through unparsed.
|
|
265
|
+
est_cost_usd: normalizeUsd(payload["est_cost_usd"]),
|
|
266
|
+
payload_hash: payload["payload_hash"] ?? null,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
streams.out(`consumed ${key.actionKey}: execution.started at seq ${result.record.seq} by ${actor} (token minted at seq ${result.grantSeq})\n`);
|
|
271
|
+
}
|
|
272
|
+
return EXIT_OK;
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/cli/token.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval up` — the ambient runtime: one process for the daemon and every
|
|
3
|
+
* channel the policy configures (SPEC.md §10.2/§10.3, APRV-110).
|
|
4
|
+
*
|
|
5
|
+
* Until now a working gate was two foreground processes an operator had to
|
|
6
|
+
* remember: `approval daemon run` to watch the files and expire what lapsed, and
|
|
7
|
+
* `approval channel telegram listen` to put requests in front of a human and
|
|
8
|
+
* collect the answer. Two terminals, two lifetimes, and a system that is half up
|
|
9
|
+
* whenever one of them is not. This verb runs both, plus the local queue page,
|
|
10
|
+
* under one supervisor, one set of signal handlers, and one event stream.
|
|
11
|
+
*
|
|
12
|
+
* **No logic lives here either.** The loop is still `daemon/daemon.ts`, the
|
|
13
|
+
* dispatch cycle is still `cli/channel-telegram.ts`'s `dispatchPending`, and the
|
|
14
|
+
* queue page is still `channel-web.ts`'s `startWebChannel` — which has said
|
|
15
|
+
* "exported for the tests and for the M5 daemon" since APRV-25. What this file
|
|
16
|
+
* adds is supervision: which parts to start, what to do when one falls over, and
|
|
17
|
+
* how to stop them all at once.
|
|
18
|
+
*
|
|
19
|
+
* ## Per-part crash isolation
|
|
20
|
+
*
|
|
21
|
+
* A channel is a network client and the daemon is not. A Bot API that starts
|
|
22
|
+
* refusing sends must not stop TTL expiry, write-back or the queue projection —
|
|
23
|
+
* that inversion is exactly what the split into two processes bought, and it is
|
|
24
|
+
* what this file has to buy back. So:
|
|
25
|
+
*
|
|
26
|
+
* - the DAEMON settles the verb. Its outcome chooses the exit code, exactly as
|
|
27
|
+
* `approval daemon run` maps it, and its failure stops everything;
|
|
28
|
+
* - a CHANNEL that falls over is reported and restarted after a doubling
|
|
29
|
+
* backoff, forever. There is no attempt limit for the same reason
|
|
30
|
+
* `dispatchPending` has no send limit: giving up would turn an outage into a
|
|
31
|
+
* pending request no human ever sees;
|
|
32
|
+
* - a channel that cannot start AT ALL — a credential the policy names is unset,
|
|
33
|
+
* no declared human identity — is not started, and the refusal is reported in
|
|
34
|
+
* `approval doctor`'s vocabulary (a `skip`, a detail, a fix). Fail closed, and
|
|
35
|
+
* then carry on with the parts that can run: a half-armed runtime that says
|
|
36
|
+
* nothing is the failure this project exists to prevent, and a runtime that
|
|
37
|
+
* refused to start the daemon because Telegram was unconfigured would be
|
|
38
|
+
* withholding the projection over a channel nobody asked for.
|
|
39
|
+
*
|
|
40
|
+
* ## The credentials come from the launch environment, and only from there
|
|
41
|
+
*
|
|
42
|
+
* SPEC.md §11.1 invariant 7: no verb loads `.approval/env` implicitly. This one
|
|
43
|
+
* does not either. The bot token, the chat id and the approver identity are read
|
|
44
|
+
* from `process.env` — the environment the operator launched this process with —
|
|
45
|
+
* through exactly the same resolvers the separate listener uses. `approval setup
|
|
46
|
+
* service` writes a unit that names those variables, or runs a wrapper that
|
|
47
|
+
* evaluates `approval env`, and either way a human wrote the line that does it.
|
|
48
|
+
*
|
|
49
|
+
* ## The event stream is an additive union
|
|
50
|
+
*
|
|
51
|
+
* `--json` prints one object per line, and every object is one of three kinds:
|
|
52
|
+
* a `DaemonEvent` verbatim, a listener line verbatim (`notified`, `decision`,
|
|
53
|
+
* `annotated`, `listening`, `stopped`), or one of this file's own supervision
|
|
54
|
+
* lines ({@link UpEvent}). Nothing is rewritten and no field is added to a shape
|
|
55
|
+
* that already existed: the decision object is byte-identical to the one
|
|
56
|
+
* `channel telegram listen` prints, because it is printed by the same function.
|
|
57
|
+
* That is what makes the composed test suite an assertion about equivalence
|
|
58
|
+
* rather than about a new format.
|
|
59
|
+
*
|
|
60
|
+
* The one shape that appears twice is `stopped`: the daemon's carries its tick
|
|
61
|
+
* counters and a channel's carries its delivery counters, and a supervisor that
|
|
62
|
+
* branches on `event` alone can tell them apart by their fields. Renaming either
|
|
63
|
+
* would have broken a stream an operator already parses.
|
|
64
|
+
*
|
|
65
|
+
* ## What it does not do
|
|
66
|
+
*
|
|
67
|
+
* It does not fork, write a pidfile, or manage its own lifecycle, for the reason
|
|
68
|
+
* `approval daemon run` gives: `launchd` and `systemd` do that better, and
|
|
69
|
+
* `approval setup service` is the verb that hands them the unit.
|
|
70
|
+
*/
|
|
71
|
+
import type { Streams } from "./main.js";
|
|
72
|
+
import { type PreflightEvent } from "./preflight.js";
|
|
73
|
+
import { type Style } from "./style.js";
|
|
74
|
+
/** The parts one ambient runtime supervises. A closed set at v0.1. */
|
|
75
|
+
export type UpPart = "daemon" | "telegram" | "web";
|
|
76
|
+
/**
|
|
77
|
+
* One supervision line. **Additive**: these `event` values are new, and no
|
|
78
|
+
* existing `DaemonEvent` or listener line changes shape because they exist.
|
|
79
|
+
*
|
|
80
|
+
* `part_unavailable` deliberately carries `approval doctor`'s four fields —
|
|
81
|
+
* `check`, `status`, `detail`, `fix` — rather than inventing a vocabulary for
|
|
82
|
+
* the same fact. An operator who has read one report can read the other.
|
|
83
|
+
*/
|
|
84
|
+
export type UpEvent = {
|
|
85
|
+
event: "up_started";
|
|
86
|
+
parts: UpPart[];
|
|
87
|
+
log: string;
|
|
88
|
+
} | {
|
|
89
|
+
event: "part_started";
|
|
90
|
+
part: UpPart;
|
|
91
|
+
detail: string;
|
|
92
|
+
} | {
|
|
93
|
+
event: "part_unavailable";
|
|
94
|
+
part: UpPart;
|
|
95
|
+
check: string;
|
|
96
|
+
status: "skip";
|
|
97
|
+
detail: string;
|
|
98
|
+
fix: string | null;
|
|
99
|
+
} | {
|
|
100
|
+
event: "part_failed";
|
|
101
|
+
part: UpPart;
|
|
102
|
+
/** Consecutive failures for this part, counting this one. */
|
|
103
|
+
attempt: number;
|
|
104
|
+
message: string;
|
|
105
|
+
/** How long the supervisor waits before starting it again. */
|
|
106
|
+
restart_in_ms: number;
|
|
107
|
+
} | {
|
|
108
|
+
event: "part_restarted";
|
|
109
|
+
part: UpPart;
|
|
110
|
+
attempt: number;
|
|
111
|
+
} | {
|
|
112
|
+
event: "part_stopped";
|
|
113
|
+
part: UpPart;
|
|
114
|
+
reason: string;
|
|
115
|
+
} | {
|
|
116
|
+
event: "up_stopped";
|
|
117
|
+
reason: string;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The startup preflight's two lines (APRV-215), emitted before anything else
|
|
121
|
+
* and defined in `cli/preflight.ts` because `approval daemon run` prints the
|
|
122
|
+
* same pair from a module that cannot import this one.
|
|
123
|
+
*
|
|
124
|
+
* ADDITIVE, like every line above them: no field is added to a shape that
|
|
125
|
+
* already existed, and in particular `up_started` is untouched. The commit the
|
|
126
|
+
* process ends up running is named on `preflight` rather than there, because a
|
|
127
|
+
* consumer that already parses `up_started` must not have to learn a new key
|
|
128
|
+
* to keep working.
|
|
129
|
+
*/
|
|
130
|
+
| PreflightEvent;
|
|
131
|
+
/** The first backoff after a part falls over. Doubles to {@link UP_RESTART_MAX_MS}. */
|
|
132
|
+
export declare const UP_RESTART_BASE_MS = 1000;
|
|
133
|
+
/** The ceiling the doubling stops at, so a long outage retries once a minute. */
|
|
134
|
+
export declare const UP_RESTART_MAX_MS = 60000;
|
|
135
|
+
/**
|
|
136
|
+
* How long a part must have been running before a failure is treated as a fresh
|
|
137
|
+
* one rather than as the next step of a crash loop. A channel that ran for an
|
|
138
|
+
* hour and then hit a network blip should retry in a second, not in a minute.
|
|
139
|
+
*/
|
|
140
|
+
export declare const UP_STABLE_MS = 60000;
|
|
141
|
+
/**
|
|
142
|
+
* One supervision line as a human sentence, and where it belongs.
|
|
143
|
+
*
|
|
144
|
+
* `st` is injectable for the render tests, exactly as doctor's renderer takes
|
|
145
|
+
* one; the default asks the process, which is what the verb wants.
|
|
146
|
+
*/
|
|
147
|
+
export declare function describeUpEvent(event: UpEvent, st?: Style): {
|
|
148
|
+
text: string;
|
|
149
|
+
stderr: boolean;
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* `approval up` (and `approval daemon run --with-channels`, which is the same
|
|
153
|
+
* function reached from the other spelling).
|
|
154
|
+
*/
|
|
155
|
+
export declare function commandUp(argv: string[], streams: Streams, cwd: string): number | Promise<number>;
|