@sequence0/blockclaw 2.0.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.
Files changed (190) hide show
  1. package/README.md +97 -0
  2. package/dist/agent/binary.d.ts +15 -0
  3. package/dist/agent/binary.d.ts.map +1 -0
  4. package/dist/agent/binary.js +172 -0
  5. package/dist/agent/binary.js.map +1 -0
  6. package/dist/agent/chains.d.ts +26 -0
  7. package/dist/agent/chains.d.ts.map +1 -0
  8. package/dist/agent/chains.js +123 -0
  9. package/dist/agent/chains.js.map +1 -0
  10. package/dist/agent/client.d.ts +484 -0
  11. package/dist/agent/client.d.ts.map +1 -0
  12. package/dist/agent/client.js +448 -0
  13. package/dist/agent/client.js.map +1 -0
  14. package/dist/agent/config.d.ts +75 -0
  15. package/dist/agent/config.d.ts.map +1 -0
  16. package/dist/agent/config.js +133 -0
  17. package/dist/agent/config.js.map +1 -0
  18. package/dist/agent/process.d.ts +36 -0
  19. package/dist/agent/process.d.ts.map +1 -0
  20. package/dist/agent/process.js +208 -0
  21. package/dist/agent/process.js.map +1 -0
  22. package/dist/agent/wallet.d.ts +43 -0
  23. package/dist/agent/wallet.d.ts.map +1 -0
  24. package/dist/agent/wallet.js +146 -0
  25. package/dist/agent/wallet.js.map +1 -0
  26. package/dist/ai/brain.d.ts +21 -0
  27. package/dist/ai/brain.d.ts.map +1 -0
  28. package/dist/ai/brain.js +117 -0
  29. package/dist/ai/brain.js.map +1 -0
  30. package/dist/ai/prompts.d.ts +15 -0
  31. package/dist/ai/prompts.d.ts.map +1 -0
  32. package/dist/ai/prompts.js +67 -0
  33. package/dist/ai/prompts.js.map +1 -0
  34. package/dist/ai/rules.d.ts +19 -0
  35. package/dist/ai/rules.d.ts.map +1 -0
  36. package/dist/ai/rules.js +143 -0
  37. package/dist/ai/rules.js.map +1 -0
  38. package/dist/core/detector.d.ts +16 -0
  39. package/dist/core/detector.d.ts.map +1 -0
  40. package/dist/core/detector.js +90 -0
  41. package/dist/core/detector.js.map +1 -0
  42. package/dist/core/healer.d.ts +62 -0
  43. package/dist/core/healer.d.ts.map +1 -0
  44. package/dist/core/healer.js +355 -0
  45. package/dist/core/healer.js.map +1 -0
  46. package/dist/core/heartbeat.d.ts +67 -0
  47. package/dist/core/heartbeat.d.ts.map +1 -0
  48. package/dist/core/heartbeat.js +426 -0
  49. package/dist/core/heartbeat.js.map +1 -0
  50. package/dist/core/memory.d.ts +57 -0
  51. package/dist/core/memory.d.ts.map +1 -0
  52. package/dist/core/memory.js +149 -0
  53. package/dist/core/memory.js.map +1 -0
  54. package/dist/core/updater.d.ts +16 -0
  55. package/dist/core/updater.d.ts.map +1 -0
  56. package/dist/core/updater.js +107 -0
  57. package/dist/core/updater.js.map +1 -0
  58. package/dist/index.d.ts +3 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +97 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/interface/commands/ask.d.ts +3 -0
  63. package/dist/interface/commands/ask.d.ts.map +1 -0
  64. package/dist/interface/commands/ask.js +39 -0
  65. package/dist/interface/commands/ask.js.map +1 -0
  66. package/dist/interface/commands/backup.d.ts +3 -0
  67. package/dist/interface/commands/backup.d.ts.map +1 -0
  68. package/dist/interface/commands/backup.js +576 -0
  69. package/dist/interface/commands/backup.js.map +1 -0
  70. package/dist/interface/commands/config.d.ts +3 -0
  71. package/dist/interface/commands/config.d.ts.map +1 -0
  72. package/dist/interface/commands/config.js +107 -0
  73. package/dist/interface/commands/config.js.map +1 -0
  74. package/dist/interface/commands/daemon.d.ts +3 -0
  75. package/dist/interface/commands/daemon.d.ts.map +1 -0
  76. package/dist/interface/commands/daemon.js +162 -0
  77. package/dist/interface/commands/daemon.js.map +1 -0
  78. package/dist/interface/commands/doctor.d.ts +3 -0
  79. package/dist/interface/commands/doctor.d.ts.map +1 -0
  80. package/dist/interface/commands/doctor.js +143 -0
  81. package/dist/interface/commands/doctor.js.map +1 -0
  82. package/dist/interface/commands/earnings.d.ts +3 -0
  83. package/dist/interface/commands/earnings.d.ts.map +1 -0
  84. package/dist/interface/commands/earnings.js +165 -0
  85. package/dist/interface/commands/earnings.js.map +1 -0
  86. package/dist/interface/commands/health.d.ts +3 -0
  87. package/dist/interface/commands/health.d.ts.map +1 -0
  88. package/dist/interface/commands/health.js +48 -0
  89. package/dist/interface/commands/health.js.map +1 -0
  90. package/dist/interface/commands/history.d.ts +3 -0
  91. package/dist/interface/commands/history.d.ts.map +1 -0
  92. package/dist/interface/commands/history.js +113 -0
  93. package/dist/interface/commands/history.js.map +1 -0
  94. package/dist/interface/commands/info.d.ts +3 -0
  95. package/dist/interface/commands/info.d.ts.map +1 -0
  96. package/dist/interface/commands/info.js +82 -0
  97. package/dist/interface/commands/info.js.map +1 -0
  98. package/dist/interface/commands/logs.d.ts +3 -0
  99. package/dist/interface/commands/logs.d.ts.map +1 -0
  100. package/dist/interface/commands/logs.js +98 -0
  101. package/dist/interface/commands/logs.js.map +1 -0
  102. package/dist/interface/commands/menu.d.ts +4 -0
  103. package/dist/interface/commands/menu.d.ts.map +1 -0
  104. package/dist/interface/commands/menu.js +156 -0
  105. package/dist/interface/commands/menu.js.map +1 -0
  106. package/dist/interface/commands/receive.d.ts +3 -0
  107. package/dist/interface/commands/receive.d.ts.map +1 -0
  108. package/dist/interface/commands/receive.js +81 -0
  109. package/dist/interface/commands/receive.js.map +1 -0
  110. package/dist/interface/commands/register.d.ts +3 -0
  111. package/dist/interface/commands/register.d.ts.map +1 -0
  112. package/dist/interface/commands/register.js +231 -0
  113. package/dist/interface/commands/register.js.map +1 -0
  114. package/dist/interface/commands/restart.d.ts +3 -0
  115. package/dist/interface/commands/restart.d.ts.map +1 -0
  116. package/dist/interface/commands/restart.js +154 -0
  117. package/dist/interface/commands/restart.js.map +1 -0
  118. package/dist/interface/commands/send.d.ts +3 -0
  119. package/dist/interface/commands/send.d.ts.map +1 -0
  120. package/dist/interface/commands/send.js +108 -0
  121. package/dist/interface/commands/send.js.map +1 -0
  122. package/dist/interface/commands/service.d.ts +3 -0
  123. package/dist/interface/commands/service.d.ts.map +1 -0
  124. package/dist/interface/commands/service.js +474 -0
  125. package/dist/interface/commands/service.js.map +1 -0
  126. package/dist/interface/commands/setup.d.ts +5 -0
  127. package/dist/interface/commands/setup.d.ts.map +1 -0
  128. package/dist/interface/commands/setup.js +410 -0
  129. package/dist/interface/commands/setup.js.map +1 -0
  130. package/dist/interface/commands/start.d.ts +3 -0
  131. package/dist/interface/commands/start.d.ts.map +1 -0
  132. package/dist/interface/commands/start.js +171 -0
  133. package/dist/interface/commands/start.js.map +1 -0
  134. package/dist/interface/commands/status.d.ts +3 -0
  135. package/dist/interface/commands/status.d.ts.map +1 -0
  136. package/dist/interface/commands/status.js +77 -0
  137. package/dist/interface/commands/status.js.map +1 -0
  138. package/dist/interface/commands/stop.d.ts +3 -0
  139. package/dist/interface/commands/stop.d.ts.map +1 -0
  140. package/dist/interface/commands/stop.js +62 -0
  141. package/dist/interface/commands/stop.js.map +1 -0
  142. package/dist/interface/commands/update.d.ts +3 -0
  143. package/dist/interface/commands/update.d.ts.map +1 -0
  144. package/dist/interface/commands/update.js +53 -0
  145. package/dist/interface/commands/update.js.map +1 -0
  146. package/dist/interface/commands/wallet.d.ts +3 -0
  147. package/dist/interface/commands/wallet.d.ts.map +1 -0
  148. package/dist/interface/commands/wallet.js +446 -0
  149. package/dist/interface/commands/wallet.js.map +1 -0
  150. package/dist/interface/commands/webhook.d.ts +3 -0
  151. package/dist/interface/commands/webhook.d.ts.map +1 -0
  152. package/dist/interface/commands/webhook.js +99 -0
  153. package/dist/interface/commands/webhook.js.map +1 -0
  154. package/dist/interface/commands/withdraw.d.ts +3 -0
  155. package/dist/interface/commands/withdraw.d.ts.map +1 -0
  156. package/dist/interface/commands/withdraw.js +261 -0
  157. package/dist/interface/commands/withdraw.js.map +1 -0
  158. package/dist/interface/interactive.d.ts +43 -0
  159. package/dist/interface/interactive.d.ts.map +1 -0
  160. package/dist/interface/interactive.js +276 -0
  161. package/dist/interface/interactive.js.map +1 -0
  162. package/dist/interface/logo.d.ts +2 -0
  163. package/dist/interface/logo.d.ts.map +1 -0
  164. package/dist/interface/logo.js +21 -0
  165. package/dist/interface/logo.js.map +1 -0
  166. package/dist/interface/webhooks.d.ts +19 -0
  167. package/dist/interface/webhooks.d.ts.map +1 -0
  168. package/dist/interface/webhooks.js +172 -0
  169. package/dist/interface/webhooks.js.map +1 -0
  170. package/dist/utils/format.d.ts +19 -0
  171. package/dist/utils/format.d.ts.map +1 -0
  172. package/dist/utils/format.js +107 -0
  173. package/dist/utils/format.js.map +1 -0
  174. package/dist/utils/logger.d.ts +20 -0
  175. package/dist/utils/logger.d.ts.map +1 -0
  176. package/dist/utils/logger.js +47 -0
  177. package/dist/utils/logger.js.map +1 -0
  178. package/dist/utils/paths.d.ts +35 -0
  179. package/dist/utils/paths.d.ts.map +1 -0
  180. package/dist/utils/paths.js +45 -0
  181. package/dist/utils/paths.js.map +1 -0
  182. package/dist/utils/platform.d.ts +26 -0
  183. package/dist/utils/platform.d.ts.map +1 -0
  184. package/dist/utils/platform.js +72 -0
  185. package/dist/utils/platform.js.map +1 -0
  186. package/dist/version.d.ts +3 -0
  187. package/dist/version.d.ts.map +1 -0
  188. package/dist/version.js +3 -0
  189. package/dist/version.js.map +1 -0
  190. package/package.json +67 -0
