approval-md 0.0.1 → 0.1.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 +909 -4
- package/SPEC.md +445 -32
- package/cli.js +29 -3
- package/dist/src/adapters/agentmail.js +1200 -0
- package/dist/src/adapters/agentmail.js.map +1 -0
- package/dist/src/adapters/conformance.js +461 -0
- package/dist/src/adapters/conformance.js.map +1 -0
- package/dist/src/adapters/contract.js +941 -0
- package/dist/src/adapters/contract.js.map +1 -0
- package/dist/src/adapters/email.js +749 -0
- package/dist/src/adapters/email.js.map +1 -0
- package/dist/src/adapters/env-passphrase.js +132 -0
- package/dist/src/adapters/env-passphrase.js.map +1 -0
- package/dist/src/adapters/registry.js +76 -0
- package/dist/src/adapters/registry.js.map +1 -0
- package/dist/src/adapters/smtp.js +499 -0
- package/dist/src/adapters/smtp.js.map +1 -0
- package/dist/src/adapters/vault-provider.js +161 -0
- package/dist/src/adapters/vault-provider.js.map +1 -0
- package/dist/src/channels/batch.js +121 -0
- package/dist/src/channels/batch.js.map +1 -0
- package/dist/src/channels/cli.js +468 -0
- package/dist/src/channels/cli.js.map +1 -0
- package/dist/src/channels/conformance.js +445 -0
- package/dist/src/channels/conformance.js.map +1 -0
- package/dist/src/channels/contract.js +494 -0
- package/dist/src/channels/contract.js.map +1 -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.js +564 -0
- package/dist/src/channels/render-queue.js.map +1 -0
- package/dist/src/channels/tagging.js +723 -0
- package/dist/src/channels/tagging.js.map +1 -0
- package/dist/src/channels/telegram.js +3190 -0
- package/dist/src/channels/telegram.js.map +1 -0
- package/dist/src/channels/web.js +903 -0
- package/dist/src/channels/web.js.map +1 -0
- package/dist/src/cli/adapter.js +278 -0
- package/dist/src/cli/adapter.js.map +1 -0
- package/dist/src/cli/amend.js +2171 -0
- package/dist/src/cli/amend.js.map +1 -0
- package/dist/src/cli/args.js +86 -0
- package/dist/src/cli/args.js.map +1 -0
- package/dist/src/cli/attest.js +307 -0
- package/dist/src/cli/attest.js.map +1 -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.js +460 -0
- package/dist/src/cli/audit.js.map +1 -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.js +357 -0
- package/dist/src/cli/channel-web.js.map +1 -0
- package/dist/src/cli/channel.js +438 -0
- package/dist/src/cli/channel.js.map +1 -0
- package/dist/src/cli/checkpoint-tap.js +238 -0
- package/dist/src/cli/checkpoint-tap.js.map +1 -0
- package/dist/src/cli/coverage.js +343 -0
- package/dist/src/cli/coverage.js.map +1 -0
- package/dist/src/cli/daemon.js +631 -0
- package/dist/src/cli/daemon.js.map +1 -0
- package/dist/src/cli/doctor.js +2648 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/env.js +302 -0
- package/dist/src/cli/env.js.map +1 -0
- package/dist/src/cli/execute.js +1682 -0
- package/dist/src/cli/execute.js.map +1 -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.js +205 -0
- package/dist/src/cli/feedback.js.map +1 -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.js +557 -0
- package/dist/src/cli/gate.js.map +1 -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.js +107 -0
- package/dist/src/cli/gloss-attach.js.map +1 -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.js +255 -0
- package/dist/src/cli/gloss-codex.js.map +1 -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.js +362 -0
- package/dist/src/cli/gloss.js.map +1 -0
- package/dist/src/cli/help.js +2217 -0
- package/dist/src/cli/help.js.map +1 -0
- package/dist/src/cli/hook.js +2743 -0
- package/dist/src/cli/hook.js.map +1 -0
- package/dist/src/cli/import.js +175 -0
- package/dist/src/cli/import.js.map +1 -0
- package/dist/src/cli/init.js +336 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/instructions.js +262 -0
- package/dist/src/cli/instructions.js.map +1 -0
- package/dist/src/cli/journal.js +238 -0
- package/dist/src/cli/journal.js.map +1 -0
- package/dist/src/cli/log-advance.js +749 -0
- package/dist/src/cli/log-advance.js.map +1 -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.js +128 -0
- package/dist/src/cli/log-checkpoint.js.map +1 -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.js +354 -0
- package/dist/src/cli/log-verbs.js.map +1 -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.js +1056 -0
- package/dist/src/cli/main.js.map +1 -0
- package/dist/src/cli/mcp.js +306 -0
- package/dist/src/cli/mcp.js.map +1 -0
- package/dist/src/cli/paths.js +79 -0
- package/dist/src/cli/paths.js.map +1 -0
- package/dist/src/cli/payload.js +253 -0
- package/dist/src/cli/payload.js.map +1 -0
- package/dist/src/cli/policy.js +229 -0
- package/dist/src/cli/policy.js.map +1 -0
- package/dist/src/cli/preflight.js +888 -0
- package/dist/src/cli/preflight.js.map +1 -0
- package/dist/src/cli/progress.js +112 -0
- package/dist/src/cli/progress.js.map +1 -0
- package/dist/src/cli/prompt.js +312 -0
- package/dist/src/cli/prompt.js.map +1 -0
- package/dist/src/cli/records.js +66 -0
- package/dist/src/cli/records.js.map +1 -0
- package/dist/src/cli/render.js +132 -0
- package/dist/src/cli/render.js.map +1 -0
- package/dist/src/cli/sandbox.js +150 -0
- package/dist/src/cli/sandbox.js.map +1 -0
- package/dist/src/cli/scaffold.js +137 -0
- package/dist/src/cli/scaffold.js.map +1 -0
- package/dist/src/cli/setup-adapter.js +475 -0
- package/dist/src/cli/setup-adapter.js.map +1 -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.js +196 -0
- package/dist/src/cli/setup-checkpoint.js.map +1 -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.js +476 -0
- package/dist/src/cli/setup-flow.js.map +1 -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.js +473 -0
- package/dist/src/cli/setup.js.map +1 -0
- package/dist/src/cli/style.js +469 -0
- package/dist/src/cli/style.js.map +1 -0
- package/dist/src/cli/token.js +274 -0
- package/dist/src/cli/token.js.map +1 -0
- package/dist/src/cli/up.js +847 -0
- package/dist/src/cli/up.js.map +1 -0
- package/dist/src/cli/usage.js +91 -0
- package/dist/src/cli/usage.js.map +1 -0
- package/dist/src/cli/values.js +189 -0
- package/dist/src/cli/values.js.map +1 -0
- package/dist/src/cli/vault.js +362 -0
- package/dist/src/cli/vault.js.map +1 -0
- package/dist/src/cli/verb-registry.js +2173 -0
- package/dist/src/cli/verb-registry.js.map +1 -0
- package/dist/src/cli/wordmark.js +52 -0
- package/dist/src/cli/wordmark.js.map +1 -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.js +747 -0
- package/dist/src/core/agents-md.js.map +1 -0
- package/dist/src/core/attest.js +577 -0
- package/dist/src/core/attest.js.map +1 -0
- package/dist/src/core/audit.js +882 -0
- package/dist/src/core/audit.js.map +1 -0
- package/dist/src/core/budgets.js +449 -0
- package/dist/src/core/budgets.js.map +1 -0
- package/dist/src/core/checkpoint.js +738 -0
- package/dist/src/core/checkpoint.js.map +1 -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.js +43 -0
- package/dist/src/core/clock.js.map +1 -0
- package/dist/src/core/command-class.js +2321 -0
- package/dist/src/core/command-class.js.map +1 -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.js +136 -0
- package/dist/src/core/coverage-sources/gh.js.map +1 -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.js +337 -0
- package/dist/src/core/coverage.js.map +1 -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.js +714 -0
- package/dist/src/core/dark-session.js.map +1 -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.js +837 -0
- package/dist/src/core/env-file.js.map +1 -0
- package/dist/src/core/execute.js +1233 -0
- package/dist/src/core/execute.js.map +1 -0
- package/dist/src/core/frontmatter.js +100 -0
- package/dist/src/core/frontmatter.js.map +1 -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.js +2947 -0
- package/dist/src/core/gate.js.map +1 -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.js +210 -0
- package/dist/src/core/harness-version.js.map +1 -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.js +121 -0
- package/dist/src/core/head-retry.js.map +1 -0
- package/dist/src/core/instance.js +319 -0
- package/dist/src/core/instance.js.map +1 -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.js +132 -0
- package/dist/src/core/jcs.js.map +1 -0
- package/dist/src/core/journal.js +200 -0
- package/dist/src/core/journal.js.map +1 -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.js +136 -0
- package/dist/src/core/log-reconcile.js.map +1 -0
- package/dist/src/core/log.js +546 -0
- package/dist/src/core/log.js.map +1 -0
- package/dist/src/core/loop.js +476 -0
- package/dist/src/core/loop.js.map +1 -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.js +195 -0
- package/dist/src/core/money.js.map +1 -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.js +340 -0
- package/dist/src/core/payload-store.js.map +1 -0
- package/dist/src/core/payload.js +80 -0
- package/dist/src/core/payload.js.map +1 -0
- package/dist/src/core/policy-diff.js +565 -0
- package/dist/src/core/policy-diff.js.map +1 -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.js +230 -0
- package/dist/src/core/policy-explain.js.map +1 -0
- package/dist/src/core/policy-load.js +524 -0
- package/dist/src/core/policy-load.js.map +1 -0
- package/dist/src/core/policy-match.js +467 -0
- package/dist/src/core/policy-match.js.map +1 -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.js +422 -0
- package/dist/src/core/prompt-layout.js.map +1 -0
- package/dist/src/core/protected-path-guard.js +1087 -0
- package/dist/src/core/protected-path-guard.js.map +1 -0
- package/dist/src/core/registration.js +39 -0
- package/dist/src/core/registration.js.map +1 -0
- package/dist/src/core/reindex.js +336 -0
- package/dist/src/core/reindex.js.map +1 -0
- package/dist/src/core/sampler.js +388 -0
- package/dist/src/core/sampler.js.map +1 -0
- package/dist/src/core/sandbox.js +424 -0
- package/dist/src/core/sandbox.js.map +1 -0
- package/dist/src/core/seal.js +290 -0
- package/dist/src/core/seal.js.map +1 -0
- package/dist/src/core/state.js +1009 -0
- package/dist/src/core/state.js.map +1 -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.js +114 -0
- package/dist/src/core/telegram-config.js.map +1 -0
- package/dist/src/core/token.js +578 -0
- package/dist/src/core/token.js.map +1 -0
- package/dist/src/core/validate.js +0 -0
- package/dist/src/core/validate.js.map +1 -0
- package/dist/src/core/values.js +153 -0
- package/dist/src/core/values.js.map +1 -0
- package/dist/src/core/vault.js +612 -0
- package/dist/src/core/vault.js.map +1 -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.js +549 -0
- package/dist/src/core/verify.js.map +1 -0
- package/dist/src/core/version.js +9 -0
- package/dist/src/core/version.js.map +1 -0
- package/dist/src/core/wysiwys.js +728 -0
- package/dist/src/core/wysiwys.js.map +1 -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.js +849 -0
- package/dist/src/daemon/advance.js.map +1 -0
- package/dist/src/daemon/audit.js +90 -0
- package/dist/src/daemon/audit.js.map +1 -0
- package/dist/src/daemon/daemon.js +1988 -0
- package/dist/src/daemon/daemon.js.map +1 -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.js +132 -0
- package/dist/src/daemon/draw-child.js.map +1 -0
- package/dist/src/daemon/draw.js +458 -0
- package/dist/src/daemon/draw.js.map +1 -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.js +233 -0
- package/dist/src/daemon/projection.js.map +1 -0
- package/dist/src/daemon/prune.js +376 -0
- package/dist/src/daemon/prune.js.map +1 -0
- package/dist/src/mcp/http.js +343 -0
- package/dist/src/mcp/http.js.map +1 -0
- package/dist/src/mcp/server.js +594 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/docs/cli-reference.md +5363 -0
- package/package.json +43 -4
- package/schema/.gitkeep +0 -0
- package/schema/LICENSE +117 -0
- package/schema/envelope.schema.json +137 -0
- package/schema/event.schema.json +1810 -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 +481 -0
- package/schema/sample-record.schema.json +26 -0
- package/schema/values.schema.json +55 -0
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `approval setup adapter <name>` — fill the vault for one adapter (APRV-78).
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md §10.4 gives adapters an encrypted vault and `approval vault set` as
|
|
5
|
+
* the way in, and that verb is deliberately austere: one credential, one call,
|
|
6
|
+
* no prompt, the value from stdin or a named variable. It is the right shape
|
|
7
|
+
* for a script and the wrong shape for a person, who has to know that the email
|
|
8
|
+
* adapter wants five values, what each of them is called, which of them are
|
|
9
|
+
* secrets, that the port must be a port and the security setting one of three
|
|
10
|
+
* words, and that the user and the password are both-or-neither. All of that
|
|
11
|
+
* was written down only inside `adapters/email.ts`'s `act`, where nobody
|
|
12
|
+
* setting a machine up can read it.
|
|
13
|
+
*
|
|
14
|
+
* This verb reads the adapter's own manifest instead. The conversation is
|
|
15
|
+
* `cli/setup-flow.ts` and knows nothing about SMTP; the manifest is
|
|
16
|
+
* `EMAIL_CREDENTIAL_SPECS` and knows nothing about vaults or terminals; this
|
|
17
|
+
* file is the ten lines that join them, plus the two things that are genuinely
|
|
18
|
+
* about the pairing: what to do with the passphrase, and how to prove the
|
|
19
|
+
* result without sending anything.
|
|
20
|
+
*
|
|
21
|
+
* ## Where the values go, and where they do NOT
|
|
22
|
+
*
|
|
23
|
+
* **Into the vault, always.** Not the OS keystore, which is where `setup
|
|
24
|
+
* vault|sampling|channel <name>` put their secrets, and not `.approval/env`. The
|
|
25
|
+
* distinction is the one §10.4 draws: `.approval/env` holds what unlocks the
|
|
26
|
+
* machine (the human identity, the passphrase's source, the channel's token),
|
|
27
|
+
* and the vault holds what a gated adapter SPENDS inside a verified-token
|
|
28
|
+
* window. An SMTP password in `.approval/env` would be readable by
|
|
29
|
+
* `approval env` on demand, which is exactly the journey the vault exists to
|
|
30
|
+
* forbid.
|
|
31
|
+
*
|
|
32
|
+
* ## The passphrase is read, never established
|
|
33
|
+
*
|
|
34
|
+
* From the shell environment, under the name the policy declares, through
|
|
35
|
+
* {@link passphraseFrom} — and from nowhere else. **This verb never resolves
|
|
36
|
+
* `.approval/env` itself** (SPEC.md §11.1 invariant 7: no command loads that
|
|
37
|
+
* file implicitly, because a working-tree file any process read on its own
|
|
38
|
+
* would let anything able to write it act as you). It does READ the file, for
|
|
39
|
+
* one thing only: whether a line for the passphrase variable exists, which
|
|
40
|
+
* decides whether the refusal tells you to run `approval setup vault` or just
|
|
41
|
+
* to `eval "$(approval env)"`. A key's PRESENCE is not its value, and
|
|
42
|
+
* `planReplacements` has always read the file for exactly that.
|
|
43
|
+
*
|
|
44
|
+
* ## Verification sends nothing
|
|
45
|
+
*
|
|
46
|
+
* The proof is {@link probeSmtp}: the same session `sendMail` runs, up to and
|
|
47
|
+
* including AUTH, and then QUIT. It proves the host resolves, the port answers,
|
|
48
|
+
* the TLS mode is the one the server offers, and the credential is accepted. It
|
|
49
|
+
* does not prove a message would be delivered, and it puts no message on the
|
|
50
|
+
* wire — a setup verb that emailed somebody to prove itself would be a verb
|
|
51
|
+
* people run once and then avoid, which is `approval doctor`'s argument for
|
|
52
|
+
* calling `getMe` and nothing else.
|
|
53
|
+
*
|
|
54
|
+
* It is OFFERED, defaulting to YES, and a failure does not delete anything: the
|
|
55
|
+
* values stay, the refusal names the SMTP code and the server's first line
|
|
56
|
+
* (redacted), and the undo is printed as `approval vault remove <name>`. Values
|
|
57
|
+
* discarded by a wizard because a laptop was on a captive portal would be five
|
|
58
|
+
* more things to type.
|
|
59
|
+
*
|
|
60
|
+
* A PARTIAL RE-RUN is offered the same proof over the STORED set (APRV-99). It
|
|
61
|
+
* holds only what it just collected, so it reads the rest through
|
|
62
|
+
* {@link readEmailSmtpConfig} over a {@link vaultCredentialProvider}: the exact
|
|
63
|
+
* path `approval adapter email` takes at send time, in this process, printed by
|
|
64
|
+
* nothing. That is not a hole in "there is no verb that reads a credential
|
|
65
|
+
* out" — that rule is about what reaches a terminal, and nothing here does.
|
|
66
|
+
* Rotating an app password is the common case for this verb, and a probe no
|
|
67
|
+
* wider than the send it proves is the difference between a rotation you have
|
|
68
|
+
* checked and one you find out about from a bounce.
|
|
69
|
+
*/
|
|
70
|
+
import { envFilePathFor, readEnvFile } from "../core/env-file.js";
|
|
71
|
+
import { passphraseEnvFor, passphraseFrom, vaultExists, vaultPathFor } from "../core/vault.js";
|
|
72
|
+
import { DEFAULT_CREDENTIAL_NAMES, EMAIL_CREDENTIAL_SPECS, checkEmailCredentialSet, readEmailSmtpConfig, } from "../adapters/email.js";
|
|
73
|
+
import { AGENTMAIL_CREDENTIAL_SPECS, AGENTMAIL_SEND_PERMISSIONS, DEFAULT_AGENTMAIL_CREDENTIAL_NAMES, probeAgentmail, readAgentmailConfig, } from "../adapters/agentmail.js";
|
|
74
|
+
import { vaultCredentialProvider } from "../adapters/vault-provider.js";
|
|
75
|
+
import { isSmtpSecurity, probeSmtp } from "../adapters/smtp.js";
|
|
76
|
+
import { EXIT_OK } from "./exit-codes.js";
|
|
77
|
+
import { SETUP_ADAPTER_AGENTMAIL_HELP, SETUP_ADAPTER_EMAIL_HELP, SETUP_ADAPTER_HELP, } from "./help.js";
|
|
78
|
+
import { refusal as renderRefusal, style } from "./style.js";
|
|
79
|
+
import { confirmUntil } from "./prompt.js";
|
|
80
|
+
import { front, requireHuman, usageError, } from "./setup-common.js";
|
|
81
|
+
import { runCredentialFlow, vaultDestination, } from "./setup-flow.js";
|
|
82
|
+
/** The keystore read form for this machine, defaulting to the macOS one. */
|
|
83
|
+
function readBackCommand(kind, item) {
|
|
84
|
+
return kind === "secret-service"
|
|
85
|
+
? `secret-tool lookup approval ${item}`
|
|
86
|
+
: `security find-generic-password -a "$USER" -s ${item} -w`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The scripted path, GENERATED FROM THE MANIFEST rather than written out.
|
|
90
|
+
*
|
|
91
|
+
* A hand-written hint is a list of five commands that has to be edited every
|
|
92
|
+
* time the manifest changes and will not be. Generating it means the refusal an
|
|
93
|
+
* operator copies is, by construction, the set of names the adapter actually
|
|
94
|
+
* reads.
|
|
95
|
+
*
|
|
96
|
+
* The secret's line takes its value from the keystore's own reader, so the
|
|
97
|
+
* password is never an argument on any line printed here — the rule the rest of
|
|
98
|
+
* `setup` follows, applied to a verb whose whole subject is credentials.
|
|
99
|
+
*/
|
|
100
|
+
function manifestHint(specs, context) {
|
|
101
|
+
const lines = [
|
|
102
|
+
` # 1. establish the vault passphrase in ${context.passphraseEnv} and put it in this`,
|
|
103
|
+
` # shell. Every line below reads it from the environment and nowhere else:`,
|
|
104
|
+
` approval setup vault --as human:<id>`,
|
|
105
|
+
` eval "$(approval env)"`,
|
|
106
|
+
``,
|
|
107
|
+
` # 2. store each credential. The VALUE is never a command-line argument:`,
|
|
108
|
+
` # --value-env names a variable, and the variable is set for that one call.`,
|
|
109
|
+
];
|
|
110
|
+
for (const spec of specs) {
|
|
111
|
+
const call = `approval vault set ${spec.name} --value-env V --as human:<id>`;
|
|
112
|
+
if (spec.kind === "secret") {
|
|
113
|
+
lines.push(` V="$(${readBackCommand(context.kind, "<your-item>")})" \\`, ` ${call}`);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
const placeholder = spec.default ?? `<${spec.label.replace(/\s+/gu, "-")}>`;
|
|
117
|
+
lines.push(` V='${placeholder}' ${call}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return lines.join("\n");
|
|
121
|
+
}
|
|
122
|
+
/** Replace every occurrence of each secret. Nothing leaves this file with one. */
|
|
123
|
+
function redactor(secrets) {
|
|
124
|
+
const present = secrets.filter((secret) => secret.length > 0);
|
|
125
|
+
return (text) => {
|
|
126
|
+
let out = text;
|
|
127
|
+
for (const secret of present)
|
|
128
|
+
out = out.split(secret).join("<redacted>");
|
|
129
|
+
return out;
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/** Today's refusal for a partial run, kept verbatim as the fallback (APRV-99). */
|
|
133
|
+
function partialRefusal(skipped) {
|
|
134
|
+
return `\nnot verified: ${skipped.join(", ")} ${skipped.length === 1 ? "was" : "were"} left alone this run, so this verb does not hold the whole\nconfiguration, and it will not read the missing values back — there is no verb in\nthis CLI that reads a credential out of the vault. Re-run and replace all of them\nto probe the server.\n`;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* The session itself, and the two sentences it can end with.
|
|
138
|
+
*
|
|
139
|
+
* Shared by the first-run path and the stored-configuration path (APRV-99) so
|
|
140
|
+
* that a probe reports the same way whichever set it ran over: an operator
|
|
141
|
+
* rotating an app password is owed the proof they get on day one, in the words
|
|
142
|
+
* they got it in. `undo` is the list of names this run stored, because the undo
|
|
143
|
+
* for a failed probe is removing what was just written and nothing else.
|
|
144
|
+
*/
|
|
145
|
+
async function probeAndReport(config, scrub, probe, undo) {
|
|
146
|
+
const result = await probe({
|
|
147
|
+
host: config.host,
|
|
148
|
+
port: config.port,
|
|
149
|
+
security: config.security,
|
|
150
|
+
...(config.user === undefined ? {} : { user: config.user }),
|
|
151
|
+
...(config.password === undefined ? {} : { password: config.password }),
|
|
152
|
+
tlsRejectUnauthorized: true,
|
|
153
|
+
redact: scrub,
|
|
154
|
+
});
|
|
155
|
+
if (result.ok) {
|
|
156
|
+
return {
|
|
157
|
+
ok: true,
|
|
158
|
+
detail: `\nverified: ${config.host}:${String(config.port)} answered over ${config.security}, ${result.authenticated === null
|
|
159
|
+
? "with no login (neither a user nor a password is stored)"
|
|
160
|
+
: `and accepted the credential over AUTH ${result.authenticated}`}.\nNo message was sent: the session ran to AUTH and then QUIT.\n`,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
const lines = undo.map((name) => ` approval vault remove ${name} --as human:<id>`).join("\n");
|
|
164
|
+
return {
|
|
165
|
+
ok: false,
|
|
166
|
+
// APRV-102: the one refusal shape, here too. A probe failure is the last
|
|
167
|
+
// thing this verb prints before the operator decides what to fix.
|
|
168
|
+
detail: `${renderRefusal(style(), result.code, scrub(result.message))}\n\nThe values ARE stored — a probe that failed because a laptop is behind a captive\nportal is not a reason to make you type five things again. Fix the server or the\nsetting and re-run this verb, or undo it by hand:\n\n${lines}\n`,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* The partial re-run: offer to probe the configuration IN THE VAULT (APRV-99).
|
|
173
|
+
*
|
|
174
|
+
* This verb used to stop here, on the argument that it did not hold the whole
|
|
175
|
+
* configuration and that reading the rest back is the thing there is no verb
|
|
176
|
+
* for. The first half is true and the second half was the wrong inference.
|
|
177
|
+
* There is no verb that PRINTS a credential, and there still is not; but the
|
|
178
|
+
* email adapter reads all five out of the vault on every send, through
|
|
179
|
+
* {@link readEmailSmtpConfig} over a {@link vaultCredentialProvider}, and this
|
|
180
|
+
* function does exactly that and nothing more. The values are read into this
|
|
181
|
+
* process, handed to the same SMTP session `sendMail` opens, and dropped. No
|
|
182
|
+
* count, no prefix, no length, no value reaches a stream — the suite sweeps
|
|
183
|
+
* every captured byte for the fixture secrets on this path too. A probe that is
|
|
184
|
+
* no wider than the send it is proving does not widen the exposure; rotating an
|
|
185
|
+
* app password is the common case for this verb and it deserves the proof.
|
|
186
|
+
*
|
|
187
|
+
* When the vault will not open, or what it holds is not usable configuration,
|
|
188
|
+
* the answer is today's refusal verbatim plus one line naming why the probe
|
|
189
|
+
* could not run. The provider's sentences name the variable, the path and the
|
|
190
|
+
* credential NAME, never a value, and they are scrubbed with this run's own
|
|
191
|
+
* values before they are printed anyway.
|
|
192
|
+
*/
|
|
193
|
+
async function verifyStored(values, context) {
|
|
194
|
+
const refusal = partialRefusal(context.skipped);
|
|
195
|
+
const scrub = redactor(Object.values(values));
|
|
196
|
+
if (!confirmUntil(context.streams, context.prompter, `open an SMTP session using the stored configuration to check it?`, true)) {
|
|
197
|
+
return { ok: true, declined: true, detail: refusal };
|
|
198
|
+
}
|
|
199
|
+
const configured = readEmailSmtpConfig(context.credentials, DEFAULT_CREDENTIAL_NAMES);
|
|
200
|
+
if (!configured.ok) {
|
|
201
|
+
return {
|
|
202
|
+
ok: true,
|
|
203
|
+
declined: true,
|
|
204
|
+
detail: `${refusal}\nthe probe could not run: ${scrub(configured.message)}\n`,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
return probeAndReport(configured.config, redactor([...Object.values(values), ...configured.secrets]), context.probe, context.written);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* The email adapter's verification: one SMTP session that sends nothing.
|
|
211
|
+
*
|
|
212
|
+
* A run that collected the whole picture probes what it collected. A partial
|
|
213
|
+
* re-run hands off to {@link verifyStored}, which offers to probe what is in
|
|
214
|
+
* the vault, read the way the adapter reads it.
|
|
215
|
+
*/
|
|
216
|
+
async function verifyEmail(values, context) {
|
|
217
|
+
const names = DEFAULT_CREDENTIAL_NAMES;
|
|
218
|
+
if (context.skipped.length > 0)
|
|
219
|
+
return verifyStored(values, context);
|
|
220
|
+
const host = values[names.host];
|
|
221
|
+
const port = Number(values[names.port]);
|
|
222
|
+
const security = values[names.security];
|
|
223
|
+
if (host === undefined || !Number.isInteger(port) || !isSmtpSecurity(security)) {
|
|
224
|
+
return {
|
|
225
|
+
ok: true,
|
|
226
|
+
declined: true,
|
|
227
|
+
detail: `\nnot verified: the run did not collect ${names.host}, ${names.port} and ${names.security}\n`,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
const user = values[names.user];
|
|
231
|
+
const password = values[names.password];
|
|
232
|
+
const scrub = redactor([user ?? "", password ?? ""]);
|
|
233
|
+
if (!context.prompter.confirm(`open an SMTP session to ${host}:${String(port)} to check it? Nothing is sent`, false)) {
|
|
234
|
+
return {
|
|
235
|
+
ok: true,
|
|
236
|
+
declined: true,
|
|
237
|
+
detail: `\nstored and unverified: no connection was made. \`approval doctor\` does not probe SMTP\neither; the first proof will be the first \`approval adapter email\` send.\n`,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
return probeAndReport({
|
|
241
|
+
host,
|
|
242
|
+
port,
|
|
243
|
+
security: security,
|
|
244
|
+
...(user === undefined ? {} : { user }),
|
|
245
|
+
...(password === undefined ? {} : { password }),
|
|
246
|
+
}, scrub, context.probe, [names.host, names.port, names.security, names.user, names.password].filter((name) => values[name] !== undefined));
|
|
247
|
+
}
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
// agentmail (APRV-223)
|
|
250
|
+
// ---------------------------------------------------------------------------
|
|
251
|
+
/**
|
|
252
|
+
* What the probe can say about the stored key's own permissions.
|
|
253
|
+
*
|
|
254
|
+
* Three answers and not two, because "not disclosed" is not "none". AgentMail
|
|
255
|
+
* keys carry `draft_send` and `message_send` as separate booleans and the whole
|
|
256
|
+
* deployment this adapter assumes rests on the vault's key holding both while
|
|
257
|
+
* the agent's key holds neither. The inbox read this probe already makes is the
|
|
258
|
+
* only call it will make: probing a second endpoint nobody has confirmed exists
|
|
259
|
+
* would turn its 404 into a permissions verdict, which is a worse answer than
|
|
260
|
+
* saying plainly that the check could not be made. So a run that learns nothing
|
|
261
|
+
* prints the reminder, and only a disclosure names a missing permission.
|
|
262
|
+
*/
|
|
263
|
+
function permissionsLine(disclosed) {
|
|
264
|
+
if (disclosed === null) {
|
|
265
|
+
return `AgentMail disclosed no permissions for this key here, so nothing was checked: the key you\njust stored must carry ${AGENTMAIL_SEND_PERMISSIONS.join(" and ")}, and the key your AGENT holds must not.`;
|
|
266
|
+
}
|
|
267
|
+
const missing = AGENTMAIL_SEND_PERMISSIONS.filter((name) => !disclosed.includes(name));
|
|
268
|
+
if (missing.length === 0) {
|
|
269
|
+
return `The key carries ${AGENTMAIL_SEND_PERMISSIONS.join(" and ")}, which is what a granted send spends.`;
|
|
270
|
+
}
|
|
271
|
+
return `WARNING: this key does not carry ${missing.join(" and ")}. \`approval adapter agentmail\`\nwill be refused agentmail-unauthorized at send time, AFTER a human has granted it.\nStore a key that can send, and leave the one without those permissions to the agent.`;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* The AgentMail proof: `GET /v0/inboxes/{inbox_id}`, and nothing else.
|
|
275
|
+
*
|
|
276
|
+
* The same read `act` makes before every direct send, for the same two reasons:
|
|
277
|
+
* it establishes that the key opens this inbox, and it reports the address the
|
|
278
|
+
* inbox sends as, which is the address every approved message will actually
|
|
279
|
+
* come from. It puts no message anywhere.
|
|
280
|
+
*/
|
|
281
|
+
async function probeAgentmailAndReport(config, scrub, probe, apiBase, undo) {
|
|
282
|
+
const result = await probe(config, apiBase === undefined ? {} : { apiBase });
|
|
283
|
+
if (result.ok) {
|
|
284
|
+
return {
|
|
285
|
+
ok: true,
|
|
286
|
+
detail: `\nverified: the key opened the inbox ${config.inboxId}, which sends as ${result.address}.\nNo message was sent: the probe is one GET of the inbox.\n${permissionsLine(result.permissions)}\n`,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
const lines = undo.map((name) => ` approval vault remove ${name} --as human:<id>`).join("\n");
|
|
290
|
+
return {
|
|
291
|
+
ok: false,
|
|
292
|
+
detail: `${renderRefusal(style(), result.code, scrub(result.message))}\n\nThe values ARE stored — a probe that failed because a laptop is behind a captive\nportal is not a reason to make you type them again. Fix the key or the inbox id\nand re-run this verb, or undo it by hand:\n\n${lines}\n`,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* `setup adapter agentmail`'s verification.
|
|
297
|
+
*
|
|
298
|
+
* One shape for both runs, unlike the email adapter's: this manifest is two
|
|
299
|
+
* values, so a partial re-run is a rotation of the key with the inbox left
|
|
300
|
+
* alone, and the read that proves it is the same one either way. It goes
|
|
301
|
+
* through {@link readAgentmailConfig} over the vault whenever the run does not
|
|
302
|
+
* hold both values, which is the exact path `approval adapter agentmail` takes
|
|
303
|
+
* at send time and prints nothing.
|
|
304
|
+
*/
|
|
305
|
+
async function verifyAgentmail(values, context) {
|
|
306
|
+
const names = DEFAULT_AGENTMAIL_CREDENTIAL_NAMES;
|
|
307
|
+
const probe = probeAgentmail;
|
|
308
|
+
const scrub = redactor(Object.values(values));
|
|
309
|
+
if (!confirmUntil(context.streams, context.prompter, `read the inbox from AgentMail to check the key? Nothing is sent`, true)) {
|
|
310
|
+
return {
|
|
311
|
+
ok: true,
|
|
312
|
+
declined: true,
|
|
313
|
+
detail: `\nstored and unverified: no request was made. The first proof will be the first\n\`approval adapter agentmail\` send, which is a proof a human has already granted.\n`,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
const inboxId = values[names.inboxId];
|
|
317
|
+
const apiKey = values[names.apiKey];
|
|
318
|
+
if (inboxId !== undefined && apiKey !== undefined) {
|
|
319
|
+
return probeAgentmailAndReport({ inboxId, apiKey }, scrub, probe, context.apiBase, context.written);
|
|
320
|
+
}
|
|
321
|
+
// A partial re-run: read what the vault holds, the way the adapter reads it.
|
|
322
|
+
const configured = readAgentmailConfig(context.credentials, names);
|
|
323
|
+
if (!configured.ok) {
|
|
324
|
+
return {
|
|
325
|
+
ok: true,
|
|
326
|
+
declined: true,
|
|
327
|
+
detail: `${partialRefusal(context.skipped)}\nthe probe could not run: ${scrub(configured.message)}\n`,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
return probeAgentmailAndReport(configured.config, redactor([...Object.values(values), ...configured.secrets]), probe, context.apiBase, context.written);
|
|
331
|
+
}
|
|
332
|
+
/** Every adapter this verb can configure. Keyed by the `adapter <name>` name. */
|
|
333
|
+
export const ADAPTER_SETUPS = {
|
|
334
|
+
email: {
|
|
335
|
+
specs: EMAIL_CREDENTIAL_SPECS,
|
|
336
|
+
check: (values, kept) => checkEmailCredentialSet(values, DEFAULT_CREDENTIAL_NAMES, kept),
|
|
337
|
+
summary: "the SMTP settings `approval adapter email` reads inside the verified-token window",
|
|
338
|
+
help: SETUP_ADAPTER_EMAIL_HELP,
|
|
339
|
+
hint: (context) => manifestHint(EMAIL_CREDENTIAL_SPECS, context),
|
|
340
|
+
verify: verifyEmail,
|
|
341
|
+
nextSteps: [
|
|
342
|
+
`Check the names (never the values) with:`,
|
|
343
|
+
``,
|
|
344
|
+
` approval vault list --as human:<id>`,
|
|
345
|
+
``,
|
|
346
|
+
`The adapter reads them itself, inside the token window; nothing else does.`,
|
|
347
|
+
],
|
|
348
|
+
},
|
|
349
|
+
agentmail: {
|
|
350
|
+
specs: AGENTMAIL_CREDENTIAL_SPECS,
|
|
351
|
+
summary: "the AgentMail inbox and sending key `approval adapter agentmail` reads inside the verified-token window",
|
|
352
|
+
help: SETUP_ADAPTER_AGENTMAIL_HELP,
|
|
353
|
+
hint: (context) => manifestHint(AGENTMAIL_CREDENTIAL_SPECS, context),
|
|
354
|
+
verify: verifyAgentmail,
|
|
355
|
+
nextSteps: [
|
|
356
|
+
`Check the names (never the values) with:`,
|
|
357
|
+
``,
|
|
358
|
+
` approval vault list --as human:<id>`,
|
|
359
|
+
``,
|
|
360
|
+
`The key stored here is the one that CAN send. Give the agent a different key,`,
|
|
361
|
+
`without ${AGENTMAIL_SEND_PERMISSIONS.join(" or ")}, in AGENTMAIL_API_KEY: that key composes`,
|
|
362
|
+
`drafts, and \`approval payload agentmail-draft\` snapshots one for a human to read.`,
|
|
363
|
+
],
|
|
364
|
+
},
|
|
365
|
+
};
|
|
366
|
+
/** The known names, sorted, for a usage error and for the help text. */
|
|
367
|
+
export function knownAdapterNames() {
|
|
368
|
+
return Object.keys(ADAPTER_SETUPS).sort();
|
|
369
|
+
}
|
|
370
|
+
// ---------------------------------------------------------------------------
|
|
371
|
+
// The verb
|
|
372
|
+
// ---------------------------------------------------------------------------
|
|
373
|
+
/**
|
|
374
|
+
* The refusal for an unset passphrase.
|
|
375
|
+
*
|
|
376
|
+
* Two shapes, and the difference is a diagnosis: no vault file AND no line for
|
|
377
|
+
* the variable means nobody has ever established one, so the repair starts with
|
|
378
|
+
* `approval setup vault`. Anything else means the passphrase exists and this
|
|
379
|
+
* shell has not evaluated it, so the repair is one line. A verb that printed
|
|
380
|
+
* both every time would train the operator to skim past the one that mattered.
|
|
381
|
+
*/
|
|
382
|
+
function passphraseHint(variable, logPath, envPath) {
|
|
383
|
+
const file = readEnvFile(envPath);
|
|
384
|
+
// Reading the file for a KEY'S PRESENCE, never for a value, and never
|
|
385
|
+
// resolving it: SPEC.md §11.1 invariant 7 forbids the resolution, not the
|
|
386
|
+
// stat. An unreadable file is treated as "no line", which is the fail-closed
|
|
387
|
+
// reading: it produces the longer hint, never the shorter one.
|
|
388
|
+
const hasLine = file.ok && file.entries.some((entry) => entry.key === variable);
|
|
389
|
+
const established = hasLine || vaultExists(vaultPathFor(logPath));
|
|
390
|
+
return established
|
|
391
|
+
? `The passphrase is recorded but not in this shell. Establish it with:\n\n eval "$(approval env)"`
|
|
392
|
+
: `Nobody has established a vault passphrase here. Do that first, then evaluate it:\n\n approval setup vault --as human:<id>\n eval "$(approval env)"`;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* `approval setup adapter <name>` — the interactive writer for one adapter's
|
|
396
|
+
* credentials. HUMAN-ONLY.
|
|
397
|
+
*
|
|
398
|
+
* `argv` starts at the adapter's name: `commandSetup` has already eaten
|
|
399
|
+
* `adapter`.
|
|
400
|
+
*/
|
|
401
|
+
export async function commandSetupAdapter(argv, streams, cwd, deps = {}) {
|
|
402
|
+
const json = argv.includes("--json");
|
|
403
|
+
const name = argv[0];
|
|
404
|
+
// The name is resolved BEFORE the terminal check, so that a typo is answered
|
|
405
|
+
// with "here are the adapters" rather than with a lecture about pipes.
|
|
406
|
+
if (name === "--help" || name === "-h" || name === "help") {
|
|
407
|
+
streams.out(`${SETUP_ADAPTER_HELP}\n`);
|
|
408
|
+
return EXIT_OK;
|
|
409
|
+
}
|
|
410
|
+
if (name === undefined || name.startsWith("-")) {
|
|
411
|
+
return usageError(streams, json, `missing <name> for \`approval setup adapter\`; known adapters: ${knownAdapterNames().join(", ")}`, SETUP_ADAPTER_HELP);
|
|
412
|
+
}
|
|
413
|
+
// Own keys only, for the reason `cli/adapter.ts` gives (APRV-223): every
|
|
414
|
+
// string names something on `Object.prototype` before it names an adapter.
|
|
415
|
+
const entry = Object.hasOwn(ADAPTER_SETUPS, name) ? ADAPTER_SETUPS[name] : undefined;
|
|
416
|
+
if (entry === undefined) {
|
|
417
|
+
return usageError(streams, json, `unknown adapter ${JSON.stringify(name)}; known adapters: ${knownAdapterNames().join(", ")}`, SETUP_ADAPTER_HELP);
|
|
418
|
+
}
|
|
419
|
+
// The adapter's own help, from the table entry the name resolved to: the
|
|
420
|
+
// generic SETUP_ADAPTER_HELP is for the errors that happen BEFORE a name
|
|
421
|
+
// resolves, and for nothing after this line.
|
|
422
|
+
const helpText = entry.help;
|
|
423
|
+
const outcome = front(`adapter ${name}`, argv.slice(1), streams, cwd, deps, helpText, (context) => entry.hint(context));
|
|
424
|
+
if (outcome.kind === "handled")
|
|
425
|
+
return outcome.code;
|
|
426
|
+
const context = outcome;
|
|
427
|
+
const extra = context.positionals[0];
|
|
428
|
+
if (extra !== undefined) {
|
|
429
|
+
return usageError(streams, false, `unexpected argument ${JSON.stringify(extra)}`, helpText);
|
|
430
|
+
}
|
|
431
|
+
const human = requireHuman(context.flags, streams, helpText, `adapter ${name}`);
|
|
432
|
+
if (!human.ok)
|
|
433
|
+
return human.code;
|
|
434
|
+
// The passphrase, from the SHELL environment under the policy's name. Never
|
|
435
|
+
// from `.approval/env` directly: §11.1 invariant 7.
|
|
436
|
+
const variable = passphraseEnvFor(context.load);
|
|
437
|
+
const passphrase = passphraseFrom(variable, deps.env ?? process.env);
|
|
438
|
+
if (passphrase === null) {
|
|
439
|
+
return usageError(streams, false, `${variable} is unset or empty: the vault passphrase is read from that environment variable and from nowhere else, and this verb creates nothing without it. Nothing was stored and no vault was created.\n\n${passphraseHint(variable, context.logPath, envFilePathFor(context.logPath))}`, helpText);
|
|
440
|
+
}
|
|
441
|
+
const vaultPath = vaultPathFor(context.logPath);
|
|
442
|
+
const probe = deps.probe ?? probeSmtp;
|
|
443
|
+
// The adapter's own reader over the same vault, for the partial-re-run probe
|
|
444
|
+
// (APRV-99). Built here and not in the hook so that this file keeps the one
|
|
445
|
+
// fact the hook has no business knowing: which file, and under which
|
|
446
|
+
// variable. Lazy, so a first run never opens it.
|
|
447
|
+
const credentials = deps.credentials ??
|
|
448
|
+
vaultCredentialProvider({ vaultPath }, { passphraseEnv: variable, env: deps.env ?? process.env });
|
|
449
|
+
const result = await runCredentialFlow({
|
|
450
|
+
streams,
|
|
451
|
+
prompter: context.prompter,
|
|
452
|
+
specs: entry.specs,
|
|
453
|
+
destination: vaultDestination(vaultPath, passphrase),
|
|
454
|
+
labels: {
|
|
455
|
+
title: `approval setup adapter ${name} — ${entry.summary}.`,
|
|
456
|
+
prereq: `The values go into the VAULT, not into the OS keystore and not into\n.approval/env: what this verb stores is what a gated adapter spends inside a\nverified-token window. Nothing here appends to the log or attests anything.`,
|
|
457
|
+
nextSteps: entry.nextSteps,
|
|
458
|
+
},
|
|
459
|
+
hooks: {
|
|
460
|
+
...(entry.check === undefined ? {} : { check: entry.check }),
|
|
461
|
+
verify: (values, progress) => entry.verify(values, {
|
|
462
|
+
written: progress.written,
|
|
463
|
+
skipped: progress.skipped,
|
|
464
|
+
streams,
|
|
465
|
+
prompter: context.prompter,
|
|
466
|
+
probe,
|
|
467
|
+
...(deps.apiBase === undefined ? {} : { apiBase: deps.apiBase }),
|
|
468
|
+
credentials,
|
|
469
|
+
}),
|
|
470
|
+
},
|
|
471
|
+
});
|
|
472
|
+
// The flow decided the code; this verb adds nothing to it.
|
|
473
|
+
return result.code;
|
|
474
|
+
}
|
|
475
|
+
//# sourceMappingURL=setup-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-adapter.js","sourceRoot":"","sources":["../../../src/cli/setup-adapter.ts"],"names":[],"mappings":"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"}
|