@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.
Files changed (116) hide show
  1. package/README.md +33 -1162
  2. package/dist/0g-compute/constants.d.ts +1 -0
  3. package/dist/0g-compute/constants.d.ts.map +1 -1
  4. package/dist/0g-compute/constants.js +1 -0
  5. package/dist/0g-compute/constants.js.map +1 -1
  6. package/dist/0g-compute/helpers.d.ts +18 -0
  7. package/dist/0g-compute/helpers.d.ts.map +1 -0
  8. package/dist/0g-compute/helpers.js +53 -0
  9. package/dist/0g-compute/helpers.js.map +1 -0
  10. package/dist/0g-compute/monitor.d.ts.map +1 -1
  11. package/dist/0g-compute/monitor.js +1 -0
  12. package/dist/0g-compute/monitor.js.map +1 -1
  13. package/dist/0g-compute/operations.d.ts +51 -0
  14. package/dist/0g-compute/operations.d.ts.map +1 -0
  15. package/dist/0g-compute/operations.js +118 -0
  16. package/dist/0g-compute/operations.js.map +1 -0
  17. package/dist/0g-compute/readiness.d.ts +50 -0
  18. package/dist/0g-compute/readiness.d.ts.map +1 -0
  19. package/dist/0g-compute/readiness.js +251 -0
  20. package/dist/0g-compute/readiness.js.map +1 -0
  21. package/dist/bot/daemon.d.ts +0 -1
  22. package/dist/bot/daemon.d.ts.map +1 -1
  23. package/dist/bot/daemon.js +1 -39
  24. package/dist/bot/daemon.js.map +1 -1
  25. package/dist/bot/state.d.ts +0 -2
  26. package/dist/bot/state.d.ts.map +1 -1
  27. package/dist/bot/state.js +0 -12
  28. package/dist/bot/state.js.map +1 -1
  29. package/dist/bot/types.d.ts +0 -4
  30. package/dist/bot/types.d.ts.map +1 -1
  31. package/dist/bot/types.js +0 -4
  32. package/dist/bot/types.js.map +1 -1
  33. package/dist/cli.d.ts.map +1 -1
  34. package/dist/cli.js +2 -0
  35. package/dist/cli.js.map +1 -1
  36. package/dist/commands/0g-compute-wizard.d.ts +12 -0
  37. package/dist/commands/0g-compute-wizard.d.ts.map +1 -0
  38. package/dist/commands/0g-compute-wizard.js +420 -0
  39. package/dist/commands/0g-compute-wizard.js.map +1 -0
  40. package/dist/commands/0g-compute.d.ts.map +1 -1
  41. package/dist/commands/0g-compute.js +18 -95
  42. package/dist/commands/0g-compute.js.map +1 -1
  43. package/dist/commands/marketmaker.d.ts.map +1 -1
  44. package/dist/commands/marketmaker.js +0 -5
  45. package/dist/commands/marketmaker.js.map +1 -1
  46. package/dist/commands/onboard/index.d.ts +3 -0
  47. package/dist/commands/onboard/index.d.ts.map +1 -0
  48. package/dist/commands/onboard/index.js +185 -0
  49. package/dist/commands/onboard/index.js.map +1 -0
  50. package/dist/commands/onboard/steps/compute.d.ts +3 -0
  51. package/dist/commands/onboard/steps/compute.d.ts.map +1 -0
  52. package/dist/commands/onboard/steps/compute.js +346 -0
  53. package/dist/commands/onboard/steps/compute.js.map +1 -0
  54. package/dist/commands/onboard/steps/config.d.ts +3 -0
  55. package/dist/commands/onboard/steps/config.d.ts.map +1 -0
  56. package/dist/commands/onboard/steps/config.js +30 -0
  57. package/dist/commands/onboard/steps/config.js.map +1 -0
  58. package/dist/commands/onboard/steps/monitor.d.ts +3 -0
  59. package/dist/commands/onboard/steps/monitor.d.ts.map +1 -0
  60. package/dist/commands/onboard/steps/monitor.js +157 -0
  61. package/dist/commands/onboard/steps/monitor.js.map +1 -0
  62. package/dist/commands/onboard/steps/openclaw.d.ts +3 -0
  63. package/dist/commands/onboard/steps/openclaw.d.ts.map +1 -0
  64. package/dist/commands/onboard/steps/openclaw.js +35 -0
  65. package/dist/commands/onboard/steps/openclaw.js.map +1 -0
  66. package/dist/commands/onboard/steps/password.d.ts +3 -0
  67. package/dist/commands/onboard/steps/password.d.ts.map +1 -0
  68. package/dist/commands/onboard/steps/password.js +71 -0
  69. package/dist/commands/onboard/steps/password.js.map +1 -0
  70. package/dist/commands/onboard/steps/wallet.d.ts +3 -0
  71. package/dist/commands/onboard/steps/wallet.d.ts.map +1 -0
  72. package/dist/commands/onboard/steps/wallet.js +113 -0
  73. package/dist/commands/onboard/steps/wallet.js.map +1 -0
  74. package/dist/commands/onboard/steps/webhooks.d.ts +3 -0
  75. package/dist/commands/onboard/steps/webhooks.d.ts.map +1 -0
  76. package/dist/commands/onboard/steps/webhooks.js +100 -0
  77. package/dist/commands/onboard/steps/webhooks.js.map +1 -0
  78. package/dist/commands/onboard/types.d.ts +27 -0
  79. package/dist/commands/onboard/types.d.ts.map +1 -0
  80. package/dist/commands/onboard/types.js +2 -0
  81. package/dist/commands/onboard/types.js.map +1 -0
  82. package/dist/commands/setup.d.ts.map +1 -1
  83. package/dist/commands/setup.js +12 -97
  84. package/dist/commands/setup.js.map +1 -1
  85. package/dist/commands/wallet.d.ts.map +1 -1
  86. package/dist/commands/wallet.js +20 -53
  87. package/dist/commands/wallet.js.map +1 -1
  88. package/dist/echobook/notifications.d.ts +1 -0
  89. package/dist/echobook/notifications.d.ts.map +1 -1
  90. package/dist/echobook/notifications.js.map +1 -1
  91. package/dist/errors.d.ts +6 -0
  92. package/dist/errors.d.ts.map +1 -1
  93. package/dist/errors.js +8 -0
  94. package/dist/errors.js.map +1 -1
  95. package/dist/guardrails/wallet-mutation.d.ts +11 -0
  96. package/dist/guardrails/wallet-mutation.d.ts.map +1 -0
  97. package/dist/guardrails/wallet-mutation.js +21 -0
  98. package/dist/guardrails/wallet-mutation.js.map +1 -0
  99. package/dist/setup/openclaw-link.d.ts +19 -0
  100. package/dist/setup/openclaw-link.d.ts.map +1 -0
  101. package/dist/setup/openclaw-link.js +111 -0
  102. package/dist/setup/openclaw-link.js.map +1 -0
  103. package/dist/utils/ui.d.ts +1 -0
  104. package/dist/utils/ui.d.ts.map +1 -1
  105. package/dist/utils/ui.js +1 -0
  106. package/dist/utils/ui.js.map +1 -1
  107. package/dist/wallet/create.d.ts +15 -0
  108. package/dist/wallet/create.d.ts.map +1 -0
  109. package/dist/wallet/create.js +30 -0
  110. package/dist/wallet/create.js.map +1 -0
  111. package/dist/wallet/import.d.ts +15 -0
  112. package/dist/wallet/import.d.ts.map +1 -0
  113. package/dist/wallet/import.js +31 -0
  114. package/dist/wallet/import.js.map +1 -0
  115. package/package.json +1 -1
  116. 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":"AAAA;;;;;;;;GAQG;AAGH,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAwB,MAAM,4BAA4B,CAAC;AACzF,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,SAAS,IAAI,cAAc,EAC3B,eAAe,EACf,YAAY,EACZ,yBAAyB,GAE1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGrD,MAAM,UAAU,uBAAuB,CAAC,MAAe;IACrD,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2DAA2D,CAAC;SACxE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,SAAS,CACjB,UAAU,CAAC,oBAAoB,EAC/B,8CAA8C,EAC9C,oDAAoD,CACrD,CAAC;QACJ,CAAC;QAED,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAChD,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC,CAAC;QAClF,WAAW,CAAC,EAAE,CAAC,CAAC;QAEhB,gEAAgE;QAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;QACxD,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEjB,IAAI,MAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,qBAAqB,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACxC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACtC,WAAW,CAAC,EAAE,CAAC,CAAC;YAChB,aAAa,CAAC,MAAM,CAAC,CAAC;YAEtB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACxC,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,sDAAsD;oBAC/D,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;wBAC/B,EAAE,IAAI,EAAE,8CAA8C,EAAE,KAAK,EAAE,UAAU,EAAE;qBAC5E;iBACF,CAAC,CAAC,CAAC;YAEJ,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,UAAU,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;QACH,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC9B,WAAW,CAAC,EAAE,CAAC,CAAC;YAChB,aAAa,CAAC,MAAM,CAAC,CAAC;YACtB,WAAW,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,gEAAgE;QAChE,MAAM,UAAU,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAC1D,UAAU,CAAC,KAAK,EAAE,CAAC;QAEnB,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,sBAAsB,EAAE,CAAC;YACxC,UAAU,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACrC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,qBAAqB,EAAE,GAAG,EAAE,yCAAyC,CAAC,CAAC;QACxG,CAAC;QAED,gEAAgE;QAChE,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAElD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,WAAW,CAAC,EAAE,CAAC,CAAC;YAChB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAE3C,sBAAsB;YACtB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;gBACjC,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBACxE,MAAM,EAAE,OAAO,EAAE,GAAG,wBAAwB,EAAE,CAAC;gBAC/C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,OAAkB,EAAE,CAAC,CAAC;gBACzE,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;gBACvD,WAAW,CAAC,qBAAqB,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;YACjF,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAChE,CAAC;YAED,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAC/C,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,mCAAmC;oBAC5C,OAAO,EAAE,MAAM;oBACf,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;wBAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;wBACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;4BAAE,OAAO,2BAA2B,CAAC;wBACtE,OAAO,IAAI,CAAC;oBACd,CAAC;iBACF,CAAC,CAAC,CAAC;YAEJ,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,aAAa,kBAAkB,CAAC,CAAC;YAC3E,WAAW,CAAC,KAAK,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;gBAE7C,mBAAmB;gBACnB,IAAI,MAAM,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;oBACjC,WAAW,CAAC,OAAO,CAAC,aAAa,aAAa,0BAA0B,CAAC,CAAC;gBAC5E,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,IAAI,CAAC,aAAa,aAAa,wBAAwB,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACnC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,kBAAkB,EAAE,0BAA0B,GAAG,EAAE,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACxD,CAAC;QAED,gEAAgE;QAChE,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAEjD,MAAM,UAAU,GAAG,OAAO,CAAC,mCAAmC,CAAC,CAAC;QAChE,UAAU,CAAC,KAAK,EAAE,CAAC;QAEnB,IAAI,YAA6B,CAAC;QAClC,IAAI,CAAC;YACH,YAAY,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC9C,UAAU,CAAC,OAAO,CAAC,SAAS,YAAY,CAAC,MAAM,gBAAgB,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC1C,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,yBAAyB,EAAE,4BAA4B,GAAG,EAAE,CAAC,CAAC;QAC/F,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,qBAAqB,EAAE,6CAA6C,CAAC,CAAC;QACvG,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAC1C,MAAM,aAAa,GAAG,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC5D,MAAM,cAAc,GAAG,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC9D,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;YACxD,OAAO;gBACL,IAAI,EAAE,GAAG,GAAG,CAAC,KAAK,MAAM,aAAa,MAAM,cAAc,uBAAuB,aAAa,GAAG;gBAChG,KAAK,EAAE,CAAC;aACT,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC5C,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,sBAAsB;gBAC/B,OAAO;aACR,CAAC,CAAC,CAAC;QAEJ,MAAM,eAAe,GAAG,YAAY,CAAC,UAAU,CAAE,CAAC;QAClD,MAAM,gBAAgB,GAAG,eAAe,CAAC,QAAQ,CAAC;QAClD,MAAM,OAAO,GAAG,wBAAwB,CAAC,eAAe,CAAC,UAAU,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;QAElG,OAAO,CAAC,gBAAgB,EAAE;YACxB,aAAa,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;YACjD,aAAa,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;YAC/C,aAAa,qBAAqB,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,qBAAqB,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB;YACxI,2BAA2B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE;SAC7F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEd,gEAAgE;QAChE,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QACxE,MAAM,aAAa,GAAG,UAAU,EAAE,QAAQ,IAAI,CAAC,CAAC;QAChD,WAAW,CAAC,6BAA6B,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QAE3F,IAAI,aAAa,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;YACnD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,sBAAsB,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC;YAExF,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACjD,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,oCAAoC,OAAO,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW;oBACjG,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;oBACjC,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;wBAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;wBACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;4BAAE,OAAO,2BAA2B,CAAC;wBACtE,OAAO,IAAI,CAAC;oBACd,CAAC;iBACF,CAAC,CAAC,CAAC;YAEJ,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;YAE5C,4BAA4B;YAC5B,IAAI,aAAa,GAAG,WAAW,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;gBACjE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;wBAC5C,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,YAAY;wBAClB,OAAO,EAAE,GAAG,eAAe,sBAAsB,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,OAAO,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB;wBAC5K,OAAO,EAAE,KAAK;qBACf,CAAC,CAAC,CAAC;gBACJ,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO,CAAC,kBAAkB,EAAE;wBAC1B,4BAA4B;wBAC5B,EAAE;wBACF,oEAAoE;wBACpE,KAAK,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,EAAE;qBAC/C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBACd,OAAO;gBACT,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,eAAe,gCAAgC,CAAC,CAAC;YACrF,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,MAAM,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;gBAE9D,mBAAmB;gBACnB,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;gBAC1E,IAAI,YAAY,EAAE,CAAC;oBACjB,QAAQ,CAAC,OAAO,CAAC,UAAU,eAAe,KAAK,CAAC,CAAC;oBACjD,WAAW,CAAC,+BAA+B,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;gBACvG,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,CAAC,UAAU,eAAe,wBAAwB,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBACtC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,kBAAkB,EAAE,gBAAgB,GAAG,EAAE,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QACtI,CAAC;QAED,gEAAgE;QAChE,MAAM,OAAO,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;QAC5D,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAErE,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QACpF,CAAC;QAED,gEAAgE;QAChE,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;QAExD,MAAM,UAAU,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;QAC3D,UAAU,CAAC,KAAK,EAAE,CAAC;QAEnB,IAAI,UAAU,CAAC;QACf,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAC1D,UAAU,CAAC,OAAO,CAAC,oBAAoB,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,iBAAiB,EAAE,4BAA4B,GAAG,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAC1D,UAAU,CAAC,KAAK,EAAE,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/E,UAAU,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACvC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,4BAA4B,EAAE,kBAAkB,GAAG,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,gEAAgE;QAChE,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC9C,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,+BAA+B;gBACxC,OAAO,EAAE,IAAI;aACd,CAAC,CAAC,CAAC;QAEJ,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7D,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;YAE3E,2BAA2B;YAC3B,IAAI,cAAc,GAAG,KAAK,CAAC;YAC3B,IAAI,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC5E,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACrB,cAAc,GAAG,IAAI,CAAC;oBACtB,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,GAAG,GAAG,CAAC,CAAC,CAAC;gBACtE,CAAC;gBAAC,MAAM,CAAC;oBACP,YAAY;gBACd,CAAC;YACH,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;wBACtC,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,eAAe;wBACxB,OAAO,EAAE;4BACP,EAAE,IAAI,EAAE,sDAAsD,EAAE,KAAK,EAAE,aAAa,EAAE;4BACtF,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE;yBAC5C;qBACF,CAAC,CAAC,CAAC;gBAEJ,IAAI,SAA6B,CAAC;gBAClC,IAAI,MAAM,GAAG,GAAG,CAAC;gBAEjB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;oBACrB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;4BAChD,IAAI,EAAE,OAAO;4BACb,IAAI,EAAE,gBAAgB;4BACtB,OAAO,EAAE,0BAA0B;4BACnC,OAAO,EAAE,KAAK;4BACd,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gCAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gCACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,2BAA2B,CAAC;4BACtE,CAAC;yBACF,CAAC,CAAC,CAAC;oBACJ,SAAS,GAAG,cAAc,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;4BAC7C,IAAI,EAAE,OAAO;4BACb,IAAI,EAAE,aAAa;4BACnB,OAAO,EAAE,6CAA6C;4BACtD,OAAO,EAAE,GAAG;4BACZ,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gCAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gCACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,cAAc,CAAC;4BAC1D,CAAC;yBACF,CAAC,CAAC,CAAC;oBACJ,MAAM,GAAG,WAAW,CAAC;gBACvB,CAAC;gBAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;wBAC1C,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,UAAU;wBAChB,OAAO,EAAE,2BAA2B;wBACpC,OAAO,EAAE,KAAK;wBACd,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;4BAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;4BACxB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,0BAA0B,CAAC;wBACxE,CAAC;qBACF,CAAC,CAAC,CAAC;gBAEJ,eAAe;gBACf,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;gBACzF,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;gBACnD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBACrD,MAAM,EAAE,cAAc,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;gBAE3F,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;oBAC9B,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjD,CAAC;gBAED,MAAM,SAAS,GAAa;oBAC1B,YAAY,EAAE,SAAS,EAAE,OAAO;oBAChC,aAAa,EAAE,gBAAgB;oBAC/B,QAAQ,EAAE,IAAI;oBACd,YAAY,EAAE,QAAQ;oBACtB,UAAU,EAAE,MAAM;iBACnB,CAAC;gBACF,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;oBACtB,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;gBAC3C,CAAC;gBAED,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrE,MAAM,KAAK,GAAG,QAAQ,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;gBAEjD,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,EAAE;wBAC7D,QAAQ,EAAE,IAAI;wBACd,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC;qBAChC,CAAC,CAAC;oBACH,KAAK,CAAC,KAAK,EAAE,CAAC;oBACd,SAAS,CAAC,KAAK,CAAC,CAAC;oBACjB,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,4BAA4B,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;oBACtE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,mBAAmB,EAAE,CAAC,CAAC,CAAC;gBAC7D,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC;wBAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;oBAChD,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/G,CAAC;YACH,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,UAAU,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAC5D,UAAU,CAAC,KAAK,EAAE,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,qBAAqB,EAAE,CAAC;YAClD,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;gBACtB,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;gBAC7C,aAAa,CAAC,WAAW,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,UAAU,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,UAAU,CAAC,4BAA4B,EAAE;YACvC,aAAa,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK;YAC/C,aAAa,eAAe,CAAC,KAAK,EAAE;YACpC,aAAa,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;YAC/C,EAAE;YACF,aAAa;YACb,yBAAyB,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,EAAE;YAClE,aAAa,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU;SAC7C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,wEAAwE;AAExE,SAAS,aAAa,CAAC,MAAuB;IAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,WAAW,CAAC,KAAK,IAAI,IAAI,IAAI,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
@@ -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;AAuEpC,wBAAgB,sBAAsB,IAAI,OAAO,CAm6BhD"}
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 { isAddress, getAddress, formatUnits, parseUnits } from "viem";
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 { requireWalletAndKeystore } = await import("../bot/executor.js");
88
- const checks = {};
89
- // 1. Wallet
90
- let walletAddress = null;
91
- let walletHint;
92
- try {
93
- const { address } = requireWalletAndKeystore();
94
- walletAddress = address;
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: allOk, checks },
60
+ data: { ready: result.ready, provider: result.provider, checks },
140
61
  ui: {
141
- type: allOk ? "success" : "warn",
62
+ type: result.ready ? "success" : "warn",
142
63
  title: "0G Compute Setup",
143
- body: allOk
144
- ? "All checks passed. Ready to use 0G Compute."
145
- : "Some checks failed. Review the output above.",
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