run402 4.94.0 → 4.96.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/README.md +23 -23
- package/cli.mjs +8 -40
- package/core-dist/keystore.js +1 -1
- package/git-remote-run402.mjs +6 -6
- package/lib/admin.mjs +5 -5
- package/lib/ai.mjs +5 -5
- package/lib/apps.mjs +9 -9
- package/lib/archives.mjs +371 -8
- package/lib/argparse.mjs +5 -5
- package/lib/assets.mjs +12 -12
- package/lib/auth.mjs +34 -34
- package/lib/branches.mjs +7 -7
- package/lib/buzz-doctor.mjs +1 -1
- package/lib/buzz-notifications.mjs +4 -4
- package/lib/buzz.mjs +2 -2
- package/lib/cache.mjs +1 -1
- package/lib/cdn.mjs +2 -2
- package/lib/ci.mjs +8 -8
- package/lib/claims.mjs +2 -2
- package/lib/cold-start.mjs +2 -2
- package/lib/command-manifest.mjs +37 -76
- package/lib/config.mjs +4 -4
- package/lib/contacts.mjs +3 -3
- package/lib/contracts.mjs +11 -11
- package/lib/credentials.mjs +32 -32
- package/lib/daemon-path.mjs +3 -3
- package/lib/delegates.mjs +13 -13
- package/lib/deliveries.mjs +2 -2
- package/lib/deploy-v2.mjs +26 -26
- package/lib/dev.mjs +3 -3
- package/lib/doctor.mjs +49 -58
- package/lib/domains.mjs +27 -27
- package/lib/email.mjs +38 -38
- package/lib/errors.mjs +40 -24
- package/lib/escalations.mjs +4 -4
- package/lib/events.mjs +32 -25
- package/lib/feedback.mjs +2 -2
- package/lib/functions.mjs +34 -34
- package/lib/grants.mjs +7 -7
- package/lib/image.mjs +7 -7
- package/lib/init.mjs +32 -32
- package/lib/jobs.mjs +15 -15
- package/lib/live.mjs +1 -1
- package/lib/logs.mjs +8 -8
- package/lib/messages.mjs +5 -5
- package/lib/next-actions.mjs +2 -2
- package/lib/org-context.mjs +22 -22
- package/lib/{org.mjs → orgs.mjs} +140 -179
- package/lib/path-lookup.mjs +7 -10
- package/lib/path-lookup.test.mjs +19 -21
- package/lib/projects.mjs +45 -56
- package/lib/remote-helper-session.mjs +93 -93
- package/lib/repos.mjs +196 -197
- package/lib/rooms-context.mjs +7 -7
- package/lib/rooms.mjs +2 -2
- package/lib/sdk-errors.mjs +1 -1
- package/lib/secrets.mjs +13 -13
- package/lib/sites.mjs +14 -14
- package/lib/snapshots.mjs +10 -10
- package/lib/subdomains.mjs +12 -12
- package/lib/subscriptions.mjs +2 -2
- package/lib/transfer.mjs +1 -1
- package/lib/up.mjs +21 -21
- package/lib/{gitvault-capabilities.mjs → vault-capabilities.mjs} +10 -14
- package/lib/{gitvault-daemon-run.mjs → vault-daemon-run.mjs} +2 -2
- package/lib/{gitvault-daemon.mjs → vault-daemon.mjs} +23 -23
- package/lib/{gitvault-scaffold.mjs → vault-scaffold.mjs} +14 -14
- package/lib/{gitvault-target.mjs → vault-target.mjs} +22 -17
- package/lib/wallet-context.mjs +1 -1
- package/lib/wallets.mjs +1 -1
- package/lib/webhooks.mjs +8 -8
- package/lib/whoami.mjs +32 -5
- package/package.json +2 -2
- package/sdk/core-dist/keystore.js +1 -1
- package/sdk/dist/actions.d.ts +3 -3
- package/sdk/dist/actions.d.ts.map +1 -1
- package/sdk/dist/app-up.d.ts +2 -2
- package/sdk/dist/app-up.d.ts.map +1 -1
- package/sdk/dist/config.d.ts +1 -2
- package/sdk/dist/config.d.ts.map +1 -1
- package/sdk/dist/config.js.map +1 -1
- package/sdk/dist/credentials.d.ts +1 -1
- package/sdk/dist/errors.d.ts +6 -6
- package/sdk/dist/errors.d.ts.map +1 -1
- package/sdk/dist/errors.js +1 -1
- package/sdk/dist/errors.js.map +1 -1
- package/sdk/dist/index.d.ts +9 -9
- package/sdk/dist/index.d.ts.map +1 -1
- package/sdk/dist/index.js +9 -9
- package/sdk/dist/index.js.map +1 -1
- package/sdk/dist/namespaces/admin.d.ts +1 -1
- package/sdk/dist/namespaces/admin.d.ts.map +1 -1
- package/sdk/dist/namespaces/ai.d.ts +1 -1
- package/sdk/dist/namespaces/ai.js +2 -2
- package/sdk/dist/namespaces/ai.js.map +1 -1
- package/sdk/dist/namespaces/assets.js +1 -1
- package/sdk/dist/namespaces/assets.js.map +1 -1
- package/sdk/dist/namespaces/ci.js +3 -3
- package/sdk/dist/namespaces/ci.js.map +1 -1
- package/sdk/dist/namespaces/deploy.d.ts +5 -5
- package/sdk/dist/namespaces/deploy.d.ts.map +1 -1
- package/sdk/dist/namespaces/deploy.js +45 -46
- package/sdk/dist/namespaces/deploy.js.map +1 -1
- package/sdk/dist/namespaces/deploy.types.d.ts +19 -19
- package/sdk/dist/namespaces/deploy.types.d.ts.map +1 -1
- package/sdk/dist/namespaces/domains.d.ts +10 -2
- package/sdk/dist/namespaces/domains.d.ts.map +1 -1
- package/sdk/dist/namespaces/domains.js +10 -5
- package/sdk/dist/namespaces/domains.js.map +1 -1
- package/sdk/dist/namespaces/errors.js +1 -1
- package/sdk/dist/namespaces/functions.js +1 -1
- package/sdk/dist/namespaces/functions.js.map +1 -1
- package/sdk/dist/namespaces/org.d.ts +2 -2
- package/sdk/dist/namespaces/org.js +2 -2
- package/sdk/dist/namespaces/org.types.d.ts +3 -3
- package/sdk/dist/namespaces/pay.js +1 -1
- package/sdk/dist/namespaces/{gitvault.d.ts → repos.d.ts} +438 -451
- package/sdk/dist/namespaces/repos.d.ts.map +1 -0
- package/sdk/dist/namespaces/{gitvault.js → repos.js} +454 -462
- package/sdk/dist/namespaces/repos.js.map +1 -0
- package/sdk/dist/namespaces/rooms.js +2 -2
- package/sdk/dist/namespaces/rooms.js.map +1 -1
- package/sdk/dist/namespaces/session.d.ts +2 -2
- package/sdk/dist/namespaces/session.d.ts.map +1 -1
- package/sdk/dist/namespaces/session.js +2 -2
- package/sdk/dist/namespaces/session.js.map +1 -1
- package/sdk/dist/namespaces/tier.d.ts +4 -4
- package/sdk/dist/namespaces/tier.d.ts.map +1 -1
- package/sdk/dist/namespaces/transfers.d.ts +46 -15
- package/sdk/dist/namespaces/transfers.d.ts.map +1 -1
- package/sdk/dist/namespaces/transfers.js.map +1 -1
- package/sdk/dist/namespaces/{gitvault.crypto.d.ts → vault.crypto.d.ts} +141 -141
- package/sdk/dist/namespaces/vault.crypto.d.ts.map +1 -0
- package/sdk/dist/namespaces/{gitvault.crypto.js → vault.crypto.js} +173 -173
- package/sdk/dist/namespaces/vault.crypto.js.map +1 -0
- package/sdk/dist/namespaces/{gitvault.types.d.ts → vault.types.d.ts} +136 -136
- package/sdk/dist/namespaces/vault.types.d.ts.map +1 -0
- package/sdk/dist/namespaces/{gitvault.types.js → vault.types.js} +4 -4
- package/sdk/dist/namespaces/vault.types.js.map +1 -0
- package/sdk/dist/node/actions-node.js +8 -8
- package/sdk/dist/node/actions-node.js.map +1 -1
- package/sdk/dist/node/assets-node.js +6 -6
- package/sdk/dist/node/assets-node.js.map +1 -1
- package/sdk/dist/node/bearer-redeem-key.d.ts +1 -1
- package/sdk/dist/node/bearer-redeem-key.js +5 -5
- package/sdk/dist/node/bearer-redeem-key.js.map +1 -1
- package/sdk/dist/node/ci.js +1 -1
- package/sdk/dist/node/ci.js.map +1 -1
- package/sdk/dist/node/credentials.d.ts +1 -1
- package/sdk/dist/node/credentials.js +1 -1
- package/sdk/dist/node/deploy-manifest.d.ts +3 -5
- package/sdk/dist/node/deploy-manifest.d.ts.map +1 -1
- package/sdk/dist/node/deploy-manifest.js +3 -12
- package/sdk/dist/node/deploy-manifest.js.map +1 -1
- package/sdk/dist/node/http-dispatcher.js +5 -5
- package/sdk/dist/node/http-dispatcher.js.map +1 -1
- package/sdk/dist/node/index.d.ts +29 -29
- package/sdk/dist/node/index.d.ts.map +1 -1
- package/sdk/dist/node/index.js +39 -39
- package/sdk/dist/node/index.js.map +1 -1
- package/sdk/dist/node/manifest-export.js +2 -2
- package/sdk/dist/node/manifest-export.js.map +1 -1
- package/sdk/dist/node/org-adopt.js +1 -1
- package/sdk/dist/node/org-adopt.js.map +1 -1
- package/sdk/dist/node/sites-node.js +1 -1
- package/sdk/dist/node/sites-node.js.map +1 -1
- package/sdk/dist/node/{gitvault-address.d.ts → vault-address.d.ts} +42 -42
- package/sdk/dist/node/vault-address.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-address.js → vault-address.js} +43 -43
- package/sdk/dist/node/vault-address.js.map +1 -0
- package/sdk/dist/node/{gitvault-apply.d.ts → vault-apply.d.ts} +27 -27
- package/sdk/dist/node/vault-apply.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-apply.js → vault-apply.js} +38 -38
- package/sdk/dist/node/vault-apply.js.map +1 -0
- package/sdk/dist/node/vault-byo-config.d.ts +29 -0
- package/sdk/dist/node/vault-byo-config.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-byo-config.js → vault-byo-config.js} +18 -18
- package/sdk/dist/node/vault-byo-config.js.map +1 -0
- package/sdk/dist/node/vault-byo-probe.d.ts +20 -0
- package/sdk/dist/node/vault-byo-probe.d.ts.map +1 -0
- package/sdk/dist/node/vault-byo-probe.js +57 -0
- package/sdk/dist/node/vault-byo-probe.js.map +1 -0
- package/sdk/dist/node/{gitvault-creation-journal.d.ts → vault-creation-journal.d.ts} +69 -69
- package/sdk/dist/node/vault-creation-journal.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-creation-journal.js → vault-creation-journal.js} +54 -54
- package/sdk/dist/node/vault-creation-journal.js.map +1 -0
- package/sdk/dist/node/{gitvault-degraded-read.d.ts → vault-degraded-read.d.ts} +34 -34
- package/sdk/dist/node/vault-degraded-read.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-degraded-read.js → vault-degraded-read.js} +24 -24
- package/sdk/dist/node/vault-degraded-read.js.map +1 -0
- package/sdk/dist/node/{gitvault-deploy.d.ts → vault-deploy.d.ts} +67 -67
- package/sdk/dist/node/vault-deploy.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-deploy.js → vault-deploy.js} +27 -27
- package/sdk/dist/node/vault-deploy.js.map +1 -0
- package/sdk/dist/node/{gitvault-edge-fetch.d.ts → vault-edge-fetch.d.ts} +9 -9
- package/sdk/dist/node/vault-edge-fetch.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-edge-fetch.js → vault-edge-fetch.js} +11 -11
- package/sdk/dist/node/vault-edge-fetch.js.map +1 -0
- package/sdk/dist/node/{gitvault-handoff.d.ts → vault-handoff.d.ts} +9 -9
- package/sdk/dist/node/vault-handoff.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-handoff.js → vault-handoff.js} +24 -24
- package/sdk/dist/node/vault-handoff.js.map +1 -0
- package/sdk/dist/node/{gitvault-keystore.d.ts → vault-keystore.d.ts} +87 -77
- package/sdk/dist/node/vault-keystore.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-keystore.js → vault-keystore.js} +105 -68
- package/sdk/dist/node/vault-keystore.js.map +1 -0
- package/sdk/dist/node/{gitvault-member-bundle.d.ts → vault-member-bundle.d.ts} +17 -17
- package/sdk/dist/node/vault-member-bundle.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-member-bundle.js → vault-member-bundle.js} +11 -11
- package/sdk/dist/node/vault-member-bundle.js.map +1 -0
- package/sdk/dist/node/{gitvault-mirror-backend.d.ts → vault-mirror-backend.d.ts} +26 -26
- package/sdk/dist/node/vault-mirror-backend.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-mirror-backend.js → vault-mirror-backend.js} +25 -25
- package/sdk/dist/node/vault-mirror-backend.js.map +1 -0
- package/sdk/dist/node/{gitvault-mirror-config.d.ts → vault-mirror-config.d.ts} +23 -23
- package/sdk/dist/node/vault-mirror-config.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-mirror-config.js → vault-mirror-config.js} +16 -16
- package/sdk/dist/node/vault-mirror-config.js.map +1 -0
- package/sdk/dist/node/{gitvault-mirror.d.ts → vault-mirror.d.ts} +36 -36
- package/sdk/dist/node/vault-mirror.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-mirror.js → vault-mirror.js} +75 -75
- package/sdk/dist/node/vault-mirror.js.map +1 -0
- package/sdk/dist/node/{gitvault-native-crypto.d.ts → vault-native-crypto.d.ts} +10 -10
- package/sdk/dist/node/vault-native-crypto.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-native-crypto.js → vault-native-crypto.js} +16 -16
- package/sdk/dist/node/vault-native-crypto.js.map +1 -0
- package/sdk/dist/node/{gitvault-open-or-create.d.ts → vault-open-or-create.d.ts} +16 -16
- package/sdk/dist/node/vault-open-or-create.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-open-or-create.js → vault-open-or-create.js} +10 -10
- package/sdk/dist/node/vault-open-or-create.js.map +1 -0
- package/sdk/dist/node/{gitvault-prewarm.d.ts → vault-prewarm.d.ts} +13 -13
- package/sdk/dist/node/vault-prewarm.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-prewarm.js → vault-prewarm.js} +25 -25
- package/sdk/dist/node/vault-prewarm.js.map +1 -0
- package/sdk/dist/node/{gitvault-profile-scan.d.ts → vault-profile-scan.d.ts} +3 -3
- package/sdk/dist/node/vault-profile-scan.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-profile-scan.js → vault-profile-scan.js} +12 -12
- package/sdk/dist/node/vault-profile-scan.js.map +1 -0
- package/sdk/dist/node/{gitvault-prune.d.ts → vault-prune.d.ts} +61 -61
- package/sdk/dist/node/vault-prune.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-prune.js → vault-prune.js} +34 -34
- package/sdk/dist/node/vault-prune.js.map +1 -0
- package/sdk/dist/node/{gitvault-publication.d.ts → vault-publication.d.ts} +399 -399
- package/sdk/dist/node/vault-publication.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-publication.js → vault-publication.js} +584 -584
- package/sdk/dist/node/vault-publication.js.map +1 -0
- package/sdk/dist/node/{gitvault-push-to-create.d.ts → vault-push-to-create.d.ts} +16 -16
- package/sdk/dist/node/vault-push-to-create.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-push-to-create.js → vault-push-to-create.js} +9 -9
- package/sdk/dist/node/vault-push-to-create.js.map +1 -0
- package/sdk/dist/node/{gitvault-recover.d.ts → vault-recover.d.ts} +50 -50
- package/sdk/dist/node/vault-recover.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-recover.js → vault-recover.js} +84 -84
- package/sdk/dist/node/vault-recover.js.map +1 -0
- package/sdk/dist/node/{gitvault-restore.d.ts → vault-restore.d.ts} +8 -8
- package/sdk/dist/node/vault-restore.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-restore.js → vault-restore.js} +11 -11
- package/sdk/dist/node/vault-restore.js.map +1 -0
- package/sdk/dist/node/{gitvault-snapshot.d.ts → vault-snapshot.d.ts} +48 -48
- package/sdk/dist/node/vault-snapshot.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-snapshot.js → vault-snapshot.js} +61 -61
- package/sdk/dist/node/vault-snapshot.js.map +1 -0
- package/sdk/dist/node/{gitvault-writer-state.d.ts → vault-writer-state.d.ts} +8 -8
- package/sdk/dist/node/vault-writer-state.d.ts.map +1 -0
- package/sdk/dist/node/{gitvault-writer-state.js → vault-writer-state.js} +15 -15
- package/sdk/dist/node/vault-writer-state.js.map +1 -0
- package/sdk/dist/node/workflow-output.js +4 -4
- package/sdk/dist/node/workflow-output.js.map +1 -1
- package/sdk/dist/scoped.d.ts +8 -8
- package/sdk/dist/scoped.d.ts.map +1 -1
- package/sdk/dist/scoped.js +3 -3
- package/sdk/dist/scoped.js.map +1 -1
- package/vault-surface.json +40 -0
- package/gitvault-surface.json +0 -89
- package/lib/cloud.mjs +0 -256
- package/lib/core.mjs +0 -123
- package/lib/gitvault.mjs +0 -163
- package/lib/source-access.mjs +0 -70
- package/sdk/dist/namespaces/gitvault.crypto.d.ts.map +0 -1
- package/sdk/dist/namespaces/gitvault.crypto.js.map +0 -1
- package/sdk/dist/namespaces/gitvault.d.ts.map +0 -1
- package/sdk/dist/namespaces/gitvault.js.map +0 -1
- package/sdk/dist/namespaces/gitvault.types.d.ts.map +0 -1
- package/sdk/dist/namespaces/gitvault.types.js.map +0 -1
- package/sdk/dist/node/gitvault-address.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-address.js.map +0 -1
- package/sdk/dist/node/gitvault-apply.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-apply.js.map +0 -1
- package/sdk/dist/node/gitvault-byo-config.d.ts +0 -29
- package/sdk/dist/node/gitvault-byo-config.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-byo-config.js.map +0 -1
- package/sdk/dist/node/gitvault-byo-probe.d.ts +0 -20
- package/sdk/dist/node/gitvault-byo-probe.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-byo-probe.js +0 -57
- package/sdk/dist/node/gitvault-byo-probe.js.map +0 -1
- package/sdk/dist/node/gitvault-creation-journal.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-creation-journal.js.map +0 -1
- package/sdk/dist/node/gitvault-degraded-read.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-degraded-read.js.map +0 -1
- package/sdk/dist/node/gitvault-deploy.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-deploy.js.map +0 -1
- package/sdk/dist/node/gitvault-edge-fetch.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-edge-fetch.js.map +0 -1
- package/sdk/dist/node/gitvault-handoff.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-handoff.js.map +0 -1
- package/sdk/dist/node/gitvault-keystore.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-keystore.js.map +0 -1
- package/sdk/dist/node/gitvault-member-bundle.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-member-bundle.js.map +0 -1
- package/sdk/dist/node/gitvault-mirror-backend.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-mirror-backend.js.map +0 -1
- package/sdk/dist/node/gitvault-mirror-config.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-mirror-config.js.map +0 -1
- package/sdk/dist/node/gitvault-mirror.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-mirror.js.map +0 -1
- package/sdk/dist/node/gitvault-native-crypto.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-native-crypto.js.map +0 -1
- package/sdk/dist/node/gitvault-open-or-create.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-open-or-create.js.map +0 -1
- package/sdk/dist/node/gitvault-prewarm.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-prewarm.js.map +0 -1
- package/sdk/dist/node/gitvault-profile-scan.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-profile-scan.js.map +0 -1
- package/sdk/dist/node/gitvault-prune.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-prune.js.map +0 -1
- package/sdk/dist/node/gitvault-publication.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-publication.js.map +0 -1
- package/sdk/dist/node/gitvault-push-to-create.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-push-to-create.js.map +0 -1
- package/sdk/dist/node/gitvault-recover.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-recover.js.map +0 -1
- package/sdk/dist/node/gitvault-restore.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-restore.js.map +0 -1
- package/sdk/dist/node/gitvault-snapshot.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-snapshot.js.map +0 -1
- package/sdk/dist/node/gitvault-writer-state.d.ts.map +0 -1
- package/sdk/dist/node/gitvault-writer-state.js.map +0 -1
package/lib/delegates.mjs
CHANGED
|
@@ -15,18 +15,18 @@ Usage:
|
|
|
15
15
|
run402 delegates <subcommand> [args...]
|
|
16
16
|
|
|
17
17
|
Subcommands:
|
|
18
|
-
create --grant <grant_id> [--project <
|
|
18
|
+
create --grant <grant_id> [--project <project_id>] [--capability <cap>] [--kind <kind>]
|
|
19
19
|
[--scope <json>] [--expires <iso8601>]
|
|
20
20
|
Mint a delegate. The bearer is printed ONCE.
|
|
21
|
-
list [--project <
|
|
22
|
-
revoke <delegate_id> [--project <
|
|
21
|
+
list [--project <project_id>] List delegates (never shows tokens)
|
|
22
|
+
revoke <delegate_id> [--project <project_id>]
|
|
23
23
|
Revoke immediately
|
|
24
|
-
rotate <delegate_id> [--project <
|
|
24
|
+
rotate <delegate_id> [--project <project_id>]
|
|
25
25
|
Revoke + reissue; new bearer printed ONCE
|
|
26
26
|
|
|
27
27
|
Notes:
|
|
28
28
|
- A delegate NARROWS an existing grant, so mint the grant first:
|
|
29
|
-
run402 grants create <agent-wallet> --capability deploy --project <
|
|
29
|
+
run402 grants create <agent-wallet> --capability deploy --project <project_id>
|
|
30
30
|
then pass the returned grant_id to 'delegates create'.
|
|
31
31
|
- Mutations require you to be an owner of the project's org (wallet SIWX).
|
|
32
32
|
- A delegate can never be an owner, and is revocable and expiring.
|
|
@@ -51,7 +51,7 @@ const SUB_HELP = {
|
|
|
51
51
|
create: `run402 delegates create — mint a scoped deploy credential
|
|
52
52
|
|
|
53
53
|
Usage:
|
|
54
|
-
run402 delegates create --grant <grant_id> [--project <
|
|
54
|
+
run402 delegates create --grant <grant_id> [--project <project_id>] [--capability <cap>]
|
|
55
55
|
[--kind <kind>] [--scope <json>] [--expires <iso8601>]
|
|
56
56
|
|
|
57
57
|
--capability defaults to "deploy". --kind defaults to "run402_agent_key" (the
|
|
@@ -64,21 +64,21 @@ Requires owner of the project's org.
|
|
|
64
64
|
list: `run402 delegates list — list a project's delegates
|
|
65
65
|
|
|
66
66
|
Usage:
|
|
67
|
-
run402 delegates list [--project <
|
|
67
|
+
run402 delegates list [--project <project_id>]
|
|
68
68
|
|
|
69
69
|
Never returns tokens or secret material — id, kind, scope, expiry, revocation.
|
|
70
70
|
`,
|
|
71
71
|
revoke: `run402 delegates revoke — revoke a delegate immediately
|
|
72
72
|
|
|
73
73
|
Usage:
|
|
74
|
-
run402 delegates revoke <delegate_id> [--project <
|
|
74
|
+
run402 delegates revoke <delegate_id> [--project <project_id>]
|
|
75
75
|
|
|
76
76
|
Takes effect for every subsequent request. Requires owner of the project's org.
|
|
77
77
|
`,
|
|
78
78
|
rotate: `run402 delegates rotate — revoke and reissue in one step
|
|
79
79
|
|
|
80
80
|
Usage:
|
|
81
|
-
run402 delegates rotate <delegate_id> [--project <
|
|
81
|
+
run402 delegates rotate <delegate_id> [--project <project_id>]
|
|
82
82
|
|
|
83
83
|
Keeps the same principal, grant, kind, scope, cap and expiry. The NEW bearer is
|
|
84
84
|
printed once. Use this when a token is lost or possibly exposed.
|
|
@@ -99,12 +99,12 @@ async function create(args) {
|
|
|
99
99
|
requirePositionalCount(rest, CREATE_VALUE_FLAGS, {
|
|
100
100
|
min: 0,
|
|
101
101
|
max: 0,
|
|
102
|
-
command: "run402 delegates create --grant <grant_id> [--project <
|
|
102
|
+
command: "run402 delegates create --grant <grant_id> [--project <project_id>]",
|
|
103
103
|
missing: "",
|
|
104
104
|
});
|
|
105
105
|
if (!grantId) {
|
|
106
106
|
console.error("Missing --grant <grant_id>. Mint one first:");
|
|
107
|
-
console.error(" run402 grants create <agent-wallet> --capability deploy --project <
|
|
107
|
+
console.error(" run402 grants create <agent-wallet> --capability deploy --project <project_id>");
|
|
108
108
|
process.exit(1);
|
|
109
109
|
}
|
|
110
110
|
const scope = scopeRaw != null
|
|
@@ -135,7 +135,7 @@ async function list(args) {
|
|
|
135
135
|
requirePositionalCount(rest, ["--project"], {
|
|
136
136
|
min: 0,
|
|
137
137
|
max: 0,
|
|
138
|
-
command: "run402 delegates list [--project <
|
|
138
|
+
command: "run402 delegates list [--project <project_id>]",
|
|
139
139
|
missing: "",
|
|
140
140
|
});
|
|
141
141
|
try {
|
|
@@ -153,7 +153,7 @@ function oneIdCommand(name) {
|
|
|
153
153
|
const [delegateId] = requirePositionalCount(rest, ["--project"], {
|
|
154
154
|
min: 1,
|
|
155
155
|
max: 1,
|
|
156
|
-
command: `run402 delegates ${name} <delegate_id> [--project <
|
|
156
|
+
command: `run402 delegates ${name} <delegate_id> [--project <project_id>]`,
|
|
157
157
|
missing: "Missing <delegate_id>.",
|
|
158
158
|
});
|
|
159
159
|
try {
|
package/lib/deliveries.mjs
CHANGED
|
@@ -30,7 +30,7 @@ const HELP = `run402 deliveries — did a notification actually land
|
|
|
30
30
|
|
|
31
31
|
Usage:
|
|
32
32
|
run402 deliveries list [--type <event_type>] [--since <iso>] [--limit N] [--after <cursor>]
|
|
33
|
-
run402 deliveries get <
|
|
33
|
+
run402 deliveries get <notification_id>
|
|
34
34
|
|
|
35
35
|
Notes:
|
|
36
36
|
- One row per delivery ATTEMPT, per channel, with its outcome — the audit
|
|
@@ -70,7 +70,7 @@ async function get(args) {
|
|
|
70
70
|
assertKnownFlags(parsedArgs, ["--help", "-h"]);
|
|
71
71
|
const positionals = positionalArgs(parsedArgs);
|
|
72
72
|
if (positionals.length !== 1) {
|
|
73
|
-
fail({ code: "BAD_USAGE", message: "Usage: run402
|
|
73
|
+
fail({ code: "BAD_USAGE", message: "Usage: run402 deliveries get <notification_id>" });
|
|
74
74
|
}
|
|
75
75
|
walletAuthHeaders("/agent/v1/notifications");
|
|
76
76
|
try {
|
package/lib/deploy-v2.mjs
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
import { existsSync, fstatSync, readFileSync } from "node:fs";
|
|
29
29
|
import { resolve, dirname, extname, isAbsolute } from "node:path";
|
|
30
30
|
import {
|
|
31
|
-
|
|
31
|
+
applyWithVault,
|
|
32
32
|
assertLocalFileReferencesExist,
|
|
33
33
|
buildDeployResolveSummary,
|
|
34
34
|
githubActionsCredentials,
|
|
@@ -139,7 +139,7 @@ Options:
|
|
|
139
139
|
--final-only Alias for --quiet; final success/error envelope is still preserved
|
|
140
140
|
--allow-warning <code> Continue past this reviewed warning code (repeatable)
|
|
141
141
|
--allow-warnings Continue past plan warnings that require confirmation
|
|
142
|
-
--allow-dirty
|
|
142
|
+
--allow-dirty vault-required projects only: capture a dirty
|
|
143
143
|
work tree as-is instead of refusing
|
|
144
144
|
SNAPSHOT_DIRTY_TREE. The result discloses exactly
|
|
145
145
|
what was swept in, printed to stderr too — even
|
|
@@ -506,14 +506,14 @@ async function rehearseCmd(rawArgs) {
|
|
|
506
506
|
});
|
|
507
507
|
const planId = planned.plan.plan_id;
|
|
508
508
|
if (!planId) {
|
|
509
|
-
fail({ code: "DRY_RUN_PLAN_NOT_COMMITTABLE", message: "Rehearsal requires a persisted plan_id, but the plan response did not include one.", details: { project_id: normalized.spec.
|
|
509
|
+
fail({ code: "DRY_RUN_PLAN_NOT_COMMITTABLE", message: "Rehearsal requires a persisted plan_id, but the plan response did not include one.", details: { project_id: normalized.spec.project_id } });
|
|
510
510
|
}
|
|
511
511
|
await sdk._applyEngine.upload(planned.plan, {
|
|
512
|
-
project: normalized.spec.
|
|
512
|
+
project: normalized.spec.project_id,
|
|
513
513
|
byteReaders: planned.byteReaders,
|
|
514
514
|
onEvent: emit,
|
|
515
515
|
});
|
|
516
|
-
return { planId, plan: planned.plan, projectId: normalized.spec.
|
|
516
|
+
return { planId, plan: planned.plan, projectId: normalized.spec.project_id };
|
|
517
517
|
}
|
|
518
518
|
|
|
519
519
|
try {
|
|
@@ -1250,11 +1250,11 @@ async function deployCmd(args) {
|
|
|
1250
1250
|
target = await resolveDeploymentTarget({
|
|
1251
1251
|
appRoot: applicationScope.app_root,
|
|
1252
1252
|
manifestPath: manifestPath ?? undefined, projectId: opts.project || undefined, environmentProjectId: process.env.RUN402_PROJECT_ID || undefined,
|
|
1253
|
-
manifestProjectId: manifestProject || (releaseSpec.
|
|
1253
|
+
manifestProjectId: manifestProject || (releaseSpec.project_id === "prj_up_preflight_placeholder" ? undefined : releaseSpec.project_id),
|
|
1254
1254
|
targetKind: isCoreApiTarget() ? "core" : "cloud", apiBase: API,
|
|
1255
1255
|
allowUnresolved: opts.mode === "check" || opts.mode === "printSpec" || opts.mode === "printManifest",
|
|
1256
1256
|
});
|
|
1257
|
-
if (target.project_id) releaseSpec.
|
|
1257
|
+
if (target.project_id) releaseSpec.project_id = target.project_id;
|
|
1258
1258
|
} catch (err) { reportSdkError(err); }
|
|
1259
1259
|
const idempotencyKey = normalizedManifest.idempotencyKey;
|
|
1260
1260
|
|
|
@@ -1289,7 +1289,7 @@ async function deployCmd(args) {
|
|
|
1289
1289
|
return;
|
|
1290
1290
|
}
|
|
1291
1291
|
if (opts.mode === "printSpec") {
|
|
1292
|
-
console.log(JSON.stringify({ ...releaseSpec,
|
|
1292
|
+
console.log(JSON.stringify({ ...releaseSpec, project_id: target.project_id ?? undefined }, null, 2));
|
|
1293
1293
|
return;
|
|
1294
1294
|
}
|
|
1295
1295
|
|
|
@@ -1298,7 +1298,7 @@ async function deployCmd(args) {
|
|
|
1298
1298
|
const delegateToken = delegateTokenFromEnv();
|
|
1299
1299
|
if (useGithubActionsOidc) {
|
|
1300
1300
|
sdkOpts = {
|
|
1301
|
-
credentials: githubActionsCredentials({ projectId: releaseSpec.
|
|
1301
|
+
credentials: githubActionsCredentials({ projectId: releaseSpec.project_id, apiBase: API }),
|
|
1302
1302
|
disablePaidFetch: true,
|
|
1303
1303
|
};
|
|
1304
1304
|
} else if (delegateToken) {
|
|
@@ -1328,14 +1328,14 @@ async function deployCmd(args) {
|
|
|
1328
1328
|
const requiredPlan = opts.mode && opts.mode.kind === "applyReviewed"
|
|
1329
1329
|
? { planId: opts.mode.planId, ...(opts.mode.planFingerprint ? { planFingerprint: opts.mode.planFingerprint } : {}) }
|
|
1330
1330
|
: undefined;
|
|
1331
|
-
// A thin shim over the SDK lane (add-
|
|
1332
|
-
// takes the project's `
|
|
1331
|
+
// A thin shim over the SDK lane (add-vault 5.0). `applyWithVault`
|
|
1332
|
+
// takes the project's `vault_policy` into account: a project that is
|
|
1333
1333
|
// not `required` runs the same `apply()` this line always ran, with the
|
|
1334
1334
|
// same options object; a `required` one captures, publishes, mints an
|
|
1335
1335
|
// activation token, and commits with it.
|
|
1336
1336
|
const sdk = getSdk(sdkOpts);
|
|
1337
1337
|
const outcome = await withAutoApprove(() =>
|
|
1338
|
-
|
|
1338
|
+
applyWithVault({
|
|
1339
1339
|
sdk,
|
|
1340
1340
|
spec: releaseSpec,
|
|
1341
1341
|
apply: {
|
|
@@ -1348,7 +1348,7 @@ async function deployCmd(args) {
|
|
|
1348
1348
|
},
|
|
1349
1349
|
target: isCoreApiTarget() ? "core" : "cloud",
|
|
1350
1350
|
...(opts.allowDirty ? { allowDirty: true } : {}),
|
|
1351
|
-
// The `
|
|
1351
|
+
// The `vault_commit` line is printed ALWAYS, and to stderr, so
|
|
1352
1352
|
// `run402 deploy | jq` stays clean (the pipe contract).
|
|
1353
1353
|
onCommitLine: (line) => { if (!opts.quiet) process.stderr.write(`${line}\n`); },
|
|
1354
1354
|
}),
|
|
@@ -1356,30 +1356,30 @@ async function deployCmd(args) {
|
|
|
1356
1356
|
// Cache the activated deployment id so `run402 subdomains add` can
|
|
1357
1357
|
// pass it as an optimization (the gateway defaults to the live release
|
|
1358
1358
|
// without it). Best-effort: a keystore hiccup never fails the deploy.
|
|
1359
|
-
rememberLastDeployment(releaseSpec.
|
|
1360
|
-
if (!outcome.
|
|
1359
|
+
rememberLastDeployment(releaseSpec.project_id, outcome.deploy?.urls?.deployment_id);
|
|
1360
|
+
if (!outcome.vault) {
|
|
1361
1361
|
console.log(JSON.stringify({ ...outcome.deploy, stats: sdkStats(sdk) }, null, 2));
|
|
1362
1362
|
printVerboseStats(opts.verbose, sdk);
|
|
1363
1363
|
return;
|
|
1364
1364
|
}
|
|
1365
|
-
const vaulted = outcome.
|
|
1365
|
+
const vaulted = outcome.vault;
|
|
1366
1366
|
// Both `DEPLOYED_*` outcomes activated a release; the override one just
|
|
1367
1367
|
// did it without a vaulted capture and carries a draining advisory.
|
|
1368
1368
|
const activated = vaulted.outcome === "DEPLOYED_AND_VAULTED" || vaulted.outcome === "DEPLOYED_UNVAULTED_OVERRIDE";
|
|
1369
1369
|
console.log(JSON.stringify({
|
|
1370
1370
|
ok: activated,
|
|
1371
1371
|
outcome: vaulted.outcome,
|
|
1372
|
-
|
|
1372
|
+
vault_commit: vaulted.vault_commit,
|
|
1373
1373
|
capture_id: vaulted.capture_id,
|
|
1374
1374
|
operation_id: vaulted.operation_id,
|
|
1375
1375
|
...("generation" in vaulted ? { generation: vaulted.generation } : {}),
|
|
1376
1376
|
...("push_error" in vaulted ? { push_error: vaulted.push_error } : {}),
|
|
1377
1377
|
...("deploy_error" in vaulted ? { deploy_error: vaulted.deploy_error } : {}),
|
|
1378
|
-
// Design D5/D6 (
|
|
1378
|
+
// Design D5/D6 (vault-human-envelopes task 4.1 + vault-mirror):
|
|
1379
1379
|
// present only when this deploy landed a new generation — the SDK
|
|
1380
1380
|
// omits both fields entirely on the other three outcomes rather than
|
|
1381
1381
|
// faking a `skipped_*` value for something that never had a chance to
|
|
1382
|
-
// run. See `
|
|
1382
|
+
// run. See `Repos.deploy`'s doc comment (sdk/src/namespaces/repos.ts).
|
|
1383
1383
|
...("mirror_push" in vaulted ? { mirror_push: vaulted.mirror_push } : {}),
|
|
1384
1384
|
...("reconcile_recipients" in vaulted ? { reconcile_recipients: vaulted.reconcile_recipients } : {}),
|
|
1385
1385
|
next_actions: vaulted.next_actions,
|
|
@@ -1388,11 +1388,11 @@ async function deployCmd(args) {
|
|
|
1388
1388
|
}, null, 2));
|
|
1389
1389
|
// Design D6: the mirror result is reported BESIDE the vault outcome
|
|
1390
1390
|
// above, on its own stderr line — a mirror failure never blocks the
|
|
1391
|
-
// deploy (mirrors `run402
|
|
1391
|
+
// deploy (mirrors `run402 repos capture`'s reporting).
|
|
1392
1392
|
if (vaulted.mirror_push?.outcome === "pushed") {
|
|
1393
1393
|
console.error(`mirror: pushed generation ${vaulted.generation} (${vaulted.mirror_push.summary?.objects_copied ?? 0} object(s) copied)`);
|
|
1394
1394
|
} else if (vaulted.mirror_push?.outcome === "failed") {
|
|
1395
|
-
console.error(`mirror:
|
|
1395
|
+
console.error(`mirror: mirroring this capture FAILED (deploy is unaffected) — ${vaulted.mirror_push.error ?? "see mirror_push.summary.errors"}`);
|
|
1396
1396
|
}
|
|
1397
1397
|
// Dirty-tree disclosure (Tal's decision, "help people not make
|
|
1398
1398
|
// mistakes"): even an explicit --allow-dirty override never captures
|
|
@@ -1467,7 +1467,7 @@ const CI_DEPLOY_ERROR_GUIDANCE = {
|
|
|
1467
1467
|
hint: "The GitHub repository id in the OIDC token does not match the linked binding.",
|
|
1468
1468
|
next_actions: [
|
|
1469
1469
|
editRequestAction("run402 ci link github", "Re-link from the current repository."),
|
|
1470
|
-
editRequestAction("run402 ci link github --repository-id <
|
|
1470
|
+
editRequestAction("run402 ci link github --repository-id <repository_id>", "Pass the numeric GitHub repository id if automatic lookup fails."),
|
|
1471
1471
|
],
|
|
1472
1472
|
},
|
|
1473
1473
|
forbidden_spec_field: {
|
|
@@ -1502,12 +1502,12 @@ const CI_DEPLOY_ERROR_GUIDANCE = {
|
|
|
1502
1502
|
};
|
|
1503
1503
|
|
|
1504
1504
|
/**
|
|
1505
|
-
* The gateway's envelope for
|
|
1505
|
+
* The gateway's envelope for vault deploy errors — `upgrade_client` first,
|
|
1506
1506
|
* then `grandfather_policy` — is relayed untouched: `deployCmd` deploys
|
|
1507
|
-
* through `
|
|
1507
|
+
* through `applyWithVault`, which declares `{capture_id,
|
|
1508
1508
|
* snapshot_oid_hmac}` at plan time and presents an activation token at
|
|
1509
|
-
* commit, satisfying `
|
|
1510
|
-
* of the envelope is needed. `cli-deploy-
|
|
1509
|
+
* commit, satisfying `vault_policy: required`, so no client-side rewrite
|
|
1510
|
+
* of the envelope is needed. `cli-deploy-vault-lane.test.mjs` is the gate
|
|
1511
1511
|
* for this behavior.
|
|
1512
1512
|
*/
|
|
1513
1513
|
function reportDeployApplyError(err, useGithubActionsOidc) {
|
package/lib/dev.mjs
CHANGED
|
@@ -29,12 +29,12 @@ import { fail } from "./sdk-errors.mjs";
|
|
|
29
29
|
const HELP = `run402 dev — Run Astro dev with Run402 context
|
|
30
30
|
|
|
31
31
|
Usage:
|
|
32
|
-
run402 dev [--port <n>] [--host <h>] [--project <
|
|
32
|
+
run402 dev [--port <n>] [--host <h>] [--project <project_id>]
|
|
33
33
|
|
|
34
34
|
Options:
|
|
35
35
|
--port <n> Astro dev port (default 4321)
|
|
36
36
|
--host <h> Astro dev host (default localhost)
|
|
37
|
-
--project <
|
|
37
|
+
--project <project_id> Project id (default: RUN402_PROJECT_ID env var)
|
|
38
38
|
|
|
39
39
|
The command:
|
|
40
40
|
1. Loads .env.local from the current directory (if present)
|
|
@@ -85,7 +85,7 @@ export async function run(sub, args = []) {
|
|
|
85
85
|
fail({
|
|
86
86
|
code: "BAD_USAGE",
|
|
87
87
|
message: "Missing RUN402_PROJECT_ID.",
|
|
88
|
-
hint: "Set it in .env.local (or pass --project <
|
|
88
|
+
hint: "Set it in .env.local (or pass --project <project_id>). Run 'run402 projects provision' first if you don't have one.",
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
91
|
if (!process.env.RUN402_SERVICE_KEY) {
|
package/lib/doctor.mjs
CHANGED
|
@@ -13,9 +13,9 @@ import { resolveApplicationScope, loadApplicationScanInput, scanDeploymentSource
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
import { existsSync, statSync } from "node:fs";
|
|
16
|
-
import {
|
|
16
|
+
import { VAULT_BYO_NO_PAYLOAD_COPY_STATEMENT } from "#sdk";
|
|
17
17
|
import { configDir, readWallet, loadKeyStore } from "./config.mjs";
|
|
18
|
-
import {
|
|
18
|
+
import { resolveVaultTarget } from "./vault-target.mjs";
|
|
19
19
|
import { getSdk } from "./sdk.mjs";
|
|
20
20
|
import {
|
|
21
21
|
resolveScanRoot,
|
|
@@ -54,7 +54,7 @@ const DOCTOR_CHECK_NAMES = [
|
|
|
54
54
|
"account_health",
|
|
55
55
|
"runtime_staleness",
|
|
56
56
|
"recovery_posture",
|
|
57
|
-
"
|
|
57
|
+
"vault",
|
|
58
58
|
"source_scan",
|
|
59
59
|
];
|
|
60
60
|
|
|
@@ -75,7 +75,7 @@ function collectRepeatableFlag(args, flag) {
|
|
|
75
75
|
const HELP = `run402 doctor — Health and config diagnostics
|
|
76
76
|
|
|
77
77
|
Usage:
|
|
78
|
-
run402 doctor [--verbose] [--refresh] [--no-scan] [--scan-dir <D>] [--project <
|
|
78
|
+
run402 doctor [--verbose] [--refresh] [--no-scan] [--scan-dir <D>] [--project <project_id>]
|
|
79
79
|
[--only <check> ...]
|
|
80
80
|
run402 --wallet <profile> doctor --buzz --buzz-agent <npub-or-hex>
|
|
81
81
|
|
|
@@ -91,7 +91,7 @@ Output:
|
|
|
91
91
|
api_reachable error, tier inactive / frozen / past_due /
|
|
92
92
|
dormant / missing / error, error-severity source_scan findings
|
|
93
93
|
advisory a warning that never stops a deploy: account_health,
|
|
94
|
-
recovery_posture,
|
|
94
|
+
recovery_posture, vault, runtime_staleness, cli_update gaps
|
|
95
95
|
info ok / skipped / unknown
|
|
96
96
|
Agents: branch on \`ok\`; read \`warnings[]\` (one entry per gap) for the
|
|
97
97
|
non-blocking gaps and \`blocking[]\` for what to fix when \`ok\` is false.
|
|
@@ -117,16 +117,16 @@ Options:
|
|
|
117
117
|
--dir D Select the application directory for deployment diagnostics.
|
|
118
118
|
--manifest P Explicitly select a manifest (executable configs are trusted code).
|
|
119
119
|
--scan-dir D Advanced arbitrary scan; does not claim deployment readiness
|
|
120
|
-
--project <
|
|
120
|
+
--project <project_id> Target THIS project's vault check instead of the repo-standing
|
|
121
121
|
default (the 4.38.0 pin / run402 remote / RUN402_PROJECT_ID / active
|
|
122
|
-
project, in that order — see \`
|
|
123
|
-
|
|
122
|
+
project, in that order — see \`vault-target.mjs\`). Scoped to the
|
|
123
|
+
vault check only; every other check is wallet/machine-wide, not
|
|
124
124
|
per-project, and is unaffected by this flag. Composes with --only.
|
|
125
125
|
--only <check> Run ONLY the named check (repeatable — pass it more than once
|
|
126
126
|
to run several). Every other check, INCLUDING the monorepo
|
|
127
127
|
source-tree scan, is suppressed rather than merely hidden: a
|
|
128
128
|
skipped check's network/filesystem work never runs at all, so
|
|
129
|
-
\`doctor --only
|
|
129
|
+
\`doctor --only vault\` costs one vault read, not a
|
|
130
130
|
config/tier/account/scan sweep. An unknown check name is
|
|
131
131
|
BAD_USAGE listing the valid names below. Not used with --buzz
|
|
132
132
|
(buzz mode is its own separate, always-complete check set).
|
|
@@ -164,7 +164,7 @@ Checks performed:
|
|
|
164
164
|
the org's disaster backstops if the agent machine dies. Evidence
|
|
165
165
|
levels: "configured" is what the platform verified, never proof an
|
|
166
166
|
off-platform passkey or saved code still exists.
|
|
167
|
-
-
|
|
167
|
+
- vault: the active project's vault — activation policy, whether THIS
|
|
168
168
|
machine can produce the capture a 'required' policy demands, open
|
|
169
169
|
unvaulted-override journals, and where the keystore lives (back it up:
|
|
170
170
|
whole-keystore loss is terminal for vault history)
|
|
@@ -310,7 +310,7 @@ export async function run(sub, args = []) {
|
|
|
310
310
|
const skipScan = all.includes("--no-scan");
|
|
311
311
|
const scanDirArgIdx = all.indexOf("--scan-dir");
|
|
312
312
|
const scanDirOverride = scanDirArgIdx >= 0 ? all[scanDirArgIdx + 1] : null;
|
|
313
|
-
// Scoped to the
|
|
313
|
+
// Scoped to the vault check (see HELP): every other check is
|
|
314
314
|
// wallet/machine-wide, not per-project.
|
|
315
315
|
const projectOverride = flagValue(all, "--project");
|
|
316
316
|
|
|
@@ -650,7 +650,7 @@ export async function run(sub, args = []) {
|
|
|
650
650
|
}
|
|
651
651
|
}
|
|
652
652
|
|
|
653
|
-
// 6c. Org recovery posture (
|
|
653
|
+
// 6c. Org recovery posture (vault-recovery-custody). One entry per
|
|
654
654
|
// vault-owning org the caller can see; rides the same account-status
|
|
655
655
|
// read. Evidence levels, not guarantees: "configured" names what the
|
|
656
656
|
// platform VERIFIED — it can never observe whether an off-platform
|
|
@@ -661,11 +661,11 @@ export async function run(sub, args = []) {
|
|
|
661
661
|
if (wanted("recovery_posture")) {
|
|
662
662
|
const posture = status.recovery_posture;
|
|
663
663
|
if (!Array.isArray(posture)) {
|
|
664
|
-
// Gateway older than
|
|
664
|
+
// Gateway older than vault-recovery-custody doesn't surface it.
|
|
665
665
|
checks.push({
|
|
666
666
|
name: "recovery_posture",
|
|
667
667
|
status: "skipped",
|
|
668
|
-
...(verbose && { hint: "account status has no 'recovery_posture' block; requires a
|
|
668
|
+
...(verbose && { hint: "account status has no 'recovery_posture' block; requires a vault-recovery-custody gateway." }),
|
|
669
669
|
});
|
|
670
670
|
} else if (posture.length === 0) {
|
|
671
671
|
// No vault-owning org in the caller's view — nothing to lose, nothing to advise.
|
|
@@ -675,7 +675,7 @@ export async function run(sub, args = []) {
|
|
|
675
675
|
for (const org of posture) {
|
|
676
676
|
const label = `org ${org.org_id} (${org.vault_count} vault${org.vault_count === 1 ? "" : "s"})`;
|
|
677
677
|
if (org.control_plane_configured === false) {
|
|
678
|
-
gaps.push(`${label}: no human owner with a working control-plane login — if this org's agent machine dies, nobody can sign in to recover it. Invite a backup human (run402
|
|
678
|
+
gaps.push(`${label}: no human owner with a working control-plane login — if this org's agent machine dies, nobody can sign in to recover it. Invite a backup human (run402 orgs invite create ${org.org_id} --email <their-email> --role owner) and have them complete login at console.run402.com.`);
|
|
679
679
|
}
|
|
680
680
|
if (org.source_backup_configured === false) {
|
|
681
681
|
gaps.push(`${label}: no human member holds a working source-access key — vault history has no member-side decryption backup. Have a member complete source enrollment at console.run402.com/account → Source access.`);
|
|
@@ -718,15 +718,15 @@ export async function run(sub, args = []) {
|
|
|
718
718
|
});
|
|
719
719
|
}
|
|
720
720
|
|
|
721
|
-
// 6c.
|
|
722
|
-
// even when `
|
|
721
|
+
// 6c. vault (add-vault). Doctor was completely silent about the vault
|
|
722
|
+
// even when `vault_policy: required` was the single thing that would break
|
|
723
723
|
// the project's next deploy (dogfood #1, finding D1) — and doctor is where a
|
|
724
724
|
// user looks when something is wrong. It also prints WHERE the keystore is:
|
|
725
725
|
// "whole-keystore loss is terminal" was stated three times across this
|
|
726
726
|
// surface while the directory to back up was stated nowhere (finding D2).
|
|
727
727
|
//
|
|
728
728
|
// Read-only and best-effort in every branch: no project, no vault, or a
|
|
729
|
-
// gateway that does not know
|
|
729
|
+
// gateway that does not know vault are all ordinary and report `skipped`
|
|
730
730
|
// or `ok`, never a doctor failure. A vault-only project that has never
|
|
731
731
|
// deployed is a first-class shape (protocol D183), so its mere absence of a
|
|
732
732
|
// deploy raises nothing.
|
|
@@ -734,12 +734,12 @@ export async function run(sub, args = []) {
|
|
|
734
734
|
// TARGETING: when cwd is a repository
|
|
735
735
|
// with its own pinned repo id or run402/origin remote, doctor checks THAT
|
|
736
736
|
// vault, not the profile's active project — the same pin > remote >
|
|
737
|
-
// RUN402_PROJECT_ID env > active-project order every other
|
|
738
|
-
// follows (`
|
|
739
|
-
// all of that (the resolver's own top tier), same as every other
|
|
737
|
+
// RUN402_PROJECT_ID env > active-project order every other vault verb
|
|
738
|
+
// follows (`vault-target.mjs`). An explicit `--project <project_id>` outranks
|
|
739
|
+
// all of that (the resolver's own top tier), same as every other vault
|
|
740
740
|
// verb's `--project`.
|
|
741
|
-
if (wanted("
|
|
742
|
-
//
|
|
741
|
+
if (wanted("vault")) {
|
|
742
|
+
// vault-persistent-helper: a bounded LOCAL probe of the resident
|
|
743
743
|
// helper engine — {running:false} is a fine answer, never a finding
|
|
744
744
|
// (the daemon is an accelerator, not a dependency).
|
|
745
745
|
const daemonInfo = await (async () => {
|
|
@@ -783,18 +783,18 @@ export async function run(sub, args = []) {
|
|
|
783
783
|
return { running: false };
|
|
784
784
|
}
|
|
785
785
|
})();
|
|
786
|
-
const target = await
|
|
786
|
+
const target = await resolveVaultTarget({ repoDir: process.cwd(), explicitProjectId: projectOverride ?? undefined });
|
|
787
787
|
const projectId = target.project_id ?? null;
|
|
788
788
|
const repoId = target.repo_id ?? null;
|
|
789
789
|
if (!projectId && !repoId) {
|
|
790
790
|
checks.push({
|
|
791
|
-
name: "
|
|
791
|
+
name: "vault",
|
|
792
792
|
status: "skipped",
|
|
793
793
|
...(verbose && { hint: "no active project — run 'run402 projects use <project_id>' to check its vault." }),
|
|
794
794
|
});
|
|
795
795
|
} else {
|
|
796
796
|
try {
|
|
797
|
-
const gv = await getSdk().
|
|
797
|
+
const gv = await getSdk().repos.status({
|
|
798
798
|
...(repoId ? { repo_id: repoId } : { project_id: projectId }),
|
|
799
799
|
repo_dir: process.cwd(),
|
|
800
800
|
});
|
|
@@ -802,11 +802,11 @@ export async function run(sub, args = []) {
|
|
|
802
802
|
project_id: gv.project_id ?? projectId,
|
|
803
803
|
repo_id: gv.repo_id,
|
|
804
804
|
vault: gv.vault === null ? null : "allocated",
|
|
805
|
-
//
|
|
805
|
+
// vault-byo-primary-bucket task 3.5 — absent-or-"managed" is
|
|
806
806
|
// byte-identical to before this fold for every non-BYO vault.
|
|
807
807
|
storage_profile: gv.vault?.storage_profile ?? null,
|
|
808
808
|
byo_destination: gv.vault?.byo_destination ?? null,
|
|
809
|
-
|
|
809
|
+
vault_policy: gv.vault_policy,
|
|
810
810
|
keystore_root: gv.keystore.root,
|
|
811
811
|
can_sign: gv.keystore.can_sign,
|
|
812
812
|
holds_repo_key: gv.keystore.holds_repo_key,
|
|
@@ -819,7 +819,7 @@ export async function run(sub, args = []) {
|
|
|
819
819
|
// to the durability sentence instead of the terminal-loss claim.
|
|
820
820
|
covering_recipients: gv.covering_recipients ?? null,
|
|
821
821
|
daemon: daemonInfo,
|
|
822
|
-
//
|
|
822
|
+
// vault-multi-writer (rev 47) task 6.2 — this machine's own
|
|
823
823
|
// standing on the vault's chain-verified writer set. `null` only
|
|
824
824
|
// when there is no vault at all (nothing to be a writer OF).
|
|
825
825
|
// `read_only_vault` takes priority over the caller's own standing
|
|
@@ -839,22 +839,22 @@ export async function run(sub, args = []) {
|
|
|
839
839
|
if (value.writer === "read_only_vault") {
|
|
840
840
|
gaps.push("this vault has lost its last writer (D228 read-only terminal) — it still serves reads, but no push can be admitted until a new writer is admitted through a recovery path");
|
|
841
841
|
} else if (value.writer === "pending") {
|
|
842
|
-
gaps.push("this machine's key is an eligible writer candidate but not yet admitted — run 'run402 repos access sync' if you already hold writer standing on this vault, or ask a current writer to run any
|
|
842
|
+
gaps.push("this machine's key is an eligible writer candidate but not yet admitted — run 'run402 repos access sync' if you already hold writer standing on this vault, or ask a current writer to run any vault operation");
|
|
843
843
|
} else if (value.writer === "not_admitted") {
|
|
844
|
-
gaps.push("this machine's key is not an active writer on this vault — a push from here is refused
|
|
844
|
+
gaps.push("this machine's key is not an active writer on this vault — a push from here is refused VAULT_WRITER_NOT_ADMITTED; ask a current writer to admit you (org membership at role developer+ and a published signing key make you eligible)");
|
|
845
845
|
}
|
|
846
846
|
// The one that actually breaks the next deploy: the project demands a
|
|
847
847
|
// vaulted capture and THIS machine cannot produce one.
|
|
848
|
-
if (gv.
|
|
848
|
+
if (gv.vault_policy === "required" && !gv.keystore.holds_repo_key) {
|
|
849
849
|
gaps.push(
|
|
850
|
-
"
|
|
851
|
-
"Run 'run402 repos create --project <
|
|
850
|
+
"vault_policy is 'required' but this machine holds no key for the vault — a deploy from here is refused with VAULT_CLIENT_UPGRADE_REQUIRED. " +
|
|
851
|
+
"Run 'run402 repos create --project <project_id>' (idempotent; resolves to the existing repo), or 'run402 repos policy grandfathered --reason <why>' to un-gate the project.",
|
|
852
852
|
);
|
|
853
|
-
} else if (gv.
|
|
854
|
-
gaps.push("
|
|
853
|
+
} else if (gv.vault_policy === "required" && !gv.keystore.can_sign) {
|
|
854
|
+
gaps.push("vault_policy is 'required' and this keystore is read-only (no signing key) — it can verify but cannot publish the capture a deploy needs");
|
|
855
855
|
}
|
|
856
856
|
if (gv.pending_overrides > 0) {
|
|
857
|
-
gaps.push(`${gv.pending_overrides} unvaulted-override journal(s) are still open — run 'run402 repos
|
|
857
|
+
gaps.push(`${gv.pending_overrides} unvaulted-override journal(s) are still open — run 'run402 repos capture' to drain them`);
|
|
858
858
|
}
|
|
859
859
|
// `matches` is a TRI-STATE: `false` alone is
|
|
860
860
|
// a real mismatch. `null` (a slug-form remote not yet resolved on
|
|
@@ -863,20 +863,11 @@ export async function run(sub, args = []) {
|
|
|
863
863
|
if (gv.remote && gv.remote.matches === false) {
|
|
864
864
|
gaps.push(`the '${gv.remote.name}' git remote points at a different project than ${value.project_id} (${gv.remote.url})`);
|
|
865
865
|
}
|
|
866
|
-
// A `kygit::` remote with no
|
|
867
|
-
// `git-remote-kygit` helper on PATH means every push/clone/fetch
|
|
868
|
-
// in this checkout fails inside git with an opaque error.
|
|
869
|
-
if (gv.remote?.url?.startsWith("kygit::")) {
|
|
870
|
-
const { isExecutableOnPath } = await import("./path-lookup.mjs");
|
|
871
|
-
if (!isExecutableOnPath("git-remote-kygit")) {
|
|
872
|
-
gaps.push("this checkout's remote is kygit:: but git-remote-kygit is not on PATH — run `npm i -g @kychee/kygit`");
|
|
873
|
-
}
|
|
874
|
-
}
|
|
875
866
|
// Echoed exactly as the SDK reported them — including the
|
|
876
867
|
// doctor-persistent `grandfathered` advisory it owns.
|
|
877
868
|
for (const w of gv.warnings ?? []) gaps.push(`${w.kind}: ${w.message}`);
|
|
878
869
|
|
|
879
|
-
//
|
|
870
|
+
// vault-mirror-and-recover task 4.3 + vault-mirror-default:
|
|
880
871
|
// mirror currency, reported ALONGSIDE (never in place of) the
|
|
881
872
|
// deploy-related gaps above, and never blocking `run402 deploy`'s
|
|
882
873
|
// own gate — the vault lane's outcome is unaffected regardless of
|
|
@@ -885,14 +876,14 @@ export async function run(sub, args = []) {
|
|
|
885
876
|
// unreachable or vault unread). Only STALE is actionable enough to
|
|
886
877
|
// become a warning gap; a vault with no successful mirror copy yet
|
|
887
878
|
// carries the SDK-computed `vault_unmirrored` finding — named and
|
|
888
|
-
// standing (
|
|
879
|
+
// standing (vault-mirror-default supersedes the old anonymous
|
|
889
880
|
// `advisory` string), echoed verbatim, and deliberately NOT pushed
|
|
890
881
|
// into `gaps`: informational, never blocking, computed client-side
|
|
891
882
|
// only, cleared by the first successful mirror write or sync.
|
|
892
883
|
if (gv.vault !== null && value.repo_id) {
|
|
893
884
|
try {
|
|
894
|
-
const mirrorStatus = await getSdk().
|
|
895
|
-
value.
|
|
885
|
+
const mirrorStatus = await getSdk().repos.mirrorStatus({ repo_id: value.repo_id, is_byo: value.storage_profile === "byo" });
|
|
886
|
+
value.vault_mirror = {
|
|
896
887
|
configured: mirrorStatus.configured,
|
|
897
888
|
destination: mirrorStatus.destination,
|
|
898
889
|
mirrored_generation: mirrorStatus.mirrored_generation,
|
|
@@ -912,27 +903,27 @@ export async function run(sub, args = []) {
|
|
|
912
903
|
}
|
|
913
904
|
}
|
|
914
905
|
|
|
915
|
-
//
|
|
906
|
+
// vault-byo-primary-bucket task 3.5 — unconditional, independent
|
|
916
907
|
// of mirror status (D7); imported from the canonical constants, never
|
|
917
908
|
// paraphrased.
|
|
918
|
-
const byoDisclosure = value.storage_profile === "byo" ? ` Storage: byo (${value.byo_destination ?? "(unknown)"}) — ${
|
|
909
|
+
const byoDisclosure = value.storage_profile === "byo" ? ` Storage: byo (${value.byo_destination ?? "(unknown)"}) — ${VAULT_BYO_NO_PAYLOAD_COPY_STATEMENT}` : "";
|
|
919
910
|
checks.push({
|
|
920
|
-
name: "
|
|
911
|
+
name: "vault",
|
|
921
912
|
status: gaps.length > 0 ? "warning" : "ok",
|
|
922
913
|
value: gaps.length > 0 ? { ...value, gaps } : value,
|
|
923
914
|
hint: (gv.vault === null
|
|
924
|
-
? `No vault for this project (that is a normal shape). Allocate one with 'run402 repos create --project <
|
|
915
|
+
? `No vault for this project (that is a normal shape). Allocate one with 'run402 repos create --project <project_id>'. Keystore: ${gv.keystore.root}`
|
|
925
916
|
: gv.durability_statement
|
|
926
917
|
? `Back up ${gv.keystore.root} anyway — ${gv.durability_statement} (covering_recipients: ${gv.covering_recipients})`
|
|
927
918
|
: `Back up ${gv.keystore.root} — whole-machine or whole-keystore loss is terminal for vault history.`) + byoDisclosure,
|
|
928
919
|
});
|
|
929
920
|
} catch (err) {
|
|
930
|
-
// A gateway without
|
|
921
|
+
// A gateway without vault, an unreachable API, or a project this
|
|
931
922
|
// wallet cannot see. None of those is a local health problem.
|
|
932
923
|
checks.push({
|
|
933
|
-
name: "
|
|
924
|
+
name: "vault",
|
|
934
925
|
status: "skipped",
|
|
935
|
-
message: describeCheckFailure("
|
|
926
|
+
message: describeCheckFailure("vault status check", err),
|
|
936
927
|
});
|
|
937
928
|
}
|
|
938
929
|
}
|
|
@@ -944,7 +935,7 @@ export async function run(sub, args = []) {
|
|
|
944
935
|
// `error` block deploy (`run402 deploy` wraps doctor and respects exit
|
|
945
936
|
// code). Skipped via --no-scan when the user wants config-only checks, and
|
|
946
937
|
// by any --only that omits it — on a monorepo this check's findings can
|
|
947
|
-
// otherwise bury the
|
|
938
|
+
// otherwise bury the vault diagnosis under thousands of hits.
|
|
948
939
|
if (!skipScan && wanted("source_scan")) {
|
|
949
940
|
try {
|
|
950
941
|
const scope = await resolveApplicationScope({ dir: flagValue(all, "--dir") ?? undefined, manifest: flagValue(all, "--manifest") ?? undefined });
|