@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,576 @@
1
+ import * as p from "@clack/prompts";
2
+ import pc from "picocolors";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import os from "node:os";
6
+ import crypto from "node:crypto";
7
+ import { isAgentRunning } from "../../agent/process.js";
8
+ import { SEQUENCE0_DIR, DATA_DIR, AGENT_CONFIG, BLOCKCLAW_DIR, BLOCKCLAW_CONFIG, ensureDir, } from "../../utils/paths.js";
9
+ // ---------------------------------------------------------------------------
10
+ // Helpers
11
+ // ---------------------------------------------------------------------------
12
+ function guard(value) {
13
+ if (p.isCancel(value))
14
+ throw new Error("CANCEL");
15
+ return value;
16
+ }
17
+ /** Format bytes to human readable */
18
+ function formatBytes(bytes) {
19
+ if (bytes < 1024)
20
+ return `${bytes} B`;
21
+ if (bytes < 1024 * 1024)
22
+ return `${(bytes / 1024).toFixed(1)} KB`;
23
+ if (bytes < 1024 * 1024 * 1024)
24
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
25
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;
26
+ }
27
+ /** Format date as YYYY-MM-DD */
28
+ function dateStamp() {
29
+ const d = new Date();
30
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
31
+ }
32
+ /** Derive a 256-bit key from a password using scrypt */
33
+ function deriveKey(password, salt) {
34
+ return crypto.scryptSync(password, salt, 32);
35
+ }
36
+ /** Encrypt a buffer with AES-256-GCM */
37
+ function encrypt(data, password) {
38
+ const salt = crypto.randomBytes(16);
39
+ const key = deriveKey(password, salt);
40
+ const iv = crypto.randomBytes(12);
41
+ const cipher = crypto.createCipheriv("aes-256-gcm", key, iv);
42
+ const encrypted = Buffer.concat([cipher.update(data), cipher.final()]);
43
+ const authTag = cipher.getAuthTag();
44
+ // Format: MAGIC(8) + salt(16) + iv(12) + authTag(16) + encrypted(rest)
45
+ const magic = Buffer.from("S0BACKUP", "utf8"); // 8 bytes
46
+ return Buffer.concat([magic, salt, iv, authTag, encrypted]);
47
+ }
48
+ /** Decrypt a buffer with AES-256-GCM */
49
+ function decrypt(data, password) {
50
+ const magic = data.subarray(0, 8).toString("utf8");
51
+ if (magic !== "S0BACKUP") {
52
+ throw new Error("Not a valid encrypted BlockClaw backup (bad magic header)");
53
+ }
54
+ const salt = data.subarray(8, 24);
55
+ const iv = data.subarray(24, 36);
56
+ const authTag = data.subarray(36, 52);
57
+ const encrypted = data.subarray(52);
58
+ const key = deriveKey(password, salt);
59
+ const decipher = crypto.createDecipheriv("aes-256-gcm", key, iv);
60
+ decipher.setAuthTag(authTag);
61
+ return Buffer.concat([decipher.update(encrypted), decipher.final()]);
62
+ }
63
+ /** Collect files to back up (relative path -> absolute path) */
64
+ function collectBackupFiles() {
65
+ const files = new Map();
66
+ // Key shares and agent data (the critical data)
67
+ if (fs.existsSync(DATA_DIR)) {
68
+ walkDir(DATA_DIR, SEQUENCE0_DIR, files);
69
+ }
70
+ // Agent config
71
+ if (fs.existsSync(AGENT_CONFIG)) {
72
+ files.set(path.relative(SEQUENCE0_DIR, AGENT_CONFIG), AGENT_CONFIG);
73
+ }
74
+ // BlockClaw config
75
+ if (fs.existsSync(BLOCKCLAW_CONFIG)) {
76
+ files.set(path.relative(SEQUENCE0_DIR, BLOCKCLAW_CONFIG), BLOCKCLAW_CONFIG);
77
+ }
78
+ // BlockClaw webhooks, memory (not logs/pids)
79
+ const blockclawExtras = ["webhooks.json", "memory.json"];
80
+ for (const name of blockclawExtras) {
81
+ const full = path.join(BLOCKCLAW_DIR, name);
82
+ if (fs.existsSync(full)) {
83
+ files.set(path.relative(SEQUENCE0_DIR, full), full);
84
+ }
85
+ }
86
+ return files;
87
+ }
88
+ /** Recursively walk a directory, collecting files */
89
+ function walkDir(dir, base, files) {
90
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
91
+ for (const entry of entries) {
92
+ const full = path.join(dir, entry.name);
93
+ if (entry.isDirectory()) {
94
+ walkDir(full, base, files);
95
+ }
96
+ else if (entry.isFile()) {
97
+ files.set(path.relative(base, full), full);
98
+ }
99
+ }
100
+ }
101
+ // ---------------------------------------------------------------------------
102
+ // Simple tar archive creation/extraction (no external deps)
103
+ // ---------------------------------------------------------------------------
104
+ /** Create a tar archive from files (simplified POSIX tar format) */
105
+ function createTar(files) {
106
+ const blocks = [];
107
+ for (const [relPath, absPath] of files) {
108
+ const content = fs.readFileSync(absPath);
109
+ const stat = fs.statSync(absPath);
110
+ // Create header (512 bytes)
111
+ const header = Buffer.alloc(512, 0);
112
+ // Name (100 bytes)
113
+ const nameBytes = Buffer.from(relPath, "utf8");
114
+ nameBytes.copy(header, 0, 0, Math.min(nameBytes.length, 100));
115
+ // Mode (8 bytes)
116
+ Buffer.from(octal(stat.mode & 0o7777, 7) + "\0", "ascii").copy(header, 100);
117
+ // UID (8 bytes)
118
+ Buffer.from(octal(stat.uid, 7) + "\0", "ascii").copy(header, 108);
119
+ // GID (8 bytes)
120
+ Buffer.from(octal(stat.gid, 7) + "\0", "ascii").copy(header, 116);
121
+ // Size (12 bytes)
122
+ Buffer.from(octal(content.length, 11) + "\0", "ascii").copy(header, 124);
123
+ // Mtime (12 bytes)
124
+ Buffer.from(octal(Math.floor(stat.mtimeMs / 1000), 11) + "\0", "ascii").copy(header, 136);
125
+ // Checksum placeholder (8 spaces)
126
+ Buffer.from(" ", "ascii").copy(header, 148);
127
+ // Type flag: regular file
128
+ header[156] = 0x30; // '0'
129
+ // USTAR magic
130
+ Buffer.from("ustar\0", "ascii").copy(header, 257);
131
+ Buffer.from("00", "ascii").copy(header, 263);
132
+ // Long name support via prefix (155 bytes at offset 345)
133
+ if (nameBytes.length > 100) {
134
+ const prefix = relPath.substring(0, relPath.length - 100);
135
+ Buffer.from(prefix, "utf8").copy(header, 345, 0, Math.min(prefix.length, 155));
136
+ }
137
+ // Calculate checksum
138
+ let checksum = 0;
139
+ for (let i = 0; i < 512; i++) {
140
+ checksum += header[i];
141
+ }
142
+ Buffer.from(octal(checksum, 6) + "\0 ", "ascii").copy(header, 148);
143
+ blocks.push(header);
144
+ // Content blocks (512-byte aligned)
145
+ blocks.push(content);
146
+ const padding = 512 - (content.length % 512);
147
+ if (padding < 512) {
148
+ blocks.push(Buffer.alloc(padding, 0));
149
+ }
150
+ }
151
+ // End-of-archive marker (two 512-byte zero blocks)
152
+ blocks.push(Buffer.alloc(1024, 0));
153
+ return Buffer.concat(blocks);
154
+ }
155
+ function octal(value, width) {
156
+ return value.toString(8).padStart(width, "0");
157
+ }
158
+ /** Extract files from a tar archive, returns map of relative path -> content */
159
+ function extractTar(tarData) {
160
+ const files = new Map();
161
+ let offset = 0;
162
+ while (offset + 512 <= tarData.length) {
163
+ const header = tarData.subarray(offset, offset + 512);
164
+ // Check for end-of-archive (all zeros)
165
+ let allZero = true;
166
+ for (let i = 0; i < 512; i++) {
167
+ if (header[i] !== 0) {
168
+ allZero = false;
169
+ break;
170
+ }
171
+ }
172
+ if (allZero)
173
+ break;
174
+ // Parse name
175
+ let name = header.subarray(0, 100).toString("utf8").replace(/\0+$/, "");
176
+ // Check prefix for long names
177
+ const prefix = header.subarray(345, 500).toString("utf8").replace(/\0+$/, "");
178
+ if (prefix) {
179
+ name = prefix + "/" + name;
180
+ }
181
+ // Parse size
182
+ const sizeStr = header.subarray(124, 136).toString("utf8").replace(/\0+$/, "").trim();
183
+ const size = parseInt(sizeStr, 8) || 0;
184
+ // Parse mode
185
+ const modeStr = header.subarray(100, 108).toString("utf8").replace(/\0+$/, "").trim();
186
+ const mode = parseInt(modeStr, 8) || 0o644;
187
+ // Type flag
188
+ const typeFlag = header[156];
189
+ offset += 512;
190
+ if (typeFlag === 0x30 || typeFlag === 0) { // Regular file
191
+ const content = Buffer.from(tarData.subarray(offset, offset + size));
192
+ files.set(name, { content, mode });
193
+ }
194
+ // Advance past content (512-byte aligned)
195
+ const contentBlocks = Math.ceil(size / 512);
196
+ offset += contentBlocks * 512;
197
+ }
198
+ return files;
199
+ }
200
+ // ---------------------------------------------------------------------------
201
+ // Backup command
202
+ // ---------------------------------------------------------------------------
203
+ async function runBackup() {
204
+ console.log();
205
+ p.intro(pc.bgCyan(pc.black(" blockclaw backup ")));
206
+ // Step 1: Check if agent is running
207
+ const { running, pid } = isAgentRunning();
208
+ if (running) {
209
+ p.log.warn(pc.yellow("Your node is currently running") + ` (PID ${pid}).\n` +
210
+ " Backing up while running may produce inconsistent data.\n" +
211
+ ` Consider running ${pc.cyan("blockclaw stop")} first.`);
212
+ const proceed = guard(await p.confirm({
213
+ message: "Continue backup anyway?",
214
+ initialValue: false,
215
+ }));
216
+ if (!proceed)
217
+ throw new Error("CANCEL");
218
+ }
219
+ // Step 2: Collect files and show what will be backed up
220
+ const spinner = p.spinner();
221
+ spinner.start("Scanning for backup files");
222
+ const files = collectBackupFiles();
223
+ spinner.stop(`Found ${pc.bold(String(files.size))} files to back up`);
224
+ if (files.size === 0) {
225
+ p.log.error("No data found to back up. Have you run setup yet?");
226
+ p.outro(pc.dim("Nothing to do."));
227
+ return;
228
+ }
229
+ // Categorize files for display
230
+ const keyShareFiles = [];
231
+ const configFiles = [];
232
+ const otherFiles = [];
233
+ for (const relPath of files.keys()) {
234
+ if (relPath.startsWith("data/") || relPath.startsWith("data\\")) {
235
+ keyShareFiles.push(relPath);
236
+ }
237
+ else if (relPath.endsWith(".toml")) {
238
+ configFiles.push(relPath);
239
+ }
240
+ else {
241
+ otherFiles.push(relPath);
242
+ }
243
+ }
244
+ const summaryLines = [];
245
+ if (keyShareFiles.length > 0) {
246
+ summaryLines.push(` ${pc.bold("Key shares & data")} ${pc.cyan(String(keyShareFiles.length))} files`);
247
+ }
248
+ if (configFiles.length > 0) {
249
+ summaryLines.push(` ${pc.bold("Configuration")} ${pc.cyan(String(configFiles.length))} files`);
250
+ }
251
+ if (otherFiles.length > 0) {
252
+ summaryLines.push(` ${pc.bold("Other")} ${pc.cyan(String(otherFiles.length))} files`);
253
+ }
254
+ p.note(summaryLines.join("\n"), "Backup Contents");
255
+ // Step 3: Ask for destination
256
+ const defaultDest = path.join(os.homedir(), `blockclaw-backup-${dateStamp()}.tar.gz`);
257
+ const destInput = guard(await p.text({
258
+ message: "Backup destination path",
259
+ placeholder: defaultDest,
260
+ defaultValue: defaultDest,
261
+ validate(value) {
262
+ const dir = path.dirname(value);
263
+ if (!fs.existsSync(dir)) {
264
+ return `Directory does not exist: ${dir}`;
265
+ }
266
+ return undefined;
267
+ },
268
+ }));
269
+ let destPath = destInput.trim() || defaultDest;
270
+ if (!destPath.endsWith(".tar.gz") && !destPath.endsWith(".tgz")) {
271
+ destPath += ".tar.gz";
272
+ }
273
+ // Check if file already exists
274
+ if (fs.existsSync(destPath)) {
275
+ const overwrite = guard(await p.confirm({
276
+ message: `File already exists at ${pc.dim(destPath)}. Overwrite?`,
277
+ initialValue: false,
278
+ }));
279
+ if (!overwrite)
280
+ throw new Error("CANCEL");
281
+ }
282
+ // Step 4: Optional encryption
283
+ const shouldEncrypt = guard(await p.confirm({
284
+ message: "Encrypt backup with a password?",
285
+ initialValue: true,
286
+ }));
287
+ let password = null;
288
+ if (shouldEncrypt) {
289
+ const pw1 = guard(await p.password({
290
+ message: "Enter encryption password",
291
+ validate(value) {
292
+ if (value.length < 8)
293
+ return "Password must be at least 8 characters";
294
+ return undefined;
295
+ },
296
+ }));
297
+ const pw2 = guard(await p.password({
298
+ message: "Confirm encryption password",
299
+ }));
300
+ if (pw1 !== pw2) {
301
+ p.cancel("Passwords do not match.");
302
+ process.exit(1);
303
+ }
304
+ password = pw1;
305
+ if (password && !destPath.endsWith(".enc")) {
306
+ destPath += ".enc";
307
+ }
308
+ }
309
+ // Step 5: Create the backup
310
+ const createSpinner = p.spinner();
311
+ createSpinner.start("Creating backup");
312
+ try {
313
+ // Build tar archive
314
+ const tarData = createTar(files);
315
+ // Compress with gzip
316
+ const { gzipSync } = await import("node:zlib");
317
+ let outputData = gzipSync(tarData, { level: 9 });
318
+ // Optionally encrypt
319
+ if (password) {
320
+ createSpinner.message("Encrypting backup");
321
+ outputData = encrypt(outputData, password);
322
+ }
323
+ // Write to disk
324
+ fs.writeFileSync(destPath, outputData, { mode: 0o600 });
325
+ const fileSize = fs.statSync(destPath).size;
326
+ createSpinner.stop(`Backup created: ${pc.bold(formatBytes(fileSize))}`);
327
+ }
328
+ catch (err) {
329
+ createSpinner.stop(pc.red("Failed to create backup"));
330
+ throw err;
331
+ }
332
+ // Step 6: Show results
333
+ p.note([
334
+ ` ${pc.dim("Location")} ${destPath}`,
335
+ ` ${pc.dim("Size")} ${formatBytes(fs.statSync(destPath).size)}`,
336
+ ` ${pc.dim("Files")} ${files.size}`,
337
+ ` ${pc.dim("Encrypted")} ${password ? pc.green("Yes (AES-256-GCM)") : pc.yellow("No")}`,
338
+ ].join("\n"), "Backup Complete");
339
+ // Step 7: Critical warning
340
+ console.log();
341
+ console.log(pc.bgRed(pc.white(pc.bold(" IMPORTANT "))));
342
+ console.log();
343
+ console.log(pc.red(" Store this backup securely. It contains your node's key shares."));
344
+ console.log(pc.red(" Anyone with this backup could participate in signing as your node."));
345
+ console.log();
346
+ if (!password) {
347
+ console.log(pc.yellow(" This backup is NOT encrypted. Consider encrypting it before"));
348
+ console.log(pc.yellow(" storing in cloud storage or any shared location."));
349
+ console.log();
350
+ }
351
+ p.outro(pc.green("Backup complete."));
352
+ }
353
+ // ---------------------------------------------------------------------------
354
+ // Restore command
355
+ // ---------------------------------------------------------------------------
356
+ async function runRestore(filePath) {
357
+ console.log();
358
+ p.intro(pc.bgCyan(pc.black(" blockclaw restore ")));
359
+ // Step 1: Check if agent is running
360
+ const { running } = isAgentRunning();
361
+ if (running) {
362
+ p.log.error("Your node is currently running. Stop it before restoring.\n" +
363
+ ` Run: ${pc.cyan("blockclaw stop")}`);
364
+ p.outro(pc.red("Restore cancelled."));
365
+ process.exit(1);
366
+ }
367
+ // Step 2: Ask for backup file path
368
+ let backupPath;
369
+ if (filePath && fs.existsSync(filePath)) {
370
+ backupPath = path.resolve(filePath);
371
+ p.log.info(`Backup file: ${pc.dim(backupPath)}`);
372
+ }
373
+ else {
374
+ const input = guard(await p.text({
375
+ message: "Path to backup file",
376
+ placeholder: "~/blockclaw-backup-2026-03-08.tar.gz",
377
+ validate(value) {
378
+ const resolved = value.startsWith("~")
379
+ ? path.join(os.homedir(), value.slice(1))
380
+ : path.resolve(value);
381
+ if (!fs.existsSync(resolved)) {
382
+ return `File not found: ${resolved}`;
383
+ }
384
+ return undefined;
385
+ },
386
+ }));
387
+ backupPath = input.startsWith("~")
388
+ ? path.join(os.homedir(), input.slice(1))
389
+ : path.resolve(input);
390
+ }
391
+ // Read the backup file
392
+ const readSpinner = p.spinner();
393
+ readSpinner.start("Reading backup file");
394
+ let rawData = Buffer.from(fs.readFileSync(backupPath));
395
+ const fileSize = rawData.length;
396
+ readSpinner.stop(`Read backup: ${pc.bold(formatBytes(fileSize))}`);
397
+ // Step 3: Check if encrypted and decrypt
398
+ const isEncrypted = rawData.length >= 8 && rawData.subarray(0, 8).toString("utf8") === "S0BACKUP";
399
+ if (isEncrypted) {
400
+ p.log.info("Backup is encrypted.");
401
+ const password = guard(await p.password({
402
+ message: "Enter decryption password",
403
+ }));
404
+ const decryptSpinner = p.spinner();
405
+ decryptSpinner.start("Decrypting backup");
406
+ try {
407
+ rawData = decrypt(rawData, password);
408
+ decryptSpinner.stop("Decrypted successfully");
409
+ }
410
+ catch (err) {
411
+ decryptSpinner.stop(pc.red("Decryption failed"));
412
+ if (err instanceof Error && err.message.includes("Unsupported state")) {
413
+ p.log.error("Wrong password or corrupted backup file.");
414
+ }
415
+ else {
416
+ p.log.error(err instanceof Error ? err.message : String(err));
417
+ }
418
+ p.outro(pc.red("Restore cancelled."));
419
+ process.exit(1);
420
+ }
421
+ }
422
+ // Step 4: Decompress and extract
423
+ const extractSpinner = p.spinner();
424
+ extractSpinner.start("Extracting backup");
425
+ let extractedFiles;
426
+ try {
427
+ const { gunzipSync } = await import("node:zlib");
428
+ const tarData = gunzipSync(rawData);
429
+ extractedFiles = extractTar(tarData);
430
+ extractSpinner.stop(`Found ${pc.bold(String(extractedFiles.size))} files in backup`);
431
+ }
432
+ catch (err) {
433
+ extractSpinner.stop(pc.red("Failed to extract backup"));
434
+ p.log.error("Could not extract the backup file. It may be corrupted or not a valid backup.\n" +
435
+ (err instanceof Error ? ` ${err.message}` : ""));
436
+ p.outro(pc.red("Restore cancelled."));
437
+ process.exit(1);
438
+ }
439
+ if (extractedFiles.size === 0) {
440
+ p.log.error("Backup contains no files.");
441
+ p.outro(pc.red("Restore cancelled."));
442
+ process.exit(1);
443
+ }
444
+ // Step 5: Show what will be restored
445
+ const keyShareFiles = [];
446
+ const configFiles = [];
447
+ const otherFiles = [];
448
+ for (const relPath of extractedFiles.keys()) {
449
+ if (relPath.startsWith("data/") || relPath.startsWith("data\\")) {
450
+ keyShareFiles.push(relPath);
451
+ }
452
+ else if (relPath.endsWith(".toml")) {
453
+ configFiles.push(relPath);
454
+ }
455
+ else {
456
+ otherFiles.push(relPath);
457
+ }
458
+ }
459
+ const summaryLines = [];
460
+ if (keyShareFiles.length > 0) {
461
+ summaryLines.push(` ${pc.bold("Key shares & data")} ${pc.cyan(String(keyShareFiles.length))} files`);
462
+ // Show first few files
463
+ for (const f of keyShareFiles.slice(0, 5)) {
464
+ summaryLines.push(` ${pc.dim(f)}`);
465
+ }
466
+ if (keyShareFiles.length > 5) {
467
+ summaryLines.push(` ${pc.dim(`... and ${keyShareFiles.length - 5} more`)}`);
468
+ }
469
+ }
470
+ if (configFiles.length > 0) {
471
+ summaryLines.push(` ${pc.bold("Configuration")} ${pc.cyan(String(configFiles.length))} files`);
472
+ for (const f of configFiles) {
473
+ summaryLines.push(` ${pc.dim(f)}`);
474
+ }
475
+ }
476
+ if (otherFiles.length > 0) {
477
+ summaryLines.push(` ${pc.bold("Other")} ${pc.cyan(String(otherFiles.length))} files`);
478
+ for (const f of otherFiles) {
479
+ summaryLines.push(` ${pc.dim(f)}`);
480
+ }
481
+ }
482
+ summaryLines.push("");
483
+ summaryLines.push(` ${pc.dim("Restore to:")} ${SEQUENCE0_DIR}`);
484
+ p.note(summaryLines.join("\n"), "Files to Restore");
485
+ // Check if existing data will be overwritten
486
+ let hasExisting = false;
487
+ for (const relPath of extractedFiles.keys()) {
488
+ const dest = path.join(SEQUENCE0_DIR, relPath);
489
+ if (fs.existsSync(dest)) {
490
+ hasExisting = true;
491
+ break;
492
+ }
493
+ }
494
+ if (hasExisting) {
495
+ console.log();
496
+ console.log(pc.bgYellow(pc.black(pc.bold(" WARNING "))));
497
+ console.log();
498
+ console.log(pc.yellow(" Existing files will be overwritten. This cannot be undone."));
499
+ console.log();
500
+ }
501
+ // Step 6: Confirm
502
+ const confirm = guard(await p.confirm({
503
+ message: hasExisting
504
+ ? "Overwrite existing data and restore from backup?"
505
+ : "Restore these files?",
506
+ initialValue: false,
507
+ }));
508
+ if (!confirm)
509
+ throw new Error("CANCEL");
510
+ // Step 7: Restore files
511
+ const restoreSpinner = p.spinner();
512
+ restoreSpinner.start("Restoring files");
513
+ let restoredCount = 0;
514
+ try {
515
+ for (const [relPath, { content, mode }] of extractedFiles) {
516
+ const dest = path.join(SEQUENCE0_DIR, relPath);
517
+ const destDir = path.dirname(dest);
518
+ ensureDir(destDir);
519
+ fs.writeFileSync(dest, content, { mode: mode || 0o600 });
520
+ restoredCount++;
521
+ }
522
+ restoreSpinner.stop(`Restored ${pc.bold(String(restoredCount))} files`);
523
+ }
524
+ catch (err) {
525
+ restoreSpinner.stop(pc.red(`Failed after restoring ${restoredCount} files`));
526
+ throw err;
527
+ }
528
+ // Step 8: Success + suggest doctor
529
+ p.note([
530
+ ` ${pc.dim("Files restored")} ${restoredCount}`,
531
+ ` ${pc.dim("Location")} ${SEQUENCE0_DIR}`,
532
+ "",
533
+ ` Run ${pc.cyan("blockclaw doctor")} to verify your configuration.`,
534
+ ` Then ${pc.cyan("blockclaw start")} to start your node.`,
535
+ ].join("\n"), "Restore Complete");
536
+ p.outro(pc.green("Restore complete."));
537
+ }
538
+ // ---------------------------------------------------------------------------
539
+ // Registration
540
+ // ---------------------------------------------------------------------------
541
+ export function register(program) {
542
+ program
543
+ .command("backup")
544
+ .description("Back up key shares and configuration")
545
+ .action(async () => {
546
+ try {
547
+ await runBackup();
548
+ }
549
+ catch (err) {
550
+ if (err instanceof Error && err.message === "CANCEL") {
551
+ p.cancel("Backup cancelled.");
552
+ process.exit(0);
553
+ }
554
+ p.cancel(err instanceof Error ? err.message : String(err));
555
+ process.exit(1);
556
+ }
557
+ });
558
+ program
559
+ .command("restore")
560
+ .description("Restore key shares and configuration from a backup")
561
+ .argument("[file]", "Path to backup file")
562
+ .action(async (file) => {
563
+ try {
564
+ await runRestore(file);
565
+ }
566
+ catch (err) {
567
+ if (err instanceof Error && err.message === "CANCEL") {
568
+ p.cancel("Restore cancelled.");
569
+ process.exit(0);
570
+ }
571
+ p.cancel(err instanceof Error ? err.message : String(err));
572
+ process.exit(1);
573
+ }
574
+ });
575
+ }
576
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../../src/interface/commands/backup.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=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/interface/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsG/C"}