@blockrun/clawrouter 0.12.101 → 0.12.103

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 (281) hide show
  1. package/dist/cli.d.ts +0 -15
  2. package/dist/cli.js +80069 -273
  3. package/dist/cli.js.map +1 -1
  4. package/dist/index.d.ts +1406 -34
  5. package/dist/index.js +81085 -1075
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/dist/auth.d.ts +0 -82
  9. package/dist/auth.d.ts.map +0 -1
  10. package/dist/auth.js +0 -388
  11. package/dist/auth.js.map +0 -1
  12. package/dist/balance.d.ts +0 -97
  13. package/dist/balance.d.ts.map +0 -1
  14. package/dist/balance.js +0 -157
  15. package/dist/balance.js.map +0 -1
  16. package/dist/cli.d.ts.map +0 -1
  17. package/dist/compression/codebook.d.ts +0 -24
  18. package/dist/compression/codebook.d.ts.map +0 -1
  19. package/dist/compression/codebook.js +0 -119
  20. package/dist/compression/codebook.js.map +0 -1
  21. package/dist/compression/index.d.ts +0 -33
  22. package/dist/compression/index.d.ts.map +0 -1
  23. package/dist/compression/index.js +0 -246
  24. package/dist/compression/index.js.map +0 -1
  25. package/dist/compression/layers/deduplication.d.ts +0 -28
  26. package/dist/compression/layers/deduplication.d.ts.map +0 -1
  27. package/dist/compression/layers/deduplication.js +0 -101
  28. package/dist/compression/layers/deduplication.js.map +0 -1
  29. package/dist/compression/layers/dictionary.d.ts +0 -21
  30. package/dist/compression/layers/dictionary.d.ts.map +0 -1
  31. package/dist/compression/layers/dictionary.js +0 -73
  32. package/dist/compression/layers/dictionary.js.map +0 -1
  33. package/dist/compression/layers/dynamic-codebook.d.ts +0 -26
  34. package/dist/compression/layers/dynamic-codebook.d.ts.map +0 -1
  35. package/dist/compression/layers/dynamic-codebook.js +0 -149
  36. package/dist/compression/layers/dynamic-codebook.js.map +0 -1
  37. package/dist/compression/layers/json-compact.d.ts +0 -23
  38. package/dist/compression/layers/json-compact.d.ts.map +0 -1
  39. package/dist/compression/layers/json-compact.js +0 -79
  40. package/dist/compression/layers/json-compact.js.map +0 -1
  41. package/dist/compression/layers/observation.d.ts +0 -21
  42. package/dist/compression/layers/observation.d.ts.map +0 -1
  43. package/dist/compression/layers/observation.js +0 -130
  44. package/dist/compression/layers/observation.js.map +0 -1
  45. package/dist/compression/layers/paths.d.ts +0 -24
  46. package/dist/compression/layers/paths.d.ts.map +0 -1
  47. package/dist/compression/layers/paths.js +0 -110
  48. package/dist/compression/layers/paths.js.map +0 -1
  49. package/dist/compression/layers/whitespace.d.ts +0 -27
  50. package/dist/compression/layers/whitespace.d.ts.map +0 -1
  51. package/dist/compression/layers/whitespace.js +0 -60
  52. package/dist/compression/layers/whitespace.js.map +0 -1
  53. package/dist/compression/types.d.ts +0 -84
  54. package/dist/compression/types.d.ts.map +0 -1
  55. package/dist/compression/types.js +0 -27
  56. package/dist/compression/types.js.map +0 -1
  57. package/dist/config.d.ts +0 -12
  58. package/dist/config.d.ts.map +0 -1
  59. package/dist/config.js +0 -22
  60. package/dist/config.js.map +0 -1
  61. package/dist/dedup.d.ts +0 -34
  62. package/dist/dedup.d.ts.map +0 -1
  63. package/dist/dedup.js +0 -150
  64. package/dist/dedup.js.map +0 -1
  65. package/dist/doctor.d.ts +0 -8
  66. package/dist/doctor.d.ts.map +0 -1
  67. package/dist/doctor.js +0 -375
  68. package/dist/doctor.js.map +0 -1
  69. package/dist/error-classification.test.d.ts +0 -2
  70. package/dist/error-classification.test.d.ts.map +0 -1
  71. package/dist/error-classification.test.js +0 -59
  72. package/dist/error-classification.test.js.map +0 -1
  73. package/dist/errors.d.ts +0 -54
  74. package/dist/errors.d.ts.map +0 -1
  75. package/dist/errors.js +0 -85
  76. package/dist/errors.js.map +0 -1
  77. package/dist/exclude-models.d.ts +0 -28
  78. package/dist/exclude-models.d.ts.map +0 -1
  79. package/dist/exclude-models.integration.test.d.ts +0 -2
  80. package/dist/exclude-models.integration.test.d.ts.map +0 -1
  81. package/dist/exclude-models.integration.test.js +0 -46
  82. package/dist/exclude-models.integration.test.js.map +0 -1
  83. package/dist/exclude-models.js +0 -70
  84. package/dist/exclude-models.js.map +0 -1
  85. package/dist/exclude-models.test.d.ts +0 -5
  86. package/dist/exclude-models.test.d.ts.map +0 -1
  87. package/dist/exclude-models.test.js +0 -95
  88. package/dist/exclude-models.test.js.map +0 -1
  89. package/dist/fs-read.d.ts +0 -11
  90. package/dist/fs-read.d.ts.map +0 -1
  91. package/dist/fs-read.js +0 -47
  92. package/dist/fs-read.js.map +0 -1
  93. package/dist/index.d.ts.map +0 -1
  94. package/dist/journal.d.ts +0 -67
  95. package/dist/journal.d.ts.map +0 -1
  96. package/dist/journal.js +0 -184
  97. package/dist/journal.js.map +0 -1
  98. package/dist/journal.test.d.ts +0 -2
  99. package/dist/journal.test.d.ts.map +0 -1
  100. package/dist/journal.test.js +0 -201
  101. package/dist/journal.test.js.map +0 -1
  102. package/dist/logger.d.ts +0 -33
  103. package/dist/logger.d.ts.map +0 -1
  104. package/dist/logger.js +0 -35
  105. package/dist/logger.js.map +0 -1
  106. package/dist/models.d.ts +0 -107
  107. package/dist/models.d.ts.map +0 -1
  108. package/dist/models.js +0 -941
  109. package/dist/models.js.map +0 -1
  110. package/dist/models.test.d.ts +0 -2
  111. package/dist/models.test.d.ts.map +0 -1
  112. package/dist/models.test.js +0 -38
  113. package/dist/models.test.js.map +0 -1
  114. package/dist/partners/index.d.ts +0 -8
  115. package/dist/partners/index.d.ts.map +0 -1
  116. package/dist/partners/index.js +0 -6
  117. package/dist/partners/index.js.map +0 -1
  118. package/dist/partners/registry.d.ts +0 -51
  119. package/dist/partners/registry.d.ts.map +0 -1
  120. package/dist/partners/registry.js +0 -256
  121. package/dist/partners/registry.js.map +0 -1
  122. package/dist/partners/tools.d.ts +0 -24
  123. package/dist/partners/tools.d.ts.map +0 -1
  124. package/dist/partners/tools.js +0 -97
  125. package/dist/partners/tools.js.map +0 -1
  126. package/dist/payment-preauth.d.ts +0 -17
  127. package/dist/payment-preauth.d.ts.map +0 -1
  128. package/dist/payment-preauth.js +0 -102
  129. package/dist/payment-preauth.js.map +0 -1
  130. package/dist/provider.d.ts +0 -19
  131. package/dist/provider.d.ts.map +0 -1
  132. package/dist/provider.js +0 -45
  133. package/dist/provider.js.map +0 -1
  134. package/dist/proxy.d.ts +0 -210
  135. package/dist/proxy.d.ts.map +0 -1
  136. package/dist/proxy.debrand.test.d.ts +0 -2
  137. package/dist/proxy.debrand.test.d.ts.map +0 -1
  138. package/dist/proxy.debrand.test.js +0 -101
  139. package/dist/proxy.debrand.test.js.map +0 -1
  140. package/dist/proxy.degraded-response.test.d.ts +0 -2
  141. package/dist/proxy.degraded-response.test.d.ts.map +0 -1
  142. package/dist/proxy.degraded-response.test.js +0 -105
  143. package/dist/proxy.degraded-response.test.js.map +0 -1
  144. package/dist/proxy.image-download.test.d.ts +0 -2
  145. package/dist/proxy.image-download.test.d.ts.map +0 -1
  146. package/dist/proxy.image-download.test.js +0 -92
  147. package/dist/proxy.image-download.test.js.map +0 -1
  148. package/dist/proxy.js +0 -3810
  149. package/dist/proxy.js.map +0 -1
  150. package/dist/proxy.models-endpoint.test.d.ts +0 -2
  151. package/dist/proxy.models-endpoint.test.d.ts.map +0 -1
  152. package/dist/proxy.models-endpoint.test.js +0 -19
  153. package/dist/proxy.models-endpoint.test.js.map +0 -1
  154. package/dist/proxy.multiturn-thinking.test.d.ts +0 -2
  155. package/dist/proxy.multiturn-thinking.test.d.ts.map +0 -1
  156. package/dist/proxy.multiturn-thinking.test.js +0 -82
  157. package/dist/proxy.multiturn-thinking.test.js.map +0 -1
  158. package/dist/proxy.payment-chain-reuse.test.d.ts +0 -2
  159. package/dist/proxy.payment-chain-reuse.test.d.ts.map +0 -1
  160. package/dist/proxy.payment-chain-reuse.test.js +0 -30
  161. package/dist/proxy.payment-chain-reuse.test.js.map +0 -1
  162. package/dist/proxy.solana-resilience.test.d.ts +0 -12
  163. package/dist/proxy.solana-resilience.test.d.ts.map +0 -1
  164. package/dist/proxy.solana-resilience.test.js +0 -39
  165. package/dist/proxy.solana-resilience.test.js.map +0 -1
  166. package/dist/report.d.ts +0 -6
  167. package/dist/report.d.ts.map +0 -1
  168. package/dist/report.js +0 -44
  169. package/dist/report.js.map +0 -1
  170. package/dist/response-cache.advanced.test.d.ts +0 -2
  171. package/dist/response-cache.advanced.test.d.ts.map +0 -1
  172. package/dist/response-cache.advanced.test.js +0 -566
  173. package/dist/response-cache.advanced.test.js.map +0 -1
  174. package/dist/response-cache.d.ts +0 -85
  175. package/dist/response-cache.d.ts.map +0 -1
  176. package/dist/response-cache.edge-cases.test.d.ts +0 -2
  177. package/dist/response-cache.edge-cases.test.d.ts.map +0 -1
  178. package/dist/response-cache.edge-cases.test.js +0 -488
  179. package/dist/response-cache.edge-cases.test.js.map +0 -1
  180. package/dist/response-cache.extreme.test.d.ts +0 -2
  181. package/dist/response-cache.extreme.test.d.ts.map +0 -1
  182. package/dist/response-cache.extreme.test.js +0 -561
  183. package/dist/response-cache.extreme.test.js.map +0 -1
  184. package/dist/response-cache.js +0 -240
  185. package/dist/response-cache.js.map +0 -1
  186. package/dist/response-cache.test.d.ts +0 -2
  187. package/dist/response-cache.test.d.ts.map +0 -1
  188. package/dist/response-cache.test.js +0 -242
  189. package/dist/response-cache.test.js.map +0 -1
  190. package/dist/retry.d.ts +0 -42
  191. package/dist/retry.d.ts.map +0 -1
  192. package/dist/retry.js +0 -99
  193. package/dist/retry.js.map +0 -1
  194. package/dist/router/config.d.ts +0 -11
  195. package/dist/router/config.d.ts.map +0 -1
  196. package/dist/router/config.js +0 -1215
  197. package/dist/router/config.js.map +0 -1
  198. package/dist/router/index.d.ts +0 -18
  199. package/dist/router/index.d.ts.map +0 -1
  200. package/dist/router/index.js +0 -19
  201. package/dist/router/index.js.map +0 -1
  202. package/dist/router/llm-classifier.d.ts +0 -29
  203. package/dist/router/llm-classifier.d.ts.map +0 -1
  204. package/dist/router/llm-classifier.js +0 -99
  205. package/dist/router/llm-classifier.js.map +0 -1
  206. package/dist/router/rules.d.ts +0 -12
  207. package/dist/router/rules.d.ts.map +0 -1
  208. package/dist/router/rules.js +0 -202
  209. package/dist/router/rules.js.map +0 -1
  210. package/dist/router/selector.d.ts +0 -58
  211. package/dist/router/selector.d.ts.map +0 -1
  212. package/dist/router/selector.js +0 -165
  213. package/dist/router/selector.js.map +0 -1
  214. package/dist/router/selector.test.d.ts +0 -2
  215. package/dist/router/selector.test.d.ts.map +0 -1
  216. package/dist/router/selector.test.js +0 -67
  217. package/dist/router/selector.test.js.map +0 -1
  218. package/dist/router/strategy.d.ts +0 -19
  219. package/dist/router/strategy.d.ts.map +0 -1
  220. package/dist/router/strategy.js +0 -138
  221. package/dist/router/strategy.js.map +0 -1
  222. package/dist/router/strategy.test.d.ts +0 -2
  223. package/dist/router/strategy.test.d.ts.map +0 -1
  224. package/dist/router/strategy.test.js +0 -131
  225. package/dist/router/strategy.test.js.map +0 -1
  226. package/dist/router/types.d.ts +0 -127
  227. package/dist/router/types.d.ts.map +0 -1
  228. package/dist/router/types.js +0 -11
  229. package/dist/router/types.js.map +0 -1
  230. package/dist/session.d.ts +0 -124
  231. package/dist/session.d.ts.map +0 -1
  232. package/dist/session.js +0 -256
  233. package/dist/session.js.map +0 -1
  234. package/dist/session.test.d.ts +0 -2
  235. package/dist/session.test.d.ts.map +0 -1
  236. package/dist/session.test.js +0 -163
  237. package/dist/session.test.js.map +0 -1
  238. package/dist/solana-balance.d.ts +0 -48
  239. package/dist/solana-balance.d.ts.map +0 -1
  240. package/dist/solana-balance.js +0 -142
  241. package/dist/solana-balance.js.map +0 -1
  242. package/dist/spend-control.d.ts +0 -112
  243. package/dist/spend-control.d.ts.map +0 -1
  244. package/dist/spend-control.js +0 -278
  245. package/dist/spend-control.js.map +0 -1
  246. package/dist/spend-control.test.d.ts +0 -5
  247. package/dist/spend-control.test.d.ts.map +0 -1
  248. package/dist/spend-control.test.js +0 -210
  249. package/dist/spend-control.test.js.map +0 -1
  250. package/dist/stats.d.ts +0 -64
  251. package/dist/stats.d.ts.map +0 -1
  252. package/dist/stats.js +0 -295
  253. package/dist/stats.js.map +0 -1
  254. package/dist/types.d.ts +0 -150
  255. package/dist/types.d.ts.map +0 -1
  256. package/dist/types.js +0 -9
  257. package/dist/types.js.map +0 -1
  258. package/dist/update-hint.test.d.ts +0 -9
  259. package/dist/update-hint.test.d.ts.map +0 -1
  260. package/dist/update-hint.test.js +0 -156
  261. package/dist/update-hint.test.js.map +0 -1
  262. package/dist/updater.d.ts +0 -10
  263. package/dist/updater.d.ts.map +0 -1
  264. package/dist/updater.js +0 -55
  265. package/dist/updater.js.map +0 -1
  266. package/dist/version.d.ts +0 -3
  267. package/dist/version.d.ts.map +0 -1
  268. package/dist/version.js +0 -16
  269. package/dist/version.js.map +0 -1
  270. package/dist/wallet.d.ts +0 -52
  271. package/dist/wallet.d.ts.map +0 -1
  272. package/dist/wallet.js +0 -94
  273. package/dist/wallet.js.map +0 -1
  274. package/dist/wallet.test.d.ts +0 -6
  275. package/dist/wallet.test.d.ts.map +0 -1
  276. package/dist/wallet.test.js +0 -117
  277. package/dist/wallet.test.js.map +0 -1
  278. package/dist/x402-sdk.test.d.ts +0 -6
  279. package/dist/x402-sdk.test.d.ts.map +0 -1
  280. package/dist/x402-sdk.test.js +0 -161
  281. package/dist/x402-sdk.test.js.map +0 -1
