clodds 1.1.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 (1719) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +468 -0
  3. package/dist/acp/agreement.d.ts +110 -0
  4. package/dist/acp/agreement.js +514 -0
  5. package/dist/acp/agreement.js.map +1 -0
  6. package/dist/acp/discovery.d.ts +84 -0
  7. package/dist/acp/discovery.js +332 -0
  8. package/dist/acp/discovery.js.map +1 -0
  9. package/dist/acp/escrow.d.ts +139 -0
  10. package/dist/acp/escrow.js +880 -0
  11. package/dist/acp/escrow.js.map +1 -0
  12. package/dist/acp/identity.d.ts +135 -0
  13. package/dist/acp/identity.js +716 -0
  14. package/dist/acp/identity.js.map +1 -0
  15. package/dist/acp/index.d.ts +205 -0
  16. package/dist/acp/index.js +583 -0
  17. package/dist/acp/index.js.map +1 -0
  18. package/dist/acp/persistence.d.ts +59 -0
  19. package/dist/acp/persistence.js +590 -0
  20. package/dist/acp/persistence.js.map +1 -0
  21. package/dist/acp/predictions.d.ts +89 -0
  22. package/dist/acp/predictions.js +417 -0
  23. package/dist/acp/predictions.js.map +1 -0
  24. package/dist/acp/registry.d.ts +143 -0
  25. package/dist/acp/registry.js +584 -0
  26. package/dist/acp/registry.js.map +1 -0
  27. package/dist/agents/handlers/acp.d.ts +12 -0
  28. package/dist/agents/handlers/acp.js +987 -0
  29. package/dist/agents/handlers/acp.js.map +1 -0
  30. package/dist/agents/handlers/agentbets.d.ts +8 -0
  31. package/dist/agents/handlers/agentbets.js +63 -0
  32. package/dist/agents/handlers/agentbets.js.map +1 -0
  33. package/dist/agents/handlers/arbitrage.d.ts +16 -0
  34. package/dist/agents/handlers/arbitrage.js +187 -0
  35. package/dist/agents/handlers/arbitrage.js.map +1 -0
  36. package/dist/agents/handlers/betfair.d.ts +11 -0
  37. package/dist/agents/handlers/betfair.js +214 -0
  38. package/dist/agents/handlers/betfair.js.map +1 -0
  39. package/dist/agents/handlers/binance.d.ts +9 -0
  40. package/dist/agents/handlers/binance.js +227 -0
  41. package/dist/agents/handlers/binance.js.map +1 -0
  42. package/dist/agents/handlers/bittensor.d.ts +10 -0
  43. package/dist/agents/handlers/bittensor.js +90 -0
  44. package/dist/agents/handlers/bittensor.js.map +1 -0
  45. package/dist/agents/handlers/bybit.d.ts +9 -0
  46. package/dist/agents/handlers/bybit.js +226 -0
  47. package/dist/agents/handlers/bybit.js.map +1 -0
  48. package/dist/agents/handlers/credentials.d.ts +8 -0
  49. package/dist/agents/handlers/credentials.js +103 -0
  50. package/dist/agents/handlers/credentials.js.map +1 -0
  51. package/dist/agents/handlers/hyperliquid.d.ts +9 -0
  52. package/dist/agents/handlers/hyperliquid.js +326 -0
  53. package/dist/agents/handlers/hyperliquid.js.map +1 -0
  54. package/dist/agents/handlers/index.d.ts +82 -0
  55. package/dist/agents/handlers/index.js +143 -0
  56. package/dist/agents/handlers/index.js.map +1 -0
  57. package/dist/agents/handlers/kalshi.d.ts +10 -0
  58. package/dist/agents/handlers/kalshi.js +1377 -0
  59. package/dist/agents/handlers/kalshi.js.map +1 -0
  60. package/dist/agents/handlers/manifold.d.ts +9 -0
  61. package/dist/agents/handlers/manifold.js +1001 -0
  62. package/dist/agents/handlers/manifold.js.map +1 -0
  63. package/dist/agents/handlers/markets.d.ts +8 -0
  64. package/dist/agents/handlers/markets.js +321 -0
  65. package/dist/agents/handlers/markets.js.map +1 -0
  66. package/dist/agents/handlers/opinion.d.ts +11 -0
  67. package/dist/agents/handlers/opinion.js +374 -0
  68. package/dist/agents/handlers/opinion.js.map +1 -0
  69. package/dist/agents/handlers/paper-trading.d.ts +8 -0
  70. package/dist/agents/handlers/paper-trading.js +124 -0
  71. package/dist/agents/handlers/paper-trading.js.map +1 -0
  72. package/dist/agents/handlers/polymarket.d.ts +17 -0
  73. package/dist/agents/handlers/polymarket.js +455 -0
  74. package/dist/agents/handlers/polymarket.js.map +1 -0
  75. package/dist/agents/handlers/predictfun.d.ts +9 -0
  76. package/dist/agents/handlers/predictfun.js +488 -0
  77. package/dist/agents/handlers/predictfun.js.map +1 -0
  78. package/dist/agents/handlers/smarkets.d.ts +11 -0
  79. package/dist/agents/handlers/smarkets.js +205 -0
  80. package/dist/agents/handlers/smarkets.js.map +1 -0
  81. package/dist/agents/handlers/solana.d.ts +14 -0
  82. package/dist/agents/handlers/solana.js +1530 -0
  83. package/dist/agents/handlers/solana.js.map +1 -0
  84. package/dist/agents/handlers/types.d.ts +58 -0
  85. package/dist/agents/handlers/types.js +34 -0
  86. package/dist/agents/handlers/types.js.map +1 -0
  87. package/dist/agents/handlers/virtuals.d.ts +11 -0
  88. package/dist/agents/handlers/virtuals.js +135 -0
  89. package/dist/agents/handlers/virtuals.js.map +1 -0
  90. package/dist/agents/handlers/wallets.d.ts +9 -0
  91. package/dist/agents/handlers/wallets.js +222 -0
  92. package/dist/agents/handlers/wallets.js.map +1 -0
  93. package/dist/agents/index.d.ts +79 -0
  94. package/dist/agents/index.js +16690 -0
  95. package/dist/agents/index.js.map +1 -0
  96. package/dist/agents/subagents.d.ts +219 -0
  97. package/dist/agents/subagents.js +736 -0
  98. package/dist/agents/subagents.js.map +1 -0
  99. package/dist/alerts/index.d.ts +110 -0
  100. package/dist/alerts/index.js +421 -0
  101. package/dist/alerts/index.js.map +1 -0
  102. package/dist/alerts/realtime.d.ts +114 -0
  103. package/dist/alerts/realtime.js +262 -0
  104. package/dist/alerts/realtime.js.map +1 -0
  105. package/dist/api/apikeys.d.ts +74 -0
  106. package/dist/api/apikeys.js +319 -0
  107. package/dist/api/apikeys.js.map +1 -0
  108. package/dist/api/compute/code.d.ts +28 -0
  109. package/dist/api/compute/code.js +257 -0
  110. package/dist/api/compute/code.js.map +1 -0
  111. package/dist/api/compute/data.d.ts +72 -0
  112. package/dist/api/compute/data.js +264 -0
  113. package/dist/api/compute/data.js.map +1 -0
  114. package/dist/api/compute/gateway.d.ts +185 -0
  115. package/dist/api/compute/gateway.js +958 -0
  116. package/dist/api/compute/gateway.js.map +1 -0
  117. package/dist/api/compute/index.d.ts +21 -0
  118. package/dist/api/compute/index.js +46 -0
  119. package/dist/api/compute/index.js.map +1 -0
  120. package/dist/api/compute/llm.d.ts +64 -0
  121. package/dist/api/compute/llm.js +602 -0
  122. package/dist/api/compute/llm.js.map +1 -0
  123. package/dist/api/compute/persistence.d.ts +77 -0
  124. package/dist/api/compute/persistence.js +251 -0
  125. package/dist/api/compute/persistence.js.map +1 -0
  126. package/dist/api/compute/storage.d.ts +48 -0
  127. package/dist/api/compute/storage.js +283 -0
  128. package/dist/api/compute/storage.js.map +1 -0
  129. package/dist/api/compute/trade.d.ts +69 -0
  130. package/dist/api/compute/trade.js +460 -0
  131. package/dist/api/compute/trade.js.map +1 -0
  132. package/dist/api/compute/types.d.ts +271 -0
  133. package/dist/api/compute/types.js +87 -0
  134. package/dist/api/compute/types.js.map +1 -0
  135. package/dist/api/compute/web.d.ts +29 -0
  136. package/dist/api/compute/web.js +255 -0
  137. package/dist/api/compute/web.js.map +1 -0
  138. package/dist/api/custody.d.ts +48 -0
  139. package/dist/api/custody.js +272 -0
  140. package/dist/api/custody.js.map +1 -0
  141. package/dist/api/fees.d.ts +91 -0
  142. package/dist/api/fees.js +155 -0
  143. package/dist/api/fees.js.map +1 -0
  144. package/dist/api/gateway.d.ts +40 -0
  145. package/dist/api/gateway.js +569 -0
  146. package/dist/api/gateway.js.map +1 -0
  147. package/dist/api/index.d.ts +29 -0
  148. package/dist/api/index.js +55 -0
  149. package/dist/api/index.js.map +1 -0
  150. package/dist/api/jobs.d.ts +59 -0
  151. package/dist/api/jobs.js +362 -0
  152. package/dist/api/jobs.js.map +1 -0
  153. package/dist/api/middleware.d.ts +60 -0
  154. package/dist/api/middleware.js +315 -0
  155. package/dist/api/middleware.js.map +1 -0
  156. package/dist/api/prompt.d.ts +44 -0
  157. package/dist/api/prompt.js +345 -0
  158. package/dist/api/prompt.js.map +1 -0
  159. package/dist/api/sdk.d.ts +258 -0
  160. package/dist/api/sdk.js +341 -0
  161. package/dist/api/sdk.js.map +1 -0
  162. package/dist/api/server.d.ts +17 -0
  163. package/dist/api/server.js +852 -0
  164. package/dist/api/server.js.map +1 -0
  165. package/dist/api/types.d.ts +307 -0
  166. package/dist/api/types.js +64 -0
  167. package/dist/api/types.js.map +1 -0
  168. package/dist/arbitrage/index.d.ts +124 -0
  169. package/dist/arbitrage/index.js +482 -0
  170. package/dist/arbitrage/index.js.map +1 -0
  171. package/dist/auth/copilot.d.ts +87 -0
  172. package/dist/auth/copilot.js +328 -0
  173. package/dist/auth/copilot.js.map +1 -0
  174. package/dist/auth/google.d.ts +121 -0
  175. package/dist/auth/google.js +479 -0
  176. package/dist/auth/google.js.map +1 -0
  177. package/dist/auth/index.d.ts +8 -0
  178. package/dist/auth/index.js +25 -0
  179. package/dist/auth/index.js.map +1 -0
  180. package/dist/auth/oauth.d.ts +94 -0
  181. package/dist/auth/oauth.js +502 -0
  182. package/dist/auth/oauth.js.map +1 -0
  183. package/dist/auth/qwen.d.ts +110 -0
  184. package/dist/auth/qwen.js +351 -0
  185. package/dist/auth/qwen.js.map +1 -0
  186. package/dist/auto-reply/index.d.ts +143 -0
  187. package/dist/auto-reply/index.js +391 -0
  188. package/dist/auto-reply/index.js.map +1 -0
  189. package/dist/automation/cron.d.ts +66 -0
  190. package/dist/automation/cron.js +226 -0
  191. package/dist/automation/cron.js.map +1 -0
  192. package/dist/automation/heartbeats.d.ts +63 -0
  193. package/dist/automation/heartbeats.js +144 -0
  194. package/dist/automation/heartbeats.js.map +1 -0
  195. package/dist/automation/index.d.ts +9 -0
  196. package/dist/automation/index.js +15 -0
  197. package/dist/automation/index.js.map +1 -0
  198. package/dist/automation/webhooks.d.ts +60 -0
  199. package/dist/automation/webhooks.js +225 -0
  200. package/dist/automation/webhooks.js.map +1 -0
  201. package/dist/bankr/client.d.ts +86 -0
  202. package/dist/bankr/client.js +177 -0
  203. package/dist/bankr/client.js.map +1 -0
  204. package/dist/bankr/index.d.ts +6 -0
  205. package/dist/bankr/index.js +23 -0
  206. package/dist/bankr/index.js.map +1 -0
  207. package/dist/base/index.d.ts +6 -0
  208. package/dist/base/index.js +23 -0
  209. package/dist/base/index.js.map +1 -0
  210. package/dist/base/provider.d.ts +27 -0
  211. package/dist/base/provider.js +128 -0
  212. package/dist/base/provider.js.map +1 -0
  213. package/dist/bin/worker.d.ts +31 -0
  214. package/dist/bin/worker.js +127 -0
  215. package/dist/bin/worker.js.map +1 -0
  216. package/dist/bittensor/chutes.d.ts +14 -0
  217. package/dist/bittensor/chutes.js +141 -0
  218. package/dist/bittensor/chutes.js.map +1 -0
  219. package/dist/bittensor/index.d.ts +7 -0
  220. package/dist/bittensor/index.js +13 -0
  221. package/dist/bittensor/index.js.map +1 -0
  222. package/dist/bittensor/persistence.d.ts +8 -0
  223. package/dist/bittensor/persistence.js +188 -0
  224. package/dist/bittensor/persistence.js.map +1 -0
  225. package/dist/bittensor/plugin.d.ts +30 -0
  226. package/dist/bittensor/plugin.js +134 -0
  227. package/dist/bittensor/plugin.js.map +1 -0
  228. package/dist/bittensor/python-runner.d.ts +7 -0
  229. package/dist/bittensor/python-runner.js +83 -0
  230. package/dist/bittensor/python-runner.js.map +1 -0
  231. package/dist/bittensor/server.d.ts +7 -0
  232. package/dist/bittensor/server.js +110 -0
  233. package/dist/bittensor/server.js.map +1 -0
  234. package/dist/bittensor/service.d.ts +7 -0
  235. package/dist/bittensor/service.js +291 -0
  236. package/dist/bittensor/service.js.map +1 -0
  237. package/dist/bittensor/tool.d.ts +45 -0
  238. package/dist/bittensor/tool.js +147 -0
  239. package/dist/bittensor/tool.js.map +1 -0
  240. package/dist/bittensor/types.d.ts +188 -0
  241. package/dist/bittensor/types.js +6 -0
  242. package/dist/bittensor/types.js.map +1 -0
  243. package/dist/bittensor/wallet.d.ts +18 -0
  244. package/dist/bittensor/wallet.js +192 -0
  245. package/dist/bittensor/wallet.js.map +1 -0
  246. package/dist/bridge/wormhole.d.ts +239 -0
  247. package/dist/bridge/wormhole.js +404 -0
  248. package/dist/bridge/wormhole.js.map +1 -0
  249. package/dist/browser/index.d.ts +67 -0
  250. package/dist/browser/index.js +458 -0
  251. package/dist/browser/index.js.map +1 -0
  252. package/dist/cache/index.d.ts +105 -0
  253. package/dist/cache/index.js +306 -0
  254. package/dist/cache/index.js.map +1 -0
  255. package/dist/canvas/index.d.ts +66 -0
  256. package/dist/canvas/index.js +391 -0
  257. package/dist/canvas/index.js.map +1 -0
  258. package/dist/channels/base-adapter.d.ts +126 -0
  259. package/dist/channels/base-adapter.js +416 -0
  260. package/dist/channels/base-adapter.js.map +1 -0
  261. package/dist/channels/bluebubbles/index.d.ts +23 -0
  262. package/dist/channels/bluebubbles/index.js +182 -0
  263. package/dist/channels/bluebubbles/index.js.map +1 -0
  264. package/dist/channels/discord/index.d.ts +25 -0
  265. package/dist/channels/discord/index.js +419 -0
  266. package/dist/channels/discord/index.js.map +1 -0
  267. package/dist/channels/googlechat/index.d.ts +35 -0
  268. package/dist/channels/googlechat/index.js +223 -0
  269. package/dist/channels/googlechat/index.js.map +1 -0
  270. package/dist/channels/imessage/index.d.ts +28 -0
  271. package/dist/channels/imessage/index.js +340 -0
  272. package/dist/channels/imessage/index.js.map +1 -0
  273. package/dist/channels/index.d.ts +58 -0
  274. package/dist/channels/index.js +382 -0
  275. package/dist/channels/index.js.map +1 -0
  276. package/dist/channels/line/index.d.ts +307 -0
  277. package/dist/channels/line/index.js +760 -0
  278. package/dist/channels/line/index.js.map +1 -0
  279. package/dist/channels/matrix/index.d.ts +35 -0
  280. package/dist/channels/matrix/index.js +328 -0
  281. package/dist/channels/matrix/index.js.map +1 -0
  282. package/dist/channels/mattermost/index.d.ts +25 -0
  283. package/dist/channels/mattermost/index.js +239 -0
  284. package/dist/channels/mattermost/index.js.map +1 -0
  285. package/dist/channels/nextcloud-talk/index.d.ts +25 -0
  286. package/dist/channels/nextcloud-talk/index.js +175 -0
  287. package/dist/channels/nextcloud-talk/index.js.map +1 -0
  288. package/dist/channels/nostr/index.d.ts +21 -0
  289. package/dist/channels/nostr/index.js +278 -0
  290. package/dist/channels/nostr/index.js.map +1 -0
  291. package/dist/channels/signal/index.d.ts +33 -0
  292. package/dist/channels/signal/index.js +333 -0
  293. package/dist/channels/signal/index.js.map +1 -0
  294. package/dist/channels/slack/index.d.ts +26 -0
  295. package/dist/channels/slack/index.js +266 -0
  296. package/dist/channels/slack/index.js.map +1 -0
  297. package/dist/channels/teams/index.d.ts +42 -0
  298. package/dist/channels/teams/index.js +312 -0
  299. package/dist/channels/teams/index.js.map +1 -0
  300. package/dist/channels/telegram/index.d.ts +9 -0
  301. package/dist/channels/telegram/index.js +761 -0
  302. package/dist/channels/telegram/index.js.map +1 -0
  303. package/dist/channels/tlon/index.d.ts +25 -0
  304. package/dist/channels/tlon/index.js +236 -0
  305. package/dist/channels/tlon/index.js.map +1 -0
  306. package/dist/channels/twitch/index.d.ts +25 -0
  307. package/dist/channels/twitch/index.js +182 -0
  308. package/dist/channels/twitch/index.js.map +1 -0
  309. package/dist/channels/voice/index.d.ts +31 -0
  310. package/dist/channels/voice/index.js +208 -0
  311. package/dist/channels/voice/index.js.map +1 -0
  312. package/dist/channels/webchat/index.d.ts +29 -0
  313. package/dist/channels/webchat/index.js +366 -0
  314. package/dist/channels/webchat/index.js.map +1 -0
  315. package/dist/channels/whatsapp/index.d.ts +72 -0
  316. package/dist/channels/whatsapp/index.js +767 -0
  317. package/dist/channels/whatsapp/index.js.map +1 -0
  318. package/dist/channels/zalo/index.d.ts +45 -0
  319. package/dist/channels/zalo/index.js +285 -0
  320. package/dist/channels/zalo/index.js.map +1 -0
  321. package/dist/cli/commands/doctor.d.ts +23 -0
  322. package/dist/cli/commands/doctor.js +649 -0
  323. package/dist/cli/commands/doctor.js.map +1 -0
  324. package/dist/cli/commands/gateway.d.ts +6 -0
  325. package/dist/cli/commands/gateway.js +32 -0
  326. package/dist/cli/commands/gateway.js.map +1 -0
  327. package/dist/cli/commands/index.d.ts +31 -0
  328. package/dist/cli/commands/index.js +3743 -0
  329. package/dist/cli/commands/index.js.map +1 -0
  330. package/dist/cli/commands/onboard.d.ts +4 -0
  331. package/dist/cli/commands/onboard.js +334 -0
  332. package/dist/cli/commands/onboard.js.map +1 -0
  333. package/dist/cli/commands/repl.d.ts +11 -0
  334. package/dist/cli/commands/repl.js +185 -0
  335. package/dist/cli/commands/repl.js.map +1 -0
  336. package/dist/cli/commands/skills.d.ts +29 -0
  337. package/dist/cli/commands/skills.js +297 -0
  338. package/dist/cli/commands/skills.js.map +1 -0
  339. package/dist/cli/index.d.ts +12 -0
  340. package/dist/cli/index.js +449 -0
  341. package/dist/cli/index.js.map +1 -0
  342. package/dist/cli/secure.d.ts +14 -0
  343. package/dist/cli/secure.js +626 -0
  344. package/dist/cli/secure.js.map +1 -0
  345. package/dist/commands/index.d.ts +61 -0
  346. package/dist/commands/index.js +290 -0
  347. package/dist/commands/index.js.map +1 -0
  348. package/dist/commands/registry.d.ts +69 -0
  349. package/dist/commands/registry.js +3142 -0
  350. package/dist/commands/registry.js.map +1 -0
  351. package/dist/config/index.d.ts +465 -0
  352. package/dist/config/index.js +1451 -0
  353. package/dist/config/index.js.map +1 -0
  354. package/dist/credentials/index.d.ts +51 -0
  355. package/dist/credentials/index.js +270 -0
  356. package/dist/credentials/index.js.map +1 -0
  357. package/dist/cron/index.d.ts +151 -0
  358. package/dist/cron/index.js +1283 -0
  359. package/dist/cron/index.js.map +1 -0
  360. package/dist/cron/types.d.ts +102 -0
  361. package/dist/cron/types.js +6 -0
  362. package/dist/cron/types.js.map +1 -0
  363. package/dist/daemon/index.d.ts +23 -0
  364. package/dist/daemon/index.js +159 -0
  365. package/dist/daemon/index.js.map +1 -0
  366. package/dist/db/index.d.ts +825 -0
  367. package/dist/db/index.js +3382 -0
  368. package/dist/db/index.js.map +1 -0
  369. package/dist/db/migrations.d.ts +70 -0
  370. package/dist/db/migrations.js +1373 -0
  371. package/dist/db/migrations.js.map +1 -0
  372. package/dist/docker/index.d.ts +188 -0
  373. package/dist/docker/index.js +571 -0
  374. package/dist/docker/index.js.map +1 -0
  375. package/dist/doctor/index.d.ts +47 -0
  376. package/dist/doctor/index.js +379 -0
  377. package/dist/doctor/index.js.map +1 -0
  378. package/dist/embeddings/index.d.ts +65 -0
  379. package/dist/embeddings/index.js +399 -0
  380. package/dist/embeddings/index.js.map +1 -0
  381. package/dist/evm/contracts.d.ts +112 -0
  382. package/dist/evm/contracts.js +332 -0
  383. package/dist/evm/contracts.js.map +1 -0
  384. package/dist/evm/index.d.ts +21 -0
  385. package/dist/evm/index.js +45 -0
  386. package/dist/evm/index.js.map +1 -0
  387. package/dist/evm/multichain.d.ts +87 -0
  388. package/dist/evm/multichain.js +308 -0
  389. package/dist/evm/multichain.js.map +1 -0
  390. package/dist/evm/odos.d.ts +62 -0
  391. package/dist/evm/odos.js +261 -0
  392. package/dist/evm/odos.js.map +1 -0
  393. package/dist/evm/oneinch.d.ts +55 -0
  394. package/dist/evm/oneinch.js +324 -0
  395. package/dist/evm/oneinch.js.map +1 -0
  396. package/dist/evm/transfers.d.ts +83 -0
  397. package/dist/evm/transfers.js +393 -0
  398. package/dist/evm/transfers.js.map +1 -0
  399. package/dist/evm/uniswap.d.ts +56 -0
  400. package/dist/evm/uniswap.js +307 -0
  401. package/dist/evm/uniswap.js.map +1 -0
  402. package/dist/evm/virtuals.d.ts +220 -0
  403. package/dist/evm/virtuals.js +735 -0
  404. package/dist/evm/virtuals.js.map +1 -0
  405. package/dist/evm/wallet.d.ts +96 -0
  406. package/dist/evm/wallet.js +258 -0
  407. package/dist/evm/wallet.js.map +1 -0
  408. package/dist/exchanges/binance-futures/index.d.ts +83 -0
  409. package/dist/exchanges/binance-futures/index.js +394 -0
  410. package/dist/exchanges/binance-futures/index.js.map +1 -0
  411. package/dist/exchanges/bybit/index.d.ts +78 -0
  412. package/dist/exchanges/bybit/index.js +379 -0
  413. package/dist/exchanges/bybit/index.js.map +1 -0
  414. package/dist/exchanges/hyperliquid/index.d.ts +594 -0
  415. package/dist/exchanges/hyperliquid/index.js +1101 -0
  416. package/dist/exchanges/hyperliquid/index.js.map +1 -0
  417. package/dist/exchanges/mexc/index.d.ts +80 -0
  418. package/dist/exchanges/mexc/index.js +389 -0
  419. package/dist/exchanges/mexc/index.js.map +1 -0
  420. package/dist/exchanges/opinion/index.d.ts +128 -0
  421. package/dist/exchanges/opinion/index.js +443 -0
  422. package/dist/exchanges/opinion/index.js.map +1 -0
  423. package/dist/exchanges/predictfun/index.d.ts +107 -0
  424. package/dist/exchanges/predictfun/index.js +398 -0
  425. package/dist/exchanges/predictfun/index.js.map +1 -0
  426. package/dist/execution/auto-redeem.d.ts +55 -0
  427. package/dist/execution/auto-redeem.js +324 -0
  428. package/dist/execution/auto-redeem.js.map +1 -0
  429. package/dist/execution/bracket-orders.d.ts +84 -0
  430. package/dist/execution/bracket-orders.js +387 -0
  431. package/dist/execution/bracket-orders.js.map +1 -0
  432. package/dist/execution/circuit-breaker.d.ts +87 -0
  433. package/dist/execution/circuit-breaker.js +274 -0
  434. package/dist/execution/circuit-breaker.js.map +1 -0
  435. package/dist/execution/dca-persistence.d.ts +47 -0
  436. package/dist/execution/dca-persistence.js +159 -0
  437. package/dist/execution/dca-persistence.js.map +1 -0
  438. package/dist/execution/dca.d.ts +60 -0
  439. package/dist/execution/dca.js +273 -0
  440. package/dist/execution/dca.js.map +1 -0
  441. package/dist/execution/futures.d.ts +162 -0
  442. package/dist/execution/futures.js +1336 -0
  443. package/dist/execution/futures.js.map +1 -0
  444. package/dist/execution/index.d.ts +346 -0
  445. package/dist/execution/index.js +2532 -0
  446. package/dist/execution/index.js.map +1 -0
  447. package/dist/execution/mev-protection.d.ts +150 -0
  448. package/dist/execution/mev-protection.js +377 -0
  449. package/dist/execution/mev-protection.js.map +1 -0
  450. package/dist/execution/order-persistence.d.ts +81 -0
  451. package/dist/execution/order-persistence.js +350 -0
  452. package/dist/execution/order-persistence.js.map +1 -0
  453. package/dist/execution/position-manager.d.ts +142 -0
  454. package/dist/execution/position-manager.js +404 -0
  455. package/dist/execution/position-manager.js.map +1 -0
  456. package/dist/execution/smart-router.d.ts +90 -0
  457. package/dist/execution/smart-router.js +323 -0
  458. package/dist/execution/smart-router.js.map +1 -0
  459. package/dist/execution/trigger-orders.d.ts +81 -0
  460. package/dist/execution/trigger-orders.js +266 -0
  461. package/dist/execution/trigger-orders.js.map +1 -0
  462. package/dist/execution/twap.d.ts +87 -0
  463. package/dist/execution/twap.js +405 -0
  464. package/dist/execution/twap.js.map +1 -0
  465. package/dist/extensions/copilot-proxy/index.d.ts +49 -0
  466. package/dist/extensions/copilot-proxy/index.js +204 -0
  467. package/dist/extensions/copilot-proxy/index.js.map +1 -0
  468. package/dist/extensions/diagnostics-otel/index.d.ts +54 -0
  469. package/dist/extensions/diagnostics-otel/index.js +290 -0
  470. package/dist/extensions/diagnostics-otel/index.js.map +1 -0
  471. package/dist/extensions/google-auth/index.d.ts +71 -0
  472. package/dist/extensions/google-auth/index.js +350 -0
  473. package/dist/extensions/google-auth/index.js.map +1 -0
  474. package/dist/extensions/index.d.ts +11 -0
  475. package/dist/extensions/index.js +29 -0
  476. package/dist/extensions/index.js.map +1 -0
  477. package/dist/extensions/llm-task/index.d.ts +80 -0
  478. package/dist/extensions/llm-task/index.js +248 -0
  479. package/dist/extensions/llm-task/index.js.map +1 -0
  480. package/dist/extensions/lobster/index.d.ts +69 -0
  481. package/dist/extensions/lobster/index.js +178 -0
  482. package/dist/extensions/lobster/index.js.map +1 -0
  483. package/dist/extensions/memory-lancedb/index.d.ts +62 -0
  484. package/dist/extensions/memory-lancedb/index.js +343 -0
  485. package/dist/extensions/memory-lancedb/index.js.map +1 -0
  486. package/dist/extensions/open-prose/index.d.ts +82 -0
  487. package/dist/extensions/open-prose/index.js +565 -0
  488. package/dist/extensions/open-prose/index.js.map +1 -0
  489. package/dist/extensions/qwen-portal/index.d.ts +48 -0
  490. package/dist/extensions/qwen-portal/index.js +161 -0
  491. package/dist/extensions/qwen-portal/index.js.map +1 -0
  492. package/dist/extensions/task-runner/index.d.ts +121 -0
  493. package/dist/extensions/task-runner/index.js +640 -0
  494. package/dist/extensions/task-runner/index.js.map +1 -0
  495. package/dist/farcaster/client.d.ts +101 -0
  496. package/dist/farcaster/client.js +282 -0
  497. package/dist/farcaster/client.js.map +1 -0
  498. package/dist/farcaster/index.d.ts +4 -0
  499. package/dist/farcaster/index.js +21 -0
  500. package/dist/farcaster/index.js.map +1 -0
  501. package/dist/feeds/acled/index.d.ts +86 -0
  502. package/dist/feeds/acled/index.js +215 -0
  503. package/dist/feeds/acled/index.js.map +1 -0
  504. package/dist/feeds/agentbets/index.d.ts +17 -0
  505. package/dist/feeds/agentbets/index.js +137 -0
  506. package/dist/feeds/agentbets/index.js.map +1 -0
  507. package/dist/feeds/betfair/index.d.ts +132 -0
  508. package/dist/feeds/betfair/index.js +640 -0
  509. package/dist/feeds/betfair/index.js.map +1 -0
  510. package/dist/feeds/crypto/index.d.ts +101 -0
  511. package/dist/feeds/crypto/index.js +506 -0
  512. package/dist/feeds/crypto/index.js.map +1 -0
  513. package/dist/feeds/crypto/whale-tracker.d.ts +138 -0
  514. package/dist/feeds/crypto/whale-tracker.js +685 -0
  515. package/dist/feeds/crypto/whale-tracker.js.map +1 -0
  516. package/dist/feeds/descriptors.d.ts +14 -0
  517. package/dist/feeds/descriptors.js +582 -0
  518. package/dist/feeds/descriptors.js.map +1 -0
  519. package/dist/feeds/drift/index.d.ts +23 -0
  520. package/dist/feeds/drift/index.js +182 -0
  521. package/dist/feeds/drift/index.js.map +1 -0
  522. package/dist/feeds/drift/trading.d.ts +75 -0
  523. package/dist/feeds/drift/trading.js +457 -0
  524. package/dist/feeds/drift/trading.js.map +1 -0
  525. package/dist/feeds/external/index.d.ts +48 -0
  526. package/dist/feeds/external/index.js +575 -0
  527. package/dist/feeds/external/index.js.map +1 -0
  528. package/dist/feeds/fred/index.d.ts +134 -0
  529. package/dist/feeds/fred/index.js +263 -0
  530. package/dist/feeds/fred/index.js.map +1 -0
  531. package/dist/feeds/freshness.d.ts +79 -0
  532. package/dist/feeds/freshness.js +259 -0
  533. package/dist/feeds/freshness.js.map +1 -0
  534. package/dist/feeds/hedgehog/index.d.ts +24 -0
  535. package/dist/feeds/hedgehog/index.js +589 -0
  536. package/dist/feeds/hedgehog/index.js.map +1 -0
  537. package/dist/feeds/hedgehog/types.d.ts +215 -0
  538. package/dist/feeds/hedgehog/types.js +7 -0
  539. package/dist/feeds/hedgehog/types.js.map +1 -0
  540. package/dist/feeds/index.d.ts +38 -0
  541. package/dist/feeds/index.js +469 -0
  542. package/dist/feeds/index.js.map +1 -0
  543. package/dist/feeds/kalshi/index.d.ts +116 -0
  544. package/dist/feeds/kalshi/index.js +970 -0
  545. package/dist/feeds/kalshi/index.js.map +1 -0
  546. package/dist/feeds/manifold/index.d.ts +15 -0
  547. package/dist/feeds/manifold/index.js +269 -0
  548. package/dist/feeds/manifold/index.js.map +1 -0
  549. package/dist/feeds/metaculus/index.d.ts +22 -0
  550. package/dist/feeds/metaculus/index.js +149 -0
  551. package/dist/feeds/metaculus/index.js.map +1 -0
  552. package/dist/feeds/news/index.d.ts +20 -0
  553. package/dist/feeds/news/index.js +308 -0
  554. package/dist/feeds/news/index.js.map +1 -0
  555. package/dist/feeds/opinion/index.d.ts +31 -0
  556. package/dist/feeds/opinion/index.js +389 -0
  557. package/dist/feeds/opinion/index.js.map +1 -0
  558. package/dist/feeds/polymarket/index.d.ts +21 -0
  559. package/dist/feeds/polymarket/index.js +501 -0
  560. package/dist/feeds/polymarket/index.js.map +1 -0
  561. package/dist/feeds/polymarket/rtds.d.ts +40 -0
  562. package/dist/feeds/polymarket/rtds.js +159 -0
  563. package/dist/feeds/polymarket/rtds.js.map +1 -0
  564. package/dist/feeds/polymarket/user-ws.d.ts +64 -0
  565. package/dist/feeds/polymarket/user-ws.js +230 -0
  566. package/dist/feeds/polymarket/user-ws.js.map +1 -0
  567. package/dist/feeds/polymarket/whale-tracker.d.ts +152 -0
  568. package/dist/feeds/polymarket/whale-tracker.js +709 -0
  569. package/dist/feeds/polymarket/whale-tracker.js.map +1 -0
  570. package/dist/feeds/predictfun/index.d.ts +24 -0
  571. package/dist/feeds/predictfun/index.js +234 -0
  572. package/dist/feeds/predictfun/index.js.map +1 -0
  573. package/dist/feeds/predictit/index.d.ts +14 -0
  574. package/dist/feeds/predictit/index.js +88 -0
  575. package/dist/feeds/predictit/index.js.map +1 -0
  576. package/dist/feeds/registry.d.ts +148 -0
  577. package/dist/feeds/registry.js +197 -0
  578. package/dist/feeds/registry.js.map +1 -0
  579. package/dist/feeds/smarkets/index.d.ts +76 -0
  580. package/dist/feeds/smarkets/index.js +415 -0
  581. package/dist/feeds/smarkets/index.js.map +1 -0
  582. package/dist/feeds/virtuals/index.d.ts +92 -0
  583. package/dist/feeds/virtuals/index.js +341 -0
  584. package/dist/feeds/virtuals/index.js.map +1 -0
  585. package/dist/feeds/weather-nws/index.d.ts +73 -0
  586. package/dist/feeds/weather-nws/index.js +162 -0
  587. package/dist/feeds/weather-nws/index.js.map +1 -0
  588. package/dist/feeds/weather-openmeteo/index.d.ts +80 -0
  589. package/dist/feeds/weather-openmeteo/index.js +197 -0
  590. package/dist/feeds/weather-openmeteo/index.js.map +1 -0
  591. package/dist/gateway/alerts-routes.d.ts +15 -0
  592. package/dist/gateway/alerts-routes.js +188 -0
  593. package/dist/gateway/alerts-routes.js.map +1 -0
  594. package/dist/gateway/alt-data-routes.d.ts +15 -0
  595. package/dist/gateway/alt-data-routes.js +67 -0
  596. package/dist/gateway/alt-data-routes.js.map +1 -0
  597. package/dist/gateway/api-routes.d.ts +39 -0
  598. package/dist/gateway/api-routes.js +1028 -0
  599. package/dist/gateway/api-routes.js.map +1 -0
  600. package/dist/gateway/audit-routes.d.ts +8 -0
  601. package/dist/gateway/audit-routes.js +61 -0
  602. package/dist/gateway/audit-routes.js.map +1 -0
  603. package/dist/gateway/bracket-routes.d.ts +12 -0
  604. package/dist/gateway/bracket-routes.js +122 -0
  605. package/dist/gateway/bracket-routes.js.map +1 -0
  606. package/dist/gateway/control-ui.d.ts +45 -0
  607. package/dist/gateway/control-ui.js +301 -0
  608. package/dist/gateway/control-ui.js.map +1 -0
  609. package/dist/gateway/copy-trading-routes.d.ts +12 -0
  610. package/dist/gateway/copy-trading-routes.js +159 -0
  611. package/dist/gateway/copy-trading-routes.js.map +1 -0
  612. package/dist/gateway/cron-routes.d.ts +14 -0
  613. package/dist/gateway/cron-routes.js +132 -0
  614. package/dist/gateway/cron-routes.js.map +1 -0
  615. package/dist/gateway/dca-routes.d.ts +8 -0
  616. package/dist/gateway/dca-routes.js +179 -0
  617. package/dist/gateway/dca-routes.js.map +1 -0
  618. package/dist/gateway/embeddings-routes.d.ts +12 -0
  619. package/dist/gateway/embeddings-routes.js +102 -0
  620. package/dist/gateway/embeddings-routes.js.map +1 -0
  621. package/dist/gateway/feeds-routes.d.ts +34 -0
  622. package/dist/gateway/feeds-routes.js +167 -0
  623. package/dist/gateway/feeds-routes.js.map +1 -0
  624. package/dist/gateway/index.d.ts +100 -0
  625. package/dist/gateway/index.js +2321 -0
  626. package/dist/gateway/index.js.map +1 -0
  627. package/dist/gateway/monitoring-routes.d.ts +12 -0
  628. package/dist/gateway/monitoring-routes.js +73 -0
  629. package/dist/gateway/monitoring-routes.js.map +1 -0
  630. package/dist/gateway/opportunity-routes.d.ts +12 -0
  631. package/dist/gateway/opportunity-routes.js +238 -0
  632. package/dist/gateway/opportunity-routes.js.map +1 -0
  633. package/dist/gateway/payments-routes.d.ts +14 -0
  634. package/dist/gateway/payments-routes.js +82 -0
  635. package/dist/gateway/payments-routes.js.map +1 -0
  636. package/dist/gateway/percolator-routes.d.ts +16 -0
  637. package/dist/gateway/percolator-routes.js +139 -0
  638. package/dist/gateway/percolator-routes.js.map +1 -0
  639. package/dist/gateway/queue-routes.d.ts +12 -0
  640. package/dist/gateway/queue-routes.js +47 -0
  641. package/dist/gateway/queue-routes.js.map +1 -0
  642. package/dist/gateway/risk-routes.d.ts +12 -0
  643. package/dist/gateway/risk-routes.js +119 -0
  644. package/dist/gateway/risk-routes.js.map +1 -0
  645. package/dist/gateway/routing-routes.d.ts +12 -0
  646. package/dist/gateway/routing-routes.js +86 -0
  647. package/dist/gateway/routing-routes.js.map +1 -0
  648. package/dist/gateway/server.d.ts +215 -0
  649. package/dist/gateway/server.js +2287 -0
  650. package/dist/gateway/server.js.map +1 -0
  651. package/dist/gateway/shield-routes.d.ts +8 -0
  652. package/dist/gateway/shield-routes.js +88 -0
  653. package/dist/gateway/shield-routes.js.map +1 -0
  654. package/dist/gateway/signal-bus.d.ts +51 -0
  655. package/dist/gateway/signal-bus.js +64 -0
  656. package/dist/gateway/signal-bus.js.map +1 -0
  657. package/dist/gateway/trigger-routes.d.ts +12 -0
  658. package/dist/gateway/trigger-routes.js +127 -0
  659. package/dist/gateway/trigger-routes.js.map +1 -0
  660. package/dist/gateway/twap-routes.d.ts +12 -0
  661. package/dist/gateway/twap-routes.js +142 -0
  662. package/dist/gateway/twap-routes.js.map +1 -0
  663. package/dist/gateway/webhooks-routes.d.ts +31 -0
  664. package/dist/gateway/webhooks-routes.js +107 -0
  665. package/dist/gateway/webhooks-routes.js.map +1 -0
  666. package/dist/gateway/whale-routes.d.ts +12 -0
  667. package/dist/gateway/whale-routes.js +204 -0
  668. package/dist/gateway/whale-routes.js.map +1 -0
  669. package/dist/history/index.d.ts +81 -0
  670. package/dist/history/index.js +362 -0
  671. package/dist/history/index.js.map +1 -0
  672. package/dist/hooks/index.d.ts +279 -0
  673. package/dist/hooks/index.js +739 -0
  674. package/dist/hooks/index.js.map +1 -0
  675. package/dist/i18n/index.d.ts +65 -0
  676. package/dist/i18n/index.js +183 -0
  677. package/dist/i18n/index.js.map +1 -0
  678. package/dist/identity/erc8004.d.ts +104 -0
  679. package/dist/identity/erc8004.js +493 -0
  680. package/dist/identity/erc8004.js.map +1 -0
  681. package/dist/identity/index.d.ts +1 -0
  682. package/dist/identity/index.js +18 -0
  683. package/dist/identity/index.js.map +1 -0
  684. package/dist/index.d.ts +7 -0
  685. package/dist/index.js +240 -0
  686. package/dist/index.js.map +1 -0
  687. package/dist/infra/index.d.ts +133 -0
  688. package/dist/infra/index.js +481 -0
  689. package/dist/infra/index.js.map +1 -0
  690. package/dist/infra/retry.d.ts +132 -0
  691. package/dist/infra/retry.js +450 -0
  692. package/dist/infra/retry.js.map +1 -0
  693. package/dist/ledger/anchor.d.ts +45 -0
  694. package/dist/ledger/anchor.js +271 -0
  695. package/dist/ledger/anchor.js.map +1 -0
  696. package/dist/ledger/hash.d.ts +26 -0
  697. package/dist/ledger/hash.js +69 -0
  698. package/dist/ledger/hash.js.map +1 -0
  699. package/dist/ledger/hooks.d.ts +107 -0
  700. package/dist/ledger/hooks.js +314 -0
  701. package/dist/ledger/hooks.js.map +1 -0
  702. package/dist/ledger/index.d.ts +67 -0
  703. package/dist/ledger/index.js +221 -0
  704. package/dist/ledger/index.js.map +1 -0
  705. package/dist/ledger/storage.d.ts +57 -0
  706. package/dist/ledger/storage.js +368 -0
  707. package/dist/ledger/storage.js.map +1 -0
  708. package/dist/ledger/types.d.ts +138 -0
  709. package/dist/ledger/types.js +16 -0
  710. package/dist/ledger/types.js.map +1 -0
  711. package/dist/link-understanding/index.d.ts +61 -0
  712. package/dist/link-understanding/index.js +320 -0
  713. package/dist/link-understanding/index.js.map +1 -0
  714. package/dist/logging/index.d.ts +50 -0
  715. package/dist/logging/index.js +255 -0
  716. package/dist/logging/index.js.map +1 -0
  717. package/dist/macos/index.d.ts +143 -0
  718. package/dist/macos/index.js +587 -0
  719. package/dist/macos/index.js.map +1 -0
  720. package/dist/markdown/index.d.ts +43 -0
  721. package/dist/markdown/index.js +305 -0
  722. package/dist/markdown/index.js.map +1 -0
  723. package/dist/market-index/index.d.ts +51 -0
  724. package/dist/market-index/index.js +553 -0
  725. package/dist/market-index/index.js.map +1 -0
  726. package/dist/mcp/index.d.ts +263 -0
  727. package/dist/mcp/index.js +940 -0
  728. package/dist/mcp/index.js.map +1 -0
  729. package/dist/mcp/installer.d.ts +11 -0
  730. package/dist/mcp/installer.js +128 -0
  731. package/dist/mcp/installer.js.map +1 -0
  732. package/dist/mcp/server.d.ts +7 -0
  733. package/dist/mcp/server.js +172 -0
  734. package/dist/mcp/server.js.map +1 -0
  735. package/dist/media/index.d.ts +119 -0
  736. package/dist/media/index.js +740 -0
  737. package/dist/media/index.js.map +1 -0
  738. package/dist/memory/context.d.ts +189 -0
  739. package/dist/memory/context.js +541 -0
  740. package/dist/memory/context.js.map +1 -0
  741. package/dist/memory/index.d.ts +74 -0
  742. package/dist/memory/index.js +352 -0
  743. package/dist/memory/index.js.map +1 -0
  744. package/dist/memory/summarizer.d.ts +10 -0
  745. package/dist/memory/summarizer.js +51 -0
  746. package/dist/memory/summarizer.js.map +1 -0
  747. package/dist/memory/tokenizer.d.ts +4 -0
  748. package/dist/memory/tokenizer.js +61 -0
  749. package/dist/memory/tokenizer.js.map +1 -0
  750. package/dist/messages/unified.d.ts +7 -0
  751. package/dist/messages/unified.js +77 -0
  752. package/dist/messages/unified.js.map +1 -0
  753. package/dist/ml-pipeline/collector.d.ts +23 -0
  754. package/dist/ml-pipeline/collector.js +176 -0
  755. package/dist/ml-pipeline/collector.js.map +1 -0
  756. package/dist/ml-pipeline/index.d.ts +21 -0
  757. package/dist/ml-pipeline/index.js +72 -0
  758. package/dist/ml-pipeline/index.js.map +1 -0
  759. package/dist/ml-pipeline/trainer.d.ts +32 -0
  760. package/dist/ml-pipeline/trainer.js +228 -0
  761. package/dist/ml-pipeline/trainer.js.map +1 -0
  762. package/dist/ml-pipeline/types.d.ts +51 -0
  763. package/dist/ml-pipeline/types.js +23 -0
  764. package/dist/ml-pipeline/types.js.map +1 -0
  765. package/dist/models/adaptive.d.ts +11 -0
  766. package/dist/models/adaptive.js +64 -0
  767. package/dist/models/adaptive.js.map +1 -0
  768. package/dist/models/failover.d.ts +51 -0
  769. package/dist/models/failover.js +151 -0
  770. package/dist/models/failover.js.map +1 -0
  771. package/dist/models/index.d.ts +7 -0
  772. package/dist/models/index.js +13 -0
  773. package/dist/models/index.js.map +1 -0
  774. package/dist/monitoring/alerts.d.ts +185 -0
  775. package/dist/monitoring/alerts.js +565 -0
  776. package/dist/monitoring/alerts.js.map +1 -0
  777. package/dist/monitoring/health.d.ts +151 -0
  778. package/dist/monitoring/health.js +423 -0
  779. package/dist/monitoring/health.js.map +1 -0
  780. package/dist/monitoring/index.d.ts +25 -0
  781. package/dist/monitoring/index.js +258 -0
  782. package/dist/monitoring/index.js.map +1 -0
  783. package/dist/monitoring/metrics.d.ts +147 -0
  784. package/dist/monitoring/metrics.js +519 -0
  785. package/dist/monitoring/metrics.js.map +1 -0
  786. package/dist/nodes/index.d.ts +81 -0
  787. package/dist/nodes/index.js +475 -0
  788. package/dist/nodes/index.js.map +1 -0
  789. package/dist/opportunity/analytics.d.ts +221 -0
  790. package/dist/opportunity/analytics.js +678 -0
  791. package/dist/opportunity/analytics.js.map +1 -0
  792. package/dist/opportunity/combinatorial.d.ts +147 -0
  793. package/dist/opportunity/combinatorial.js +765 -0
  794. package/dist/opportunity/combinatorial.js.map +1 -0
  795. package/dist/opportunity/correlation.d.ts +107 -0
  796. package/dist/opportunity/correlation.js +410 -0
  797. package/dist/opportunity/correlation.js.map +1 -0
  798. package/dist/opportunity/executor.d.ts +108 -0
  799. package/dist/opportunity/executor.js +356 -0
  800. package/dist/opportunity/executor.js.map +1 -0
  801. package/dist/opportunity/index.d.ts +285 -0
  802. package/dist/opportunity/index.js +839 -0
  803. package/dist/opportunity/index.js.map +1 -0
  804. package/dist/opportunity/links.d.ts +87 -0
  805. package/dist/opportunity/links.js +344 -0
  806. package/dist/opportunity/links.js.map +1 -0
  807. package/dist/opportunity/matching.d.ts +101 -0
  808. package/dist/opportunity/matching.js +551 -0
  809. package/dist/opportunity/matching.js.map +1 -0
  810. package/dist/opportunity/outcomes.d.ts +74 -0
  811. package/dist/opportunity/outcomes.js +321 -0
  812. package/dist/opportunity/outcomes.js.map +1 -0
  813. package/dist/opportunity/risk.d.ts +128 -0
  814. package/dist/opportunity/risk.js +381 -0
  815. package/dist/opportunity/risk.js.map +1 -0
  816. package/dist/opportunity/scoring.d.ts +151 -0
  817. package/dist/opportunity/scoring.js +421 -0
  818. package/dist/opportunity/scoring.js.map +1 -0
  819. package/dist/pairing/index.d.ts +108 -0
  820. package/dist/pairing/index.js +431 -0
  821. package/dist/pairing/index.js.map +1 -0
  822. package/dist/payments/index.d.ts +12 -0
  823. package/dist/payments/index.js +34 -0
  824. package/dist/payments/index.js.map +1 -0
  825. package/dist/payments/x402/evm.d.ts +53 -0
  826. package/dist/payments/x402/evm.js +282 -0
  827. package/dist/payments/x402/evm.js.map +1 -0
  828. package/dist/payments/x402/index.d.ts +158 -0
  829. package/dist/payments/x402/index.js +531 -0
  830. package/dist/payments/x402/index.js.map +1 -0
  831. package/dist/payments/x402/solana.d.ts +51 -0
  832. package/dist/payments/x402/solana.js +397 -0
  833. package/dist/payments/x402/solana.js.map +1 -0
  834. package/dist/percolator/accounts.d.ts +21 -0
  835. package/dist/percolator/accounts.js +76 -0
  836. package/dist/percolator/accounts.js.map +1 -0
  837. package/dist/percolator/encode.d.ts +14 -0
  838. package/dist/percolator/encode.js +90 -0
  839. package/dist/percolator/encode.js.map +1 -0
  840. package/dist/percolator/execution.d.ts +29 -0
  841. package/dist/percolator/execution.js +239 -0
  842. package/dist/percolator/execution.js.map +1 -0
  843. package/dist/percolator/feed.d.ts +15 -0
  844. package/dist/percolator/feed.js +160 -0
  845. package/dist/percolator/feed.js.map +1 -0
  846. package/dist/percolator/index.d.ts +20 -0
  847. package/dist/percolator/index.js +24 -0
  848. package/dist/percolator/index.js.map +1 -0
  849. package/dist/percolator/instructions.d.ts +29 -0
  850. package/dist/percolator/instructions.js +52 -0
  851. package/dist/percolator/instructions.js.map +1 -0
  852. package/dist/percolator/keeper.d.ts +11 -0
  853. package/dist/percolator/keeper.js +83 -0
  854. package/dist/percolator/keeper.js.map +1 -0
  855. package/dist/percolator/pda.d.ts +15 -0
  856. package/dist/percolator/pda.js +26 -0
  857. package/dist/percolator/pda.js.map +1 -0
  858. package/dist/percolator/slab.d.ts +122 -0
  859. package/dist/percolator/slab.js +325 -0
  860. package/dist/percolator/slab.js.map +1 -0
  861. package/dist/percolator/tx.d.ts +27 -0
  862. package/dist/percolator/tx.js +77 -0
  863. package/dist/percolator/tx.js.map +1 -0
  864. package/dist/percolator/types.d.ts +51 -0
  865. package/dist/percolator/types.js +9 -0
  866. package/dist/percolator/types.js.map +1 -0
  867. package/dist/permissions/index.d.ts +262 -0
  868. package/dist/permissions/index.js +929 -0
  869. package/dist/permissions/index.js.map +1 -0
  870. package/dist/plugins/index.d.ts +158 -0
  871. package/dist/plugins/index.js +444 -0
  872. package/dist/plugins/index.js.map +1 -0
  873. package/dist/portfolio/index.d.ts +170 -0
  874. package/dist/portfolio/index.js +970 -0
  875. package/dist/portfolio/index.js.map +1 -0
  876. package/dist/presence/index.d.ts +34 -0
  877. package/dist/presence/index.js +124 -0
  878. package/dist/presence/index.js.map +1 -0
  879. package/dist/process/index.d.ts +82 -0
  880. package/dist/process/index.js +402 -0
  881. package/dist/process/index.js.map +1 -0
  882. package/dist/providers/discovery.d.ts +209 -0
  883. package/dist/providers/discovery.js +751 -0
  884. package/dist/providers/discovery.js.map +1 -0
  885. package/dist/providers/health.d.ts +27 -0
  886. package/dist/providers/health.js +80 -0
  887. package/dist/providers/health.js.map +1 -0
  888. package/dist/providers/index.d.ts +154 -0
  889. package/dist/providers/index.js +897 -0
  890. package/dist/providers/index.js.map +1 -0
  891. package/dist/queue/index.d.ts +36 -0
  892. package/dist/queue/index.js +146 -0
  893. package/dist/queue/index.js.map +1 -0
  894. package/dist/queue/jobs/index.d.ts +11 -0
  895. package/dist/queue/jobs/index.js +32 -0
  896. package/dist/queue/jobs/index.js.map +1 -0
  897. package/dist/queue/jobs/producer.d.ts +43 -0
  898. package/dist/queue/jobs/producer.js +233 -0
  899. package/dist/queue/jobs/producer.js.map +1 -0
  900. package/dist/queue/jobs/types.d.ts +128 -0
  901. package/dist/queue/jobs/types.js +14 -0
  902. package/dist/queue/jobs/types.js.map +1 -0
  903. package/dist/queue/jobs/worker.d.ts +22 -0
  904. package/dist/queue/jobs/worker.js +220 -0
  905. package/dist/queue/jobs/worker.js.map +1 -0
  906. package/dist/remote/index.d.ts +136 -0
  907. package/dist/remote/index.js +456 -0
  908. package/dist/remote/index.js.map +1 -0
  909. package/dist/risk/circuit-breaker.d.ts +99 -0
  910. package/dist/risk/circuit-breaker.js +300 -0
  911. package/dist/risk/circuit-breaker.js.map +1 -0
  912. package/dist/risk/dashboard.d.ts +69 -0
  913. package/dist/risk/dashboard.js +127 -0
  914. package/dist/risk/dashboard.js.map +1 -0
  915. package/dist/risk/engine.d.ts +128 -0
  916. package/dist/risk/engine.js +311 -0
  917. package/dist/risk/engine.js.map +1 -0
  918. package/dist/risk/index.d.ts +10 -0
  919. package/dist/risk/index.js +38 -0
  920. package/dist/risk/index.js.map +1 -0
  921. package/dist/risk/stress.d.ts +70 -0
  922. package/dist/risk/stress.js +215 -0
  923. package/dist/risk/stress.js.map +1 -0
  924. package/dist/risk/var.d.ts +72 -0
  925. package/dist/risk/var.js +173 -0
  926. package/dist/risk/var.js.map +1 -0
  927. package/dist/risk/volatility.d.ts +61 -0
  928. package/dist/risk/volatility.js +132 -0
  929. package/dist/risk/volatility.js.map +1 -0
  930. package/dist/routing/index.d.ts +116 -0
  931. package/dist/routing/index.js +371 -0
  932. package/dist/routing/index.js.map +1 -0
  933. package/dist/search/index.d.ts +30 -0
  934. package/dist/search/index.js +129 -0
  935. package/dist/search/index.js.map +1 -0
  936. package/dist/security/address-checker.d.ts +6 -0
  937. package/dist/security/address-checker.js +213 -0
  938. package/dist/security/address-checker.js.map +1 -0
  939. package/dist/security/code-scanner.d.ts +3 -0
  940. package/dist/security/code-scanner.js +190 -0
  941. package/dist/security/code-scanner.js.map +1 -0
  942. package/dist/security/index.d.ts +176 -0
  943. package/dist/security/index.js +498 -0
  944. package/dist/security/index.js.map +1 -0
  945. package/dist/security/sanitizer.d.ts +2 -0
  946. package/dist/security/sanitizer.js +135 -0
  947. package/dist/security/sanitizer.js.map +1 -0
  948. package/dist/security/scam-db.d.ts +5 -0
  949. package/dist/security/scam-db.js +116 -0
  950. package/dist/security/scam-db.js.map +1 -0
  951. package/dist/security/shield.d.ts +12 -0
  952. package/dist/security/shield.js +80 -0
  953. package/dist/security/shield.js.map +1 -0
  954. package/dist/security/tx-validator.d.ts +5 -0
  955. package/dist/security/tx-validator.js +115 -0
  956. package/dist/security/tx-validator.js.map +1 -0
  957. package/dist/security/types.d.ts +84 -0
  958. package/dist/security/types.js +6 -0
  959. package/dist/security/types.js.map +1 -0
  960. package/dist/services/alt-data/feeds/fear-greed.d.ts +14 -0
  961. package/dist/services/alt-data/feeds/fear-greed.js +81 -0
  962. package/dist/services/alt-data/feeds/fear-greed.js.map +1 -0
  963. package/dist/services/alt-data/feeds/funding-rates.d.ts +13 -0
  964. package/dist/services/alt-data/feeds/funding-rates.js +90 -0
  965. package/dist/services/alt-data/feeds/funding-rates.js.map +1 -0
  966. package/dist/services/alt-data/feeds/reddit.d.ts +13 -0
  967. package/dist/services/alt-data/feeds/reddit.js +112 -0
  968. package/dist/services/alt-data/feeds/reddit.js.map +1 -0
  969. package/dist/services/alt-data/index.d.ts +31 -0
  970. package/dist/services/alt-data/index.js +278 -0
  971. package/dist/services/alt-data/index.js.map +1 -0
  972. package/dist/services/alt-data/market-matcher.d.ts +29 -0
  973. package/dist/services/alt-data/market-matcher.js +157 -0
  974. package/dist/services/alt-data/market-matcher.js.map +1 -0
  975. package/dist/services/alt-data/sentiment.d.ts +11 -0
  976. package/dist/services/alt-data/sentiment.js +277 -0
  977. package/dist/services/alt-data/sentiment.js.map +1 -0
  978. package/dist/services/alt-data/types.d.ts +86 -0
  979. package/dist/services/alt-data/types.js +9 -0
  980. package/dist/services/alt-data/types.js.map +1 -0
  981. package/dist/services/feature-engineering/accessor.d.ts +19 -0
  982. package/dist/services/feature-engineering/accessor.js +31 -0
  983. package/dist/services/feature-engineering/accessor.js.map +1 -0
  984. package/dist/services/feature-engineering/index.d.ts +15 -0
  985. package/dist/services/feature-engineering/index.js +345 -0
  986. package/dist/services/feature-engineering/index.js.map +1 -0
  987. package/dist/services/feature-engineering/indicators.d.ts +90 -0
  988. package/dist/services/feature-engineering/indicators.js +254 -0
  989. package/dist/services/feature-engineering/indicators.js.map +1 -0
  990. package/dist/services/feature-engineering/rolling-window.d.ts +89 -0
  991. package/dist/services/feature-engineering/rolling-window.js +173 -0
  992. package/dist/services/feature-engineering/rolling-window.js.map +1 -0
  993. package/dist/services/feature-engineering/thresholds.d.ts +137 -0
  994. package/dist/services/feature-engineering/thresholds.js +280 -0
  995. package/dist/services/feature-engineering/thresholds.js.map +1 -0
  996. package/dist/services/feature-engineering/types.d.ts +138 -0
  997. package/dist/services/feature-engineering/types.js +6 -0
  998. package/dist/services/feature-engineering/types.js.map +1 -0
  999. package/dist/services/tick-recorder/index.d.ts +12 -0
  1000. package/dist/services/tick-recorder/index.js +200 -0
  1001. package/dist/services/tick-recorder/index.js.map +1 -0
  1002. package/dist/services/tick-recorder/queries.d.ts +46 -0
  1003. package/dist/services/tick-recorder/queries.js +291 -0
  1004. package/dist/services/tick-recorder/queries.js.map +1 -0
  1005. package/dist/services/tick-recorder/schema.d.ts +27 -0
  1006. package/dist/services/tick-recorder/schema.js +185 -0
  1007. package/dist/services/tick-recorder/schema.js.map +1 -0
  1008. package/dist/services/tick-recorder/timescale.d.ts +27 -0
  1009. package/dist/services/tick-recorder/timescale.js +105 -0
  1010. package/dist/services/tick-recorder/timescale.js.map +1 -0
  1011. package/dist/services/tick-recorder/types.d.ts +113 -0
  1012. package/dist/services/tick-recorder/types.js +7 -0
  1013. package/dist/services/tick-recorder/types.js.map +1 -0
  1014. package/dist/services/tick-streamer/index.d.ts +12 -0
  1015. package/dist/services/tick-streamer/index.js +317 -0
  1016. package/dist/services/tick-streamer/index.js.map +1 -0
  1017. package/dist/services/tick-streamer/types.d.ts +134 -0
  1018. package/dist/services/tick-streamer/types.js +6 -0
  1019. package/dist/services/tick-streamer/types.js.map +1 -0
  1020. package/dist/session/index.d.ts +147 -0
  1021. package/dist/session/index.js +429 -0
  1022. package/dist/session/index.js.map +1 -0
  1023. package/dist/sessions/index.d.ts +69 -0
  1024. package/dist/sessions/index.js +447 -0
  1025. package/dist/sessions/index.js.map +1 -0
  1026. package/dist/signal-router/index.d.ts +2 -0
  1027. package/dist/signal-router/index.js +6 -0
  1028. package/dist/signal-router/index.js.map +1 -0
  1029. package/dist/signal-router/router.d.ts +25 -0
  1030. package/dist/signal-router/router.js +391 -0
  1031. package/dist/signal-router/router.js.map +1 -0
  1032. package/dist/signal-router/types.d.ts +64 -0
  1033. package/dist/signal-router/types.js +9 -0
  1034. package/dist/signal-router/types.js.map +1 -0
  1035. package/dist/skills/bundled/acp/index.d.ts +25 -0
  1036. package/dist/skills/bundled/acp/index.js +472 -0
  1037. package/dist/skills/bundled/acp/index.js.map +1 -0
  1038. package/dist/skills/bundled/agentbets/index.d.ts +15 -0
  1039. package/dist/skills/bundled/agentbets/index.js +168 -0
  1040. package/dist/skills/bundled/agentbets/index.js.map +1 -0
  1041. package/dist/skills/bundled/ai-strategy/index.d.ts +21 -0
  1042. package/dist/skills/bundled/ai-strategy/index.js +647 -0
  1043. package/dist/skills/bundled/ai-strategy/index.js.map +1 -0
  1044. package/dist/skills/bundled/alerts/index.d.ts +20 -0
  1045. package/dist/skills/bundled/alerts/index.js +249 -0
  1046. package/dist/skills/bundled/alerts/index.js.map +1 -0
  1047. package/dist/skills/bundled/analytics/index.d.ts +17 -0
  1048. package/dist/skills/bundled/analytics/index.js +112 -0
  1049. package/dist/skills/bundled/analytics/index.js.map +1 -0
  1050. package/dist/skills/bundled/arbitrage/index.d.ts +24 -0
  1051. package/dist/skills/bundled/arbitrage/index.js +253 -0
  1052. package/dist/skills/bundled/arbitrage/index.js.map +1 -0
  1053. package/dist/skills/bundled/auto-reply/index.d.ts +18 -0
  1054. package/dist/skills/bundled/auto-reply/index.js +215 -0
  1055. package/dist/skills/bundled/auto-reply/index.js.map +1 -0
  1056. package/dist/skills/bundled/automation/index.d.ts +19 -0
  1057. package/dist/skills/bundled/automation/index.js +160 -0
  1058. package/dist/skills/bundled/automation/index.js.map +1 -0
  1059. package/dist/skills/bundled/backtest/index.d.ts +18 -0
  1060. package/dist/skills/bundled/backtest/index.js +250 -0
  1061. package/dist/skills/bundled/backtest/index.js.map +1 -0
  1062. package/dist/skills/bundled/bags/index.d.ts +49 -0
  1063. package/dist/skills/bundled/bags/index.js +1069 -0
  1064. package/dist/skills/bundled/bags/index.js.map +1 -0
  1065. package/dist/skills/bundled/bankr/index.d.ts +161 -0
  1066. package/dist/skills/bundled/bankr/index.js +271 -0
  1067. package/dist/skills/bundled/bankr/index.js.map +1 -0
  1068. package/dist/skills/bundled/betfair/index.d.ts +24 -0
  1069. package/dist/skills/bundled/betfair/index.js +511 -0
  1070. package/dist/skills/bundled/betfair/index.js.map +1 -0
  1071. package/dist/skills/bundled/binance-futures/index.d.ts +15 -0
  1072. package/dist/skills/bundled/binance-futures/index.js +485 -0
  1073. package/dist/skills/bundled/binance-futures/index.js.map +1 -0
  1074. package/dist/skills/bundled/botchan/index.d.ts +130 -0
  1075. package/dist/skills/bundled/botchan/index.js +427 -0
  1076. package/dist/skills/bundled/botchan/index.js.map +1 -0
  1077. package/dist/skills/bundled/bridge/index.d.ts +17 -0
  1078. package/dist/skills/bundled/bridge/index.js +297 -0
  1079. package/dist/skills/bundled/bridge/index.js.map +1 -0
  1080. package/dist/skills/bundled/bybit-futures/index.d.ts +15 -0
  1081. package/dist/skills/bundled/bybit-futures/index.js +380 -0
  1082. package/dist/skills/bundled/bybit-futures/index.js.map +1 -0
  1083. package/dist/skills/bundled/clanker/index.d.ts +236 -0
  1084. package/dist/skills/bundled/clanker/index.js +759 -0
  1085. package/dist/skills/bundled/clanker/index.js.map +1 -0
  1086. package/dist/skills/bundled/copy-trading/index.d.ts +20 -0
  1087. package/dist/skills/bundled/copy-trading/index.js +213 -0
  1088. package/dist/skills/bundled/copy-trading/index.js.map +1 -0
  1089. package/dist/skills/bundled/copy-trading-solana/index.d.ts +21 -0
  1090. package/dist/skills/bundled/copy-trading-solana/index.js +421 -0
  1091. package/dist/skills/bundled/copy-trading-solana/index.js.map +1 -0
  1092. package/dist/skills/bundled/credentials/index.d.ts +17 -0
  1093. package/dist/skills/bundled/credentials/index.js +137 -0
  1094. package/dist/skills/bundled/credentials/index.js.map +1 -0
  1095. package/dist/skills/bundled/crypto-hft/index.d.ts +26 -0
  1096. package/dist/skills/bundled/crypto-hft/index.js +361 -0
  1097. package/dist/skills/bundled/crypto-hft/index.js.map +1 -0
  1098. package/dist/skills/bundled/dca/index.d.ts +26 -0
  1099. package/dist/skills/bundled/dca/index.js +1342 -0
  1100. package/dist/skills/bundled/dca/index.js.map +1 -0
  1101. package/dist/skills/bundled/divergence/index.d.ts +19 -0
  1102. package/dist/skills/bundled/divergence/index.js +272 -0
  1103. package/dist/skills/bundled/divergence/index.js.map +1 -0
  1104. package/dist/skills/bundled/doctor/index.d.ts +18 -0
  1105. package/dist/skills/bundled/doctor/index.js +78 -0
  1106. package/dist/skills/bundled/doctor/index.js.map +1 -0
  1107. package/dist/skills/bundled/drift/index.d.ts +13 -0
  1108. package/dist/skills/bundled/drift/index.js +378 -0
  1109. package/dist/skills/bundled/drift/index.js.map +1 -0
  1110. package/dist/skills/bundled/drift-sdk/index.d.ts +17 -0
  1111. package/dist/skills/bundled/drift-sdk/index.js +501 -0
  1112. package/dist/skills/bundled/drift-sdk/index.js.map +1 -0
  1113. package/dist/skills/bundled/edge/index.d.ts +16 -0
  1114. package/dist/skills/bundled/edge/index.js +91 -0
  1115. package/dist/skills/bundled/edge/index.js.map +1 -0
  1116. package/dist/skills/bundled/embeddings/index.d.ts +19 -0
  1117. package/dist/skills/bundled/embeddings/index.js +215 -0
  1118. package/dist/skills/bundled/embeddings/index.js.map +1 -0
  1119. package/dist/skills/bundled/endaoment/index.d.ts +105 -0
  1120. package/dist/skills/bundled/endaoment/index.js +285 -0
  1121. package/dist/skills/bundled/endaoment/index.js.map +1 -0
  1122. package/dist/skills/bundled/ens/index.d.ts +151 -0
  1123. package/dist/skills/bundled/ens/index.js +278 -0
  1124. package/dist/skills/bundled/ens/index.js.map +1 -0
  1125. package/dist/skills/bundled/erc8004/index.d.ts +123 -0
  1126. package/dist/skills/bundled/erc8004/index.js +301 -0
  1127. package/dist/skills/bundled/erc8004/index.js.map +1 -0
  1128. package/dist/skills/bundled/execution/index.d.ts +18 -0
  1129. package/dist/skills/bundled/execution/index.js +358 -0
  1130. package/dist/skills/bundled/execution/index.js.map +1 -0
  1131. package/dist/skills/bundled/farcaster/index.d.ts +121 -0
  1132. package/dist/skills/bundled/farcaster/index.js +314 -0
  1133. package/dist/skills/bundled/farcaster/index.js.map +1 -0
  1134. package/dist/skills/bundled/features/index.d.ts +17 -0
  1135. package/dist/skills/bundled/features/index.js +305 -0
  1136. package/dist/skills/bundled/features/index.js.map +1 -0
  1137. package/dist/skills/bundled/feeds/index.d.ts +26 -0
  1138. package/dist/skills/bundled/feeds/index.js +462 -0
  1139. package/dist/skills/bundled/feeds/index.js.map +1 -0
  1140. package/dist/skills/bundled/harden/index.d.ts +55 -0
  1141. package/dist/skills/bundled/harden/index.js +510 -0
  1142. package/dist/skills/bundled/harden/index.js.map +1 -0
  1143. package/dist/skills/bundled/history/index.d.ts +21 -0
  1144. package/dist/skills/bundled/history/index.js +195 -0
  1145. package/dist/skills/bundled/history/index.js.map +1 -0
  1146. package/dist/skills/bundled/hyperliquid/index.d.ts +19 -0
  1147. package/dist/skills/bundled/hyperliquid/index.js +1280 -0
  1148. package/dist/skills/bundled/hyperliquid/index.js.map +1 -0
  1149. package/dist/skills/bundled/identity/index.d.ts +17 -0
  1150. package/dist/skills/bundled/identity/index.js +223 -0
  1151. package/dist/skills/bundled/identity/index.js.map +1 -0
  1152. package/dist/skills/bundled/integrations/index.d.ts +17 -0
  1153. package/dist/skills/bundled/integrations/index.js +138 -0
  1154. package/dist/skills/bundled/integrations/index.js.map +1 -0
  1155. package/dist/skills/bundled/jupiter/index.d.ts +41 -0
  1156. package/dist/skills/bundled/jupiter/index.js +872 -0
  1157. package/dist/skills/bundled/jupiter/index.js.map +1 -0
  1158. package/dist/skills/bundled/kamino/index.d.ts +33 -0
  1159. package/dist/skills/bundled/kamino/index.js +578 -0
  1160. package/dist/skills/bundled/kamino/index.js.map +1 -0
  1161. package/dist/skills/bundled/ledger/index.d.ts +14 -0
  1162. package/dist/skills/bundled/ledger/index.js +186 -0
  1163. package/dist/skills/bundled/ledger/index.js.map +1 -0
  1164. package/dist/skills/bundled/market-index/index.d.ts +18 -0
  1165. package/dist/skills/bundled/market-index/index.js +182 -0
  1166. package/dist/skills/bundled/market-index/index.js.map +1 -0
  1167. package/dist/skills/bundled/markets/index.d.ts +16 -0
  1168. package/dist/skills/bundled/markets/index.js +95 -0
  1169. package/dist/skills/bundled/markets/index.js.map +1 -0
  1170. package/dist/skills/bundled/mcp/index.d.ts +19 -0
  1171. package/dist/skills/bundled/mcp/index.js +212 -0
  1172. package/dist/skills/bundled/mcp/index.js.map +1 -0
  1173. package/dist/skills/bundled/memory/index.d.ts +20 -0
  1174. package/dist/skills/bundled/memory/index.js +210 -0
  1175. package/dist/skills/bundled/memory/index.js.map +1 -0
  1176. package/dist/skills/bundled/metaculus/index.d.ts +17 -0
  1177. package/dist/skills/bundled/metaculus/index.js +168 -0
  1178. package/dist/skills/bundled/metaculus/index.js.map +1 -0
  1179. package/dist/skills/bundled/meteora/index.d.ts +39 -0
  1180. package/dist/skills/bundled/meteora/index.js +837 -0
  1181. package/dist/skills/bundled/meteora/index.js.map +1 -0
  1182. package/dist/skills/bundled/meteora-dbc/index.d.ts +33 -0
  1183. package/dist/skills/bundled/meteora-dbc/index.js +993 -0
  1184. package/dist/skills/bundled/meteora-dbc/index.js.map +1 -0
  1185. package/dist/skills/bundled/metrics/index.d.ts +18 -0
  1186. package/dist/skills/bundled/metrics/index.js +91 -0
  1187. package/dist/skills/bundled/metrics/index.js.map +1 -0
  1188. package/dist/skills/bundled/mev/index.d.ts +17 -0
  1189. package/dist/skills/bundled/mev/index.js +108 -0
  1190. package/dist/skills/bundled/mev/index.js.map +1 -0
  1191. package/dist/skills/bundled/mexc-futures/index.d.ts +16 -0
  1192. package/dist/skills/bundled/mexc-futures/index.js +389 -0
  1193. package/dist/skills/bundled/mexc-futures/index.js.map +1 -0
  1194. package/dist/skills/bundled/mm/index.d.ts +18 -0
  1195. package/dist/skills/bundled/mm/index.js +315 -0
  1196. package/dist/skills/bundled/mm/index.js.map +1 -0
  1197. package/dist/skills/bundled/monitoring/index.d.ts +18 -0
  1198. package/dist/skills/bundled/monitoring/index.js +146 -0
  1199. package/dist/skills/bundled/monitoring/index.js.map +1 -0
  1200. package/dist/skills/bundled/news/index.d.ts +17 -0
  1201. package/dist/skills/bundled/news/index.js +161 -0
  1202. package/dist/skills/bundled/news/index.js.map +1 -0
  1203. package/dist/skills/bundled/onchainkit/index.d.ts +92 -0
  1204. package/dist/skills/bundled/onchainkit/index.js +429 -0
  1205. package/dist/skills/bundled/onchainkit/index.js.map +1 -0
  1206. package/dist/skills/bundled/opinion/index.d.ts +12 -0
  1207. package/dist/skills/bundled/opinion/index.js +429 -0
  1208. package/dist/skills/bundled/opinion/index.js.map +1 -0
  1209. package/dist/skills/bundled/opportunity/index.d.ts +25 -0
  1210. package/dist/skills/bundled/opportunity/index.js +289 -0
  1211. package/dist/skills/bundled/opportunity/index.js.map +1 -0
  1212. package/dist/skills/bundled/orca/index.d.ts +12 -0
  1213. package/dist/skills/bundled/orca/index.js +663 -0
  1214. package/dist/skills/bundled/orca/index.js.map +1 -0
  1215. package/dist/skills/bundled/pairing/index.d.ts +24 -0
  1216. package/dist/skills/bundled/pairing/index.js +228 -0
  1217. package/dist/skills/bundled/pairing/index.js.map +1 -0
  1218. package/dist/skills/bundled/percolator/index.d.ts +20 -0
  1219. package/dist/skills/bundled/percolator/index.js +229 -0
  1220. package/dist/skills/bundled/percolator/index.js.map +1 -0
  1221. package/dist/skills/bundled/permissions/index.d.ts +21 -0
  1222. package/dist/skills/bundled/permissions/index.js +204 -0
  1223. package/dist/skills/bundled/permissions/index.js.map +1 -0
  1224. package/dist/skills/bundled/plugins/index.d.ts +20 -0
  1225. package/dist/skills/bundled/plugins/index.js +209 -0
  1226. package/dist/skills/bundled/plugins/index.js.map +1 -0
  1227. package/dist/skills/bundled/portfolio/index.d.ts +20 -0
  1228. package/dist/skills/bundled/portfolio/index.js +367 -0
  1229. package/dist/skills/bundled/portfolio/index.js.map +1 -0
  1230. package/dist/skills/bundled/portfolio-sync/index.d.ts +17 -0
  1231. package/dist/skills/bundled/portfolio-sync/index.js +116 -0
  1232. package/dist/skills/bundled/portfolio-sync/index.js.map +1 -0
  1233. package/dist/skills/bundled/positions/index.d.ts +18 -0
  1234. package/dist/skills/bundled/positions/index.js +161 -0
  1235. package/dist/skills/bundled/positions/index.js.map +1 -0
  1236. package/dist/skills/bundled/predictfun/index.d.ts +13 -0
  1237. package/dist/skills/bundled/predictfun/index.js +612 -0
  1238. package/dist/skills/bundled/predictfun/index.js.map +1 -0
  1239. package/dist/skills/bundled/predictit/index.d.ts +16 -0
  1240. package/dist/skills/bundled/predictit/index.js +138 -0
  1241. package/dist/skills/bundled/predictit/index.js.map +1 -0
  1242. package/dist/skills/bundled/presence/index.d.ts +18 -0
  1243. package/dist/skills/bundled/presence/index.js +151 -0
  1244. package/dist/skills/bundled/presence/index.js.map +1 -0
  1245. package/dist/skills/bundled/processes/index.d.ts +17 -0
  1246. package/dist/skills/bundled/processes/index.js +121 -0
  1247. package/dist/skills/bundled/processes/index.js.map +1 -0
  1248. package/dist/skills/bundled/pump-swarm/index.d.ts +16 -0
  1249. package/dist/skills/bundled/pump-swarm/index.js +2235 -0
  1250. package/dist/skills/bundled/pump-swarm/index.js.map +1 -0
  1251. package/dist/skills/bundled/pumpfun/index.d.ts +47 -0
  1252. package/dist/skills/bundled/pumpfun/index.js +1400 -0
  1253. package/dist/skills/bundled/pumpfun/index.js.map +1 -0
  1254. package/dist/skills/bundled/qmd/index.d.ts +18 -0
  1255. package/dist/skills/bundled/qmd/index.js +116 -0
  1256. package/dist/skills/bundled/qmd/index.js.map +1 -0
  1257. package/dist/skills/bundled/qrcoin/index.d.ts +92 -0
  1258. package/dist/skills/bundled/qrcoin/index.js +328 -0
  1259. package/dist/skills/bundled/qrcoin/index.js.map +1 -0
  1260. package/dist/skills/bundled/raydium/index.d.ts +35 -0
  1261. package/dist/skills/bundled/raydium/index.js +695 -0
  1262. package/dist/skills/bundled/raydium/index.js.map +1 -0
  1263. package/dist/skills/bundled/remote/index.d.ts +19 -0
  1264. package/dist/skills/bundled/remote/index.js +186 -0
  1265. package/dist/skills/bundled/remote/index.js.map +1 -0
  1266. package/dist/skills/bundled/research/index.d.ts +17 -0
  1267. package/dist/skills/bundled/research/index.js +185 -0
  1268. package/dist/skills/bundled/research/index.js.map +1 -0
  1269. package/dist/skills/bundled/risk/index.d.ts +31 -0
  1270. package/dist/skills/bundled/risk/index.js +379 -0
  1271. package/dist/skills/bundled/risk/index.js.map +1 -0
  1272. package/dist/skills/bundled/router/index.d.ts +17 -0
  1273. package/dist/skills/bundled/router/index.js +160 -0
  1274. package/dist/skills/bundled/router/index.js.map +1 -0
  1275. package/dist/skills/bundled/routing/index.d.ts +23 -0
  1276. package/dist/skills/bundled/routing/index.js +257 -0
  1277. package/dist/skills/bundled/routing/index.js.map +1 -0
  1278. package/dist/skills/bundled/sandbox/index.d.ts +18 -0
  1279. package/dist/skills/bundled/sandbox/index.js +119 -0
  1280. package/dist/skills/bundled/sandbox/index.js.map +1 -0
  1281. package/dist/skills/bundled/search-config/index.d.ts +18 -0
  1282. package/dist/skills/bundled/search-config/index.js +170 -0
  1283. package/dist/skills/bundled/search-config/index.js.map +1 -0
  1284. package/dist/skills/bundled/sessions/index.d.ts +29 -0
  1285. package/dist/skills/bundled/sessions/index.js +193 -0
  1286. package/dist/skills/bundled/sessions/index.js.map +1 -0
  1287. package/dist/skills/bundled/shield/index.d.ts +22 -0
  1288. package/dist/skills/bundled/shield/index.js +245 -0
  1289. package/dist/skills/bundled/shield/index.js.map +1 -0
  1290. package/dist/skills/bundled/signals/index.d.ts +24 -0
  1291. package/dist/skills/bundled/signals/index.js +776 -0
  1292. package/dist/skills/bundled/signals/index.js.map +1 -0
  1293. package/dist/skills/bundled/sizing/index.d.ts +16 -0
  1294. package/dist/skills/bundled/sizing/index.js +168 -0
  1295. package/dist/skills/bundled/sizing/index.js.map +1 -0
  1296. package/dist/skills/bundled/slippage/index.d.ts +16 -0
  1297. package/dist/skills/bundled/slippage/index.js +111 -0
  1298. package/dist/skills/bundled/slippage/index.js.map +1 -0
  1299. package/dist/skills/bundled/smarkets/index.d.ts +23 -0
  1300. package/dist/skills/bundled/smarkets/index.js +473 -0
  1301. package/dist/skills/bundled/smarkets/index.js.map +1 -0
  1302. package/dist/skills/bundled/strategy/index.d.ts +18 -0
  1303. package/dist/skills/bundled/strategy/index.js +168 -0
  1304. package/dist/skills/bundled/strategy/index.js.map +1 -0
  1305. package/dist/skills/bundled/streaming/index.d.ts +19 -0
  1306. package/dist/skills/bundled/streaming/index.js +147 -0
  1307. package/dist/skills/bundled/streaming/index.js.map +1 -0
  1308. package/dist/skills/bundled/tailscale/index.d.ts +18 -0
  1309. package/dist/skills/bundled/tailscale/index.js +173 -0
  1310. package/dist/skills/bundled/tailscale/index.js.map +1 -0
  1311. package/dist/skills/bundled/ticks/index.d.ts +17 -0
  1312. package/dist/skills/bundled/ticks/index.js +287 -0
  1313. package/dist/skills/bundled/ticks/index.js.map +1 -0
  1314. package/dist/skills/bundled/token-security/index.d.ts +19 -0
  1315. package/dist/skills/bundled/token-security/index.js +138 -0
  1316. package/dist/skills/bundled/token-security/index.js.map +1 -0
  1317. package/dist/skills/bundled/trading-evm/index.d.ts +19 -0
  1318. package/dist/skills/bundled/trading-evm/index.js +302 -0
  1319. package/dist/skills/bundled/trading-evm/index.js.map +1 -0
  1320. package/dist/skills/bundled/trading-futures/index.d.ts +14 -0
  1321. package/dist/skills/bundled/trading-futures/index.js +874 -0
  1322. package/dist/skills/bundled/trading-futures/index.js.map +1 -0
  1323. package/dist/skills/bundled/trading-kalshi/index.d.ts +36 -0
  1324. package/dist/skills/bundled/trading-kalshi/index.js +1199 -0
  1325. package/dist/skills/bundled/trading-kalshi/index.js.map +1 -0
  1326. package/dist/skills/bundled/trading-manifold/index.d.ts +23 -0
  1327. package/dist/skills/bundled/trading-manifold/index.js +391 -0
  1328. package/dist/skills/bundled/trading-manifold/index.js.map +1 -0
  1329. package/dist/skills/bundled/trading-polymarket/index.d.ts +27 -0
  1330. package/dist/skills/bundled/trading-polymarket/index.js +1321 -0
  1331. package/dist/skills/bundled/trading-polymarket/index.js.map +1 -0
  1332. package/dist/skills/bundled/trading-solana/index.d.ts +19 -0
  1333. package/dist/skills/bundled/trading-solana/index.js +383 -0
  1334. package/dist/skills/bundled/trading-solana/index.js.map +1 -0
  1335. package/dist/skills/bundled/trading-system/index.d.ts +22 -0
  1336. package/dist/skills/bundled/trading-system/index.js +355 -0
  1337. package/dist/skills/bundled/trading-system/index.js.map +1 -0
  1338. package/dist/skills/bundled/triggers/index.d.ts +18 -0
  1339. package/dist/skills/bundled/triggers/index.js +172 -0
  1340. package/dist/skills/bundled/triggers/index.js.map +1 -0
  1341. package/dist/skills/bundled/tts/index.d.ts +16 -0
  1342. package/dist/skills/bundled/tts/index.js +150 -0
  1343. package/dist/skills/bundled/tts/index.js.map +1 -0
  1344. package/dist/skills/bundled/tweet-ideas/index.d.ts +20 -0
  1345. package/dist/skills/bundled/tweet-ideas/index.js +470 -0
  1346. package/dist/skills/bundled/tweet-ideas/index.js.map +1 -0
  1347. package/dist/skills/bundled/usage/index.d.ts +17 -0
  1348. package/dist/skills/bundled/usage/index.js +145 -0
  1349. package/dist/skills/bundled/usage/index.js.map +1 -0
  1350. package/dist/skills/bundled/veil/index.d.ts +79 -0
  1351. package/dist/skills/bundled/veil/index.js +322 -0
  1352. package/dist/skills/bundled/veil/index.js.map +1 -0
  1353. package/dist/skills/bundled/verify/index.d.ts +20 -0
  1354. package/dist/skills/bundled/verify/index.js +157 -0
  1355. package/dist/skills/bundled/verify/index.js.map +1 -0
  1356. package/dist/skills/bundled/virtuals/index.d.ts +20 -0
  1357. package/dist/skills/bundled/virtuals/index.js +255 -0
  1358. package/dist/skills/bundled/virtuals/index.js.map +1 -0
  1359. package/dist/skills/bundled/voice/index.d.ts +18 -0
  1360. package/dist/skills/bundled/voice/index.js +190 -0
  1361. package/dist/skills/bundled/voice/index.js.map +1 -0
  1362. package/dist/skills/bundled/weather/index.d.ts +20 -0
  1363. package/dist/skills/bundled/weather/index.js +475 -0
  1364. package/dist/skills/bundled/weather/index.js.map +1 -0
  1365. package/dist/skills/bundled/webhooks/index.d.ts +18 -0
  1366. package/dist/skills/bundled/webhooks/index.js +136 -0
  1367. package/dist/skills/bundled/webhooks/index.js.map +1 -0
  1368. package/dist/skills/bundled/whale-tracking/index.d.ts +18 -0
  1369. package/dist/skills/bundled/whale-tracking/index.js +441 -0
  1370. package/dist/skills/bundled/whale-tracking/index.js.map +1 -0
  1371. package/dist/skills/bundled/yoink/index.d.ts +78 -0
  1372. package/dist/skills/bundled/yoink/index.js +236 -0
  1373. package/dist/skills/bundled/yoink/index.js.map +1 -0
  1374. package/dist/skills/executor.d.ts +117 -0
  1375. package/dist/skills/executor.js +469 -0
  1376. package/dist/skills/executor.js.map +1 -0
  1377. package/dist/skills/frontmatter.d.ts +69 -0
  1378. package/dist/skills/frontmatter.js +187 -0
  1379. package/dist/skills/frontmatter.js.map +1 -0
  1380. package/dist/skills/index.d.ts +150 -0
  1381. package/dist/skills/index.js +531 -0
  1382. package/dist/skills/index.js.map +1 -0
  1383. package/dist/skills/loader.d.ts +48 -0
  1384. package/dist/skills/loader.js +594 -0
  1385. package/dist/skills/loader.js.map +1 -0
  1386. package/dist/skills/registry.d.ts +94 -0
  1387. package/dist/skills/registry.js +308 -0
  1388. package/dist/skills/registry.js.map +1 -0
  1389. package/dist/solana/copytrade.d.ts +116 -0
  1390. package/dist/solana/copytrade.js +493 -0
  1391. package/dist/solana/copytrade.js.map +1 -0
  1392. package/dist/solana/drift.d.ts +154 -0
  1393. package/dist/solana/drift.js +599 -0
  1394. package/dist/solana/drift.js.map +1 -0
  1395. package/dist/solana/jupiter.d.ts +283 -0
  1396. package/dist/solana/jupiter.js +553 -0
  1397. package/dist/solana/jupiter.js.map +1 -0
  1398. package/dist/solana/kamino.d.ts +206 -0
  1399. package/dist/solana/kamino.js +546 -0
  1400. package/dist/solana/kamino.js.map +1 -0
  1401. package/dist/solana/meteora-dbc.d.ts +430 -0
  1402. package/dist/solana/meteora-dbc.js +1105 -0
  1403. package/dist/solana/meteora-dbc.js.map +1 -0
  1404. package/dist/solana/meteora.d.ts +232 -0
  1405. package/dist/solana/meteora.js +682 -0
  1406. package/dist/solana/meteora.js.map +1 -0
  1407. package/dist/solana/orca.d.ts +163 -0
  1408. package/dist/solana/orca.js +378 -0
  1409. package/dist/solana/orca.js.map +1 -0
  1410. package/dist/solana/pools.d.ts +26 -0
  1411. package/dist/solana/pools.js +96 -0
  1412. package/dist/solana/pools.js.map +1 -0
  1413. package/dist/solana/pump-swarm.d.ts +349 -0
  1414. package/dist/solana/pump-swarm.js +1663 -0
  1415. package/dist/solana/pump-swarm.js.map +1 -0
  1416. package/dist/solana/pumpapi.d.ts +196 -0
  1417. package/dist/solana/pumpapi.js +462 -0
  1418. package/dist/solana/pumpapi.js.map +1 -0
  1419. package/dist/solana/raydium.d.ts +170 -0
  1420. package/dist/solana/raydium.js +673 -0
  1421. package/dist/solana/raydium.js.map +1 -0
  1422. package/dist/solana/swarm-ai-builder.d.ts +97 -0
  1423. package/dist/solana/swarm-ai-builder.js +571 -0
  1424. package/dist/solana/swarm-ai-builder.js.map +1 -0
  1425. package/dist/solana/swarm-arbitrage.d.ts +111 -0
  1426. package/dist/solana/swarm-arbitrage.js +437 -0
  1427. package/dist/solana/swarm-arbitrage.js.map +1 -0
  1428. package/dist/solana/swarm-builders.d.ts +71 -0
  1429. package/dist/solana/swarm-builders.js +402 -0
  1430. package/dist/solana/swarm-builders.js.map +1 -0
  1431. package/dist/solana/swarm-copytrade.d.ts +103 -0
  1432. package/dist/solana/swarm-copytrade.js +420 -0
  1433. package/dist/solana/swarm-copytrade.js.map +1 -0
  1434. package/dist/solana/swarm-presets.d.ts +49 -0
  1435. package/dist/solana/swarm-presets.js +282 -0
  1436. package/dist/solana/swarm-presets.js.map +1 -0
  1437. package/dist/solana/swarm-signals.d.ts +128 -0
  1438. package/dist/solana/swarm-signals.js +529 -0
  1439. package/dist/solana/swarm-signals.js.map +1 -0
  1440. package/dist/solana/swarm-strategies.d.ts +230 -0
  1441. package/dist/solana/swarm-strategies.js +611 -0
  1442. package/dist/solana/swarm-strategies.js.map +1 -0
  1443. package/dist/solana/tokenlist.d.ts +10 -0
  1444. package/dist/solana/tokenlist.js +54 -0
  1445. package/dist/solana/tokenlist.js.map +1 -0
  1446. package/dist/solana/wallet.d.ts +12 -0
  1447. package/dist/solana/wallet.js +90 -0
  1448. package/dist/solana/wallet.js.map +1 -0
  1449. package/dist/strategies/crypto-hft/index.d.ts +46 -0
  1450. package/dist/strategies/crypto-hft/index.js +469 -0
  1451. package/dist/strategies/crypto-hft/index.js.map +1 -0
  1452. package/dist/strategies/crypto-hft/market-scanner.d.ts +26 -0
  1453. package/dist/strategies/crypto-hft/market-scanner.js +177 -0
  1454. package/dist/strategies/crypto-hft/market-scanner.js.map +1 -0
  1455. package/dist/strategies/crypto-hft/orderbook.d.ts +37 -0
  1456. package/dist/strategies/crypto-hft/orderbook.js +184 -0
  1457. package/dist/strategies/crypto-hft/orderbook.js.map +1 -0
  1458. package/dist/strategies/crypto-hft/positions.d.ts +49 -0
  1459. package/dist/strategies/crypto-hft/positions.js +376 -0
  1460. package/dist/strategies/crypto-hft/positions.js.map +1 -0
  1461. package/dist/strategies/crypto-hft/presets.d.ts +11 -0
  1462. package/dist/strategies/crypto-hft/presets.js +164 -0
  1463. package/dist/strategies/crypto-hft/presets.js.map +1 -0
  1464. package/dist/strategies/crypto-hft/strategies.d.ts +96 -0
  1465. package/dist/strategies/crypto-hft/strategies.js +330 -0
  1466. package/dist/strategies/crypto-hft/strategies.js.map +1 -0
  1467. package/dist/strategies/crypto-hft/types.d.ts +196 -0
  1468. package/dist/strategies/crypto-hft/types.js +32 -0
  1469. package/dist/strategies/crypto-hft/types.js.map +1 -0
  1470. package/dist/strategies/hft-divergence/detector.d.ts +29 -0
  1471. package/dist/strategies/hft-divergence/detector.js +182 -0
  1472. package/dist/strategies/hft-divergence/detector.js.map +1 -0
  1473. package/dist/strategies/hft-divergence/index.d.ts +12 -0
  1474. package/dist/strategies/hft-divergence/index.js +19 -0
  1475. package/dist/strategies/hft-divergence/index.js.map +1 -0
  1476. package/dist/strategies/hft-divergence/market-rotator.d.ts +17 -0
  1477. package/dist/strategies/hft-divergence/market-rotator.js +128 -0
  1478. package/dist/strategies/hft-divergence/market-rotator.js.map +1 -0
  1479. package/dist/strategies/hft-divergence/position-manager.d.ts +35 -0
  1480. package/dist/strategies/hft-divergence/position-manager.js +188 -0
  1481. package/dist/strategies/hft-divergence/position-manager.js.map +1 -0
  1482. package/dist/strategies/hft-divergence/strategy.d.ts +31 -0
  1483. package/dist/strategies/hft-divergence/strategy.js +295 -0
  1484. package/dist/strategies/hft-divergence/strategy.js.map +1 -0
  1485. package/dist/strategies/hft-divergence/types.d.ts +114 -0
  1486. package/dist/strategies/hft-divergence/types.js +10 -0
  1487. package/dist/strategies/hft-divergence/types.js.map +1 -0
  1488. package/dist/streaming/index.d.ts +70 -0
  1489. package/dist/streaming/index.js +296 -0
  1490. package/dist/streaming/index.js.map +1 -0
  1491. package/dist/tailscale/index.d.ts +139 -0
  1492. package/dist/tailscale/index.js +345 -0
  1493. package/dist/tailscale/index.js.map +1 -0
  1494. package/dist/telemetry/index.d.ts +143 -0
  1495. package/dist/telemetry/index.js +535 -0
  1496. package/dist/telemetry/index.js.map +1 -0
  1497. package/dist/terminal/index.d.ts +121 -0
  1498. package/dist/terminal/index.js +548 -0
  1499. package/dist/terminal/index.js.map +1 -0
  1500. package/dist/token-security/index.d.ts +36 -0
  1501. package/dist/token-security/index.js +253 -0
  1502. package/dist/token-security/index.js.map +1 -0
  1503. package/dist/tools/browser.d.ts +128 -0
  1504. package/dist/tools/browser.js +459 -0
  1505. package/dist/tools/browser.js.map +1 -0
  1506. package/dist/tools/canvas.d.ts +93 -0
  1507. package/dist/tools/canvas.js +349 -0
  1508. package/dist/tools/canvas.js.map +1 -0
  1509. package/dist/tools/docker.d.ts +59 -0
  1510. package/dist/tools/docker.js +191 -0
  1511. package/dist/tools/docker.js.map +1 -0
  1512. package/dist/tools/email.d.ts +25 -0
  1513. package/dist/tools/email.js +131 -0
  1514. package/dist/tools/email.js.map +1 -0
  1515. package/dist/tools/exec.d.ts +81 -0
  1516. package/dist/tools/exec.js +373 -0
  1517. package/dist/tools/exec.js.map +1 -0
  1518. package/dist/tools/files.d.ts +46 -0
  1519. package/dist/tools/files.js +185 -0
  1520. package/dist/tools/files.js.map +1 -0
  1521. package/dist/tools/git.d.ts +29 -0
  1522. package/dist/tools/git.js +105 -0
  1523. package/dist/tools/git.js.map +1 -0
  1524. package/dist/tools/image.d.ts +57 -0
  1525. package/dist/tools/image.js +308 -0
  1526. package/dist/tools/image.js.map +1 -0
  1527. package/dist/tools/index.d.ts +39 -0
  1528. package/dist/tools/index.js +46 -0
  1529. package/dist/tools/index.js.map +1 -0
  1530. package/dist/tools/message.d.ts +99 -0
  1531. package/dist/tools/message.js +200 -0
  1532. package/dist/tools/message.js.map +1 -0
  1533. package/dist/tools/nodes.d.ts +134 -0
  1534. package/dist/tools/nodes.js +357 -0
  1535. package/dist/tools/nodes.js.map +1 -0
  1536. package/dist/tools/sessions.d.ts +60 -0
  1537. package/dist/tools/sessions.js +119 -0
  1538. package/dist/tools/sessions.js.map +1 -0
  1539. package/dist/tools/shell-history.d.ts +17 -0
  1540. package/dist/tools/shell-history.js +118 -0
  1541. package/dist/tools/shell-history.js.map +1 -0
  1542. package/dist/tools/sms.d.ts +18 -0
  1543. package/dist/tools/sms.js +66 -0
  1544. package/dist/tools/sms.js.map +1 -0
  1545. package/dist/tools/sql.d.ts +19 -0
  1546. package/dist/tools/sql.js +91 -0
  1547. package/dist/tools/sql.js.map +1 -0
  1548. package/dist/tools/transcription.d.ts +13 -0
  1549. package/dist/tools/transcription.js +99 -0
  1550. package/dist/tools/transcription.js.map +1 -0
  1551. package/dist/tools/web-fetch.d.ts +69 -0
  1552. package/dist/tools/web-fetch.js +251 -0
  1553. package/dist/tools/web-fetch.js.map +1 -0
  1554. package/dist/tools/web-search.d.ts +58 -0
  1555. package/dist/tools/web-search.js +204 -0
  1556. package/dist/tools/web-search.js.map +1 -0
  1557. package/dist/tools/webhooks.d.ts +74 -0
  1558. package/dist/tools/webhooks.js +165 -0
  1559. package/dist/tools/webhooks.js.map +1 -0
  1560. package/dist/trading/accounts.d.ts +167 -0
  1561. package/dist/trading/accounts.js +394 -0
  1562. package/dist/trading/accounts.js.map +1 -0
  1563. package/dist/trading/adapters/index.d.ts +27 -0
  1564. package/dist/trading/adapters/index.js +165 -0
  1565. package/dist/trading/adapters/index.js.map +1 -0
  1566. package/dist/trading/backtest.d.ts +161 -0
  1567. package/dist/trading/backtest.js +665 -0
  1568. package/dist/trading/backtest.js.map +1 -0
  1569. package/dist/trading/bots/index.d.ts +196 -0
  1570. package/dist/trading/bots/index.js +688 -0
  1571. package/dist/trading/bots/index.js.map +1 -0
  1572. package/dist/trading/bridge.d.ts +33 -0
  1573. package/dist/trading/bridge.js +121 -0
  1574. package/dist/trading/bridge.js.map +1 -0
  1575. package/dist/trading/builder.d.ts +102 -0
  1576. package/dist/trading/builder.js +430 -0
  1577. package/dist/trading/builder.js.map +1 -0
  1578. package/dist/trading/copy-trading.d.ts +125 -0
  1579. package/dist/trading/copy-trading.js +611 -0
  1580. package/dist/trading/copy-trading.js.map +1 -0
  1581. package/dist/trading/devtools.d.ts +172 -0
  1582. package/dist/trading/devtools.js +425 -0
  1583. package/dist/trading/devtools.js.map +1 -0
  1584. package/dist/trading/futures/index.d.ts +981 -0
  1585. package/dist/trading/futures/index.js +4011 -0
  1586. package/dist/trading/futures/index.js.map +1 -0
  1587. package/dist/trading/index.d.ts +102 -0
  1588. package/dist/trading/index.js +310 -0
  1589. package/dist/trading/index.js.map +1 -0
  1590. package/dist/trading/kelly.d.ts +137 -0
  1591. package/dist/trading/kelly.js +328 -0
  1592. package/dist/trading/kelly.js.map +1 -0
  1593. package/dist/trading/logger.d.ts +163 -0
  1594. package/dist/trading/logger.js +424 -0
  1595. package/dist/trading/logger.js.map +1 -0
  1596. package/dist/trading/market-making/engine.d.ts +44 -0
  1597. package/dist/trading/market-making/engine.js +165 -0
  1598. package/dist/trading/market-making/engine.js.map +1 -0
  1599. package/dist/trading/market-making/index.d.ts +10 -0
  1600. package/dist/trading/market-making/index.js +29 -0
  1601. package/dist/trading/market-making/index.js.map +1 -0
  1602. package/dist/trading/market-making/strategy.d.ts +25 -0
  1603. package/dist/trading/market-making/strategy.js +250 -0
  1604. package/dist/trading/market-making/strategy.js.map +1 -0
  1605. package/dist/trading/market-making/types.d.ts +92 -0
  1606. package/dist/trading/market-making/types.js +6 -0
  1607. package/dist/trading/market-making/types.js.map +1 -0
  1608. package/dist/trading/ml-signals.d.ts +175 -0
  1609. package/dist/trading/ml-signals.js +548 -0
  1610. package/dist/trading/ml-signals.js.map +1 -0
  1611. package/dist/trading/orchestrator.d.ts +59 -0
  1612. package/dist/trading/orchestrator.js +199 -0
  1613. package/dist/trading/orchestrator.js.map +1 -0
  1614. package/dist/trading/position-bridge.d.ts +41 -0
  1615. package/dist/trading/position-bridge.js +178 -0
  1616. package/dist/trading/position-bridge.js.map +1 -0
  1617. package/dist/trading/resilience.d.ts +81 -0
  1618. package/dist/trading/resilience.js +257 -0
  1619. package/dist/trading/resilience.js.map +1 -0
  1620. package/dist/trading/risk.d.ts +18 -0
  1621. package/dist/trading/risk.js +91 -0
  1622. package/dist/trading/risk.js.map +1 -0
  1623. package/dist/trading/safety.d.ts +114 -0
  1624. package/dist/trading/safety.js +372 -0
  1625. package/dist/trading/safety.js.map +1 -0
  1626. package/dist/trading/secrets.d.ts +48 -0
  1627. package/dist/trading/secrets.js +243 -0
  1628. package/dist/trading/secrets.js.map +1 -0
  1629. package/dist/trading/state.d.ts +88 -0
  1630. package/dist/trading/state.js +221 -0
  1631. package/dist/trading/state.js.map +1 -0
  1632. package/dist/trading/stream.d.ts +121 -0
  1633. package/dist/trading/stream.js +396 -0
  1634. package/dist/trading/stream.js.map +1 -0
  1635. package/dist/trading/tracking.d.ts +136 -0
  1636. package/dist/trading/tracking.js +512 -0
  1637. package/dist/trading/tracking.js.map +1 -0
  1638. package/dist/tts/index.d.ts +28 -0
  1639. package/dist/tts/index.js +64 -0
  1640. package/dist/tts/index.js.map +1 -0
  1641. package/dist/tui/index.d.ts +159 -0
  1642. package/dist/tui/index.js +580 -0
  1643. package/dist/tui/index.js.map +1 -0
  1644. package/dist/types.d.ts +1373 -0
  1645. package/dist/types.js +7 -0
  1646. package/dist/types.js.map +1 -0
  1647. package/dist/usage/index.d.ts +57 -0
  1648. package/dist/usage/index.js +191 -0
  1649. package/dist/usage/index.js.map +1 -0
  1650. package/dist/utils/attachments.d.ts +12 -0
  1651. package/dist/utils/attachments.js +104 -0
  1652. package/dist/utils/attachments.js.map +1 -0
  1653. package/dist/utils/config.d.ts +14 -0
  1654. package/dist/utils/config.js +474 -0
  1655. package/dist/utils/config.js.map +1 -0
  1656. package/dist/utils/http.d.ts +22 -0
  1657. package/dist/utils/http.js +191 -0
  1658. package/dist/utils/http.js.map +1 -0
  1659. package/dist/utils/id.d.ts +21 -0
  1660. package/dist/utils/id.js +41 -0
  1661. package/dist/utils/id.js.map +1 -0
  1662. package/dist/utils/json-utils.d.ts +201 -0
  1663. package/dist/utils/json-utils.js +151 -0
  1664. package/dist/utils/json-utils.js.map +1 -0
  1665. package/dist/utils/kalshi-auth.d.ts +10 -0
  1666. package/dist/utils/kalshi-auth.js +48 -0
  1667. package/dist/utils/kalshi-auth.js.map +1 -0
  1668. package/dist/utils/kelly.d.ts +153 -0
  1669. package/dist/utils/kelly.js +322 -0
  1670. package/dist/utils/kelly.js.map +1 -0
  1671. package/dist/utils/logger.d.ts +7 -0
  1672. package/dist/utils/logger.js +26 -0
  1673. package/dist/utils/logger.js.map +1 -0
  1674. package/dist/utils/opinion-auth.d.ts +17 -0
  1675. package/dist/utils/opinion-auth.js +25 -0
  1676. package/dist/utils/opinion-auth.js.map +1 -0
  1677. package/dist/utils/polymarket-auth.d.ts +11 -0
  1678. package/dist/utils/polymarket-auth.js +32 -0
  1679. package/dist/utils/polymarket-auth.js.map +1 -0
  1680. package/dist/utils/polymarket-order-signer.d.ts +118 -0
  1681. package/dist/utils/polymarket-order-signer.js +329 -0
  1682. package/dist/utils/polymarket-order-signer.js.map +1 -0
  1683. package/dist/utils/polymarket-setup.d.ts +70 -0
  1684. package/dist/utils/polymarket-setup.js +288 -0
  1685. package/dist/utils/polymarket-setup.js.map +1 -0
  1686. package/dist/utils/production.d.ts +112 -0
  1687. package/dist/utils/production.js +294 -0
  1688. package/dist/utils/production.js.map +1 -0
  1689. package/dist/utils/rate-limiter.d.ts +77 -0
  1690. package/dist/utils/rate-limiter.js +271 -0
  1691. package/dist/utils/rate-limiter.js.map +1 -0
  1692. package/dist/utils/webhook-security.d.ts +63 -0
  1693. package/dist/utils/webhook-security.js +183 -0
  1694. package/dist/utils/webhook-security.js.map +1 -0
  1695. package/dist/voice/index.d.ts +125 -0
  1696. package/dist/voice/index.js +557 -0
  1697. package/dist/voice/index.js.map +1 -0
  1698. package/dist/weather/edge.d.ts +70 -0
  1699. package/dist/weather/edge.js +281 -0
  1700. package/dist/weather/edge.js.map +1 -0
  1701. package/dist/weather/index.d.ts +6 -0
  1702. package/dist/weather/index.js +23 -0
  1703. package/dist/weather/index.js.map +1 -0
  1704. package/dist/weather/markets.d.ts +84 -0
  1705. package/dist/weather/markets.js +320 -0
  1706. package/dist/weather/markets.js.map +1 -0
  1707. package/dist/weather/noaa.d.ts +113 -0
  1708. package/dist/weather/noaa.js +287 -0
  1709. package/dist/weather/noaa.js.map +1 -0
  1710. package/dist/web/index.d.ts +112 -0
  1711. package/dist/web/index.js +639 -0
  1712. package/dist/web/index.js.map +1 -0
  1713. package/dist/wizard/index.d.ts +27 -0
  1714. package/dist/wizard/index.js +186 -0
  1715. package/dist/wizard/index.js.map +1 -0
  1716. package/dist/workspace/index.d.ts +73 -0
  1717. package/dist/workspace/index.js +403 -0
  1718. package/dist/workspace/index.js.map +1 -0
  1719. package/package.json +168 -0
