@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,107 @@
1
+ import pc from "picocolors";
2
+ import fs from "node:fs";
3
+ import { readBlockclawConfig, readAgentConfig, setConfigValue, initConfig, } from "../../agent/config.js";
4
+ import { BLOCKCLAW_CONFIG, AGENT_CONFIG } from "../../utils/paths.js";
5
+ import { logger } from "../../utils/logger.js";
6
+ export function register(program) {
7
+ const config = program
8
+ .command("config")
9
+ .description("Configuration management");
10
+ config
11
+ .command("show")
12
+ .description("Show current configuration")
13
+ .option("--agent", "Show agent config instead of BlockClaw config")
14
+ .action((opts) => {
15
+ try {
16
+ if (opts.agent) {
17
+ const agentCfg = readAgentConfig();
18
+ if (!agentCfg) {
19
+ logger.info(`No agent config found at ${AGENT_CONFIG}`);
20
+ return;
21
+ }
22
+ logger.header("Agent Configuration");
23
+ logger.kv("File", AGENT_CONFIG);
24
+ logger.separator();
25
+ for (const [key, value] of Object.entries(agentCfg)) {
26
+ if (value !== undefined && value !== null) {
27
+ logger.kv(key, String(value));
28
+ }
29
+ }
30
+ }
31
+ else {
32
+ const bcCfg = readBlockclawConfig();
33
+ logger.header("BlockClaw Configuration");
34
+ logger.kv("File", BLOCKCLAW_CONFIG);
35
+ logger.separator();
36
+ if (Object.keys(bcCfg).length === 0) {
37
+ logger.info("No config found. Run 'blockclaw config init' to create one.");
38
+ return;
39
+ }
40
+ for (const [key, value] of Object.entries(bcCfg)) {
41
+ if (value !== undefined && value !== null) {
42
+ const display = key.includes("key") || key.includes("secret")
43
+ ? pc.dim("***hidden***")
44
+ : String(value);
45
+ logger.kv(key, display);
46
+ }
47
+ }
48
+ }
49
+ logger.blank();
50
+ }
51
+ catch (err) {
52
+ logger.error(`Failed to read config: ${err.message}`);
53
+ process.exit(1);
54
+ }
55
+ });
56
+ config
57
+ .command("set")
58
+ .description("Set a configuration value")
59
+ .argument("<key>", "Config key")
60
+ .argument("<value>", "Config value")
61
+ .action((key, value) => {
62
+ try {
63
+ setConfigValue(key, value);
64
+ }
65
+ catch (err) {
66
+ logger.error(`Failed to set config: ${err.message}`);
67
+ process.exit(1);
68
+ }
69
+ });
70
+ config
71
+ .command("init")
72
+ .description("Initialize default configuration")
73
+ .option("--network <network>", "Network (mainnet or testnet)", "mainnet")
74
+ .option("--force", "Overwrite existing config")
75
+ .action((opts) => {
76
+ try {
77
+ if (fs.existsSync(BLOCKCLAW_CONFIG) && !opts.force) {
78
+ logger.warn(`Config already exists at ${BLOCKCLAW_CONFIG}`);
79
+ logger.info("Use --force to overwrite");
80
+ return;
81
+ }
82
+ initConfig(opts.network);
83
+ }
84
+ catch (err) {
85
+ logger.error(`Failed to init config: ${err.message}`);
86
+ process.exit(1);
87
+ }
88
+ });
89
+ config
90
+ .command("reset")
91
+ .description("Reset configuration to defaults")
92
+ .action(() => {
93
+ try {
94
+ initConfig();
95
+ logger.success("Config reset to defaults");
96
+ }
97
+ catch (err) {
98
+ logger.error(`Failed to reset config: ${err.message}`);
99
+ process.exit(1);
100
+ }
101
+ });
102
+ // Default action
103
+ config.action(() => {
104
+ config.commands.find((c) => c.name() === "show")?.parse([], { from: "user" });
105
+ });
106
+ }
107
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/interface/commands/config.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=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/interface/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuJ/C"}
@@ -0,0 +1,162 @@
1
+ import fs from "node:fs";
2
+ import { AgentClient } from "../../agent/client.js";
3
+ import { resolveBinary, downloadBinary } from "../../agent/binary.js";
4
+ import { spawnAgent } from "../../agent/process.js";
5
+ import { readBlockclawConfig, mergeConfigs } from "../../agent/config.js";
6
+ import { Heartbeat } from "../../core/heartbeat.js";
7
+ import { SelfHealer } from "../../core/healer.js";
8
+ import { Memory } from "../../core/memory.js";
9
+ import { DAEMON_PID_FILE, ensureBlockclawDir } from "../../utils/paths.js";
10
+ import { logger } from "../../utils/logger.js";
11
+ export function register(program) {
12
+ const daemon = program
13
+ .command("daemon")
14
+ .description("Background monitor management");
15
+ daemon
16
+ .command("start")
17
+ .description("Start BlockClaw as a background monitor")
18
+ .option("--network <network>", "Network (mainnet or testnet)")
19
+ .action(async (opts) => {
20
+ try {
21
+ const config = readBlockclawConfig();
22
+ const merged = mergeConfigs();
23
+ const network = opts.network ?? merged.network;
24
+ const apiPort = merged.apiPort;
25
+ const client = new AgentClient(`http://localhost:${apiPort}`);
26
+ // Check if agent is already running
27
+ const healthy = await client.isHealthy();
28
+ if (!healthy) {
29
+ // Start the agent first
30
+ logger.info("Node not running, starting...");
31
+ let binPath;
32
+ try {
33
+ binPath = await resolveBinary();
34
+ }
35
+ catch {
36
+ logger.info("Node software not found, downloading...");
37
+ binPath = await downloadBinary();
38
+ }
39
+ spawnAgent({
40
+ binPath,
41
+ network,
42
+ port: merged.port,
43
+ apiPort,
44
+ dataDir: merged.dataDir,
45
+ rpcUrl: merged.rpcUrl,
46
+ registry: merged.registry,
47
+ daemon: true,
48
+ bootstrap: merged.bootstrap,
49
+ logLevel: merged.logLevel,
50
+ });
51
+ // Wait for healthy
52
+ let attempts = 0;
53
+ while (attempts < 60) {
54
+ if (await client.isHealthy())
55
+ break;
56
+ await new Promise((r) => setTimeout(r, 1000));
57
+ attempts++;
58
+ }
59
+ if (attempts >= 60) {
60
+ logger.error("Node failed to start within 60 seconds");
61
+ process.exit(1);
62
+ }
63
+ logger.success("Node started");
64
+ }
65
+ // Start heartbeat monitoring
66
+ const memory = new Memory();
67
+ const healer = new SelfHealer(client, memory, {
68
+ maxRestarts: config.max_restarts ?? 5,
69
+ windowMs: (config.restart_window ?? 300) * 1000,
70
+ });
71
+ const heartbeat = new Heartbeat(client, {
72
+ intervalMs: (config.heartbeat_interval ?? 30) * 1000,
73
+ onEvent: (event) => {
74
+ if (event.type === "agent_down" || event.type === "health_critical") {
75
+ logger.warn(`[daemon] ${event.message}`);
76
+ }
77
+ },
78
+ });
79
+ heartbeat.healer = healer;
80
+ heartbeat.start();
81
+ memory.recordStartup();
82
+ // Write daemon PID
83
+ ensureBlockclawDir();
84
+ fs.writeFileSync(DAEMON_PID_FILE, String(process.pid), "utf8");
85
+ logger.success("BlockClaw background monitor started");
86
+ logger.kv("Heartbeat", `every ${config.heartbeat_interval ?? 30}s`);
87
+ logger.kv("Auto-heal", config.auto_heal ? "enabled" : "disabled");
88
+ logger.blank();
89
+ // Keep process alive
90
+ process.on("SIGTERM", () => {
91
+ heartbeat.stop();
92
+ try {
93
+ fs.unlinkSync(DAEMON_PID_FILE);
94
+ }
95
+ catch { }
96
+ process.exit(0);
97
+ });
98
+ process.on("SIGINT", () => {
99
+ heartbeat.stop();
100
+ try {
101
+ fs.unlinkSync(DAEMON_PID_FILE);
102
+ }
103
+ catch { }
104
+ process.exit(0);
105
+ });
106
+ // Prevent exit
107
+ setInterval(() => { }, 60000);
108
+ }
109
+ catch (err) {
110
+ logger.error(`Background monitor start failed: ${err.message}`);
111
+ process.exit(1);
112
+ }
113
+ });
114
+ daemon
115
+ .command("stop")
116
+ .description("Stop the BlockClaw background monitor")
117
+ .action(() => {
118
+ try {
119
+ if (!fs.existsSync(DAEMON_PID_FILE)) {
120
+ logger.info("No background monitor is running");
121
+ return;
122
+ }
123
+ const pid = parseInt(fs.readFileSync(DAEMON_PID_FILE, "utf8").trim(), 10);
124
+ try {
125
+ process.kill(pid, "SIGTERM");
126
+ logger.success("Background monitor stopped");
127
+ }
128
+ catch {
129
+ logger.warn("Background monitor was not running (leftover process file, cleaned up)");
130
+ }
131
+ try {
132
+ fs.unlinkSync(DAEMON_PID_FILE);
133
+ }
134
+ catch { }
135
+ }
136
+ catch (err) {
137
+ logger.error(`Failed to stop background monitor: ${err.message}`);
138
+ }
139
+ });
140
+ daemon
141
+ .command("status")
142
+ .description("Check background monitor status")
143
+ .action(() => {
144
+ if (!fs.existsSync(DAEMON_PID_FILE)) {
145
+ logger.info("Background monitor is not running");
146
+ return;
147
+ }
148
+ const pid = parseInt(fs.readFileSync(DAEMON_PID_FILE, "utf8").trim(), 10);
149
+ try {
150
+ process.kill(pid, 0);
151
+ logger.success("Background monitor is running");
152
+ }
153
+ catch {
154
+ logger.warn("Background monitor was not running (leftover process file, cleaned up)");
155
+ try {
156
+ fs.unlinkSync(DAEMON_PID_FILE);
157
+ }
158
+ catch { }
159
+ }
160
+ });
161
+ }
162
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/interface/commands/daemon.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=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/interface/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqI/C"}
@@ -0,0 +1,143 @@
1
+ import pc from "picocolors";
2
+ import { AgentClient } from "../../agent/client.js";
3
+ import { resolveBinary, getBinaryVersion } from "../../agent/binary.js";
4
+ import { isAgentRunning } from "../../agent/process.js";
5
+ import { readBlockclawConfig, readAgentConfig } from "../../agent/config.js";
6
+ import { detectSystem, checkPorts } from "../../core/detector.js";
7
+ import { SEQUENCE0_DIR, AGENT_CONFIG, BLOCKCLAW_CONFIG } from "../../utils/paths.js";
8
+ import { logger } from "../../utils/logger.js";
9
+ import fs from "node:fs";
10
+ export function register(program) {
11
+ program
12
+ .command("doctor")
13
+ .description("Run a full diagnostic check")
14
+ .action(async () => {
15
+ logger.header("Diagnostic Check");
16
+ const allChecks = [];
17
+ // 1. System requirements
18
+ console.log(` ${pc.bold("System Requirements")}`);
19
+ const system = await detectSystem();
20
+ for (const check of system.checks) {
21
+ printCheck(check);
22
+ allChecks.push(check);
23
+ }
24
+ console.log();
25
+ // 2. Binary
26
+ console.log(` ${pc.bold("Node Software")}`);
27
+ try {
28
+ const binPath = await resolveBinary();
29
+ const version = await getBinaryVersion(binPath);
30
+ const check = {
31
+ name: "Node Software",
32
+ status: "pass",
33
+ message: `Found at ${binPath} (v${version ?? "unknown"})`,
34
+ };
35
+ printCheck(check);
36
+ allChecks.push(check);
37
+ }
38
+ catch {
39
+ const check = {
40
+ name: "Node Software",
41
+ status: "fail",
42
+ message: "Not found. Install: npm i -g @sequence0/blockclaw",
43
+ };
44
+ printCheck(check);
45
+ allChecks.push(check);
46
+ }
47
+ console.log();
48
+ // 3. Configuration
49
+ console.log(` ${pc.bold("Configuration")}`);
50
+ const agentCfgExists = fs.existsSync(AGENT_CONFIG);
51
+ const bcCfgExists = fs.existsSync(BLOCKCLAW_CONFIG);
52
+ allChecks.push({
53
+ name: "Agent Config",
54
+ status: agentCfgExists ? "pass" : "warn",
55
+ message: agentCfgExists ? AGENT_CONFIG : "Not found (will use defaults)",
56
+ });
57
+ printCheck(allChecks[allChecks.length - 1]);
58
+ allChecks.push({
59
+ name: "BlockClaw Config",
60
+ status: bcCfgExists ? "pass" : "warn",
61
+ message: bcCfgExists ? BLOCKCLAW_CONFIG : "Not found. Run: blockclaw config init",
62
+ });
63
+ printCheck(allChecks[allChecks.length - 1]);
64
+ allChecks.push({
65
+ name: "Data Directory",
66
+ status: fs.existsSync(SEQUENCE0_DIR) ? "pass" : "warn",
67
+ message: fs.existsSync(SEQUENCE0_DIR) ? SEQUENCE0_DIR : "Will be created on first run",
68
+ });
69
+ printCheck(allChecks[allChecks.length - 1]);
70
+ console.log();
71
+ // 4. Ports
72
+ console.log(` ${pc.bold("Network Ports")}`);
73
+ const config = readBlockclawConfig();
74
+ const agentConfig = readAgentConfig();
75
+ const p2pPort = agentConfig?.port ?? 9000;
76
+ const apiPort = config.api_port ?? agentConfig?.api_port ?? 8080;
77
+ const portChecks = await checkPorts(p2pPort, apiPort);
78
+ for (const check of portChecks) {
79
+ printCheck(check);
80
+ allChecks.push(check);
81
+ }
82
+ console.log();
83
+ // 5. Agent connectivity
84
+ console.log(` ${pc.bold("Node Status")}`);
85
+ const { running, pid } = isAgentRunning();
86
+ allChecks.push({
87
+ name: "Process",
88
+ status: running ? "pass" : "warn",
89
+ message: running ? "Running" : "Not running",
90
+ });
91
+ printCheck(allChecks[allChecks.length - 1]);
92
+ if (running) {
93
+ const client = new AgentClient(`http://localhost:${apiPort}`);
94
+ try {
95
+ const health = await client.health();
96
+ allChecks.push({
97
+ name: "API Health",
98
+ status: "pass",
99
+ message: "Healthy",
100
+ });
101
+ printCheck(allChecks[allChecks.length - 1]);
102
+ const status = await client.status();
103
+ const peers = status.connected_peers ?? 0;
104
+ allChecks.push({
105
+ name: "Peers",
106
+ status: Number(peers) > 0 ? "pass" : "warn",
107
+ message: `${peers} connected`,
108
+ });
109
+ printCheck(allChecks[allChecks.length - 1]);
110
+ }
111
+ catch {
112
+ allChecks.push({
113
+ name: "API Health",
114
+ status: "fail",
115
+ message: `Cannot connect to your node at localhost:${apiPort}`,
116
+ });
117
+ printCheck(allChecks[allChecks.length - 1]);
118
+ }
119
+ }
120
+ // Summary
121
+ console.log();
122
+ const fails = allChecks.filter((c) => c.status === "fail").length;
123
+ const warns = allChecks.filter((c) => c.status === "warn").length;
124
+ const passes = allChecks.filter((c) => c.status === "pass").length;
125
+ if (fails === 0) {
126
+ logger.success(`All checks passed (${passes} pass, ${warns} warning${warns !== 1 ? "s" : ""})`);
127
+ }
128
+ else {
129
+ logger.error(`${fails} check${fails !== 1 ? "s" : ""} failed, ${warns} warning${warns !== 1 ? "s" : ""}, ${passes} passed`);
130
+ }
131
+ logger.blank();
132
+ });
133
+ }
134
+ function printCheck(check) {
135
+ const icon = check.status === "pass" ? pc.green("✓") :
136
+ check.status === "warn" ? pc.yellow("!") :
137
+ pc.red("✗");
138
+ const name = check.status === "fail" ? pc.red(check.name) :
139
+ check.status === "warn" ? pc.yellow(check.name) :
140
+ check.name;
141
+ console.log(` ${icon} ${name.padEnd(20)} ${pc.dim(check.message)}`);
142
+ }
143
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/interface/commands/doctor.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=earnings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"earnings.d.ts","sourceRoot":"","sources":["../../../src/interface/commands/earnings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAa/C"}
@@ -0,0 +1,165 @@
1
+ import pc from "picocolors";
2
+ import * as p from "@clack/prompts";
3
+ import { AgentClient } from "../../agent/client.js";
4
+ import { isAgentRunning } from "../../agent/process.js";
5
+ import { readBlockclawConfig, readAgentConfig } from "../../agent/config.js";
6
+ import { logger } from "../../utils/logger.js";
7
+ import { formatDuration, truncate } from "../../utils/format.js";
8
+ // FeeCollector contract addresses per network
9
+ const FEE_COLLECTOR = {
10
+ mainnet: {
11
+ address: "0xccd70007534c33b0ab3997d81207fea5e59ca54a",
12
+ chainId: 800801,
13
+ rpcUrl: "https://rpc.sequence0.network",
14
+ },
15
+ testnet: {
16
+ address: "0xc017d0a5da9369003095325229de1e70f0e33a1c",
17
+ chainId: 800800,
18
+ rpcUrl: "https://testnet-rpc.sequence0.network",
19
+ },
20
+ };
21
+ export function register(program) {
22
+ program
23
+ .command("earnings")
24
+ .description("View node runner earnings and signing statistics")
25
+ .option("--period <days>", "Reporting period in days", "30")
26
+ .action(async (opts) => {
27
+ try {
28
+ await runEarnings(opts);
29
+ }
30
+ catch (err) {
31
+ logger.error(`Failed to fetch earnings: ${err.message}`);
32
+ process.exit(1);
33
+ }
34
+ });
35
+ }
36
+ async function runEarnings(opts) {
37
+ const config = readBlockclawConfig();
38
+ const agentConfig = readAgentConfig();
39
+ const apiPort = config.api_port ?? agentConfig?.api_port ?? 8080;
40
+ // Check agent
41
+ const proc = isAgentRunning();
42
+ if (!proc.running) {
43
+ logger.error("Node is not running. Start it first with: blockclaw start");
44
+ process.exit(1);
45
+ }
46
+ const client = new AgentClient(`http://localhost:${apiPort}`);
47
+ const healthy = await client.isHealthy();
48
+ if (!healthy) {
49
+ logger.error("Node is running but not responding.");
50
+ process.exit(1);
51
+ }
52
+ p.intro(pc.bgCyan(pc.black(" blockclaw earnings ")));
53
+ const period = parseInt(opts.period ?? "30", 10) || 30;
54
+ const network = config.network ?? agentConfig?.network ?? "testnet";
55
+ const feeInfo = FEE_COLLECTOR[network] ?? FEE_COLLECTOR.testnet;
56
+ const spin = p.spinner();
57
+ spin.start("Fetching your statistics");
58
+ // Get agent stats
59
+ const [health, status] = await Promise.all([
60
+ client.health(),
61
+ client.status(),
62
+ ]);
63
+ // Try to get earnings from agent endpoint
64
+ let earningsData = null;
65
+ try {
66
+ earningsData = await client.earnings(period);
67
+ }
68
+ catch {
69
+ // Agent may not have /earnings endpoint yet — fall back to basic stats
70
+ }
71
+ // Try to query on-chain earnings from FeeCollector
72
+ let onChainBalance = null;
73
+ try {
74
+ onChainBalance = await queryAgentEarnings(feeInfo.rpcUrl, feeInfo.address, health.peer_id);
75
+ }
76
+ catch {
77
+ // RPC query failed — continue without
78
+ }
79
+ spin.stop("Statistics loaded");
80
+ // Display
81
+ const uptimeHours = health.uptime_seconds / 3600;
82
+ const uptimePercent = earningsData?.uptime_percent
83
+ ?? Math.min(100, (uptimeHours / (period * 24)) * 100);
84
+ const lines = [];
85
+ lines.push(` ${pc.dim("Node ID")} ${truncate(health.peer_id, 20)}`);
86
+ lines.push(` ${pc.dim("Network")} ${pc.cyan(network)}`);
87
+ lines.push(` ${pc.dim("Uptime")} ${formatDuration(health.uptime_seconds)}`);
88
+ lines.push(` ${pc.dim("Uptime %")} ${uptimePercent.toFixed(1)}%`);
89
+ lines.push("");
90
+ lines.push(` ${pc.dim("Connected Peers")} ${health.connected_peers}`);
91
+ lines.push(` ${pc.dim("Active Wallets")} ${status.wallets.length}`);
92
+ lines.push(` ${pc.dim("Active Wallet Setups")} ${status.active_dkg_sessions}`);
93
+ lines.push(` ${pc.dim("Active Transactions")} ${status.active_signing_sessions}`);
94
+ if (earningsData) {
95
+ lines.push("");
96
+ lines.push(` ${pc.dim("Total Signing Sessions")} ${earningsData.total_signing_sessions.toLocaleString()}`);
97
+ lines.push(` ${pc.dim("Total DKG Sessions")} ${earningsData.total_dkg_sessions.toLocaleString()}`);
98
+ if (earningsData.earnings.length > 0) {
99
+ lines.push("");
100
+ lines.push(` ${pc.bold("Revenue")} ${pc.dim(`(${period}d)`)}`);
101
+ for (const e of earningsData.earnings) {
102
+ const usd = e.usd_value ? pc.dim(` (~$${e.usd_value.toLocaleString()})`) : "";
103
+ lines.push(` ${e.symbol.padEnd(6)} ${pc.green(e.amount)}${usd}`);
104
+ }
105
+ }
106
+ }
107
+ if (onChainBalance && onChainBalance !== "0") {
108
+ lines.push("");
109
+ lines.push(` ${pc.bold("Pending Earnings")}`);
110
+ lines.push(` ETH ${pc.green(formatWei(onChainBalance))}`);
111
+ }
112
+ p.note(lines.join("\n"), `Earnings Summary (${period}d)`);
113
+ // Fee structure info
114
+ p.log.info(pc.dim("Fee split: 80% agents, 10% treasury, 10% reserve"));
115
+ if (health.version) {
116
+ p.log.info(`${pc.dim("Node Version:")} ${health.version}`);
117
+ }
118
+ p.outro(pc.dim("Earnings update every signing session."));
119
+ }
120
+ // ---------------------------------------------------------------------------
121
+ // On-chain query helpers
122
+ // ---------------------------------------------------------------------------
123
+ /** Query agent's accumulated earnings from FeeCollector contract */
124
+ async function queryAgentEarnings(rpcUrl, feeCollectorAddress, peerId) {
125
+ // Call pendingWithdrawal(bytes32 agentId) on FeeCollector
126
+ const selector = "0x2c46d8e8"; // keccak256("pendingWithdrawal(bytes32)")[:4]
127
+ const peerIdHex = Buffer.from(peerId).toString("hex").padEnd(64, "0");
128
+ const callData = selector + peerIdHex;
129
+ const controller = new AbortController();
130
+ const timer = setTimeout(() => controller.abort(), 10_000);
131
+ try {
132
+ const res = await fetch(rpcUrl, {
133
+ method: "POST",
134
+ headers: { "Content-Type": "application/json" },
135
+ body: JSON.stringify({
136
+ jsonrpc: "2.0",
137
+ method: "eth_call",
138
+ params: [{ to: feeCollectorAddress, data: callData }, "latest"],
139
+ id: 1,
140
+ }),
141
+ signal: controller.signal,
142
+ });
143
+ const json = await res.json();
144
+ if (json.error)
145
+ throw new Error(json.error.message);
146
+ if (!json.result || json.result === "0x")
147
+ return "0";
148
+ // Result is uint256 in hex
149
+ return BigInt(json.result).toString();
150
+ }
151
+ finally {
152
+ clearTimeout(timer);
153
+ }
154
+ }
155
+ /** Format wei to ETH with 6 decimal places */
156
+ function formatWei(wei) {
157
+ const value = BigInt(wei);
158
+ const eth = Number(value) / 1e18;
159
+ if (eth === 0)
160
+ return "0 ETH";
161
+ if (eth < 0.000001)
162
+ return `${eth.toExponential(2)} ETH`;
163
+ return `${eth.toFixed(6)} ETH`;
164
+ }
165
+ //# sourceMappingURL=earnings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"earnings.js","sourceRoot":"","sources":["../../../src/interface/commands/earnings.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=health.d.ts.map