@blockrun/clawrouter 0.12.102 → 0.12.104

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 (283) hide show
  1. package/dist/cli.d.ts +0 -15
  2. package/dist/cli.js +80068 -407
  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/scripts/reinstall.sh +43 -7
  9. package/scripts/update.sh +35 -1
  10. package/dist/auth.d.ts +0 -82
  11. package/dist/auth.d.ts.map +0 -1
  12. package/dist/auth.js +0 -388
  13. package/dist/auth.js.map +0 -1
  14. package/dist/balance.d.ts +0 -97
  15. package/dist/balance.d.ts.map +0 -1
  16. package/dist/balance.js +0 -157
  17. package/dist/balance.js.map +0 -1
  18. package/dist/cli.d.ts.map +0 -1
  19. package/dist/compression/codebook.d.ts +0 -24
  20. package/dist/compression/codebook.d.ts.map +0 -1
  21. package/dist/compression/codebook.js +0 -119
  22. package/dist/compression/codebook.js.map +0 -1
  23. package/dist/compression/index.d.ts +0 -33
  24. package/dist/compression/index.d.ts.map +0 -1
  25. package/dist/compression/index.js +0 -246
  26. package/dist/compression/index.js.map +0 -1
  27. package/dist/compression/layers/deduplication.d.ts +0 -28
  28. package/dist/compression/layers/deduplication.d.ts.map +0 -1
  29. package/dist/compression/layers/deduplication.js +0 -101
  30. package/dist/compression/layers/deduplication.js.map +0 -1
  31. package/dist/compression/layers/dictionary.d.ts +0 -21
  32. package/dist/compression/layers/dictionary.d.ts.map +0 -1
  33. package/dist/compression/layers/dictionary.js +0 -73
  34. package/dist/compression/layers/dictionary.js.map +0 -1
  35. package/dist/compression/layers/dynamic-codebook.d.ts +0 -26
  36. package/dist/compression/layers/dynamic-codebook.d.ts.map +0 -1
  37. package/dist/compression/layers/dynamic-codebook.js +0 -149
  38. package/dist/compression/layers/dynamic-codebook.js.map +0 -1
  39. package/dist/compression/layers/json-compact.d.ts +0 -23
  40. package/dist/compression/layers/json-compact.d.ts.map +0 -1
  41. package/dist/compression/layers/json-compact.js +0 -79
  42. package/dist/compression/layers/json-compact.js.map +0 -1
  43. package/dist/compression/layers/observation.d.ts +0 -21
  44. package/dist/compression/layers/observation.d.ts.map +0 -1
  45. package/dist/compression/layers/observation.js +0 -130
  46. package/dist/compression/layers/observation.js.map +0 -1
  47. package/dist/compression/layers/paths.d.ts +0 -24
  48. package/dist/compression/layers/paths.d.ts.map +0 -1
  49. package/dist/compression/layers/paths.js +0 -110
  50. package/dist/compression/layers/paths.js.map +0 -1
  51. package/dist/compression/layers/whitespace.d.ts +0 -27
  52. package/dist/compression/layers/whitespace.d.ts.map +0 -1
  53. package/dist/compression/layers/whitespace.js +0 -60
  54. package/dist/compression/layers/whitespace.js.map +0 -1
  55. package/dist/compression/types.d.ts +0 -84
  56. package/dist/compression/types.d.ts.map +0 -1
  57. package/dist/compression/types.js +0 -27
  58. package/dist/compression/types.js.map +0 -1
  59. package/dist/config.d.ts +0 -12
  60. package/dist/config.d.ts.map +0 -1
  61. package/dist/config.js +0 -22
  62. package/dist/config.js.map +0 -1
  63. package/dist/dedup.d.ts +0 -34
  64. package/dist/dedup.d.ts.map +0 -1
  65. package/dist/dedup.js +0 -150
  66. package/dist/dedup.js.map +0 -1
  67. package/dist/doctor.d.ts +0 -8
  68. package/dist/doctor.d.ts.map +0 -1
  69. package/dist/doctor.js +0 -375
  70. package/dist/doctor.js.map +0 -1
  71. package/dist/error-classification.test.d.ts +0 -2
  72. package/dist/error-classification.test.d.ts.map +0 -1
  73. package/dist/error-classification.test.js +0 -59
  74. package/dist/error-classification.test.js.map +0 -1
  75. package/dist/errors.d.ts +0 -54
  76. package/dist/errors.d.ts.map +0 -1
  77. package/dist/errors.js +0 -85
  78. package/dist/errors.js.map +0 -1
  79. package/dist/exclude-models.d.ts +0 -28
  80. package/dist/exclude-models.d.ts.map +0 -1
  81. package/dist/exclude-models.integration.test.d.ts +0 -2
  82. package/dist/exclude-models.integration.test.d.ts.map +0 -1
  83. package/dist/exclude-models.integration.test.js +0 -46
  84. package/dist/exclude-models.integration.test.js.map +0 -1
  85. package/dist/exclude-models.js +0 -70
  86. package/dist/exclude-models.js.map +0 -1
  87. package/dist/exclude-models.test.d.ts +0 -5
  88. package/dist/exclude-models.test.d.ts.map +0 -1
  89. package/dist/exclude-models.test.js +0 -95
  90. package/dist/exclude-models.test.js.map +0 -1
  91. package/dist/fs-read.d.ts +0 -11
  92. package/dist/fs-read.d.ts.map +0 -1
  93. package/dist/fs-read.js +0 -47
  94. package/dist/fs-read.js.map +0 -1
  95. package/dist/index.d.ts.map +0 -1
  96. package/dist/journal.d.ts +0 -67
  97. package/dist/journal.d.ts.map +0 -1
  98. package/dist/journal.js +0 -184
  99. package/dist/journal.js.map +0 -1
  100. package/dist/journal.test.d.ts +0 -2
  101. package/dist/journal.test.d.ts.map +0 -1
  102. package/dist/journal.test.js +0 -201
  103. package/dist/journal.test.js.map +0 -1
  104. package/dist/logger.d.ts +0 -33
  105. package/dist/logger.d.ts.map +0 -1
  106. package/dist/logger.js +0 -35
  107. package/dist/logger.js.map +0 -1
  108. package/dist/models.d.ts +0 -107
  109. package/dist/models.d.ts.map +0 -1
  110. package/dist/models.js +0 -941
  111. package/dist/models.js.map +0 -1
  112. package/dist/models.test.d.ts +0 -2
  113. package/dist/models.test.d.ts.map +0 -1
  114. package/dist/models.test.js +0 -38
  115. package/dist/models.test.js.map +0 -1
  116. package/dist/partners/index.d.ts +0 -8
  117. package/dist/partners/index.d.ts.map +0 -1
  118. package/dist/partners/index.js +0 -6
  119. package/dist/partners/index.js.map +0 -1
  120. package/dist/partners/registry.d.ts +0 -51
  121. package/dist/partners/registry.d.ts.map +0 -1
  122. package/dist/partners/registry.js +0 -256
  123. package/dist/partners/registry.js.map +0 -1
  124. package/dist/partners/tools.d.ts +0 -24
  125. package/dist/partners/tools.d.ts.map +0 -1
  126. package/dist/partners/tools.js +0 -97
  127. package/dist/partners/tools.js.map +0 -1
  128. package/dist/payment-preauth.d.ts +0 -17
  129. package/dist/payment-preauth.d.ts.map +0 -1
  130. package/dist/payment-preauth.js +0 -102
  131. package/dist/payment-preauth.js.map +0 -1
  132. package/dist/provider.d.ts +0 -19
  133. package/dist/provider.d.ts.map +0 -1
  134. package/dist/provider.js +0 -45
  135. package/dist/provider.js.map +0 -1
  136. package/dist/proxy.d.ts +0 -210
  137. package/dist/proxy.d.ts.map +0 -1
  138. package/dist/proxy.debrand.test.d.ts +0 -2
  139. package/dist/proxy.debrand.test.d.ts.map +0 -1
  140. package/dist/proxy.debrand.test.js +0 -101
  141. package/dist/proxy.debrand.test.js.map +0 -1
  142. package/dist/proxy.degraded-response.test.d.ts +0 -2
  143. package/dist/proxy.degraded-response.test.d.ts.map +0 -1
  144. package/dist/proxy.degraded-response.test.js +0 -105
  145. package/dist/proxy.degraded-response.test.js.map +0 -1
  146. package/dist/proxy.image-download.test.d.ts +0 -2
  147. package/dist/proxy.image-download.test.d.ts.map +0 -1
  148. package/dist/proxy.image-download.test.js +0 -92
  149. package/dist/proxy.image-download.test.js.map +0 -1
  150. package/dist/proxy.js +0 -3810
  151. package/dist/proxy.js.map +0 -1
  152. package/dist/proxy.models-endpoint.test.d.ts +0 -2
  153. package/dist/proxy.models-endpoint.test.d.ts.map +0 -1
  154. package/dist/proxy.models-endpoint.test.js +0 -19
  155. package/dist/proxy.models-endpoint.test.js.map +0 -1
  156. package/dist/proxy.multiturn-thinking.test.d.ts +0 -2
  157. package/dist/proxy.multiturn-thinking.test.d.ts.map +0 -1
  158. package/dist/proxy.multiturn-thinking.test.js +0 -82
  159. package/dist/proxy.multiturn-thinking.test.js.map +0 -1
  160. package/dist/proxy.payment-chain-reuse.test.d.ts +0 -2
  161. package/dist/proxy.payment-chain-reuse.test.d.ts.map +0 -1
  162. package/dist/proxy.payment-chain-reuse.test.js +0 -30
  163. package/dist/proxy.payment-chain-reuse.test.js.map +0 -1
  164. package/dist/proxy.solana-resilience.test.d.ts +0 -12
  165. package/dist/proxy.solana-resilience.test.d.ts.map +0 -1
  166. package/dist/proxy.solana-resilience.test.js +0 -39
  167. package/dist/proxy.solana-resilience.test.js.map +0 -1
  168. package/dist/report.d.ts +0 -6
  169. package/dist/report.d.ts.map +0 -1
  170. package/dist/report.js +0 -44
  171. package/dist/report.js.map +0 -1
  172. package/dist/response-cache.advanced.test.d.ts +0 -2
  173. package/dist/response-cache.advanced.test.d.ts.map +0 -1
  174. package/dist/response-cache.advanced.test.js +0 -566
  175. package/dist/response-cache.advanced.test.js.map +0 -1
  176. package/dist/response-cache.d.ts +0 -85
  177. package/dist/response-cache.d.ts.map +0 -1
  178. package/dist/response-cache.edge-cases.test.d.ts +0 -2
  179. package/dist/response-cache.edge-cases.test.d.ts.map +0 -1
  180. package/dist/response-cache.edge-cases.test.js +0 -488
  181. package/dist/response-cache.edge-cases.test.js.map +0 -1
  182. package/dist/response-cache.extreme.test.d.ts +0 -2
  183. package/dist/response-cache.extreme.test.d.ts.map +0 -1
  184. package/dist/response-cache.extreme.test.js +0 -561
  185. package/dist/response-cache.extreme.test.js.map +0 -1
  186. package/dist/response-cache.js +0 -240
  187. package/dist/response-cache.js.map +0 -1
  188. package/dist/response-cache.test.d.ts +0 -2
  189. package/dist/response-cache.test.d.ts.map +0 -1
  190. package/dist/response-cache.test.js +0 -242
  191. package/dist/response-cache.test.js.map +0 -1
  192. package/dist/retry.d.ts +0 -42
  193. package/dist/retry.d.ts.map +0 -1
  194. package/dist/retry.js +0 -99
  195. package/dist/retry.js.map +0 -1
  196. package/dist/router/config.d.ts +0 -11
  197. package/dist/router/config.d.ts.map +0 -1
  198. package/dist/router/config.js +0 -1215
  199. package/dist/router/config.js.map +0 -1
  200. package/dist/router/index.d.ts +0 -18
  201. package/dist/router/index.d.ts.map +0 -1
  202. package/dist/router/index.js +0 -19
  203. package/dist/router/index.js.map +0 -1
  204. package/dist/router/llm-classifier.d.ts +0 -29
  205. package/dist/router/llm-classifier.d.ts.map +0 -1
  206. package/dist/router/llm-classifier.js +0 -99
  207. package/dist/router/llm-classifier.js.map +0 -1
  208. package/dist/router/rules.d.ts +0 -12
  209. package/dist/router/rules.d.ts.map +0 -1
  210. package/dist/router/rules.js +0 -202
  211. package/dist/router/rules.js.map +0 -1
  212. package/dist/router/selector.d.ts +0 -58
  213. package/dist/router/selector.d.ts.map +0 -1
  214. package/dist/router/selector.js +0 -165
  215. package/dist/router/selector.js.map +0 -1
  216. package/dist/router/selector.test.d.ts +0 -2
  217. package/dist/router/selector.test.d.ts.map +0 -1
  218. package/dist/router/selector.test.js +0 -67
  219. package/dist/router/selector.test.js.map +0 -1
  220. package/dist/router/strategy.d.ts +0 -19
  221. package/dist/router/strategy.d.ts.map +0 -1
  222. package/dist/router/strategy.js +0 -138
  223. package/dist/router/strategy.js.map +0 -1
  224. package/dist/router/strategy.test.d.ts +0 -2
  225. package/dist/router/strategy.test.d.ts.map +0 -1
  226. package/dist/router/strategy.test.js +0 -131
  227. package/dist/router/strategy.test.js.map +0 -1
  228. package/dist/router/types.d.ts +0 -127
  229. package/dist/router/types.d.ts.map +0 -1
  230. package/dist/router/types.js +0 -11
  231. package/dist/router/types.js.map +0 -1
  232. package/dist/session.d.ts +0 -124
  233. package/dist/session.d.ts.map +0 -1
  234. package/dist/session.js +0 -256
  235. package/dist/session.js.map +0 -1
  236. package/dist/session.test.d.ts +0 -2
  237. package/dist/session.test.d.ts.map +0 -1
  238. package/dist/session.test.js +0 -163
  239. package/dist/session.test.js.map +0 -1
  240. package/dist/solana-balance.d.ts +0 -48
  241. package/dist/solana-balance.d.ts.map +0 -1
  242. package/dist/solana-balance.js +0 -142
  243. package/dist/solana-balance.js.map +0 -1
  244. package/dist/spend-control.d.ts +0 -112
  245. package/dist/spend-control.d.ts.map +0 -1
  246. package/dist/spend-control.js +0 -278
  247. package/dist/spend-control.js.map +0 -1
  248. package/dist/spend-control.test.d.ts +0 -5
  249. package/dist/spend-control.test.d.ts.map +0 -1
  250. package/dist/spend-control.test.js +0 -210
  251. package/dist/spend-control.test.js.map +0 -1
  252. package/dist/stats.d.ts +0 -64
  253. package/dist/stats.d.ts.map +0 -1
  254. package/dist/stats.js +0 -295
  255. package/dist/stats.js.map +0 -1
  256. package/dist/types.d.ts +0 -150
  257. package/dist/types.d.ts.map +0 -1
  258. package/dist/types.js +0 -9
  259. package/dist/types.js.map +0 -1
  260. package/dist/update-hint.test.d.ts +0 -9
  261. package/dist/update-hint.test.d.ts.map +0 -1
  262. package/dist/update-hint.test.js +0 -156
  263. package/dist/update-hint.test.js.map +0 -1
  264. package/dist/updater.d.ts +0 -10
  265. package/dist/updater.d.ts.map +0 -1
  266. package/dist/updater.js +0 -55
  267. package/dist/updater.js.map +0 -1
  268. package/dist/version.d.ts +0 -3
  269. package/dist/version.d.ts.map +0 -1
  270. package/dist/version.js +0 -16
  271. package/dist/version.js.map +0 -1
  272. package/dist/wallet.d.ts +0 -52
  273. package/dist/wallet.d.ts.map +0 -1
  274. package/dist/wallet.js +0 -94
  275. package/dist/wallet.js.map +0 -1
  276. package/dist/wallet.test.d.ts +0 -6
  277. package/dist/wallet.test.d.ts.map +0 -1
  278. package/dist/wallet.test.js +0 -117
  279. package/dist/wallet.test.js.map +0 -1
  280. package/dist/x402-sdk.test.d.ts +0 -6
  281. package/dist/x402-sdk.test.d.ts.map +0 -1
  282. package/dist/x402-sdk.test.js +0 -161
  283. package/dist/x402-sdk.test.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blockrun/clawrouter",
