@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.
- package/README.md +97 -0
- package/dist/agent/binary.d.ts +15 -0
- package/dist/agent/binary.d.ts.map +1 -0
- package/dist/agent/binary.js +172 -0
- package/dist/agent/binary.js.map +1 -0
- package/dist/agent/chains.d.ts +26 -0
- package/dist/agent/chains.d.ts.map +1 -0
- package/dist/agent/chains.js +123 -0
- package/dist/agent/chains.js.map +1 -0
- package/dist/agent/client.d.ts +484 -0
- package/dist/agent/client.d.ts.map +1 -0
- package/dist/agent/client.js +448 -0
- package/dist/agent/client.js.map +1 -0
- package/dist/agent/config.d.ts +75 -0
- package/dist/agent/config.d.ts.map +1 -0
- package/dist/agent/config.js +133 -0
- package/dist/agent/config.js.map +1 -0
- package/dist/agent/process.d.ts +36 -0
- package/dist/agent/process.d.ts.map +1 -0
- package/dist/agent/process.js +208 -0
- package/dist/agent/process.js.map +1 -0
- package/dist/agent/wallet.d.ts +43 -0
- package/dist/agent/wallet.d.ts.map +1 -0
- package/dist/agent/wallet.js +146 -0
- package/dist/agent/wallet.js.map +1 -0
- package/dist/ai/brain.d.ts +21 -0
- package/dist/ai/brain.d.ts.map +1 -0
- package/dist/ai/brain.js +117 -0
- package/dist/ai/brain.js.map +1 -0
- package/dist/ai/prompts.d.ts +15 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +67 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/rules.d.ts +19 -0
- package/dist/ai/rules.d.ts.map +1 -0
- package/dist/ai/rules.js +143 -0
- package/dist/ai/rules.js.map +1 -0
- package/dist/core/detector.d.ts +16 -0
- package/dist/core/detector.d.ts.map +1 -0
- package/dist/core/detector.js +90 -0
- package/dist/core/detector.js.map +1 -0
- package/dist/core/healer.d.ts +62 -0
- package/dist/core/healer.d.ts.map +1 -0
- package/dist/core/healer.js +355 -0
- package/dist/core/healer.js.map +1 -0
- package/dist/core/heartbeat.d.ts +67 -0
- package/dist/core/heartbeat.d.ts.map +1 -0
- package/dist/core/heartbeat.js +426 -0
- package/dist/core/heartbeat.js.map +1 -0
- package/dist/core/memory.d.ts +57 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +149 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/updater.d.ts +16 -0
- package/dist/core/updater.d.ts.map +1 -0
- package/dist/core/updater.js +107 -0
- package/dist/core/updater.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/dist/interface/commands/ask.d.ts +3 -0
- package/dist/interface/commands/ask.d.ts.map +1 -0
- package/dist/interface/commands/ask.js +39 -0
- package/dist/interface/commands/ask.js.map +1 -0
- package/dist/interface/commands/backup.d.ts +3 -0
- package/dist/interface/commands/backup.d.ts.map +1 -0
- package/dist/interface/commands/backup.js +576 -0
- package/dist/interface/commands/backup.js.map +1 -0
- package/dist/interface/commands/config.d.ts +3 -0
- package/dist/interface/commands/config.d.ts.map +1 -0
- package/dist/interface/commands/config.js +107 -0
- package/dist/interface/commands/config.js.map +1 -0
- package/dist/interface/commands/daemon.d.ts +3 -0
- package/dist/interface/commands/daemon.d.ts.map +1 -0
- package/dist/interface/commands/daemon.js +162 -0
- package/dist/interface/commands/daemon.js.map +1 -0
- package/dist/interface/commands/doctor.d.ts +3 -0
- package/dist/interface/commands/doctor.d.ts.map +1 -0
- package/dist/interface/commands/doctor.js +143 -0
- package/dist/interface/commands/doctor.js.map +1 -0
- package/dist/interface/commands/earnings.d.ts +3 -0
- package/dist/interface/commands/earnings.d.ts.map +1 -0
- package/dist/interface/commands/earnings.js +165 -0
- package/dist/interface/commands/earnings.js.map +1 -0
- package/dist/interface/commands/health.d.ts +3 -0
- package/dist/interface/commands/health.d.ts.map +1 -0
- package/dist/interface/commands/health.js +48 -0
- package/dist/interface/commands/health.js.map +1 -0
- package/dist/interface/commands/history.d.ts +3 -0
- package/dist/interface/commands/history.d.ts.map +1 -0
- package/dist/interface/commands/history.js +113 -0
- package/dist/interface/commands/history.js.map +1 -0
- package/dist/interface/commands/info.d.ts +3 -0
- package/dist/interface/commands/info.d.ts.map +1 -0
- package/dist/interface/commands/info.js +82 -0
- package/dist/interface/commands/info.js.map +1 -0
- package/dist/interface/commands/logs.d.ts +3 -0
- package/dist/interface/commands/logs.d.ts.map +1 -0
- package/dist/interface/commands/logs.js +98 -0
- package/dist/interface/commands/logs.js.map +1 -0
- package/dist/interface/commands/menu.d.ts +4 -0
- package/dist/interface/commands/menu.d.ts.map +1 -0
- package/dist/interface/commands/menu.js +156 -0
- package/dist/interface/commands/menu.js.map +1 -0
- package/dist/interface/commands/receive.d.ts +3 -0
- package/dist/interface/commands/receive.d.ts.map +1 -0
- package/dist/interface/commands/receive.js +81 -0
- package/dist/interface/commands/receive.js.map +1 -0
- package/dist/interface/commands/register.d.ts +3 -0
- package/dist/interface/commands/register.d.ts.map +1 -0
- package/dist/interface/commands/register.js +231 -0
- package/dist/interface/commands/register.js.map +1 -0
- package/dist/interface/commands/restart.d.ts +3 -0
- package/dist/interface/commands/restart.d.ts.map +1 -0
- package/dist/interface/commands/restart.js +154 -0
- package/dist/interface/commands/restart.js.map +1 -0
- package/dist/interface/commands/send.d.ts +3 -0
- package/dist/interface/commands/send.d.ts.map +1 -0
- package/dist/interface/commands/send.js +108 -0
- package/dist/interface/commands/send.js.map +1 -0
- package/dist/interface/commands/service.d.ts +3 -0
- package/dist/interface/commands/service.d.ts.map +1 -0
- package/dist/interface/commands/service.js +474 -0
- package/dist/interface/commands/service.js.map +1 -0
- package/dist/interface/commands/setup.d.ts +5 -0
- package/dist/interface/commands/setup.d.ts.map +1 -0
- package/dist/interface/commands/setup.js +410 -0
- package/dist/interface/commands/setup.js.map +1 -0
- package/dist/interface/commands/start.d.ts +3 -0
- package/dist/interface/commands/start.d.ts.map +1 -0
- package/dist/interface/commands/start.js +171 -0
- package/dist/interface/commands/start.js.map +1 -0
- package/dist/interface/commands/status.d.ts +3 -0
- package/dist/interface/commands/status.d.ts.map +1 -0
- package/dist/interface/commands/status.js +77 -0
- package/dist/interface/commands/status.js.map +1 -0
- package/dist/interface/commands/stop.d.ts +3 -0
- package/dist/interface/commands/stop.d.ts.map +1 -0
- package/dist/interface/commands/stop.js +62 -0
- package/dist/interface/commands/stop.js.map +1 -0
- package/dist/interface/commands/update.d.ts +3 -0
- package/dist/interface/commands/update.d.ts.map +1 -0
- package/dist/interface/commands/update.js +53 -0
- package/dist/interface/commands/update.js.map +1 -0
- package/dist/interface/commands/wallet.d.ts +3 -0
- package/dist/interface/commands/wallet.d.ts.map +1 -0
- package/dist/interface/commands/wallet.js +446 -0
- package/dist/interface/commands/wallet.js.map +1 -0
- package/dist/interface/commands/webhook.d.ts +3 -0
- package/dist/interface/commands/webhook.d.ts.map +1 -0
- package/dist/interface/commands/webhook.js +99 -0
- package/dist/interface/commands/webhook.js.map +1 -0
- package/dist/interface/commands/withdraw.d.ts +3 -0
- package/dist/interface/commands/withdraw.d.ts.map +1 -0
- package/dist/interface/commands/withdraw.js +261 -0
- package/dist/interface/commands/withdraw.js.map +1 -0
- package/dist/interface/interactive.d.ts +43 -0
- package/dist/interface/interactive.d.ts.map +1 -0
- package/dist/interface/interactive.js +276 -0
- package/dist/interface/interactive.js.map +1 -0
- package/dist/interface/logo.d.ts +2 -0
- package/dist/interface/logo.d.ts.map +1 -0
- package/dist/interface/logo.js +21 -0
- package/dist/interface/logo.js.map +1 -0
- package/dist/interface/webhooks.d.ts +19 -0
- package/dist/interface/webhooks.d.ts.map +1 -0
- package/dist/interface/webhooks.js +172 -0
- package/dist/interface/webhooks.js.map +1 -0
- package/dist/utils/format.d.ts +19 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +107 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +35 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +45 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/platform.d.ts +26 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +72 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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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"}
|