@@ -0,0 +1,446 @@
1
+ import pc from "picocolors";
2
+ import * as p from "@clack/prompts";
3
+ import { execSync } from "node:child_process";
4
+ import { writeFileSync } from "node:fs";
5
+ import { resolve } from "node:path";
6
+ import { AgentClient } from "../../agent/client.js";
7
+ import { WalletManager } from "../../agent/wallet.js";
8
+ import { readBlockclawConfig } from "../../agent/config.js";
9
+ import { logger } from "../../utils/logger.js";
10
+ import { CHAINS, getChainsForCurve } from "../../agent/chains.js";
11
+ import { selectWallet, handleCancel } from "../interactive.js";
12
+ function getClient() {
13
+ const config = readBlockclawConfig();
14
+ return new AgentClient(`http://localhost:${config.api_port ?? 8080}`);
15
+ }
16
+ export function register(program) {
17
+ const wallet = program
18
+ .command("wallet")
19
+ .description("Wallet management");
20
+ wallet
21
+ .command("list")
22
+ .description("List all wallets")
23
+ .action(async () => {
24
+ try {
25
+ const mgr = new WalletManager(getClient());
26
+ await mgr.printList();
27
+ }
28
+ catch (err) {
29
+ logger.error(`Failed to list wallets: ${err.message}`);
30
+ process.exit(1);
31
+ }
32
+ });
33
+ wallet
34
+ .command("create")
35
+ .description("Create a new wallet that works on all supported chains")
36
+ .option("--id <wallet_id>", "Wallet name")
37
+ .option("--curve <curve>", "Advanced: specific curve (secp256k1 or ed25519)")
38
+ .option("--threshold <n>", "Advanced: signing threshold")
39
+ .option("--creator <address>", "Advanced: creator address for on-chain ownership")
40
+ .action(async (opts) => {
41
+ try {
42
+ const client = getClient();
43
+ const mgr = new WalletManager(client);
44
+ p.intro(pc.cyan("Create Wallet"));
45
+ // Wallet name — interactive if not provided
46
+ let walletId = opts.id;
47
+ if (!walletId) {
48
+ const name = await p.text({
49
+ message: "What would you like to name this wallet?",
50
+ placeholder: "my-wallet",
51
+ validate: (v) => {
52
+ if (!v || v.trim().length === 0)
53
+ return "Name is required";
54
+ if (v.includes(" "))
55
+ return "No spaces — use dashes instead";
56
+ if (v.endsWith("-ed"))
57
+ return "Name cannot end with '-ed'";
58
+ return undefined;
59
+ },
60
+ });
61
+ if (p.isCancel(name)) {
62
+ p.cancel("Cancelled.");
63
+ process.exit(0);
64
+ }
65
+ walletId = name;
66
+ }
67
+ // Check network
68
+ const spin = p.spinner();
69
+ spin.start("Connecting to Sequence0 network...");
70
+ const status = await client.status();
71
+ const peers = [status.peer_id, ...status.connected_peer_ids];
72
+ if (peers.length < 2) {
73
+ spin.stop("Not connected");
74
+ p.cancel("Could not connect to the Sequence0 network. Make sure your node is running.");
75
+ process.exit(1);
76
+ }
77
+ spin.stop("Connected to Sequence0 network");
78
+ const threshold = opts.threshold
79
+ ? parseInt(opts.threshold)
80
+ : Math.ceil((peers.length * 2) / 3);
81
+ // Power user: specific curve
82
+ if (opts.curve) {
83
+ const chains = getChainsForCurve(opts.curve);
84
+ const ok = await p.confirm({
85
+ message: `Create "${walletId}" on ${chains.length} ${opts.curve === "secp256k1" ? "Ethereum-type" : "Solana-type"} chains?`,
86
+ });
87
+ if (p.isCancel(ok) || !ok) {
88
+ p.cancel("Cancelled.");
89
+ process.exit(0);
90
+ }
91
+ spin.start("Creating wallet...");
92
+ await mgr.create({ walletId, curve: opts.curve, threshold, creator: opts.creator });
93
+ spin.stop("Wallet created!");
94
+ p.note([
95
+ `${pc.dim("Wallet:")} ${pc.cyan(walletId)}`,
96
+ `${pc.dim("Chains:")} ${chains.length} compatible chains`,
97
+ ].join("\n"), "Wallet Created");
98
+ p.outro("Done! View with: blockclaw wallet list");
99
+ return;
100
+ }
101
+ // Default: create universal wallet (both curves) — works on ALL chains
102
+ const totalChains = CHAINS.length;
103
+ const ok = await p.confirm({
104
+ message: `Create "${walletId}"? Works on all ${totalChains} supported chains (Ethereum, Bitcoin, Solana, and more)`,
105
+ });
106
+ if (p.isCancel(ok) || !ok) {
107
+ p.cancel("Cancelled.");
108
+ process.exit(0);
109
+ }
110
+ spin.start("Creating wallet across the network... this may take a moment");
111
+ const result = await mgr.createUniversal({
112
+ walletId,
113
+ threshold,
114
+ creator: opts.creator,
115
+ });
116
+ spin.stop("Wallet created!");
117
+ p.note([
118
+ `${pc.dim("Wallet:")} ${pc.cyan(walletId)}`,
119
+ `${pc.dim("Chains:")} All ${totalChains} supported chains`,
120
+ "",
121
+ pc.dim("One wallet — Ethereum, Bitcoin, Solana, Polygon, and more."),
122
+ ].join("\n"), "Wallet Created");
123
+ p.outro("Done! View with: blockclaw wallet list");
124
+ }
125
+ catch (err) {
126
+ logger.error(`Failed to create wallet: ${err.message}`);
127
+ process.exit(1);
128
+ }
129
+ });
130
+ wallet
131
+ .command("balance")
132
+ .description("Check wallet balance on a chain")
133
+ .argument("[wallet_id]", "Wallet identifier")
134
+ .option("--chain <chain>", "Chain to check balance on")
135
+ .action(async (walletId, opts) => {
136
+ try {
137
+ const client = getClient();
138
+ const mgr = new WalletManager(client);
139
+ // Interactive wallet selection if not provided
140
+ if (!walletId) {
141
+ const wallets = await mgr.list();
142
+ if (wallets.length === 0) {
143
+ logger.info("No wallets found. Create one with: blockclaw wallet create");
144
+ return;
145
+ }
146
+ if (wallets.length === 1) {
147
+ walletId = wallets[0].wallet_id;
148
+ logger.info(`Using wallet: ${walletId}`);
149
+ }
150
+ else {
151
+ const choice = await p.select({
152
+ message: "Select wallet",
153
+ options: wallets.map((w) => ({
154
+ value: w.wallet_id,
155
+ label: `${w.wallet_id} ${pc.dim(w.address ? `(${w.address.slice(0, 6)}...${w.address.slice(-4)})` : "(pending)")} ${pc.dim(w.chain ?? "")}`,
156
+ })),
157
+ });
158
+ if (p.isCancel(choice)) {
159
+ p.cancel("Cancelled.");
160
+ process.exit(0);
161
+ }
162
+ walletId = choice;
163
+ }
164
+ }
165
+ const info = await mgr.balance(walletId);
166
+ console.log();
167
+ console.log(` ${pc.bold("Wallet:")} ${pc.cyan(info.wallet_id)}`);
168
+ if (info.address) {
169
+ console.log(` ${pc.bold("Address:")} ${info.address}`);
170
+ }
171
+ console.log(` ${pc.bold("Type:")} ${(info.chain ?? "secp256k1") === "secp256k1" ? "Ethereum-compatible" : "Solana-compatible"}`);
172
+ console.log(` ${pc.bold("Security:")} ${info.threshold}`);
173
+ console.log(` ${pc.bold("Members:")} ${info.participants.length}`);
174
+ console.log();
175
+ console.log(pc.dim(" To check on-chain balance, use a block explorer:"));
176
+ if (info.address) {
177
+ console.log(pc.dim(` Ethereum: https://etherscan.io/address/${info.address}`));
178
+ console.log(pc.dim(` Solana: https://solscan.io/account/${info.address}`));
179
+ }
180
+ console.log();
181
+ }
182
+ catch (err) {
183
+ logger.error(`Failed to get wallet: ${err.message}`);
184
+ process.exit(1);
185
+ }
186
+ });
187
+ wallet
188
+ .command("refresh")
189
+ .description("Rotate key shares without changing your wallet address")
190
+ .argument("[wallet_id]", "Wallet identifier")
191
+ .action(async (walletIdArg) => {
192
+ try {
193
+ const client = getClient();
194
+ p.intro(pc.cyan("Refresh Key Shares"));
195
+ // Select wallet
196
+ const wallet = await selectWallet(client, walletIdArg);
197
+ const shortAddr = wallet.address
198
+ ? `${wallet.address.slice(0, 6)}...${wallet.address.slice(-4)}`
199
+ : "pending";
200
+ // Explain what refresh does
201
+ p.note([
202
+ "Key refresh rotates the secret pieces held by each network member",
203
+ "without changing your wallet's public key or address.",
204
+ "",
205
+ "This is a security best practice — like changing your password.",
206
+ ].join("\n"), "What this does");
207
+ // Confirm
208
+ const ok = await p.confirm({
209
+ message: `Refresh key shares for "${wallet.walletId}"?`,
210
+ });
211
+ if (p.isCancel(ok) || !ok) {
212
+ p.cancel("Cancelled.");
213
+ process.exit(0);
214
+ }
215
+ // Execute
216
+ const spin = p.spinner();
217
+ spin.start("Refreshing key shares...");
218
+ await client.refresh({ wallet_id: wallet.walletId });
219
+ spin.stop("Key shares refreshed!");
220
+ p.note([
221
+ `${pc.dim("Wallet:")} ${pc.cyan(wallet.walletId)}`,
222
+ `${pc.dim("Address:")} ${shortAddr} ${pc.green("(unchanged)")}`,
223
+ ].join("\n"), "Refresh Complete");
224
+ p.outro("Done. Your wallet address and balances are unaffected.");
225
+ }
226
+ catch (err) {
227
+ logger.error(`Failed to refresh wallet: ${err.message}`);
228
+ process.exit(1);
229
+ }
230
+ });
231
+ wallet
232
+ .command("reshare")
233
+ .description("Change who holds key shares for this wallet")
234
+ .argument("[wallet_id]", "Wallet identifier")
235
+ .option("--threshold <n>", "New signing threshold")
236
+ .action(async (walletIdArg, opts) => {
237
+ try {
238
+ const client = getClient();
239
+ p.intro(pc.cyan("Reshare Wallet"));
240
+ // Select wallet
241
+ const wallet = await selectWallet(client, walletIdArg);
242
+ // Fetch full wallet details to show current setup
243
+ const wallets = await client.wallets();
244
+ const walletInfo = wallets.find((w) => w.wallet_id === wallet.walletId);
245
+ const currentThreshold = walletInfo?.threshold ?? 0;
246
+ const currentParticipants = walletInfo?.participants ?? [];
247
+ // Show current security group
248
+ const peerNames = currentParticipants.map((pid) => `${pid.slice(0, 8)}...`);
249
+ p.note([
250
+ `${pc.dim("Members:")} ${currentParticipants.length} (${peerNames.join(", ")})`,
251
+ `${pc.dim("Security:")} ${currentThreshold}-of-${currentParticipants.length} (${currentThreshold} member${currentThreshold === 1 ? "" : "s"} must agree to sign)`,
252
+ ].join("\n"), "Current security group");
253
+ // Explain what reshare does
254
+ p.note([
255
+ "Resharing lets you change who holds key shares for this wallet.",
256
+ "Use this to replace an offline member or adjust the security level.",
257
+ "",
258
+ "Your wallet address stays the same.",
259
+ ].join("\n"), "What this does");
260
+ // Determine new threshold
261
+ let newThreshold;
262
+ if (opts.threshold) {
263
+ newThreshold = parseInt(opts.threshold);
264
+ }
265
+ else {
266
+ const changeChoice = await p.select({
267
+ message: "What would you like to change?",
268
+ options: [
269
+ {
270
+ value: "keep",
271
+ label: "Keep current members and threshold (just re-distribute shares)",
272
+ },
273
+ {
274
+ value: "threshold",
275
+ label: "Change threshold (security level)",
276
+ },
277
+ ],
278
+ });
279
+ if (p.isCancel(changeChoice))
280
+ handleCancel();
281
+ if (changeChoice === "threshold") {
282
+ const thresholdInput = await p.text({
283
+ message: `New threshold (currently ${currentThreshold}-of-${currentParticipants.length})`,
284
+ placeholder: String(currentThreshold),
285
+ validate: (v) => {
286
+ const n = parseInt(v);
287
+ if (isNaN(n) || n < 1)
288
+ return "Must be a positive number";
289
+ if (n > currentParticipants.length) {
290
+ return `Cannot exceed ${currentParticipants.length} members`;
291
+ }
292
+ return undefined;
293
+ },
294
+ });
295
+ if (p.isCancel(thresholdInput))
296
+ handleCancel();
297
+ newThreshold = parseInt(thresholdInput);
298
+ }
299
+ }
300
+ // Confirm
301
+ const summaryParts = [`Reshare wallet "${wallet.walletId}"`];
302
+ if (newThreshold) {
303
+ summaryParts.push(`(change threshold to ${newThreshold}-of-${currentParticipants.length})`);
304
+ }
305
+ const ok = await p.confirm({
306
+ message: `${summaryParts.join(" ")}?`,
307
+ });
308
+ if (p.isCancel(ok) || !ok) {
309
+ p.cancel("Cancelled.");
310
+ process.exit(0);
311
+ }
312
+ // Execute
313
+ const spin = p.spinner();
314
+ spin.start("Resharing key shares across the network...");
315
+ await client.reshare({
316
+ wallet_id: wallet.walletId,
317
+ new_threshold: newThreshold,
318
+ });
319
+ spin.stop("Reshare complete!");
320
+ const finalThreshold = newThreshold ?? currentThreshold;
321
+ p.note([
322
+ `${pc.dim("Wallet:")} ${pc.cyan(wallet.walletId)}`,
323
+ `${pc.dim("Security:")} ${finalThreshold}-of-${currentParticipants.length}`,
324
+ newThreshold && newThreshold !== currentThreshold
325
+ ? `${pc.dim("Changed:")} threshold ${currentThreshold} ${pc.yellow("->")} ${newThreshold}`
326
+ : `${pc.dim("Shares:")} re-distributed (threshold unchanged)`,
327
+ ].join("\n"), "Reshare Complete");
328
+ p.outro("Done. Key shares have been re-distributed across the network.");
329
+ }
330
+ catch (err) {
331
+ logger.error(`Failed to reshare wallet: ${err.message}`);
332
+ process.exit(1);
333
+ }
334
+ });
335
+ wallet
336
+ .command("export")
337
+ .description("Export wallet public information")
338
+ .argument("[wallet_id]", "Wallet identifier")
339
+ .action(async (walletIdArg) => {
340
+ try {
341
+ const client = getClient();
342
+ p.intro(pc.cyan("Export Wallet Info"));
343
+ p.log.info(pc.dim("This exports your wallet's public information only. " +
344
+ "Private key shares never leave your node."));
345
+ // Select wallet
346
+ const wallet = await selectWallet(client, walletIdArg);
347
+ // Fetch full wallet details
348
+ const wallets = await client.wallets();
349
+ const walletInfo = wallets.find((w) => w.wallet_id === wallet.walletId);
350
+ if (!walletInfo) {
351
+ p.log.error("Could not load wallet details.");
352
+ process.exit(1);
353
+ }
354
+ const curve = walletInfo.chain ?? "secp256k1";
355
+ const curveLabel = curve === "secp256k1" ? "Ethereum-compatible" : "Solana-compatible";
356
+ const chains = getChainsForCurve(curve);
357
+ const threshold = walletInfo.threshold;
358
+ const participants = walletInfo.participants ?? [];
359
+ const address = walletInfo.address ?? "(pending)";
360
+ // Display wallet public info
361
+ const chainPreview = chains.slice(0, 5).map((c) => c.name).join(", ");
362
+ const chainSuffix = chains.length > 5 ? ` + ${chains.length - 5} more` : "";
363
+ p.note([
364
+ `${pc.dim("Wallet:")} ${pc.cyan(walletInfo.wallet_id)}`,
365
+ `${pc.dim("Address:")} ${address}`,
366
+ `${pc.dim("Type:")} ${curveLabel}`,
367
+ `${pc.dim("Security:")} ${threshold}-of-${participants.length}`,
368
+ `${pc.dim("Members:")} ${participants.length}`,
369
+ `${pc.dim("Chains:")} ${chainPreview}${chainSuffix}`,
370
+ ].join("\n"), "Wallet Public Info");
371
+ // Offer to copy address to clipboard
372
+ if (address !== "(pending)") {
373
+ const copyChoice = await p.confirm({
374
+ message: "Copy address to clipboard?",
375
+ });
376
+ if (p.isCancel(copyChoice))
377
+ handleCancel();
378
+ if (copyChoice) {
379
+ try {
380
+ const platform = process.platform;
381
+ if (platform === "darwin") {
382
+ execSync(`echo -n ${JSON.stringify(address)} | pbcopy`);
383
+ }
384
+ else {
385
+ execSync(`echo -n ${JSON.stringify(address)} | xclip -selection clipboard`);
386
+ }
387
+ p.log.success("Address copied to clipboard.");
388
+ }
389
+ catch {
390
+ p.log.warn(`Could not copy to clipboard. Address: ${pc.cyan(address)}`);
391
+ }
392
+ }
393
+ }
394
+ // Offer to save to JSON file
395
+ const saveChoice = await p.confirm({
396
+ message: "Save wallet info to a JSON file?",
397
+ });
398
+ if (p.isCancel(saveChoice))
399
+ handleCancel();
400
+ if (saveChoice) {
401
+ const filename = await p.text({
402
+ message: "File name",
403
+ placeholder: `${walletInfo.wallet_id}.json`,
404
+ defaultValue: `${walletInfo.wallet_id}.json`,
405
+ });
406
+ if (p.isCancel(filename))
407
+ handleCancel();
408
+ const exportData = {
409
+ wallet_id: walletInfo.wallet_id,
410
+ address: walletInfo.address ?? null,
411
+ type: curveLabel,
412
+ curve,
413
+ threshold,
414
+ participants: participants.length,
415
+ compatible_chains: chains.map((c) => ({
416
+ id: c.id,
417
+ name: c.name,
418
+ symbol: c.symbol,
419
+ })),
420
+ exported_at: new Date().toISOString(),
421
+ note: "Public information only. Private key shares are never exported.",
422
+ };
423
+ const filePath = resolve(process.cwd(), filename);
424
+ writeFileSync(filePath, JSON.stringify(exportData, null, 2) + "\n");
425
+ p.log.success(`Saved to ${pc.cyan(filePath)}`);
426
+ }
427
+ p.outro("Done.");
428
+ }
429
+ catch (err) {
430
+ logger.error(`Failed to export wallet: ${err.message}`);
431
+ process.exit(1);
432
+ }
433
+ });
434
+ // Default action when no subcommand is given
435
+ wallet.action(async () => {
436
+ try {
437
+ const mgr = new WalletManager(getClient());
438
+ await mgr.printList();
439
+ }
440
+ catch (err) {
441
+ logger.error(`Failed to list wallets: ${err.message}`);
442
+ process.exit(1);
443
+ }
444
+ });
445
+ }
446
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../../src/interface/commands/wallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function register(program: Command): void;
3
+ //# sourceMappingURL=webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../../src/interface/commands/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkG/C"}
@@ -0,0 +1,99 @@
1
+ import pc from "picocolors";
2
+ import { loadWebhooks, addWebhook, removeWebhook, dispatchEvent, } from "../webhooks.js";
3
+ import { logger } from "../../utils/logger.js";
4
+ import { formatRelative } from "../../utils/format.js";
5
+ export function register(program) {
6
+ const webhook = program
7
+ .command("webhook")
8
+ .description("Webhook management for alerts");
9
+ webhook
10
+ .command("add")
11
+ .description("Add a webhook")
12
+ .requiredOption("--url <url>", "Webhook URL")
13
+ .requiredOption("--type <type>", "Webhook type (discord, telegram, slack, custom)")
14
+ .option("--name <name>", "Display name for this webhook")
15
+ .option("--events <events>", "Comma-separated event types to listen for")
16
+ .action((opts) => {
17
+ try {
18
+ const validTypes = ["discord", "telegram", "slack", "custom"];
19
+ if (!validTypes.includes(opts.type)) {
20
+ logger.error(`Invalid type: ${opts.type}. Must be one of: ${validTypes.join(", ")}`);
21
+ process.exit(1);
22
+ }
23
+ const wh = addWebhook({
24
+ type: opts.type,
25
+ url: opts.url,
26
+ name: opts.name,
27
+ events: opts.events ? opts.events.split(",").map((e) => e.trim()) : undefined,
28
+ });
29
+ logger.success(`Webhook added: ${wh.id}`);
30
+ logger.kv("Type", wh.type);
31
+ logger.kv("URL", wh.url.slice(0, 50) + (wh.url.length > 50 ? "..." : ""));
32
+ if (wh.name)
33
+ logger.kv("Name", wh.name);
34
+ logger.blank();
35
+ }
36
+ catch (err) {
37
+ logger.error(`Failed to add webhook: ${err.message}`);
38
+ process.exit(1);
39
+ }
40
+ });
41
+ webhook
42
+ .command("remove")
43
+ .description("Remove a webhook")
44
+ .argument("<id>", "Webhook ID")
45
+ .action((id) => {
46
+ const removed = removeWebhook(id);
47
+ if (removed) {
48
+ logger.success(`Webhook removed: ${id}`);
49
+ }
50
+ else {
51
+ logger.error(`Webhook not found: ${id}`);
52
+ }
53
+ });
54
+ webhook
55
+ .command("list")
56
+ .description("List all webhooks")
57
+ .action(() => {
58
+ const webhooks = loadWebhooks();
59
+ if (webhooks.length === 0) {
60
+ logger.info("No webhooks configured");
61
+ logger.info("Add one: blockclaw webhook add --url <url> --type discord");
62
+ return;
63
+ }
64
+ logger.header(`Webhooks (${webhooks.length})`);
65
+ for (const wh of webhooks) {
66
+ const status = wh.enabled ? pc.green("enabled") : pc.red("disabled");
67
+ console.log(` ${pc.cyan(wh.id)} ${pc.dim(`(${wh.type})`)} ${status}`);
68
+ if (wh.name)
69
+ console.log(` ${pc.dim("Name:")} ${wh.name}`);
70
+ console.log(` ${pc.dim("URL:")} ${wh.url.slice(0, 60)}${wh.url.length > 60 ? "..." : ""}`);
71
+ console.log(` ${pc.dim("Added:")} ${formatRelative(wh.createdAt)}`);
72
+ if (wh.events && wh.events.length > 0) {
73
+ console.log(` ${pc.dim("Events:")} ${wh.events.join(", ")}`);
74
+ }
75
+ console.log();
76
+ }
77
+ });
78
+ webhook
79
+ .command("test")
80
+ .description("Send a test event to all webhooks")
81
+ .action(async () => {
82
+ const webhooks = loadWebhooks();
83
+ if (webhooks.length === 0) {
84
+ logger.info("No webhooks configured");
85
+ return;
86
+ }
87
+ logger.info(`Sending test event to ${webhooks.length} webhook(s)...`);
88
+ await dispatchEvent("test", "This is a test message from BlockClaw", {
89
+ source: "blockclaw webhook test",
90
+ timestamp: new Date().toISOString(),
91
+ });
92
+ logger.success("Test event dispatched");
93
+ });
94
+ // Default action
95
+ webhook.action(() => {
96
+ webhook.commands.find((c) => c.name() === "list")?.parse([], { from: "user" });
97
+ });
98
+ }
99
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../../src/interface/commands/webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function register(program: Command): void;
3
+ //# sourceMappingURL=withdraw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdraw.d.ts","sourceRoot":"","sources":["../../../src/interface/commands/withdraw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuCzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiB/C"}