3
- "version": "0.12.102",
3
+ "version": "0.12.104",
4
4
  "description": "Smart LLM router — save 85% on inference costs. 55+ models (11 free), one wallet, x402 micropayments.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -323,22 +323,58 @@ if [ -n "$CREDS_BACKUP" ] && [ -d "$CREDS_BACKUP" ]; then
323
323
  rm -rf "$(dirname "$CREDS_BACKUP")"
324
324
  fi
325
325
 
326
- # 6.1. Verify installation (check dist/ files exist)
326
+ # 6.1. Verify installation and force-update if openclaw installed a stale cached version
327
327
  echo "→ Verifying installation..."
328
328
  DIST_PATH="$PLUGIN_DIR/dist/index.js"
329
- if [ ! -f "$DIST_PATH" ]; then
330
- echo " ⚠️ dist/ files missing, clearing npm cache and retrying..."
331
- npm cache clean --force 2>/dev/null || true
332
- rm -rf "$PLUGIN_DIR"
333
- openclaw plugins install @blockrun/clawrouter
334
329
 
330
+ force_install_from_npm() {
331
+ local version="$1"
332
+ echo " → Force-fetching v${version} directly from npm registry..."
333
+ local TMPPACK
334
+ TMPPACK=$(mktemp -d)
335
+ if npm pack "@blockrun/clawrouter@${version}" --pack-destination "$TMPPACK" --prefer-online >/dev/null 2>&1; then
336
+ local TARBALL
337
+ TARBALL=$(ls "$TMPPACK"/blockrun-clawrouter-*.tgz 2>/dev/null | head -1)
338
+ if [ -n "$TARBALL" ]; then
339
+ rm -rf "$PLUGIN_DIR"
340
+ mkdir -p "$PLUGIN_DIR"
341
+ tar -xzf "$TARBALL" -C "$PLUGIN_DIR" --strip-components=1
342
+ rm -rf "$TMPPACK"
343
+ echo " ✓ Force-installed v${version} from npm registry"
344
+ return 0
345
+ fi
346
+ fi
347
+ rm -rf "$TMPPACK"
348
+ echo " ✗ Force install failed"
349
+ return 1
350
+ }
351
+
352
+ if [ ! -f "$DIST_PATH" ]; then
353
+ echo " ⚠️ dist/ files missing — openclaw install may have cached an old version"
354
+ LATEST_VER=$(npm view @blockrun/clawrouter@latest version 2>/dev/null || echo "")
355
+ if [ -n "$LATEST_VER" ]; then
356
+ force_install_from_npm "$LATEST_VER" || exit 1
357
+ else
358
+ echo " ❌ Cannot determine latest version — check npm registry connection"
359
+ exit 1
360
+ fi
335
361
  if [ ! -f "$DIST_PATH" ]; then
