run402 4.93.2 → 4.95.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 +61 -59
- package/cli.mjs +40 -47
- package/core-dist/config.js +52 -18
- package/core-dist/control-plane-session.js +31 -6
- package/core-dist/keystore.js +7 -7
- package/core-dist/profiles.js +9 -7
- package/core-dist/{allowance-auth.js → wallet-auth.js} +15 -15
- package/{sdk/core-dist/allowance.js → core-dist/wallet.js} +20 -20
- package/{sdk/core-dist/write-auth-session.js → core-dist/write-approvals.js} +19 -19
- package/gitvault-surface.json +2 -2
- package/lib/admin.mjs +6 -6
- package/lib/agent.mjs +20 -18
- package/lib/ai.mjs +5 -5
- package/lib/approve.mjs +81 -0
- package/lib/apps.mjs +12 -12
- package/lib/archives.mjs +371 -8
- package/lib/argparse.mjs +5 -5
- package/lib/assets.mjs +14 -14
- package/lib/auth.mjs +34 -34
- package/lib/billing.mjs +6 -6
- package/lib/branches.mjs +7 -7
- package/lib/buzz-doctor.mjs +2 -2
- package/lib/buzz-notifications.mjs +5 -5
- package/lib/buzz.mjs +3 -3
- package/lib/buzz.test.mjs +1 -1
- package/lib/cache.mjs +1 -1
- package/lib/cdn.mjs +2 -2
- package/lib/ci.mjs +12 -12
- package/lib/claims.mjs +2 -2
- package/lib/cold-start.mjs +21 -21
- package/lib/command-manifest.mjs +55 -70
- package/lib/config.mjs +28 -28
- package/lib/contacts.mjs +16 -16
- package/lib/contracts.mjs +12 -12
- package/lib/credentials.mjs +33 -33
- package/lib/daemon-path.mjs +1 -1
- package/lib/delegates.mjs +14 -14
- package/lib/deliveries.mjs +6 -6
- package/lib/deploy-rehearse-discovery.test.mjs +7 -7
- package/lib/deploy-v2.mjs +241 -193
- package/lib/deploy.mjs +21 -53
- package/lib/dev.mjs +3 -3
- package/lib/doctor-source-scan.mjs +1 -1
- package/lib/doctor.mjs +63 -63
- package/lib/domains.mjs +27 -27
- package/lib/email.mjs +38 -38
- package/lib/errors.mjs +40 -24
- package/lib/escalations.mjs +5 -5
- package/lib/events.mjs +32 -25
- package/lib/feedback.mjs +12 -12
- package/lib/functions.mjs +34 -34
- package/lib/gitvault-daemon.mjs +1 -1
- package/lib/gitvault-scaffold.mjs +2 -2
- package/lib/gitvault.mjs +2 -2
- package/lib/grants.mjs +7 -7
- package/lib/image.mjs +10 -10
- package/lib/init.mjs +69 -69
- package/lib/jobs.mjs +15 -15
- package/lib/lightning-wallet.mjs +28 -28
- package/lib/live.mjs +1 -1
- package/lib/login.mjs +207 -0
- package/lib/logout.mjs +53 -0
- package/lib/logs.mjs +8 -8
- package/lib/messages.mjs +5 -5
- package/lib/next-actions.mjs +16 -16
- package/lib/org-context.mjs +13 -13
- package/lib/{org.mjs → orgs.mjs} +215 -167
- package/lib/pay.mjs +1 -1
- package/lib/projects.mjs +70 -84
- package/lib/redeem.mjs +7 -8
- package/lib/remote-helper-session.mjs +12 -12
- package/lib/repos.mjs +83 -83
- package/lib/rooms.mjs +105 -69
- package/lib/sdk-errors.mjs +10 -5
- package/lib/sdk.mjs +3 -3
- package/lib/secrets.mjs +13 -13
- package/lib/service.mjs +5 -5
- package/lib/session-proofs.mjs +21 -0
- package/lib/sign-in.mjs +296 -0
- package/lib/sites.mjs +22 -22
- package/lib/snapshots.mjs +10 -10
- package/lib/stats.mjs +2 -2
- package/lib/status.mjs +25 -25
- package/lib/subdomains.mjs +30 -30
- package/lib/subscriptions.mjs +10 -10
- package/lib/tier.mjs +29 -22
- package/lib/transfer.mjs +59 -86
- package/lib/up.mjs +14 -14
- package/lib/wallet-context.mjs +4 -4
- package/lib/wallet-context.test.mjs +3 -3
- package/lib/wallets.mjs +197 -32
- package/lib/webhook-secret.mjs +6 -6
- package/lib/webhooks.mjs +8 -8
- package/lib/whoami.mjs +102 -0
- package/package.json +1 -1
- package/sdk/core-dist/config.js +52 -18
- package/sdk/core-dist/control-plane-session.js +31 -6
- package/sdk/core-dist/keystore.js +7 -7
- package/sdk/core-dist/profiles.js +9 -7
- package/sdk/core-dist/{allowance-auth.js → wallet-auth.js} +15 -15
- package/{core-dist/allowance.js → sdk/core-dist/wallet.js} +20 -20
- package/{core-dist/write-auth-session.js → sdk/core-dist/write-approvals.js} +19 -19
- package/sdk/dist/actions.d.ts +4 -4
- 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/control-plane-credentials.d.ts +8 -8
- package/sdk/dist/control-plane-credentials.js +7 -7
- package/sdk/dist/credentials.d.ts +20 -20
- package/sdk/dist/credentials.d.ts.map +1 -1
- package/sdk/dist/credentials.js +1 -1
- package/sdk/dist/errors.d.ts +26 -28
- package/sdk/dist/errors.d.ts.map +1 -1
- package/sdk/dist/errors.js +35 -38
- package/sdk/dist/errors.js.map +1 -1
- package/sdk/dist/index.d.ts +29 -16
- package/sdk/dist/index.d.ts.map +1 -1
- package/sdk/dist/index.js +30 -17
- package/sdk/dist/index.js.map +1 -1
- package/sdk/dist/kernel.d.ts +1 -1
- package/sdk/dist/kernel.d.ts.map +1 -1
- package/sdk/dist/kernel.js +10 -9
- package/sdk/dist/kernel.js.map +1 -1
- package/sdk/dist/namespaces/admin.d.ts +52 -121
- package/sdk/dist/namespaces/admin.d.ts.map +1 -1
- package/sdk/dist/namespaces/admin.js +41 -45
- package/sdk/dist/namespaces/admin.js.map +1 -1
- package/sdk/dist/namespaces/agent.d.ts +2 -2
- package/sdk/dist/namespaces/agent.d.ts.map +1 -1
- package/sdk/dist/namespaces/agent.js +2 -2
- package/sdk/dist/namespaces/agent.js.map +1 -1
- package/sdk/dist/namespaces/ai.d.ts +2 -2
- package/sdk/dist/namespaces/ai.js +3 -3
- 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/billing.d.ts +6 -3
- package/sdk/dist/namespaces/billing.d.ts.map +1 -1
- package/sdk/dist/namespaces/billing.js.map +1 -1
- package/sdk/dist/namespaces/buzz-notifications.types.d.ts +1 -1
- package/sdk/dist/namespaces/buzz.d.ts +2 -2
- package/sdk/dist/namespaces/buzz.d.ts.map +1 -1
- package/sdk/dist/namespaces/buzz.js +2 -2
- package/sdk/dist/namespaces/buzz.js.map +1 -1
- package/sdk/dist/namespaces/buzz.types.d.ts +2 -2
- package/sdk/dist/namespaces/buzz.types.d.ts.map +1 -1
- package/sdk/dist/namespaces/ci.js +3 -3
- package/sdk/dist/namespaces/ci.js.map +1 -1
- package/sdk/dist/namespaces/credentials.types.d.ts +1 -1
- package/sdk/dist/namespaces/deploy.d.ts +1 -1
- package/sdk/dist/namespaces/deploy.d.ts.map +1 -1
- package/sdk/dist/namespaces/deploy.js +31 -32
- package/sdk/dist/namespaces/deploy.js.map +1 -1
- package/sdk/dist/namespaces/deploy.types.d.ts +6 -6
- 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/escalations.d.ts +1 -1
- package/sdk/dist/namespaces/escalations.js +1 -1
- package/sdk/dist/namespaces/escalations.types.d.ts +2 -2
- package/sdk/dist/namespaces/escalations.types.d.ts.map +1 -1
- package/sdk/dist/namespaces/events.types.d.ts +1 -1
- package/sdk/dist/namespaces/functions.d.ts +1 -1
- package/sdk/dist/namespaces/functions.js +2 -2
- package/sdk/dist/namespaces/functions.js.map +1 -1
- package/sdk/dist/namespaces/gitvault.crypto.d.ts +1 -1
- package/sdk/dist/namespaces/gitvault.d.ts +26 -26
- package/sdk/dist/namespaces/gitvault.d.ts.map +1 -1
- package/sdk/dist/namespaces/gitvault.js +113 -113
- package/sdk/dist/namespaces/gitvault.js.map +1 -1
- package/sdk/dist/namespaces/me.d.ts +120 -0
- package/sdk/dist/namespaces/me.d.ts.map +1 -0
- package/sdk/dist/namespaces/me.js +34 -0
- package/sdk/dist/namespaces/me.js.map +1 -0
- package/sdk/dist/namespaces/org.d.ts +108 -6
- package/sdk/dist/namespaces/org.d.ts.map +1 -1
- package/sdk/dist/namespaces/org.js +63 -7
- package/sdk/dist/namespaces/org.js.map +1 -1
- package/sdk/dist/namespaces/org.types.d.ts +29 -9
- package/sdk/dist/namespaces/org.types.d.ts.map +1 -1
- package/sdk/dist/namespaces/pay.js +3 -3
- package/sdk/dist/namespaces/pay.js.map +1 -1
- package/sdk/dist/namespaces/projects.d.ts +9 -9
- package/sdk/dist/namespaces/projects.js +15 -15
- package/sdk/dist/namespaces/projects.js.map +1 -1
- package/sdk/dist/namespaces/projects.types.d.ts +28 -12
- package/sdk/dist/namespaces/projects.types.d.ts.map +1 -1
- package/sdk/dist/namespaces/rooms.d.ts +7 -7
- package/sdk/dist/namespaces/rooms.js +17 -17
- package/sdk/dist/namespaces/rooms.js.map +1 -1
- package/sdk/dist/namespaces/rooms.types.d.ts +9 -9
- package/sdk/dist/namespaces/rooms.types.d.ts.map +1 -1
- package/sdk/dist/namespaces/service.d.ts +1 -1
- package/sdk/dist/namespaces/service.js +1 -1
- package/sdk/dist/namespaces/{operator-session.d.ts → session.d.ts} +135 -51
- package/sdk/dist/namespaces/session.d.ts.map +1 -0
- package/sdk/dist/namespaces/{operator-session.js → session.js} +118 -30
- package/sdk/dist/namespaces/session.js.map +1 -0
- package/sdk/dist/namespaces/subdomains.d.ts +5 -5
- package/sdk/dist/namespaces/subdomains.d.ts.map +1 -1
- package/sdk/dist/namespaces/subdomains.js +6 -6
- package/sdk/dist/namespaces/subdomains.js.map +1 -1
- package/sdk/dist/namespaces/tier.d.ts +44 -21
- package/sdk/dist/namespaces/tier.d.ts.map +1 -1
- package/sdk/dist/namespaces/tier.js +7 -7
- package/sdk/dist/namespaces/tier.js.map +1 -1
- package/sdk/dist/namespaces/transfers.d.ts +119 -85
- package/sdk/dist/namespaces/transfers.d.ts.map +1 -1
- package/sdk/dist/namespaces/transfers.js +31 -38
- package/sdk/dist/namespaces/transfers.js.map +1 -1
- package/sdk/dist/namespaces/vouchers.d.ts +9 -10
- package/sdk/dist/namespaces/vouchers.d.ts.map +1 -1
- package/sdk/dist/namespaces/vouchers.js +4 -5
- package/sdk/dist/namespaces/vouchers.js.map +1 -1
- package/sdk/dist/namespaces/wallets.d.ts +72 -3
- package/sdk/dist/namespaces/wallets.d.ts.map +1 -1
- package/sdk/dist/namespaces/wallets.js +141 -3
- package/sdk/dist/namespaces/wallets.js.map +1 -1
- package/sdk/dist/namespaces/write-approval.d.ts +101 -0
- package/sdk/dist/namespaces/write-approval.d.ts.map +1 -0
- package/sdk/dist/namespaces/write-approval.js +62 -0
- package/sdk/dist/namespaces/write-approval.js.map +1 -0
- package/sdk/dist/node/actions-node.d.ts +3 -3
- package/sdk/dist/node/actions-node.d.ts.map +1 -1
- package/sdk/dist/node/actions-node.js +44 -44
- 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-claim-key.d.ts → bearer-redeem-key.d.ts} +12 -12
- package/sdk/dist/node/bearer-redeem-key.d.ts.map +1 -0
- package/sdk/dist/node/{bearer-claim-key.js → bearer-redeem-key.js} +21 -21
- package/sdk/dist/node/bearer-redeem-key.js.map +1 -0
- package/sdk/dist/node/ci.d.ts +1 -1
- package/sdk/dist/node/ci.d.ts.map +1 -1
- package/sdk/dist/node/ci.js +6 -6
- package/sdk/dist/node/ci.js.map +1 -1
- package/sdk/dist/node/credentials.d.ts +18 -17
- package/sdk/dist/node/credentials.d.ts.map +1 -1
- package/sdk/dist/node/credentials.js +29 -28
- package/sdk/dist/node/credentials.js.map +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/funding-recovery.d.ts +1 -1
- package/sdk/dist/node/funding-recovery.d.ts.map +1 -1
- package/sdk/dist/node/funding-recovery.js +1 -1
- package/sdk/dist/node/funding-recovery.js.map +1 -1
- package/sdk/dist/node/gitvault-apply.d.ts +1 -1
- package/sdk/dist/node/gitvault-apply.d.ts.map +1 -1
- package/sdk/dist/node/gitvault-apply.js +1 -1
- package/sdk/dist/node/gitvault-apply.js.map +1 -1
- package/sdk/dist/node/gitvault-handoff.d.ts +22 -22
- package/sdk/dist/node/gitvault-handoff.d.ts.map +1 -1
- package/sdk/dist/node/gitvault-handoff.js +45 -45
- package/sdk/dist/node/gitvault-handoff.js.map +1 -1
- package/sdk/dist/node/gitvault-prewarm.js +7 -7
- package/sdk/dist/node/gitvault-prewarm.js.map +1 -1
- package/sdk/dist/node/gitvault-restore.d.ts +1 -1
- package/sdk/dist/node/gitvault-restore.js +1 -1
- package/sdk/dist/node/index.d.ts +16 -16
- package/sdk/dist/node/index.d.ts.map +1 -1
- package/sdk/dist/node/index.js +15 -15
- 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.d.ts +49 -0
- package/sdk/dist/node/org-adopt.d.ts.map +1 -0
- package/sdk/dist/node/org-adopt.js +77 -0
- package/sdk/dist/node/org-adopt.js.map +1 -0
- package/sdk/dist/node/paid-fetch.d.ts +7 -7
- package/sdk/dist/node/paid-fetch.d.ts.map +1 -1
- package/sdk/dist/node/paid-fetch.js +54 -54
- package/sdk/dist/node/paid-fetch.js.map +1 -1
- package/sdk/dist/node/preflight.d.ts +1 -1
- package/sdk/dist/node/preflight.d.ts.map +1 -1
- package/sdk/dist/node/preflight.js +1 -1
- package/sdk/dist/node/preflight.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/source-scan.d.ts +1 -1
- package/sdk/dist/node/source-scan.js +2 -2
- package/sdk/dist/node/source-scan.js.map +1 -1
- package/sdk/dist/scoped.d.ts +11 -11
- package/sdk/dist/scoped.d.ts.map +1 -1
- package/sdk/dist/scoped.js +5 -5
- package/sdk/dist/scoped.js.map +1 -1
- package/core-dist/operator-session.js +0 -154
- package/lib/allowance.mjs +0 -355
- package/lib/cloud.mjs +0 -256
- package/lib/core.mjs +0 -123
- package/lib/operator-proofs.mjs +0 -22
- package/lib/operator.mjs +0 -771
- package/sdk/core-dist/operator-session.js +0 -154
- package/sdk/dist/namespaces/allowance.d.ts +0 -79
- package/sdk/dist/namespaces/allowance.d.ts.map +0 -1
- package/sdk/dist/namespaces/allowance.js +0 -149
- package/sdk/dist/namespaces/allowance.js.map +0 -1
- package/sdk/dist/namespaces/operator-session.d.ts.map +0 -1
- package/sdk/dist/namespaces/operator-session.js.map +0 -1
- package/sdk/dist/namespaces/operator.d.ts +0 -359
- package/sdk/dist/namespaces/operator.d.ts.map +0 -1
- package/sdk/dist/namespaces/operator.js +0 -272
- package/sdk/dist/namespaces/operator.js.map +0 -1
- package/sdk/dist/node/bearer-claim-key.d.ts.map +0 -1
- package/sdk/dist/node/bearer-claim-key.js.map +0 -1
- package/sdk/dist/node/operator-claim.d.ts +0 -49
- package/sdk/dist/node/operator-claim.d.ts.map +0 -1
- package/sdk/dist/node/operator-claim.js +0 -77
- package/sdk/dist/node/operator-claim.js.map +0 -1
package/lib/cold-start.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `cold-start.mjs` — the minimal x402/Base-Sepolia cold-start chain
|
|
3
|
-
* (kygit-handoff design D5):
|
|
3
|
+
* (kygit-handoff design D5): wallet → faucet → one x402 prototype
|
|
4
4
|
* payment. `repos create` (and so `kygit create`) folds this in when it is
|
|
5
5
|
* refused `NO_ACTIVE_TIER`, so `kygit create` on a genuinely fresh machine
|
|
6
6
|
* ends with a vault, no human signup, no cloud dashboard.
|
|
7
7
|
*
|
|
8
|
-
* This is the SAME shape `run402 init` already walks (
|
|
8
|
+
* This is the SAME shape `run402 init` already walks (create the wallet →
|
|
9
9
|
* balance check → faucet → tier), factored down to the x402/Base-Sepolia
|
|
10
10
|
* default rail only (MPP/Tempo is `init`'s own separate concern — an agent
|
|
11
11
|
* hitting NO_ACTIVE_TIER mid-`repos create` gets the default rail, not a
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* create` needs when it discovers there is no tier and nothing else has
|
|
16
16
|
* set one up yet.
|
|
17
17
|
*
|
|
18
|
-
* add-room-invite design D9 splits the funded-wallet half (
|
|
18
|
+
* add-room-invite design D9 splits the funded-wallet half (wallet →
|
|
19
19
|
* faucet-if-empty → brief settlement poll) out as {@link ensureFundedWallet}
|
|
20
20
|
* — `rooms join <key>` needs exactly that half, with NO tier purchase and NO
|
|
21
21
|
* project creation (the claim itself is the one x402 payment that funds the
|
|
@@ -23,42 +23,42 @@
|
|
|
23
23
|
* `ensureFundedWallet` followed by the tier step — so every EXISTING caller
|
|
24
24
|
* (`repos create`/`resume`/`join`) is unchanged.
|
|
25
25
|
*/
|
|
26
|
-
import {
|
|
26
|
+
import { readWallet, saveWallet } from "./config.mjs";
|
|
27
27
|
import { getSdk } from "./sdk.mjs";
|
|
28
28
|
|
|
29
29
|
const USDC_ABI = [{ name: "balanceOf", type: "function", stateMutability: "view", inputs: [{ name: "account", type: "address" }], outputs: [{ name: "", type: "uint256" }] }];
|
|
30
30
|
const USDC_SEPOLIA = "0x036CbD53842c5426634e7929541eC2318f3dCF7e";
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
|
-
*
|
|
33
|
+
* Wallet → faucet-if-empty → brief settlement poll. NO tier purchase, no
|
|
34
34
|
* project creation — the caller decides what (if anything) to pay for next.
|
|
35
35
|
*
|
|
36
36
|
* @param {(line: string) => void} announce Called once per step, so the
|
|
37
37
|
* caller can print each one it took (client-surface spec: "announcing
|
|
38
38
|
* each step").
|
|
39
|
-
* @returns {Promise<{
|
|
39
|
+
* @returns {Promise<{wallet_created: boolean, faucet_requested: boolean, address: string}>}
|
|
40
40
|
*/
|
|
41
41
|
export async function ensureFundedWallet(announce = () => {}) {
|
|
42
|
-
const out = {
|
|
42
|
+
const out = { wallet_created: false, faucet_requested: false, address: "" };
|
|
43
43
|
|
|
44
|
-
let
|
|
45
|
-
if (!
|
|
44
|
+
let localWallet = readWallet();
|
|
45
|
+
if (!localWallet) {
|
|
46
46
|
const { generatePrivateKey, privateKeyToAccount } = await import("viem/accounts");
|
|
47
47
|
const privateKey = generatePrivateKey();
|
|
48
48
|
const account = privateKeyToAccount(privateKey);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
out.
|
|
52
|
-
announce(`
|
|
49
|
+
localWallet = { address: account.address, privateKey, created: new Date().toISOString(), funded: false, rail: "x402" };
|
|
50
|
+
saveWallet(localWallet);
|
|
51
|
+
out.wallet_created = true;
|
|
52
|
+
announce(`wallet created: ${localWallet.address}`);
|
|
53
53
|
}
|
|
54
|
-
out.address =
|
|
54
|
+
out.address = localWallet.address;
|
|
55
55
|
|
|
56
56
|
const { createPublicClient, http } = await import("viem");
|
|
57
57
|
const { baseSepolia } = await import("viem/chains");
|
|
58
58
|
const client = createPublicClient({ chain: baseSepolia, transport: http() });
|
|
59
59
|
let balance = 0;
|
|
60
60
|
try {
|
|
61
|
-
balance = Number(await client.readContract({ address: USDC_SEPOLIA, abi: USDC_ABI, functionName: "balanceOf", args: [
|
|
61
|
+
balance = Number(await client.readContract({ address: USDC_SEPOLIA, abi: USDC_ABI, functionName: "balanceOf", args: [localWallet.address] }));
|
|
62
62
|
} catch {
|
|
63
63
|
/* an RPC hiccup here is not fatal — the payment below will surface a real failure if the balance really is zero */
|
|
64
64
|
}
|
|
@@ -67,19 +67,19 @@ export async function ensureFundedWallet(announce = () => {}) {
|
|
|
67
67
|
// The faucet is throttled (0.25 USDC / 24h): a throttle refusal is
|
|
68
68
|
// surfaced with its wait and NEVER retried silently (client-surface
|
|
69
69
|
// spec) — this call is not wrapped in a swallowing catch.
|
|
70
|
-
await getSdk().
|
|
70
|
+
await getSdk().wallets.faucet(localWallet.address);
|
|
71
71
|
out.faucet_requested = true;
|
|
72
72
|
announce("faucet requested — waiting briefly for on-chain confirmation");
|
|
73
73
|
for (let i = 0; i < 30; i++) {
|
|
74
74
|
await new Promise((r) => setTimeout(r, 1000));
|
|
75
75
|
try {
|
|
76
|
-
balance = Number(await client.readContract({ address: USDC_SEPOLIA, abi: USDC_ABI, functionName: "balanceOf", args: [
|
|
76
|
+
balance = Number(await client.readContract({ address: USDC_SEPOLIA, abi: USDC_ABI, functionName: "balanceOf", args: [localWallet.address] }));
|
|
77
77
|
if (balance > 0) break;
|
|
78
78
|
} catch {
|
|
79
79
|
/* keep polling */
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
|
-
|
|
82
|
+
saveWallet({ ...localWallet, funded: true, lastFaucet: new Date().toISOString() });
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
return out;
|
|
@@ -91,13 +91,13 @@ export async function ensureFundedWallet(announce = () => {}) {
|
|
|
91
91
|
* no edits.
|
|
92
92
|
*
|
|
93
93
|
* @param {(line: string) => void} announce Called once per step.
|
|
94
|
-
* @returns {Promise<{
|
|
94
|
+
* @returns {Promise<{wallet_created: boolean, faucet_requested: boolean, tier: object|null}>}
|
|
95
95
|
*/
|
|
96
96
|
export async function foldColdStartChain(announce = () => {}) {
|
|
97
97
|
const funded = await ensureFundedWallet(announce);
|
|
98
98
|
|
|
99
|
-
announce("
|
|
99
|
+
announce("setting the prototype tier (one x402 testnet payment; the free tier, no lease)");
|
|
100
100
|
const tier = await getSdk().tier.set("prototype");
|
|
101
101
|
announce(`prototype tier active${tier?.status === "already_active" ? " (already active)" : ""}`);
|
|
102
|
-
return {
|
|
102
|
+
return { wallet_created: funded.wallet_created, faucet_requested: funded.faucet_requested, tier };
|
|
103
103
|
}
|
package/lib/command-manifest.mjs
CHANGED
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
* positionals canonical positional ATTRIBUTES (post-conventions).
|
|
14
14
|
* A variadic list of the SAME kind counts as one.
|
|
15
15
|
* projectScoped command operates on a project and accepts
|
|
16
|
-
* `--project <
|
|
16
|
+
* `--project <project_id>` (precedence: --project > legacy
|
|
17
17
|
* leading prj_ positional > active project)
|
|
18
18
|
* orgScoped command acts ON an organization and resolves it
|
|
19
19
|
* through the ONE shared chain (cli-org-context):
|
|
20
20
|
* an optional leading <org_id> positional, else
|
|
21
21
|
* --org, else RUN402_ORG, else the .run402.json
|
|
22
|
-
* binding, else `
|
|
22
|
+
* binding, else `orgs use`. The gate drives every
|
|
23
23
|
* such entry through --org AND RUN402_ORG with no
|
|
24
24
|
* positional and fails on any "Missing <org_id>".
|
|
25
25
|
* Any entry with an `org_id` positional MUST be
|
|
@@ -107,6 +107,8 @@ export const COMMAND_MANIFEST = [
|
|
|
107
107
|
{ path: ["wallets", "unbind"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
108
108
|
{ path: ["wallets", "import"], positionals: [p("name")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["gate-import-wallet", "--key", "__FIXTURE_FILE__"] },
|
|
109
109
|
{ path: ["wallets", "rm"], positionals: [p("name")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["no-such-wallet", "--yes"] },
|
|
110
|
+
{ path: ["wallets", "fund"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [], skipBehavioral: "polls on-chain funding with sleeps" },
|
|
111
|
+
{ path: ["wallets", "balance"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
110
112
|
{ path: ["wallets", "lightning"], positionals: [p("action", { required: false })], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["status"] },
|
|
111
113
|
|
|
112
114
|
// ── credentials (gateway project credentials) ────────────────────────────
|
|
@@ -124,14 +126,6 @@ export const COMMAND_MANIFEST = [
|
|
|
124
126
|
{ path: ["credentials", "project-keys", "export"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["--reveal"] },
|
|
125
127
|
{ path: ["credentials", "project-keys", "remove"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [] },
|
|
126
128
|
|
|
127
|
-
// ── allowance ────────────────────────────────────────────────────────────
|
|
128
|
-
{ path: ["allowance", "status"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
129
|
-
{ path: ["allowance", "create"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [], skipBehavioral: "creates a real local wallet key outside the gate's scratch profile" },
|
|
130
|
-
{ path: ["allowance", "fund"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [], skipBehavioral: "polls on-chain funding with sleeps" },
|
|
131
|
-
{ path: ["allowance", "balance"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
132
|
-
{ path: ["allowance", "export"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
133
|
-
{ path: ["allowance", "checkout"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["--amount", "5000000"] },
|
|
134
|
-
{ path: ["allowance", "history"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
135
129
|
|
|
136
130
|
// ── tier ─────────────────────────────────────────────────────────────────
|
|
137
131
|
{ path: ["tier", "status"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
@@ -157,7 +151,6 @@ export const COMMAND_MANIFEST = [
|
|
|
157
151
|
{ path: ["projects", "delete"], positionals: [], projectScoped: true, legacyPositionalProject: true, minimalArgs: [] },
|
|
158
152
|
{ path: ["projects", "promote-user"], positionals: [p("email")], projectScoped: true, legacyPositionalProject: true, minimalArgs: ["user@example.com"] },
|
|
159
153
|
{ path: ["projects", "demote-user"], positionals: [p("email")], projectScoped: true, legacyPositionalProject: true, minimalArgs: ["user@example.com"] },
|
|
160
|
-
{ path: ["projects", "export"], positionals: [], projectScoped: true, legacyPositionalProject: true, minimalArgs: [] },
|
|
161
154
|
|
|
162
155
|
// ── snapshots ────────────────────────────────────────────────────────────
|
|
163
156
|
{ path: ["snapshots", "create"], positionals: [], projectScoped: true, legacyPositionalProject: true, minimalArgs: [] },
|
|
@@ -177,27 +170,30 @@ export const COMMAND_MANIFEST = [
|
|
|
177
170
|
{ path: ["admin", "archive"], positionals: [], projectScoped: true, legacyPositionalProject: true, minimalArgs: ["--reason", "gate"] },
|
|
178
171
|
{ path: ["admin", "reactivate"], positionals: [], projectScoped: true, legacyPositionalProject: true, minimalArgs: [] },
|
|
179
172
|
|
|
180
|
-
// ──
|
|
181
|
-
{ path: ["
|
|
182
|
-
{ path: ["
|
|
183
|
-
{ path: ["
|
|
173
|
+
// ── archives ─────────────────────────────────────────────────────────────
|
|
174
|
+
{ path: ["archives", "create"], positionals: [], projectScoped: true, legacyPositionalProject: true, minimalArgs: [] },
|
|
175
|
+
{ path: ["archives", "download"], positionals: [p("archive_id")], projectScoped: true, legacyPositionalProject: true, minimalArgs: ["arc_gate1", "--output", "__OUT_FILE__"] },
|
|
176
|
+
{ path: ["archives", "status"], positionals: [p("archive_id")], projectScoped: true, legacyPositionalProject: true, minimalArgs: ["arc_gate1"] },
|
|
184
177
|
{ path: ["archives", "inspect"], positionals: [p("archive_path")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["__FIXTURE_FILE__"] },
|
|
185
178
|
{ path: ["archives", "verify"], positionals: [p("archive_path")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["__FIXTURE_FILE__"] },
|
|
186
|
-
{ path: ["
|
|
179
|
+
{ path: ["archives", "import"], positionals: [p("archive_path")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["__FIXTURE_FILE__", "--name", "gate-import"] },
|
|
187
180
|
|
|
188
181
|
// ── deploy (unified deploy v2) ───────────────────────────────────────────
|
|
189
|
-
|
|
182
|
+
// Bare `run402 deploy` IS the deploy (a verb); the family's subcommands
|
|
183
|
+
// follow. Dispatched flat through deploy.mjs so the gate exercises the
|
|
184
|
+
// same argv decision a person's shell does.
|
|
185
|
+
{ path: ["deploy"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["--spec", "{}", "--check"], runStyle: "flat" },
|
|
190
186
|
{ path: ["deploy", "rehearse"], positionals: [p("plan_id", { required: false })], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["plan_gate1"], runStyle: "deployV2" },
|
|
191
187
|
{ path: ["deploy", "promote"], positionals: [p("release_id")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["rel_gate1"], runStyle: "deployV2" },
|
|
192
188
|
{ path: ["deploy", "resume"], positionals: [p("operation_id")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["op_gate1"], runStyle: "deployV2" },
|
|
189
|
+
{ path: ["deploy", "status"], positionals: [p("operation_id")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["op_gate1"], runStyle: "deployV2" },
|
|
193
190
|
{ path: ["deploy", "list"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "deployV2" },
|
|
194
191
|
{ path: ["deploy", "events"], positionals: [p("operation_id")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["op_gate1"], runStyle: "deployV2" },
|
|
195
192
|
{ path: ["deploy", "verify"], positionals: [p("operation_id", { required: false })], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["op_gate1"], runStyle: "deployV2" },
|
|
196
|
-
{ path: ["deploy", "
|
|
197
|
-
{ path: ["deploy", "
|
|
198
|
-
{ path: ["deploy", "
|
|
199
|
-
{ path: ["deploy", "
|
|
200
|
-
{ path: ["deploy", "resolve"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["--url", "https://example.com/"], runStyle: "deployV2" },
|
|
193
|
+
{ path: ["deploy", "releases", "get"], positionals: [p("release_id")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["rel_gate1"], runStyle: "deployV2" },
|
|
194
|
+
{ path: ["deploy", "releases", "active"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "deployV2" },
|
|
195
|
+
{ path: ["deploy", "releases", "diff"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["--from", "empty", "--to", "active"], runStyle: "deployV2" },
|
|
196
|
+
{ path: ["deploy", "resolve"], positionals: [p("url", { required: false })], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["https://example.com/"], runStyle: "deployV2" },
|
|
201
197
|
|
|
202
198
|
// ── ci ───────────────────────────────────────────────────────────────────
|
|
203
199
|
{ path: ["ci", "link"], positionals: [p("provider")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["github"] },
|
|
@@ -210,34 +206,32 @@ export const COMMAND_MANIFEST = [
|
|
|
210
206
|
{ path: ["transfer", "preview"], positionals: [p("transfer_id")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["tr_gate1"] },
|
|
211
207
|
{ path: ["transfer", "list"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
212
208
|
{ path: ["transfer", "accept"], positionals: [p("transfer_id")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["tr_gate1"] },
|
|
213
|
-
{ path: ["transfer", "claim"], positionals: [p("transfer_id")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["tr_gate1"] },
|
|
214
209
|
{ path: ["transfer", "cancel"], positionals: [p("transfer_id")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["tr_gate1"] },
|
|
215
210
|
|
|
216
|
-
// ──
|
|
217
|
-
{ path: ["
|
|
218
|
-
{ path: ["
|
|
219
|
-
{ path: ["
|
|
220
|
-
{ path: ["
|
|
221
|
-
{ path: ["
|
|
211
|
+
// ── orgs ──────────────────────────────────────────────────────────────────
|
|
212
|
+
{ path: ["orgs", "create"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
213
|
+
{ path: ["orgs", "list"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
214
|
+
{ path: ["orgs", "get"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG] },
|
|
215
|
+
{ path: ["orgs", "rename"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--name", "Gate"] },
|
|
216
|
+
{ path: ["orgs", "payout-wallet"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "0x1111111111111111111111111111111111111111"] },
|
|
222
217
|
// `--org` (not a positional org_id
|
|
223
218
|
// like rename/payout-wallet above) goes through resolveOrg's SHAPE
|
|
224
219
|
// validation (a real UUID) — "org_gate1" fails that locally, so this needs
|
|
225
|
-
// the same UUID-shaped fixture `
|
|
226
|
-
{ path: ["
|
|
227
|
-
{ path: ["
|
|
228
|
-
{ path: ["
|
|
229
|
-
{ path: ["
|
|
230
|
-
{ path: ["
|
|
231
|
-
{ path: ["
|
|
232
|
-
{ path: ["
|
|
233
|
-
{ path: ["
|
|
234
|
-
{ path: ["
|
|
235
|
-
{ path: ["
|
|
236
|
-
{ path: ["
|
|
237
|
-
{ path: ["
|
|
238
|
-
{ path: ["
|
|
239
|
-
{ path: ["
|
|
240
|
-
{ path: ["org", "invite", "rm"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--principal", "prn_gate1"] },
|
|
220
|
+
// the same UUID-shaped fixture `orgs use` below already established.
|
|
221
|
+
{ path: ["orgs", "slug"], positionals: [p("slug")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["acme", "--org", "11111111-2222-3333-4444-555555555555"] },
|
|
222
|
+
{ path: ["orgs", "audit"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG] },
|
|
223
|
+
{ path: ["orgs", "use"], positionals: [p("org_id")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["11111111-2222-3333-4444-555555555555"] },
|
|
224
|
+
{ path: ["orgs", "current"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
225
|
+
{ path: ["orgs", "clear"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
226
|
+
{ path: ["orgs", "bind"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["--org", "11111111-2222-3333-4444-555555555555"] },
|
|
227
|
+
{ path: ["orgs", "unbind"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
228
|
+
{ path: ["orgs", "members", "list"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG] },
|
|
229
|
+
{ path: ["orgs", "members", "add"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "0x1111111111111111111111111111111111111111"] },
|
|
230
|
+
{ path: ["orgs", "members", "role"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--principal", "prn_gate1", "--role", "viewer"] },
|
|
231
|
+
{ path: ["orgs", "members", "rm"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--principal", "prn_gate1"] },
|
|
232
|
+
{ path: ["orgs", "invite", "list"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG] },
|
|
233
|
+
{ path: ["orgs", "invite", "create"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--email", "gate@example.com"] },
|
|
234
|
+
{ path: ["orgs", "invite", "rm"], positionals: [p("org_id", { required: false })], projectScoped: false, orgScoped: true, legacyPositionalProject: false, minimalArgs: [GATE_ORG, "--principal", "prn_gate1"] },
|
|
241
235
|
|
|
242
236
|
// ── grants ───────────────────────────────────────────────────────────────
|
|
243
237
|
{ path: ["grants", "create"], positionals: [p("wallet")], projectScoped: true, legacyPositionalProject: true, minimalArgs: ["0x1111111111111111111111111111111111111111", "--capability", "deploy"] },
|
|
@@ -249,8 +243,8 @@ export const COMMAND_MANIFEST = [
|
|
|
249
243
|
{ path: ["delegates", "revoke"], legacyPositionalProject: false, positionals: [p("delegate_id")], projectScoped: true, minimalArgs: ["dlg_gate1"] },
|
|
250
244
|
{ path: ["delegates", "rotate"], legacyPositionalProject: false, positionals: [p("delegate_id")], projectScoped: true, minimalArgs: ["dlg_gate1"] },
|
|
251
245
|
|
|
252
|
-
// ── events /
|
|
253
|
-
{ path: ["events"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "
|
|
246
|
+
// ── events / live ────────────────────────────────────────────────────────
|
|
247
|
+
{ path: ["events", "list"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub" },
|
|
254
248
|
{ path: ["live"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["--tables", "cells", "--once"], runStyle: "merged" },
|
|
255
249
|
{ path: ["deliveries", "list"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub" },
|
|
256
250
|
{ path: ["deliveries", "get"], positionals: [p("notification_id")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["n_1"], runStyle: "sub" },
|
|
@@ -266,9 +260,11 @@ export const COMMAND_MANIFEST = [
|
|
|
266
260
|
// add-room-invite design D9: `rooms join` is one verb, two forms — no
|
|
267
261
|
// positional registers a presence (the behaviorally-tested path, unchanged
|
|
268
262
|
// by the optional positional below since minimalArgs stays empty); a
|
|
269
|
-
// `kri1_…` positional
|
|
263
|
+
// `kri1_…` positional redeems the key first (a real x402 payment + an
|
|
270
264
|
// org-membership mutation), so that form is never behaviorally exercised
|
|
271
265
|
// here — the same reasoning `repos join`'s own row states.
|
|
266
|
+
{ path: ["rooms", "list"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub" },
|
|
267
|
+
{ path: ["rooms", "get"], positionals: [p("room_key")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["run402-dev"], runStyle: "sub" },
|
|
272
268
|
{ path: ["rooms", "join"], positionals: [p("key", { required: false })], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub" },
|
|
273
269
|
{ path: ["rooms", "invite"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub", skipBehavioral: "mints a single-use bearer key from a live room, registering the inviter's presence and posting a real room message — never run against the gate's own checkout" },
|
|
274
270
|
{ path: ["rooms", "leave"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub" },
|
|
@@ -329,7 +325,8 @@ export const COMMAND_MANIFEST = [
|
|
|
329
325
|
// Principal-scoped (one bundle covers every vault you can read), so no
|
|
330
326
|
// --project — deliberately unlike its eleven vault-scoped siblings.
|
|
331
327
|
{ path: ["repos", "recovery-bundle"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["--out", "-"], runStyle: "sub", skipBehavioral: "exports the caller's live member recovery bundle (stamps recovery-posture export evidence server-side)" },
|
|
332
|
-
{ path: ["errors"
|
|
328
|
+
{ path: ["errors", "list"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [], runStyle: "sub" },
|
|
329
|
+
{ path: ["errors", "get"], positionals: [p("fingerprint_id")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["fp_gate1"], runStyle: "sub" },
|
|
333
330
|
|
|
334
331
|
// ── jobs ─────────────────────────────────────────────────────────────────
|
|
335
332
|
{ path: ["jobs", "submit"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["--file", "__FIXTURE_FILE__"] },
|
|
@@ -375,7 +372,7 @@ export const COMMAND_MANIFEST = [
|
|
|
375
372
|
{ path: ["sites", "deploy-dir"], positionals: [p("dir")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["__SCRATCH_DIR__"] },
|
|
376
373
|
|
|
377
374
|
// ── subdomains ───────────────────────────────────────────────────────────
|
|
378
|
-
{ path: ["subdomains", "
|
|
375
|
+
{ path: ["subdomains", "add"], positionals: [p("name")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["gate-sub"] },
|
|
379
376
|
{ path: ["subdomains", "list"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [] },
|
|
380
377
|
{ path: ["subdomains", "delete"], positionals: [p("name")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["gate-sub", "--confirm"] },
|
|
381
378
|
|
|
@@ -427,18 +424,16 @@ export const COMMAND_MANIFEST = [
|
|
|
427
424
|
{ path: ["email", "webhooks", "deliveries"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: [] },
|
|
428
425
|
{ path: ["email", "webhooks", "redrive"], positionals: [p("delivery_id")], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["dlv_gate1"] },
|
|
429
426
|
|
|
430
|
-
// ── message / agent /
|
|
427
|
+
// ── message / agent / sign-in ────────────────────────────────────────────
|
|
431
428
|
{ path: ["feedback", "send"], positionals: [p("words", { variadic: true })], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["hello", "from", "the", "gate"] },
|
|
432
429
|
{ path: ["agent", "contact"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["--name", "gate-agent"] },
|
|
433
430
|
{ path: ["agent", "status"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
434
431
|
{ path: ["agent", "verify-email"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
435
432
|
{ path: ["agent", "passkey"], positionals: [p("action")], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["enroll"] },
|
|
436
|
-
{ path: ["
|
|
437
|
-
{ path: ["
|
|
438
|
-
{ path: ["
|
|
439
|
-
{ path: ["
|
|
440
|
-
{ path: ["operator", "claim-wallet-org"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
441
|
-
{ path: ["operator", "approve"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["--action", "org.project.create", "--org", "org_gate1", "--no-open"] },
|
|
433
|
+
{ path: ["login"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [], runStyle: "flat", skipBehavioral: "opens a browser / loopback listener" },
|
|
434
|
+
{ path: ["logout"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [], runStyle: "flat" },
|
|
435
|
+
{ path: ["whoami"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [], runStyle: "flat", skipBehavioral: "requires live principal authentication" },
|
|
436
|
+
{ path: ["approve"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: ["--action", "org.project.create", "--org", "org_gate1", "--no-open"], runStyle: "flat" },
|
|
442
437
|
|
|
443
438
|
// ── auth ─────────────────────────────────────────────────────────────────
|
|
444
439
|
{ path: ["auth", "magic-link"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["--email", "gate@example.com", "--redirect", "https://example.com/cb"] },
|
|
@@ -488,8 +483,8 @@ export const COMMAND_MANIFEST = [
|
|
|
488
483
|
// without rejecting it," which this satisfies.
|
|
489
484
|
{ path: ["doctor"], positionals: [], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["--no-scan"], runStyle: "merged" },
|
|
490
485
|
{ path: ["webhook-secret", "rotate"], positionals: [], projectScoped: false, legacyPositionalProject: false, minimalArgs: [] },
|
|
491
|
-
// `run402 logs [<function>] --request-id <
|
|
492
|
-
// the function name (`run402 errors` samples print it that way); it is
|
|
486
|
+
// `run402 logs [<function>] --request-id <request_id>`: the optional positional is
|
|
487
|
+
// the function name (`run402 errors list` samples print it that way); it is
|
|
493
488
|
// never a project id.
|
|
494
489
|
{ path: ["logs"], positionals: [p("function", { required: false })], projectScoped: true, legacyPositionalProject: false, minimalArgs: ["--request-id", "req_gate123"], runStyle: "merged" },
|
|
495
490
|
];
|
|
@@ -497,7 +492,6 @@ export const COMMAND_MANIFEST = [
|
|
|
497
492
|
// Families deliberately absent from the manifest, consumed by the gate's
|
|
498
493
|
// completeness check against cli.mjs's dispatch switch.
|
|
499
494
|
export const SKIPPED_FAMILIES = {
|
|
500
|
-
"apply": "pure alias for `deploy apply` (covered by the deploy family)",
|
|
501
495
|
"dev": "interactive wrapper that spawns `astro dev`",
|
|
502
496
|
// RESERVED, not dispatched: every `run402 message …` fails with
|
|
503
497
|
// COMMAND_REMOVED pointing at `feedback send` / `messages send` /
|
|
@@ -538,22 +532,13 @@ export const SKIPPED_FAMILIES = {
|
|
|
538
532
|
export const RESERVED_SUBCOMMANDS = {
|
|
539
533
|
"source-access:export": "moved to `repos recovery-bundle` — the artifact `repos recover --bundle` consumes belongs to the repos family",
|
|
540
534
|
"source-access:status": "moved to `repos access` — your own wrapper custody rides its member_custody block; the org advisory is `doctor --only recovery_posture`",
|
|
541
|
-
"rooms:who": "renamed to `rooms join` — an interrogative must not name a write",
|
|
542
|
-
"rooms:send": "moved to `messages send` — the verb acts on a message",
|
|
543
|
-
// The routes and SDK methods for room list/get exist (agent-room-lifecycle);
|
|
544
|
-
// only these two SPELLINGS are held back, because they were freed from
|
|
545
|
-
// meaning "list/get MESSAGES" and a reused spelling changes meaning without
|
|
546
|
-
// ever failing. One major, then they may name the room.
|
|
547
|
-
"rooms:list": "moved to `messages list` — the verb acts on a message",
|
|
548
|
-
"rooms:get": "moved to `messages get` — the verb acts on a message",
|
|
549
|
-
"rooms:ack": "moved to `messages ack` — the verb acts on a message",
|
|
550
535
|
"escalations:contacts": "merged into `contacts` — the ladder and Telegram channels are one question",
|
|
551
536
|
// Every `gitvault <verb>` spelling. Nine
|
|
552
537
|
// answer COMMAND_MOVED naming their `repos` successor; `push` and
|
|
553
538
|
// `reconcile` answer COMMAND_REMOVED (no equivalent successor for either —
|
|
554
539
|
// `push`'s one-release alias window is over, `reconcile` was a workaround
|
|
555
540
|
// with no permanent replacement, only a read at `repos access`).
|
|
556
|
-
"gitvault:init": "moved to `repos create --project <
|
|
541
|
+
"gitvault:init": "moved to `repos create --project <project_id>`",
|
|
557
542
|
"gitvault:status": "moved to `repos view`",
|
|
558
543
|
"gitvault:snapshot": "moved to `repos snapshot`",
|
|
559
544
|
"gitvault:policy": "moved to `repos policy`",
|
package/lib/config.mjs
CHANGED
|
@@ -12,22 +12,22 @@ import {
|
|
|
12
12
|
getLegacyProjectsPath,
|
|
13
13
|
getProfileStatePath,
|
|
14
14
|
getProjectCredentialsPath,
|
|
15
|
-
|
|
15
|
+
getWalletPath,
|
|
16
16
|
configureApiBase,
|
|
17
17
|
isCoreApiTarget,
|
|
18
18
|
readApiTargetConfig,
|
|
19
19
|
} from "../core-dist/config.js";
|
|
20
|
-
import {
|
|
20
|
+
import { readWallet as coreReadWallet, saveWallet as coreSaveWallet } from "../core-dist/wallet.js";
|
|
21
21
|
import { loadKeyStore, getProject, saveProject, updateProject, removeProject, saveKeyStore, getActiveProjectId, setActiveProjectId } from "../core-dist/keystore.js";
|
|
22
|
-
import {
|
|
22
|
+
import { getWalletAuthHeaders as coreGetWalletAuthHeaders } from "../core-dist/wallet-auth.js";
|
|
23
23
|
import { fail } from "./sdk-errors.mjs";
|
|
24
24
|
import { initializeWalletAction, selectProjectAction } from "./next-actions.mjs";
|
|
25
25
|
|
|
26
26
|
// Wallet-dependent paths are exposed as getters (preferred — they always
|
|
27
27
|
// reflect the active profile, even if some future code path imports this module
|
|
28
|
-
// before wallet resolution). Production code (init/doctor/
|
|
28
|
+
// before wallet resolution). Production code (init/doctor/wallet) uses these.
|
|
29
29
|
export function configDir() { return getConfigDir(); }
|
|
30
|
-
export function
|
|
30
|
+
export function walletFile() { return getWalletPath(); }
|
|
31
31
|
export function projectCredentialsFile() { return getProjectCredentialsPath(); }
|
|
32
32
|
export function profileStateFile() { return getProfileStatePath(); }
|
|
33
33
|
export function legacyProjectsFile() { return getLegacyProjectsPath(); }
|
|
@@ -45,7 +45,7 @@ export function activeProfile() { return getActiveProfile(); }
|
|
|
45
45
|
// module, and tests set RUN402_CONFIG_DIR before importing. New code should
|
|
46
46
|
// prefer the getters above.
|
|
47
47
|
export const CONFIG_DIR = getConfigDir();
|
|
48
|
-
export const
|
|
48
|
+
export const WALLET_FILE = getWalletPath();
|
|
49
49
|
export const PROJECTS_FILE = getProjectCredentialsPath();
|
|
50
50
|
export const PROJECT_CREDENTIALS_FILE = getProjectCredentialsPath();
|
|
51
51
|
export const PROFILE_STATE_FILE = getProfileStatePath();
|
|
@@ -54,40 +54,40 @@ export const PROFILE_STATE_FILE = getProfileStatePath();
|
|
|
54
54
|
export const API = getApiBase();
|
|
55
55
|
|
|
56
56
|
/**
|
|
57
|
-
* Wraps core's `
|
|
57
|
+
* Wraps core's `readWallet()` and converts the malformed-shape throw
|
|
58
58
|
* into the canonical CLI failure envelope. Without this guard, every
|
|
59
|
-
* CLI subcommand that touches the
|
|
60
|
-
* source paths the moment a user has a malformed `
|
|
59
|
+
* CLI subcommand that touches the wallet leaks a Node stack trace and
|
|
60
|
+
* source paths the moment a user has a malformed `wallet.json`.
|
|
61
61
|
*
|
|
62
62
|
* The unparseable-JSON case still returns `null` (matching the historical
|
|
63
|
-
* "
|
|
64
|
-
* error with `code:
|
|
63
|
+
* "no_wallet" UX); only valid-JSON-but-wrong-shape becomes a structured
|
|
64
|
+
* error with `code: BAD_WALLET_FILE`.
|
|
65
65
|
*/
|
|
66
|
-
export function
|
|
66
|
+
export function readWallet() {
|
|
67
67
|
try {
|
|
68
|
-
return
|
|
68
|
+
return coreReadWallet();
|
|
69
69
|
} catch (err) {
|
|
70
70
|
fail({
|
|
71
|
-
code: "
|
|
72
|
-
message: err?.message ?? "
|
|
73
|
-
hint: "Back up ~/.config/run402/
|
|
74
|
-
details: { path:
|
|
71
|
+
code: "BAD_WALLET_FILE",
|
|
72
|
+
message: err?.message ?? "wallet.json is malformed",
|
|
73
|
+
hint: "Back up ~/.config/run402/wallet.json and run 'run402 init' to recreate it.",
|
|
74
|
+
details: { path: walletFile() },
|
|
75
75
|
next_actions: [initializeWalletAction()],
|
|
76
76
|
});
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
export function
|
|
81
|
-
|
|
80
|
+
export function saveWallet(data) {
|
|
81
|
+
coreSaveWallet(data);
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
export function
|
|
85
|
-
const headers =
|
|
84
|
+
export function walletAuthHeaders(path) {
|
|
85
|
+
const headers = coreGetWalletAuthHeaders(path);
|
|
86
86
|
if (!headers) {
|
|
87
87
|
fail({
|
|
88
|
-
code: "
|
|
89
|
-
message: "No
|
|
90
|
-
hint: "Run: run402
|
|
88
|
+
code: "NO_WALLET",
|
|
89
|
+
message: "No local wallet found.",
|
|
90
|
+
hint: "Run: run402 init",
|
|
91
91
|
next_actions: [initializeWalletAction()],
|
|
92
92
|
});
|
|
93
93
|
}
|
|
@@ -101,11 +101,11 @@ export function findProject(id) {
|
|
|
101
101
|
fail({
|
|
102
102
|
code: "PROJECT_CREDENTIAL_NOT_FOUND",
|
|
103
103
|
message: `No local project credentials cached for ${idStr}.`,
|
|
104
|
-
hint: "Use a principal-auth command, or import project keys with `run402 credentials project-keys import --project <
|
|
104
|
+
hint: "Use a principal-auth command, or import project keys with `run402 credentials project-keys import --project <project_id> --service-key-stdin`.",
|
|
105
105
|
details: { project_id: idStr, source: "local_cache", cache_path: projectCredentialsFile(), wallet: activeProfile(), profile: activeProfile() },
|
|
106
106
|
next_actions: [{
|
|
107
107
|
type: "run_command",
|
|
108
|
-
command: `run402 credentials project-keys status --project ${idStr || "<
|
|
108
|
+
command: `run402 credentials project-keys status --project ${idStr || "<project_id>"}`,
|
|
109
109
|
why: "Inspect the local project-key cache without revealing secrets.",
|
|
110
110
|
}],
|
|
111
111
|
});
|
|
@@ -119,7 +119,7 @@ export function resolveProject(id) {
|
|
|
119
119
|
fail({
|
|
120
120
|
code: "PROJECT_REQUIRED",
|
|
121
121
|
message: "no project specified and no active project set.",
|
|
122
|
-
hint: "Pass --project <
|
|
122
|
+
hint: "Pass --project <project_id>, set RUN402_PROJECT_ID, or run: run402 projects use <project_id>",
|
|
123
123
|
next_actions: [selectProjectAction()],
|
|
124
124
|
});
|
|
125
125
|
}
|
|
@@ -132,7 +132,7 @@ export function resolveProjectId(id) {
|
|
|
132
132
|
fail({
|
|
133
133
|
code: "PROJECT_REQUIRED",
|
|
134
134
|
message: "no project specified and no active project set.",
|
|
135
|
-
hint: "Pass --project <
|
|
135
|
+
hint: "Pass --project <project_id>, set RUN402_PROJECT_ID, or run: run402 projects use <project_id>",
|
|
136
136
|
next_actions: [selectProjectAction()],
|
|
137
137
|
});
|
|
138
138
|
}
|