@@ -0,0 +1,3142 @@
1
+ "use strict";
2
+ /**
3
+ * Slash Command Registry - shared command registration and handling
4
+ *
5
+ * Provides a single source of truth for commands across channels and
6
+ * supports platform-level registration (e.g., Telegram setMyCommands).
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.COMMAND_CATEGORIES = void 0;
43
+ exports.createCommandRegistry = createCommandRegistry;
44
+ exports.createDefaultCommands = createDefaultCommands;
45
+ const logger_1 = require("../utils/logger");
46
+ const permissions_1 = require("../permissions");
47
+ const virtuals = __importStar(require("../evm/virtuals"));
48
+ const wallet = __importStar(require("../evm/wallet"));
49
+ const multichain = __importStar(require("../evm/multichain"));
50
+ const odos = __importStar(require("../evm/odos"));
51
+ const transfers = __importStar(require("../evm/transfers"));
52
+ /** Category mapping — string for single category, string[] for multi-category commands */
53
+ exports.COMMAND_CATEGORIES = {
54
+ // ── Core ──
55
+ help: 'Core', new: 'Core', reset: 'Core', status: 'Core', model: 'Core',
56
+ context: 'Core', resume: 'Core', sessions: 'Core', doctor: 'Core',
57
+ remember: 'Core', memory: 'Core', forget: 'Core', embeddings: 'Core',
58
+ // ── Market Data ──
59
+ markets: 'Market Data', compare: 'Market Data', trending: 'Market Data',
60
+ 'market-index': 'Market Data', news: 'Market Data', research: 'Market Data',
61
+ analytics: 'Market Data', ticks: 'Market Data', features: 'Market Data',
62
+ weather: 'Market Data', stream: 'Market Data',
63
+ // ── Cross-platform commands → appear under each platform they support ──
64
+ opportunity: ['Market Data', 'Polymarket', 'Kalshi', 'Sportsbooks'],
65
+ edge: ['Market Data', 'Polymarket', 'Kalshi'],
66
+ arbitrage: ['Polymarket', 'Kalshi', 'Sportsbooks'],
67
+ execution: ['Polymarket', 'Kalshi', 'Hyperliquid', 'CEX Futures'],
68
+ portfolio: ['Portfolio', 'Polymarket', 'Kalshi', 'Hyperliquid', 'CEX Futures', 'Solana DeFi'],
69
+ positions: ['Portfolio', 'Polymarket', 'Kalshi', 'Hyperliquid', 'CEX Futures', 'Solana DeFi'],
70
+ pnl: ['Portfolio', 'Polymarket', 'Hyperliquid', 'CEX Futures'],
71
+ slippage: ['Polymarket', 'Kalshi', 'Hyperliquid', 'CEX Futures'],
72
+ trades: ['Polymarket', 'Kalshi', 'Hyperliquid', 'CEX Futures'],
73
+ // ── Polymarket ──
74
+ 'trading-polymarket': 'Polymarket', 'copy-trading': 'Polymarket',
75
+ track: 'Polymarket', 'crypto-hft': 'Polymarket', 'whale-tracking': 'Polymarket',
76
+ // ── Kalshi ──
77
+ 'trading-kalshi': 'Kalshi',
78
+ // ── Hyperliquid ──
79
+ hyperliquid: 'Hyperliquid',
80
+ // ── CEX Futures ──
81
+ 'binance-futures': 'CEX Futures', 'bybit-futures': 'CEX Futures',
82
+ 'mexc-futures': 'CEX Futures', 'trading-futures': 'CEX Futures',
83
+ // ── Sportsbooks ──
84
+ betfair: 'Sportsbooks', smarkets: 'Sportsbooks',
85
+ // ── Other Prediction Markets ──
86
+ 'trading-manifold': 'Manifold', opinion: 'Opinion',
87
+ predictit: 'PredictIt', predictfun: 'Predict.fun',
88
+ metaculus: 'Metaculus', veil: 'Veil',
89
+ agentbets: 'AgentBets',
90
+ // ── Solana DeFi ──
91
+ drift: 'Solana DeFi', 'drift-sdk': 'Solana DeFi',
92
+ meteora: 'Solana DeFi', 'meteora-dbc': 'Solana DeFi', orca: 'Solana DeFi',
93
+ jupiter: 'Solana DeFi', raydium: 'Solana DeFi', kamino: 'Solana DeFi',
94
+ pumpfun: 'Solana DeFi', 'pump-swarm': 'Solana DeFi',
95
+ 'trading-solana': 'Solana DeFi', bags: 'Solana DeFi', yoink: 'Solana DeFi',
96
+ 'copy-trading-solana': 'Solana DeFi',
97
+ // ── EVM DeFi ──
98
+ swap: 'EVM DeFi', bridge: ['EVM DeFi', 'Solana DeFi'], 'trading-evm': 'EVM DeFi',
99
+ router: 'EVM DeFi', routing: 'EVM DeFi', mev: 'EVM DeFi',
100
+ clanker: 'EVM DeFi', endaoment: 'EVM DeFi', onchainkit: 'EVM DeFi',
101
+ erc8004: 'EVM DeFi', ens: 'EVM DeFi', qrcoin: 'EVM DeFi',
102
+ bankr: 'EVM DeFi', acp: 'EVM DeFi',
103
+ percolator: 'Solana DeFi',
104
+ // ── Virtuals & Agents ──
105
+ virtuals: 'Virtuals & Agents', agents: 'Virtuals & Agents', agent: 'Virtuals & Agents',
106
+ 'trending-agents': 'Virtuals & Agents', 'new-agents': 'Virtuals & Agents',
107
+ 'agent-quote': 'Virtuals & Agents', 'virtual-balance': 'Virtuals & Agents',
108
+ // ── Bots & Execution ──
109
+ bot: 'Bots & Execution', mm: 'Bots & Execution',
110
+ 'trading-system': 'Bots & Execution',
111
+ // ── Portfolio (single-category ones already handled above) ──
112
+ 'portfolio-sync': 'Portfolio', history: 'Portfolio', ledger: 'Portfolio',
113
+ // ── Strategy ──
114
+ strategy: 'Strategy', backtest: 'Strategy', abtest: 'Strategy',
115
+ 'ai-strategy': 'Strategy', signals: 'Strategy', divergence: 'Strategy',
116
+ sizing: 'Strategy', risk: 'Strategy', safety: 'Strategy',
117
+ // ── Wallet & Accounts ──
118
+ wallet: ['Wallet', 'Solana DeFi', 'EVM DeFi'],
119
+ send: ['Wallet', 'Solana DeFi', 'EVM DeFi'],
120
+ chains: 'Wallet', account: 'Wallet', credentials: 'Wallet',
121
+ // ── Automation ──
122
+ alerts: 'Automation', triggers: 'Automation', automation: 'Automation',
123
+ webhooks: 'Automation', 'auto-reply': 'Automation', monitoring: 'Automation',
124
+ processes: 'Automation',
125
+ // ── Config ──
126
+ feeds: 'Config', plugins: 'Config', integrations: 'Config',
127
+ 'search-config': 'Config', pairing: 'Config', usage: 'Config',
128
+ metrics: 'Config', digest: 'Config', permissions: 'Config', harden: 'Config',
129
+ approvals: 'Config', approve: 'Config', deny: 'Config',
130
+ // ── Tools ──
131
+ sandbox: 'Tools', remote: 'Tools', tailscale: 'Tools', mcp: 'Tools',
132
+ identity: 'Tools', verify: 'Tools', presence: 'Tools',
133
+ qmd: 'Tools', devtools: 'Tools',
134
+ tts: 'Tools', voice: 'Tools', streaming: 'Tools',
135
+ farcaster: 'Tools', botchan: 'Tools', 'tweet-ideas': 'Tools',
136
+ // ── Bittensor ──
137
+ tao: 'Bittensor',
138
+ // ── New features (Feb 2026) ──
139
+ 'token-security': ['Solana DeFi', 'EVM DeFi'],
140
+ dca: ['Solana DeFi', 'Polymarket', 'Kalshi', 'Hyperliquid', 'CEX Futures', 'EVM DeFi'],
141
+ shield: 'Security',
142
+ // ── Skills with non-standard casing in their name field ──
143
+ 'Features': 'Market Data', 'Tick Data': 'Market Data',
144
+ };
145
+ const PLATFORM_NAMES = [
146
+ 'polymarket',
147
+ 'kalshi',
148
+ 'manifold',
149
+ 'metaculus',
150
+ 'predictit',
151
+ 'drift',
152
+ 'betfair',
153
+ 'smarkets',
154
+ 'opinion',
155
+ 'virtuals',
156
+ ];
157
+ function isPlatformName(value) {
158
+ return PLATFORM_NAMES.includes(value);
159
+ }
160
+ function parseRememberArgs(args) {
161
+ const trimmed = args.trim();
162
+ if (!trimmed) {
163
+ return {
164
+ scope: 'global',
165
+ type: 'note',
166
+ key: '',
167
+ value: '',
168
+ error: 'Usage: /remember [global|channel] [fact|preference|note|profile] <key>=<value>',
169
+ };
170
+ }
171
+ const tokens = trimmed.split(/\s+/);
172
+ let scope = 'global';
173
+ let type = 'note';
174
+ if (tokens[0] === 'global' || tokens[0] === 'channel') {
175
+ scope = tokens.shift();
176
+ }
177
+ if (tokens[0] === 'fact' ||
178
+ tokens[0] === 'preference' ||
179
+ tokens[0] === 'note' ||
180
+ tokens[0] === 'profile') {
181
+ type = tokens.shift();
182
+ }
183
+ const remainder = tokens.join(' ').trim();
184
+ if (!remainder) {
185
+ return {
186
+ scope,
187
+ type,
188
+ key: '',
189
+ value: '',
190
+ error: 'Usage: /remember [global|channel] [fact|preference|note|profile] <key>=<value>',
191
+ };
192
+ }
193
+ if (type === 'profile' && !remainder.includes('=') && !remainder.includes(':')) {
194
+ return {
195
+ scope,
196
+ type,
197
+ key: 'profile',
198
+ value: remainder,
199
+ };
200
+ }
201
+ const match = remainder.match(/^([^:=]+)[:=](.+)$/);
202
+ if (!match) {
203
+ return {
204
+ scope,
205
+ type,
206
+ key: '',
207
+ value: '',
208
+ error: 'Usage: /remember [global|channel] [fact|preference|note|profile] <key>=<value>',
209
+ };
210
+ }
211
+ const key = match[1].trim();
212
+ const value = match[2].trim();
213
+ if (!key || !value) {
214
+ return {
215
+ scope,
216
+ type,
217
+ key: '',
218
+ value: '',
219
+ error: 'Usage: /remember [global|channel] [fact|preference|note|profile] <key>=<value>',
220
+ };
221
+ }
222
+ return {
223
+ scope,
224
+ type,
225
+ key: key.slice(0, 120),
226
+ value: value.slice(0, 500),
227
+ };
228
+ }
229
+ function formatPriceCents(price) {
230
+ const cents = Math.round(price * 100);
231
+ return `${cents}c`;
232
+ }
233
+ function formatMemoryEntries(label, entries, max = 10) {
234
+ const lines = [label];
235
+ for (const entry of entries.slice(0, max)) {
236
+ const value = entry.value.length > 80 ? `${entry.value.slice(0, 80)}...` : entry.value;
237
+ lines.push(`- ${entry.key}: ${value}`);
238
+ }
239
+ if (entries.length > max) {
240
+ lines.push(`...and ${entries.length - max} more.`);
241
+ }
242
+ return lines;
243
+ }
244
+ function estimateTokensFromHistory(session) {
245
+ const history = session.context.conversationHistory || [];
246
+ const totalChars = history.reduce((sum, m) => sum + (m.content?.length ?? 0), 0);
247
+ return Math.max(0, Math.round(totalChars / 4));
248
+ }
249
+ function isOwner(db, channel, userId) {
250
+ try {
251
+ const rows = db.query('SELECT isOwner FROM paired_users WHERE channel = ? AND userId = ? LIMIT 1', [channel, userId]);
252
+ return rows[0]?.isOwner === 1;
253
+ }
254
+ catch {
255
+ return false;
256
+ }
257
+ }
258
+ function summarizePositions(positions) {
259
+ let totalValue = 0;
260
+ let totalPnl = 0;
261
+ const byPlatform = new Map();
262
+ for (const pos of positions) {
263
+ const value = pos.shares * pos.currentPrice;
264
+ const pnl = value - pos.shares * pos.avgPrice;
265
+ totalValue += value;
266
+ totalPnl += pnl;
267
+ const agg = byPlatform.get(pos.platform) || { value: 0, pnl: 0 };
268
+ agg.value += value;
269
+ agg.pnl += pnl;
270
+ byPlatform.set(pos.platform, agg);
271
+ }
272
+ const totalCostBasis = positions.reduce((sum, p) => sum + p.shares * p.avgPrice, 0);
273
+ const totalPnlPct = totalCostBasis > 0 ? totalPnl / totalCostBasis : 0;
274
+ return { totalValue, totalPnl, totalPnlPct, byPlatform };
275
+ }
276
+ function parsePnlHistoryArgs(args) {
277
+ const trimmed = args.trim();
278
+ if (!trimmed) {
279
+ return { limit: 24 };
280
+ }
281
+ let limit = 24;
282
+ let sinceMs;
283
+ const tokens = trimmed.split(/\s+/).filter(Boolean);
284
+ const now = Date.now();
285
+ for (const token of tokens) {
286
+ const lower = token.toLowerCase();
287
+ if (lower.startsWith('limit=')) {
288
+ const value = Number.parseInt(lower.slice('limit='.length), 10);
289
+ if (!Number.isFinite(value) || value <= 0) {
290
+ return { limit, error: 'Limit must be a positive integer.' };
291
+ }
292
+ limit = Math.min(value, 500);
293
+ continue;
294
+ }
295
+ const match = lower.match(/^(\d+)([hdw]|m)$/);
296
+ if (match) {
297
+ const amount = Number.parseInt(match[1], 10);
298
+ const unit = match[2];
299
+ const mult = unit === 'm'
300
+ ? 60 * 1000
301
+ : unit === 'h'
302
+ ? 60 * 60 * 1000
303
+ : unit === 'd'
304
+ ? 24 * 60 * 60 * 1000
305
+ : 7 * 24 * 60 * 60 * 1000;
306
+ sinceMs = now - amount * mult;
307
+ continue;
308
+ }
309
+ if (/^\d+$/.test(lower)) {
310
+ const hours = Number.parseInt(lower, 10);
311
+ sinceMs = now - hours * 60 * 60 * 1000;
312
+ continue;
313
+ }
314
+ return { limit, error: 'Usage: /pnl [24h|7d|30m] [limit=50]' };
315
+ }
316
+ return { sinceMs, limit };
317
+ }
318
+ function parseCompareArgs(args) {
319
+ const trimmed = args.trim();
320
+ if (!trimmed) {
321
+ return { limit: 3, error: 'Usage: /compare <query> [platforms=polymarket,kalshi] [limit=3]' };
322
+ }
323
+ const tokens = trimmed.split(/\s+/).filter(Boolean);
324
+ const queryParts = [];
325
+ let platforms;
326
+ let limit = 3;
327
+ for (const token of tokens) {
328
+ const lower = token.toLowerCase();
329
+ if (lower.startsWith('limit=')) {
330
+ const value = Number.parseInt(lower.slice('limit='.length), 10);
331
+ if (!Number.isFinite(value) || value <= 0) {
332
+ return { limit, error: 'Limit must be a positive integer.' };
333
+ }
334
+ limit = Math.min(value, 10);
335
+ continue;
336
+ }
337
+ if (lower.startsWith('platforms=')) {
338
+ const raw = lower.slice('platforms='.length);
339
+ platforms = raw
340
+ .split(',')
341
+ .map((p) => p.trim())
342
+ .filter(Boolean);
343
+ continue;
344
+ }
345
+ queryParts.push(token);
346
+ }
347
+ const query = queryParts.join(' ').trim();
348
+ if (!query) {
349
+ return { limit, error: 'Usage: /compare <query> [platforms=polymarket,kalshi] [limit=3]' };
350
+ }
351
+ return { query, platforms, limit };
352
+ }
353
+ function parseArbitrageArgs(args) {
354
+ const trimmed = args.trim();
355
+ if (!trimmed) {
356
+ return { query: '', platforms: undefined, limit: 10, minEdge: 1, mode: 'both' };
357
+ }
358
+ const tokens = trimmed.split(/\s+/).filter(Boolean);
359
+ const queryParts = [];
360
+ let platforms;
361
+ let limit = 10;
362
+ let minEdge = 1;
363
+ let mode = 'both';
364
+ for (const token of tokens) {
365
+ const lower = token.toLowerCase();
366
+ if (lower.startsWith('limit=')) {
367
+ const value = Number.parseInt(lower.slice('limit='.length), 10);
368
+ if (!Number.isFinite(value) || value <= 0) {
369
+ return { query: '', platforms, limit, minEdge, mode, error: 'Limit must be a positive integer.' };
370
+ }
371
+ limit = Math.min(value, 20);
372
+ continue;
373
+ }
374
+ if (lower.startsWith('minedge=')) {
375
+ const value = Number.parseFloat(lower.slice('minedge='.length));
376
+ if (!Number.isFinite(value) || value < 0) {
377
+ return { query: '', platforms, limit, minEdge, mode, error: 'minEdge must be a non-negative number.' };
378
+ }
379
+ minEdge = value;
380
+ continue;
381
+ }
382
+ if (lower.startsWith('platforms=')) {
383
+ const raw = lower.slice('platforms='.length);
384
+ platforms = raw
385
+ .split(',')
386
+ .map((p) => p.trim())
387
+ .filter(Boolean);
388
+ continue;
389
+ }
390
+ if (lower.startsWith('mode=')) {
391
+ const raw = lower.slice('mode='.length);
392
+ if (raw === 'internal' || raw === 'cross' || raw === 'both') {
393
+ mode = raw;
394
+ continue;
395
+ }
396
+ return { query: '', platforms, limit, minEdge, mode, error: 'mode must be internal, cross, or both.' };
397
+ }
398
+ queryParts.push(token);
399
+ }
400
+ return { query: queryParts.join(' ').trim(), platforms, limit, minEdge, mode };
401
+ }
402
+ function parseRiskSettingsArgs(args) {
403
+ const trimmed = args.trim();
404
+ if (!trimmed) {
405
+ return { show: true };
406
+ }
407
+ const tokens = trimmed.split(/\s+/).filter(Boolean);
408
+ const head = tokens[0]?.toLowerCase();
409
+ if (head === 'show') {
410
+ return { show: true };
411
+ }
412
+ if (head === 'reset' || head === 'clear') {
413
+ return {
414
+ patch: {
415
+ maxOrderSize: undefined,
416
+ maxPositionValue: undefined,
417
+ maxTotalExposure: undefined,
418
+ stopLossPct: undefined,
419
+ },
420
+ };
421
+ }
422
+ if (head === 'off' || head === 'disable') {
423
+ return {
424
+ patch: {
425
+ maxOrderSize: 0,
426
+ maxPositionValue: 0,
427
+ maxTotalExposure: 0,
428
+ stopLossPct: 0,
429
+ },
430
+ };
431
+ }
432
+ if (head === 'set') {
433
+ tokens.shift();
434
+ }
435
+ if (tokens.length === 0) {
436
+ return { error: 'Usage: /risk set maxOrderSize=100 maxPositionValue=500 maxTotalExposure=2000 stopLossPct=0.2' };
437
+ }
438
+ const patch = {};
439
+ for (const token of tokens) {
440
+ const [rawKey, rawValue] = token.split('=');
441
+ if (!rawKey || rawValue === undefined) {
442
+ return { error: 'Usage: /risk set maxOrderSize=100 maxPositionValue=500 maxTotalExposure=2000 stopLossPct=0.2' };
443
+ }
444
+ const key = rawKey.trim().toLowerCase();
445
+ let valueText = rawValue.trim();
446
+ if (!valueText)
447
+ continue;
448
+ let value;
449
+ if (valueText.toLowerCase() === 'off') {
450
+ value = 0;
451
+ }
452
+ else {
453
+ if (valueText.endsWith('%')) {
454
+ valueText = valueText.slice(0, -1);
455
+ }
456
+ const parsed = Number(valueText);
457
+ if (!Number.isFinite(parsed)) {
458
+ return { error: `Invalid number for ${rawKey}: ${rawValue}` };
459
+ }
460
+ value = parsed;
461
+ }
462
+ switch (key) {
463
+ case 'maxordersize':
464
+ case 'max_order_size':
465
+ case 'max-order-size':
466
+ patch.maxOrderSize = value;
467
+ break;
468
+ case 'maxpositionvalue':
469
+ case 'max_position_value':
470
+ case 'max-position-value':
471
+ patch.maxPositionValue = value;
472
+ break;
473
+ case 'maxtotalexposure':
474
+ case 'max_total_exposure':
475
+ case 'max-total-exposure':
476
+ patch.maxTotalExposure = value;
477
+ break;
478
+ case 'stoplosspct':
479
+ case 'stop_loss_pct':
480
+ case 'stop-loss-pct':
481
+ patch.stopLossPct = value;
482
+ break;
483
+ default:
484
+ return { error: `Unknown setting: ${rawKey}` };
485
+ }
486
+ }
487
+ return { patch };
488
+ }
489
+ function parseDigestSettingsArgs(args) {
490
+ const trimmed = args.trim();
491
+ if (!trimmed) {
492
+ return { show: true };
493
+ }
494
+ const tokens = trimmed.split(/\s+/).filter(Boolean);
495
+ const patch = {};
496
+ let show = false;
497
+ for (const rawToken of tokens) {
498
+ const token = rawToken.toLowerCase();
499
+ if (token === 'show' || token === 'status') {
500
+ show = true;
501
+ continue;
502
+ }
503
+ if (token === 'on' || token === 'enable') {
504
+ patch.digestEnabled = true;
505
+ continue;
506
+ }
507
+ if (token === 'off' || token === 'disable') {
508
+ patch.digestEnabled = false;
509
+ continue;
510
+ }
511
+ if (token === 'reset' || token === 'clear') {
512
+ patch.digestEnabled = false;
513
+ patch.digestTime = undefined;
514
+ continue;
515
+ }
516
+ const timeToken = token.startsWith('time=') ? token.slice('time='.length) : token;
517
+ const match = timeToken.match(/^(\d{1,2}):(\d{2})$/);
518
+ if (match) {
519
+ const hour = Number.parseInt(match[1], 10);
520
+ const minute = Number.parseInt(match[2], 10);
521
+ if (!Number.isFinite(hour) || hour < 0 || hour > 23) {
522
+ return { error: 'Hour must be between 0 and 23.' };
523
+ }
524
+ if (!Number.isFinite(minute) || minute < 0 || minute > 59) {
525
+ return { error: 'Minute must be between 0 and 59.' };
526
+ }
527
+ patch.digestTime = `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`;
528
+ patch.digestEnabled = true;
529
+ continue;
530
+ }
531
+ return { error: 'Usage: /digest [on|off|HH:MM|time=HH:MM|show|reset]' };
532
+ }
533
+ if (show && Object.keys(patch).length === 0) {
534
+ return { show: true };
535
+ }
536
+ return { patch: Object.keys(patch).length === 0 ? undefined : patch };
537
+ }
538
+ function createCommandRegistry() {
539
+ const commands = new Map();
540
+ const aliasToName = new Map();
541
+ function register(command) {
542
+ commands.set(command.name, command);
543
+ if (command.aliases) {
544
+ for (const alias of command.aliases) {
545
+ aliasToName.set(alias, command.name);
546
+ }
547
+ }
548
+ }
549
+ function registerMany(defs) {
550
+ for (const def of defs)
551
+ register(def);
552
+ }
553
+ function list() {
554
+ return Array.from(commands.values())
555
+ .map((c) => ({
556
+ name: `/${c.name}`,
557
+ description: c.description,
558
+ usage: c.usage,
559
+ register: c.register !== false,
560
+ }))
561
+ .sort((a, b) => a.name.localeCompare(b.name));
562
+ }
563
+ function listAll() {
564
+ const entries = [];
565
+ for (const c of commands.values()) {
566
+ const cats = exports.COMMAND_CATEGORIES[c.name] || 'Other';
567
+ const catList = Array.isArray(cats) ? cats : [cats];
568
+ for (const category of catList) {
569
+ entries.push({ name: `/${c.name}`, description: c.description, category });
570
+ }
571
+ }
572
+ return entries.sort((a, b) => a.category.localeCompare(b.category) || a.name.localeCompare(b.name));
573
+ }
574
+ async function handle(message, ctx) {
575
+ const text = message.text.trim();
576
+ if (!text.startsWith('/'))
577
+ return null;
578
+ const spaceIdx = text.indexOf(' ');
579
+ const rawName = (spaceIdx > 0 ? text.slice(1, spaceIdx) : text.slice(1)).toLowerCase();
580
+ const args = spaceIdx > 0 ? text.slice(spaceIdx + 1).trim() : '';
581
+ const resolvedName = commands.has(rawName) ? rawName : aliasToName.get(rawName);
582
+ if (!resolvedName)
583
+ return null;
584
+ const command = commands.get(resolvedName);
585
+ if (!command)
586
+ return null;
587
+ try {
588
+ const response = await command.handler(args, {
589
+ ...ctx,
590
+ commands: registry,
591
+ message,
592
+ });
593
+ logger_1.logger.info({ command: command.name, userId: message.userId }, 'Command handled');
594
+ return response;
595
+ }
596
+ catch (error) {
597
+ logger_1.logger.error({ error, command: command.name }, 'Command handler failed');
598
+ return `Error running /${command.name}: ${error instanceof Error ? error.message : 'Unknown error'}`;
599
+ }
600
+ }
601
+ const registry = {
602
+ register,
603
+ registerMany,
604
+ list,
605
+ listAll,
606
+ handle,
607
+ };
608
+ return registry;
609
+ }
610
+ function createDefaultCommands() {
611
+ return [
612
+ {
613
+ name: 'help',
614
+ description: 'Show available commands',
615
+ usage: '/help',
616
+ handler: (_args, ctx) => {
617
+ const lines = ['Clodds Commands', ''];
618
+ for (const cmd of ctx.commands.list()) {
619
+ lines.push(`${cmd.name} - ${cmd.description}`);
620
+ }
621
+ lines.push('', 'Tip: try /markets <query> or /portfolio');
622
+ return lines.join('\n');
623
+ },
624
+ },
625
+ {
626
+ name: 'remember',
627
+ description: 'Store a memory entry',
628
+ usage: '/remember [global|channel] [fact|preference|note|profile] <key>=<value>',
629
+ handler: (args, ctx) => {
630
+ if (!ctx.memory) {
631
+ return 'Memory service not available.';
632
+ }
633
+ const parsed = parseRememberArgs(args);
634
+ if (parsed.error) {
635
+ return parsed.error;
636
+ }
637
+ const channelKey = ctx.message.chatId || ctx.message.platform;
638
+ const scopeKey = parsed.scope === 'channel' ? channelKey : 'global';
639
+ ctx.memory.remember(ctx.message.userId, scopeKey, parsed.type, parsed.key, parsed.value);
640
+ return `Saved ${parsed.type} to ${parsed.scope} memory: ${parsed.key}`;
641
+ },
642
+ },
643
+ {
644
+ name: 'memory',
645
+ description: 'Show stored memory entries',
646
+ usage: '/memory',
647
+ handler: (_args, ctx) => {
648
+ if (!ctx.memory) {
649
+ return 'Memory service not available.';
650
+ }
651
+ const channelKey = ctx.message.chatId || ctx.message.platform;
652
+ const globalEntries = ctx.memory.recallAll(ctx.message.userId, 'global');
653
+ const channelEntries = channelKey === 'global'
654
+ ? []
655
+ : ctx.memory.recallAll(ctx.message.userId, channelKey);
656
+ if (globalEntries.length === 0 && channelEntries.length === 0) {
657
+ return 'No memories stored for you yet.';
658
+ }
659
+ const lines = ['Your Memory', ''];
660
+ if (globalEntries.length > 0) {
661
+ lines.push(...formatMemoryEntries('Global', globalEntries));
662
+ lines.push('');
663
+ }
664
+ if (channelEntries.length > 0) {
665
+ lines.push(...formatMemoryEntries('This Channel', channelEntries));
666
+ }
667
+ return lines.join('\n').trim();
668
+ },
669
+ },
670
+ {
671
+ name: 'forget',
672
+ description: 'Forget a memory entry',
673
+ usage: '/forget <key>',
674
+ handler: (args, ctx) => {
675
+ if (!ctx.memory) {
676
+ return 'Memory service not available.';
677
+ }
678
+ const key = args.trim();
679
+ if (!key) {
680
+ return 'Usage: /forget <key>';
681
+ }
682
+ const channelKey = ctx.message.chatId || ctx.message.platform;
683
+ const channelRemoved = ctx.memory.forget(ctx.message.userId, channelKey, key);
684
+ const globalRemoved = channelKey !== 'global'
685
+ ? ctx.memory.forget(ctx.message.userId, 'global', key)
686
+ : false;
687
+ if (channelRemoved || globalRemoved) {
688
+ const scopes = [
689
+ channelRemoved ? 'channel' : null,
690
+ globalRemoved ? 'global' : null,
691
+ ].filter(Boolean).join(' + ');
692
+ return `Forgot ${key} (${scopes})`;
693
+ }
694
+ return `Memory not found: ${key}`;
695
+ },
696
+ },
697
+ {
698
+ name: 'new',
699
+ description: 'Start a fresh conversation',
700
+ usage: '/new',
701
+ aliases: ['reset'],
702
+ handler: (_args, ctx) => {
703
+ ctx.sessions.reset(ctx.session.id);
704
+ return 'Session reset. Starting fresh.';
705
+ },
706
+ },
707
+ {
708
+ name: 'resume',
709
+ description: 'Resume from the last checkpoint (if available)',
710
+ usage: '/resume',
711
+ handler: (_args, ctx) => {
712
+ const restored = ctx.sessions.restoreCheckpoint(ctx.session);
713
+ return restored
714
+ ? 'Resumed conversation from last checkpoint.'
715
+ : 'No checkpoint found to resume.';
716
+ },
717
+ },
718
+ {
719
+ name: 'status',
720
+ description: 'Show session status and context usage',
721
+ usage: '/status',
722
+ handler: (_args, ctx) => {
723
+ const uptimeMinutes = Math.max(0, Math.round((Date.now() - ctx.session.createdAt.getTime()) / 60000));
724
+ const tokens = estimateTokensFromHistory(ctx.session);
725
+ return [
726
+ 'Session Status',
727
+ `Session: ${ctx.session.id.slice(0, 8)}...`,
728
+ `Channel: ${ctx.session.channel}`,
729
+ `Messages: ${(ctx.session.context.conversationHistory || []).length}`,
730
+ `Est. tokens: ~${tokens.toLocaleString()}`,
731
+ `Uptime: ${uptimeMinutes}m`,
732
+ ].join('\n');
733
+ },
734
+ },
735
+ {
736
+ name: 'risk',
737
+ description: 'Show or update your risk limits',
738
+ usage: '/risk [show|set ...|reset|off]',
739
+ handler: (args, ctx) => {
740
+ const parsed = parseRiskSettingsArgs(args);
741
+ if (parsed.error)
742
+ return parsed.error;
743
+ if (parsed.show || !parsed.patch) {
744
+ const user = ctx.db.getUser(ctx.session.userId);
745
+ const settings = user?.settings ?? {};
746
+ const lines = [
747
+ 'Risk Settings',
748
+ `maxOrderSize: ${settings.maxOrderSize ?? 'unset'}`,
749
+ `maxPositionValue: ${settings.maxPositionValue ?? 'unset'}`,
750
+ `maxTotalExposure: ${settings.maxTotalExposure ?? 'unset'}`,
751
+ `stopLossPct: ${settings.stopLossPct ?? 'unset'}`,
752
+ ];
753
+ return lines.join('\n');
754
+ }
755
+ const ok = ctx.db.updateUserSettings(ctx.session.userId, parsed.patch);
756
+ if (!ok)
757
+ return 'Failed to update settings.';
758
+ return 'Risk settings updated.';
759
+ },
760
+ },
761
+ {
762
+ name: 'digest',
763
+ description: 'Configure daily digest notifications',
764
+ usage: '/digest [on|off|HH:MM|time=HH:MM|show|reset]',
765
+ handler: (args, ctx) => {
766
+ const parsed = parseDigestSettingsArgs(args);
767
+ if (parsed.error)
768
+ return parsed.error;
769
+ if (parsed.show || !parsed.patch) {
770
+ const user = ctx.db.getUser(ctx.session.userId);
771
+ const settings = user?.settings ?? {
772
+ digestEnabled: false,
773
+ digestTime: undefined,
774
+ };
775
+ const time = settings.digestTime ?? '09:00';
776
+ return [
777
+ 'Daily Digest',
778
+ `enabled: ${settings.digestEnabled ? 'on' : 'off'}`,
779
+ `time: ${time}`,
780
+ ].join('\n');
781
+ }
782
+ const ok = ctx.db.updateUserSettings(ctx.session.userId, parsed.patch);
783
+ if (!ok)
784
+ return 'Failed to update digest settings.';
785
+ return 'Digest settings updated.';
786
+ },
787
+ },
788
+ {
789
+ name: 'approvals',
790
+ description: 'List pending approval requests (owner only)',
791
+ usage: '/approvals',
792
+ handler: (_args, ctx) => {
793
+ if (!isOwner(ctx.db, ctx.message.platform, ctx.message.userId)) {
794
+ return 'Only owners can view approvals.';
795
+ }
796
+ const pending = permissions_1.execApprovals.getPendingApprovalsFromDisk();
797
+ if (pending.length === 0) {
798
+ return 'No pending approvals.';
799
+ }
800
+ const lines = ['Pending Approvals'];
801
+ for (const req of pending.slice(0, 10)) {
802
+ const expires = req.expiresAt ? req.expiresAt.toLocaleString() : 'n/a';
803
+ lines.push(`- ${req.id} ${req.command} (agent ${req.agentId})`);
804
+ lines.push(` Expires: ${expires}`);
805
+ if (req.requester) {
806
+ lines.push(` From: ${req.requester.userId} (${req.requester.channel})`);
807
+ }
808
+ }
809
+ if (pending.length > 10) {
810
+ lines.push(`...and ${pending.length - 10} more.`);
811
+ }
812
+ return lines.join('\n');
813
+ },
814
+ },
815
+ {
816
+ name: 'approve',
817
+ description: 'Approve a pending request (owner only)',
818
+ usage: '/approve <id> [always]',
819
+ handler: (args, ctx) => {
820
+ if (!isOwner(ctx.db, ctx.message.platform, ctx.message.userId)) {
821
+ return 'Only owners can approve requests.';
822
+ }
823
+ const parts = args.trim().split(/\s+/).filter(Boolean);
824
+ const requestId = parts[0];
825
+ if (!requestId) {
826
+ return 'Usage: /approve <id> [always]';
827
+ }
828
+ const always = parts.slice(1).some((p) => p.toLowerCase() === 'always');
829
+ const decision = always ? 'allow-always' : 'allow-once';
830
+ const ok = permissions_1.execApprovals.recordDecision(requestId, decision, ctx.message.userId);
831
+ return ok ? `Approved ${requestId} (${decision})` : `Request not found: ${requestId}`;
832
+ },
833
+ },
834
+ {
835
+ name: 'deny',
836
+ description: 'Deny a pending request (owner only)',
837
+ usage: '/deny <id>',
838
+ handler: (args, ctx) => {
839
+ if (!isOwner(ctx.db, ctx.message.platform, ctx.message.userId)) {
840
+ return 'Only owners can deny requests.';
841
+ }
842
+ const requestId = args.trim();
843
+ if (!requestId) {
844
+ return 'Usage: /deny <id>';
845
+ }
846
+ const ok = permissions_1.execApprovals.recordDecision(requestId, 'deny', ctx.message.userId);
847
+ return ok ? `Denied ${requestId}` : `Request not found: ${requestId}`;
848
+ },
849
+ },
850
+ {
851
+ name: 'model',
852
+ description: 'Show or change the current model',
853
+ usage: '/model [sonnet|opus|haiku|claude-...]',
854
+ handler: (args, ctx) => {
855
+ const defaultModel = process.env.ANTHROPIC_MODEL || 'claude-opus-4-6';
856
+ const currentModel = ctx.session.context.modelOverride || ctx.session.context.model || defaultModel;
857
+ if (!args) {
858
+ return ['Current Model', currentModel, '', 'Usage: /model sonnet'].join('\n');
859
+ }
860
+ const requested = args.toLowerCase();
861
+ const aliases = {
862
+ opus: 'claude-opus-4-6',
863
+ 'opus4.6': 'claude-opus-4-6',
864
+ 'opus4.5': 'claude-opus-4-5-20250514',
865
+ sonnet: 'claude-sonnet-4-5-20250929',
866
+ 'sonnet4.5': 'claude-sonnet-4-5-20250929',
867
+ haiku: 'claude-haiku-4-5-20251001',
868
+ 'haiku4.5': 'claude-haiku-4-5-20251001',
869
+ };
870
+ const resolved = aliases[requested] || requested;
871
+ if (!resolved.startsWith('claude-')) {
872
+ return 'Unknown model. Try: sonnet, opus, haiku.';
873
+ }
874
+ ctx.session.context.modelOverride = resolved;
875
+ ctx.sessions.updateSession(ctx.session);
876
+ return `Model set to ${resolved}`;
877
+ },
878
+ },
879
+ {
880
+ name: 'context',
881
+ description: 'Preview recent conversation context',
882
+ usage: '/context',
883
+ handler: (_args, ctx) => {
884
+ const recent = (ctx.session.context.conversationHistory || []).slice(-5);
885
+ if (recent.length === 0) {
886
+ return 'No conversation history yet.';
887
+ }
888
+ const lines = ['Recent Context'];
889
+ for (const [index, msg] of recent.entries()) {
890
+ const preview = msg.content.length > 80 ? `${msg.content.slice(0, 80)}...` : msg.content;
891
+ lines.push(`${index + 1}. [${msg.role}] ${preview}`);
892
+ }
893
+ return lines.join('\n');
894
+ },
895
+ },
896
+ {
897
+ name: 'markets',
898
+ description: 'Search markets across platforms',
899
+ usage: '/markets [platform] <query>',
900
+ handler: async (args, ctx) => {
901
+ if (!args) {
902
+ return 'Usage: /markets [platform] <query>\nExample: /markets polymarket trump 2028';
903
+ }
904
+ const parts = args.split(/\s+/).filter(Boolean);
905
+ let platform;
906
+ let queryParts = parts;
907
+ if (parts.length > 1 && isPlatformName(parts[0].toLowerCase())) {
908
+ platform = parts[0].toLowerCase();
909
+ queryParts = parts.slice(1);
910
+ }
911
+ const query = queryParts.join(' ');
912
+ if (!query) {
913
+ return 'Please provide a search query.';
914
+ }
915
+ const markets = await ctx.feeds.searchMarkets(query, platform);
916
+ if (markets.length === 0) {
917
+ return `No markets found for "${query}"${platform ? ` on ${platform}` : ''}.`;
918
+ }
919
+ const top = markets.slice(0, 6);
920
+ const lines = [`Markets${platform ? ` - ${platform}` : ''}`];
921
+ for (const market of top) {
922
+ const bestOutcome = market.outcomes.slice().sort((a, b) => b.volume24h - a.volume24h)[0] ||
923
+ market.outcomes[0];
924
+ const price = bestOutcome ? formatPriceCents(bestOutcome.price) : 'n/a';
925
+ lines.push(`- ${market.question}`);
926
+ lines.push(` ${market.platform} - ${price} - vol ${Math.round(market.volume24h).toLocaleString()}`);
927
+ }
928
+ if (markets.length > top.length) {
929
+ lines.push('', `...and ${markets.length - top.length} more.`);
930
+ }
931
+ return lines.join('\n');
932
+ },
933
+ },
934
+ {
935
+ name: 'compare',
936
+ description: 'Compare market prices across platforms',
937
+ usage: '/compare <query> [platforms=polymarket,kalshi] [limit=3]',
938
+ handler: async (args, ctx) => {
939
+ const parsed = parseCompareArgs(args);
940
+ if (parsed.error || !parsed.query)
941
+ return parsed.error || 'Please provide a query.';
942
+ const markets = await ctx.feeds.searchMarkets(parsed.query);
943
+ const filtered = parsed.platforms?.length
944
+ ? markets.filter((m) => parsed.platforms?.includes(m.platform))
945
+ : markets;
946
+ if (filtered.length === 0) {
947
+ return `No markets found for "${parsed.query}".`;
948
+ }
949
+ const byPlatform = new Map();
950
+ for (const market of filtered) {
951
+ const list = byPlatform.get(market.platform) || [];
952
+ list.push(market);
953
+ byPlatform.set(market.platform, list);
954
+ }
955
+ const lines = [`Market Comparison: ${parsed.query}`];
956
+ const platforms = Array.from(byPlatform.keys()).sort();
957
+ for (const platform of platforms) {
958
+ const list = byPlatform.get(platform) || [];
959
+ const top = list
960
+ .slice()
961
+ .sort((a, b) => (b.volume24h || 0) - (a.volume24h || 0))
962
+ .slice(0, parsed.limit);
963
+ lines.push('', platform);
964
+ for (const market of top) {
965
+ const yesOutcome = market.outcomes.find((o) => o.name?.toLowerCase() === 'yes');
966
+ const bestOutcome = yesOutcome || market.outcomes[0];
967
+ const price = bestOutcome ? formatPriceCents(bestOutcome.price) : 'n/a';
968
+ const outcomeLabel = bestOutcome?.name ? ` (${bestOutcome.name})` : '';
969
+ lines.push(`- ${market.question} — ${price}${outcomeLabel} — vol ${Math.round(market.volume24h).toLocaleString()}`);
970
+ }
971
+ }
972
+ return lines.join('\n');
973
+ },
974
+ },
975
+ {
976
+ name: 'arbitrage',
977
+ description: 'Find simple arbitrage opportunities (YES + NO < $1)',
978
+ usage: '/arbitrage [query] [minEdge=1] [platforms=polymarket,kalshi] [mode=internal|cross|both] [limit=10]',
979
+ handler: async (args, ctx) => {
980
+ const parsed = parseArbitrageArgs(args);
981
+ if (parsed.error) {
982
+ return `Usage: /arbitrage [query] [minEdge=1] [platforms=polymarket,kalshi] [mode=internal|cross|both] [limit=10]\n${parsed.error}`;
983
+ }
984
+ const normalize = (text) => text
985
+ .toLowerCase()
986
+ .replace(/[^a-z0-9\s]/g, ' ')
987
+ .replace(/\s+/g, ' ')
988
+ .trim();
989
+ const opportunities = [];
990
+ const query = parsed.query || '';
991
+ if (parsed.mode === 'both' || parsed.mode === 'internal') {
992
+ const markets = await ctx.feeds.searchMarkets(query, 'polymarket');
993
+ for (const market of markets.slice(0, 60)) {
994
+ if (market.outcomes.length < 2)
995
+ continue;
996
+ const yesOutcome = market.outcomes.find((o) => o.name?.toLowerCase() === 'yes') || market.outcomes[0];
997
+ const noOutcome = market.outcomes.find((o) => o.name?.toLowerCase() === 'no') || market.outcomes[1];
998
+ if (!yesOutcome || !noOutcome)
999
+ continue;
1000
+ const yesPrice = yesOutcome.price;
1001
+ const noPrice = noOutcome.price;
1002
+ if (!Number.isFinite(yesPrice) || !Number.isFinite(noPrice))
1003
+ continue;
1004
+ const sum = yesPrice + noPrice;
1005
+ const edge = (1 - sum) * 100;
1006
+ if (edge < parsed.minEdge)
1007
+ continue;
1008
+ opportunities.push({
1009
+ edge,
1010
+ lines: [
1011
+ `- ${market.question} — ${edge.toFixed(2)}% (YES ${formatPriceCents(yesPrice)} / NO ${formatPriceCents(noPrice)})`,
1012
+ ` Buy YES at ${formatPriceCents(yesPrice)} + NO at ${formatPriceCents(noPrice)} = ${edge.toFixed(2)}% edge`,
1013
+ ],
1014
+ });
1015
+ }
1016
+ }
1017
+ if (parsed.mode === 'both' || parsed.mode === 'cross') {
1018
+ const platforms = parsed.platforms?.length ? parsed.platforms : ['polymarket', 'kalshi', 'manifold'];
1019
+ const results = await Promise.all(platforms.map(async (platform) => ({
1020
+ platform,
1021
+ markets: await ctx.feeds.searchMarkets(query, platform),
1022
+ })));
1023
+ const grouped = new Map();
1024
+ for (const { platform, markets } of results) {
1025
+ for (const market of markets.slice(0, 30)) {
1026
+ const yesOutcome = market.outcomes.find((o) => o.name?.toLowerCase() === 'yes') || market.outcomes[0];
1027
+ if (!yesOutcome || !Number.isFinite(yesOutcome.price))
1028
+ continue;
1029
+ const key = normalize(market.question).split(' ').slice(0, 8).join(' ');
1030
+ if (!key)
1031
+ continue;
1032
+ const list = grouped.get(key) || [];
1033
+ list.push({ platform, market, yesPrice: yesOutcome.price });
1034
+ grouped.set(key, list);
1035
+ }
1036
+ }
1037
+ for (const [, entries] of grouped.entries()) {
1038
+ const uniquePlatforms = new Set(entries.map((e) => e.platform));
1039
+ if (uniquePlatforms.size < 2)
1040
+ continue;
1041
+ const sorted = entries.slice().sort((a, b) => a.yesPrice - b.yesPrice);
1042
+ const low = sorted[0];
1043
+ const high = sorted[sorted.length - 1];
1044
+ const spread = (high.yesPrice - low.yesPrice) * 100;
1045
+ if (spread < parsed.minEdge)
1046
+ continue;
1047
+ opportunities.push({
1048
+ edge: spread,
1049
+ lines: [
1050
+ `- ${low.market.question} — ${spread.toFixed(2)}% spread`,
1051
+ ` Low: ${low.platform} ${formatPriceCents(low.yesPrice)} / High: ${high.platform} ${formatPriceCents(high.yesPrice)}`,
1052
+ ],
1053
+ });
1054
+ }
1055
+ }
1056
+ if (opportunities.length === 0) {
1057
+ return `No arbitrage opportunities found above ${parsed.minEdge}% edge.`;
1058
+ }
1059
+ opportunities.sort((a, b) => b.edge - a.edge);
1060
+ const lines = [`Arbitrage (${parsed.minEdge}%+ edge)`];
1061
+ for (const opp of opportunities.slice(0, parsed.limit)) {
1062
+ lines.push(...opp.lines);
1063
+ }
1064
+ return lines.join('\n');
1065
+ },
1066
+ },
1067
+ {
1068
+ name: 'portfolio',
1069
+ description: 'Show your tracked positions and P&L',
1070
+ usage: '/portfolio',
1071
+ handler: async (_args, ctx) => {
1072
+ const positions = await ctx.db.getPositions(ctx.session.userId);
1073
+ if (positions.length === 0) {
1074
+ return 'No tracked positions yet. Add one by telling me what you bought.';
1075
+ }
1076
+ const summary = summarizePositions(positions);
1077
+ const lines = ['Portfolio'];
1078
+ lines.push(`Value: $${summary.totalValue.toFixed(2)} - P&L: $${summary.totalPnl.toFixed(2)} (${(summary.totalPnlPct * 100).toFixed(1)}%)`);
1079
+ for (const [platform, agg] of summary.byPlatform) {
1080
+ const pnlPrefix = agg.pnl >= 0 ? '+' : '';
1081
+ lines.push(`- ${platform}: $${agg.value.toFixed(2)} (${pnlPrefix}$${agg.pnl.toFixed(2)})`);
1082
+ }
1083
+ const top = positions.slice(0, 6);
1084
+ lines.push('', 'Top positions:');
1085
+ for (const pos of top) {
1086
+ lines.push(`- [${pos.side}] ${pos.marketQuestion} - ${pos.outcome} - ${formatPriceCents(pos.currentPrice)} - ${pos.shares.toFixed(2)} sh`);
1087
+ }
1088
+ if (positions.length > top.length) {
1089
+ lines.push(`...and ${positions.length - top.length} more.`);
1090
+ }
1091
+ return lines.join('\n');
1092
+ },
1093
+ },
1094
+ {
1095
+ name: 'pnl',
1096
+ description: 'Show portfolio P&L history (snapshots)',
1097
+ usage: '/pnl [24h|7d|30m] [limit=50]',
1098
+ handler: async (args, ctx) => {
1099
+ const parsed = parsePnlHistoryArgs(args);
1100
+ if (parsed.error)
1101
+ return parsed.error;
1102
+ const snapshots = ctx.db.getPortfolioSnapshots(ctx.session.userId, {
1103
+ sinceMs: parsed.sinceMs,
1104
+ limit: parsed.limit,
1105
+ order: 'asc',
1106
+ });
1107
+ if (snapshots.length === 0) {
1108
+ return 'No P&L history yet. Snapshots are recorded when position prices update.';
1109
+ }
1110
+ const first = snapshots[0];
1111
+ const last = snapshots[snapshots.length - 1];
1112
+ const deltaPnl = last.totalPnl - first.totalPnl;
1113
+ const deltaValue = last.totalValue - first.totalValue;
1114
+ const formatStamp = (date) => date.toISOString().replace('T', ' ').slice(0, 16);
1115
+ const lines = [];
1116
+ lines.push(`P&L history (${snapshots.length} points)`);
1117
+ lines.push(`Start: $${first.totalValue.toFixed(2)} (${(first.totalPnlPct * 100).toFixed(1)}%) at ${formatStamp(first.createdAt)}`);
1118
+ lines.push(`Latest: $${last.totalValue.toFixed(2)} (${(last.totalPnlPct * 100).toFixed(1)}%) at ${formatStamp(last.createdAt)}`);
1119
+ lines.push(`Change: $${deltaValue.toFixed(2)} value, ${deltaPnl >= 0 ? '+' : ''}$${deltaPnl.toFixed(2)} P&L`);
1120
+ const display = snapshots.length > 10 ? snapshots.slice(-10) : snapshots;
1121
+ lines.push('', 'Latest snapshots:');
1122
+ for (const snap of display) {
1123
+ const pnlPrefix = snap.totalPnl >= 0 ? '+' : '';
1124
+ lines.push(`- ${formatStamp(snap.createdAt)} $${snap.totalValue.toFixed(2)} ${pnlPrefix}$${snap.totalPnl.toFixed(2)} (${(snap.totalPnlPct * 100).toFixed(1)}%)`);
1125
+ }
1126
+ return lines.join('\n');
1127
+ },
1128
+ },
1129
+ // ==========================================================================
1130
+ // Trading Bot Commands
1131
+ // ==========================================================================
1132
+ {
1133
+ name: 'bot',
1134
+ description: 'Manage trading bots (start/stop/status/list)',
1135
+ usage: '/bot [start|stop|pause|resume|status] <strategy-id>',
1136
+ aliases: ['bots', 'strategy'],
1137
+ handler: async (args, ctx) => {
1138
+ // Get trading system from context if available
1139
+ const trading = ctx.trading;
1140
+ if (!trading?.bots) {
1141
+ return 'Trading system not initialized. Configure trading in clodds.json.';
1142
+ }
1143
+ const parts = args.trim().split(/\s+/).filter(Boolean);
1144
+ const subcommand = parts[0]?.toLowerCase() || 'list';
1145
+ const strategyId = parts[1];
1146
+ switch (subcommand) {
1147
+ case 'list': {
1148
+ const statuses = trading.bots.getAllBotStatuses();
1149
+ if (statuses.length === 0) {
1150
+ return [
1151
+ 'Trading Bots',
1152
+ 'No strategies registered.',
1153
+ '',
1154
+ 'Register strategies programmatically:',
1155
+ ' trading.bots.registerStrategy(createMeanReversionStrategy())',
1156
+ ].join('\n');
1157
+ }
1158
+ const lines = ['Trading Bots', ''];
1159
+ for (const status of statuses) {
1160
+ const statusEmoji = status.status === 'running' ? '🟢' :
1161
+ status.status === 'paused' ? '🟡' :
1162
+ status.status === 'error' ? '🔴' : '⚪';
1163
+ lines.push(`${statusEmoji} ${status.name} (${status.id})`);
1164
+ lines.push(` Status: ${status.status}`);
1165
+ lines.push(` Trades: ${status.tradesCount} | Win rate: ${status.winRate.toFixed(1)}%`);
1166
+ lines.push(` PnL: $${status.totalPnL.toFixed(2)}`);
1167
+ }
1168
+ return lines.join('\n');
1169
+ }
1170
+ case 'start': {
1171
+ if (!strategyId) {
1172
+ return 'Usage: /bot start <strategy-id>';
1173
+ }
1174
+ const started = await trading.bots.startBot(strategyId);
1175
+ return started
1176
+ ? `Bot ${strategyId} started successfully.`
1177
+ : `Failed to start bot ${strategyId}. Check if strategy is registered.`;
1178
+ }
1179
+ case 'stop': {
1180
+ if (!strategyId) {
1181
+ return 'Usage: /bot stop <strategy-id>';
1182
+ }
1183
+ await trading.bots.stopBot(strategyId);
1184
+ return `Bot ${strategyId} stopped.`;
1185
+ }
1186
+ case 'pause': {
1187
+ if (!strategyId) {
1188
+ return 'Usage: /bot pause <strategy-id>';
1189
+ }
1190
+ trading.bots.pauseBot(strategyId);
1191
+ return `Bot ${strategyId} paused.`;
1192
+ }
1193
+ case 'resume': {
1194
+ if (!strategyId) {
1195
+ return 'Usage: /bot resume <strategy-id>';
1196
+ }
1197
+ trading.bots.resumeBot(strategyId);
1198
+ return `Bot ${strategyId} resumed.`;
1199
+ }
1200
+ case 'status': {
1201
+ if (!strategyId) {
1202
+ return 'Usage: /bot status <strategy-id>';
1203
+ }
1204
+ const status = trading.bots.getBotStatus(strategyId);
1205
+ if (!status) {
1206
+ return `Strategy ${strategyId} not found.`;
1207
+ }
1208
+ const lines = [
1209
+ `Bot: ${status.name} (${status.id})`,
1210
+ '',
1211
+ `Status: ${status.status}`,
1212
+ `Started: ${status.startedAt?.toISOString() || 'never'}`,
1213
+ `Last check: ${status.lastCheck?.toISOString() || 'never'}`,
1214
+ '',
1215
+ 'Performance:',
1216
+ ` Trades: ${status.tradesCount}`,
1217
+ ` Win rate: ${status.winRate.toFixed(1)}%`,
1218
+ ` Total PnL: $${status.totalPnL.toFixed(2)}`,
1219
+ ];
1220
+ if (status.lastSignal) {
1221
+ lines.push('', `Last signal: ${status.lastSignal.type} ${status.lastSignal.outcome}`);
1222
+ if (status.lastSignal.reason) {
1223
+ lines.push(` Reason: ${status.lastSignal.reason}`);
1224
+ }
1225
+ }
1226
+ if (status.lastError) {
1227
+ lines.push('', `Last error: ${status.lastError}`);
1228
+ }
1229
+ return lines.join('\n');
1230
+ }
1231
+ default:
1232
+ return [
1233
+ 'Usage: /bot [command] [strategy-id]',
1234
+ '',
1235
+ 'Commands:',
1236
+ ' list - Show all registered bots',
1237
+ ' start - Start a bot',
1238
+ ' stop - Stop a bot',
1239
+ ' pause - Pause a running bot',
1240
+ ' resume - Resume a paused bot',
1241
+ ' status - Show detailed bot status',
1242
+ ].join('\n');
1243
+ }
1244
+ },
1245
+ },
1246
+ {
1247
+ name: 'track',
1248
+ description: 'Manage custom tracking columns and data',
1249
+ usage: '/track [columns|add|remove|get|summary] [args]',
1250
+ aliases: ['tracking'],
1251
+ handler: async (args, ctx) => {
1252
+ const trading = ctx.trading;
1253
+ if (!trading?.tracking) {
1254
+ return 'Tracking manager not initialized.';
1255
+ }
1256
+ const parts = args.trim().split(/\s+/);
1257
+ const subcommand = parts[0]?.toLowerCase() || 'columns';
1258
+ const rest = parts.slice(1);
1259
+ switch (subcommand) {
1260
+ case 'columns': {
1261
+ const category = rest[0];
1262
+ const columns = trading.tracking.getColumns(category);
1263
+ if (columns.length === 0) {
1264
+ return category
1265
+ ? `No columns in category "${category}".`
1266
+ : 'No tracking columns defined.';
1267
+ }
1268
+ const grouped = new Map();
1269
+ for (const col of columns) {
1270
+ const cat = col.category || 'other';
1271
+ const list = grouped.get(cat) || [];
1272
+ list.push(col);
1273
+ grouped.set(cat, list);
1274
+ }
1275
+ const lines = ['Tracking Columns', ''];
1276
+ for (const [cat, cols] of grouped) {
1277
+ lines.push(`**${cat}**`);
1278
+ for (const col of cols) {
1279
+ const summary = col.showInSummary ? ' [summary]' : '';
1280
+ lines.push(` ${col.name} (${col.type})${summary}`);
1281
+ if (col.description) {
1282
+ lines.push(` ${col.description}`);
1283
+ }
1284
+ }
1285
+ lines.push('');
1286
+ }
1287
+ return lines.join('\n');
1288
+ }
1289
+ case 'add': {
1290
+ // /track add column_name type [category] [description]
1291
+ const name = rest[0];
1292
+ const type = (rest[1]?.toLowerCase() || 'string');
1293
+ const category = rest[2] || 'custom';
1294
+ const description = rest.slice(3).join(' ') || undefined;
1295
+ if (!name) {
1296
+ return [
1297
+ 'Usage: /track add <name> [type] [category] [description]',
1298
+ '',
1299
+ 'Types: number, string, boolean, json',
1300
+ '',
1301
+ 'Examples:',
1302
+ ' /track add my_score number trade My custom score',
1303
+ ' /track add trade_notes string trade Notes for each trade',
1304
+ ].join('\n');
1305
+ }
1306
+ if (!['number', 'string', 'boolean', 'json'].includes(type)) {
1307
+ return `Invalid type: ${type}. Use: number, string, boolean, json`;
1308
+ }
1309
+ trading.tracking.defineColumn({
1310
+ name,
1311
+ label: name.replace(/_/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase()),
1312
+ type,
1313
+ category,
1314
+ description,
1315
+ showInSummary: type === 'number',
1316
+ aggregation: type === 'number' ? 'avg' : undefined,
1317
+ });
1318
+ return `Column "${name}" added (${type}, ${category}).`;
1319
+ }
1320
+ case 'remove': {
1321
+ const name = rest[0];
1322
+ if (!name) {
1323
+ return 'Usage: /track remove <column_name>';
1324
+ }
1325
+ trading.tracking.removeColumn(name);
1326
+ return `Column "${name}" removed.`;
1327
+ }
1328
+ case 'set': {
1329
+ // /track set entity_type entity_id column value
1330
+ const [entityType, entityId, column, ...valueParts] = rest;
1331
+ if (!entityType || !entityId || !column || valueParts.length === 0) {
1332
+ return [
1333
+ 'Usage: /track set <entity_type> <entity_id> <column> <value>',
1334
+ '',
1335
+ 'Examples:',
1336
+ ' /track set trade trade_abc123 my_score 85',
1337
+ ' /track set bot mean-reversion notes "Tweaked params"',
1338
+ ].join('\n');
1339
+ }
1340
+ const value = valueParts.join(' ');
1341
+ const numValue = parseFloat(value);
1342
+ const finalValue = isNaN(numValue) ? value : numValue;
1343
+ trading.tracking.track({
1344
+ entityType,
1345
+ entityId,
1346
+ column,
1347
+ value: finalValue,
1348
+ });
1349
+ return `Tracked: ${entityType}/${entityId}.${column} = ${finalValue}`;
1350
+ }
1351
+ case 'get': {
1352
+ // /track get entity_type entity_id [column]
1353
+ const [entityType, entityId, column] = rest;
1354
+ if (!entityType || !entityId) {
1355
+ return 'Usage: /track get <entity_type> <entity_id> [column]';
1356
+ }
1357
+ if (column) {
1358
+ const value = trading.tracking.getLatest(entityType, entityId, column);
1359
+ return value !== undefined
1360
+ ? `${column}: ${JSON.stringify(value)}`
1361
+ : `No value for ${column}`;
1362
+ }
1363
+ const entries = trading.tracking.get({ entityType, entityId, limit: 20 });
1364
+ if (entries.length === 0) {
1365
+ return `No tracking data for ${entityType}/${entityId}`;
1366
+ }
1367
+ const lines = [`Tracking: ${entityType}/${entityId}`, ''];
1368
+ const byColumn = new Map();
1369
+ for (const entry of entries) {
1370
+ if (!byColumn.has(entry.column)) {
1371
+ byColumn.set(entry.column, entry.value);
1372
+ }
1373
+ }
1374
+ for (const [col, val] of byColumn) {
1375
+ lines.push(` ${col}: ${JSON.stringify(val)}`);
1376
+ }
1377
+ return lines.join('\n');
1378
+ }
1379
+ case 'summary': {
1380
+ const column = rest[0];
1381
+ if (!column) {
1382
+ return 'Usage: /track summary <column>';
1383
+ }
1384
+ const summary = trading.tracking.getSummary(column);
1385
+ const lines = [`Summary: ${column}`, ''];
1386
+ lines.push(` Count: ${summary.count}`);
1387
+ if (summary.sum !== null)
1388
+ lines.push(` Sum: ${summary.sum?.toFixed(2)}`);
1389
+ if (summary.avg !== null)
1390
+ lines.push(` Avg: ${summary.avg?.toFixed(2)}`);
1391
+ if (summary.min !== null)
1392
+ lines.push(` Min: ${summary.min?.toFixed(2)}`);
1393
+ if (summary.max !== null)
1394
+ lines.push(` Max: ${summary.max?.toFixed(2)}`);
1395
+ if (summary.latest !== undefined)
1396
+ lines.push(` Latest: ${JSON.stringify(summary.latest)}`);
1397
+ return lines.join('\n');
1398
+ }
1399
+ case 'export': {
1400
+ const csv = trading.tracking.exportCsv({ limit: 100 });
1401
+ return `Exported ${csv.split('\n').length - 1} rows:\n\n${csv.slice(0, 1000)}${csv.length > 1000 ? '\n...' : ''}`;
1402
+ }
1403
+ default:
1404
+ return [
1405
+ 'Usage: /track [command]',
1406
+ '',
1407
+ 'Commands:',
1408
+ ' columns [category] - List tracking columns',
1409
+ ' add <name> [type] [cat] - Add custom column',
1410
+ ' remove <name> - Remove column',
1411
+ ' set <type> <id> <col> <v> - Track a value',
1412
+ ' get <type> <id> [col] - Get tracked values',
1413
+ ' summary <column> - Get column stats',
1414
+ ' export - Export to CSV',
1415
+ ].join('\n');
1416
+ }
1417
+ },
1418
+ },
1419
+ {
1420
+ name: 'safety',
1421
+ description: 'Trading safety controls and circuit breakers',
1422
+ usage: '/safety [status|limits|kill|resume|alerts]',
1423
+ handler: async (args, ctx) => {
1424
+ const trading = ctx.trading;
1425
+ if (!trading?.safety) {
1426
+ return 'Safety manager not initialized.';
1427
+ }
1428
+ const parts = args.trim().split(/\s+/);
1429
+ const subcommand = parts[0]?.toLowerCase() || 'status';
1430
+ const rest = parts.slice(1);
1431
+ switch (subcommand) {
1432
+ case 'status': {
1433
+ const state = trading.safety.getState();
1434
+ const canTrade = trading.safety.canTrade();
1435
+ const lines = [
1436
+ 'Trading Safety Status',
1437
+ '',
1438
+ `Trading: ${canTrade ? '🟢 ENABLED' : '🔴 DISABLED'}`,
1439
+ ];
1440
+ if (!canTrade && state.disabledReason) {
1441
+ lines.push(`Reason: ${state.disabledReason}`);
1442
+ if (state.resumeAt) {
1443
+ lines.push(`Resume at: ${state.resumeAt.toLocaleString()}`);
1444
+ }
1445
+ }
1446
+ lines.push('');
1447
+ lines.push('Today:');
1448
+ lines.push(` PnL: $${state.dailyPnL.toFixed(2)}`);
1449
+ lines.push(` Trades: ${state.dailyTrades}`);
1450
+ lines.push('');
1451
+ lines.push('Drawdown:');
1452
+ lines.push(` Current: ${state.currentDrawdownPct.toFixed(1)}%`);
1453
+ lines.push(` Peak: $${state.peakValue.toFixed(2)}`);
1454
+ lines.push(` Current: $${state.currentValue.toFixed(2)}`);
1455
+ if (state.alerts.length > 0) {
1456
+ lines.push('');
1457
+ lines.push(`⚠️ ${state.alerts.length} active alerts`);
1458
+ }
1459
+ return lines.join('\n');
1460
+ }
1461
+ case 'kill': {
1462
+ const reason = rest.join(' ') || 'Manual kill switch';
1463
+ trading.safety.killSwitch(reason);
1464
+ return '🚨 KILL SWITCH ACTIVATED - All trading stopped.\n\nUse /safety resume to re-enable.';
1465
+ }
1466
+ case 'resume': {
1467
+ const resumed = trading.safety.resumeTrading();
1468
+ return resumed
1469
+ ? '✅ Trading resumed. Be careful!'
1470
+ : 'Trading was already enabled.';
1471
+ }
1472
+ case 'alerts': {
1473
+ const alerts = trading.safety.getAlerts();
1474
+ if (alerts.length === 0) {
1475
+ return 'No active safety alerts.';
1476
+ }
1477
+ const lines = ['Safety Alerts', ''];
1478
+ for (const alert of alerts.slice(0, 10)) {
1479
+ const emoji = alert.type === 'breaker_tripped' ? '🚨' : alert.type === 'critical' ? '❌' : '⚠️';
1480
+ lines.push(`${emoji} [${alert.category}] ${alert.message}`);
1481
+ lines.push(` ${alert.timestamp.toLocaleString()}`);
1482
+ }
1483
+ return lines.join('\n');
1484
+ }
1485
+ case 'clear': {
1486
+ trading.safety.clearAlerts();
1487
+ return 'Alerts cleared.';
1488
+ }
1489
+ default:
1490
+ return [
1491
+ 'Usage: /safety [command]',
1492
+ '',
1493
+ 'Commands:',
1494
+ ' status - Show safety status',
1495
+ ' kill - Emergency stop all trading',
1496
+ ' resume - Resume trading after kill',
1497
+ ' alerts - Show safety alerts',
1498
+ ' clear - Clear alerts',
1499
+ ].join('\n');
1500
+ }
1501
+ },
1502
+ },
1503
+ {
1504
+ name: 'backtest',
1505
+ description: 'Backtest a strategy on historical data',
1506
+ usage: '/backtest <strategy-id> [days=30] [capital=10000]',
1507
+ aliases: ['bt'],
1508
+ handler: async (args, ctx) => {
1509
+ const trading = ctx.trading;
1510
+ if (!trading?.backtest || !trading?.bots) {
1511
+ return 'Backtest engine not initialized.';
1512
+ }
1513
+ const parts = args.trim().split(/\s+/);
1514
+ const strategyId = parts[0];
1515
+ if (!strategyId) {
1516
+ return [
1517
+ 'Usage: /backtest <strategy-id> [days=30] [capital=10000]',
1518
+ '',
1519
+ 'Example:',
1520
+ ' /backtest mean-reversion days=60 capital=5000',
1521
+ ].join('\n');
1522
+ }
1523
+ // Parse options
1524
+ let days = 30;
1525
+ let capital = 10000;
1526
+ for (const part of parts.slice(1)) {
1527
+ if (part.startsWith('days=')) {
1528
+ days = parseInt(part.slice(5), 10) || 30;
1529
+ }
1530
+ if (part.startsWith('capital=')) {
1531
+ capital = parseInt(part.slice(8), 10) || 10000;
1532
+ }
1533
+ }
1534
+ // Find strategy
1535
+ const strategies = trading.bots.getStrategies();
1536
+ const stratConfig = strategies.find((s) => s.id === strategyId);
1537
+ if (!stratConfig) {
1538
+ return `Strategy ${strategyId} not found. Use /bot list to see available strategies.`;
1539
+ }
1540
+ // This is simplified - would need actual strategy instance
1541
+ return [
1542
+ `Backtest: ${stratConfig.name}`,
1543
+ '',
1544
+ `Period: ${days} days`,
1545
+ `Initial capital: $${capital.toLocaleString()}`,
1546
+ '',
1547
+ '⏳ Running backtest...',
1548
+ '',
1549
+ 'Note: Full backtest requires historical price data.',
1550
+ 'Use trading.backtest.run() programmatically for full results.',
1551
+ ].join('\n');
1552
+ },
1553
+ },
1554
+ {
1555
+ name: 'account',
1556
+ description: 'Manage trading accounts for multi-account/A/B testing',
1557
+ usage: '/account [add|list|remove|switch] [args]',
1558
+ aliases: ['accounts', 'acc'],
1559
+ handler: async (args, ctx) => {
1560
+ const trading = ctx.trading;
1561
+ if (!trading?.accounts) {
1562
+ return 'Account manager not initialized.';
1563
+ }
1564
+ const parts = args.trim().split(/\s+/);
1565
+ const subcommand = parts[0]?.toLowerCase() || 'list';
1566
+ const rest = parts.slice(1);
1567
+ switch (subcommand) {
1568
+ case 'list': {
1569
+ const accounts = trading.accounts.listAccounts();
1570
+ if (accounts.length === 0) {
1571
+ return [
1572
+ 'No trading accounts configured.',
1573
+ '',
1574
+ 'Add one with:',
1575
+ ' /account add <name> <platform> [type]',
1576
+ '',
1577
+ 'Example:',
1578
+ ' /account add "Main Poly" polymarket live',
1579
+ ' /account add "Test Account" polymarket test_a',
1580
+ ].join('\n');
1581
+ }
1582
+ const lines = ['Trading Accounts', ''];
1583
+ for (const acc of accounts) {
1584
+ const status = acc.enabled ? '🟢' : '🔴';
1585
+ const typeLabel = acc.type === 'live' ? '' : ` [${acc.type}]`;
1586
+ lines.push(`${status} **${acc.name}** (${acc.id})${typeLabel}`);
1587
+ lines.push(` Platform: ${acc.platform} | Max: $${acc.risk.maxOrderSize}`);
1588
+ }
1589
+ return lines.join('\n');
1590
+ }
1591
+ case 'add': {
1592
+ const name = rest[0];
1593
+ const platform = rest[1]?.toLowerCase();
1594
+ const type = (rest[2]?.toLowerCase() || 'live');
1595
+ if (!name || !platform) {
1596
+ return 'Usage: /account add <name> <platform> [type]\n\nTypes: live, paper, test_a, test_b';
1597
+ }
1598
+ const account = trading.accounts.addAccount({
1599
+ name,
1600
+ platform,
1601
+ type,
1602
+ credentials: {}, // User will need to configure separately
1603
+ risk: { maxOrderSize: 100, maxExposure: 1000 },
1604
+ enabled: true,
1605
+ });
1606
+ return [
1607
+ `Account Created: ${account.name}`,
1608
+ '',
1609
+ `ID: ${account.id}`,
1610
+ `Platform: ${platform}`,
1611
+ `Type: ${type}`,
1612
+ '',
1613
+ 'Configure credentials in clodds.json or via:',
1614
+ ` /account config ${account.id} apiKey=xxx apiSecret=xxx`,
1615
+ ].join('\n');
1616
+ }
1617
+ case 'remove': {
1618
+ const accountId = rest[0];
1619
+ if (!accountId) {
1620
+ return 'Usage: /account remove <account-id>';
1621
+ }
1622
+ const removed = trading.accounts.removeAccount(accountId);
1623
+ return removed ? `Account ${accountId} removed.` : `Account ${accountId} not found.`;
1624
+ }
1625
+ case 'config': {
1626
+ const accountId = rest[0];
1627
+ if (!accountId) {
1628
+ return 'Usage: /account config <account-id> key=value ...';
1629
+ }
1630
+ const account = trading.accounts.getAccount(accountId);
1631
+ if (!account) {
1632
+ return `Account ${accountId} not found.`;
1633
+ }
1634
+ // Parse key=value pairs
1635
+ const updates = {};
1636
+ for (const pair of rest.slice(1)) {
1637
+ const [key, ...valueParts] = pair.split('=');
1638
+ if (key && valueParts.length > 0) {
1639
+ updates[key] = valueParts.join('=');
1640
+ }
1641
+ }
1642
+ if (Object.keys(updates).length === 0) {
1643
+ // Show current config (hide sensitive values)
1644
+ const creds = account.credentials;
1645
+ const lines = [`Account: ${account.name}`, ''];
1646
+ for (const key of Object.keys(creds)) {
1647
+ const value = creds[key];
1648
+ if (value) {
1649
+ lines.push(` ${key}: ${value.slice(0, 4)}...${value.slice(-4)}`);
1650
+ }
1651
+ }
1652
+ return lines.join('\n');
1653
+ }
1654
+ // Update credentials
1655
+ account.credentials = { ...account.credentials, ...updates };
1656
+ trading.accounts.updateAccount(accountId, { credentials: account.credentials });
1657
+ return `Account ${accountId} updated with ${Object.keys(updates).length} credential(s).`;
1658
+ }
1659
+ case 'enable': {
1660
+ const accountId = rest[0];
1661
+ if (!accountId)
1662
+ return 'Usage: /account enable <account-id>';
1663
+ const ok = trading.accounts.updateAccount(accountId, { enabled: true });
1664
+ return ok ? `Account ${accountId} enabled.` : `Account not found.`;
1665
+ }
1666
+ case 'disable': {
1667
+ const accountId = rest[0];
1668
+ if (!accountId)
1669
+ return 'Usage: /account disable <account-id>';
1670
+ const ok = trading.accounts.updateAccount(accountId, { enabled: false });
1671
+ return ok ? `Account ${accountId} disabled.` : `Account not found.`;
1672
+ }
1673
+ default:
1674
+ return [
1675
+ 'Usage: /account [command]',
1676
+ '',
1677
+ 'Commands:',
1678
+ ' list - List all accounts',
1679
+ ' add <n> <p> [t] - Add account (name, platform, type)',
1680
+ ' remove <id> - Remove account',
1681
+ ' config <id> k=v - Configure credentials',
1682
+ ' enable <id> - Enable account',
1683
+ ' disable <id> - Disable account',
1684
+ '',
1685
+ 'Types: live, paper, test_a, test_b',
1686
+ ].join('\n');
1687
+ }
1688
+ },
1689
+ },
1690
+ {
1691
+ name: 'abtest',
1692
+ description: 'Run A/B tests across multiple accounts',
1693
+ usage: '/abtest [create|start|stop|status|results] [args]',
1694
+ aliases: ['ab'],
1695
+ handler: async (args, ctx) => {
1696
+ const trading = ctx.trading;
1697
+ if (!trading?.accounts) {
1698
+ return 'Account manager not initialized.';
1699
+ }
1700
+ const parts = args.trim().split(/\s+/);
1701
+ const subcommand = parts[0]?.toLowerCase() || 'list';
1702
+ const rest = parts.slice(1);
1703
+ switch (subcommand) {
1704
+ case 'list': {
1705
+ const tests = trading.accounts.listABTests();
1706
+ if (tests.length === 0) {
1707
+ return [
1708
+ 'No A/B tests configured.',
1709
+ '',
1710
+ 'Create one with:',
1711
+ ' /abtest create <name> <strategy> <accountA> <accountB>',
1712
+ ].join('\n');
1713
+ }
1714
+ const lines = ['A/B Tests', ''];
1715
+ for (const test of tests) {
1716
+ const status = test.status === 'running' ? '🟢' : test.status === 'completed' ? '✅' : '⏸️';
1717
+ lines.push(`${status} **${test.name}** (${test.id})`);
1718
+ lines.push(` Strategy: ${test.strategyId} | Accounts: ${test.accounts.length}`);
1719
+ if (test.results?.significance) {
1720
+ lines.push(` Winner: ${test.results.significance.winner} (p=${test.results.significance.pValue.toFixed(3)})`);
1721
+ }
1722
+ }
1723
+ return lines.join('\n');
1724
+ }
1725
+ case 'create': {
1726
+ // /abtest create "Test Name" strategy_id acc_a acc_b param=valueA,valueB
1727
+ const name = rest[0];
1728
+ const strategyId = rest[1];
1729
+ const accountA = rest[2];
1730
+ const accountB = rest[3];
1731
+ const paramSpec = rest[4]; // e.g., "stopLoss=5,10"
1732
+ if (!name || !strategyId || !accountA || !accountB) {
1733
+ return [
1734
+ 'Usage: /abtest create <name> <strategy> <accountA> <accountB> [param=valA,valB]',
1735
+ '',
1736
+ 'Example:',
1737
+ ' /abtest create "Stop Loss Test" mean-reversion acc_123 acc_456 stopLossPct=5,10',
1738
+ ].join('\n');
1739
+ }
1740
+ let varyParam = 'stopLossPct';
1741
+ let valueA = 5;
1742
+ let valueB = 10;
1743
+ if (paramSpec && paramSpec.includes('=')) {
1744
+ const [param, values] = paramSpec.split('=');
1745
+ const [valA, valB] = values.split(',');
1746
+ varyParam = param;
1747
+ valueA = isNaN(Number(valA)) ? valA : Number(valA);
1748
+ valueB = isNaN(Number(valB)) ? valB : Number(valB);
1749
+ }
1750
+ // Import helper
1751
+ const { createQuickABTest } = await Promise.resolve().then(() => __importStar(require('../trading/accounts')));
1752
+ const test = createQuickABTest(trading.accounts, {
1753
+ name,
1754
+ strategyId,
1755
+ accountA,
1756
+ accountB,
1757
+ varyParam,
1758
+ valueA,
1759
+ valueB,
1760
+ });
1761
+ return [
1762
+ `A/B Test Created: ${test.name}`,
1763
+ '',
1764
+ `ID: ${test.id}`,
1765
+ `Strategy: ${strategyId}`,
1766
+ '',
1767
+ 'Variations:',
1768
+ ` Control (A): ${varyParam}=${JSON.stringify(valueA)} → ${accountA}`,
1769
+ ` Test (B): ${varyParam}=${JSON.stringify(valueB)} → ${accountB}`,
1770
+ '',
1771
+ `Start with: /abtest start ${test.id}`,
1772
+ ].join('\n');
1773
+ }
1774
+ case 'start': {
1775
+ const testId = rest[0];
1776
+ if (!testId)
1777
+ return 'Usage: /abtest start <test-id>';
1778
+ const started = await trading.accounts.startABTest(testId);
1779
+ return started
1780
+ ? `A/B test ${testId} started. Bots running on all accounts.`
1781
+ : `Failed to start test. Check if test exists and accounts are configured.`;
1782
+ }
1783
+ case 'stop': {
1784
+ const testId = rest[0];
1785
+ if (!testId)
1786
+ return 'Usage: /abtest stop <test-id>';
1787
+ await trading.accounts.stopABTest(testId);
1788
+ const test = trading.accounts.getABTest(testId);
1789
+ if (test?.results) {
1790
+ return [
1791
+ `A/B test ${testId} stopped.`,
1792
+ '',
1793
+ '**Results:**',
1794
+ test.results.summary,
1795
+ '',
1796
+ test.results.significance?.confident
1797
+ ? `✅ Statistically significant: ${test.results.significance.winner} wins`
1798
+ : '⚠️ Not enough data for statistical significance',
1799
+ ].join('\n');
1800
+ }
1801
+ return `A/B test ${testId} stopped.`;
1802
+ }
1803
+ case 'status':
1804
+ case 'results': {
1805
+ const testId = rest[0];
1806
+ if (!testId)
1807
+ return 'Usage: /abtest status <test-id>';
1808
+ const test = trading.accounts.getABTest(testId);
1809
+ if (!test)
1810
+ return `Test ${testId} not found.`;
1811
+ const results = trading.accounts.calculateResults(testId);
1812
+ const lines = [
1813
+ `A/B Test: ${test.name}`,
1814
+ '',
1815
+ `Status: ${test.status}`,
1816
+ `Strategy: ${test.strategyId}`,
1817
+ `Started: ${test.startedAt?.toLocaleString() || 'not started'}`,
1818
+ '',
1819
+ 'Variations:',
1820
+ ];
1821
+ for (const [name, variation] of Object.entries(test.variations)) {
1822
+ const acc = test.accounts.find((a) => a.variation === name);
1823
+ const stats = results?.byVariation[name];
1824
+ lines.push(` **${variation.name}** (${acc?.accountId})`);
1825
+ if (stats) {
1826
+ lines.push(` Trades: ${stats.trades} | Win rate: ${stats.winRate.toFixed(1)}%`);
1827
+ lines.push(` PnL: $${stats.totalPnL.toFixed(2)} | Avg: $${stats.avgPnL.toFixed(2)}`);
1828
+ }
1829
+ }
1830
+ if (results?.significance) {
1831
+ lines.push('');
1832
+ lines.push(`**Winner:** ${results.significance.winner}`);
1833
+ lines.push(`Confidence: ${results.significance.confident ? 'High' : 'Low'} (p=${results.significance.pValue.toFixed(3)})`);
1834
+ }
1835
+ return lines.join('\n');
1836
+ }
1837
+ case 'compare': {
1838
+ const accountIds = rest;
1839
+ if (accountIds.length < 2) {
1840
+ return 'Usage: /abtest compare <account1> <account2> [account3...]';
1841
+ }
1842
+ const comparison = trading.accounts.compareAccounts(accountIds);
1843
+ const lines = ['Account Comparison', ''];
1844
+ for (const acc of comparison.accounts) {
1845
+ lines.push(`**${acc.name}** (${acc.id})`);
1846
+ lines.push(` Trades: ${acc.stats.totalTrades} | Win rate: ${acc.stats.winRate.toFixed(1)}%`);
1847
+ lines.push(` PnL: $${acc.stats.totalPnL.toFixed(2)}`);
1848
+ }
1849
+ if (comparison.best.byPnL) {
1850
+ lines.push('');
1851
+ lines.push(`Best by PnL: ${comparison.best.byPnL}`);
1852
+ lines.push(`Best by Win Rate: ${comparison.best.byWinRate}`);
1853
+ }
1854
+ return lines.join('\n');
1855
+ }
1856
+ default:
1857
+ return [
1858
+ 'Usage: /abtest [command]',
1859
+ '',
1860
+ 'Commands:',
1861
+ ' list - List all A/B tests',
1862
+ ' create <n> <s> <a> <b> [p=v1,v2] - Create test',
1863
+ ' start <id> - Start test',
1864
+ ' stop <id> - Stop test & show results',
1865
+ ' status <id> - Show test status',
1866
+ ' compare <acc1> <acc2> - Compare accounts',
1867
+ ].join('\n');
1868
+ }
1869
+ },
1870
+ },
1871
+ {
1872
+ name: 'strategy',
1873
+ description: 'Create or manage trading strategies',
1874
+ usage: '/strategy [create|list|delete|templates] [args]',
1875
+ aliases: ['strat'],
1876
+ handler: async (args, ctx) => {
1877
+ const trading = ctx.trading;
1878
+ if (!trading?.builder) {
1879
+ return 'Strategy builder not initialized.';
1880
+ }
1881
+ const parts = args.trim().split(/\s+/);
1882
+ const subcommand = parts[0]?.toLowerCase() || 'list';
1883
+ const rest = parts.slice(1).join(' ');
1884
+ switch (subcommand) {
1885
+ case 'templates': {
1886
+ const templates = trading.builder.listTemplates();
1887
+ const lines = ['Available Strategy Templates', ''];
1888
+ for (const tmpl of templates) {
1889
+ lines.push(`**${tmpl.name}**`);
1890
+ lines.push(` ${tmpl.description}`);
1891
+ }
1892
+ lines.push('', 'Use: /strategy create <description>');
1893
+ return lines.join('\n');
1894
+ }
1895
+ case 'create': {
1896
+ if (!rest) {
1897
+ return [
1898
+ 'Usage: /strategy create <natural language description>',
1899
+ '',
1900
+ 'Examples:',
1901
+ ' /strategy create buy the dip on polymarket when price drops 5%',
1902
+ ' /strategy create momentum strategy with 10% take profit',
1903
+ ' /strategy create arbitrage between polymarket and kalshi',
1904
+ ].join('\n');
1905
+ }
1906
+ const result = trading.builder.parseNaturalLanguage(rest);
1907
+ if ('error' in result) {
1908
+ return `Error: ${result.error}`;
1909
+ }
1910
+ const validation = trading.builder.validate(result);
1911
+ if (!validation.valid) {
1912
+ return `Validation errors:\n${validation.errors.map((e) => `- ${e}`).join('\n')}`;
1913
+ }
1914
+ // Save the definition
1915
+ const defId = trading.builder.saveDefinition(ctx.session.userId, result);
1916
+ // Create and register the strategy
1917
+ const strategy = trading.builder.createStrategy(result);
1918
+ trading.bots.registerStrategy(strategy);
1919
+ return [
1920
+ `Strategy Created: ${result.name}`,
1921
+ '',
1922
+ `ID: ${strategy.config.id}`,
1923
+ `Template: ${result.template}`,
1924
+ `Platforms: ${result.platforms.join(', ')}`,
1925
+ '',
1926
+ 'Entry conditions:',
1927
+ ...result.entry.map((e) => ` - ${e.type}: ${e.value}`),
1928
+ '',
1929
+ 'Exit conditions:',
1930
+ ...result.exit.map((e) => ` - ${e.type}: ${e.value}`),
1931
+ '',
1932
+ 'Risk:',
1933
+ ` - Max position: $${result.risk.maxPositionSize}`,
1934
+ ` - Stop loss: ${result.risk.stopLossPct}%`,
1935
+ ` - Take profit: ${result.risk.takeProfitPct}%`,
1936
+ '',
1937
+ 'Mode: DRY RUN (use /bot start to begin)',
1938
+ '',
1939
+ `Use /bot start ${strategy.config.id} to start trading.`,
1940
+ ].join('\n');
1941
+ }
1942
+ case 'list': {
1943
+ const definitions = trading.builder.loadDefinitions(ctx.session.userId);
1944
+ if (definitions.length === 0) {
1945
+ return 'No strategies saved. Use /strategy create to create one.';
1946
+ }
1947
+ const lines = ['Your Strategies', ''];
1948
+ for (const def of definitions) {
1949
+ lines.push(`**${def.definition.name}** (${def.id})`);
1950
+ lines.push(` Template: ${def.definition.template} | Platforms: ${def.definition.platforms.join(', ')}`);
1951
+ lines.push(` Created: ${def.createdAt.toLocaleDateString()}`);
1952
+ }
1953
+ return lines.join('\n');
1954
+ }
1955
+ case 'delete': {
1956
+ if (!rest) {
1957
+ return 'Usage: /strategy delete <strategy-id>';
1958
+ }
1959
+ const deleted = trading.builder.deleteDefinition(ctx.session.userId, rest);
1960
+ return deleted ? `Strategy ${rest} deleted.` : `Strategy ${rest} not found.`;
1961
+ }
1962
+ default:
1963
+ return [
1964
+ 'Usage: /strategy [command]',
1965
+ '',
1966
+ 'Commands:',
1967
+ ' create <description> - Create strategy from natural language',
1968
+ ' list - List your strategies',
1969
+ ' delete <id> - Delete a strategy',
1970
+ ' templates - Show available templates',
1971
+ ].join('\n');
1972
+ }
1973
+ },
1974
+ },
1975
+ {
1976
+ name: 'stream',
1977
+ description: 'Configure trading activity streaming',
1978
+ usage: '/stream [on|off|status|channel] [args]',
1979
+ handler: async (args, ctx) => {
1980
+ const trading = ctx.trading;
1981
+ if (!trading?.stream) {
1982
+ return 'Trading stream not initialized.';
1983
+ }
1984
+ const parts = args.trim().split(/\s+/);
1985
+ const subcommand = parts[0]?.toLowerCase() || 'status';
1986
+ const rest = parts.slice(1);
1987
+ switch (subcommand) {
1988
+ case 'status': {
1989
+ const config = trading.stream.getConfig();
1990
+ return [
1991
+ 'Trading Stream Status',
1992
+ '',
1993
+ `Privacy: ${config.privacy}`,
1994
+ `Channels: ${config.channels.length}`,
1995
+ `Events: ${config.events.join(', ')}`,
1996
+ '',
1997
+ 'Privacy settings:',
1998
+ ` Show platforms: ${config.showPlatforms}`,
1999
+ ` Show markets: ${config.showMarkets}`,
2000
+ ` Show exact prices: ${config.showExactPrices}`,
2001
+ ` Show sizes: ${config.showSizes}`,
2002
+ ` Show PnL amounts: ${config.showPnL}`,
2003
+ ].join('\n');
2004
+ }
2005
+ case 'on': {
2006
+ // Subscribe to console output
2007
+ trading.stream.addChannel({ type: 'console', id: 'console' });
2008
+ return 'Streaming enabled (console output). Use /stream webhook <url> to add webhook.';
2009
+ }
2010
+ case 'off': {
2011
+ trading.stream.removeChannel('console');
2012
+ return 'Streaming disabled.';
2013
+ }
2014
+ case 'privacy': {
2015
+ const level = rest[0]?.toLowerCase();
2016
+ if (!level || !['public', 'obscured', 'private'].includes(level)) {
2017
+ return 'Usage: /stream privacy [public|obscured|private]';
2018
+ }
2019
+ trading.stream.configure({ privacy: level });
2020
+ return `Privacy set to: ${level}`;
2021
+ }
2022
+ case 'webhook': {
2023
+ const url = rest[0];
2024
+ if (!url || !url.startsWith('http')) {
2025
+ return 'Usage: /stream webhook <url>';
2026
+ }
2027
+ trading.stream.addChannel({ type: 'webhook', id: `wh_${Date.now()}`, webhookUrl: url });
2028
+ return `Webhook added: ${url}`;
2029
+ }
2030
+ case 'discord': {
2031
+ const url = rest[0];
2032
+ if (!url || !url.includes('discord')) {
2033
+ return 'Usage: /stream discord <webhook-url>';
2034
+ }
2035
+ trading.stream.addChannel({ type: 'discord', id: `discord_${Date.now()}`, webhookUrl: url });
2036
+ return 'Discord webhook added.';
2037
+ }
2038
+ case 'slack': {
2039
+ const url = rest[0];
2040
+ if (!url || !url.includes('slack')) {
2041
+ return 'Usage: /stream slack <webhook-url>';
2042
+ }
2043
+ trading.stream.addChannel({ type: 'slack', id: `slack_${Date.now()}`, webhookUrl: url });
2044
+ return 'Slack webhook added.';
2045
+ }
2046
+ default:
2047
+ return [
2048
+ 'Usage: /stream [command]',
2049
+ '',
2050
+ 'Commands:',
2051
+ ' status - Show stream configuration',
2052
+ ' on - Enable console streaming',
2053
+ ' off - Disable streaming',
2054
+ ' privacy <level> - Set privacy (public/obscured/private)',
2055
+ ' webhook <url> - Add webhook endpoint',
2056
+ ' discord <url> - Add Discord webhook',
2057
+ ' slack <url> - Add Slack webhook',
2058
+ ].join('\n');
2059
+ }
2060
+ },
2061
+ },
2062
+ {
2063
+ name: 'devtools',
2064
+ description: 'Configure developer tools and debugging',
2065
+ usage: '/devtools [on|off|status|ws|datadog|sentry] [args]',
2066
+ aliases: ['debug', 'dev'],
2067
+ handler: async (args, ctx) => {
2068
+ const trading = ctx.trading;
2069
+ if (!trading?.devtools) {
2070
+ return 'DevTools not initialized. Enable in trading config: devtools: { enabled: true }';
2071
+ }
2072
+ const parts = args.trim().split(/\s+/);
2073
+ const subcommand = parts[0]?.toLowerCase() || 'status';
2074
+ const rest = parts.slice(1);
2075
+ switch (subcommand) {
2076
+ case 'status': {
2077
+ const config = trading.devtools.getConfig();
2078
+ const stats = trading.devtools.getStats();
2079
+ const lines = [
2080
+ 'DevTools Status',
2081
+ '',
2082
+ `Console: ${config.console?.enabled ? '🟢 ON' : '⚪ OFF'}`,
2083
+ `WebSocket: ${config.websocket?.enabled ? `🟢 ON (port ${config.websocket.port})` : '⚪ OFF'}`,
2084
+ `Datadog: ${config.datadog?.enabled ? '🟢 ON' : '⚪ OFF'}`,
2085
+ `Sentry: ${config.sentry?.enabled ? '🟢 ON' : '⚪ OFF'}`,
2086
+ '',
2087
+ 'Stats:',
2088
+ ` Events recorded: ${stats.eventsRecorded}`,
2089
+ ` Profiler calls: ${stats.profilerCalls}`,
2090
+ ` WS clients: ${stats.wsClients}`,
2091
+ ];
2092
+ return lines.join('\n');
2093
+ }
2094
+ case 'on': {
2095
+ trading.devtools.enable();
2096
+ return 'DevTools enabled. Console logging active.';
2097
+ }
2098
+ case 'off': {
2099
+ trading.devtools.disable();
2100
+ return 'DevTools disabled.';
2101
+ }
2102
+ case 'console': {
2103
+ const level = rest[0]?.toLowerCase() || 'info';
2104
+ const colors = rest.includes('colors') || rest.includes('color');
2105
+ trading.devtools.configure({
2106
+ console: {
2107
+ enabled: true,
2108
+ level: level,
2109
+ colors,
2110
+ },
2111
+ });
2112
+ return `Console logging: ${level}${colors ? ' with colors' : ''}`;
2113
+ }
2114
+ case 'ws': {
2115
+ const port = parseInt(rest[0], 10) || 9229;
2116
+ trading.devtools.configure({
2117
+ websocket: { enabled: true, port },
2118
+ });
2119
+ return [
2120
+ `WebSocket server starting on port ${port}`,
2121
+ '',
2122
+ 'Connect with:',
2123
+ ` ws://localhost:${port}`,
2124
+ '',
2125
+ 'Or use browser DevTools WebSocket client.',
2126
+ ].join('\n');
2127
+ }
2128
+ case 'datadog': {
2129
+ const apiKey = rest[0];
2130
+ if (!apiKey) {
2131
+ return 'Usage: /devtools datadog <api-key> [service-name]';
2132
+ }
2133
+ const service = rest[1] || 'clodds-trading';
2134
+ trading.devtools.configure({
2135
+ datadog: { enabled: true, apiKey, service },
2136
+ });
2137
+ return `Datadog integration enabled (service: ${service})`;
2138
+ }
2139
+ case 'sentry': {
2140
+ const dsn = rest[0];
2141
+ if (!dsn) {
2142
+ return 'Usage: /devtools sentry <dsn>';
2143
+ }
2144
+ trading.devtools.configure({
2145
+ sentry: { enabled: true, dsn },
2146
+ });
2147
+ return 'Sentry error tracking enabled.';
2148
+ }
2149
+ case 'profile': {
2150
+ const operation = rest.join(' ') || 'test_profile';
2151
+ // Start profiling
2152
+ const profile = trading.devtools.startProfile(operation);
2153
+ // Simulate some work
2154
+ await new Promise(resolve => setTimeout(resolve, 100));
2155
+ // End profiling
2156
+ const result = trading.devtools.endProfile(profile.id);
2157
+ return [
2158
+ 'Profile Result',
2159
+ '',
2160
+ `Operation: ${operation}`,
2161
+ `Duration: ${result.duration.toFixed(2)}ms`,
2162
+ `Memory delta: ${result.memoryDelta ? `${(result.memoryDelta / 1024).toFixed(2)}KB` : 'n/a'}`,
2163
+ ].join('\n');
2164
+ }
2165
+ case 'events': {
2166
+ const limit = parseInt(rest[0], 10) || 10;
2167
+ const events = trading.devtools.getRecentEvents(limit);
2168
+ if (events.length === 0) {
2169
+ return 'No events recorded yet.';
2170
+ }
2171
+ const lines = [`Recent Events (${events.length})`, ''];
2172
+ for (const event of events.slice(0, 10)) {
2173
+ const time = event.timestamp.toISOString().slice(11, 19);
2174
+ lines.push(`[${time}] ${event.type}: ${event.message || JSON.stringify(event.data).slice(0, 50)}`);
2175
+ }
2176
+ return lines.join('\n');
2177
+ }
2178
+ case 'clear': {
2179
+ trading.devtools.clearEvents();
2180
+ return 'Event history cleared.';
2181
+ }
2182
+ default:
2183
+ return [
2184
+ 'Usage: /devtools [command]',
2185
+ '',
2186
+ 'Commands:',
2187
+ ' status - Show DevTools status',
2188
+ ' on - Enable DevTools',
2189
+ ' off - Disable DevTools',
2190
+ ' console [level] - Configure console logging',
2191
+ ' ws [port] - Start WebSocket server',
2192
+ ' datadog <key> - Enable Datadog integration',
2193
+ ' sentry <dsn> - Enable Sentry error tracking',
2194
+ ' profile [name] - Run a profile measurement',
2195
+ ' events [limit] - Show recent events',
2196
+ ' clear - Clear event history',
2197
+ ].join('\n');
2198
+ }
2199
+ },
2200
+ },
2201
+ {
2202
+ name: 'opportunity',
2203
+ description: 'Find arbitrage and edge opportunities across platforms',
2204
+ usage: '/opportunity [scan|active|link|stats|pairs] [args]',
2205
+ aliases: ['opp', 'arb', 'find'],
2206
+ handler: async (args, ctx) => {
2207
+ const finder = ctx.opportunityFinder;
2208
+ if (!finder) {
2209
+ return 'Opportunity finder not initialized. Enable in config.';
2210
+ }
2211
+ const parts = args.trim().split(/\s+/);
2212
+ const subcommand = parts[0]?.toLowerCase() || 'scan';
2213
+ const rest = parts.slice(1);
2214
+ switch (subcommand) {
2215
+ case 'scan': {
2216
+ // Parse options
2217
+ let query;
2218
+ let minEdge = 0.5;
2219
+ let limit = 20;
2220
+ const platforms = [];
2221
+ const types = [];
2222
+ for (const part of rest) {
2223
+ const lower = part.toLowerCase();
2224
+ if (lower.startsWith('minedge=')) {
2225
+ minEdge = parseFloat(lower.slice(8)) || 0.5;
2226
+ }
2227
+ else if (lower.startsWith('limit=')) {
2228
+ limit = parseInt(lower.slice(6), 10) || 20;
2229
+ }
2230
+ else if (lower.startsWith('platforms=')) {
2231
+ platforms.push(...lower.slice(10).split(','));
2232
+ }
2233
+ else if (lower.startsWith('types=')) {
2234
+ types.push(...lower.slice(6).split(','));
2235
+ }
2236
+ else if (!query) {
2237
+ query = part;
2238
+ }
2239
+ }
2240
+ const opportunities = await finder.scan({
2241
+ query,
2242
+ minEdge,
2243
+ limit,
2244
+ platforms: platforms.length > 0 ? platforms : undefined,
2245
+ types: types.length > 0 ? types : undefined,
2246
+ sortBy: 'score',
2247
+ });
2248
+ if (opportunities.length === 0) {
2249
+ return `No opportunities found above ${minEdge}% edge.`;
2250
+ }
2251
+ const lines = [`Opportunities Found: ${opportunities.length}`, ''];
2252
+ for (const opp of opportunities.slice(0, 10)) {
2253
+ const typeEmoji = opp.type === 'internal' ? '🔄' :
2254
+ opp.type === 'cross_platform' ? '🌐' : '📊';
2255
+ lines.push(`${typeEmoji} **${opp.edgePct.toFixed(2)}% edge** (score: ${opp.score})`);
2256
+ for (const market of opp.markets) {
2257
+ const action = market.action === 'buy' ? '🟢 BUY' : '🔴 SELL';
2258
+ lines.push(` ${action} ${market.outcome} @ ${(market.price * 100).toFixed(1)}c`);
2259
+ lines.push(` ${market.platform} - ${market.question.slice(0, 50)}...`);
2260
+ }
2261
+ lines.push(` 💰 Profit/$100: $${opp.profitPer100.toFixed(2)} | Kelly: ${(opp.kellyFraction * 100).toFixed(1)}%`);
2262
+ lines.push(` ⚠️ Slippage: ~${opp.estimatedSlippage.toFixed(1)}% | Liq: $${opp.totalLiquidity.toFixed(0)}`);
2263
+ lines.push('');
2264
+ }
2265
+ if (opportunities.length > 10) {
2266
+ lines.push(`...and ${opportunities.length - 10} more. Use limit= to see more.`);
2267
+ }
2268
+ return lines.join('\n');
2269
+ }
2270
+ case 'active': {
2271
+ const active = finder.getActive();
2272
+ if (active.length === 0) {
2273
+ return 'No active opportunities. Run /opportunity scan to find some.';
2274
+ }
2275
+ const lines = [`Active Opportunities: ${active.length}`, ''];
2276
+ for (const opp of active.slice(0, 10)) {
2277
+ const age = Math.round((Date.now() - opp.discoveredAt.getTime()) / 1000);
2278
+ const ttl = Math.round((opp.expiresAt.getTime() - Date.now()) / 1000);
2279
+ lines.push(`**${opp.id.slice(0, 20)}...**`);
2280
+ lines.push(` Type: ${opp.type} | Edge: ${opp.edgePct.toFixed(2)}%`);
2281
+ lines.push(` Age: ${age}s | TTL: ${ttl}s | Status: ${opp.status}`);
2282
+ }
2283
+ return lines.join('\n');
2284
+ }
2285
+ case 'link': {
2286
+ // /opportunity link polymarket:abc kalshi:xyz [confidence]
2287
+ const marketA = rest[0];
2288
+ const marketB = rest[1];
2289
+ const confidence = parseFloat(rest[2]) || 1.0;
2290
+ if (!marketA || !marketB) {
2291
+ return [
2292
+ 'Usage: /opportunity link <market_a> <market_b> [confidence]',
2293
+ '',
2294
+ 'Market format: platform:marketId',
2295
+ '',
2296
+ 'Example:',
2297
+ ' /opportunity link polymarket:0x123 kalshi:fed-rate-jan',
2298
+ ].join('\n');
2299
+ }
2300
+ finder.linkMarkets(marketA, marketB, confidence);
2301
+ return `Linked ${marketA} <-> ${marketB} (confidence: ${confidence})`;
2302
+ }
2303
+ case 'unlink': {
2304
+ const marketA = rest[0];
2305
+ const marketB = rest[1];
2306
+ if (!marketA || !marketB) {
2307
+ return 'Usage: /opportunity unlink <market_a> <market_b>';
2308
+ }
2309
+ finder.unlinkMarkets(marketA, marketB);
2310
+ return `Unlinked ${marketA} <-> ${marketB}`;
2311
+ }
2312
+ case 'links': {
2313
+ const marketKey = rest[0];
2314
+ if (!marketKey) {
2315
+ // Show all links
2316
+ const stats = finder.linker.getStats();
2317
+ const allLinks = finder.linker.getAllLinks({ minConfidence: 0.5 });
2318
+ const lines = [
2319
+ 'Market Links',
2320
+ '',
2321
+ `Total: ${stats.totalLinks}`,
2322
+ `By source: ${Object.entries(stats.bySource).map(([k, v]) => `${k}=${v}`).join(', ')}`,
2323
+ `Avg confidence: ${stats.avgConfidence.toFixed(2)}`,
2324
+ '',
2325
+ 'Recent links:',
2326
+ ];
2327
+ for (const link of allLinks.slice(0, 10)) {
2328
+ lines.push(` ${link.marketA} <-> ${link.marketB}`);
2329
+ lines.push(` Confidence: ${link.confidence.toFixed(2)} | Source: ${link.source}`);
2330
+ }
2331
+ return lines.join('\n');
2332
+ }
2333
+ // Show links for specific market
2334
+ const links = finder.getLinkedMarkets(marketKey);
2335
+ if (links.length === 0) {
2336
+ return `No links found for ${marketKey}`;
2337
+ }
2338
+ const lines = [`Links for ${marketKey}`, ''];
2339
+ for (const link of links) {
2340
+ const other = link.marketA === marketKey ? link.marketB : link.marketA;
2341
+ lines.push(` -> ${other} (${link.confidence.toFixed(2)}, ${link.source})`);
2342
+ }
2343
+ return lines.join('\n');
2344
+ }
2345
+ case 'stats': {
2346
+ const days = parseInt(rest[0], 10) || 30;
2347
+ const stats = finder.getAnalytics({ days });
2348
+ const lines = [
2349
+ `Opportunity Stats (${days} days)`,
2350
+ '',
2351
+ `Found: ${stats.totalFound}`,
2352
+ `Taken: ${stats.taken}`,
2353
+ `Win Rate: ${stats.winRate.toFixed(1)}%`,
2354
+ `Total Profit: $${stats.totalProfit.toFixed(2)}`,
2355
+ `Avg Edge: ${stats.avgEdge.toFixed(2)}%`,
2356
+ '',
2357
+ 'By Type:',
2358
+ ];
2359
+ for (const [type, data] of Object.entries(stats.byType)) {
2360
+ lines.push(` ${type}: ${data.count} found, ${data.winRate.toFixed(1)}% WR, $${data.profit.toFixed(2)} profit`);
2361
+ }
2362
+ if (stats.bestPlatformPair) {
2363
+ const bp = stats.bestPlatformPair;
2364
+ lines.push('');
2365
+ lines.push(`Best Pair: ${bp.platforms.join(' <-> ')}`);
2366
+ lines.push(` ${bp.winRate.toFixed(1)}% WR, $${bp.profit.toFixed(2)} profit`);
2367
+ }
2368
+ return lines.join('\n');
2369
+ }
2370
+ case 'pairs': {
2371
+ const pairs = finder.getPlatformPairs();
2372
+ if (pairs.length === 0) {
2373
+ return 'No platform pair data yet. Run scans to build up data.';
2374
+ }
2375
+ const lines = ['Platform Pair Performance', ''];
2376
+ for (const pair of pairs.slice(0, 10)) {
2377
+ lines.push(`**${pair.platforms.join(' <-> ')}**`);
2378
+ lines.push(` Opportunities: ${pair.count}`);
2379
+ lines.push(` Avg Edge: ${pair.avgEdge.toFixed(2)}%`);
2380
+ lines.push('');
2381
+ }
2382
+ return lines.join('\n');
2383
+ }
2384
+ case 'realtime': {
2385
+ const action = rest[0]?.toLowerCase() || 'status';
2386
+ if (action === 'start') {
2387
+ await finder.startRealtime();
2388
+ return 'Real-time opportunity scanning started.';
2389
+ }
2390
+ if (action === 'stop') {
2391
+ finder.stopRealtime();
2392
+ return 'Real-time scanning stopped.';
2393
+ }
2394
+ return [
2395
+ 'Usage: /opportunity realtime [start|stop]',
2396
+ '',
2397
+ 'Start real-time scanning to get live opportunity alerts.',
2398
+ ].join('\n');
2399
+ }
2400
+ case 'take': {
2401
+ const oppId = rest[0];
2402
+ if (!oppId) {
2403
+ return 'Usage: /opportunity take <opportunity-id>';
2404
+ }
2405
+ const opp = finder.get(oppId);
2406
+ if (!opp) {
2407
+ return `Opportunity ${oppId} not found or expired.`;
2408
+ }
2409
+ finder.markTaken(oppId);
2410
+ return [
2411
+ `Marked opportunity as taken: ${oppId}`,
2412
+ '',
2413
+ 'Execution plan:',
2414
+ ...opp.execution.steps.map((s) => ` ${s.order}. ${s.action.toUpperCase()} ${s.outcome} @ ${(s.price * 100).toFixed(1)}c on ${s.platform}`),
2415
+ '',
2416
+ `Estimated profit: $${opp.execution.estimatedProfit.toFixed(2)}`,
2417
+ `Risk: ${opp.execution.risk}`,
2418
+ ...(opp.execution.warnings.length > 0 ? ['', 'Warnings:', ...opp.execution.warnings.map((w) => ` ⚠️ ${w}`)] : []),
2419
+ ].join('\n');
2420
+ }
2421
+ case 'combinatorial':
2422
+ case 'comb': {
2423
+ // Combinatorial arbitrage scanner (from arXiv:2508.03474)
2424
+ // Detects: rebalancing (YES+NO != $1), conditional dependencies
2425
+ const { scanCombinatorialArbitrage } = await Promise.resolve().then(() => __importStar(require('../opportunity/combinatorial')));
2426
+ let minEdge = 0.5;
2427
+ const platforms = [];
2428
+ for (const part of rest) {
2429
+ const lower = part.toLowerCase();
2430
+ if (lower.startsWith('minedge=')) {
2431
+ minEdge = parseFloat(lower.slice(8)) || 0.5;
2432
+ }
2433
+ else if (lower.startsWith('platforms=')) {
2434
+ platforms.push(...lower.slice(10).split(','));
2435
+ }
2436
+ }
2437
+ const result = await scanCombinatorialArbitrage(ctx.feeds, {
2438
+ platforms: platforms.length > 0 ? platforms : ['polymarket', 'kalshi', 'betfair'],
2439
+ minEdgePct: minEdge,
2440
+ });
2441
+ const lines = [
2442
+ '**Combinatorial Arbitrage Scan**',
2443
+ `(Based on arXiv:2508.03474 - "Unravelling the Probabilistic Forest")`,
2444
+ '',
2445
+ `Scanned: ${result.scannedMarkets} markets, ${result.scannedPairs} pairs`,
2446
+ `Clusters found: ${result.clusters.length}`,
2447
+ '',
2448
+ ];
2449
+ // Rebalancing opportunities
2450
+ if (result.rebalance.length > 0) {
2451
+ lines.push(`**Rebalancing (YES+NO != $1): ${result.rebalance.length}**`);
2452
+ for (const opp of result.rebalance.slice(0, 5)) {
2453
+ const emoji = opp.type === 'rebalance_long' ? '📈' : '📉';
2454
+ lines.push(`${emoji} ${opp.edgePct.toFixed(2)}% - ${opp.market.question.slice(0, 40)}...`);
2455
+ lines.push(` Cost: $${opp.totalCost.toFixed(3)} → Payout: $1.00 | Net: $${opp.netProfit.toFixed(3)}`);
2456
+ }
2457
+ lines.push('');
2458
+ }
2459
+ // Combinatorial opportunities
2460
+ if (result.combinatorial.length > 0) {
2461
+ lines.push(`**Combinatorial (conditional deps): ${result.combinatorial.length}**`);
2462
+ for (const opp of result.combinatorial.slice(0, 5)) {
2463
+ const relEmoji = {
2464
+ implies: '→',
2465
+ implied_by: '←',
2466
+ mutually_exclusive: '⊕',
2467
+ exhaustive: '∨',
2468
+ equivalent: '↔',
2469
+ inverse: '¬',
2470
+ };
2471
+ lines.push(`${relEmoji[opp.relationship] || '?'} ${opp.edgePct.toFixed(2)}% (${opp.relationship})`);
2472
+ for (const m of opp.markets.slice(0, 2)) {
2473
+ lines.push(` ${m.platform}: ${m.question.slice(0, 35)}...`);
2474
+ }
2475
+ lines.push(` Strategy: ${opp.strategy.action.toUpperCase()} | Conf: ${(opp.confidence * 100).toFixed(0)}%`);
2476
+ }
2477
+ lines.push('');
2478
+ }
2479
+ // Cluster summary
2480
+ if (result.clusters.length > 0) {
2481
+ lines.push('**Top Clusters:**');
2482
+ for (const cluster of result.clusters.slice(0, 5)) {
2483
+ lines.push(` ${cluster.topic}: ${cluster.markets.length} markets (sim: ${cluster.avgSimilarity.toFixed(2)})`);
2484
+ }
2485
+ }
2486
+ if (result.rebalance.length === 0 && result.combinatorial.length === 0) {
2487
+ lines.push('No combinatorial arbitrage found above threshold.');
2488
+ }
2489
+ return lines.join('\n');
2490
+ }
2491
+ default:
2492
+ return [
2493
+ 'Usage: /opportunity [command]',
2494
+ '',
2495
+ 'Commands:',
2496
+ ' scan [query] [minEdge=0.5] [limit=20] - Find opportunities',
2497
+ ' active - Show active opportunities',
2498
+ ' combinatorial [minEdge=0.5] - Scan for combinatorial arbitrage',
2499
+ ' link <a> <b> [confidence] - Link equivalent markets',
2500
+ ' unlink <a> <b> - Remove market link',
2501
+ ' links [market] - Show market links',
2502
+ ' stats [days=30] - Show performance stats',
2503
+ ' pairs - Show platform pair performance',
2504
+ ' realtime [start|stop] - Real-time scanning',
2505
+ ' take <id> - Mark opportunity as taken',
2506
+ '',
2507
+ 'Options:',
2508
+ ' minEdge=N - Minimum edge % (default: 0.5)',
2509
+ ' limit=N - Max results (default: 20)',
2510
+ ' platforms=a,b - Filter platforms',
2511
+ ' types=a,b - Filter types (internal, cross_platform, edge)',
2512
+ '',
2513
+ 'Combinatorial (arXiv:2508.03474):',
2514
+ ' - Rebalancing: YES+NO != $1 within single market',
2515
+ ' - Dependencies: implies, inverse, mutually_exclusive',
2516
+ ].join('\n');
2517
+ }
2518
+ },
2519
+ },
2520
+ {
2521
+ name: 'trades',
2522
+ description: 'View trade history and stats',
2523
+ usage: '/trades [stats|export|recent] [platform] [limit=20]',
2524
+ handler: async (args, ctx) => {
2525
+ const trading = ctx.trading;
2526
+ if (!trading?.logger) {
2527
+ return 'Trading system not initialized.';
2528
+ }
2529
+ const parts = args.trim().split(/\s+/).filter(Boolean);
2530
+ const subcommand = parts[0]?.toLowerCase() || 'recent';
2531
+ let platform;
2532
+ let limit = 20;
2533
+ for (const part of parts.slice(1)) {
2534
+ const lower = part.toLowerCase();
2535
+ if (lower.startsWith('limit=')) {
2536
+ limit = Math.min(100, parseInt(lower.slice(6), 10) || 20);
2537
+ }
2538
+ else if (isPlatformName(lower)) {
2539
+ platform = lower;
2540
+ }
2541
+ }
2542
+ switch (subcommand) {
2543
+ case 'stats': {
2544
+ const filter = platform ? { platform: platform } : {};
2545
+ const stats = trading.logger.getStats(filter);
2546
+ return [
2547
+ `Trade Statistics${platform ? ` (${platform})` : ''}`,
2548
+ '',
2549
+ `Total trades: ${stats.totalTrades}`,
2550
+ `Win rate: ${stats.winRate.toFixed(1)}%`,
2551
+ `Winning: ${stats.winningTrades} | Losing: ${stats.losingTrades}`,
2552
+ '',
2553
+ `Total PnL: $${stats.totalPnL.toFixed(2)}`,
2554
+ `Avg PnL: $${stats.avgPnL.toFixed(2)}`,
2555
+ `Avg Win: $${stats.avgWin.toFixed(2)} | Avg Loss: $${stats.avgLoss.toFixed(2)}`,
2556
+ `Largest win: $${stats.largestWin.toFixed(2)}`,
2557
+ `Largest loss: $${stats.largestLoss.toFixed(2)}`,
2558
+ '',
2559
+ `Profit factor: ${stats.profitFactor === Infinity ? '∞' : stats.profitFactor.toFixed(2)}`,
2560
+ `Total volume: $${stats.totalVolume.toFixed(2)}`,
2561
+ `Total fees: $${stats.totalFees.toFixed(2)}`,
2562
+ ].join('\n');
2563
+ }
2564
+ case 'daily': {
2565
+ const dailyPnL = trading.logger.getDailyPnL(30);
2566
+ if (dailyPnL.length === 0) {
2567
+ return 'No daily PnL data yet.';
2568
+ }
2569
+ const lines = ['Daily PnL (last 30 days)', ''];
2570
+ for (const day of dailyPnL.slice(0, 14)) {
2571
+ const prefix = day.pnl >= 0 ? '+' : '';
2572
+ lines.push(`${day.date}: ${prefix}$${day.pnl.toFixed(2)} (${day.trades} trades)`);
2573
+ }
2574
+ return lines.join('\n');
2575
+ }
2576
+ case 'export': {
2577
+ const filter = platform ? { platform: platform } : {};
2578
+ const csv = trading.logger.exportCsv(filter);
2579
+ return `Exported ${csv.split('\n').length - 1} trades to CSV format.\n\n${csv.slice(0, 1000)}${csv.length > 1000 ? '\n...(truncated)' : ''}`;
2580
+ }
2581
+ case 'recent':
2582
+ default: {
2583
+ const filter = { limit };
2584
+ if (platform)
2585
+ filter.platform = platform;
2586
+ const trades = trading.logger.getTrades(filter);
2587
+ if (trades.length === 0) {
2588
+ return 'No trades recorded yet.';
2589
+ }
2590
+ const lines = [`Recent Trades (${trades.length})`, ''];
2591
+ for (const trade of trades.slice(0, 10)) {
2592
+ const pnlStr = trade.realizedPnL !== undefined
2593
+ ? ` PnL: ${trade.realizedPnL >= 0 ? '+' : ''}$${trade.realizedPnL.toFixed(2)}`
2594
+ : '';
2595
+ lines.push(`- ${trade.side.toUpperCase()} ${trade.outcome} @ ${trade.price.toFixed(2)}`);
2596
+ lines.push(` ${trade.platform} | ${trade.status} | ${trade.filled}/${trade.size} shares${pnlStr}`);
2597
+ }
2598
+ if (trades.length > 10) {
2599
+ lines.push(`\n...and ${trades.length - 10} more.`);
2600
+ }
2601
+ return lines.join('\n');
2602
+ }
2603
+ }
2604
+ },
2605
+ },
2606
+ // =========================================================================
2607
+ // VIRTUALS PROTOCOL COMMANDS
2608
+ // =========================================================================
2609
+ {
2610
+ name: 'agents',
2611
+ description: 'Search AI agents on Virtuals Protocol',
2612
+ usage: '/agents <query>',
2613
+ aliases: ['virtuals'],
2614
+ handler: async (args, ctx) => {
2615
+ if (!args.trim()) {
2616
+ return 'Usage: /agents <query>\nExample: /agents luna\n\nOr use /trending-agents or /new-agents';
2617
+ }
2618
+ const agents = await virtuals.searchAgents(args.trim(), 10);
2619
+ if (agents.length === 0) {
2620
+ return `No agents found for "${args}"`;
2621
+ }
2622
+ const lines = [`AI Agents matching "${args}"`, ''];
2623
+ for (const agent of agents) {
2624
+ const priceChange = agent.priceChange24h !== undefined
2625
+ ? ` (${agent.priceChange24h >= 0 ? '+' : ''}${(agent.priceChange24h * 100).toFixed(1)}%)`
2626
+ : '';
2627
+ lines.push(`**${agent.name}** ($${agent.symbol})`);
2628
+ lines.push(` Price: ${agent.price.toFixed(6)} VIRTUAL${priceChange}`);
2629
+ lines.push(` MCap: $${(agent.marketCap / 1000).toFixed(1)}K | Vol: $${(agent.volume24h / 1000).toFixed(1)}K | Status: ${agent.status}`);
2630
+ lines.push(` Token: \`${agent.tokenAddress.slice(0, 10)}...${agent.tokenAddress.slice(-6)}\``);
2631
+ lines.push('');
2632
+ }
2633
+ return lines.join('\n');
2634
+ },
2635
+ },
2636
+ {
2637
+ name: 'agent',
2638
+ description: 'Get detailed info about an AI agent',
2639
+ usage: '/agent <token-address>',
2640
+ handler: async (args, ctx) => {
2641
+ const tokenAddress = args.trim();
2642
+ if (!tokenAddress || !tokenAddress.startsWith('0x')) {
2643
+ return 'Usage: /agent <token-address>\nExample: /agent 0x1234...';
2644
+ }
2645
+ const [apiAgent, tokenInfo] = await Promise.all([
2646
+ virtuals.getAgentByToken(tokenAddress),
2647
+ virtuals.getAgentTokenInfo(tokenAddress).catch(() => null),
2648
+ ]);
2649
+ if (!apiAgent && !tokenInfo) {
2650
+ return `Agent not found: ${tokenAddress}`;
2651
+ }
2652
+ const lines = [];
2653
+ if (apiAgent) {
2654
+ lines.push(`**${apiAgent.name}** ($${apiAgent.symbol})`);
2655
+ lines.push('');
2656
+ lines.push(`Status: ${apiAgent.status.toUpperCase()}`);
2657
+ lines.push(`Price: ${apiAgent.price.toFixed(6)} VIRTUAL`);
2658
+ lines.push(`Market Cap: $${apiAgent.marketCap.toLocaleString()}`);
2659
+ lines.push(`24h Volume: $${apiAgent.volume24h.toLocaleString()}`);
2660
+ lines.push(`Holders: ${apiAgent.holders.toLocaleString()}`);
2661
+ if (apiAgent.description) {
2662
+ lines.push('');
2663
+ lines.push(`Description: ${apiAgent.description.slice(0, 200)}${apiAgent.description.length > 200 ? '...' : ''}`);
2664
+ }
2665
+ }
2666
+ if (tokenInfo) {
2667
+ lines.push('');
2668
+ lines.push('--- On-Chain Data ---');
2669
+ lines.push(`Graduated: ${tokenInfo.isGraduated ? 'Yes (trading on Uniswap)' : 'No (bonding curve)'}`);
2670
+ if (tokenInfo.bondingCurve) {
2671
+ lines.push(`Progress to Graduation: ${tokenInfo.bondingCurve.progressToGraduation.toFixed(1)}%`);
2672
+ lines.push(`VIRTUAL Reserve: ${parseFloat(tokenInfo.bondingCurve.virtualReserve).toFixed(2)}`);
2673
+ lines.push(`Current Price: ${parseFloat(tokenInfo.bondingCurve.currentPrice).toFixed(8)} VIRTUAL`);
2674
+ }
2675
+ if (tokenInfo.uniswapPair) {
2676
+ lines.push(`Uniswap Pair: ${tokenInfo.uniswapPair}`);
2677
+ }
2678
+ }
2679
+ lines.push('');
2680
+ lines.push(`Token: ${tokenAddress}`);
2681
+ lines.push(`View: https://app.virtuals.io/agents/${tokenAddress}`);
2682
+ return lines.join('\n');
2683
+ },
2684
+ },
2685
+ {
2686
+ name: 'trending-agents',
2687
+ description: 'Show trending AI agents by volume',
2688
+ usage: '/trending-agents [limit]',
2689
+ aliases: ['hot-agents'],
2690
+ handler: async (args, _ctx) => {
2691
+ const limit = Math.min(parseInt(args) || 10, 20);
2692
+ const agents = await virtuals.getTrendingAgents(limit);
2693
+ if (agents.length === 0) {
2694
+ return 'No trending agents found.';
2695
+ }
2696
+ const lines = ['🔥 Trending AI Agents (by 24h volume)', ''];
2697
+ for (let i = 0; i < agents.length; i++) {
2698
+ const agent = agents[i];
2699
+ const priceChange = agent.priceChange24h !== undefined
2700
+ ? ` ${agent.priceChange24h >= 0 ? '📈' : '📉'}${(agent.priceChange24h * 100).toFixed(1)}%`
2701
+ : '';
2702
+ lines.push(`${i + 1}. **${agent.name}** ($${agent.symbol})${priceChange}`);
2703
+ lines.push(` Vol: $${(agent.volume24h / 1000).toFixed(1)}K | MCap: $${(agent.marketCap / 1000).toFixed(1)}K`);
2704
+ }
2705
+ return lines.join('\n');
2706
+ },
2707
+ },
2708
+ {
2709
+ name: 'new-agents',
2710
+ description: 'Show newly launched AI agents',
2711
+ usage: '/new-agents [limit]',
2712
+ aliases: ['latest-agents'],
2713
+ handler: async (args, _ctx) => {
2714
+ const limit = Math.min(parseInt(args) || 10, 20);
2715
+ const agents = await virtuals.getNewAgents(limit);
2716
+ if (agents.length === 0) {
2717
+ return 'No new agents found.';
2718
+ }
2719
+ const lines = ['🆕 New AI Agents', ''];
2720
+ for (let i = 0; i < agents.length; i++) {
2721
+ const agent = agents[i];
2722
+ const created = new Date(agent.createdAt).toLocaleDateString();
2723
+ lines.push(`${i + 1}. **${agent.name}** ($${agent.symbol}) - ${agent.status}`);
2724
+ lines.push(` MCap: $${(agent.marketCap / 1000).toFixed(1)}K | Created: ${created}`);
2725
+ }
2726
+ return lines.join('\n');
2727
+ },
2728
+ },
2729
+ {
2730
+ name: 'agent-quote',
2731
+ description: 'Get a quote for buying/selling an AI agent token',
2732
+ usage: '/agent-quote <buy|sell> <token-address> <amount>',
2733
+ handler: async (args, _ctx) => {
2734
+ const parts = args.trim().split(/\s+/);
2735
+ if (parts.length < 3) {
2736
+ return 'Usage: /agent-quote <buy|sell> <token-address> <amount>\nExample: /agent-quote buy 0x1234... 100';
2737
+ }
2738
+ const [side, tokenAddress, amountStr] = parts;
2739
+ if (side !== 'buy' && side !== 'sell') {
2740
+ return 'Side must be "buy" or "sell"';
2741
+ }
2742
+ if (!tokenAddress.startsWith('0x')) {
2743
+ return 'Invalid token address';
2744
+ }
2745
+ const amount = amountStr;
2746
+ try {
2747
+ const quote = await virtuals.getVirtualsQuote({
2748
+ agentToken: tokenAddress,
2749
+ amount,
2750
+ side: side,
2751
+ slippageBps: 100,
2752
+ });
2753
+ const lines = [
2754
+ `Quote: ${side.toUpperCase()} ${quote.agentToken.symbol}`,
2755
+ '',
2756
+ `Route: ${quote.route === 'bonding' ? 'Bonding Curve' : 'Uniswap V2'}`,
2757
+ `Input: ${quote.inputAmount} ${side === 'buy' ? 'VIRTUAL' : quote.agentToken.symbol}`,
2758
+ `Output: ${quote.outputAmount} ${side === 'buy' ? quote.agentToken.symbol : 'VIRTUAL'}`,
2759
+ `Min Output (1% slippage): ${quote.outputAmountMin}`,
2760
+ `Price Impact: ${quote.priceImpact.toFixed(2)}%`,
2761
+ '',
2762
+ `Current Price: ${quote.currentPrice.toFixed(8)} VIRTUAL`,
2763
+ `New Price: ${quote.newPrice.toFixed(8)} VIRTUAL`,
2764
+ ];
2765
+ return lines.join('\n');
2766
+ }
2767
+ catch (error) {
2768
+ const message = error instanceof Error ? error.message : 'Unknown error';
2769
+ return `Quote failed: ${message}`;
2770
+ }
2771
+ },
2772
+ },
2773
+ {
2774
+ name: 'virtual-balance',
2775
+ description: 'Check VIRTUAL token balance',
2776
+ usage: '/virtual-balance [address]',
2777
+ handler: async (args, _ctx) => {
2778
+ const address = args.trim() || undefined;
2779
+ try {
2780
+ const [virtualBal, veBal] = await Promise.all([
2781
+ virtuals.getVirtualBalance(address),
2782
+ virtuals.getVeVirtualBalance(address).catch(() => '0'),
2783
+ ]);
2784
+ const lines = [
2785
+ 'VIRTUAL Balances',
2786
+ '',
2787
+ `VIRTUAL: ${parseFloat(virtualBal).toFixed(4)}`,
2788
+ `veVIRTUAL: ${parseFloat(veBal).toFixed(4)}`,
2789
+ ];
2790
+ const canCreate = await virtuals.canCreateAgent(address);
2791
+ lines.push('');
2792
+ lines.push(`Can Create Agent: ${canCreate.canCreate ? '✅ Yes' : '❌ No'}`);
2793
+ if (!canCreate.canCreate) {
2794
+ lines.push(` Need ${canCreate.shortfall} more VIRTUAL (100 required)`);
2795
+ }
2796
+ return lines.join('\n');
2797
+ }
2798
+ catch (error) {
2799
+ const message = error instanceof Error ? error.message : 'Unknown error';
2800
+ return `Failed to fetch balance: ${message}`;
2801
+ }
2802
+ },
2803
+ },
2804
+ // =========================================================================
2805
+ // EVM WALLET COMMANDS
2806
+ // =========================================================================
2807
+ {
2808
+ name: 'wallet',
2809
+ description: 'Manage EVM wallets',
2810
+ usage: '/wallet <create|list|balance> [options]',
2811
+ handler: async (args, _ctx) => {
2812
+ const parts = args.trim().split(/\s+/);
2813
+ const subcommand = parts[0]?.toLowerCase();
2814
+ if (!subcommand || subcommand === 'help') {
2815
+ return [
2816
+ 'EVM Wallet Commands',
2817
+ '',
2818
+ '/wallet create [name] - Generate new wallet',
2819
+ '/wallet list - List saved wallets',
2820
+ '/wallet balance [address] - Check balances across chains',
2821
+ '',
2822
+ 'Keys are stored locally in ~/.clodds/wallets/',
2823
+ ].join('\n');
2824
+ }
2825
+ if (subcommand === 'create') {
2826
+ const name = parts[1] || undefined;
2827
+ const generated = wallet.generateWallet();
2828
+ return [
2829
+ 'New Wallet Generated',
2830
+ '',
2831
+ `Address: ${generated.address}`,
2832
+ `Public Key: ${generated.publicKey.slice(0, 30)}...`,
2833
+ '',
2834
+ '**Save these securely:**',
2835
+ `Private Key: ${generated.privateKey}`,
2836
+ generated.mnemonic ? `Mnemonic: ${generated.mnemonic}` : '',
2837
+ '',
2838
+ 'Use /wallet save <password> to encrypt and store',
2839
+ ].filter(Boolean).join('\n');
2840
+ }
2841
+ if (subcommand === 'list') {
2842
+ const wallets = wallet.listWallets();
2843
+ if (wallets.length === 0) {
2844
+ return 'No saved wallets. Use /wallet create to generate one.';
2845
+ }
2846
+ const lines = ['Saved Wallets', ''];
2847
+ for (const w of wallets) {
2848
+ lines.push(`- **${w.name}**: ${w.address}`);
2849
+ }
2850
+ return lines.join('\n');
2851
+ }
2852
+ if (subcommand === 'balance') {
2853
+ const address = parts[1];
2854
+ if (!address || !wallet.isValidAddress(address)) {
2855
+ return 'Usage: /wallet balance <0x...address>';
2856
+ }
2857
+ const result = await multichain.getMultiChainBalances(address);
2858
+ const lines = [`Balances for ${address.slice(0, 10)}...${address.slice(-6)}`, ''];
2859
+ for (const chain of result.balances) {
2860
+ const nativeBal = parseFloat(chain.native.balance);
2861
+ if (nativeBal > 0.0001 || chain.tokens.length > 0) {
2862
+ lines.push(`**${chain.chainName}**`);
2863
+ if (nativeBal > 0.0001) {
2864
+ lines.push(` ${chain.native.symbol}: ${nativeBal.toFixed(6)}`);
2865
+ }
2866
+ for (const token of chain.tokens) {
2867
+ lines.push(` ${token.symbol}: ${parseFloat(token.balance).toFixed(4)}`);
2868
+ }
2869
+ }
2870
+ }
2871
+ if (lines.length === 2) {
2872
+ lines.push('No balances found on any chain');
2873
+ }
2874
+ return lines.join('\n');
2875
+ }
2876
+ return 'Unknown subcommand. Use /wallet help for options.';
2877
+ },
2878
+ },
2879
+ {
2880
+ name: 'swap',
2881
+ description: 'Swap tokens via Odos aggregator',
2882
+ usage: '/swap <chain> <from> <to> <amount>',
2883
+ handler: async (args, _ctx) => {
2884
+ const parts = args.trim().split(/\s+/);
2885
+ if (parts.length < 4) {
2886
+ return [
2887
+ 'Usage: /swap <chain> <from-token> <to-token> <amount>',
2888
+ '',
2889
+ 'Chains: ethereum, base, polygon, arbitrum, bsc, optimism, avalanche',
2890
+ '',
2891
+ 'Examples:',
2892
+ ' /swap base ETH USDC 0.1',
2893
+ ' /swap polygon MATIC 0x2791... 100',
2894
+ '',
2895
+ 'Note: Requires EVM_PRIVATE_KEY environment variable',
2896
+ ].join('\n');
2897
+ }
2898
+ const [chainInput, fromToken, toToken, amount] = parts;
2899
+ const chain = multichain.resolveChain(chainInput);
2900
+ if (!chain) {
2901
+ return `Unknown chain: ${chainInput}. Supported: ethereum, base, polygon, arbitrum, bsc, optimism, avalanche`;
2902
+ }
2903
+ const privateKey = process.env.EVM_PRIVATE_KEY;
2904
+ if (!privateKey) {
2905
+ return 'EVM_PRIVATE_KEY not set. Configure your wallet key to execute swaps.';
2906
+ }
2907
+ try {
2908
+ // Get quote first
2909
+ const quote = await odos.getOdosQuote({
2910
+ chain,
2911
+ inputToken: fromToken,
2912
+ outputToken: toToken,
2913
+ amount,
2914
+ });
2915
+ return [
2916
+ 'Swap Quote (Odos)',
2917
+ '',
2918
+ `Chain: ${multichain.getChainConfig(chain).name}`,
2919
+ `Input: ${quote.inputAmount} ${fromToken}`,
2920
+ `Output: ${quote.outputAmount} ${toToken}`,
2921
+ `Price Impact: ${(quote.priceImpact * 100).toFixed(2)}%`,
2922
+ `Route: ${quote.route.join(' → ') || 'Direct'}`,
2923
+ '',
2924
+ 'To execute, use /swap-execute with same params',
2925
+ ].join('\n');
2926
+ }
2927
+ catch (error) {
2928
+ const message = error instanceof Error ? error.message : 'Unknown error';
2929
+ return `Quote failed: ${message}`;
2930
+ }
2931
+ },
2932
+ },
2933
+ {
2934
+ name: 'send',
2935
+ description: 'Send ETH or ERC20 tokens',
2936
+ usage: '/send <chain> <to> <amount> [token]',
2937
+ handler: async (args, _ctx) => {
2938
+ const parts = args.trim().split(/\s+/);
2939
+ if (parts.length < 3) {
2940
+ return [
2941
+ 'Usage: /send <chain> <to-address> <amount> [token-address]',
2942
+ '',
2943
+ 'Examples:',
2944
+ ' /send base 0x123... 0.1 # Send 0.1 ETH',
2945
+ ' /send polygon 0x123... 100 0x2791... # Send 100 USDC',
2946
+ '',
2947
+ 'Chains: ethereum, base, polygon, arbitrum, bsc, optimism, avalanche',
2948
+ 'Note: Requires EVM_PRIVATE_KEY',
2949
+ ].join('\n');
2950
+ }
2951
+ const [chainInput, to, amount, tokenAddress] = parts;
2952
+ const chain = multichain.resolveChain(chainInput);
2953
+ if (!chain) {
2954
+ return `Unknown chain: ${chainInput}`;
2955
+ }
2956
+ if (!transfers.validateAddress(to)) {
2957
+ return `Invalid recipient address: ${to}`;
2958
+ }
2959
+ const privateKey = process.env.EVM_PRIVATE_KEY;
2960
+ if (!privateKey) {
2961
+ return 'EVM_PRIVATE_KEY not set. Configure your wallet key first.';
2962
+ }
2963
+ try {
2964
+ const config = multichain.getChainConfig(chain);
2965
+ if (tokenAddress) {
2966
+ // ERC20 transfer
2967
+ const result = await transfers.sendToken({
2968
+ chain,
2969
+ to,
2970
+ amount,
2971
+ privateKey,
2972
+ tokenAddress,
2973
+ });
2974
+ if (result.success) {
2975
+ return [
2976
+ 'Token Transfer Sent',
2977
+ '',
2978
+ `Token: ${result.token}`,
2979
+ `Amount: ${result.amount}`,
2980
+ `To: ${result.to}`,
2981
+ `TX: ${config.explorer}/tx/${result.txHash}`,
2982
+ ].join('\n');
2983
+ }
2984
+ else {
2985
+ return `Transfer failed: ${result.error}`;
2986
+ }
2987
+ }
2988
+ else {
2989
+ // Native transfer
2990
+ const result = await transfers.sendNative({
2991
+ chain,
2992
+ to,
2993
+ amount,
2994
+ privateKey,
2995
+ });
2996
+ if (result.success) {
2997
+ return [
2998
+ 'Transfer Sent',
2999
+ '',
3000
+ `Amount: ${result.amount} ${config.nativeCurrency.symbol}`,
3001
+ `To: ${result.to}`,
3002
+ `TX: ${config.explorer}/tx/${result.txHash}`,
3003
+ ].join('\n');
3004
+ }
3005
+ else {
3006
+ return `Transfer failed: ${result.error}`;
3007
+ }
3008
+ }
3009
+ }
3010
+ catch (error) {
3011
+ const message = error instanceof Error ? error.message : 'Unknown error';
3012
+ return `Transfer failed: ${message}`;
3013
+ }
3014
+ },
3015
+ },
3016
+ {
3017
+ name: 'chains',
3018
+ description: 'List supported EVM chains',
3019
+ usage: '/chains',
3020
+ handler: async (_args, _ctx) => {
3021
+ const lines = ['Supported EVM Chains', ''];
3022
+ for (const [key, config] of Object.entries(multichain.CHAINS)) {
3023
+ lines.push(`**${config.name}** (${key})`);
3024
+ lines.push(` Chain ID: ${config.chainId}`);
3025
+ lines.push(` Native: ${config.nativeCurrency.symbol}`);
3026
+ lines.push(` Explorer: ${config.explorer}`);
3027
+ lines.push('');
3028
+ }
3029
+ return lines.join('\n');
3030
+ },
3031
+ },
3032
+ {
3033
+ name: 'tao',
3034
+ description: 'Bittensor mining management',
3035
+ usage: '/tao [status|earnings|wallet|miners|subnets|start|stop|register]',
3036
+ aliases: ['bittensor'],
3037
+ handler: async (args, ctx) => {
3038
+ const svc = ctx.bittensorService;
3039
+ if (!svc) {
3040
+ return 'Bittensor is not enabled. Run `clodds bittensor setup` or set `BITTENSOR_ENABLED=true` in your config.';
3041
+ }
3042
+ const parts = args.trim().split(/\s+/);
3043
+ const cmd = parts[0]?.toLowerCase() || 'status';
3044
+ try {
3045
+ switch (cmd) {
3046
+ case 'status': {
3047
+ const s = await svc.getStatus();
3048
+ const lines = [
3049
+ '**Bittensor Mining Status**',
3050
+ `Connected: ${s.connected ? 'Yes' : 'No'} | Network: ${s.network}`,
3051
+ `Wallet: ${s.walletLoaded ? 'Loaded' : 'Not loaded'}`,
3052
+ `Earned: ${s.totalTaoEarned.toFixed(4)} TAO ($${s.totalUsdEarned.toFixed(2)})`,
3053
+ ];
3054
+ for (const m of s.activeMiners) {
3055
+ lines.push(` SN${m.subnetId} [${m.type}]: ${m.running ? 'Running' : 'Stopped'}`);
3056
+ }
3057
+ return lines.join('\n');
3058
+ }
3059
+ case 'earnings': {
3060
+ const period = (parts[1] ?? 'daily');
3061
+ const earnings = await svc.getEarnings(period);
3062
+ if (earnings.length === 0)
3063
+ return `No ${period} earnings recorded yet.`;
3064
+ const tao = earnings.reduce((s, e) => s + e.taoEarned, 0);
3065
+ const usd = earnings.reduce((s, e) => s + e.usdEarned, 0);
3066
+ return `**${period} Earnings**: ${tao.toFixed(4)} TAO ($${usd.toFixed(2)}) from ${earnings.length} records`;
3067
+ }
3068
+ case 'wallet': {
3069
+ const w = await svc.getWalletInfo();
3070
+ if (!w)
3071
+ return 'Wallet not loaded.';
3072
+ return [
3073
+ `**TAO Wallet** (${w.network})`,
3074
+ `Address: \`${w.coldkeyAddress}\``,
3075
+ `Free: ${w.balance.free.toFixed(4)} TAO | Staked: ${w.balance.staked.toFixed(4)} TAO`,
3076
+ `Total: ${w.balance.total.toFixed(4)} TAO`,
3077
+ ].join('\n');
3078
+ }
3079
+ case 'miners': {
3080
+ const miners = await svc.getMinerStatuses();
3081
+ if (miners.length === 0)
3082
+ return 'No miners registered.';
3083
+ const lines = ['**Registered Miners**'];
3084
+ for (const m of miners) {
3085
+ lines.push(`SN${m.subnetId} UID${m.uid}: T=${m.trust.toFixed(3)} I=${m.incentive.toFixed(3)} E=${m.emission.toFixed(6)} ${m.active ? 'ACTIVE' : 'OFFLINE'}`);
3086
+ }
3087
+ return lines.join('\n');
3088
+ }
3089
+ case 'subnets': {
3090
+ const subnets = await svc.getSubnets();
3091
+ if (subnets.length === 0)
3092
+ return 'Could not fetch subnets.';
3093
+ const lines = ['**Subnets**'];
3094
+ for (const s of subnets.slice(0, 15)) {
3095
+ lines.push(`SN${s.netuid}: ${s.minerCount} miners, reg: ${s.registrationCost.toFixed(4)} TAO`);
3096
+ }
3097
+ return lines.join('\n');
3098
+ }
3099
+ case 'start': {
3100
+ const id = parseInt(parts[1], 10);
3101
+ if (isNaN(id))
3102
+ return 'Usage: /tao start <subnetId>';
3103
+ const r = await svc.startMining(id);
3104
+ return r.message;
3105
+ }
3106
+ case 'stop': {
3107
+ const id = parseInt(parts[1], 10);
3108
+ if (isNaN(id))
3109
+ return 'Usage: /tao stop <subnetId>';
3110
+ const r = await svc.stopMining(id);
3111
+ return r.message;
3112
+ }
3113
+ case 'register': {
3114
+ const id = parseInt(parts[1], 10);
3115
+ if (isNaN(id))
3116
+ return 'Usage: /tao register <subnetId> [hotkeyName]';
3117
+ const r = await svc.registerOnSubnet(id, parts[2]);
3118
+ return r.message;
3119
+ }
3120
+ default:
3121
+ return [
3122
+ '**Usage:** /tao <command>',
3123
+ '',
3124
+ ' status - Mining status overview',
3125
+ ' earnings - TAO earnings (daily/weekly/monthly)',
3126
+ ' wallet - Wallet balance',
3127
+ ' miners - Registered miner info',
3128
+ ' subnets - Available subnets',
3129
+ ' start - Start mining (/tao start 64)',
3130
+ ' stop - Stop mining (/tao stop 64)',
3131
+ ' register - Register on subnet (/tao register 64)',
3132
+ ].join('\n');
3133
+ }
3134
+ }
3135
+ catch (err) {
3136
+ return `Bittensor error: ${err instanceof Error ? err.message : 'Unknown error'}`;
3137
+ }
3138
+ },
3139
+ },
3140
+ ];
3141
+ }
3142
+ //# sourceMappingURL=registry.js.map