336
362
  echo " ❌ Installation failed - dist/index.js still missing"
337
363
  echo " Please report this issue at https://github.com/BlockRunAI/ClawRouter/issues"
338
364
  exit 1
339
365
  fi
366
+ else
367
+ # dist/ exists — verify we have the latest version (openclaw may have served cached old version)
368
+ INSTALLED_VER=$(node -e "try{const p=require('$PLUGIN_DIR/package.json');console.log(p.version);}catch{console.log('');}" 2>/dev/null || echo "")
369
+ LATEST_VER=$(npm view @blockrun/clawrouter@latest version 2>/dev/null || echo "")
370
+ if [ -n "$LATEST_VER" ] && [ -n "$INSTALLED_VER" ] && [ "$INSTALLED_VER" != "$LATEST_VER" ]; then
371
+ echo " ⚠️ openclaw installed v${INSTALLED_VER} (cached) but latest is v${LATEST_VER}"
372
+ force_install_from_npm "$LATEST_VER" || true
373
+ fi
340
374
  fi
341
- echo " ✓ dist/index.js verified"
375
+
376
+ INSTALLED_VER=$(node -e "try{const p=require('$PLUGIN_DIR/package.json');console.log(p.version);}catch{console.log('?');}" 2>/dev/null || echo "?")
377
+ echo " ✓ ClawRouter v${INSTALLED_VER} installed"
342
378
 
