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,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage of observed side effects (APRV-245, SPEC.md §10.1).
|
|
3
|
+
*
|
|
4
|
+
* ## Why a verb that witnesses rather than gates
|
|
5
|
+
*
|
|
6
|
+
* MCP use is voluntary. An agent connected to `approval mcp serve --http` can
|
|
7
|
+
* call `request`, `wait` and `run`, or it can simply act. Nothing in this
|
|
8
|
+
* runtime observes the act, because the runtime is not in the path: a gate an
|
|
9
|
+
* agent may route around reports only on the actions routed through it, and a
|
|
10
|
+
* report that counts only its own inputs is a report that cannot go down.
|
|
11
|
+
*
|
|
12
|
+
* What makes the arrangement honest is that side effects leave witnesses THIS
|
|
13
|
+
* PROJECT DOES NOT WRITE. Git history records commits, merges and tags. `gh`
|
|
14
|
+
* records pull requests. AgentMail records the messages an inbox actually sent.
|
|
15
|
+
* None of those are appended by approval.md, none of them are reachable by an
|
|
16
|
+
* agent editing its own log, and each of them can be read back and joined
|
|
17
|
+
* against the verified records to ask one question per effect: does the log say
|
|
18
|
+
* a human, or a policy, ever saw this?
|
|
19
|
+
*
|
|
20
|
+
* This module is that join, and nothing else. It performs no IO, reads no clock,
|
|
21
|
+
* spawns nothing and appends nothing. The sources under `coverage-sources/`
|
|
22
|
+
* gather the effects; `cli/coverage.ts` prints the answer.
|
|
23
|
+
*
|
|
24
|
+
* ## What counts as evidence, stated exactly
|
|
25
|
+
*
|
|
26
|
+
* The strongest answer first (APRV-251): an `execution.completed` may carry
|
|
27
|
+
* `payload.provider_ref`, the identifier the provider filed the effect under
|
|
28
|
+
* (SPEC.md §8), and an effect whose source and id match one is covered by that
|
|
29
|
+
* record, reported as `provider-ref`. No window is applied to it, because an id
|
|
30
|
+
* names one effect and a class in a span of time names a period. That is the
|
|
31
|
+
* whole difference the reference buys: without it, a gated send covers an
|
|
32
|
+
* ungated one of the same class sitting beside it in the window, and with it
|
|
33
|
+
* the log answers about the message actually in front of the reader.
|
|
34
|
+
*
|
|
35
|
+
* Otherwise, for one {@link ObservedEffect}, evidence is the EARLIEST record
|
|
36
|
+
* that is all three of:
|
|
37
|
+
*
|
|
38
|
+
* 1. one of `task.registered`, `approval.granted`, `execution.started`,
|
|
39
|
+
* `execution.completed` — the four records that mean "this runtime was told
|
|
40
|
+
* about an action of this class", from the declaration through the human's
|
|
41
|
+
* decision to the spend;
|
|
42
|
+
* 2. of a matching class: EXACT first ({@link classesOf} against the effect's
|
|
43
|
+
* class), and only if nothing matches exactly, a FAMILY match on the first
|
|
44
|
+
* two dotted segments, reported distinctly as `family` so a reader is never
|
|
45
|
+
* shown a weaker match dressed as a strong one;
|
|
46
|
+
* 3. inside the window `[at - 24h, at + 5m]`.
|
|
47
|
+
*
|
|
48
|
+
* The window is asymmetric on purpose and both halves are arguable, so both are
|
|
49
|
+
* written down. **24 hours back**, because the ordinary shape is register →
|
|
50
|
+
* request → grant → act, and the gap between the human's tap and the effect is
|
|
51
|
+
* a working day at worst; a week back would let one grant carry every later
|
|
52
|
+
* effect of its class, which is the laundering hole APRV-202 closed in the
|
|
53
|
+
* protected-path guard. **5 minutes forward**, because that is clock skew
|
|
54
|
+
* between git's author date (or a provider's timestamp) and this log, and not an
|
|
55
|
+
* ordering allowance: a record appended an hour after an effect is a record
|
|
56
|
+
* about some other action, whatever its class.
|
|
57
|
+
*
|
|
58
|
+
* The one place this rule is not used is a protected FILE path. Those already
|
|
59
|
+
* have a stronger answer: `core/protected-path-guard.ts` matches a change's
|
|
60
|
+
* BYTES against the material a grant bound, and its `attested` and
|
|
61
|
+
* `granted-file` verdicts are content-level rather than time-level. So an effect
|
|
62
|
+
* carrying a `path` takes the guard's verdict when the caller supplies a report
|
|
63
|
+
* that covers it, and the class-and-window rule is what everything else gets.
|
|
64
|
+
*
|
|
65
|
+
* ## Verified records only, and no writes
|
|
66
|
+
*
|
|
67
|
+
* The caller reads through `readVerifiedRecords` (SPEC.md §11.1 invariant 1);
|
|
68
|
+
* this function is handed records that already passed chain verification and has
|
|
69
|
+
* no way to read any others. It writes nothing anywhere, which is what lets it be
|
|
70
|
+
* informational: the whole report is derived, and running it changes no state
|
|
71
|
+
* that any later verdict depends on.
|
|
72
|
+
*
|
|
73
|
+
* ## What a green line does NOT say
|
|
74
|
+
*
|
|
75
|
+
* Coverage is a witness, not a control. An effect made with a credential the
|
|
76
|
+
* AGENT itself holds — an API key pasted into a chat surface, a token in a
|
|
77
|
+
* shell profile — leaves a witness only where the provider keeps one this verb
|
|
78
|
+
* can read. The remedy for that tier is custody (SPEC.md §10.4: adapters hold
|
|
79
|
+
* the credentials and answer only to a token), not a bigger report, and
|
|
80
|
+
* `docs/cli-reference.md#coverage` writes the three tiers out so that a green
|
|
81
|
+
* coverage line is never read as the claim that nothing else happened.
|
|
82
|
+
*/
|
|
83
|
+
import { payloadOf } from "./state.js";
|
|
84
|
+
/** How far BACK of an effect a record may sit and still be about it: 24 hours. */
|
|
85
|
+
export const COVERAGE_LOOKBACK_MS = 24 * 60 * 60 * 1000;
|
|
86
|
+
/**
|
|
87
|
+
* How far AHEAD of an effect a record may sit: five minutes.
|
|
88
|
+
*
|
|
89
|
+
* A skew allowance between two clocks, not an ordering allowance. See the
|
|
90
|
+
* module note for why the window is asymmetric.
|
|
91
|
+
*/
|
|
92
|
+
export const COVERAGE_AHEAD_MS = 5 * 60 * 1000;
|
|
93
|
+
/** The record types that can be evidence, in the order they occur in a life. */
|
|
94
|
+
export const EVIDENCE_EVENTS = [
|
|
95
|
+
"task.registered",
|
|
96
|
+
"approval.granted",
|
|
97
|
+
"execution.started",
|
|
98
|
+
"execution.completed",
|
|
99
|
+
];
|
|
100
|
+
/**
|
|
101
|
+
* The classes a record declares, as a set.
|
|
102
|
+
*
|
|
103
|
+
* Four shapes, because four record types say it four ways and one reader is
|
|
104
|
+
* better than four:
|
|
105
|
+
*
|
|
106
|
+
* - `payload.class` — what `approval.requested`, `approval.granted` and
|
|
107
|
+
* `execution.started` carry;
|
|
108
|
+
* - `payload.actions[].class` — what `task.registered` carries, because one
|
|
109
|
+
* registration declares every action of the task;
|
|
110
|
+
* - the class of the `execution.started` sharing this record's `action_key`,
|
|
111
|
+
* for an `execution.completed`, which records an outcome and not a class;
|
|
112
|
+
* - nothing, for a record that declares none. Such a record is evidence for no
|
|
113
|
+
* effect, which is the fail-closed direction: an unclassified record must not
|
|
114
|
+
* cover an effect of a class it never named.
|
|
115
|
+
*/
|
|
116
|
+
function classesOf(record, startedClasses) {
|
|
117
|
+
const found = new Set();
|
|
118
|
+
const payload = payloadOf(record);
|
|
119
|
+
const direct = payload["class"];
|
|
120
|
+
if (typeof direct === "string" && direct.length > 0)
|
|
121
|
+
found.add(direct);
|
|
122
|
+
const actions = payload["actions"];
|
|
123
|
+
if (Array.isArray(actions)) {
|
|
124
|
+
for (const action of actions) {
|
|
125
|
+
if (typeof action !== "object" || action === null || Array.isArray(action))
|
|
126
|
+
continue;
|
|
127
|
+
const cls = action["class"];
|
|
128
|
+
if (typeof cls === "string" && cls.length > 0)
|
|
129
|
+
found.add(cls);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (found.size === 0) {
|
|
133
|
+
const key = record.action_key;
|
|
134
|
+
if (typeof key === "string") {
|
|
135
|
+
for (const cls of startedClasses.get(key) ?? [])
|
|
136
|
+
found.add(cls);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return found;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* The family of a class: its first two dotted segments.
|
|
143
|
+
*
|
|
144
|
+
* `vcs.push.main` and `vcs.push.branch` are one family; `vcs.push.main` and
|
|
145
|
+
* `vcs.commit.branch` are not. Two segments rather than one, because a single
|
|
146
|
+
* segment would make every `vcs.*` record evidence for every other, and the
|
|
147
|
+
* pushes and the commits are different decisions. A class with fewer than two
|
|
148
|
+
* segments is its own family.
|
|
149
|
+
*/
|
|
150
|
+
export function classFamily(cls) {
|
|
151
|
+
const parts = cls.split(".");
|
|
152
|
+
return parts.length <= 2 ? cls : `${parts[0]}.${parts[1]}`;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* The provider references the log carries, keyed by adapter and id (APRV-251).
|
|
156
|
+
*
|
|
157
|
+
* Built from `execution.completed` records alone, because that is the only event
|
|
158
|
+
* SPEC.md §8 lets carry one. EARLIEST wins, on the same reasoning the
|
|
159
|
+
* class-and-window rule uses: records arrive in seq order, and a later record
|
|
160
|
+
* naming the same effect cannot improve on the first one that did.
|
|
161
|
+
*
|
|
162
|
+
* The key is the pair. An id alone would let one provider's identifier be read
|
|
163
|
+
* as evidence about another provider's effect that happens to share the string,
|
|
164
|
+
* and the pair costs nothing: the source name a witness reports (`agentmail`) is
|
|
165
|
+
* the adapter name the contract wrote (`agentmail`), because the same adapter is
|
|
166
|
+
* both the executor and the observer. A source whose name does not match the
|
|
167
|
+
* adapter that executed simply falls through to the class-and-window rule, which
|
|
168
|
+
* is the weaker answer rather than a wrong one.
|
|
169
|
+
*/
|
|
170
|
+
function providerRefIndex(records) {
|
|
171
|
+
const found = new Map();
|
|
172
|
+
for (const record of records) {
|
|
173
|
+
if (record.event !== "execution.completed")
|
|
174
|
+
continue;
|
|
175
|
+
const ref = payloadOf(record)["provider_ref"];
|
|
176
|
+
if (typeof ref !== "object" || ref === null || Array.isArray(ref))
|
|
177
|
+
continue;
|
|
178
|
+
const { adapter, id } = ref;
|
|
179
|
+
if (typeof adapter !== "string" || adapter.length === 0)
|
|
180
|
+
continue;
|
|
181
|
+
if (typeof id !== "string" || id.length === 0)
|
|
182
|
+
continue;
|
|
183
|
+
const key = providerRefKey(adapter, id);
|
|
184
|
+
if (!found.has(key))
|
|
185
|
+
found.set(key, { seq: record.seq, event: record.event });
|
|
186
|
+
}
|
|
187
|
+
return found;
|
|
188
|
+
}
|
|
189
|
+
/** The index key: a NUL separator, which neither half can contain. */
|
|
190
|
+
function providerRefKey(adapter, id) {
|
|
191
|
+
return `${adapter}\u0000${id}`;
|
|
192
|
+
}
|
|
193
|
+
/** The guard's verdict for `path`, or `null` when the report has none that passed. */
|
|
194
|
+
function guardVerdict(guard, path) {
|
|
195
|
+
if (guard === undefined || guard === null || path === undefined)
|
|
196
|
+
return null;
|
|
197
|
+
for (const finding of guard.findings) {
|
|
198
|
+
if (finding.path !== path || !finding.ok)
|
|
199
|
+
continue;
|
|
200
|
+
// `granted-command` is deliberately not surfaced here. It is the guard's
|
|
201
|
+
// weakest verdict — a run attributed by time rather than by bytes — and
|
|
202
|
+
// reporting it beside `attested` under one column would flatten exactly the
|
|
203
|
+
// distinction the guard spent its module note drawing. Such a path falls
|
|
204
|
+
// through to the class-and-window rule below, which is the same strength of
|
|
205
|
+
// claim and is labelled as such.
|
|
206
|
+
if (finding.evidence === "attested" || finding.evidence === "granted-file") {
|
|
207
|
+
return finding.evidence;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
/** A timestamp in milliseconds, or `null` when it does not parse. */
|
|
213
|
+
function instant(ts) {
|
|
214
|
+
const at = Date.parse(ts);
|
|
215
|
+
return Number.isNaN(at) ? null : at;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Join observed effects against verified records.
|
|
219
|
+
*
|
|
220
|
+
* Deterministic and total: the same effects and the same records produce the
|
|
221
|
+
* same report, in the same order, every time. Entries come back in the order the
|
|
222
|
+
* effects were given, and the totals are sorted by key so that a `--json`
|
|
223
|
+
* consumer can pin the whole object with a `deepEqual`.
|
|
224
|
+
*
|
|
225
|
+
* @param effects what the witnesses outside this runtime saw
|
|
226
|
+
* @param records records that have ALREADY passed chain verification
|
|
227
|
+
*/
|
|
228
|
+
export function coverageReport(effects, records, options = {}) {
|
|
229
|
+
const lookbackMs = options.lookbackMs ?? COVERAGE_LOOKBACK_MS;
|
|
230
|
+
const aheadMs = options.aheadMs ?? COVERAGE_AHEAD_MS;
|
|
231
|
+
// One pass to learn which class each action key was started under, so an
|
|
232
|
+
// `execution.completed` (which records an outcome and no class) can be read
|
|
233
|
+
// as evidence for the class its own start declared.
|
|
234
|
+
const startedClasses = new Map();
|
|
235
|
+
for (const record of records) {
|
|
236
|
+
if (record.event !== "execution.started")
|
|
237
|
+
continue;
|
|
238
|
+
const key = record.action_key;
|
|
239
|
+
const cls = payloadOf(record)["class"];
|
|
240
|
+
if (typeof key !== "string" || typeof cls !== "string" || cls.length === 0)
|
|
241
|
+
continue;
|
|
242
|
+
const bucket = startedClasses.get(key);
|
|
243
|
+
if (bucket === undefined)
|
|
244
|
+
startedClasses.set(key, new Set([cls]));
|
|
245
|
+
else
|
|
246
|
+
bucket.add(cls);
|
|
247
|
+
}
|
|
248
|
+
/** The candidate records, pre-reduced to (seq, event, ts, classes). */
|
|
249
|
+
const candidates = records
|
|
250
|
+
.filter((record) => EVIDENCE_EVENTS.includes(record.event))
|
|
251
|
+
.map((record) => ({
|
|
252
|
+
seq: record.seq,
|
|
253
|
+
event: record.event,
|
|
254
|
+
at: instant(record.ts),
|
|
255
|
+
classes: classesOf(record, startedClasses),
|
|
256
|
+
}))
|
|
257
|
+
.filter((candidate) => candidate.at !== null && candidate.classes.size > 0);
|
|
258
|
+
// APRV-251. Read once, consulted per effect.
|
|
259
|
+
const references = providerRefIndex(records);
|
|
260
|
+
const entries = [];
|
|
261
|
+
for (const effect of effects) {
|
|
262
|
+
// The id-level answer outranks both the guard's and the window's, and it is
|
|
263
|
+
// the only one of the three that is about this effect rather than about a
|
|
264
|
+
// class, a path or a span of time.
|
|
265
|
+
const named = references.get(providerRefKey(effect.source, effect.id));
|
|
266
|
+
if (named !== undefined) {
|
|
267
|
+
entries.push({ effect, evidence: named, match: "provider-ref" });
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
const verdict = guardVerdict(options.guard, effect.path);
|
|
271
|
+
if (verdict !== null) {
|
|
272
|
+
entries.push({ effect, evidence: { verdict }, match: "protected-path" });
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
const when = instant(effect.at);
|
|
276
|
+
if (when === null) {
|
|
277
|
+
// An effect whose timestamp does not parse cannot be placed against any
|
|
278
|
+
// record, and inventing a placement would be the report asserting
|
|
279
|
+
// something no witness said. It is a gap, and it is a gap for a reason a
|
|
280
|
+
// reader can see in the detail line the source wrote.
|
|
281
|
+
entries.push({ effect, evidence: null, match: "none" });
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const family = classFamily(effect.class);
|
|
285
|
+
let exact = null;
|
|
286
|
+
let loose = null;
|
|
287
|
+
for (const candidate of candidates) {
|
|
288
|
+
const at = candidate.at;
|
|
289
|
+
if (at < when - lookbackMs || at > when + aheadMs)
|
|
290
|
+
continue;
|
|
291
|
+
if (candidate.classes.has(effect.class)) {
|
|
292
|
+
// EARLIEST wins: records arrive in seq order, so the first exact match
|
|
293
|
+
// seen is the earliest one and nothing later can improve on it.
|
|
294
|
+
if (exact === null)
|
|
295
|
+
exact = { seq: candidate.seq, event: candidate.event };
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
if (loose === null) {
|
|
299
|
+
for (const cls of candidate.classes) {
|
|
300
|
+
if (classFamily(cls) === family) {
|
|
301
|
+
loose = { seq: candidate.seq, event: candidate.event };
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (exact !== null)
|
|
308
|
+
entries.push({ effect, evidence: exact, match: "exact" });
|
|
309
|
+
else if (loose !== null)
|
|
310
|
+
entries.push({ effect, evidence: loose, match: "family" });
|
|
311
|
+
else
|
|
312
|
+
entries.push({ effect, evidence: null, match: "none" });
|
|
313
|
+
}
|
|
314
|
+
const bySource = totalsBy(entries, (entry) => entry.effect.source);
|
|
315
|
+
const byClass = totalsBy(entries, (entry) => entry.effect.class);
|
|
316
|
+
return {
|
|
317
|
+
entries,
|
|
318
|
+
bySource,
|
|
319
|
+
byClass,
|
|
320
|
+
observed: entries.length,
|
|
321
|
+
covered: entries.filter((entry) => entry.evidence !== null).length,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/** Observed and covered counts per key, sorted by key. */
|
|
325
|
+
function totalsBy(entries, keyOf) {
|
|
326
|
+
const totals = new Map();
|
|
327
|
+
for (const entry of entries) {
|
|
328
|
+
const key = keyOf(entry);
|
|
329
|
+
const existing = totals.get(key) ?? { key, observed: 0, covered: 0 };
|
|
330
|
+
existing.observed += 1;
|
|
331
|
+
if (entry.evidence !== null)
|
|
332
|
+
existing.covered += 1;
|
|
333
|
+
totals.set(key, existing);
|
|
334
|
+
}
|
|
335
|
+
return [...totals.values()].sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../../src/core/coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The credential manifest type (SPEC.md §10.4; APRV-78).
|
|
3
|
+
*
|
|
4
|
+
* An adapter reads named values out of the vault, and until this file existed
|
|
5
|
+
* the only place those names were written down was the adapter's own `act`,
|
|
6
|
+
* where a human setting the vault up cannot read them. A manifest moves that
|
|
7
|
+
* knowledge one level out: the adapter DECLARES what it needs, and a generic
|
|
8
|
+
* interactive writer (`cli/setup-flow.ts`) asks for it, validates it, stores it
|
|
9
|
+
* and reports on it without knowing anything about email or SMTP.
|
|
10
|
+
*
|
|
11
|
+
* **This module is a type and nothing else.** No I/O, no imports, no runtime
|
|
12
|
+
* values, deliberately: it is imported by `src/adapters/*` (which must not
|
|
13
|
+
* depend on the CLI) and by `src/cli/*` (which must not depend on a particular
|
|
14
|
+
* adapter), so anything with behaviour in it would make one of those two edges
|
|
15
|
+
* a dependency on the other. The behaviour lives at both ends; the vocabulary
|
|
16
|
+
* lives here.
|
|
17
|
+
*
|
|
18
|
+
* A spec carries no default for a `secret`, and it never carries a VALUE of any
|
|
19
|
+
* kind: the manifest is printed, in checklists and in non-interactive hints, and
|
|
20
|
+
* a field that could hold a credential would be a credential in a terminal.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* What kind of thing a credential is, from the operator's point of view.
|
|
24
|
+
*
|
|
25
|
+
* Three, not two, because the collection differs for each: a `config` value is
|
|
26
|
+
* typed in the clear with its default shown, a `choice` is picked from a
|
|
27
|
+
* numbered list so a typo cannot become a silently wrong transport, and a
|
|
28
|
+
* `secret` is read with no echo. The vault stores all three identically — it
|
|
29
|
+
* has no notion of a non-secret entry — so this distinction exists purely to
|
|
30
|
+
* decide what the human is asked and what may be echoed back at them.
|
|
31
|
+
*/
|
|
32
|
+
export type CredentialKind = "secret" | "config" | "choice";
|
|
33
|
+
/** One value an adapter reads from the vault, described well enough to ask for. */
|
|
34
|
+
export interface CredentialSpec {
|
|
35
|
+
/** The vault name, exactly as the adapter's `act` asks for it. */
|
|
36
|
+
name: string;
|
|
37
|
+
kind: CredentialKind;
|
|
38
|
+
/** A short label for a prompt: `SMTP host`. */
|
|
39
|
+
label: string;
|
|
40
|
+
/** One sentence for the checklist: what this is and why the adapter wants it. */
|
|
41
|
+
describe: string;
|
|
42
|
+
/**
|
|
43
|
+
* Must the vault hold this before the adapter can work?
|
|
44
|
+
*
|
|
45
|
+
* `false` does not mean "unimportant": the email adapter's user and password
|
|
46
|
+
* are both optional and both-or-neither, which no per-field flag can express.
|
|
47
|
+
* That is what {@link CredentialSpec.validate}'s cross-field companion (the
|
|
48
|
+
* flow's `check` hook) is for.
|
|
49
|
+
*/
|
|
50
|
+
required: boolean;
|
|
51
|
+
/** Offered as `[default]` at the prompt. Never present on a `secret`. */
|
|
52
|
+
default?: string;
|
|
53
|
+
/** For `kind: "choice"`: the closed set, each with a one-line explanation. */
|
|
54
|
+
choices?: readonly {
|
|
55
|
+
value: string;
|
|
56
|
+
describe: string;
|
|
57
|
+
}[];
|
|
58
|
+
/**
|
|
59
|
+
* Per-field validation, run on the value the operator typed.
|
|
60
|
+
*
|
|
61
|
+
* Returns the refusal SENTENCE rather than a code, because the sentence is
|
|
62
|
+
* the whole point: it must be the same one the adapter's own `act` would
|
|
63
|
+
* print later, so an operator does not learn at send time that the port they
|
|
64
|
+
* typed at setup time was never a port.
|
|
65
|
+
*/
|
|
66
|
+
validate?(value: string): {
|
|
67
|
+
ok: true;
|
|
68
|
+
} | {
|
|
69
|
+
ok: false;
|
|
70
|
+
message: string;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The credential manifest type (SPEC.md §10.4; APRV-78).
|
|
3
|
+
*
|
|
4
|
+
* An adapter reads named values out of the vault, and until this file existed
|
|
5
|
+
* the only place those names were written down was the adapter's own `act`,
|
|
6
|
+
* where a human setting the vault up cannot read them. A manifest moves that
|
|
7
|
+
* knowledge one level out: the adapter DECLARES what it needs, and a generic
|
|
8
|
+
* interactive writer (`cli/setup-flow.ts`) asks for it, validates it, stores it
|
|
9
|
+
* and reports on it without knowing anything about email or SMTP.
|
|
10
|
+
*
|
|
11
|
+
* **This module is a type and nothing else.** No I/O, no imports, no runtime
|
|
12
|
+
* values, deliberately: it is imported by `src/adapters/*` (which must not
|
|
13
|
+
* depend on the CLI) and by `src/cli/*` (which must not depend on a particular
|
|
14
|
+
* adapter), so anything with behaviour in it would make one of those two edges
|
|
15
|
+
* a dependency on the other. The behaviour lives at both ends; the vocabulary
|
|
16
|
+
* lives here.
|
|
17
|
+
*
|
|
18
|
+
* A spec carries no default for a `secret`, and it never carries a VALUE of any
|
|
19
|
+
* kind: the manifest is printed, in checklists and in non-interactive hints, and
|
|
20
|
+
* a field that could hold a credential would be a credential in a terminal.
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=credential-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-spec.js","sourceRoot":"","sources":["../../../src/core/credential-spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|