@echoclaw/echo-0g 1.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 (371) hide show
  1. package/README.md +1175 -0
  2. package/dist/0g-compute/account.d.ts +36 -0
  3. package/dist/0g-compute/account.d.ts.map +1 -0
  4. package/dist/0g-compute/account.js +85 -0
  5. package/dist/0g-compute/account.js.map +1 -0
  6. package/dist/0g-compute/bridge.d.ts +16 -0
  7. package/dist/0g-compute/bridge.d.ts.map +1 -0
  8. package/dist/0g-compute/bridge.js +40 -0
  9. package/dist/0g-compute/bridge.js.map +1 -0
  10. package/dist/0g-compute/broker-factory.d.ts +19 -0
  11. package/dist/0g-compute/broker-factory.d.ts.map +1 -0
  12. package/dist/0g-compute/broker-factory.js +65 -0
  13. package/dist/0g-compute/broker-factory.js.map +1 -0
  14. package/dist/0g-compute/constants.d.ts +10 -0
  15. package/dist/0g-compute/constants.d.ts.map +1 -0
  16. package/dist/0g-compute/constants.js +12 -0
  17. package/dist/0g-compute/constants.js.map +1 -0
  18. package/dist/0g-compute/monitor.d.ts +43 -0
  19. package/dist/0g-compute/monitor.d.ts.map +1 -0
  20. package/dist/0g-compute/monitor.js +302 -0
  21. package/dist/0g-compute/monitor.js.map +1 -0
  22. package/dist/0g-compute/pricing.d.ts +43 -0
  23. package/dist/0g-compute/pricing.d.ts.map +1 -0
  24. package/dist/0g-compute/pricing.js +53 -0
  25. package/dist/0g-compute/pricing.js.map +1 -0
  26. package/dist/0g-compute/sdk-bridge.cjs +17 -0
  27. package/dist/0g-compute/sdk-bridge.cjs.map +1 -0
  28. package/dist/0g-compute/sdk-bridge.d.cts +9 -0
  29. package/dist/0g-compute/sdk-bridge.d.cts.map +1 -0
  30. package/dist/0g-compute/smoke-test.d.ts +11 -0
  31. package/dist/0g-compute/smoke-test.d.ts.map +1 -0
  32. package/dist/0g-compute/smoke-test.js +172 -0
  33. package/dist/0g-compute/smoke-test.js.map +1 -0
  34. package/dist/bot/daemon.d.ts +34 -0
  35. package/dist/bot/daemon.d.ts.map +1 -0
  36. package/dist/bot/daemon.js +386 -0
  37. package/dist/bot/daemon.js.map +1 -0
  38. package/dist/bot/executor.d.ts +14238 -0
  39. package/dist/bot/executor.d.ts.map +1 -0
  40. package/dist/bot/executor.js +183 -0
  41. package/dist/bot/executor.js.map +1 -0
  42. package/dist/bot/nonce-queue.d.ts +20 -0
  43. package/dist/bot/nonce-queue.d.ts.map +1 -0
  44. package/dist/bot/nonce-queue.js +41 -0
  45. package/dist/bot/nonce-queue.js.map +1 -0
  46. package/dist/bot/notify.d.ts +15 -0
  47. package/dist/bot/notify.d.ts.map +1 -0
  48. package/dist/bot/notify.js +98 -0
  49. package/dist/bot/notify.js.map +1 -0
  50. package/dist/bot/orders.d.ts +30 -0
  51. package/dist/bot/orders.d.ts.map +1 -0
  52. package/dist/bot/orders.js +172 -0
  53. package/dist/bot/orders.js.map +1 -0
  54. package/dist/bot/state.d.ts +14 -0
  55. package/dist/bot/state.d.ts.map +1 -0
  56. package/dist/bot/state.js +109 -0
  57. package/dist/bot/state.js.map +1 -0
  58. package/dist/bot/stream.d.ts +28 -0
  59. package/dist/bot/stream.d.ts.map +1 -0
  60. package/dist/bot/stream.js +96 -0
  61. package/dist/bot/stream.js.map +1 -0
  62. package/dist/bot/triggers.d.ts +17 -0
  63. package/dist/bot/triggers.d.ts.map +1 -0
  64. package/dist/bot/triggers.js +95 -0
  65. package/dist/bot/triggers.js.map +1 -0
  66. package/dist/bot/types.d.ts +199 -0
  67. package/dist/bot/types.d.ts.map +1 -0
  68. package/dist/bot/types.js +12 -0
  69. package/dist/bot/types.js.map +1 -0
  70. package/dist/chainscan/client.d.ts +28 -0
  71. package/dist/chainscan/client.d.ts.map +1 -0
  72. package/dist/chainscan/client.js +361 -0
  73. package/dist/chainscan/client.js.map +1 -0
  74. package/dist/chainscan/constants.d.ts +15 -0
  75. package/dist/chainscan/constants.d.ts.map +1 -0
  76. package/dist/chainscan/constants.js +15 -0
  77. package/dist/chainscan/constants.js.map +1 -0
  78. package/dist/chainscan/types.d.ts +148 -0
  79. package/dist/chainscan/types.d.ts.map +1 -0
  80. package/dist/chainscan/types.js +2 -0
  81. package/dist/chainscan/types.js.map +1 -0
  82. package/dist/chainscan/validation.d.ts +35 -0
  83. package/dist/chainscan/validation.d.ts.map +1 -0
  84. package/dist/chainscan/validation.js +97 -0
  85. package/dist/chainscan/validation.js.map +1 -0
  86. package/dist/cli.d.ts +7 -0
  87. package/dist/cli.d.ts.map +1 -0
  88. package/dist/cli.js +328 -0
  89. package/dist/cli.js.map +1 -0
  90. package/dist/commands/0g-compute.d.ts +21 -0
  91. package/dist/commands/0g-compute.d.ts.map +1 -0
  92. package/dist/commands/0g-compute.js +850 -0
  93. package/dist/commands/0g-compute.js.map +1 -0
  94. package/dist/commands/chainscan.d.ts +17 -0
  95. package/dist/commands/chainscan.d.ts.map +1 -0
  96. package/dist/commands/chainscan.js +605 -0
  97. package/dist/commands/chainscan.js.map +1 -0
  98. package/dist/commands/config.d.ts +3 -0
  99. package/dist/commands/config.d.ts.map +1 -0
  100. package/dist/commands/config.js +251 -0
  101. package/dist/commands/config.js.map +1 -0
  102. package/dist/commands/echobook.d.ts +17 -0
  103. package/dist/commands/echobook.d.ts.map +1 -0
  104. package/dist/commands/echobook.js +905 -0
  105. package/dist/commands/echobook.js.map +1 -0
  106. package/dist/commands/jaine-subgraph.d.ts +3 -0
  107. package/dist/commands/jaine-subgraph.d.ts.map +1 -0
  108. package/dist/commands/jaine-subgraph.js +565 -0
  109. package/dist/commands/jaine-subgraph.js.map +1 -0
  110. package/dist/commands/jaine.d.ts +3 -0
  111. package/dist/commands/jaine.d.ts.map +1 -0
  112. package/dist/commands/jaine.js +1415 -0
  113. package/dist/commands/jaine.js.map +1 -0
  114. package/dist/commands/marketmaker.d.ts +6 -0
  115. package/dist/commands/marketmaker.d.ts.map +1 -0
  116. package/dist/commands/marketmaker.js +451 -0
  117. package/dist/commands/marketmaker.js.map +1 -0
  118. package/dist/commands/send.d.ts +3 -0
  119. package/dist/commands/send.d.ts.map +1 -0
  120. package/dist/commands/send.js +229 -0
  121. package/dist/commands/send.js.map +1 -0
  122. package/dist/commands/setup.d.ts +3 -0
  123. package/dist/commands/setup.d.ts.map +1 -0
  124. package/dist/commands/setup.js +263 -0
  125. package/dist/commands/setup.js.map +1 -0
  126. package/dist/commands/slop-app.d.ts +9 -0
  127. package/dist/commands/slop-app.d.ts.map +1 -0
  128. package/dist/commands/slop-app.js +708 -0
  129. package/dist/commands/slop-app.js.map +1 -0
  130. package/dist/commands/slop-stream.d.ts +9 -0
  131. package/dist/commands/slop-stream.d.ts.map +1 -0
  132. package/dist/commands/slop-stream.js +99 -0
  133. package/dist/commands/slop-stream.js.map +1 -0
  134. package/dist/commands/slop.d.ts +3 -0
  135. package/dist/commands/slop.d.ts.map +1 -0
  136. package/dist/commands/slop.js +1053 -0
  137. package/dist/commands/slop.js.map +1 -0
  138. package/dist/commands/wallet.d.ts +13 -0
  139. package/dist/commands/wallet.d.ts.map +1 -0
  140. package/dist/commands/wallet.js +748 -0
  141. package/dist/commands/wallet.js.map +1 -0
  142. package/dist/config/paths.d.ts +13 -0
  143. package/dist/config/paths.d.ts.map +1 -0
  144. package/dist/config/paths.js +33 -0
  145. package/dist/config/paths.js.map +1 -0
  146. package/dist/config/store.d.ts +48 -0
  147. package/dist/config/store.d.ts.map +1 -0
  148. package/dist/config/store.js +113 -0
  149. package/dist/config/store.js.map +1 -0
  150. package/dist/constants/chain.d.ts +57 -0
  151. package/dist/constants/chain.d.ts.map +1 -0
  152. package/dist/constants/chain.js +51 -0
  153. package/dist/constants/chain.js.map +1 -0
  154. package/dist/echobook/api.d.ts +38 -0
  155. package/dist/echobook/api.d.ts.map +1 -0
  156. package/dist/echobook/api.js +86 -0
  157. package/dist/echobook/api.js.map +1 -0
  158. package/dist/echobook/auth.d.ts +31 -0
  159. package/dist/echobook/auth.d.ts.map +1 -0
  160. package/dist/echobook/auth.js +93 -0
  161. package/dist/echobook/auth.js.map +1 -0
  162. package/dist/echobook/comments.d.ts +26 -0
  163. package/dist/echobook/comments.d.ts.map +1 -0
  164. package/dist/echobook/comments.js +20 -0
  165. package/dist/echobook/comments.js.map +1 -0
  166. package/dist/echobook/follows.d.ts +19 -0
  167. package/dist/echobook/follows.d.ts.map +1 -0
  168. package/dist/echobook/follows.js +21 -0
  169. package/dist/echobook/follows.js.map +1 -0
  170. package/dist/echobook/jwtCache.d.ts +15 -0
  171. package/dist/echobook/jwtCache.d.ts.map +1 -0
  172. package/dist/echobook/jwtCache.js +63 -0
  173. package/dist/echobook/jwtCache.js.map +1 -0
  174. package/dist/echobook/notifications.d.ts +30 -0
  175. package/dist/echobook/notifications.d.ts.map +1 -0
  176. package/dist/echobook/notifications.js +26 -0
  177. package/dist/echobook/notifications.js.map +1 -0
  178. package/dist/echobook/points.d.ts +35 -0
  179. package/dist/echobook/points.d.ts.map +1 -0
  180. package/dist/echobook/points.js +20 -0
  181. package/dist/echobook/points.js.map +1 -0
  182. package/dist/echobook/posts.d.ts +46 -0
  183. package/dist/echobook/posts.d.ts.map +1 -0
  184. package/dist/echobook/posts.js +43 -0
  185. package/dist/echobook/posts.js.map +1 -0
  186. package/dist/echobook/profile.d.ts +29 -0
  187. package/dist/echobook/profile.d.ts.map +1 -0
  188. package/dist/echobook/profile.js +14 -0
  189. package/dist/echobook/profile.js.map +1 -0
  190. package/dist/echobook/submolts.d.ts +22 -0
  191. package/dist/echobook/submolts.d.ts.map +1 -0
  192. package/dist/echobook/submolts.js +24 -0
  193. package/dist/echobook/submolts.js.map +1 -0
  194. package/dist/echobook/tradeProof.d.ts +21 -0
  195. package/dist/echobook/tradeProof.d.ts.map +1 -0
  196. package/dist/echobook/tradeProof.js +14 -0
  197. package/dist/echobook/tradeProof.js.map +1 -0
  198. package/dist/echobook/votes.d.ts +17 -0
  199. package/dist/echobook/votes.d.ts.map +1 -0
  200. package/dist/echobook/votes.js +20 -0
  201. package/dist/echobook/votes.js.map +1 -0
  202. package/dist/errors.d.ts +125 -0
  203. package/dist/errors.d.ts.map +1 -0
  204. package/dist/errors.js +147 -0
  205. package/dist/errors.js.map +1 -0
  206. package/dist/intents/store.d.ts +22 -0
  207. package/dist/intents/store.d.ts.map +1 -0
  208. package/dist/intents/store.js +76 -0
  209. package/dist/intents/store.js.map +1 -0
  210. package/dist/intents/types.d.ts +21 -0
  211. package/dist/intents/types.d.ts.map +1 -0
  212. package/dist/intents/types.js +2 -0
  213. package/dist/intents/types.js.map +1 -0
  214. package/dist/jaine/abi/erc20.d.ts +90 -0
  215. package/dist/jaine/abi/erc20.d.ts.map +1 -0
  216. package/dist/jaine/abi/erc20.js +65 -0
  217. package/dist/jaine/abi/erc20.js.map +1 -0
  218. package/dist/jaine/abi/factory.d.ts +38 -0
  219. package/dist/jaine/abi/factory.d.ts.map +1 -0
  220. package/dist/jaine/abi/factory.js +26 -0
  221. package/dist/jaine/abi/factory.js.map +1 -0
  222. package/dist/jaine/abi/index.d.ts +11 -0
  223. package/dist/jaine/abi/index.d.ts.map +1 -0
  224. package/dist/jaine/abi/index.js +11 -0
  225. package/dist/jaine/abi/index.js.map +1 -0
  226. package/dist/jaine/abi/nftManager.d.ts +282 -0
  227. package/dist/jaine/abi/nftManager.d.ts.map +1 -0
  228. package/dist/jaine/abi/nftManager.js +182 -0
  229. package/dist/jaine/abi/nftManager.js.map +1 -0
  230. package/dist/jaine/abi/pool.d.ts +77 -0
  231. package/dist/jaine/abi/pool.d.ts.map +1 -0
  232. package/dist/jaine/abi/pool.js +56 -0
  233. package/dist/jaine/abi/pool.js.map +1 -0
  234. package/dist/jaine/abi/quoter.d.ts +84 -0
  235. package/dist/jaine/abi/quoter.d.ts.map +1 -0
  236. package/dist/jaine/abi/quoter.js +53 -0
  237. package/dist/jaine/abi/quoter.js.map +1 -0
  238. package/dist/jaine/abi/router.d.ts +135 -0
  239. package/dist/jaine/abi/router.d.ts.map +1 -0
  240. package/dist/jaine/abi/router.js +88 -0
  241. package/dist/jaine/abi/router.js.map +1 -0
  242. package/dist/jaine/abi/w0g.d.ts +41 -0
  243. package/dist/jaine/abi/w0g.d.ts.map +1 -0
  244. package/dist/jaine/abi/w0g.js +34 -0
  245. package/dist/jaine/abi/w0g.js.map +1 -0
  246. package/dist/jaine/allowance.d.ts +48 -0
  247. package/dist/jaine/allowance.d.ts.map +1 -0
  248. package/dist/jaine/allowance.js +192 -0
  249. package/dist/jaine/allowance.js.map +1 -0
  250. package/dist/jaine/coreTokens.d.ts +32 -0
  251. package/dist/jaine/coreTokens.d.ts.map +1 -0
  252. package/dist/jaine/coreTokens.js +91 -0
  253. package/dist/jaine/coreTokens.js.map +1 -0
  254. package/dist/jaine/pathEncoding.d.ts +39 -0
  255. package/dist/jaine/pathEncoding.d.ts.map +1 -0
  256. package/dist/jaine/pathEncoding.js +98 -0
  257. package/dist/jaine/pathEncoding.js.map +1 -0
  258. package/dist/jaine/paths.d.ts +11 -0
  259. package/dist/jaine/paths.d.ts.map +1 -0
  260. package/dist/jaine/paths.js +20 -0
  261. package/dist/jaine/paths.js.map +1 -0
  262. package/dist/jaine/poolCache.d.ts +47 -0
  263. package/dist/jaine/poolCache.d.ts.map +1 -0
  264. package/dist/jaine/poolCache.js +195 -0
  265. package/dist/jaine/poolCache.js.map +1 -0
  266. package/dist/jaine/routing.d.ts +41 -0
  267. package/dist/jaine/routing.d.ts.map +1 -0
  268. package/dist/jaine/routing.js +247 -0
  269. package/dist/jaine/routing.js.map +1 -0
  270. package/dist/jaine/subgraph/client.d.ts +26 -0
  271. package/dist/jaine/subgraph/client.d.ts.map +1 -0
  272. package/dist/jaine/subgraph/client.js +201 -0
  273. package/dist/jaine/subgraph/client.js.map +1 -0
  274. package/dist/jaine/subgraph/constants.d.ts +9 -0
  275. package/dist/jaine/subgraph/constants.d.ts.map +1 -0
  276. package/dist/jaine/subgraph/constants.js +9 -0
  277. package/dist/jaine/subgraph/constants.js.map +1 -0
  278. package/dist/jaine/subgraph/queries.d.ts +21 -0
  279. package/dist/jaine/subgraph/queries.d.ts.map +1 -0
  280. package/dist/jaine/subgraph/queries.js +304 -0
  281. package/dist/jaine/subgraph/queries.js.map +1 -0
  282. package/dist/jaine/subgraph/types.d.ts +209 -0
  283. package/dist/jaine/subgraph/types.d.ts.map +1 -0
  284. package/dist/jaine/subgraph/types.js +7 -0
  285. package/dist/jaine/subgraph/types.js.map +1 -0
  286. package/dist/jaine/userTokens.d.ts +27 -0
  287. package/dist/jaine/userTokens.d.ts.map +1 -0
  288. package/dist/jaine/userTokens.js +89 -0
  289. package/dist/jaine/userTokens.js.map +1 -0
  290. package/dist/openclaw/config.d.ts +43 -0
  291. package/dist/openclaw/config.d.ts.map +1 -0
  292. package/dist/openclaw/config.js +231 -0
  293. package/dist/openclaw/config.js.map +1 -0
  294. package/dist/openclaw/hooks-client.d.ts +24 -0
  295. package/dist/openclaw/hooks-client.d.ts.map +1 -0
  296. package/dist/openclaw/hooks-client.js +119 -0
  297. package/dist/openclaw/hooks-client.js.map +1 -0
  298. package/dist/slop/abi/factory.d.ts +128 -0
  299. package/dist/slop/abi/factory.d.ts.map +1 -0
  300. package/dist/slop/abi/factory.js +70 -0
  301. package/dist/slop/abi/factory.js.map +1 -0
  302. package/dist/slop/abi/feeCollector.d.ts +95 -0
  303. package/dist/slop/abi/feeCollector.d.ts.map +1 -0
  304. package/dist/slop/abi/feeCollector.js +71 -0
  305. package/dist/slop/abi/feeCollector.js.map +1 -0
  306. package/dist/slop/abi/index.d.ts +5 -0
  307. package/dist/slop/abi/index.d.ts.map +1 -0
  308. package/dist/slop/abi/index.js +5 -0
  309. package/dist/slop/abi/index.js.map +1 -0
  310. package/dist/slop/abi/registry.d.ts +135 -0
  311. package/dist/slop/abi/registry.d.ts.map +1 -0
  312. package/dist/slop/abi/registry.js +90 -0
  313. package/dist/slop/abi/registry.js.map +1 -0
  314. package/dist/slop/abi/token.d.ts +320 -0
  315. package/dist/slop/abi/token.d.ts.map +1 -0
  316. package/dist/slop/abi/token.js +251 -0
  317. package/dist/slop/abi/token.js.map +1 -0
  318. package/dist/slop/auth.d.ts +19 -0
  319. package/dist/slop/auth.d.ts.map +1 -0
  320. package/dist/slop/auth.js +92 -0
  321. package/dist/slop/auth.js.map +1 -0
  322. package/dist/slop/jwtCache.d.ts +27 -0
  323. package/dist/slop/jwtCache.d.ts.map +1 -0
  324. package/dist/slop/jwtCache.js +91 -0
  325. package/dist/slop/jwtCache.js.map +1 -0
  326. package/dist/slop/quote.d.ts +80 -0
  327. package/dist/slop/quote.d.ts.map +1 -0
  328. package/dist/slop/quote.js +174 -0
  329. package/dist/slop/quote.js.map +1 -0
  330. package/dist/utils/canonicalJson.d.ts +8 -0
  331. package/dist/utils/canonicalJson.d.ts.map +1 -0
  332. package/dist/utils/canonicalJson.js +20 -0
  333. package/dist/utils/canonicalJson.js.map +1 -0
  334. package/dist/utils/env.d.ts +11 -0
  335. package/dist/utils/env.d.ts.map +1 -0
  336. package/dist/utils/env.js +20 -0
  337. package/dist/utils/env.js.map +1 -0
  338. package/dist/utils/http.d.ts +19 -0
  339. package/dist/utils/http.d.ts.map +1 -0
  340. package/dist/utils/http.js +61 -0
  341. package/dist/utils/http.js.map +1 -0
  342. package/dist/utils/logger.d.ts +4 -0
  343. package/dist/utils/logger.d.ts.map +1 -0
  344. package/dist/utils/logger.js +21 -0
  345. package/dist/utils/logger.js.map +1 -0
  346. package/dist/utils/output.d.ts +29 -0
  347. package/dist/utils/output.d.ts.map +1 -0
  348. package/dist/utils/output.js +51 -0
  349. package/dist/utils/output.js.map +1 -0
  350. package/dist/utils/rateLimit.d.ts +22 -0
  351. package/dist/utils/rateLimit.d.ts.map +1 -0
  352. package/dist/utils/rateLimit.js +58 -0
  353. package/dist/utils/rateLimit.js.map +1 -0
  354. package/dist/utils/respond.d.ts +19 -0
  355. package/dist/utils/respond.d.ts.map +1 -0
  356. package/dist/utils/respond.js +25 -0
  357. package/dist/utils/respond.js.map +1 -0
  358. package/dist/utils/ui.d.ts +38 -0
  359. package/dist/utils/ui.d.ts.map +1 -0
  360. package/dist/utils/ui.js +126 -0
  361. package/dist/utils/ui.js.map +1 -0
  362. package/dist/wallet/client.d.ts +4 -0
  363. package/dist/wallet/client.d.ts.map +1 -0
  364. package/dist/wallet/client.js +53 -0
  365. package/dist/wallet/client.js.map +1 -0
  366. package/dist/wallet/keystore.d.ts +22 -0
  367. package/dist/wallet/keystore.d.ts.map +1 -0
  368. package/dist/wallet/keystore.js +111 -0
  369. package/dist/wallet/keystore.js.map +1 -0
  370. package/package.json +63 -0
  371. package/skills/echo/SKILL.md +1121 -0
