@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,117 @@
1
+ import { isAgentRunning } from "../agent/process.js";
2
+ import { RuleEngine } from "./rules.js";
3
+ import { SYSTEM_PROMPT, buildContext } from "./prompts.js";
4
+ import { getSystemInfo } from "../utils/platform.js";
5
+ import { readBlockclawConfig } from "../agent/config.js";
6
+ import { logger } from "../utils/logger.js";
7
+ /** AI Brain — orchestrates responses from rules engine or LLM */
8
+ export class Brain {
9
+ client;
10
+ memory;
11
+ rules;
12
+ provider;
13
+ constructor(client, memory) {
14
+ this.client = client;
15
+ this.memory = memory;
16
+ this.rules = new RuleEngine(client, memory);
17
+ this.provider = this.detectProvider();
18
+ }
19
+ /** Process a query and return a response */
20
+ async ask(question) {
21
+ if (this.provider === "rules") {
22
+ return this.rules.query(question);
23
+ }
24
+ try {
25
+ const context = await this.gatherContext();
26
+ return await this.callLLM(question, context);
27
+ }
28
+ catch (err) {
29
+ logger.debug(`LLM failed, falling back to rules: ${err.message}`);
30
+ return this.rules.query(question);
31
+ }
32
+ }
33
+ getProvider() {
34
+ return this.provider;
35
+ }
36
+ detectProvider() {
37
+ const config = readBlockclawConfig();
38
+ if (config.anthropic_api_key)
39
+ return "claude";
40
+ if (config.ollama_url)
41
+ return "ollama";
42
+ return "rules";
43
+ }
44
+ async gatherContext() {
45
+ const { running, pid } = isAgentRunning();
46
+ let status;
47
+ let health;
48
+ if (running) {
49
+ try {
50
+ const s = await this.client.status();
51
+ status = s;
52
+ }
53
+ catch { }
54
+ try {
55
+ const h = await this.client.committeeHealth();
56
+ health = h;
57
+ }
58
+ catch { }
59
+ }
60
+ const issues = this.memory.getIssues(5);
61
+ const system = getSystemInfo();
62
+ return buildContext({
63
+ running,
64
+ pid,
65
+ status,
66
+ health,
67
+ issues: issues.map((i) => ({ summary: i.summary, occurrences: i.occurrences })),
68
+ system: system,
69
+ });
70
+ }
71
+ async callLLM(question, context) {
72
+ if (this.provider === "claude")
73
+ return this.callClaude(question, context);
74
+ if (this.provider === "ollama")
75
+ return this.callOllama(question, context);
76
+ return this.rules.query(question);
77
+ }
78
+ async callClaude(question, context) {
79
+ const config = readBlockclawConfig();
80
+ if (!config.anthropic_api_key)
81
+ throw new Error("No Anthropic API key configured");
82
+ // Dynamic import — optional peer dependency
83
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
84
+ const mod = await import("@anthropic-ai/sdk");
85
+ const Anthropic = mod.default;
86
+ const client = new Anthropic({ apiKey: config.anthropic_api_key });
87
+ const response = await client.messages.create({
88
+ model: "claude-haiku-4-5-20251001",
89
+ max_tokens: 1024,
90
+ system: SYSTEM_PROMPT,
91
+ messages: [
92
+ { role: "user", content: `${context}\n\nQuestion: ${question}` },
93
+ ],
94
+ });
95
+ const textBlock = response.content.find((b) => b.type === "text");
96
+ return textBlock?.text ?? "No response generated.";
97
+ }
98
+ async callOllama(question, context) {
99
+ const config = readBlockclawConfig();
100
+ const url = config.ollama_url ?? "http://localhost:11434";
101
+ const response = await fetch(`${url}/api/generate`, {
102
+ method: "POST",
103
+ headers: { "Content-Type": "application/json" },
104
+ body: JSON.stringify({
105
+ model: "llama3.2",
106
+ prompt: `${SYSTEM_PROMPT}\n\n${context}\n\nQuestion: ${question}`,
107
+ stream: false,
108
+ }),
109
+ signal: AbortSignal.timeout(30000),
110
+ });
111
+ if (!response.ok)
112
+ throw new Error(`Ollama error: ${response.status}`);
113
+ const data = await response.json();
114
+ return data.response ?? "No response generated.";
115
+ }
116
+ }
117
+ //# sourceMappingURL=brain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain.js","sourceRoot":"","sources":["../../src/ai/brain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /** System prompt for AI-powered responses */
2
+ export declare const SYSTEM_PROMPT = "You are BlockClaw, an AI agent managing a Sequence0 network node.\n\nSequence0 is a decentralized threshold signing network supporting 81+ blockchains.\nNode runners operate agent nodes that participate in distributed key generation (DKG),\nFROST threshold signing, key refresh, and committee health monitoring.\n\nYour role:\n- Monitor and manage the agent node autonomously\n- Answer questions about the node's status, health, and configuration\n- Diagnose and fix common issues (restarts, port conflicts, peer connectivity)\n- Explain concepts related to threshold signing, DKG, committee health\n\nKey concepts:\n- DKG (Distributed Key Generation): Protocol where agents collectively generate a shared key\n- FROST: Flexible Round-Optimized Schnorr Threshold signatures\n- Committee: Group of agents that share a wallet's key material\n- Threshold: Minimum number of agents needed to produce a signature (e.g., 2-of-3)\n- Key Refresh: Periodic rotation of key shares without changing the public key\n- Key Reshare: Adding/removing committee members by redistributing shares\n\nStatus meanings:\n- Healthy: All committee members responsive\n- Degraded: Some members unresponsive but above threshold\n- AtRisk: Barely above threshold, reshare recommended\n- Critical: At or below threshold, signatures may fail\n- Dead: Below threshold, committee non-functional\n\nAlways be concise and actionable. Suggest specific commands when relevant.";
3
+ /** Build context for the AI from current state */
4
+ export declare function buildContext(state: {
5
+ running: boolean;
6
+ pid?: number | null;
7
+ status?: Record<string, unknown>;
8
+ health?: Record<string, unknown>[];
9
+ issues?: Array<{
10
+ summary: string;
11
+ occurrences: number;
12
+ }>;
13
+ system?: Record<string, string | number>;
14
+ }): string;
15
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/ai/prompts.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,eAAO,MAAM,aAAa,s6CA2BiD,CAAC;AAE5E,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACnC,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C,GAAG,MAAM,CAyCT"}
@@ -0,0 +1,67 @@
1
+ /** System prompt for AI-powered responses */
2
+ export const SYSTEM_PROMPT = `You are BlockClaw, an AI agent managing a Sequence0 network node.
3
+
4
+ Sequence0 is a decentralized threshold signing network supporting 81+ blockchains.
5
+ Node runners operate agent nodes that participate in distributed key generation (DKG),
6
+ FROST threshold signing, key refresh, and committee health monitoring.
7
+
8
+ Your role:
9
+ - Monitor and manage the agent node autonomously
10
+ - Answer questions about the node's status, health, and configuration
11
+ - Diagnose and fix common issues (restarts, port conflicts, peer connectivity)
12
+ - Explain concepts related to threshold signing, DKG, committee health
13
+
14
+ Key concepts:
15
+ - DKG (Distributed Key Generation): Protocol where agents collectively generate a shared key
16
+ - FROST: Flexible Round-Optimized Schnorr Threshold signatures
17
+ - Committee: Group of agents that share a wallet's key material
18
+ - Threshold: Minimum number of agents needed to produce a signature (e.g., 2-of-3)
19
+ - Key Refresh: Periodic rotation of key shares without changing the public key
20
+ - Key Reshare: Adding/removing committee members by redistributing shares
21
+
22
+ Status meanings:
23
+ - Healthy: All committee members responsive
24
+ - Degraded: Some members unresponsive but above threshold
25
+ - AtRisk: Barely above threshold, reshare recommended
26
+ - Critical: At or below threshold, signatures may fail
27
+ - Dead: Below threshold, committee non-functional
28
+
29
+ Always be concise and actionable. Suggest specific commands when relevant.`;
30
+ /** Build context for the AI from current state */
31
+ export function buildContext(state) {
32
+ const lines = ["Current state:"];
33
+ if (state.running) {
34
+ lines.push(`Agent: Running (PID ${state.pid})`);
35
+ }
36
+ else {
37
+ lines.push("Agent: Stopped");
38
+ }
39
+ if (state.status) {
40
+ lines.push(`Peers: ${state.status.connected_peers ?? 0}`);
41
+ lines.push(`Wallets: ${Array.isArray(state.status.wallets) ? state.status.wallets.length : 0}`);
42
+ lines.push(`Network: ${state.status.network ?? "unknown"}`);
43
+ }
44
+ if (state.health && state.health.length > 0) {
45
+ const unhealthy = state.health.filter((h) => ["degraded", "atrisk", "critical", "dead"].includes(String(h.status).toLowerCase()));
46
+ if (unhealthy.length > 0) {
47
+ lines.push(`Unhealthy committees: ${unhealthy.length}`);
48
+ for (const h of unhealthy.slice(0, 3)) {
49
+ lines.push(` - ${h.wallet_id}: ${h.status}`);
50
+ }
51
+ }
52
+ else {
53
+ lines.push(`All ${state.health.length} committees healthy`);
54
+ }
55
+ }
56
+ if (state.issues && state.issues.length > 0) {
57
+ lines.push(`Recent issues:`);
58
+ for (const i of state.issues.slice(0, 3)) {
59
+ lines.push(` - ${i.summary} (${i.occurrences}x)`);
60
+ }
61
+ }
62
+ if (state.system) {
63
+ lines.push(`System: ${state.system.platform}-${state.system.arch}, ${state.system.freeMemoryGB}GB free`);
64
+ }
65
+ return lines.join("\n");
66
+ }
67
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ai/prompts.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;2EA2B8C,CAAC;AAE5E,kDAAkD;AAClD,MAAM,UAAU,YAAY,CAAC,KAO5B;IACC,MAAM,KAAK,GAAa,CAAC,gBAAgB,CAAC,CAAC;IAE3C,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChG,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1C,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CACpF,CAAC;QACF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,yBAAyB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YACxD,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,qBAAqB,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,YAAY,SAAS,CAAC,CAAC;IAC3G,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { AgentClient } from "../agent/client.js";
2
+ import { Memory } from "../core/memory.js";
3
+ /** Rule-based response engine — no LLM needed */
4
+ export declare class RuleEngine {
5
+ private client;
6
+ private memory;
7
+ constructor(client: AgentClient, memory: Memory);
8
+ /** Process a natural language query and return a response */
9
+ query(input: string): Promise<string>;
10
+ private statusResponse;
11
+ private peerResponse;
12
+ private walletResponse;
13
+ private healthResponse;
14
+ private issueResponse;
15
+ private networkResponse;
16
+ private helpResponse;
17
+ private systemResponse;
18
+ }
19
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/ai/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAwB,MAAM,oBAAoB,CAAC;AAGvE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI3C,iDAAiD;AACjD,qBAAa,UAAU;IAEnB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;gBADN,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM;IAGxB,6DAA6D;IACvD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAuB7B,cAAc;YAgBd,YAAY;YAYZ,cAAc;YAad,cAAc;IAmB5B,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,cAAc;CASvB"}
@@ -0,0 +1,143 @@
1
+ import { readBlockclawConfig, readAgentConfig } from "../agent/config.js";
2
+ import { isAgentRunning } from "../agent/process.js";
3
+ import { getSystemInfo } from "../utils/platform.js";
4
+ import { VERSION } from "../version.js";
5
+ /** Rule-based response engine — no LLM needed */
6
+ export class RuleEngine {
7
+ client;
8
+ memory;
9
+ constructor(client, memory) {
10
+ this.client = client;
11
+ this.memory = memory;
12
+ }
13
+ /** Process a natural language query and return a response */
14
+ async query(input) {
15
+ const q = input.toLowerCase().trim();
16
+ if (matches(q, ["status", "how", "running", "alive", "up"]))
17
+ return this.statusResponse();
18
+ if (matches(q, ["peer", "peers", "connected", "connections"]))
19
+ return this.peerResponse();
20
+ if (matches(q, ["wallet", "wallets", "balance", "address"]))
21
+ return this.walletResponse();
22
+ if (matches(q, ["health", "committee", "healthy", "degraded"]))
23
+ return this.healthResponse();
24
+ if (matches(q, ["issue", "problem", "error", "wrong", "fail"]))
25
+ return this.issueResponse();
26
+ if (matches(q, ["network", "mainnet", "testnet", "chain"]))
27
+ return this.networkResponse();
28
+ if (matches(q, ["help", "what can", "commands", "how do"]))
29
+ return this.helpResponse();
30
+ if (matches(q, ["system", "cpu", "memory", "disk", "hardware"]))
31
+ return this.systemResponse();
32
+ if (matches(q, ["version", "update"]))
33
+ return `BlockClaw v${VERSION}. Run 'blockclaw update --check' to check for updates.`;
34
+ if (matches(q, ["restart", "reboot", "fix"]))
35
+ return "To restart the agent: `blockclaw restart`\nTo run diagnostics: `blockclaw doctor`";
36
+ return `I'm not sure how to answer that. Try:\n` +
37
+ ` • "status" — check agent status\n` +
38
+ ` • "peers" — show peer connections\n` +
39
+ ` • "health" — committee health\n` +
40
+ ` • "wallets" — list wallets\n` +
41
+ ` • "issues" — recent problems\n` +
42
+ ` • "help" — available commands`;
43
+ }
44
+ async statusResponse() {
45
+ const { running, pid } = isAgentRunning();
46
+ if (!running)
47
+ return "Agent is not running. Start it with: `blockclaw start`";
48
+ try {
49
+ const status = await this.client.status();
50
+ return `Agent is running (PID ${pid}).\n` +
51
+ `Peers: ${status.connected_peers}\n` +
52
+ `Wallets: ${status.wallets.length}\n` +
53
+ `Active DKG: ${status.active_dkg_sessions}\n` +
54
+ `Active Signing: ${status.active_signing_sessions}`;
55
+ }
56
+ catch {
57
+ return `Agent process is running (PID ${pid}) but API is not responding. It may still be starting up.`;
58
+ }
59
+ }
60
+ async peerResponse() {
61
+ try {
62
+ const peers = await this.client.peers();
63
+ if (peers.length === 0)
64
+ return "No peers connected. The agent may be bootstrapping.";
65
+ return `Connected to ${peers.length} peer(s):\n` +
66
+ peers.slice(0, 5).map((p) => ` • ${p.peer_id}`).join("\n") +
67
+ (peers.length > 5 ? `\n ... and ${peers.length - 5} more` : "");
68
+ }
69
+ catch {
70
+ return "Could not fetch peer info. Is the agent running?";
71
+ }
72
+ }
73
+ async walletResponse() {
74
+ try {
75
+ const wallets = await this.client.wallets();
76
+ if (wallets.length === 0)
77
+ return "No wallets. Create one with: `blockclaw wallet create --id <name>`";
78
+ return `${wallets.length} wallet(s):\n` +
79
+ wallets.slice(0, 5).map((w) => ` • ${w.wallet_id} (${w.chain}) — ${w.address}`).join("\n");
80
+ }
81
+ catch {
82
+ return "Could not fetch wallet info. Is the agent running?";
83
+ }
84
+ }
85
+ async healthResponse() {
86
+ try {
87
+ const committees = await this.client.committeeHealth();
88
+ if (committees.length === 0)
89
+ return "No committees found.";
90
+ const degraded = committees.filter((c) => ["degraded", "atrisk", "critical", "dead"].includes(c.status.toLowerCase()));
91
+ if (degraded.length === 0)
92
+ return `All ${committees.length} committee(s) are healthy.`;
93
+ return `${degraded.length} committee(s) need attention:\n` +
94
+ degraded.map((c) => ` • ${c.wallet_id}: ${c.status} (${c.alive}/${c.total} alive)`).join("\n");
95
+ }
96
+ catch {
97
+ return "Could not fetch health info. Is the agent running?";
98
+ }
99
+ }
100
+ issueResponse() {
101
+ const issues = this.memory.getIssues(5);
102
+ if (issues.length === 0)
103
+ return "No recent issues recorded.";
104
+ return `Recent issues:\n` +
105
+ issues.map((i) => ` • ${i.summary} (${i.occurrences}x, last: ${new Date(i.lastSeen).toLocaleString()})`).join("\n");
106
+ }
107
+ networkResponse() {
108
+ const config = readBlockclawConfig();
109
+ const agentConfig = readAgentConfig();
110
+ return `Network: ${config.network ?? agentConfig?.network ?? "mainnet"}\n` +
111
+ `API Port: ${config.api_port ?? agentConfig?.api_port ?? 8080}\n` +
112
+ `P2P Port: ${agentConfig?.port ?? 9000}`;
113
+ }
114
+ helpResponse() {
115
+ return `Available commands:\n` +
116
+ ` blockclaw start — Start the agent\n` +
117
+ ` blockclaw stop — Stop the agent\n` +
118
+ ` blockclaw restart — Restart the agent\n` +
119
+ ` blockclaw status — Show agent status\n` +
120
+ ` blockclaw health — Committee health\n` +
121
+ ` blockclaw wallet — Wallet management\n` +
122
+ ` blockclaw logs — View agent logs\n` +
123
+ ` blockclaw doctor — Run diagnostics\n` +
124
+ ` blockclaw daemon — Background daemon\n` +
125
+ ` blockclaw config — Configuration\n` +
126
+ ` blockclaw update — Check for updates\n` +
127
+ ` blockclaw ask — Ask a question\n` +
128
+ ` blockclaw info — System info`;
129
+ }
130
+ systemResponse() {
131
+ const info = getSystemInfo();
132
+ return `System Info:\n` +
133
+ ` Platform: ${info.platform}-${info.arch}\n` +
134
+ ` Node.js: ${info.nodeVersion}\n` +
135
+ ` CPUs: ${info.cpus}\n` +
136
+ ` Memory: ${info.freeMemoryGB} GB free / ${info.totalMemoryGB} GB total\n` +
137
+ ` Uptime: ${info.uptime}`;
138
+ }
139
+ }
140
+ function matches(input, keywords) {
141
+ return keywords.some((kw) => input.includes(kw));
142
+ }
143
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/ai/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface SystemRequirements {
2
+ passed: boolean;
3
+ checks: DiagnosticCheck[];
4
+ }
5
+ export interface DiagnosticCheck {
6
+ name: string;
7
+ status: "pass" | "warn" | "fail";
8
+ message: string;
9
+ }
10
+ /** Detect hardware and check system requirements */
11
+ export declare function detectSystem(): Promise<SystemRequirements>;
12
+ /** Check port availability for P2P and API ports */
13
+ export declare function checkPorts(p2pPort: number, apiPort: number): Promise<DiagnosticCheck[]>;
14
+ /** Suggest optimal configuration based on hardware */
15
+ export declare function suggestConfig(): Record<string, string | number>;
16
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/core/detector.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oDAAoD;AACpD,wBAAsB,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAkDhE;AAED,oDAAoD;AACpD,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAkB7F;AAED,sDAAsD;AACtD,wBAAgB,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAsB/D"}
@@ -0,0 +1,90 @@
1
+ import { getSystemInfo, getDiskUsage } from "../utils/platform.js";
2
+ import { isPortAvailable } from "../agent/process.js";
3
+ import { SEQUENCE0_DIR } from "../utils/paths.js";
4
+ import { formatBytes } from "../utils/format.js";
5
+ /** Detect hardware and check system requirements */
6
+ export async function detectSystem() {
7
+ const checks = [];
8
+ const info = getSystemInfo();
9
+ // Node.js version
10
+ const nodeVersion = parseInt(info.nodeVersion.replace("v", ""));
11
+ checks.push({
12
+ name: "Node.js Version",
13
+ status: nodeVersion >= 18 ? "pass" : "fail",
14
+ message: nodeVersion >= 18
15
+ ? `${info.nodeVersion} (OK)`
16
+ : `${info.nodeVersion} (requires >= 18.0.0)`,
17
+ });
18
+ // CPU cores
19
+ checks.push({
20
+ name: "CPU Cores",
21
+ status: info.cpus >= 2 ? "pass" : "warn",
22
+ message: `${info.cpus} cores${info.cpus < 2 ? " (2+ recommended)" : ""}`,
23
+ });
24
+ // Memory
25
+ const totalGB = parseFloat(info.totalMemoryGB);
26
+ const freeGB = parseFloat(info.freeMemoryGB);
27
+ checks.push({
28
+ name: "Memory",
29
+ status: totalGB >= 2 ? (freeGB >= 0.5 ? "pass" : "warn") : "fail",
30
+ message: `${info.freeMemoryGB} GB free / ${info.totalMemoryGB} GB total${totalGB < 2 ? " (2 GB minimum)" : ""}`,
31
+ });
32
+ // Disk space
33
+ const disk = await getDiskUsage(SEQUENCE0_DIR);
34
+ if (disk.total > 0) {
35
+ const freeGBDisk = disk.free / 1073741824;
36
+ checks.push({
37
+ name: "Disk Space",
38
+ status: freeGBDisk >= 1 ? (freeGBDisk >= 5 ? "pass" : "warn") : "fail",
39
+ message: `${formatBytes(disk.free)} free / ${formatBytes(disk.total)} total (${disk.usedPercent.toFixed(1)}% used)`,
40
+ });
41
+ }
42
+ // Platform
43
+ checks.push({
44
+ name: "Platform",
45
+ status: ["darwin", "linux"].includes(info.platform) ? "pass" : "warn",
46
+ message: `${info.platform}-${info.arch}`,
47
+ });
48
+ const passed = checks.every((c) => c.status !== "fail");
49
+ return { passed, checks };
50
+ }
51
+ /** Check port availability for P2P and API ports */
52
+ export async function checkPorts(p2pPort, apiPort) {
53
+ const checks = [];
54
+ const p2pAvailable = await isPortAvailable(p2pPort);
55
+ checks.push({
56
+ name: `P2P Port (${p2pPort})`,
57
+ status: p2pAvailable ? "pass" : "fail",
58
+ message: p2pAvailable ? "Available" : `Port ${p2pPort} is in use`,
59
+ });
60
+ const apiAvailable = await isPortAvailable(apiPort);
61
+ checks.push({
62
+ name: `API Port (${apiPort})`,
63
+ status: apiAvailable ? "pass" : "fail",
64
+ message: apiAvailable ? "Available" : `Port ${apiPort} is in use`,
65
+ });
66
+ return checks;
67
+ }
68
+ /** Suggest optimal configuration based on hardware */
69
+ export function suggestConfig() {
70
+ const info = getSystemInfo();
71
+ const cpus = info.cpus;
72
+ const totalGB = parseFloat(info.totalMemoryGB);
73
+ const suggestions = {};
74
+ // Log level based on resources
75
+ if (totalGB < 4) {
76
+ suggestions.log_level = "warn";
77
+ }
78
+ else {
79
+ suggestions.log_level = "info";
80
+ }
81
+ // Heartbeat interval based on resources
82
+ if (cpus <= 2 || totalGB < 4) {
83
+ suggestions.heartbeat_interval = 600; // 10 min for low-resource systems
84
+ }
85
+ else {
86
+ suggestions.heartbeat_interval = 300; // 5 min default
87
+ }
88
+ return suggestions;
89
+ }
90
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/core/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { AgentClient } from "../agent/client.js";
2
+ import { Memory } from "./memory.js";
3
+ import type { HeartbeatEvent } from "./heartbeat.js";
4
+ export type HealAction = "restart_agent" | "fix_port_conflict" | "reconnect_peers" | "rotate_logs" | "update_binary" | "alert_operator" | "none";
5
+ export interface SelfHealerOptions {
6
+ /** Maximum restarts allowed within windowMs (default: 5) */
7
+ maxRestarts?: number;
8
+ /** Rolling window in milliseconds to track restart frequency (default: 300000 = 5 min) */
9
+ windowMs?: number;
10
+ }
11
+ export declare class SelfHealer {
12
+ private readonly client;
13
+ private readonly memory;
14
+ private readonly maxRestarts;
15
+ private readonly windowMs;
16
+ /** Timestamps of recent restarts within the rolling window */
17
+ private restartTimestamps;
18
+ /** Consecutive restart count for exponential backoff */
19
+ private consecutiveRestarts;
20
+ constructor(client: AgentClient, memory: Memory, options?: SelfHealerOptions);
21
+ /**
22
+ * Evaluate a heartbeat event and decide on a healing action.
23
+ * Executes the action and returns which action was taken.
24
+ */
25
+ handleEvent(event: HeartbeatEvent): Promise<HealAction>;
26
+ /** Reset restart counter and backoff state. */
27
+ reset(): void;
28
+ /** Agent is unreachable — decide between restart and port conflict fix. */
29
+ private _handleAgentDown;
30
+ /** Zero peers — restart agent to re-bootstrap. */
31
+ private _handlePeersLost;
32
+ /** Disk usage above 95% — truncate agent logs. */
33
+ private _handleDiskWarning;
34
+ /** Memory usage above 90% — restart agent to reclaim memory. */
35
+ private _handleMemoryWarning;
36
+ /** Update available — download and restart if auto-update is enabled. */
37
+ private _handleUpdateAvailable;
38
+ /** Stop the agent (if running), resolve binary, and spawn with merged config. */
39
+ private _restartAgent;
40
+ /** Find an available port, update config, and restart. */
41
+ private _fixPortConflict;
42
+ /** Restart the agent to re-bootstrap peer connections. */
43
+ private _reconnectPeers;
44
+ /** Truncate the agent log file to reclaim disk space. */
45
+ private _rotateLogs;
46
+ /** Committee is degraded — alert operator about at-risk wallets. */
47
+ private _handleHealthDegraded;
48
+ /** Committee is critical/dead — urgent alert, suggest reshare. */
49
+ private _handleHealthCritical;
50
+ /** Emit a critical alert and stop self-healing. */
51
+ private _alertOperator;
52
+ /** Resolve binary, merge config, and spawn the agent process. */
53
+ private _spawnWithBackoff;
54
+ /** Apply exponential backoff before a restart: 1s, 2s, 4s, 8s, 16s. */
55
+ private _backoff;
56
+ /** Record a restart timestamp in the rolling window. */
57
+ private _recordRestart;
58
+ /** Remove restart timestamps older than the rolling window. */
59
+ private _pruneRestartWindow;
60
+ }
61
+ export default SelfHealer;
62
+ //# sourceMappingURL=healer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"healer.d.ts","sourceRoot":"","sources":["../../src/core/healer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMrD,MAAM,MAAM,UAAU,GAClB,eAAe,GACf,mBAAmB,GACnB,iBAAiB,GACjB,aAAa,GACb,eAAe,GACf,gBAAgB,GAChB,MAAM,CAAC;AAEX,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAeD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,8DAA8D;IAC9D,OAAO,CAAC,iBAAiB,CAAgB;IAEzC,wDAAwD;IACxD,OAAO,CAAC,mBAAmB,CAAK;gBAEpB,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB;IAW5E;;;OAGG;IACG,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;IA2D7D,+CAA+C;IAC/C,KAAK,IAAI,IAAI;IAUb,2EAA2E;YAC7D,gBAAgB;IA2B9B,kDAAkD;YACpC,gBAAgB;IAK9B,kDAAkD;YACpC,kBAAkB;IAKhC,gEAAgE;YAClD,oBAAoB;IAKlC,yEAAyE;YAC3D,sBAAsB;IA4BpC,iFAAiF;YACnE,aAAa;IAyB3B,0DAA0D;YAC5C,gBAAgB;IA+C9B,0DAA0D;YAC5C,eAAe;IAsB7B,yDAAyD;YAC3C,WAAW;IAgBzB,oEAAoE;YACtD,qBAAqB;IAgCnC,kEAAkE;YACpD,qBAAqB;IAYnC,mDAAmD;IACnD,OAAO,CAAC,cAAc;IAwBtB,iEAAiE;YACnD,iBAAiB;IAwB/B,uEAAuE;YACzD,QAAQ;IAStB,wDAAwD;IACxD,OAAO,CAAC,cAAc;IAItB,+DAA+D;IAC/D,OAAO,CAAC,mBAAmB;CAI5B;AAED,eAAe,UAAU,CAAC"}