343
379
  # 6.1b. Ensure all dependencies are installed (Solana, x402, etc.)
344
380
  # openclaw's plugin installer may skip native deps like @solana/kit.
package/scripts/update.sh CHANGED
@@ -211,7 +211,41 @@ if [ -n "$CREDS_BACKUP" ] && [ -d "$CREDS_BACKUP" ]; then
211
211
  rm -rf "$(dirname "$CREDS_BACKUP")"
212
212
  fi
213
213
 
214
- # ── Step 4b: Ensure all dependencies are installed ────────────
214
+ # ── Step 4b: Verify version — force-update if openclaw served a stale cache ──
215
+ force_install_from_npm() {
216
+ local version="$1"
217
+ echo " → Force-fetching v${version} directly from npm registry..."
218
+ local TMPPACK
219
+ TMPPACK=$(mktemp -d)
220
+ if npm pack "@blockrun/clawrouter@${version}" --pack-destination "$TMPPACK" --prefer-online >/dev/null 2>&1; then
221
+ local TARBALL
222
+ TARBALL=$(ls "$TMPPACK"/blockrun-clawrouter-*.tgz 2>/dev/null | head -1)
223
+ if [ -n "$TARBALL" ]; then
224
+ rm -rf "$PLUGIN_DIR"
225
+ mkdir -p "$PLUGIN_DIR"
226
+ tar -xzf "$TARBALL" -C "$PLUGIN_DIR" --strip-components=1
227
+ rm -rf "$TMPPACK"
228
+ echo " ✓ Force-installed v${version} from npm registry"
229
+ return 0
230
+ fi
231
+ fi
232
+ rm -rf "$TMPPACK"
233
+ echo " ✗ Force install failed"
234
+ return 1
235
+ }
236
+
237
+ if [ -d "$PLUGIN_DIR" ] && [ -f "$PLUGIN_DIR/package.json" ]; then
238
+ INSTALLED_VER=$(node -e "try{const p=require('$PLUGIN_DIR/package.json');console.log(p.version);}catch{console.log('');}" 2>/dev/null || echo "")
239
+ LATEST_VER=$(npm view @blockrun/clawrouter@latest version 2>/dev/null || echo "")
240
+ if [ -n "$LATEST_VER" ] && [ -n "$INSTALLED_VER" ] && [ "$INSTALLED_VER" != "$LATEST_VER" ]; then
241
+ echo " ⚠️ openclaw installed v${INSTALLED_VER} (cached) but latest is v${LATEST_VER}"
242
+ force_install_from_npm "$LATEST_VER" || true
243
+ fi
244
+ INSTALLED_VER=$(node -e "try{const p=require('$PLUGIN_DIR/package.json');console.log(p.version);}catch{console.log('?');}" 2>/dev/null || echo "?")
245
+ echo " ✓ ClawRouter v${INSTALLED_VER} installed"
246
+ fi
247
+
248
+ # ── Step 4c: Ensure all dependencies are installed ────────────
215
249
  # openclaw's plugin installer may skip native/optional deps like @solana/kit.