@@ -0,0 +1,229 @@
1
+ import { Command } from "commander";
2
+ import { isAddress, getAddress, parseEther, formatEther } from "viem";
3
+ import { privateKeyToAccount } from "viem/accounts";
4
+ import { createWalletClient, http } from "viem";
5
+ import { loadConfig } from "../config/store.js";
6
+ import { getPublicClient } from "../wallet/client.js";
7
+ import { loadKeystore, decryptPrivateKey } from "../wallet/keystore.js";
8
+ import { createIntent, saveIntent, loadIntent, deleteIntent, isIntentExpired } from "../intents/store.js";
9
+ import { requireKeystorePassword } from "../utils/env.js";
10
+ import { EchoError, ErrorCodes } from "../errors.js";
11
+ import { isHeadless, writeJsonSuccess } from "../utils/output.js";
12
+ import { spinner, successBox, infoBox, colors, formatBalance } from "../utils/ui.js";
13
+ export function createSendCommand() {
14
+ const send = new Command("send")
15
+ .description("Send native 0G tokens")
16
+ .exitOverride();
17
+ // echo send prepare --to <addr> --amount <0G>
18
+ send
19
+ .command("prepare")
20
+ .description("Prepare a transfer intent (valid 10 min)")
21
+ .requiredOption("--to <address>", "Recipient address")
22
+ .requiredOption("--amount <0G>", "Amount in 0G (e.g. 1.5)")
23
+ .option("--note <text>", "Optional note")
24
+ .action(async (options) => {
25
+ // 1. Validate address
26
+ if (!isAddress(options.to)) {
27
+ throw new EchoError(ErrorCodes.INVALID_ADDRESS, `Invalid address: ${options.to}`);
28
+ }
29
+ const to = getAddress(options.to);
30
+ // 2. Validate amount (parseEther for precision)
31
+ let valueWei;
32
+ try {
33
+ valueWei = parseEther(options.amount);
34
+ }
35
+ catch {
36
+ throw new EchoError(ErrorCodes.INVALID_AMOUNT, `Invalid amount: ${options.amount}`);
37
+ }
38
+ if (valueWei <= 0n) {
39
+ throw new EchoError(ErrorCodes.INVALID_AMOUNT, "Amount must be greater than 0");
40
+ }
41
+ // 3. Check wallet config
42
+ const cfg = loadConfig();
43
+ if (!cfg.wallet.address) {
44
+ throw new EchoError(ErrorCodes.WALLET_NOT_CONFIGURED, "No wallet configured.", "Run: echo wallet create --json");
45
+ }
46
+ // 4. Gas estimate from RPC
47
+ const client = getPublicClient();
48
+ const spin = spinner("Estimating gas...");
49
+ spin.start();
50
+ let gasLimit;
51
+ let maxFeePerGas;
52
+ let gasPrice;
53
+ try {
54
+ const [estimatedGas, feeData] = await Promise.all([
55
+ client.estimateGas({ account: cfg.wallet.address, to, value: valueWei }),
56
+ client.estimateFeesPerGas().catch(() => null),
57
+ ]);
58
+ gasLimit = estimatedGas;
59
+ // feeData can be EIP-1559 (maxFeePerGas) or legacy (gasPrice)
60
+ if (feeData) {
61
+ maxFeePerGas = feeData.maxFeePerGas ?? undefined;
62
+ gasPrice = feeData.gasPrice ?? undefined;
63
+ }
64
+ }
65
+ catch (err) {
66
+ spin.fail("Failed to estimate gas");
67
+ throw new EchoError(ErrorCodes.RPC_ERROR, `RPC error: ${err instanceof Error ? err.message : err}`);
68
+ }
69
+ spin.succeed("Gas estimated");
70
+ // 5. Create and save intent
71
+ const intent = createIntent({
72
+ chainId: cfg.chain.chainId,
73
+ rpcUrl: cfg.chain.rpcUrl,
74
+ from: cfg.wallet.address,
75
+ to,
76
+ valueWei: valueWei.toString(),
77
+ gasLimit: gasLimit.toString(),
78
+ maxFeePerGas: maxFeePerGas ? maxFeePerGas.toString() : undefined,
79
+ gasPrice: gasPrice ? gasPrice.toString() : undefined,
80
+ note: options.note,
81
+ });
82
+ saveIntent(intent);
83
+ // 6. Output
84
+ const result = {
85
+ intentId: intent.intentId,
86
+ from: intent.from,
87
+ to: intent.to,
88
+ value: options.amount,
89
+ valueWei: intent.valueWei,
90
+ expiresAt: intent.expiresAt,
91
+ };
92
+ if (isHeadless()) {
93
+ writeJsonSuccess(result);
94
+ }
95
+ else {
96
+ infoBox("Transfer Prepared", `Intent ID: ${colors.info(intent.intentId)}\n` +
97
+ `From: ${colors.address(intent.from)}\n` +
98
+ `To: ${colors.address(intent.to)}\n` +
99
+ `Amount: ${colors.value(options.amount + " 0G")}\n` +
100
+ `Expires: ${colors.muted(intent.expiresAt)}\n\n` +
101
+ `Confirm with:\n ${colors.info(`echo send confirm ${intent.intentId} --yes`)}`);
102
+ }
103
+ });
104
+ // echo send confirm <intentId> --yes
105
+ send
106
+ .command("confirm <intentId>")
107
+ .description("Confirm and broadcast prepared transfer")
108
+ .requiredOption("--yes", "Confirm the transfer (required)")
109
+ .action(async (intentId, options) => {
110
+ if (!options.yes) {
111
+ throw new EchoError(ErrorCodes.CONFIRMATION_REQUIRED, "Add --yes to confirm");
112
+ }
113
+ // 1. Load intent
114
+ const intent = loadIntent(intentId);
115
+ if (!intent) {
116
+ throw new EchoError(ErrorCodes.INTENT_NOT_FOUND, `Intent not found: ${intentId}`);
117
+ }
118
+ // 2. Check expiry
119
+ if (isIntentExpired(intent)) {
120
+ deleteIntent(intentId);
121
+ throw new EchoError(ErrorCodes.INTENT_EXPIRED, "Intent expired.", "Run: echo send prepare");
122
+ }
123
+ // 3. Verify chain match
124
+ const cfg = loadConfig();
125
+ if (cfg.chain.chainId !== intent.chainId) {
126
+ throw new EchoError(ErrorCodes.CHAIN_MISMATCH, `Intent for chain ${intent.chainId}, current is ${cfg.chain.chainId}`);
127
+ }
128
+ // 4. Get password and decrypt keystore
129
+ const password = requireKeystorePassword();
130
+ const keystore = loadKeystore();
131
+ if (!keystore) {
132
+ throw new EchoError(ErrorCodes.KEYSTORE_NOT_FOUND, "Keystore not found.", "Run: echo wallet create --json");
133
+ }
134
+ const spin = spinner("Signing and broadcasting...");
135
+ spin.start();
136
+ let privateKey;
137
+ try {
138
+ privateKey = decryptPrivateKey(keystore, password);
139
+ }
140
+ catch (err) {
141
+ spin.fail("Failed to decrypt keystore");
142
+ throw new EchoError(ErrorCodes.KEYSTORE_DECRYPT_FAILED, "Decryption failed: wrong password or corrupted keystore");
143
+ }
144
+ // 5. Re-check balance with fresh gas estimate
145
+ const client = getPublicClient();
146
+ let balance;
147
+ let freshMaxFeePerGas;
148
+ let freshGasPrice;
149
+ try {
150
+ const [bal, feeData] = await Promise.all([
151
+ client.getBalance({ address: intent.from }),
152
+ client.estimateFeesPerGas().catch(() => null),
153
+ ]);
154
+ balance = bal;
155
+ if (feeData) {
156
+ freshMaxFeePerGas = feeData.maxFeePerGas ?? undefined;
157
+ freshGasPrice = feeData.gasPrice ?? undefined;
158
+ }
159
+ }
160
+ catch (err) {
161
+ spin.fail("Failed to check balance");
162
+ throw new EchoError(ErrorCodes.RPC_ERROR, `RPC error: ${err instanceof Error ? err.message : err}`);
163
+ }
164
+ const feePerGas = freshMaxFeePerGas ?? freshGasPrice ?? 0n;
165
+ const estimatedFee = BigInt(intent.gasLimit) * feePerGas;
166
+ const totalNeeded = BigInt(intent.valueWei) + estimatedFee;
167
+ if (balance < totalNeeded) {
168
+ spin.fail("Insufficient balance");
169
+ throw new EchoError(ErrorCodes.INSUFFICIENT_BALANCE, "Insufficient balance.", `Have: ${formatBalance(balance, 18)} 0G, need: ~${formatBalance(totalNeeded, 18)} 0G`);
170
+ }
171
+ // 6. Verify signer matches intent
172
+ const account = privateKeyToAccount(privateKey);
173
+ if (account.address.toLowerCase() !== intent.from.toLowerCase()) {
174
+ spin.fail("Signer mismatch");
175
+ throw new EchoError(ErrorCodes.SIGNER_MISMATCH, `Keystore address ${account.address} does not match intent from ${intent.from}`, "Keystore may have changed since prepare. Run: echo send prepare");
176
+ }
177
+ // 7. Create wallet client and send tx
178
+ const walletClient = createWalletClient({
179
+ account,
180
+ chain: {
181
+ id: cfg.chain.chainId,
182
+ name: "0G",
183
+ nativeCurrency: { name: "0G", symbol: "0G", decimals: 18 },
184
+ rpcUrls: { default: { http: [cfg.chain.rpcUrl] } },
185
+ },
186
+ transport: http(cfg.chain.rpcUrl, {
187
+ timeout: 30_000,
188
+ retryCount: 2,
189
+ }),
190
+ });
191
+ let txHash;
192
+ try {
193
+ txHash = await walletClient.sendTransaction({
194
+ to: intent.to,
195
+ value: BigInt(intent.valueWei),
196
+ });
197
+ }
198
+ catch (err) {
199
+ spin.fail("Transaction failed");
200
+ throw new EchoError(ErrorCodes.RPC_ERROR, `Transaction error: ${err instanceof Error ? err.message : err}`);
201
+ }
202
+ spin.succeed("Transaction sent");
203
+ // 8. Delete intent (single-use)
204
+ deleteIntent(intentId);
205
+ // 9. Output (include intentId/chainId/to/valueWei for traceability)
206
+ const explorerUrl = `${cfg.chain.explorerUrl}/tx/${txHash}`;
207
+ const result = {
208
+ txHash,
209
+ explorerUrl,
210
+ status: "pending",
211
+ intentId,
212
+ chainId: cfg.chain.chainId,
213
+ to: intent.to,
214
+ valueWei: intent.valueWei,
215
+ value0G: formatEther(BigInt(intent.valueWei)),
216
+ };
217
+ if (isHeadless()) {
218
+ writeJsonSuccess(result);
219
+ }
220
+ else {
221
+ successBox("Transaction Sent", `Hash: ${colors.info(txHash)}\n` +
222
+ `To: ${colors.address(intent.to)}\n` +
223
+ `Amount: ${colors.value(result.value0G + " 0G")}\n\n` +
224
+ `Explorer: ${colors.muted(explorerUrl)}`);
225
+ }
226
+ });
227
+ return send;
228
+ }
229
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createSetupCommand(): Command;
3
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,kBAAkB,IAAI,OAAO,CAiT5C"}
@@ -0,0 +1,263 @@
1
+ import { existsSync, lstatSync, mkdirSync, symlinkSync, unlinkSync, rmSync, cpSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { homedir, platform } from "node:os";
5
+ import { Command } from "commander";
6
+ import inquirer from "inquirer";
7
+ import { EchoError, ErrorCodes } from "../errors.js";
8
+ import { respond } from "../utils/respond.js";
9
+ import { patchOpenclawSkillEnv } from "../openclaw/config.js";
10
+ import { getKeystorePassword } from "../utils/env.js";
11
+ import { isHeadless, writeJsonSuccess } from "../utils/output.js";
12
+ import { successBox, warnBox, infoBox, colors } from "../utils/ui.js";
13
+ const __dirname = dirname(fileURLToPath(import.meta.url));
14
+ export function createSetupCommand() {
15
+ const setup = new Command("setup").description("Setup and integration commands");
16
+ setup
17
+ .command("openclaw")
18
+ .description("Link EchoClaw skill into OpenClaw skills directory")
19
+ .option("--force", "Overwrite existing skill directory")
20
+ .action((opts) => {
21
+ // 1. Resolve source — from dist/commands/setup.js → ../../skills/echo
22
+ const source = resolve(__dirname, "..", "..", "skills", "echo");
23
+ if (!existsSync(source)) {
24
+ throw new EchoError(ErrorCodes.SETUP_SOURCE_NOT_FOUND, `Skill source not found at ${source}`, "Reinstall: npm i -g @echoclaw/echo-0g");
25
+ }
26
+ // 2. Resolve target — ~/.openclaw/skills/echo
27
+ const openclawSkillsDir = join(homedir(), ".openclaw", "skills");
28
+ const target = join(openclawSkillsDir, "echo");
29
+ // Ensure parent dir exists
30
+ mkdirSync(openclawSkillsDir, { recursive: true });
31
+ // 3. Handle existing target
32
+ if (existsSync(target) || lstatSafe(target)) {
33
+ if (!opts.force) {
34
+ throw new EchoError(ErrorCodes.SETUP_TARGET_EXISTS, `Target already exists: ${target}`, "Use --force to overwrite");
35
+ }
36
+ // Remove existing — distinguish symlink vs directory
37
+ const stat = lstatSafe(target);
38
+ if (stat && stat.isSymbolicLink()) {
39
+ unlinkSync(target);
40
+ }
41
+ else if (stat) {
42
+ rmSync(target, { recursive: true });
43
+ }
44
+ }
45
+ // 4. Link strategy: symlink → fallback to copy
46
+ let linkType;
47
+ try {
48
+ const symlinkType = platform() === "win32" ? "junction" : "dir";
49
+ symlinkSync(source, target, symlinkType);
50
+ linkType = symlinkType === "junction" ? "junction" : "symlink";
51
+ }
52
+ catch (err) {
53
+ const code = err.code;
54
+ if (code === "EPERM" || code === "EACCES") {
55
+ // Fallback to copy
56
+ try {
57
+ cpSync(source, target, { recursive: true });
58
+ linkType = "copy";
59
+ }
60
+ catch {
61
+ throw new EchoError(ErrorCodes.SETUP_LINK_FAILED, `Failed to link or copy skill to ${target}`, "Check permissions on ~/.openclaw/skills/");
62
+ }
63
+ }
64
+ else {
65
+ throw new EchoError(ErrorCodes.SETUP_LINK_FAILED, `Failed to create symlink: ${err.message}`, "Try running with --force or check permissions");
66
+ }
67
+ }
68
+ respond({
69
+ data: { source, target, linkType },
70
+ ui: {
71
+ type: "success",
72
+ title: "OpenClaw Skill Linked",
73
+ body: `${linkType === "copy" ? "Copied" : "Symlinked"} skill to ${target}`,
74
+ },
75
+ });
76
+ });
77
+ // echo setup password
78
+ setup
79
+ .command("password")
80
+ .description("Save ECHO_KEYSTORE_PASSWORD to OpenClaw config")
81
+ .option("--from-env", "Read password from ECHO_KEYSTORE_PASSWORD env var")
82
+ .option("--password <password>", "Provide password directly (less secure — visible in shell history)")
83
+ .option("--force", "Overwrite existing password in config")
84
+ .option("--auto-update", "Also set ECHO_AUTO_UPDATE=1 in config")
85
+ .action(async (opts) => {
86
+ // 1. Determine password source: --password > --from-env > TTY prompt
87
+ let password;
88
+ if (opts.password) {
89
+ password = opts.password;
90
+ }
91
+ else if (opts.fromEnv) {
92
+ password = getKeystorePassword() ?? undefined;
93
+ if (!password) {
94
+ throw new EchoError(ErrorCodes.KEYSTORE_PASSWORD_NOT_SET, "ECHO_KEYSTORE_PASSWORD environment variable is not set.", "Export it first: export ECHO_KEYSTORE_PASSWORD=\"your-password\"");
95
+ }
96
+ }
97
+ else {
98
+ // TTY prompt
99
+ if (isHeadless()) {
100
+ throw new EchoError(ErrorCodes.INTERACTIVE_COMMAND_NOT_SUPPORTED, "Password input requires a TTY. Use --from-env or --password in headless mode.", "ECHO_KEYSTORE_PASSWORD=pw echo setup password --from-env --json");
101
+ }
102
+ const answers = await inquirer.prompt([
103
+ { type: "password", name: "pw", message: "Enter keystore password:", mask: "*" },
104
+ { type: "password", name: "pwConfirm", message: "Confirm password:", mask: "*" },
105
+ ]);
106
+ if (answers.pw !== answers.pwConfirm) {
107
+ throw new EchoError(ErrorCodes.PASSWORD_MISMATCH, "Passwords do not match.", "Try again with matching passwords.");
108
+ }
109
+ password = answers.pw;
110
+ }
111
+ // 2. Validate length
112
+ if (!password || password.length < 8) {
113
+ throw new EchoError(ErrorCodes.PASSWORD_MISMATCH, "Password must be at least 8 characters.", "Choose a longer password.");
114
+ }
115
+ // 3. Build env map (password is guaranteed non-null after validation above)
116
+ const envMap = { ECHO_KEYSTORE_PASSWORD: password };
117
+ if (opts.autoUpdate) {
118
+ envMap.ECHO_AUTO_UPDATE = "1";
119
+ }
120
+ // 4. Patch openclaw.json
121
+ const result = patchOpenclawSkillEnv("echo", envMap, { force: opts.force });
122
+ // 5. Handle "already configured" case
123
+ if (result.keysSkipped.length > 0 && result.keysSet.length === 0) {
124
+ if (isHeadless()) {
125
+ writeJsonSuccess({
126
+ status: result.status,
127
+ path: result.path,
128
+ keysSet: result.keysSet,
129
+ keysSkipped: result.keysSkipped,
130
+ restartRequired: false,
131
+ });
132
+ }
133
+ else {
134
+ infoBox("Already Configured", `Password already set in ${result.path}\n\nUse ${colors.info("--force")} to overwrite.`);
135
+ }
136
+ return;
137
+ }
138
+ // 6. Respond with success + restart instructions
139
+ if (isHeadless()) {
140
+ writeJsonSuccess({
141
+ status: result.status,
142
+ path: result.path,
143
+ keysSet: result.keysSet,
144
+ keysSkipped: result.keysSkipped,
145
+ restartRequired: true,
146
+ });
147
+ }
148
+ else {
149
+ successBox("Password Saved", `Saved to: ${colors.info(result.path)}\n` +
150
+ `Keys set: ${colors.value(result.keysSet.join(", "))}\n` +
151
+ (result.keysSkipped.length > 0
152
+ ? `Keys skipped: ${colors.muted(result.keysSkipped.join(", "))}\n`
153
+ : "") +
154
+ `\n${colors.warn("Apply changes:")}\n` +
155
+ ` 1. Restart OpenClaw gateway: systemctl restart openclaw-gateway\n` +
156
+ ` (or: openclaw gateway start)\n` +
157
+ ` 2. Send /reset (or /new) in the chat`);
158
+ if (result.status === "created" || result.status === "updated") {
159
+ warnBox("Note", "openclaw.json has been reformatted as standard JSON. Comments (if any) were removed.\n\n" +
160
+ "If you still get KEYSTORE_DECRYPT_FAILED after restart, check that no stale\n" +
161
+ "ECHO_KEYSTORE_PASSWORD exists in process env, systemd unit, or ~/.openclaw/.env\n" +
162
+ "— those sources may take priority over skills.entries.");
163
+ }
164
+ }
165
+ });
166
+ // echo setup openclaw-hooks
167
+ setup
168
+ .command("openclaw-hooks")
169
+ .description("Configure OpenClaw webhook ENV vars for MarketMaker notifications")
170
+ .option("--from-env", "Read all vars from OPENCLAW_HOOKS_* env vars")
171
+ .option("--base-url <url>", "Gateway URL (e.g. http://127.0.0.1:18789)")
172
+ .option("--token <token>", "Shared secret (warn: visible in shell history)")
173
+ .option("--agent-id <id>", "Route to specific agent")
174
+ .option("--channel <ch>", "Delivery channel override")
175
+ .option("--to <recipient>", "Recipient override")
176
+ .option("--include-guardrail", "Include GUARDRAIL_EXCEEDED events")
177
+ .option("--force", "Overwrite existing keys")
178
+ .action((opts) => {
179
+ const envMap = {};
180
+ if (opts.fromEnv) {
181
+ // Read from OPENCLAW_HOOKS_* env vars
182
+ const mapping = {
183
+ OPENCLAW_HOOKS_BASE_URL: process.env.OPENCLAW_HOOKS_BASE_URL ?? "",
184
+ OPENCLAW_HOOKS_TOKEN: process.env.OPENCLAW_HOOKS_TOKEN ?? "",
185
+ OPENCLAW_HOOKS_AGENT_ID: process.env.OPENCLAW_HOOKS_AGENT_ID ?? "",
186
+ OPENCLAW_HOOKS_CHANNEL: process.env.OPENCLAW_HOOKS_CHANNEL ?? "",
187
+ OPENCLAW_HOOKS_TO: process.env.OPENCLAW_HOOKS_TO ?? "",
188
+ OPENCLAW_HOOKS_INCLUDE_GUARDRAIL: process.env.OPENCLAW_HOOKS_INCLUDE_GUARDRAIL ?? "",
189
+ };
190
+ for (const [key, value] of Object.entries(mapping)) {
191
+ if (value)
192
+ envMap[key] = value;
193
+ }
194
+ }
195
+ // Explicit flags override env values
196
+ if (opts.baseUrl)
197
+ envMap.OPENCLAW_HOOKS_BASE_URL = opts.baseUrl;
198
+ if (opts.token)
199
+ envMap.OPENCLAW_HOOKS_TOKEN = opts.token;
200
+ if (opts.agentId)
201
+ envMap.OPENCLAW_HOOKS_AGENT_ID = opts.agentId;
202
+ if (opts.channel)
203
+ envMap.OPENCLAW_HOOKS_CHANNEL = opts.channel;
204
+ if (opts.to)
205
+ envMap.OPENCLAW_HOOKS_TO = opts.to;
206
+ if (opts.includeGuardrail)
207
+ envMap.OPENCLAW_HOOKS_INCLUDE_GUARDRAIL = "1";
208
+ // Require at least base-url + token
209
+ if (!envMap.OPENCLAW_HOOKS_BASE_URL || !envMap.OPENCLAW_HOOKS_TOKEN) {
210
+ throw new EchoError(ErrorCodes.OPENCLAW_HOOKS_VALIDATION_FAILED, "Both --base-url and --token are required (or set OPENCLAW_HOOKS_BASE_URL and OPENCLAW_HOOKS_TOKEN env vars with --from-env).", "Example: echo setup openclaw-hooks --base-url http://127.0.0.1:18789 --token <secret>");
211
+ }
212
+ // Patch openclaw.json
213
+ const result = patchOpenclawSkillEnv("echo", envMap, { force: opts.force });
214
+ // Handle "already configured" case
215
+ if (result.keysSkipped.length > 0 && result.keysSet.length === 0) {
216
+ if (isHeadless()) {
217
+ writeJsonSuccess({
218
+ status: result.status,
219
+ path: result.path,
220
+ keysSet: result.keysSet,
221
+ keysSkipped: result.keysSkipped,
222
+ restartRequired: false,
223
+ });
224
+ }
225
+ else {
226
+ infoBox("Already Configured", `Webhook keys already set in ${result.path}\n\nUse ${colors.info("--force")} to overwrite.`);
227
+ }
228
+ return;
229
+ }
230
+ // Success output (never log token values)
231
+ if (isHeadless()) {
232
+ writeJsonSuccess({
233
+ status: result.status,
234
+ path: result.path,
235
+ keysSet: result.keysSet,
236
+ keysSkipped: result.keysSkipped,
237
+ restartRequired: true,
238
+ });
239
+ }
240
+ else {
241
+ successBox("Webhook Config Saved", `Saved to: ${colors.info(result.path)}\n` +
242
+ `Keys set: ${colors.value(result.keysSet.join(", "))}\n` +
243
+ (result.keysSkipped.length > 0
244
+ ? `Keys skipped: ${colors.muted(result.keysSkipped.join(", "))}\n`
245
+ : "") +
246
+ `\n${colors.warn("Apply changes:")}\n` +
247
+ ` 1. Restart OpenClaw gateway: systemctl restart openclaw-gateway\n` +
248
+ ` (or: openclaw gateway start)\n` +
249
+ ` 2. Send /reset (or /new) in the chat`);
250
+ }
251
+ });
252
+ return setup;
253
+ }
254
+ /** Safe lstat that returns null instead of throwing for non-existent paths */
255
+ function lstatSafe(p) {
256
+ try {
257
+ return lstatSync(p);
258
+ }
259
+ catch {
260
+ return null;
261
+ }
262
+ }
263
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * slop-app commands - Interact with slop.money production APIs
3
+ * - Profile registration with Echo badge
4
+ * - Image upload/generate via proxy
5
+ * - Chat messaging via Socket.IO
6
+ */
7
+ import { Command } from "commander";
8
+ export declare function createSlopAppCommand(): Command;
9
+ //# sourceMappingURL=slop-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slop-app.d.ts","sourceRoot":"","sources":["../../src/commands/slop-app.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwEpC,wBAAgB,oBAAoB,IAAI,OAAO,CA40B9C"}