@echoclaw/echo-0g 1.2.0 → 1.2.3
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 +33 -1162
- package/dist/0g-compute/constants.d.ts +1 -0
- package/dist/0g-compute/constants.d.ts.map +1 -1
- package/dist/0g-compute/constants.js +1 -0
- package/dist/0g-compute/constants.js.map +1 -1
- package/dist/0g-compute/helpers.d.ts +18 -0
- package/dist/0g-compute/helpers.d.ts.map +1 -0
- package/dist/0g-compute/helpers.js +53 -0
- package/dist/0g-compute/helpers.js.map +1 -0
- package/dist/0g-compute/monitor.d.ts.map +1 -1
- package/dist/0g-compute/monitor.js +1 -0
- package/dist/0g-compute/monitor.js.map +1 -1
- package/dist/0g-compute/operations.d.ts +51 -0
- package/dist/0g-compute/operations.d.ts.map +1 -0
- package/dist/0g-compute/operations.js +118 -0
- package/dist/0g-compute/operations.js.map +1 -0
- package/dist/0g-compute/readiness.d.ts +50 -0
- package/dist/0g-compute/readiness.d.ts.map +1 -0
- package/dist/0g-compute/readiness.js +251 -0
- package/dist/0g-compute/readiness.js.map +1 -0
- package/dist/bot/daemon.d.ts +0 -1
- package/dist/bot/daemon.d.ts.map +1 -1
- package/dist/bot/daemon.js +1 -39
- package/dist/bot/daemon.js.map +1 -1
- package/dist/bot/state.d.ts +0 -2
- package/dist/bot/state.d.ts.map +1 -1
- package/dist/bot/state.js +0 -12
- package/dist/bot/state.js.map +1 -1
- package/dist/bot/types.d.ts +0 -4
- package/dist/bot/types.d.ts.map +1 -1
- package/dist/bot/types.js +0 -4
- package/dist/bot/types.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/0g-compute-wizard.d.ts +12 -0
- package/dist/commands/0g-compute-wizard.d.ts.map +1 -0
- package/dist/commands/0g-compute-wizard.js +420 -0
- package/dist/commands/0g-compute-wizard.js.map +1 -0
- package/dist/commands/0g-compute.d.ts.map +1 -1
- package/dist/commands/0g-compute.js +18 -95
- package/dist/commands/0g-compute.js.map +1 -1
- package/dist/commands/marketmaker.d.ts.map +1 -1
- package/dist/commands/marketmaker.js +0 -5
- package/dist/commands/marketmaker.js.map +1 -1
- package/dist/commands/onboard/index.d.ts +3 -0
- package/dist/commands/onboard/index.d.ts.map +1 -0
- package/dist/commands/onboard/index.js +185 -0
- package/dist/commands/onboard/index.js.map +1 -0
- package/dist/commands/onboard/steps/compute.d.ts +3 -0
- package/dist/commands/onboard/steps/compute.d.ts.map +1 -0
- package/dist/commands/onboard/steps/compute.js +346 -0
- package/dist/commands/onboard/steps/compute.js.map +1 -0
- package/dist/commands/onboard/steps/config.d.ts +3 -0
- package/dist/commands/onboard/steps/config.d.ts.map +1 -0
- package/dist/commands/onboard/steps/config.js +30 -0
- package/dist/commands/onboard/steps/config.js.map +1 -0
- package/dist/commands/onboard/steps/monitor.d.ts +3 -0
- package/dist/commands/onboard/steps/monitor.d.ts.map +1 -0
- package/dist/commands/onboard/steps/monitor.js +157 -0
- package/dist/commands/onboard/steps/monitor.js.map +1 -0
- package/dist/commands/onboard/steps/openclaw.d.ts +3 -0
- package/dist/commands/onboard/steps/openclaw.d.ts.map +1 -0
- package/dist/commands/onboard/steps/openclaw.js +35 -0
- package/dist/commands/onboard/steps/openclaw.js.map +1 -0
- package/dist/commands/onboard/steps/password.d.ts +3 -0
- package/dist/commands/onboard/steps/password.d.ts.map +1 -0
- package/dist/commands/onboard/steps/password.js +71 -0
- package/dist/commands/onboard/steps/password.js.map +1 -0
- package/dist/commands/onboard/steps/wallet.d.ts +3 -0
- package/dist/commands/onboard/steps/wallet.d.ts.map +1 -0
- package/dist/commands/onboard/steps/wallet.js +113 -0
- package/dist/commands/onboard/steps/wallet.js.map +1 -0
- package/dist/commands/onboard/steps/webhooks.d.ts +3 -0
- package/dist/commands/onboard/steps/webhooks.d.ts.map +1 -0
- package/dist/commands/onboard/steps/webhooks.js +100 -0
- package/dist/commands/onboard/steps/webhooks.js.map +1 -0
- package/dist/commands/onboard/types.d.ts +27 -0
- package/dist/commands/onboard/types.d.ts.map +1 -0
- package/dist/commands/onboard/types.js +2 -0
- package/dist/commands/onboard/types.js.map +1 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +12 -97
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/wallet.d.ts.map +1 -1
- package/dist/commands/wallet.js +20 -53
- package/dist/commands/wallet.js.map +1 -1
- package/dist/echobook/notifications.d.ts +1 -0
- package/dist/echobook/notifications.d.ts.map +1 -1
- package/dist/echobook/notifications.js.map +1 -1
- package/dist/errors.d.ts +6 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +8 -0
- package/dist/errors.js.map +1 -1
- package/dist/guardrails/wallet-mutation.d.ts +11 -0
- package/dist/guardrails/wallet-mutation.d.ts.map +1 -0
- package/dist/guardrails/wallet-mutation.js +21 -0
- package/dist/guardrails/wallet-mutation.js.map +1 -0
- package/dist/setup/openclaw-link.d.ts +19 -0
- package/dist/setup/openclaw-link.d.ts.map +1 -0
- package/dist/setup/openclaw-link.js +111 -0
- package/dist/setup/openclaw-link.js.map +1 -0
- package/dist/utils/ui.d.ts +1 -0
- package/dist/utils/ui.d.ts.map +1 -1
- package/dist/utils/ui.js +1 -0
- package/dist/utils/ui.js.map +1 -1
- package/dist/wallet/create.d.ts +15 -0
- package/dist/wallet/create.d.ts.map +1 -0
- package/dist/wallet/create.js +30 -0
- package/dist/wallet/create.js.map +1 -0
- package/dist/wallet/import.d.ts +15 -0
- package/dist/wallet/import.d.ts.map +1 -0
- package/dist/wallet/import.js +31 -0
- package/dist/wallet/import.js.map +1 -0
- package/package.json +1 -1
- package/skills/echo0g/SKILL.md +67 -6
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `echo0g 0g-compute wizard` — Interactive compute setup/maintenance wizard.
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates existing operations (ledger, provider, API key, OpenClaw, monitor)
|
|
5
|
+
* into a guided flow. Can be re-run for maintenance (top-up, re-ack, switch provider).
|
|
6
|
+
*
|
|
7
|
+
* Unlike the onboard wizard, this is standalone (no OnboardState dependency)
|
|
8
|
+
* and focuses exclusively on compute readiness.
|
|
9
|
+
*/
|
|
10
|
+
import inquirer from "inquirer";
|
|
11
|
+
import { formatUnits } from "viem";
|
|
12
|
+
import { getAuthenticatedBroker } from "../0g-compute/broker-factory.js";
|
|
13
|
+
import { checkComputeReadiness } from "../0g-compute/readiness.js";
|
|
14
|
+
import { listChatServices, depositToLedger, fundProvider, getSubAccountBalance, hasLedger as checkHasLedger, ackWithReadback, createApiKey, configureOpenclawProvider, } from "../0g-compute/operations.js";
|
|
15
|
+
import { calculateProviderPricing, formatPricePerMTokens } from "../0g-compute/pricing.js";
|
|
16
|
+
import { redactToken } from "../0g-compute/helpers.js";
|
|
17
|
+
import { getPublicClient } from "../wallet/client.js";
|
|
18
|
+
import { spinner, colors, infoBox, successBox, warnBox } from "../utils/ui.js";
|
|
19
|
+
import { writeStderr, isHeadless } from "../utils/output.js";
|
|
20
|
+
import { EchoError, ErrorCodes } from "../errors.js";
|
|
21
|
+
export function register0gComputeWizard(parent) {
|
|
22
|
+
parent
|
|
23
|
+
.command("wizard")
|
|
24
|
+
.description("Interactive compute setup & maintenance wizard (TTY only)")
|
|
25
|
+
.action(async () => {
|
|
26
|
+
if (isHeadless()) {
|
|
27
|
+
throw new EchoError(ErrorCodes.ONBOARD_REQUIRES_TTY, "The wizard requires an interactive terminal.", "Use individual 0g-compute commands for automation.");
|
|
28
|
+
}
|
|
29
|
+
writeStderr("");
|
|
30
|
+
writeStderr(colors.bold(" 0G Compute Wizard"));
|
|
31
|
+
writeStderr(colors.muted(" Check readiness, fix issues, verify configuration."));
|
|
32
|
+
writeStderr("");
|
|
33
|
+
// ── Step 1: Diagnostics ──────────────────────────────────────
|
|
34
|
+
const diagSpin = spinner("Running readiness checks...");
|
|
35
|
+
diagSpin.start();
|
|
36
|
+
let result;
|
|
37
|
+
try {
|
|
38
|
+
result = await checkComputeReadiness();
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
diagSpin.fail("Readiness check failed");
|
|
42
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
43
|
+
throw new EchoError(ErrorCodes.ZG_READINESS_CHECK_FAILED, msg);
|
|
44
|
+
}
|
|
45
|
+
if (result.ready) {
|
|
46
|
+
diagSpin.succeed("All checks passed");
|
|
47
|
+
writeStderr("");
|
|
48
|
+
displayChecks(result);
|
|
49
|
+
const { action } = await inquirer.prompt([{
|
|
50
|
+
type: "list",
|
|
51
|
+
name: "action",
|
|
52
|
+
message: "Everything is configured. What would you like to do?",
|
|
53
|
+
choices: [
|
|
54
|
+
{ name: "Exit", value: "exit" },
|
|
55
|
+
{ name: "Reconfigure (switch provider, re-fund, etc.)", value: "reconfig" },
|
|
56
|
+
],
|
|
57
|
+
}]);
|
|
58
|
+
if (action === "exit") {
|
|
59
|
+
successBox("0G Compute", "All systems operational.");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
diagSpin.warn("Issues found");
|
|
65
|
+
writeStderr("");
|
|
66
|
+
displayChecks(result);
|
|
67
|
+
writeStderr("");
|
|
68
|
+
}
|
|
69
|
+
// ── Get broker ───────────────────────────────────────────────
|
|
70
|
+
const brokerSpin = spinner("Connecting to 0G network...");
|
|
71
|
+
brokerSpin.start();
|
|
72
|
+
let broker;
|
|
73
|
+
try {
|
|
74
|
+
broker = await getAuthenticatedBroker();
|
|
75
|
+
brokerSpin.succeed("Connected to 0G network");
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
brokerSpin.fail("Failed to connect");
|
|
79
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
80
|
+
throw new EchoError(ErrorCodes.ZG_BROKER_INIT_FAILED, msg, "Check wallet and network configuration.");
|
|
81
|
+
}
|
|
82
|
+
// ── Step 2: Ledger ───────────────────────────────────────────
|
|
83
|
+
const ledgerExists = await checkHasLedger(broker);
|
|
84
|
+
if (!ledgerExists) {
|
|
85
|
+
writeStderr("");
|
|
86
|
+
writeStderr(colors.bold(" Ledger Setup"));
|
|
87
|
+
// Show wallet balance
|
|
88
|
+
try {
|
|
89
|
+
const client = getPublicClient();
|
|
90
|
+
const { requireWalletAndKeystore } = await import("../bot/executor.js");
|
|
91
|
+
const { address } = requireWalletAndKeystore();
|
|
92
|
+
const balance = await client.getBalance({ address: address });
|
|
93
|
+
const balanceOg = parseFloat(formatUnits(balance, 18));
|
|
94
|
+
writeStderr(` Wallet balance: ${colors.value(balanceOg.toFixed(4) + " 0G")}`);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
writeStderr(colors.muted(" Could not fetch wallet balance"));
|
|
98
|
+
}
|
|
99
|
+
const { depositAmount } = await inquirer.prompt([{
|
|
100
|
+
type: "input",
|
|
101
|
+
name: "depositAmount",
|
|
102
|
+
message: "Amount to deposit to ledger (0G):",
|
|
103
|
+
default: "10.0",
|
|
104
|
+
validate: (input) => {
|
|
105
|
+
const n = Number(input);
|
|
106
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
107
|
+
return "Must be a positive number";
|
|
108
|
+
return true;
|
|
109
|
+
},
|
|
110
|
+
}]);
|
|
111
|
+
const depositSpin = spinner(`Depositing ${depositAmount} 0G to ledger...`);
|
|
112
|
+
depositSpin.start();
|
|
113
|
+
try {
|
|
114
|
+
await depositToLedger(broker, depositAmount);
|
|
115
|
+
// Read-after-write
|
|
116
|
+
if (await checkHasLedger(broker)) {
|
|
117
|
+
depositSpin.succeed(`Deposited ${depositAmount} 0G to ledger (verified)`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
depositSpin.warn(`Deposited ${depositAmount} 0G — could not verify`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
depositSpin.fail("Deposit failed");
|
|
125
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
126
|
+
throw new EchoError(ErrorCodes.ZG_TRANSFER_FAILED, `Ledger deposit failed: ${msg}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
writeStderr(` ${colors.success("✓")} Ledger exists`);
|
|
131
|
+
}
|
|
132
|
+
// ── Step 3: Provider selection ───────────────────────────────
|
|
133
|
+
writeStderr("");
|
|
134
|
+
writeStderr(colors.bold(" Provider Selection"));
|
|
135
|
+
const modelsSpin = spinner("Fetching available chat models...");
|
|
136
|
+
modelsSpin.start();
|
|
137
|
+
let chatServices;
|
|
138
|
+
try {
|
|
139
|
+
chatServices = await listChatServices(broker);
|
|
140
|
+
modelsSpin.succeed(`Found ${chatServices.length} chat model(s)`);
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
modelsSpin.fail("Failed to fetch models");
|
|
144
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
145
|
+
throw new EchoError(ErrorCodes.ZG_READINESS_CHECK_FAILED, `Failed to list services: ${msg}`);
|
|
146
|
+
}
|
|
147
|
+
if (chatServices.length === 0) {
|
|
148
|
+
throw new EchoError(ErrorCodes.ZG_PROVIDER_NOT_FOUND, "No chat models available on the 0G network.");
|
|
149
|
+
}
|
|
150
|
+
const choices = chatServices.map((svc, i) => {
|
|
151
|
+
const inputPriceStr = formatPricePerMTokens(svc.inputPrice);
|
|
152
|
+
const outputPriceStr = formatPricePerMTokens(svc.outputPrice);
|
|
153
|
+
const providerShort = svc.provider.slice(0, 10) + "...";
|
|
154
|
+
return {
|
|
155
|
+
name: `${svc.model} (${inputPriceStr} / ${outputPriceStr} 0G per M tokens) [${providerShort}]`,
|
|
156
|
+
value: i,
|
|
157
|
+
};
|
|
158
|
+
});
|
|
159
|
+
const { modelIndex } = await inquirer.prompt([{
|
|
160
|
+
type: "list",
|
|
161
|
+
name: "modelIndex",
|
|
162
|
+
message: "Select a chat model:",
|
|
163
|
+
choices,
|
|
164
|
+
}]);
|
|
165
|
+
const selectedService = chatServices[modelIndex];
|
|
166
|
+
const selectedProvider = selectedService.provider;
|
|
167
|
+
const pricing = calculateProviderPricing(selectedService.inputPrice, selectedService.outputPrice);
|
|
168
|
+
infoBox("Selected Model", [
|
|
169
|
+
`Model: ${colors.bold(selectedService.model)}`,
|
|
170
|
+
`Provider: ${colors.address(selectedProvider)}`,
|
|
171
|
+
`Price: ${formatPricePerMTokens(selectedService.inputPrice)} / ${formatPricePerMTokens(selectedService.outputPrice)} 0G per M tokens`,
|
|
172
|
+
`Recommended min locked: ${colors.value(pricing.recommendedMinLockedOg.toFixed(3) + " 0G")}`,
|
|
173
|
+
].join("\n"));
|
|
174
|
+
// ── Step 4: Fund provider ────────────────────────────────────
|
|
175
|
+
const subAccount = await getSubAccountBalance(broker, selectedProvider);
|
|
176
|
+
const currentLocked = subAccount?.lockedOg ?? 0;
|
|
177
|
+
writeStderr(` Current locked balance: ${colors.value(currentLocked.toFixed(4) + " 0G")}`);
|
|
178
|
+
if (currentLocked < pricing.recommendedMinLockedOg) {
|
|
179
|
+
const suggestedFund = Math.max(0.5, pricing.recommendedMinLockedOg - currentLocked + 1);
|
|
180
|
+
const { fundAmountInput } = await inquirer.prompt([{
|
|
181
|
+
type: "input",
|
|
182
|
+
name: "fundAmountInput",
|
|
183
|
+
message: `Amount to fund to provider (need ${pricing.recommendedMinLockedOg.toFixed(1)} 0G min):`,
|
|
184
|
+
default: suggestedFund.toFixed(1),
|
|
185
|
+
validate: (input) => {
|
|
186
|
+
const n = Number(input);
|
|
187
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
188
|
+
return "Must be a positive number";
|
|
189
|
+
return true;
|
|
190
|
+
},
|
|
191
|
+
}]);
|
|
192
|
+
const fundDisplay = Number(fundAmountInput);
|
|
193
|
+
// Warn if below recommended
|
|
194
|
+
if (currentLocked + fundDisplay < pricing.recommendedMinLockedOg) {
|
|
195
|
+
const { confirmLow } = await inquirer.prompt([{
|
|
196
|
+
type: "confirm",
|
|
197
|
+
name: "confirmLow",
|
|
198
|
+
message: `${fundAmountInput} 0G will result in ${(currentLocked + fundDisplay).toFixed(1)} 0G locked (below ${pricing.recommendedMinLockedOg.toFixed(1)} 0G min). Continue?`,
|
|
199
|
+
default: false,
|
|
200
|
+
}]);
|
|
201
|
+
if (!confirmLow) {
|
|
202
|
+
warnBox("Wizard Cancelled", [
|
|
203
|
+
"Funding cancelled by user.",
|
|
204
|
+
"",
|
|
205
|
+
"Your compute setup is incomplete. Run the wizard again when ready:",
|
|
206
|
+
` ${colors.bold("echo0g 0g-compute wizard")}`,
|
|
207
|
+
].join("\n"));
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const fundSpin = spinner(`Funding ${fundAmountInput} 0G to provider sub-account...`);
|
|
212
|
+
fundSpin.start();
|
|
213
|
+
try {
|
|
214
|
+
await fundProvider(broker, selectedProvider, fundAmountInput);
|
|
215
|
+
// Read-after-write
|
|
216
|
+
const afterBalance = await getSubAccountBalance(broker, selectedProvider);
|
|
217
|
+
if (afterBalance) {
|
|
218
|
+
fundSpin.succeed(`Funded ${fundAmountInput} 0G`);
|
|
219
|
+
writeStderr(` Post-fund locked balance: ${colors.value(afterBalance.lockedOg.toFixed(4) + " 0G")}`);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
fundSpin.warn(`Funded ${fundAmountInput} 0G — could not verify`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
fundSpin.fail("Fund transfer failed");
|
|
227
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
228
|
+
throw new EchoError(ErrorCodes.ZG_TRANSFER_FAILED, `Fund failed: ${msg}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
writeStderr(colors.success(` Balance OK (${currentLocked.toFixed(4)} 0G >= ${pricing.recommendedMinLockedOg.toFixed(3)} 0G min)`));
|
|
233
|
+
}
|
|
234
|
+
// ── Step 5: ACK ──────────────────────────────────────────────
|
|
235
|
+
const ackSpin = spinner("Acknowledging provider signer...");
|
|
236
|
+
ackSpin.start();
|
|
237
|
+
const ackConfirmed = await ackWithReadback(broker, selectedProvider);
|
|
238
|
+
if (ackConfirmed) {
|
|
239
|
+
ackSpin.succeed("Provider signer acknowledged (verified on-chain)");
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
ackSpin.warn("ACK sent but not confirmed within timeout — may propagate shortly");
|
|
243
|
+
}
|
|
244
|
+
// ── Step 6: API key + OpenClaw ───────────────────────────────
|
|
245
|
+
writeStderr("");
|
|
246
|
+
writeStderr(colors.bold(" API Key & OpenClaw Config"));
|
|
247
|
+
const apiKeySpin = spinner("Creating API key on-chain...");
|
|
248
|
+
apiKeySpin.start();
|
|
249
|
+
let apiKeyInfo;
|
|
250
|
+
try {
|
|
251
|
+
apiKeyInfo = await createApiKey(broker, selectedProvider);
|
|
252
|
+
apiKeySpin.succeed(`API key created: ${redactToken(apiKeyInfo.rawToken)}`);
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
apiKeySpin.fail("API key creation failed");
|
|
256
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
257
|
+
throw new EchoError(ErrorCodes.ZG_API_KEY_FAILED, `API key creation failed: ${msg}`);
|
|
258
|
+
}
|
|
259
|
+
const configSpin = spinner("Patching OpenClaw config...");
|
|
260
|
+
configSpin.start();
|
|
261
|
+
try {
|
|
262
|
+
await configureOpenclawProvider(broker, selectedProvider, apiKeyInfo.rawToken);
|
|
263
|
+
configSpin.succeed("OpenClaw config patched");
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
configSpin.fail("Config patch failed");
|
|
267
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
268
|
+
throw new EchoError(ErrorCodes.OPENCLAW_CONFIG_WRITE_FAILED, `Config failed: ${msg}`);
|
|
269
|
+
}
|
|
270
|
+
// ── Step 7: Monitor (optional) ───────────────────────────────
|
|
271
|
+
writeStderr("");
|
|
272
|
+
const { startMonitor } = await inquirer.prompt([{
|
|
273
|
+
type: "confirm",
|
|
274
|
+
name: "startMonitor",
|
|
275
|
+
message: "Start balance monitor daemon?",
|
|
276
|
+
default: true,
|
|
277
|
+
}]);
|
|
278
|
+
if (startMonitor) {
|
|
279
|
+
const { existsSync, readFileSync } = await import("node:fs");
|
|
280
|
+
const { ZG_MONITOR_PID_FILE } = await import("../0g-compute/constants.js");
|
|
281
|
+
// Check if already running
|
|
282
|
+
let monitorRunning = false;
|
|
283
|
+
if (existsSync(ZG_MONITOR_PID_FILE)) {
|
|
284
|
+
try {
|
|
285
|
+
const pid = parseInt(readFileSync(ZG_MONITOR_PID_FILE, "utf-8").trim(), 10);
|
|
286
|
+
process.kill(pid, 0);
|
|
287
|
+
monitorRunning = true;
|
|
288
|
+
writeStderr(colors.muted(` Monitor already running (PID ${pid})`));
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
// Stale PID
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (!monitorRunning) {
|
|
295
|
+
const { mode } = await inquirer.prompt([{
|
|
296
|
+
type: "list",
|
|
297
|
+
name: "mode",
|
|
298
|
+
message: "Monitor mode:",
|
|
299
|
+
choices: [
|
|
300
|
+
{ name: "Recommended (auto-calculates threshold from pricing)", value: "recommended" },
|
|
301
|
+
{ name: "Fixed threshold", value: "fixed" },
|
|
302
|
+
],
|
|
303
|
+
}]);
|
|
304
|
+
let threshold;
|
|
305
|
+
let buffer = "0";
|
|
306
|
+
if (mode === "fixed") {
|
|
307
|
+
const { thresholdInput } = await inquirer.prompt([{
|
|
308
|
+
type: "input",
|
|
309
|
+
name: "thresholdInput",
|
|
310
|
+
message: "Alert threshold (in 0G):",
|
|
311
|
+
default: "1.0",
|
|
312
|
+
validate: (input) => {
|
|
313
|
+
const n = Number(input);
|
|
314
|
+
return (Number.isFinite(n) && n > 0) || "Must be a positive number";
|
|
315
|
+
},
|
|
316
|
+
}]);
|
|
317
|
+
threshold = thresholdInput;
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
const { bufferInput } = await inquirer.prompt([{
|
|
321
|
+
type: "input",
|
|
322
|
+
name: "bufferInput",
|
|
323
|
+
message: "Extra buffer above recommended min (in 0G):",
|
|
324
|
+
default: "0",
|
|
325
|
+
validate: (input) => {
|
|
326
|
+
const n = Number(input);
|
|
327
|
+
return (Number.isFinite(n) && n >= 0) || "Must be >= 0";
|
|
328
|
+
},
|
|
329
|
+
}]);
|
|
330
|
+
buffer = bufferInput;
|
|
331
|
+
}
|
|
332
|
+
const { interval } = await inquirer.prompt([{
|
|
333
|
+
type: "input",
|
|
334
|
+
name: "interval",
|
|
335
|
+
message: "Check interval (seconds):",
|
|
336
|
+
default: "300",
|
|
337
|
+
validate: (input) => {
|
|
338
|
+
const n = Number(input);
|
|
339
|
+
return (Number.isInteger(n) && n >= 60) || "Must be an integer >= 60";
|
|
340
|
+
},
|
|
341
|
+
}]);
|
|
342
|
+
// Spawn daemon
|
|
343
|
+
const { existsSync: fsExists, openSync, mkdirSync, closeSync } = await import("node:fs");
|
|
344
|
+
const { fileURLToPath } = await import("node:url");
|
|
345
|
+
const { spawn } = await import("node:child_process");
|
|
346
|
+
const { ZG_COMPUTE_DIR, ZG_MONITOR_LOG_FILE } = await import("../0g-compute/constants.js");
|
|
347
|
+
if (!fsExists(ZG_COMPUTE_DIR)) {
|
|
348
|
+
mkdirSync(ZG_COMPUTE_DIR, { recursive: true });
|
|
349
|
+
}
|
|
350
|
+
const childArgs = [
|
|
351
|
+
"0g-compute", "monitor", "start",
|
|
352
|
+
"--providers", selectedProvider,
|
|
353
|
+
"--mode", mode,
|
|
354
|
+
"--interval", interval,
|
|
355
|
+
"--buffer", buffer,
|
|
356
|
+
];
|
|
357
|
+
if (threshold != null) {
|
|
358
|
+
childArgs.push("--threshold", threshold);
|
|
359
|
+
}
|
|
360
|
+
const cliPath = fileURLToPath(new URL("../cli.js", import.meta.url));
|
|
361
|
+
const logFd = openSync(ZG_MONITOR_LOG_FILE, "a");
|
|
362
|
+
try {
|
|
363
|
+
const child = spawn(process.execPath, [cliPath, ...childArgs], {
|
|
364
|
+
detached: true,
|
|
365
|
+
stdio: ["ignore", logFd, logFd],
|
|
366
|
+
});
|
|
367
|
+
child.unref();
|
|
368
|
+
closeSync(logFd);
|
|
369
|
+
writeStderr(colors.success(` ✓ Monitor started (PID ${child.pid})`));
|
|
370
|
+
writeStderr(colors.muted(` Log: ${ZG_MONITOR_LOG_FILE}`));
|
|
371
|
+
}
|
|
372
|
+
catch (err) {
|
|
373
|
+
try {
|
|
374
|
+
closeSync(logFd);
|
|
375
|
+
}
|
|
376
|
+
catch { /* ignore */ }
|
|
377
|
+
writeStderr(colors.warn(` ⚠ Failed to start monitor: ${err instanceof Error ? err.message : String(err)}`));
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
// ── Step 8: Final verification ───────────────────────────────
|
|
382
|
+
writeStderr("");
|
|
383
|
+
const verifySpin = spinner("Running final verification...");
|
|
384
|
+
verifySpin.start();
|
|
385
|
+
try {
|
|
386
|
+
const finalResult = await checkComputeReadiness();
|
|
387
|
+
if (finalResult.ready) {
|
|
388
|
+
verifySpin.succeed("All checks passed");
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
verifySpin.warn("Some checks still failing");
|
|
392
|
+
displayChecks(finalResult);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
verifySpin.warn("Could not run final verification");
|
|
397
|
+
}
|
|
398
|
+
writeStderr("");
|
|
399
|
+
successBox("0G Compute Wizard Complete", [
|
|
400
|
+
`Provider: ${selectedProvider.slice(0, 10)}...`,
|
|
401
|
+
`Model: ${selectedService.model}`,
|
|
402
|
+
`API key: ${redactToken(apiKeyInfo.rawToken)}`,
|
|
403
|
+
"",
|
|
404
|
+
"Next steps:",
|
|
405
|
+
` 1. Restart gateway: ${colors.bold("openclaw gateway restart")}`,
|
|
406
|
+
` 2. Send ${colors.bold("/reset")} in chat`,
|
|
407
|
+
].join("\n"));
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
// ── Helpers ──────────────────────────────────────────────────────────
|
|
411
|
+
function displayChecks(result) {
|
|
412
|
+
const { checks } = result;
|
|
413
|
+
for (const [name, check] of Object.entries(checks)) {
|
|
414
|
+
const icon = check.ok ? colors.success("✓") : colors.warn("✗");
|
|
415
|
+
const detail = check.detail ? ` — ${check.detail}` : "";
|
|
416
|
+
const hint = !check.ok && check.hint ? colors.muted(` (${check.hint})`) : "";
|
|
417
|
+
writeStderr(` ${icon} ${name}${detail}${hint}`);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
//# sourceMappingURL=0g-compute-wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"0g-compute-wizard.js","sourceRoot":"","sources":["../../src/commands/0g-compute-wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"0g-compute.d.ts","sourceRoot":"","sources":["../../src/commands/0g-compute.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"0g-compute.d.ts","sourceRoot":"","sources":["../../src/commands/0g-compute.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BpC,wBAAgB,sBAAsB,IAAI,OAAO,CAy3BhD"}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* monitor start/stop/status Balance monitor daemon
|
|
18
18
|
*/
|
|
19
19
|
import { Command } from "commander";
|
|
20
|
-
import {
|
|
20
|
+
import { parseUnits } from "viem";
|
|
21
21
|
import { EchoError, ErrorCodes } from "../errors.js";
|
|
22
22
|
import { isHeadless, writeJsonSuccess } from "../utils/output.js";
|
|
23
23
|
import { respond } from "../utils/respond.js";
|
|
@@ -25,54 +25,16 @@ import { getAuthenticatedBroker } from "../0g-compute/broker-factory.js";
|
|
|
25
25
|
import { withSuppressedConsole } from "../0g-compute/bridge.js";
|
|
26
26
|
import { normalizeSubAccount, normalizeInferTuple, serializeSubAccount } from "../0g-compute/account.js";
|
|
27
27
|
import { calculateProviderPricing, formatPricePerMTokens } from "../0g-compute/pricing.js";
|
|
28
|
+
import { requireAddress, requirePositiveNumber, requireTokenId, serializeBigInts, redactToken } from "../0g-compute/helpers.js";
|
|
28
29
|
import { patchOpenclawConfig } from "../openclaw/config.js";
|
|
30
|
+
import { register0gComputeWizard } from "./0g-compute-wizard.js";
|
|
29
31
|
import logger from "../utils/logger.js";
|
|
30
32
|
// ── Helpers ──────────────────────────────────────────────────────────
|
|
31
|
-
function requireAddress(raw, label) {
|
|
32
|
-
if (!isAddress(raw)) {
|
|
33
|
-
throw new EchoError(ErrorCodes.INVALID_ADDRESS, `Invalid ${label} address: ${raw}`);
|
|
34
|
-
}
|
|
35
|
-
return getAddress(raw);
|
|
36
|
-
}
|
|
37
|
-
function requirePositiveNumber(raw, label) {
|
|
38
|
-
const n = Number(raw);
|
|
39
|
-
if (!Number.isFinite(n) || n <= 0) {
|
|
40
|
-
throw new EchoError(ErrorCodes.INVALID_AMOUNT, `Invalid ${label}: ${raw} (must be > 0)`);
|
|
41
|
-
}
|
|
42
|
-
return n;
|
|
43
|
-
}
|
|
44
|
-
function requireTokenId(raw) {
|
|
45
|
-
const n = Number(raw);
|
|
46
|
-
if (!Number.isInteger(n) || n < 0 || n > 254) {
|
|
47
|
-
throw new EchoError(ErrorCodes.INVALID_AMOUNT, `Invalid token-id: ${raw} (must be 0-254)`);
|
|
48
|
-
}
|
|
49
|
-
return n;
|
|
50
|
-
}
|
|
51
33
|
function requireYes(yes, action) {
|
|
52
34
|
if (!yes) {
|
|
53
35
|
throw new EchoError(ErrorCodes.CONFIRMATION_REQUIRED, `On-chain action requires confirmation: ${action}`, "Add --yes to confirm.");
|
|
54
36
|
}
|
|
55
37
|
}
|
|
56
|
-
function redactToken(token) {
|
|
57
|
-
if (token.startsWith("app-sk-"))
|
|
58
|
-
return "app-sk-***";
|
|
59
|
-
return "***";
|
|
60
|
-
}
|
|
61
|
-
/** Serialize bigint fields in SDK responses for JSON output. */
|
|
62
|
-
function serializeBigInts(obj) {
|
|
63
|
-
if (typeof obj === "bigint")
|
|
64
|
-
return obj.toString();
|
|
65
|
-
if (Array.isArray(obj))
|
|
66
|
-
return obj.map(serializeBigInts);
|
|
67
|
-
if (obj !== null && typeof obj === "object") {
|
|
68
|
-
const result = {};
|
|
69
|
-
for (const [k, v] of Object.entries(obj)) {
|
|
70
|
-
result[k] = serializeBigInts(v);
|
|
71
|
-
}
|
|
72
|
-
return result;
|
|
73
|
-
}
|
|
74
|
-
return obj;
|
|
75
|
-
}
|
|
76
38
|
// ── Command tree ─────────────────────────────────────────────────────
|
|
77
39
|
export function create0gComputeCommand() {
|
|
78
40
|
const root = new Command("0g-compute")
|
|
@@ -84,65 +46,24 @@ export function create0gComputeCommand() {
|
|
|
84
46
|
.description("Readiness check (read-only, no transactions)")
|
|
85
47
|
.option("--json", "JSON output")
|
|
86
48
|
.action(async () => {
|
|
87
|
-
const {
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
checks.wallet = { ok: true, address };
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
walletHint = err instanceof EchoError ? err.hint : undefined;
|
|
99
|
-
checks.wallet = { ok: false, error: err instanceof EchoError ? err.message : String(err) };
|
|
100
|
-
}
|
|
101
|
-
if (!walletAddress) {
|
|
102
|
-
respond({
|
|
103
|
-
data: { checks },
|
|
104
|
-
ui: { type: "warn", title: "0G Compute Setup", body: walletHint ?? "Wallet not configured. Run: echo0g wallet create" },
|
|
105
|
-
});
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
// 2. Wallet 0G balance
|
|
109
|
-
try {
|
|
110
|
-
const { getPublicClient } = await import("../wallet/client.js");
|
|
111
|
-
const client = getPublicClient();
|
|
112
|
-
const balance = await client.getBalance({ address: walletAddress });
|
|
113
|
-
checks.walletBalance = { ok: true, balance: formatUnits(balance, 18) + " 0G" };
|
|
114
|
-
}
|
|
115
|
-
catch (err) {
|
|
116
|
-
checks.walletBalance = { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
117
|
-
}
|
|
118
|
-
// 3. Broker init
|
|
119
|
-
try {
|
|
120
|
-
const broker = await getAuthenticatedBroker();
|
|
121
|
-
checks.broker = { ok: true };
|
|
122
|
-
// 4. Ledger
|
|
123
|
-
try {
|
|
124
|
-
const ledger = await withSuppressedConsole(() => broker.ledger.getLedger());
|
|
125
|
-
checks.ledger = { ok: true, info: serializeBigInts(ledger) };
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
checks.ledger = { ok: false, hint: "Run: echo0g 0g-compute ledger deposit <amount> --yes" };
|
|
49
|
+
const { checkComputeReadiness } = await import("../0g-compute/readiness.js");
|
|
50
|
+
const result = await checkComputeReadiness();
|
|
51
|
+
const { checks } = result;
|
|
52
|
+
// Build human-readable summary of failing checks
|
|
53
|
+
const failingChecks = [];
|
|
54
|
+
for (const [name, check] of Object.entries(checks)) {
|
|
55
|
+
if (!check.ok) {
|
|
56
|
+
failingChecks.push(`${name}: ${check.detail ?? "failed"}${check.hint ? ` (${check.hint})` : ""}`);
|
|
129
57
|
}
|
|
130
|
-
// 5. Services available
|
|
131
|
-
const services = await withSuppressedConsole(() => broker.inference.listService());
|
|
132
|
-
checks.services = { ok: true, count: services.length };
|
|
133
|
-
}
|
|
134
|
-
catch (err) {
|
|
135
|
-
checks.broker = { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
136
58
|
}
|
|
137
|
-
const allOk = Object.values(checks).every((c) => typeof c === "object" && c !== null && c.ok === true);
|
|
138
59
|
respond({
|
|
139
|
-
data: { ready:
|
|
60
|
+
data: { ready: result.ready, provider: result.provider, checks },
|
|
140
61
|
ui: {
|
|
141
|
-
type:
|
|
62
|
+
type: result.ready ? "success" : "warn",
|
|
142
63
|
title: "0G Compute Setup",
|
|
143
|
-
body:
|
|
144
|
-
?
|
|
145
|
-
:
|
|
64
|
+
body: result.ready
|
|
65
|
+
? `All checks passed. Provider: ${result.provider ?? "unknown"}`
|
|
66
|
+
: `Issues found:\n${failingChecks.map(l => ` - ${l}`).join("\n")}`,
|
|
146
67
|
},
|
|
147
68
|
});
|
|
148
69
|
});
|
|
@@ -845,6 +766,8 @@ export function create0gComputeCommand() {
|
|
|
845
766
|
process.stderr.write(lines.join("\n") + "\n");
|
|
846
767
|
}
|
|
847
768
|
});
|
|
769
|
+
// ── wizard ─────────────────────────────────────────────────────
|
|
770
|
+
register0gComputeWizard(root);
|
|
848
771
|
return root;
|
|
849
772
|
}
|
|
850
773
|
//# sourceMappingURL=0g-compute.js.map
|