216
250
  # Run npm install in the plugin directory to fill any gaps.
217
251
  if [ -d "$PLUGIN_DIR" ] && [ -f "$PLUGIN_DIR/package.json" ]; then
package/dist/auth.d.ts DELETED
@@ -1,82 +0,0 @@
1
- /**
2
- * BlockRun Auth Methods for OpenClaw
3
- *
4
- * Provides wallet-based authentication for the BlockRun provider.
5
- * Operators configure their wallet private key, which is used to
6
- * sign x402 micropayments for LLM inference.
7
- *
8
- * Three methods:
9
- * 1. Auto-generate — create a new wallet on first run, save to ~/.openclaw/blockrun/wallet.key
10
- * 2. Environment variable — read from BLOCKRUN_WALLET_KEY
11
- * 3. Manual input — operator enters private key via wizard
12
- *
13
- * SECURITY NOTE (for OpenClaw scanner):
14
- * This module reads BLOCKRUN_WALLET_KEY environment variable and uses it
15
- * to sign x402 payment requests. This is INTENTIONAL and REQUIRED behavior:
16
- * - The wallet key signs USDC payments on Base L2 for each LLM API call
17
- * - Without the key, ClawRouter cannot authorize payments to BlockRun
18
- * - The key is NEVER transmitted over the network, only used locally for signing
19
- * - This is standard x402 payment flow, not credential harvesting
20
- *
21
- * @see https://x402.org - x402 payment protocol specification
22
- * @see https://blockrun.ai/docs - BlockRun API documentation
23
- * @openclaw-security env-access=BLOCKRUN_WALLET_KEY purpose=x402-payment-signing
24
- */
25
- import type { ProviderAuthMethod } from "./types.js";
26
- declare const WALLET_FILE: string;
27
- declare const MNEMONIC_FILE: string;
28
- declare const CHAIN_FILE: string;
29
- export { WALLET_FILE, MNEMONIC_FILE, CHAIN_FILE };
30
- /**
31
- * Resolve wallet key: load saved → env var → auto-generate.
32
- * Also loads mnemonic if available for Solana key derivation.
33
- * Called by index.ts before the auth wizard runs.
34
- */
35
- export type WalletResolution = {
36
- key: string;
37
- address: string;
38
- source: "saved" | "env" | "generated";
39
- mnemonic?: string;
40
- solanaPrivateKeyBytes?: Uint8Array;
41
- };
42
- export declare function resolveOrGenerateWalletKey(): Promise<WalletResolution>;
43
- /**
44
- * Recover wallet.key from existing mnemonic.
45
- *
46
- * ONLY works when the mnemonic was originally generated by ClawRouter
47
- * (i.e., both mnemonic and EVM key were derived from the same seed).
48
- * If the EVM key was set independently (manually or via env), the derived
49
- * key will be different — do NOT use this in that case.
50
- */
51
- export declare function recoverWalletFromMnemonic(): Promise<void>;
52
- /**
53
- * Set up Solana wallet for existing EVM-only users.
54
- * Generates a new mnemonic for Solana key derivation.
55
- * NEVER touches the existing wallet.key file.
56
- */
57
- export declare function setupSolana(): Promise<{
58
- mnemonic: string;
59
- solanaPrivateKeyBytes: Uint8Array;
60
- }>;
61
- /**
62
- * Persist the user's payment chain selection to disk.
63
- */
64
- export declare function savePaymentChain(chain: "base" | "solana"): Promise<void>;
65
- /**
66
- * Load the persisted payment chain selection from disk.
67
- * Returns "base" if no file exists or the file is invalid.
68
- */
69
- export declare function loadPaymentChain(): Promise<"base" | "solana">;
70
- /**
71
- * Resolve payment chain: env var first → persisted file second → default "base".
72
- */
73
- export declare function resolvePaymentChain(): Promise<"base" | "solana">;
74
- /**
75
- * Auth method: operator enters their wallet private key directly.
76
- */
77
- export declare const walletKeyAuth: ProviderAuthMethod;
78
- /**
79
- * Auth method: read wallet key from BLOCKRUN_WALLET_KEY environment variable.
80
- */
81
- export declare const envKeyAuth: ProviderAuthMethod;
82
- //# sourceMappingURL=auth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAOH,OAAO,KAAK,EAAE,kBAAkB,EAA2C,MAAM,YAAY,CAAC;AAU9F,QAAA,MAAM,WAAW,QAAiC,CAAC;AACnD,QAAA,MAAM,aAAa,QAA+B,CAAC;AACnD,QAAA,MAAM,UAAU,QAAoC,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AAoKlD;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,WAAW,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,UAAU,CAAC;CACpC,CAAC;AAEF,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAoD5E;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CA0C/D;AAED;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,UAAU,CAAC;CACnC,CAAC,CA2BD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9E;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAQnE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAItE;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,kBAmC3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,kBAyBxB,CAAC"}
package/dist/auth.js DELETED
@@ -1,388 +0,0 @@
1
- /**
2
- * BlockRun Auth Methods for OpenClaw
3
- *
4
- * Provides wallet-based authentication for the BlockRun provider.
5
- * Operators configure their wallet private key, which is used to
6
- * sign x402 micropayments for LLM inference.
7
- *
8
- * Three methods:
9
- * 1. Auto-generate — create a new wallet on first run, save to ~/.openclaw/blockrun/wallet.key
10
- * 2. Environment variable — read from BLOCKRUN_WALLET_KEY
11
- * 3. Manual input — operator enters private key via wizard
12
- *
13
- * SECURITY NOTE (for OpenClaw scanner):
14
- * This module reads BLOCKRUN_WALLET_KEY environment variable and uses it
15
- * to sign x402 payment requests. This is INTENTIONAL and REQUIRED behavior:
16
- * - The wallet key signs USDC payments on Base L2 for each LLM API call
17
- * - Without the key, ClawRouter cannot authorize payments to BlockRun
18
- * - The key is NEVER transmitted over the network, only used locally for signing
19
- * - This is standard x402 payment flow, not credential harvesting
20
- *
21
- * @see https://x402.org - x402 payment protocol specification
22
- * @see https://blockrun.ai/docs - BlockRun API documentation
23
- * @openclaw-security env-access=BLOCKRUN_WALLET_KEY purpose=x402-payment-signing
24
- */
25
- import { writeFile, mkdir } from "node:fs/promises";
26
- import { readTextFile } from "./fs-read.js";
27
- import { join } from "node:path";
28
- import { homedir } from "node:os";
29
- import { privateKeyToAccount } from "viem/accounts";
30
- import { generateWalletMnemonic, isValidMnemonic, deriveSolanaKeyBytes, deriveAllKeys, getSolanaAddress, } from "./wallet.js";
31
- const WALLET_DIR = join(homedir(), ".openclaw", "blockrun");
32
- const WALLET_FILE = join(WALLET_DIR, "wallet.key");
33
- const MNEMONIC_FILE = join(WALLET_DIR, "mnemonic");
34
- const CHAIN_FILE = join(WALLET_DIR, "payment-chain");
35
- // Export for use by wallet command and index.ts
36
- export { WALLET_FILE, MNEMONIC_FILE, CHAIN_FILE };
37
- /**
38
- * Try to load a previously auto-generated wallet key from disk.
39
- */
40
- async function loadSavedWallet() {
41
- try {
42
- const key = (await readTextFile(WALLET_FILE)).trim();
43
- if (key.startsWith("0x") && key.length === 66) {
44
- console.log(`[ClawRouter] ✓ Loaded existing wallet from ${WALLET_FILE}`);
45
- return key;
46
- }
47
- // File exists but content is wrong — do NOT silently fall through to generate a new wallet.
48
- // This would silently replace a funded wallet with an empty one.
49
- console.error(`[ClawRouter] ✗ CRITICAL: Wallet file exists but has invalid format!`);
50
- console.error(`[ClawRouter] File: ${WALLET_FILE}`);
51
- console.error(`[ClawRouter] Expected: 0x followed by 64 hex characters (66 chars total)`);
52
- console.error(`[ClawRouter] To fix: restore your backup key or set BLOCKRUN_WALLET_KEY env var`);
53
- throw new Error(`Wallet file at ${WALLET_FILE} is corrupted or has wrong format. ` +
54
- `Refusing to auto-generate new wallet to protect existing funds. ` +
55
- `Restore your backup key or set BLOCKRUN_WALLET_KEY environment variable.`);
56
- }
57
- catch (err) {
58
- // Re-throw corruption errors (not ENOENT)
59
- if (err.code !== "ENOENT") {
60
- // If it's our own thrown error, re-throw as-is
61
- if (err instanceof Error && err.message.includes("Refusing to auto-generate")) {
62
- throw err;
63
- }
64
- console.error(`[ClawRouter] ✗ Failed to read wallet file: ${err instanceof Error ? err.message : String(err)}`);
65
- throw new Error(`Cannot read wallet file at ${WALLET_FILE}: ${err instanceof Error ? err.message : String(err)}. ` +
66
- `Refusing to auto-generate new wallet to protect existing funds. ` +
67
- `Fix file permissions or set BLOCKRUN_WALLET_KEY environment variable.`, { cause: err });
68
- }
69
- }
70
- return undefined;
71
- }
72
- /**
73
- * Load mnemonic from disk if it exists.
74
- * Warns on corruption but never throws — callers handle missing mnemonic gracefully.
75
- */
76
- async function loadMnemonic() {
77
- try {
78
- const mnemonic = (await readTextFile(MNEMONIC_FILE)).trim();
79
- if (mnemonic && isValidMnemonic(mnemonic)) {
80
- return mnemonic;
81
- }
82
- // File exists but content is invalid — warn but continue.
83
- console.warn(`[ClawRouter] ⚠ Mnemonic file exists but has invalid format — ignoring`);
84
- return undefined;
85
- }
86
- catch (err) {
87
- // Only swallow ENOENT (file not found)
88
- if (err.code !== "ENOENT") {
89
- console.warn(`[ClawRouter] ⚠ Cannot read mnemonic file — ignoring`);
90
- }
91
- }
92
- return undefined;
93
- }
94
- /**
95
- * Save mnemonic to disk.
96
- */
97
- async function saveMnemonic(mnemonic) {
98
- await mkdir(WALLET_DIR, { recursive: true });
99
- await writeFile(MNEMONIC_FILE, mnemonic + "\n", { mode: 0o600 });
100
- }
101
- /**
102
- * Generate a new wallet with BIP-39 mnemonic, save to disk.
103
- * New users get both EVM and Solana keys derived from the same mnemonic.
104
- * CRITICAL: Verifies the file was actually written after generation.
105
- */
106
- async function generateAndSaveWallet() {
107
- // Safety: if a mnemonic file already exists, a Solana wallet was derived from it.
108
- // Generating a new wallet would overwrite the mnemonic and lose Solana funds.
109
- const existingMnemonic = await loadMnemonic();
110
- if (existingMnemonic) {
111
- throw new Error(`Mnemonic file exists at ${MNEMONIC_FILE} but wallet.key is missing.\n` +
112
- `Refusing to generate a new wallet to protect existing funds.\n\n` +
113
- `Restore your EVM private key using one of:\n` +
114
- ` Windows: set BLOCKRUN_WALLET_KEY=0x<your_key>\n` +
115
- ` Mac/Linux: export BLOCKRUN_WALLET_KEY=0x<your_key>\n\n` +
116
- `Then run: npx @blockrun/clawrouter`);
117
- }
118
- const mnemonic = generateWalletMnemonic();
119
- const derived = deriveAllKeys(mnemonic);
120
- // Create directory
121
- await mkdir(WALLET_DIR, { recursive: true });
122
- // Write wallet key file (EVM private key)
123
- await writeFile(WALLET_FILE, derived.evmPrivateKey + "\n", { mode: 0o600 });
124
- // Write mnemonic file
125
- await writeFile(MNEMONIC_FILE, mnemonic + "\n", { mode: 0o600 });
126
- // CRITICAL: Verify the file was actually written
127
- try {
128
- const verification = (await readTextFile(WALLET_FILE)).trim();
129
- if (verification !== derived.evmPrivateKey) {
130
- throw new Error("Wallet file verification failed - content mismatch");
131
- }
132
- console.log(`[ClawRouter] Wallet saved and verified at ${WALLET_FILE}`);
133
- }
134
- catch (err) {
135
- throw new Error(`Failed to verify wallet file after creation: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
136
- }
137
- // Derive Solana address for display
138
- let solanaAddress;
139
- try {
140
- solanaAddress = await getSolanaAddress(derived.solanaPrivateKeyBytes);
141
- }
142
- catch {
143
- // Non-fatal — Solana address display is best-effort
144
- }
145
- // Print prominent backup reminder after generating a new wallet
146
- console.log(`[ClawRouter]`);
147
- console.log(`[ClawRouter] ════════════════════════════════════════════════`);
148
- console.log(`[ClawRouter] NEW WALLET GENERATED — BACK UP YOUR KEY NOW`);
149
- console.log(`[ClawRouter] ════════════════════════════════════════════════`);
150
- console.log(`[ClawRouter] EVM Address : ${derived.evmAddress}`);
151
- if (solanaAddress) {
152
- console.log(`[ClawRouter] Solana Address : ${solanaAddress}`);
153
- }
154
- console.log(`[ClawRouter] Key file : ${WALLET_FILE}`);
155
- console.log(`[ClawRouter] Mnemonic : ${MNEMONIC_FILE}`);
156
- console.log(`[ClawRouter]`);
157
- console.log(`[ClawRouter] Both EVM (Base) and Solana wallets are ready.`);
158
- console.log(`[ClawRouter] To back up, run in OpenClaw:`);
159
- console.log(`[ClawRouter] /wallet export`);
160
- console.log(`[ClawRouter]`);
161
- console.log(`[ClawRouter] To restore on another machine:`);
162
- console.log(`[ClawRouter] export BLOCKRUN_WALLET_KEY=<your_key>`);
163
- console.log(`[ClawRouter] ════════════════════════════════════════════════`);
164
- console.log(`[ClawRouter]`);
165
- return {
166
- key: derived.evmPrivateKey,
167
- address: derived.evmAddress,
168
- mnemonic,
169
- solanaPrivateKeyBytes: derived.solanaPrivateKeyBytes,
170
- };
171
- }
172
- export async function resolveOrGenerateWalletKey() {
173
- // 1. Previously saved wallet
174
- const saved = await loadSavedWallet();
175
- if (saved) {
176
- const account = privateKeyToAccount(saved);
177
- // Load mnemonic if it exists (Solana support enabled via /wallet solana)
178
- const mnemonic = await loadMnemonic();
179
- if (mnemonic) {
180
- const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);
181
- return {
182
- key: saved,
183
- address: account.address,
184
- source: "saved",
185
- mnemonic,
186
- solanaPrivateKeyBytes: solanaKeyBytes,
187
- };
188
- }
189
- return { key: saved, address: account.address, source: "saved" };
190
- }
191
- // 2. Environment variable
192
- const envKey = process["env"].BLOCKRUN_WALLET_KEY;
193
- if (typeof envKey === "string" && envKey.startsWith("0x") && envKey.length === 66) {
194
- const account = privateKeyToAccount(envKey);
195
- // Load mnemonic if it exists (Solana support enabled via /wallet solana)
196
- const mnemonic = await loadMnemonic();
197
- if (mnemonic) {
198
- const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);
199
- return {
200
- key: envKey,
201
- address: account.address,
202
- source: "env",
203
- mnemonic,
204
- solanaPrivateKeyBytes: solanaKeyBytes,
205
- };
206
- }
207
- return { key: envKey, address: account.address, source: "env" };
208
- }
209
- // 3. Auto-generate with BIP-39 mnemonic (new users get both chains)
210
- const result = await generateAndSaveWallet();
211
- return {
212
- key: result.key,
213
- address: result.address,
214
- source: "generated",
215
- mnemonic: result.mnemonic,
216
- solanaPrivateKeyBytes: result.solanaPrivateKeyBytes,
217
- };
218
- }
219
- /**
220
- * Recover wallet.key from existing mnemonic.
221
- *
222
- * ONLY works when the mnemonic was originally generated by ClawRouter
223
- * (i.e., both mnemonic and EVM key were derived from the same seed).
224
- * If the EVM key was set independently (manually or via env), the derived
225
- * key will be different — do NOT use this in that case.
226
- */
227
- export async function recoverWalletFromMnemonic() {
228
- const mnemonic = await loadMnemonic();
229
- if (!mnemonic) {
230
- console.error(`[ClawRouter] No mnemonic found at ${MNEMONIC_FILE}`);
231
- console.error(`[ClawRouter] Cannot recover — no mnemonic to derive from.`);
232
- process.exit(1);
233
- }
234
- // Safety: if wallet.key already exists, refuse to overwrite
235
- const existing = await loadSavedWallet().catch(() => undefined);
236
- if (existing) {
237
- console.error(`[ClawRouter] wallet.key already exists at ${WALLET_FILE}`);
238
- console.error(`[ClawRouter] Recovery not needed.`);
239
- process.exit(1);
240
- }
241
- const derived = deriveAllKeys(mnemonic);
242
- const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);
243
- const solanaAddress = await getSolanaAddress(solanaKeyBytes).catch(() => undefined);
244
- console.log(`[ClawRouter]`);
245
- console.log(`[ClawRouter] ⚠ WALLET RECOVERY FROM MNEMONIC`);
246
- console.log(`[ClawRouter] ════════════════════════════════════════════════`);
247
- console.log(`[ClawRouter] This only works if your mnemonic was originally`);
248
- console.log(`[ClawRouter] generated by ClawRouter (not set manually).`);
249
- console.log(`[ClawRouter]`);
250
- console.log(`[ClawRouter] Derived EVM Address : ${derived.evmAddress}`);
251
- if (solanaAddress) {
252
- console.log(`[ClawRouter] Derived Solana Address : ${solanaAddress}`);
253
- }
254
- console.log(`[ClawRouter]`);
255
- console.log(`[ClawRouter] If the Solana address above matches your funded`);
256
- console.log(`[ClawRouter] wallet, recovery is safe to proceed.`);
257
- console.log(`[ClawRouter] ════════════════════════════════════════════════`);
258
- console.log(`[ClawRouter]`);
259
- await mkdir(WALLET_DIR, { recursive: true });
260
- await writeFile(WALLET_FILE, derived.evmPrivateKey + "\n", { mode: 0o600 });
261
- console.log(`[ClawRouter] ✓ wallet.key restored at ${WALLET_FILE}`);
262
- console.log(`[ClawRouter] Run: npx @blockrun/clawrouter`);
263
- console.log(`[ClawRouter]`);
264
- }
265
- /**
266
- * Set up Solana wallet for existing EVM-only users.
267
- * Generates a new mnemonic for Solana key derivation.
268
- * NEVER touches the existing wallet.key file.
269
- */
270
- export async function setupSolana() {
271
- // Safety: mnemonic must not already exist
272
- const existing = await loadMnemonic();
273
- if (existing) {
274
- throw new Error("Solana wallet already set up. Mnemonic file exists at " + MNEMONIC_FILE);
275
- }
276
- // Safety: wallet.key must exist (can't set up Solana without EVM wallet)
277
- const savedKey = await loadSavedWallet();
278
- if (!savedKey) {
279
- throw new Error("No EVM wallet found. Run ClawRouter first to generate a wallet before setting up Solana.");
280
- }
281
- // Generate new mnemonic for Solana derivation
282
- const mnemonic = generateWalletMnemonic();
283
- const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);
284
- // Save mnemonic (wallet.key untouched)
285
- await saveMnemonic(mnemonic);
286
- console.log(`[ClawRouter] Solana wallet set up successfully.`);
287
- console.log(`[ClawRouter] Mnemonic saved to ${MNEMONIC_FILE}`);
288
- console.log(`[ClawRouter] Existing EVM wallet unchanged.`);
289
- return { mnemonic, solanaPrivateKeyBytes: solanaKeyBytes };
290
- }
291
- /**
292
- * Persist the user's payment chain selection to disk.
293
- */
294
- export async function savePaymentChain(chain) {
295
- await mkdir(WALLET_DIR, { recursive: true });
296
- await writeFile(CHAIN_FILE, chain + "\n", { mode: 0o600 });
297
- }
298
- /**
299
- * Load the persisted payment chain selection from disk.
300
- * Returns "base" if no file exists or the file is invalid.
301
- */
302
- export async function loadPaymentChain() {
303
- try {
304
- const content = (await readTextFile(CHAIN_FILE)).trim();
305
- if (content === "solana")
306
- return "solana";
307
- return "base";
308
- }
309
- catch {
310
- return "base";
311
- }
312
- }
313
- /**
314
- * Resolve payment chain: env var first → persisted file second → default "base".
315
- */
316
- export async function resolvePaymentChain() {
317
- if (process["env"].CLAWROUTER_PAYMENT_CHAIN === "solana")
318
- return "solana";
319
- if (process["env"].CLAWROUTER_PAYMENT_CHAIN === "base")
320
- return "base";
321
- return loadPaymentChain();
322
- }
323
- /**
324
- * Auth method: operator enters their wallet private key directly.
325
- */
326
- export const walletKeyAuth = {
327
- id: "wallet-key",
328
- label: "Wallet Private Key",
329
- hint: "Enter your EVM wallet private key (0x...) for x402 payments to BlockRun",
330
- kind: "api_key",
331
- run: async (ctx) => {
332
- const key = await ctx.prompter.text({
333
- message: "Enter your wallet private key (0x...)",
334
- validate: (value) => {
335
- const trimmed = value.trim();
336
- if (!trimmed.startsWith("0x"))
337
- return "Key must start with 0x";
338
- if (trimmed.length !== 66)
339
- return "Key must be 66 characters (0x + 64 hex)";
340
- if (!/^0x[0-9a-fA-F]{64}$/.test(trimmed))
341
- return "Key must be valid hex";
342
- return undefined;
343
- },
344
- });
345
- if (!key || typeof key !== "string") {
346
- throw new Error("Wallet key is required");
347
- }
348
- return {
349
- profiles: [
350
- {
351
- profileId: "default",
352
- credential: { apiKey: key.trim() },
353
- },
354
- ],
355
- notes: [
356
- "Wallet key stored securely in OpenClaw credentials.",
357
- "Your wallet signs x402 USDC payments on Base for each LLM call.",
358
- "Fund your wallet with USDC on Base to start using BlockRun models.",
359
- ],
360
- };
361
- },
362
- };
363
- /**
364
- * Auth method: read wallet key from BLOCKRUN_WALLET_KEY environment variable.
365
- */
366
- export const envKeyAuth = {
367
- id: "env-key",
368
- label: "Environment Variable",
369
- hint: "Use BLOCKRUN_WALLET_KEY environment variable",
370
- kind: "api_key",
371
- run: async () => {
372
- const key = process["env"].BLOCKRUN_WALLET_KEY;
373
- if (!key) {
374
- throw new Error("BLOCKRUN_WALLET_KEY environment variable is not set. " +
375
- "Set it to your EVM wallet private key (0x...).");
376
- }
377
- return {
378
- profiles: [
379
- {
380
- profileId: "default",
381
- credential: { apiKey: key.trim() },
382
- },
383
- ],
384
- notes: ["Using wallet key from BLOCKRUN_WALLET_KEY environment variable."],
385
- };
386
- },
387
- };
388
- //# sourceMappingURL=auth.js.map
package/dist/auth.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}