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,461 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shared adapter conformance suite (SPEC.md §10.4, §11.1).
|
|
3
|
+
*
|
|
4
|
+
* `channels/conformance.ts` exists because SPEC.md §9 names a display rule and
|
|
5
|
+
* then names its consequence: rendering claimed fields as computed "is a
|
|
6
|
+
* conformance failure for a channel". This module is the same idea one boundary
|
|
7
|
+
* further out. §10.4 says an adapter "MUST require a valid, unexpired,
|
|
8
|
+
* single-use execution token bound to the action's `idempotency_key`", and the
|
|
9
|
+
* only way to find out whether a given adapter does is to hand it a bad token
|
|
10
|
+
* and watch.
|
|
11
|
+
*
|
|
12
|
+
* What is being tested is mostly **the contract**, not the adapter: an adapter
|
|
13
|
+
* that goes through {@link executeThroughAdapter} inherits the sequence and
|
|
14
|
+
* cannot skip a step. That is the point. The suite is what turns "cannot skip"
|
|
15
|
+
* from an assertion in a module header into a thing someone has watched fail,
|
|
16
|
+
* and it is what a third-party adapter runs to learn whether it is wired into
|
|
17
|
+
* the gate or merely near it.
|
|
18
|
+
*
|
|
19
|
+
* ## What it checks
|
|
20
|
+
*
|
|
21
|
+
* 1. **Bad token, no side effect.** A garbage token refuses and `act` is never
|
|
22
|
+
* called. The log is unchanged.
|
|
23
|
+
* 2. **Wrong bytes, no side effect.** A payload that is not the approved one
|
|
24
|
+
* refuses `payload-mismatch`, `act` is never called, the token stays live.
|
|
25
|
+
* 3. **Wrong class, nothing appended.** An adapter that does not serve the
|
|
26
|
+
* declared class refuses `adapter-class-mismatch` before the log is touched.
|
|
27
|
+
* 4. **`started` precedes the effect.** On the happy path `act` observes an
|
|
28
|
+
* `execution.started` for its own key already in the verified log at the
|
|
29
|
+
* moment it is called, and `execution.completed` lands after it returns. The
|
|
30
|
+
* same check reads the provider reference of APRV-251 off that record: a
|
|
31
|
+
* detail naming one is on the record under this adapter's name, and a detail
|
|
32
|
+
* naming none leaves the record carrying none.
|
|
33
|
+
* 5. **Single use.** A second execution with the same token and key refuses
|
|
34
|
+
* without calling `act`.
|
|
35
|
+
* 6. **Credentials are scoped and never leak.** A value handed out inside `act`
|
|
36
|
+
* appears in no log line and in no field of the result, and the provider
|
|
37
|
+
* refuses once `act` has returned.
|
|
38
|
+
* 7. **Failure is recorded, not swallowed.** An adapter reporting failure
|
|
39
|
+
* produces `execution.failed` and an `adapter-failed` refusal.
|
|
40
|
+
*
|
|
41
|
+
* The chain is verified after every check.
|
|
42
|
+
*
|
|
43
|
+
* ## How it is run
|
|
44
|
+
*
|
|
45
|
+
* ```ts
|
|
46
|
+
* test("my adapter conforms", async (t) => {
|
|
47
|
+
* await runAdapterConformance(t, () => new MyAdapter(), harness);
|
|
48
|
+
* });
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* As in the channel suite, `t` is used only for `diagnostic()` labels: the
|
|
52
|
+
* checks run inline and **throw** on the first failure, so
|
|
53
|
+
* `tests/adapters-contract.test.ts` can assert the suite goes RED against
|
|
54
|
+
* deliberately broken adapters. A conformance suite nobody has watched fail is a
|
|
55
|
+
* suite that might pass anything.
|
|
56
|
+
*
|
|
57
|
+
* Several checks wrap the adapter under test in a hostile shell — one that reads
|
|
58
|
+
* a credential it was not asked to read, one that returns the secret inside its
|
|
59
|
+
* own detail, one that reports failure. The wrapper delegates to the real `act`
|
|
60
|
+
* where the check allows it. Wrapping rather than requiring cooperation is what
|
|
61
|
+
* lets the suite test properties (scoping, redaction) that a well-behaved
|
|
62
|
+
* adapter would never exercise on its own.
|
|
63
|
+
*/
|
|
64
|
+
import assert from "node:assert/strict";
|
|
65
|
+
import { readFileSync } from "node:fs";
|
|
66
|
+
import { payloadOf, readVerifiedRecords } from "../core/state.js";
|
|
67
|
+
import { verify } from "../core/verify.js";
|
|
68
|
+
import { executeThroughAdapter, inMemoryCredentials, providerRefFor, } from "./contract.js";
|
|
69
|
+
function say(t, message) {
|
|
70
|
+
t.diagnostic?.(`adapter conformance: ${message}`);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Wrap `adapter` so every call is recorded and `before` (if given) runs inside
|
|
74
|
+
* the credential window, where the suite can observe the log and the provider.
|
|
75
|
+
*/
|
|
76
|
+
function spyOn(adapter, before) {
|
|
77
|
+
const calls = [];
|
|
78
|
+
return {
|
|
79
|
+
calls,
|
|
80
|
+
// SPREAD, never a fresh `{name, classes, act}` literal (APRV-245). The
|
|
81
|
+
// contract gained optional members — `requiredCredentials`, `observe` — and
|
|
82
|
+
// a wrapper that rebuilt the object from three fields would quietly test an
|
|
83
|
+
// adapter the caller never wrote: the one under test minus everything
|
|
84
|
+
// optional it declares.
|
|
85
|
+
adapter: {
|
|
86
|
+
...adapter,
|
|
87
|
+
async act(input) {
|
|
88
|
+
calls.push(input);
|
|
89
|
+
before?.(input);
|
|
90
|
+
return await adapter.act(input);
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The options every check passes: whatever the harness configured, the token
|
|
97
|
+
* under test, and a provider holding the harness's credential.
|
|
98
|
+
*
|
|
99
|
+
* The provider is supplied on every call, including the checks that expect a
|
|
100
|
+
* refusal, so that an adapter which legitimately needs a secret to act is not
|
|
101
|
+
* failed for the absence of one. Whether the secret is reachable is check (6)'s
|
|
102
|
+
* question, not check (1)'s.
|
|
103
|
+
*/
|
|
104
|
+
function callOptions(unit, harness, token) {
|
|
105
|
+
return {
|
|
106
|
+
...unit.options,
|
|
107
|
+
token,
|
|
108
|
+
credentials: inMemoryCredentials({
|
|
109
|
+
...harness.credentials,
|
|
110
|
+
// Last, so the hunted value cannot be shadowed by a configuration entry.
|
|
111
|
+
[harness.credential.name]: harness.credential.value,
|
|
112
|
+
}),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/** Records currently in the log; the suite counts them before and after. */
|
|
116
|
+
function recordsOf(logPath) {
|
|
117
|
+
const read = readVerifiedRecords(logPath);
|
|
118
|
+
assert.equal(read.ok, true, `conformance log does not verify: ${JSON.stringify(read)}`);
|
|
119
|
+
return read.ok ? read.records : [];
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* What the contract should have lifted from this detail (APRV-251), computed by
|
|
123
|
+
* the very function that lifts it.
|
|
124
|
+
*
|
|
125
|
+
* Asking the contract rather than re-deriving the rule is the point: an adapter
|
|
126
|
+
* is conformant when the record agrees with the contract's own reading of its
|
|
127
|
+
* detail, and a suite that spelled the rule a second time would eventually
|
|
128
|
+
* disagree with the runtime and fail an adapter that had done nothing wrong.
|
|
129
|
+
*
|
|
130
|
+
* The detail here is the REDACTED copy the result carried, and this check runs
|
|
131
|
+
* against an adapter that leaked nothing (check (6) is where a leak is hunted),
|
|
132
|
+
* so both copies are the same bytes and passing one twice asks the same
|
|
133
|
+
* question the contract asked.
|
|
134
|
+
*/
|
|
135
|
+
function expectedProviderRef(adapterName, detail) {
|
|
136
|
+
if (detail === undefined)
|
|
137
|
+
return null;
|
|
138
|
+
return providerRefFor(adapterName, detail, detail);
|
|
139
|
+
}
|
|
140
|
+
function assertClean(logPath) {
|
|
141
|
+
const result = verify(logPath);
|
|
142
|
+
assert.equal(result.status, "clean", `chain not clean: ${JSON.stringify(result)}`);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Run the suite. Resolves when every check passes; throws (an `AssertionError`)
|
|
146
|
+
* on the first failure.
|
|
147
|
+
*/
|
|
148
|
+
export async function runAdapterConformance(t, makeAdapter, harness) {
|
|
149
|
+
await checkBadToken(t, makeAdapter, harness);
|
|
150
|
+
await checkWrongPayload(t, makeAdapter, harness);
|
|
151
|
+
await checkWrongClass(t, makeAdapter, harness);
|
|
152
|
+
await checkHappyPath(t, makeAdapter, harness);
|
|
153
|
+
await checkSingleUse(t, makeAdapter, harness);
|
|
154
|
+
await checkCredentialScope(t, makeAdapter, harness);
|
|
155
|
+
await checkReportedFailure(t, makeAdapter, harness);
|
|
156
|
+
await checkObserve(t, makeAdapter, harness);
|
|
157
|
+
}
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
// (8) observe, when the adapter offers one, reads and does not write (APRV-245)
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
/**
|
|
162
|
+
* The optional `observe` (SPEC.md §10.4, APRV-245).
|
|
163
|
+
*
|
|
164
|
+
* SKIPPED for an adapter that declares none — it is optional, and an adapter
|
|
165
|
+
* without it is conformant. For one that declares it, three properties, and
|
|
166
|
+
* each is the failure somebody would otherwise ship:
|
|
167
|
+
*
|
|
168
|
+
* - **It does not write.** A coverage read that sent something would be the
|
|
169
|
+
* worst defect this contract could carry. The harness's `writes()` counts the
|
|
170
|
+
* far side's write requests where the fixture can see them (the AgentMail mock
|
|
171
|
+
* counts POSTs), and the log is counted on both sides regardless: no record is
|
|
172
|
+
* appended by a read.
|
|
173
|
+
* - **It does not throw.** A reporting verb calls this, and an adapter whose
|
|
174
|
+
* far side is quiet must answer "nothing" rather than take the report down.
|
|
175
|
+
* A configured harness reaching a live fixture has no excuse to throw.
|
|
176
|
+
* - **Every effect carries a class the adapter serves.** An effect of a class
|
|
177
|
+
* this adapter does not handle is an effect it cannot have observed, and
|
|
178
|
+
* admitting one would let a source contribute rows nothing could ever cover.
|
|
179
|
+
*/
|
|
180
|
+
async function checkObserve(t, makeAdapter, harness) {
|
|
181
|
+
const adapter = makeAdapter();
|
|
182
|
+
if (adapter.observe === undefined) {
|
|
183
|
+
say(t, "observe() is not implemented; the optional read is skipped");
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
say(t, "observe() reads: no write to the far side, no throw, and only its own classes");
|
|
187
|
+
const unit = await harness.setup();
|
|
188
|
+
try {
|
|
189
|
+
const probe = harness.observeProbe;
|
|
190
|
+
const writesBefore = probe?.writes?.() ?? 0;
|
|
191
|
+
const recordsBefore = recordsOf(unit.logPath).length;
|
|
192
|
+
const window = probe?.window ?? {
|
|
193
|
+
since: "1970-01-01T00:00:00Z",
|
|
194
|
+
until: "2999-12-31T23:59:59Z",
|
|
195
|
+
};
|
|
196
|
+
const effects = await adapter.observe(window, inMemoryCredentials({
|
|
197
|
+
...harness.credentials,
|
|
198
|
+
[harness.credential.name]: harness.credential.value,
|
|
199
|
+
}));
|
|
200
|
+
assert.equal(probe?.writes?.() ?? 0, writesBefore, "observe() made a write request against the far side; it is a READ, called outside any grant window and with no token (SPEC.md §10.4)");
|
|
201
|
+
assert.equal(recordsOf(unit.logPath).length, recordsBefore, "observe() appended to the log; a coverage read records nothing");
|
|
202
|
+
for (const effect of effects) {
|
|
203
|
+
assert.ok(adapter.classes.includes(effect.class), `observe() returned an effect of class ${JSON.stringify(effect.class)}, which this adapter does not serve`);
|
|
204
|
+
assert.ok(effect.id.length > 0, "an observed effect must carry the provider's own id");
|
|
205
|
+
assert.ok(effect.source.length > 0, "an observed effect must name its source");
|
|
206
|
+
}
|
|
207
|
+
assertClean(unit.logPath);
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
unit.cleanup?.();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
// (1) a bad token never reaches act
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
async function checkBadToken(t, makeAdapter, harness) {
|
|
217
|
+
say(t, "a token that is not the minted one refuses, and act never runs");
|
|
218
|
+
const unit = await harness.setup();
|
|
219
|
+
try {
|
|
220
|
+
const spy = spyOn(makeAdapter());
|
|
221
|
+
const before = recordsOf(unit.logPath).length;
|
|
222
|
+
const result = await executeThroughAdapter(spy.adapter, { logPath: unit.logPath, actionKey: unit.actionKey, payload: unit.payload, actor: unit.actor }, callOptions(unit, harness, "not-the-token"));
|
|
223
|
+
assert.equal(result.ok, false, "a bad token must not produce a completed execution");
|
|
224
|
+
if (!result.ok) {
|
|
225
|
+
assert.equal(result.code, "token-mismatch", `wrong refusal code: ${result.code}`);
|
|
226
|
+
assert.equal(result.acted, false, "the refusal must say no side effect was attempted");
|
|
227
|
+
}
|
|
228
|
+
assert.equal(spy.calls.length, 0, "act() ran on an unauthorized token (SPEC.md §10.4)");
|
|
229
|
+
assert.equal(recordsOf(unit.logPath).length, before, "a refused execution appended a record");
|
|
230
|
+
assertClean(unit.logPath);
|
|
231
|
+
}
|
|
232
|
+
finally {
|
|
233
|
+
unit.cleanup?.();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
// (2) the wrong bytes never reach act
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
async function checkWrongPayload(t, makeAdapter, harness) {
|
|
240
|
+
say(t, "a payload the grant did not bind to refuses payload-mismatch");
|
|
241
|
+
const unit = await harness.setup();
|
|
242
|
+
try {
|
|
243
|
+
const spy = spyOn(makeAdapter());
|
|
244
|
+
const before = recordsOf(unit.logPath).length;
|
|
245
|
+
const tampered = { approved: unit.payload, tampered: "after the human said yes" };
|
|
246
|
+
const result = await executeThroughAdapter(spy.adapter, { logPath: unit.logPath, actionKey: unit.actionKey, payload: tampered, actor: unit.actor }, callOptions(unit, harness, unit.token));
|
|
247
|
+
assert.equal(result.ok, false, "different bytes must not execute against an old grant");
|
|
248
|
+
if (!result.ok) {
|
|
249
|
+
assert.equal(result.code, "payload-mismatch", `wrong refusal code: ${result.code}`);
|
|
250
|
+
assert.equal(result.acted, false, "the refusal must say no side effect was attempted");
|
|
251
|
+
}
|
|
252
|
+
assert.equal(spy.calls.length, 0, "act() ran on bytes no human approved (SPEC.md §10.4)");
|
|
253
|
+
assert.equal(recordsOf(unit.logPath).length, before, "a refused execution appended a record");
|
|
254
|
+
// The token is still live: the repair is a new request for the new payload.
|
|
255
|
+
const good = await executeThroughAdapter(spyOn(makeAdapter()).adapter, { logPath: unit.logPath, actionKey: unit.actionKey, payload: unit.payload, actor: unit.actor }, callOptions(unit, harness, unit.token));
|
|
256
|
+
assert.equal(good.ok, true, `a payload-mismatch must leave the token live: ${JSON.stringify(good)}`);
|
|
257
|
+
assertClean(unit.logPath);
|
|
258
|
+
}
|
|
259
|
+
finally {
|
|
260
|
+
unit.cleanup?.();
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
// (3) the wrong adapter appends nothing
|
|
265
|
+
// ---------------------------------------------------------------------------
|
|
266
|
+
async function checkWrongClass(t, makeAdapter, harness) {
|
|
267
|
+
say(t, "an adapter that does not serve the declared class refuses, log untouched");
|
|
268
|
+
const unit = await harness.setup();
|
|
269
|
+
try {
|
|
270
|
+
const base = makeAdapter();
|
|
271
|
+
const foreign = {
|
|
272
|
+
...base,
|
|
273
|
+
classes: [harness.foreignClass ?? "conformance.class.this-adapter-does-not-serve"],
|
|
274
|
+
act: base.act.bind(base),
|
|
275
|
+
};
|
|
276
|
+
assert.ok(!foreign.classes.includes(unit.class), "harness.foreignClass names the class under test; it must name one the adapter does not serve");
|
|
277
|
+
const spy = spyOn(foreign);
|
|
278
|
+
const before = recordsOf(unit.logPath).length;
|
|
279
|
+
const result = await executeThroughAdapter(spy.adapter, { logPath: unit.logPath, actionKey: unit.actionKey, payload: unit.payload, actor: unit.actor }, callOptions(unit, harness, unit.token));
|
|
280
|
+
assert.equal(result.ok, false, "a misrouted action must not execute");
|
|
281
|
+
if (!result.ok) {
|
|
282
|
+
assert.equal(result.code, "adapter-class-mismatch", `wrong refusal code: ${result.code}`);
|
|
283
|
+
assert.equal(result.acted, false, "the refusal must say no side effect was attempted");
|
|
284
|
+
}
|
|
285
|
+
assert.equal(spy.calls.length, 0, "act() ran for a class the adapter does not serve");
|
|
286
|
+
assert.equal(recordsOf(unit.logPath).length, before, "a misrouted action appended a record; a wiring mistake must not spend a token");
|
|
287
|
+
assertClean(unit.logPath);
|
|
288
|
+
}
|
|
289
|
+
finally {
|
|
290
|
+
unit.cleanup?.();
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// ---------------------------------------------------------------------------
|
|
294
|
+
// (4) started precedes the side effect
|
|
295
|
+
// ---------------------------------------------------------------------------
|
|
296
|
+
async function checkHappyPath(t, makeAdapter, harness) {
|
|
297
|
+
say(t, "execution.started is in the log before act runs, completed after");
|
|
298
|
+
const unit = await harness.setup();
|
|
299
|
+
try {
|
|
300
|
+
let sawStart = false;
|
|
301
|
+
const spy = spyOn(makeAdapter(), () => {
|
|
302
|
+
sawStart = recordsOf(unit.logPath).some((record) => record.event === "execution.started" && record.action_key === unit.actionKey);
|
|
303
|
+
});
|
|
304
|
+
const result = await executeThroughAdapter(spy.adapter, { logPath: unit.logPath, actionKey: unit.actionKey, payload: unit.payload, actor: unit.actor }, callOptions(unit, harness, unit.token));
|
|
305
|
+
assert.equal(result.ok, true, `the granted action was refused: ${JSON.stringify(result)}`);
|
|
306
|
+
assert.equal(spy.calls.length, 1, "act() must be called exactly once for a granted action");
|
|
307
|
+
assert.equal(sawStart, true, "act() ran before execution.started was in the log; a log that records an execution only once it succeeded cannot tell you about the one that did not (SPEC.md §10.4)");
|
|
308
|
+
const records = recordsOf(unit.logPath);
|
|
309
|
+
const started = records.find((record) => record.event === "execution.started" && record.action_key === unit.actionKey);
|
|
310
|
+
const completed = records.find((record) => record.event === "execution.completed" && record.action_key === unit.actionKey);
|
|
311
|
+
assert.ok(started !== undefined, "no execution.started was appended");
|
|
312
|
+
assert.ok(completed !== undefined, "no execution.completed was appended");
|
|
313
|
+
assert.ok(started.seq < completed.seq, "the outcome must follow the start");
|
|
314
|
+
if (result.ok) {
|
|
315
|
+
assert.equal(result.started_seq, started.seq, "the result names the wrong start record");
|
|
316
|
+
assert.equal(result.outcome_seq, completed.seq, "the result names the wrong outcome record");
|
|
317
|
+
assert.equal(result.outcome, "execution.completed", "the result names the wrong outcome");
|
|
318
|
+
assert.equal(result.exit_code, 0, "a completed execution records exit_code 0");
|
|
319
|
+
}
|
|
320
|
+
// The adapter saw the approved bytes, not a copy assembled from the log.
|
|
321
|
+
const call = spy.calls[0];
|
|
322
|
+
assert.ok(call !== undefined);
|
|
323
|
+
assert.deepEqual(call.payload, unit.payload, "act() was handed different bytes");
|
|
324
|
+
assert.equal(call.actionKey, unit.actionKey, "act() was handed a different action key");
|
|
325
|
+
// The provider reference (APRV-251). An adapter that names one under the
|
|
326
|
+
// conventional key gets it onto the record, under THIS adapter's name and
|
|
327
|
+
// with the id unchanged; an adapter that names none gets a record carrying
|
|
328
|
+
// no reference, which is the pre-amendment record and always valid. Both
|
|
329
|
+
// directions are checked because both are ways to be wrong: a reference
|
|
330
|
+
// quietly dropped sends `approval coverage` back to the class-and-window
|
|
331
|
+
// rule without saying so, and a reference invented for an adapter that
|
|
332
|
+
// named none puts a value in a join column that means nothing.
|
|
333
|
+
const expected = expectedProviderRef(spy.adapter.name, result.ok ? result.detail : undefined);
|
|
334
|
+
const recorded = payloadOf(completed)["provider_ref"];
|
|
335
|
+
if (expected === null) {
|
|
336
|
+
assert.equal(recorded, undefined, `execution.completed carries a provider_ref the adapter's detail never named: ${JSON.stringify(recorded)}`);
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
assert.deepEqual(recorded, { adapter: expected.adapter, id: expected.id }, "the detail named a provider reference and the record does not carry it (APRV-251)");
|
|
340
|
+
if (result.ok) {
|
|
341
|
+
assert.deepEqual(result.provider_ref, expected, "the result must name the reference the record carries");
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
assertClean(unit.logPath);
|
|
345
|
+
}
|
|
346
|
+
finally {
|
|
347
|
+
unit.cleanup?.();
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// ---------------------------------------------------------------------------
|
|
351
|
+
// (5) single use
|
|
352
|
+
// ---------------------------------------------------------------------------
|
|
353
|
+
async function checkSingleUse(t, makeAdapter, harness) {
|
|
354
|
+
say(t, "a second execution with the same token and key refuses without acting");
|
|
355
|
+
const unit = await harness.setup();
|
|
356
|
+
try {
|
|
357
|
+
const first = await executeThroughAdapter(spyOn(makeAdapter()).adapter, { logPath: unit.logPath, actionKey: unit.actionKey, payload: unit.payload, actor: unit.actor }, callOptions(unit, harness, unit.token));
|
|
358
|
+
assert.equal(first.ok, true, `the first execution was refused: ${JSON.stringify(first)}`);
|
|
359
|
+
const spy = spyOn(makeAdapter());
|
|
360
|
+
const before = recordsOf(unit.logPath).length;
|
|
361
|
+
const second = await executeThroughAdapter(spy.adapter, { logPath: unit.logPath, actionKey: unit.actionKey, payload: unit.payload, actor: unit.actor }, callOptions(unit, harness, unit.token));
|
|
362
|
+
assert.equal(second.ok, false, "an idempotency key is single-use (SPEC.md §6.2, §7)");
|
|
363
|
+
if (!second.ok) {
|
|
364
|
+
assert.ok(second.code === "token-consumed" || second.code === "already-executed", `a replay must refuse token-consumed or already-executed, got ${second.code}`);
|
|
365
|
+
assert.equal(second.acted, false, "the replay attempted the side effect a second time");
|
|
366
|
+
}
|
|
367
|
+
assert.equal(spy.calls.length, 0, "act() ran twice for one idempotency key");
|
|
368
|
+
assert.equal(recordsOf(unit.logPath).length, before, "a refused replay appended a record");
|
|
369
|
+
assertClean(unit.logPath);
|
|
370
|
+
}
|
|
371
|
+
finally {
|
|
372
|
+
unit.cleanup?.();
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
// ---------------------------------------------------------------------------
|
|
376
|
+
// (6) credentials: scoped in time, absent from everything written
|
|
377
|
+
// ---------------------------------------------------------------------------
|
|
378
|
+
async function checkCredentialScope(t, makeAdapter, harness) {
|
|
379
|
+
say(t, "a credential read inside act reaches no log line and no result field");
|
|
380
|
+
const unit = await harness.setup();
|
|
381
|
+
const { name, value } = harness.credential;
|
|
382
|
+
assert.ok(value.length >= 8, "harness.credential.value must be distinctive enough to hunt for");
|
|
383
|
+
try {
|
|
384
|
+
const base = makeAdapter();
|
|
385
|
+
// A hostile shell: it reads the secret, keeps the provider, and then tries
|
|
386
|
+
// to publish the secret through its own outcome. Every one of those is a
|
|
387
|
+
// thing a careless adapter does by accident.
|
|
388
|
+
let escaped = null;
|
|
389
|
+
let stashed = null;
|
|
390
|
+
const leaky = {
|
|
391
|
+
...base,
|
|
392
|
+
async act(input) {
|
|
393
|
+
stashed = input.credentials;
|
|
394
|
+
const got = input.credentials.get(name);
|
|
395
|
+
escaped = got;
|
|
396
|
+
assert.equal(got.ok, true, `the credential window refused inside act: ${JSON.stringify(got)}`);
|
|
397
|
+
await base.act(input);
|
|
398
|
+
return { ok: true, detail: { note: `authenticated with ${value}`, [value]: "as a key too" } };
|
|
399
|
+
},
|
|
400
|
+
};
|
|
401
|
+
const result = await executeThroughAdapter(leaky, { logPath: unit.logPath, actionKey: unit.actionKey, payload: unit.payload, actor: unit.actor }, callOptions(unit, harness, unit.token));
|
|
402
|
+
assert.equal(result.ok, true, `the granted action was refused: ${JSON.stringify(result)}`);
|
|
403
|
+
assert.notEqual(escaped, null, "the hostile wrapper never asked for the credential");
|
|
404
|
+
// Nothing the contract returns carries the secret.
|
|
405
|
+
const serialized = JSON.stringify(result);
|
|
406
|
+
assert.equal(serialized.includes(value), false, `the execution result carries the raw credential (SPEC.md §11.1 invariant 3): ${serialized}`);
|
|
407
|
+
if (result.ok) {
|
|
408
|
+
assert.ok(result.redactions > 0, "the contract redacted nothing although the adapter published the secret; a silent pass here means the guard is not running");
|
|
409
|
+
}
|
|
410
|
+
// Nothing the log holds carries the secret, on any line.
|
|
411
|
+
const raw = readFileSync(unit.logPath, "utf8");
|
|
412
|
+
assert.equal(raw.includes(value), false, "a raw credential value appears in the log (SPEC.md §11.1 invariant 3)");
|
|
413
|
+
// And the window is shut: the provider the adapter kept is the same object
|
|
414
|
+
// it held inside act, and it now refuses. This is read after the execution
|
|
415
|
+
// returned rather than from a deferred callback inside act, because a
|
|
416
|
+
// microtask queued inside act runs before the await that closes the window
|
|
417
|
+
// and would test the wrong instant.
|
|
418
|
+
assert.notEqual(stashed, null, "the hostile wrapper never kept the provider");
|
|
419
|
+
const late = stashed.get(name);
|
|
420
|
+
assert.equal(late.ok, false, "the credential provider still answered after act() returned");
|
|
421
|
+
if (!late.ok) {
|
|
422
|
+
assert.equal(late.code, "credential-window-closed", `a post-window read must refuse credential-window-closed, got ${late.code}`);
|
|
423
|
+
}
|
|
424
|
+
assertClean(unit.logPath);
|
|
425
|
+
}
|
|
426
|
+
finally {
|
|
427
|
+
unit.cleanup?.();
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
// ---------------------------------------------------------------------------
|
|
431
|
+
// (7) a reported failure is recorded, not swallowed
|
|
432
|
+
// ---------------------------------------------------------------------------
|
|
433
|
+
async function checkReportedFailure(t, makeAdapter, harness) {
|
|
434
|
+
say(t, "an adapter that reports failure produces execution.failed");
|
|
435
|
+
const unit = await harness.setup();
|
|
436
|
+
try {
|
|
437
|
+
const base = makeAdapter();
|
|
438
|
+
const failing = {
|
|
439
|
+
...base,
|
|
440
|
+
act() {
|
|
441
|
+
return { ok: false, code: "upstream-rejected", message: "the far side said no" };
|
|
442
|
+
},
|
|
443
|
+
};
|
|
444
|
+
const result = await executeThroughAdapter(failing, { logPath: unit.logPath, actionKey: unit.actionKey, payload: unit.payload, actor: unit.actor }, callOptions(unit, harness, unit.token));
|
|
445
|
+
assert.equal(result.ok, false, "a failed act must not report a completed execution");
|
|
446
|
+
if (!result.ok) {
|
|
447
|
+
assert.equal(result.code, "adapter-failed", `wrong refusal code: ${result.code}`);
|
|
448
|
+
assert.equal(result.acted, true, "the side effect was attempted and the result must say so");
|
|
449
|
+
assert.equal(result.adapter_code, "upstream-rejected", "the adapter's own code was lost");
|
|
450
|
+
assert.equal(result.outcome, "execution.failed", "the wrong outcome was recorded");
|
|
451
|
+
}
|
|
452
|
+
const records = recordsOf(unit.logPath);
|
|
453
|
+
const failed = records.find((record) => record.event === "execution.failed" && record.action_key === unit.actionKey);
|
|
454
|
+
assert.ok(failed !== undefined, "no execution.failed was appended for a failed act()");
|
|
455
|
+
assertClean(unit.logPath);
|
|
456
|
+
}
|
|
457
|
+
finally {
|
|
458
|
+
unit.cleanup?.();
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
//# sourceMappingURL=conformance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../../src/adapters/conformance.ts"],"names":[],"mappings":"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"}
|