@sofer_agent/cli 0.3.3 → 0.3.5
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/dist/init.d.ts.map +1 -1
- package/dist/init.js +34 -14
- package/dist/init.js.map +1 -1
- package/package.json +1 -1
- package/src/init.ts +36 -13
package/dist/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAmBA;;;;;GAKG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAgNjD"}
|
package/dist/init.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cancel, intro, isCancel, note, outro, password, select, spinner } from "@clack/prompts";
|
|
2
|
-
import { AgentClient, agentPaths, generateKeypair, keypairFromSecret, loadConfig, makeSuiClient, provisionMemwal, requestFaucet, shortAgentId, suiBalance, waitForBalance, writePersistedConfig, writeSecret, } from "@sofer_agent/core";
|
|
2
|
+
import { AgentClient, agentPaths, generateKeypair, keypairFromSecret, loadConfig, makeSuiClient, provisionMemwal, readSecret, requestFaucet, shortAgentId, suiBalance, waitForBalance, writePersistedConfig, writeSecret, } from "@sofer_agent/core";
|
|
3
3
|
/**
|
|
4
4
|
* Interactive init wizard — mint the agent + provision Walrus memory.
|
|
5
5
|
* Stores config to ~/.sofer/config.json and secrets to ~/.sofer/{sui,brain}.key
|
|
@@ -43,47 +43,67 @@ export async function initCommand() {
|
|
|
43
43
|
cancel("API key is required.");
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
46
|
-
// ── 3. Sui wallet
|
|
47
|
-
const existingSecret = process.env.SOFER_SUI_SECRET_KEY;
|
|
46
|
+
// ── 3. Sui wallet — reuse from file/env, or generate & save immediately ──
|
|
47
|
+
const existingSecret = process.env.SOFER_SUI_SECRET_KEY ?? readSecret(agentPaths.suiKey);
|
|
48
48
|
const sGen = spinner();
|
|
49
49
|
let secret;
|
|
50
50
|
let address;
|
|
51
51
|
if (existingSecret) {
|
|
52
|
-
sGen.start("Loading wallet
|
|
52
|
+
sGen.start("Loading wallet");
|
|
53
53
|
const kp = keypairFromSecret(existingSecret);
|
|
54
54
|
secret = existingSecret;
|
|
55
55
|
address = kp.toSuiAddress();
|
|
56
|
-
sGen.stop(`wallet: ${address} (
|
|
56
|
+
sGen.stop(`wallet: ${address} (reused)`);
|
|
57
57
|
}
|
|
58
58
|
else {
|
|
59
59
|
sGen.start("Generating new Sui wallet");
|
|
60
60
|
const kp = generateKeypair();
|
|
61
61
|
secret = kp.getSecretKey();
|
|
62
62
|
address = kp.toSuiAddress();
|
|
63
|
-
|
|
63
|
+
writeSecret(agentPaths.suiKey, secret); // save immediately so re-runs reuse it
|
|
64
|
+
sGen.stop(`wallet: ${address} (new, saved to ${agentPaths.suiKey})`);
|
|
64
65
|
}
|
|
65
66
|
const config = loadConfig();
|
|
66
|
-
const sui = makeSuiClient(
|
|
67
|
+
const sui = makeSuiClient(net);
|
|
67
68
|
// ── 4. Fund from faucet (testnet only) ─────────────────────────────────
|
|
68
69
|
if (net !== "mainnet") {
|
|
69
|
-
|
|
70
|
+
let bal = await suiBalance(sui, address);
|
|
70
71
|
if (bal === 0n) {
|
|
71
72
|
const sFund = spinner();
|
|
72
73
|
sFund.start("Requesting testnet faucet");
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
let funded = false;
|
|
75
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
76
|
+
try {
|
|
77
|
+
await requestFaucet(net, address);
|
|
78
|
+
await waitForBalance(sui, address, 1n);
|
|
79
|
+
funded = true;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
if (attempt < 2) {
|
|
84
|
+
await new Promise((r) => setTimeout(r, 5000));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (funded) {
|
|
76
89
|
sFund.stop("funded");
|
|
77
90
|
}
|
|
78
|
-
|
|
79
|
-
sFund.stop(
|
|
80
|
-
|
|
91
|
+
else {
|
|
92
|
+
sFund.stop("faucet rate-limited");
|
|
93
|
+
cancel(`Faucet is rate-limited. Fund the wallet manually:\n ${address}\n https://faucet.sui.io/\n\nThen re-run \`sofer init\`.`);
|
|
94
|
+
return;
|
|
81
95
|
}
|
|
82
96
|
}
|
|
83
97
|
else {
|
|
84
98
|
note(`${(Number(bal) / 1e9).toFixed(4)} SUI on ${address}`, "wallet balance");
|
|
85
99
|
}
|
|
86
100
|
}
|
|
101
|
+
// ── 4b. Balance gate ───────────────────────────────────────────────────
|
|
102
|
+
const balance = await suiBalance(sui, address);
|
|
103
|
+
if (balance === 0n) {
|
|
104
|
+
cancel(`Wallet has 0 SUI. Fund it at https://faucet.sui.io/ and re-run \`sofer init\`.`);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
87
107
|
const agents = new AgentClient(sui, config.packageId);
|
|
88
108
|
// ── 5. Mint agent ─────────────────────────────────────────────────────
|
|
89
109
|
let agentId = existing.agentObjectId;
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EACL,WAAW,EAEX,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,YAAY,EACZ,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAC9B,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,mDAAmD,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,CAAC;IAEpB,0EAA0E;IAC1E,MAAM,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC;QAC5B,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE;YAC1C,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE;SAC3C;QACD,YAAY,EAAE,SAAS;KACxB,CAAC,CAAoB,CAAC;IACvB,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,UAAU,CAAC,CAAC;QACnB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE1D,0EAA0E;IAC1E,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC;QAC7B,OAAO,EAAE,iEAAiE;QAC1E,IAAI,EAAE,GAAG;KACV,CAAC,CAAoB,CAAC;IACvB,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/init.ts
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
loadConfig,
|
|
9
9
|
makeSuiClient,
|
|
10
10
|
provisionMemwal,
|
|
11
|
+
readSecret,
|
|
11
12
|
requestFaucet,
|
|
12
13
|
shortAgentId,
|
|
13
14
|
suiBalance,
|
|
@@ -63,47 +64,69 @@ export async function initCommand(): Promise<void> {
|
|
|
63
64
|
return;
|
|
64
65
|
}
|
|
65
66
|
|
|
66
|
-
// ── 3. Sui wallet
|
|
67
|
-
const existingSecret = process.env.SOFER_SUI_SECRET_KEY;
|
|
67
|
+
// ── 3. Sui wallet — reuse from file/env, or generate & save immediately ──
|
|
68
|
+
const existingSecret = process.env.SOFER_SUI_SECRET_KEY ?? readSecret(agentPaths.suiKey);
|
|
68
69
|
const sGen = spinner();
|
|
69
70
|
let secret: string;
|
|
70
71
|
let address: string;
|
|
71
72
|
if (existingSecret) {
|
|
72
|
-
sGen.start("Loading wallet
|
|
73
|
+
sGen.start("Loading wallet");
|
|
73
74
|
const kp = keypairFromSecret(existingSecret);
|
|
74
75
|
secret = existingSecret;
|
|
75
76
|
address = kp.toSuiAddress();
|
|
76
|
-
sGen.stop(`wallet: ${address} (
|
|
77
|
+
sGen.stop(`wallet: ${address} (reused)`);
|
|
77
78
|
} else {
|
|
78
79
|
sGen.start("Generating new Sui wallet");
|
|
79
80
|
const kp = generateKeypair();
|
|
80
81
|
secret = kp.getSecretKey();
|
|
81
82
|
address = kp.toSuiAddress();
|
|
82
|
-
|
|
83
|
+
writeSecret(agentPaths.suiKey, secret); // save immediately so re-runs reuse it
|
|
84
|
+
sGen.stop(`wallet: ${address} (new, saved to ${agentPaths.suiKey})`);
|
|
83
85
|
}
|
|
84
86
|
|
|
85
87
|
const config = loadConfig();
|
|
86
|
-
const sui = makeSuiClient(
|
|
88
|
+
const sui = makeSuiClient(net);
|
|
87
89
|
|
|
88
90
|
// ── 4. Fund from faucet (testnet only) ─────────────────────────────────
|
|
89
91
|
if (net !== "mainnet") {
|
|
90
|
-
|
|
92
|
+
let bal = await suiBalance(sui, address);
|
|
91
93
|
if (bal === 0n) {
|
|
92
94
|
const sFund = spinner();
|
|
93
95
|
sFund.start("Requesting testnet faucet");
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
let funded = false;
|
|
97
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
98
|
+
try {
|
|
99
|
+
await requestFaucet(net, address);
|
|
100
|
+
await waitForBalance(sui, address, 1n);
|
|
101
|
+
funded = true;
|
|
102
|
+
break;
|
|
103
|
+
} catch {
|
|
104
|
+
if (attempt < 2) {
|
|
105
|
+
await new Promise((r) => setTimeout(r, 5000));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (funded) {
|
|
97
110
|
sFund.stop("funded");
|
|
98
|
-
}
|
|
99
|
-
sFund.stop(
|
|
100
|
-
|
|
111
|
+
} else {
|
|
112
|
+
sFund.stop("faucet rate-limited");
|
|
113
|
+
cancel(
|
|
114
|
+
`Faucet is rate-limited. Fund the wallet manually:\n ${address}\n https://faucet.sui.io/\n\nThen re-run \`sofer init\`.`,
|
|
115
|
+
);
|
|
116
|
+
return;
|
|
101
117
|
}
|
|
102
118
|
} else {
|
|
103
119
|
note(`${(Number(bal) / 1e9).toFixed(4)} SUI on ${address}`, "wallet balance");
|
|
104
120
|
}
|
|
105
121
|
}
|
|
106
122
|
|
|
123
|
+
// ── 4b. Balance gate ───────────────────────────────────────────────────
|
|
124
|
+
const balance = await suiBalance(sui, address);
|
|
125
|
+
if (balance === 0n) {
|
|
126
|
+
cancel(`Wallet has 0 SUI. Fund it at https://faucet.sui.io/ and re-run \`sofer init\`.`);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
|
|
107
130
|
const agents = new AgentClient(sui, config.packageId);
|
|
108
131
|
|
|
109
132
|
// ── 5. Mint agent ─────────────────────────────────────────────────────
|