package/dist/dedup.js DELETED
@@ -1,150 +0,0 @@
1
- /**
2
- * Request Deduplication
3
- *
4
- * Prevents double-charging when OpenClaw retries a request after timeout.
5
- * Tracks in-flight requests and caches completed responses for a short TTL.
6
- */
7
- import { createHash } from "node:crypto";
8
- const DEFAULT_TTL_MS = 30_000; // 30 seconds
9
- const MAX_BODY_SIZE = 1_048_576; // 1MB
10
- /**
11
- * Canonicalize JSON by sorting object keys recursively.
12
- * Ensures identical logical content produces identical string regardless of field order.
13
- */
14
- function canonicalize(obj) {
15
- if (obj === null || typeof obj !== "object") {
16
- return obj;
17
- }
18
- if (Array.isArray(obj)) {
19
- return obj.map(canonicalize);
20
- }
21
- const sorted = {};
22
- for (const key of Object.keys(obj).sort()) {
23
- sorted[key] = canonicalize(obj[key]);
24
- }
25
- return sorted;
26
- }
27
- /**
28
- * Strip OpenClaw-injected timestamps from message content.
29
- * Format: [DAY YYYY-MM-DD HH:MM TZ] at the start of messages.
30
- * Example: [SUN 2026-02-07 13:30 PST] Hello world
31
- *
32
- * This ensures requests with different timestamps but same content hash identically.
33
- */
34
- const TIMESTAMP_PATTERN = /^\[\w{3}\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}\s+\w+\]\s*/;
35
- function stripTimestamps(obj) {
36
- if (obj === null || typeof obj !== "object") {
37
- return obj;
38
- }
39
- if (Array.isArray(obj)) {
40
- return obj.map(stripTimestamps);
41
- }
42
- const result = {};
43
- for (const [key, value] of Object.entries(obj)) {
44
- if (key === "content" && typeof value === "string") {
45
- // Strip timestamp prefix from message content
46
- result[key] = value.replace(TIMESTAMP_PATTERN, "");
47
- }
48
- else {
49
- result[key] = stripTimestamps(value);
50
- }
51
- }
52
- return result;
53
- }
54
- export class RequestDeduplicator {
55
- inflight = new Map();
56
- completed = new Map();
57
- ttlMs;
58
- constructor(ttlMs = DEFAULT_TTL_MS) {
59
- this.ttlMs = ttlMs;
60
- }
61
- /** Hash request body to create a dedup key. */
62
- static hash(body) {
63
- // Canonicalize JSON to ensure consistent hashing regardless of field order.
64
- // Also strip OpenClaw-injected timestamps so retries with different timestamps
65
- // still match the same dedup key.
66
- let content = body;
67
- try {
68
- const parsed = JSON.parse(body.toString());
69
- const stripped = stripTimestamps(parsed);
70
- const canonical = canonicalize(stripped);
71
- content = Buffer.from(JSON.stringify(canonical));
72
- }
73
- catch {
74
- // Not valid JSON, use raw bytes
75
- }
76
- return createHash("sha256").update(content).digest("hex").slice(0, 16);
77
- }
78
- /** Check if a response is cached for this key. */
79
- getCached(key) {
80
- const entry = this.completed.get(key);
81
- if (!entry)
82
- return undefined;
83
- if (Date.now() - entry.completedAt > this.ttlMs) {
84
- this.completed.delete(key);
85
- return undefined;
86
- }
87
- return entry;
88
- }
89
- /** Check if a request with this key is currently in-flight. Returns a promise to wait on. */
90
- getInflight(key) {
91
- const entry = this.inflight.get(key);
92
- if (!entry)
93
- return undefined;
94
- return new Promise((resolve) => {
95
- entry.resolvers.push(resolve);
96
- });
97
- }
98
- /** Mark a request as in-flight. */
99
- markInflight(key) {
100
- this.inflight.set(key, {
101
- resolvers: [],
102
- });
103
- }
104
- /** Complete an in-flight request — cache result and notify waiters. */
105
- complete(key, result) {
106
- // Only cache responses within size limit
107
- if (result.body.length <= MAX_BODY_SIZE) {
108
- this.completed.set(key, result);
109
- }
110
- const entry = this.inflight.get(key);
111
- if (entry) {
112
- for (const resolve of entry.resolvers) {
113
- resolve(result);
114
- }
115
- this.inflight.delete(key);
116
- }
117
- this.prune();
118
- }
119
- /** Remove an in-flight entry on error (don't cache failures).
120
- * Also rejects any waiters so they can retry independently. */
121
- removeInflight(key) {
122
- const entry = this.inflight.get(key);
123
- if (entry) {
124
- // Resolve waiters with a sentinel error response so they don't hang forever.
125
- // Waiters will see a 503 and can retry on their own.
126
- const errorBody = Buffer.from(JSON.stringify({
127
- error: { message: "Original request failed, please retry", type: "dedup_origin_failed" },
128
- }));
129
- for (const resolve of entry.resolvers) {
130
- resolve({
131
- status: 503,
132
- headers: { "content-type": "application/json" },
133
- body: errorBody,
134
- completedAt: Date.now(),
135
- });
136
- }
137
- this.inflight.delete(key);
138
- }
139
- }
140
- /** Prune expired completed entries. */
141
- prune() {
142
- const now = Date.now();
143
- for (const [key, entry] of this.completed) {
144
- if (now - entry.completedAt > this.ttlMs) {
145
- this.completed.delete(key);
146
- }
147
- }
148
- }
149
- }
150
- //# sourceMappingURL=dedup.js.map
package/dist/dedup.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"dedup.js","sourceRoot":"","sources":["../src/dedup.ts"],"names":[],"mappings":"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"}
package/dist/doctor.d.ts DELETED
@@ -1,8 +0,0 @@
1
- /**
2
- * BlockRun Doctor - AI-Powered Diagnostics
3
- *
4
- * Collects system diagnostics and sends to Claude Opus 4.6 for analysis.
5
- * Works independently of OpenClaw - direct x402 payment to BlockRun API.
6
- */
7
- export declare function runDoctor(userQuestion?: string, model?: "sonnet" | "opus"): Promise<void>;
8
- //# sourceMappingURL=doctor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkaH,wBAAsB,SAAS,CAC7B,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,GAAE,QAAQ,GAAG,MAAiB,GAClC,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
package/dist/doctor.js DELETED
@@ -1,375 +0,0 @@
1
- /**
2
- * BlockRun Doctor - AI-Powered Diagnostics
3
- *
4
- * Collects system diagnostics and sends to Claude Opus 4.6 for analysis.
5
- * Works independently of OpenClaw - direct x402 payment to BlockRun API.
6
- */
7
- import { platform, arch, freemem, totalmem } from "node:os";
8
- import { createPublicClient, http } from "viem";
9
- import { base } from "viem/chains";
10
- import { privateKeyToAccount } from "viem/accounts";
11
- import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
12
- import { registerExactEvmScheme } from "@x402/evm/exact/client";
13
- import { toClientEvmSigner } from "@x402/evm";
14
- import { resolveOrGenerateWalletKey, resolvePaymentChain, WALLET_FILE } from "./auth.js";
15
- import { BalanceMonitor } from "./balance.js";
16
- import { getSolanaAddress } from "./wallet.js";
17
- import { getStats } from "./stats.js";
18
- import { getProxyPort } from "./proxy.js";
19
- import { VERSION } from "./version.js";
20
- // Helpers
21
- function formatBytes(bytes) {
22
- const gb = bytes / (1024 * 1024 * 1024);
23
- return `${gb.toFixed(1)}GB`;
24
- }
25
- function green(text) {
26
- return `\x1b[32m✓\x1b[0m ${text}`;
27
- }
28
- function red(text) {
29
- return `\x1b[31m✗\x1b[0m ${text}`;
30
- }
31
- function yellow(text) {
32
- return `\x1b[33m⚠\x1b[0m ${text}`;
33
- }
34
- // Collect system info
35
- function collectSystemInfo() {
36
- return {
37
- os: `${platform()} ${arch()}`,
38
- arch: arch(),
39
- nodeVersion: process.version,
40
- memoryFree: formatBytes(freemem()),
41
- memoryTotal: formatBytes(totalmem()),
42
- };
43
- }
44
- // Collect wallet info
45
- async function collectWalletInfo() {
46
- try {
47
- const { key, address, source, solanaPrivateKeyBytes } = await resolveOrGenerateWalletKey();
48
- if (!key || !address) {
49
- return {
50
- exists: false,
51
- valid: false,
52
- address: null,
53
- solanaAddress: null,
54
- balance: null,
55
- isLow: false,
56
- isEmpty: true,
57
- source: null,
58
- paymentChain: "base",
59
- };
60
- }
61
- // Derive Solana address if mnemonic-based wallet
62
- let solanaAddress = null;
63
- if (solanaPrivateKeyBytes) {
64
- try {
65
- solanaAddress = await getSolanaAddress(solanaPrivateKeyBytes);
66
- }
67
- catch {
68
- // Non-fatal
69
- }
70
- }
71
- // Check balance on the active payment chain
72
- const paymentChain = await resolvePaymentChain();
73
- try {
74
- let balanceInfo;
75
- if (paymentChain === "solana" && solanaAddress) {
76
- const { SolanaBalanceMonitor } = await import("./solana-balance.js");
77
- const monitor = new SolanaBalanceMonitor(solanaAddress);
78
- balanceInfo = await monitor.checkBalance();
79
- }
80
- else {
81
- const monitor = new BalanceMonitor(address);
82
- balanceInfo = await monitor.checkBalance();
83
- }
84
- return {
85
- exists: true,
86
- valid: true,
87
- address,
88
- solanaAddress,
89
- balance: balanceInfo.balanceUSD,
90
- isLow: balanceInfo.isLow,
91
- isEmpty: balanceInfo.isEmpty,
92
- source,
93
- paymentChain,
94
- };
95
- }
96
- catch {
97
- return {
98
- exists: true,
99
- valid: true,
100
- address,
101
- solanaAddress,
102
- balance: null,
103
- isLow: false,
104
- isEmpty: false,
105
- source,
106
- paymentChain,
107
- };
108
- }
109
- }
110
- catch {
111
- return {
112
- exists: false,
113
- valid: false,
114
- address: null,
115
- solanaAddress: null,
116
- balance: null,
117
- isLow: false,
118
- isEmpty: true,
119
- source: null,
120
- paymentChain: "base",
121
- };
122
- }
123
- }
124
- // Collect network info
125
- async function collectNetworkInfo() {
126
- const port = getProxyPort();
127
- // Check BlockRun API
128
- let blockrunReachable = false;
129
- let blockrunLatency = null;
130
- try {
131
- const start = Date.now();
132
- const response = await fetch("https://blockrun.ai/api/v1/models", {
133
- method: "GET",
134
- signal: AbortSignal.timeout(10000),
135
- });
136
- blockrunLatency = Date.now() - start;
137
- blockrunReachable = response.ok || response.status === 402;
138
- }
139
- catch {
140
- // blockrunReachable already false
141
- }
142
- // Check local proxy
143
- let proxyRunning = false;
144
- try {
145
- const response = await fetch(`http://127.0.0.1:${port}/health`, {
146
- method: "GET",
147
- signal: AbortSignal.timeout(3000),
148
- });
149
- proxyRunning = response.ok;
150
- }
151
- catch {
152
- // proxyRunning already false
153
- }
154
- return {
155
- blockrunApi: { reachable: blockrunReachable, latencyMs: blockrunLatency },
156
- localProxy: { running: proxyRunning, port },
157
- };
158
- }
159
- // Collect log info
160
- async function collectLogInfo() {
161
- try {
162
- const stats = await getStats(1); // Last 1 day
163
- return {
164
- requestsLast24h: stats.totalRequests,
165
- costLast24h: `$${stats.totalCost.toFixed(4)}`,
166
- errorsFound: 0, // TODO: parse error logs
167
- };
168
- }
169
- catch {
170
- return {
171
- requestsLast24h: 0,
172
- costLast24h: "$0.00",
173
- errorsFound: 0,
174
- };
175
- }
176
- }
177
- // Identify issues
178
- function identifyIssues(result) {
179
- const issues = [];
180
- if (!result.wallet.exists) {
181
- issues.push("No wallet found");
182
- }
183
- if (result.wallet.isEmpty) {
184
- const chain = result.wallet.paymentChain === "solana" ? "Solana" : "Base";
185
- issues.push(`Wallet is empty - need to fund with USDC on ${chain}`);
186
- if (result.wallet.paymentChain === "base" && result.wallet.solanaAddress) {
187
- issues.push("Tip: if you funded Solana, run /wallet solana to switch chains");
188
- }
189
- }
190
- else if (result.wallet.isLow) {
191
- issues.push("Wallet balance is low (< $1.00)");
192
- }
193
- if (!result.network.blockrunApi.reachable) {
194
- issues.push("Cannot reach BlockRun API - check internet connection");
195
- }
196
- if (!result.network.localProxy.running) {
197
- issues.push(`Local proxy not running on port ${result.network.localProxy.port}`);
198
- }
199
- return issues;
200
- }
201
- // Print diagnostics to terminal
202
- function printDiagnostics(result) {
203
- console.log("\n🔍 Collecting diagnostics...\n");
204
- // System
205
- console.log("System");
206
- console.log(` ${green(`OS: ${result.system.os}`)}`);
207
- console.log(` ${green(`Node: ${result.system.nodeVersion}`)}`);
208
- console.log(` ${green(`Memory: ${result.system.memoryFree} free / ${result.system.memoryTotal}`)}`);
209
- // Wallet
210
- console.log("\nWallet");
211
- if (result.wallet.exists && result.wallet.valid) {
212
- console.log(` ${green(`Key: ${WALLET_FILE} (${result.wallet.source})`)}`);
213
- console.log(` ${green(`EVM Address: ${result.wallet.address}`)}`);
214
- if (result.wallet.solanaAddress) {
215
- console.log(` ${green(`Solana Address: ${result.wallet.solanaAddress}`)}`);
216
- }
217
- const chainLabel = result.wallet.paymentChain === "solana" ? "Solana" : "Base";
218
- console.log(` ${green(`Chain: ${chainLabel}`)}`);
219
- if (result.wallet.isEmpty) {
220
- console.log(` ${red(`Balance: $0.00 - NEED TO FUND WITH USDC ON ${chainLabel.toUpperCase()}!`)}`);
221
- if (result.wallet.paymentChain === "base" && result.wallet.solanaAddress) {
222
- console.log(` ${yellow(`Tip: funded Solana instead? Run /wallet solana to switch`)}`);
223
- }
224
- }
225
- else if (result.wallet.isLow) {
226
- console.log(` ${yellow(`Balance: ${result.wallet.balance} (low)`)}`);
227
- }
228
- else if (result.wallet.balance) {
229
- console.log(` ${green(`Balance: ${result.wallet.balance}`)}`);
230
- }
231
- else {
232
- console.log(` ${yellow(`Balance: checking...`)}`);
233
- }
234
- }
235
- else {
236
- console.log(` ${red("No wallet found")}`);
237
- }
238
- // Network
239
- console.log("\nNetwork");
240
- if (result.network.blockrunApi.reachable) {
241
- console.log(` ${green(`BlockRun API: reachable (${result.network.blockrunApi.latencyMs}ms)`)}`);
242
- }
243
- else {
244
- console.log(` ${red("BlockRun API: unreachable")}`);
245
- }
246
- if (result.network.localProxy.running) {
247
- console.log(` ${green(`Local proxy: running on :${result.network.localProxy.port}`)}`);
248
- }
249
- else {
250
- console.log(` ${red(`Local proxy: not running on :${result.network.localProxy.port}`)}`);
251
- }
252
- // Logs
253
- console.log("\nLogs");
254
- console.log(` ${green(`Last 24h: ${result.logs.requestsLast24h} requests, ${result.logs.costLast24h} spent`)}`);
255
- if (result.logs.errorsFound > 0) {
256
- console.log(` ${yellow(`${result.logs.errorsFound} errors found in logs`)}`);
257
- }
258
- // Issues summary
259
- if (result.issues.length > 0) {
260
- console.log("\n⚠️ Issues Found:");
261
- for (const issue of result.issues) {
262
- console.log(` • ${issue}`);
263
- }
264
- }
265
- }
266
- const DOCTOR_MODELS = {
267
- sonnet: {
268
- id: "anthropic/claude-sonnet-4.6",
269
- name: "Claude Sonnet 4.6",
270
- cost: "~$0.003",
271
- },
272
- opus: {
273
- id: "anthropic/claude-opus-4.6",
274
- name: "Claude Opus 4.6",
275
- cost: "~$0.01",
276
- },
277
- };
278
- // Send to AI for analysis
279
- async function analyzeWithAI(diagnostics, userQuestion, model = "sonnet") {
280
- // Check if wallet has funds
281
- if (diagnostics.wallet.isEmpty) {
282
- console.log("\n💳 Wallet is empty - cannot call AI for analysis.");
283
- console.log(` Fund your EVM wallet with USDC on Base: ${diagnostics.wallet.address}`);
284
- if (diagnostics.wallet.solanaAddress) {
285
- console.log(` Fund your Solana wallet with USDC: ${diagnostics.wallet.solanaAddress}`);
286
- }
287
- console.log(" Get USDC: https://www.coinbase.com/price/usd-coin");
288
- console.log(" Bridge to Base: https://bridge.base.org\n");
289
- return;
290
- }
291
- const modelConfig = DOCTOR_MODELS[model];
292
- console.log(`\n📤 Sending to ${modelConfig.name} (${modelConfig.cost})...\n`);
293
- try {
294
- const { key } = await resolveOrGenerateWalletKey();
295
- const account = privateKeyToAccount(key);
296
- const publicClient = createPublicClient({ chain: base, transport: http() });
297
- const evmSigner = toClientEvmSigner(account, publicClient);
298
- const x402 = new x402Client();
299
- registerExactEvmScheme(x402, { signer: evmSigner });
300
- const paymentFetch = wrapFetchWithPayment(fetch, x402);
301
- const response = await paymentFetch("https://blockrun.ai/api/v1/chat/completions", {
302
- method: "POST",
303
- headers: { "Content-Type": "application/json" },
304
- body: JSON.stringify({
305
- model: modelConfig.id,
306
- stream: false,
307
- messages: [
308
- {
309
- role: "system",
310
- content: `You are a technical support expert for BlockRun and ClawRouter.
311
- Analyze the diagnostics and:
312
- 1. Identify the root cause of any issues
313
- 2. Provide specific, actionable fix commands (bash)
314
- 3. Explain why the issue occurred briefly
315
- 4. Be concise but thorough
316
- 5. Format commands in code blocks`,
317
- },
318
- {
319
- role: "user",
320
- content: userQuestion
321
- ? `Here are my system diagnostics:\n\n${JSON.stringify(diagnostics, null, 2)}\n\nUser's question: ${userQuestion}`
322
- : `Here are my system diagnostics:\n\n${JSON.stringify(diagnostics, null, 2)}\n\nPlease analyze and help me fix any issues.`,
323
- },
324
- ],
325
- max_tokens: 1000,
326
- }),
327
- });
328
- if (!response.ok) {
329
- const text = await response.text();
330
- console.log(`Error: ${response.status} - ${text}`);
331
- return;
332
- }
333
- const data = await response.json();
334
- const content = data.choices?.[0]?.message?.content;
335
- if (content) {
336
- console.log("🤖 AI Analysis:\n");
337
- console.log(content);
338
- console.log();
339
- }
340
- else {
341
- console.log("Error: No response from AI");
342
- }
343
- }
344
- catch (err) {
345
- console.log(`\nError calling AI: ${err instanceof Error ? err.message : String(err)}`);
346
- console.log("Try again or check your wallet balance.\n");
347
- }
348
- }
349
- // Main entry point
350
- export async function runDoctor(userQuestion, model = "sonnet") {
351
- console.log(`\n🩺 BlockRun Doctor v${VERSION}\n`);
352
- // Collect all diagnostics
353
- const [system, wallet, network, logs] = await Promise.all([
354
- collectSystemInfo(),
355
- collectWalletInfo(),
356
- collectNetworkInfo(),
357
- collectLogInfo(),
358
- ]);
359
- const result = {
360
- version: VERSION,
361
- timestamp: new Date().toISOString(),
362
- system,
363
- wallet,
364
- network,
365
- logs,
366
- issues: [],
367
- };
368
- // Identify issues
369
- result.issues = identifyIssues(result);
370
- // Print to terminal
371
- printDiagnostics(result);
372
- // Send to AI for analysis
373
- await analyzeWithAI(result, userQuestion, model);
374
- }
375
- //# sourceMappingURL=doctor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=error-classification.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-classification.test.d.ts","sourceRoot":"","sources":["../src/error-classification.test.ts"],"names":[],"mappings":""}
@@ -1,59 +0,0 @@
1
- import { describe, it, expect } from "bun:test";
2
- import { categorizeError } from "./proxy.js";
3
- describe("categorizeError", () => {
4
- it("classifies 401 as auth_failure", () => {
5
- expect(categorizeError(401, "Unauthorized")).toBe("auth_failure");
6
- expect(categorizeError(401, "api key invalid")).toBe("auth_failure");
7
- expect(categorizeError(401, "")).toBe("auth_failure");
8
- });
9
- it("classifies 403 with quota body as quota_exceeded", () => {
10
- expect(categorizeError(403, "plan limit reached")).toBe("quota_exceeded");
11
- expect(categorizeError(403, "quota exceeded for this month")).toBe("quota_exceeded");
12
- expect(categorizeError(403, "subscription required")).toBe("quota_exceeded");
13
- });
14
- it("classifies 403 without quota body as auth_failure", () => {
15
- expect(categorizeError(403, "Forbidden")).toBe("auth_failure");
16
- expect(categorizeError(403, "")).toBe("auth_failure");
17
- });
18
- it("classifies 402 as payment_error", () => {
19
- expect(categorizeError(402, "payment required")).toBe("payment_error");
20
- expect(categorizeError(402, "")).toBe("payment_error");
21
- });
22
- it("classifies 429 as rate_limited", () => {
23
- expect(categorizeError(429, "rate limit exceeded")).toBe("rate_limited");
24
- expect(categorizeError(429, "")).toBe("rate_limited");
25
- });
26
- it("classifies 529 as overloaded", () => {
27
- expect(categorizeError(529, "")).toBe("overloaded");
28
- expect(categorizeError(529, "overloaded")).toBe("overloaded");
29
- });
30
- it("classifies 503 with overload body as overloaded", () => {
31
- expect(categorizeError(503, "service overloaded, try again")).toBe("overloaded");
32
- expect(categorizeError(503, "over capacity")).toBe("overloaded");
33
- expect(categorizeError(503, "too many requests")).toBe("overloaded");
34
- });
35
- it("classifies 503 without overload body as server_error", () => {
36
- expect(categorizeError(503, "service unavailable")).toBe("server_error");
37
- expect(categorizeError(503, "")).toBe("server_error");
38
- });
39
- it("classifies 5xx as server_error", () => {
40
- expect(categorizeError(500, "internal server error")).toBe("server_error");
41
- expect(categorizeError(502, "bad gateway")).toBe("server_error");
42
- expect(categorizeError(504, "gateway timeout")).toBe("server_error");
43
- });
44
- it("classifies 413 with size body as config_error", () => {
45
- expect(categorizeError(413, "request too large")).toBe("config_error");
46
- expect(categorizeError(413, "payload too large")).toBe("config_error");
47
- });
48
- it("classifies 200 as null (not a provider error)", () => {
49
- expect(categorizeError(200, "ok")).toBeNull();
50
- });
51
- it("classifies bare 400 with no pattern match as null", () => {
52
- expect(categorizeError(400, "bad request")).toBeNull();
53
- });
54
- it("classifies 400 with billing body as config_error", () => {
55
- expect(categorizeError(400, "billing issue with account")).toBe("config_error");
56
- expect(categorizeError(400, "insufficient balance")).toBe("config_error");
57
- });
58
- });
59
- //# sourceMappingURL=error-classification.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-classification.test.js","sourceRoot":"","sources":["../src/error-classification.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClE,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACrE,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC1E,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrF,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACvE,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACzE,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjF,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjE,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACzE,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3E,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACjE,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACvE,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChF,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}