dexterm-cli 0.0.0-stage → 0.1.1

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 (349) hide show
  1. package/LICENSE +661 -0
  2. package/dist/packages/agents/src/audit.js +122 -0
  3. package/dist/packages/agents/src/bus.js +379 -0
  4. package/dist/packages/agents/src/executor.js +177 -0
  5. package/dist/packages/agents/src/gate.js +176 -0
  6. package/dist/packages/agents/src/identity.js +179 -0
  7. package/dist/packages/agents/src/index.js +15 -0
  8. package/dist/packages/agents/src/proposals.js +153 -0
  9. package/dist/packages/agents/src/schema.js +87 -0
  10. package/dist/packages/agents/src/sdk.js +140 -0
  11. package/dist/packages/agents/src/tiers.js +114 -0
  12. package/dist/packages/agents/src/tools.js +69 -0
  13. package/dist/packages/agents/src/ws.js +158 -0
  14. package/dist/packages/cli/assets/claude/analyst-system.md +76 -0
  15. package/dist/packages/cli/assets/claude/plugin/.claude-plugin/plugin.json +5 -0
  16. package/dist/packages/cli/assets/claude/plugin/skills/REGISTRY.json +16 -0
  17. package/dist/packages/cli/assets/claude/plugin/skills/larp-check/SKILL.md +67 -0
  18. package/dist/packages/cli/assets/claude/plugin/skills/rug-check/SKILL.md +64 -0
  19. package/dist/packages/cli/assets/claude/plugin/skills/token-dossier/SKILL.md +63 -0
  20. package/dist/packages/cli/assets/claude/plugin/skills/trench-scan/SKILL.md +44 -0
  21. package/dist/packages/cli/assets/claude/schemas/larp.schema.json +117 -0
  22. package/dist/packages/cli/assets/claude/schemas/trench-scan.schema.json +71 -0
  23. package/dist/packages/cli/assets/claude/schemas/verdict.schema.json +115 -0
  24. package/dist/packages/cli/bin/dexterm.mjs +11 -0
  25. package/dist/packages/cli/src/agent-cmd.js +303 -0
  26. package/dist/packages/cli/src/agent-roster.js +26 -0
  27. package/dist/packages/cli/src/analyst/backend.js +526 -0
  28. package/dist/packages/cli/src/analyst/results.js +38 -0
  29. package/dist/packages/cli/src/analyst/session.js +319 -0
  30. package/dist/packages/cli/src/audit.js +51 -0
  31. package/dist/packages/cli/src/backtest-cmd.js +149 -0
  32. package/dist/packages/cli/src/boot-state.js +62 -0
  33. package/dist/packages/cli/src/custom.js +261 -0
  34. package/dist/packages/cli/src/display.js +191 -0
  35. package/dist/packages/cli/src/doctor.js +361 -0
  36. package/dist/packages/cli/src/feed.js +634 -0
  37. package/dist/packages/cli/src/fixtures.js +275 -0
  38. package/dist/packages/cli/src/follow-cmd.js +221 -0
  39. package/dist/packages/cli/src/images-config.js +59 -0
  40. package/dist/packages/cli/src/index.js +31 -0
  41. package/dist/packages/cli/src/kb-skill-cmd.js +240 -0
  42. package/dist/packages/cli/src/larp-record.js +21 -0
  43. package/dist/packages/cli/src/live/copy.js +80 -0
  44. package/dist/packages/cli/src/live/flow.js +233 -0
  45. package/dist/packages/cli/src/live/index.js +509 -0
  46. package/dist/packages/cli/src/live/intel.js +227 -0
  47. package/dist/packages/cli/src/live/newpairs.js +334 -0
  48. package/dist/packages/cli/src/live/screens/newpairs-live.js +219 -0
  49. package/dist/packages/cli/src/live/screens/token-live.js +459 -0
  50. package/dist/packages/cli/src/live/screens/watchlist-live.js +149 -0
  51. package/dist/packages/cli/src/live/token.js +585 -0
  52. package/dist/packages/cli/src/live/trade.js +929 -0
  53. package/dist/packages/cli/src/live/watchlist.js +178 -0
  54. package/dist/packages/cli/src/main.js +5583 -0
  55. package/dist/packages/cli/src/narrative-cmd.js +76 -0
  56. package/dist/packages/cli/src/pack-cmd.js +323 -0
  57. package/dist/packages/cli/src/plan-cmd.js +278 -0
  58. package/dist/packages/cli/src/popup.js +810 -0
  59. package/dist/packages/cli/src/rules-cmd.js +131 -0
  60. package/dist/packages/cli/src/rules.js +339 -0
  61. package/dist/packages/cli/src/scan/command.js +57 -0
  62. package/dist/packages/cli/src/scan/engine.js +419 -0
  63. package/dist/packages/cli/src/scan/observe.js +64 -0
  64. package/dist/packages/cli/src/scan/ui.js +98 -0
  65. package/dist/packages/cli/src/screener/filter.js +241 -0
  66. package/dist/packages/cli/src/screener/presets.js +80 -0
  67. package/dist/packages/cli/src/screener/rows.js +146 -0
  68. package/dist/packages/cli/src/screener/rug.js +50 -0
  69. package/dist/packages/cli/src/screener/sort.js +52 -0
  70. package/dist/packages/cli/src/screener/view.js +183 -0
  71. package/dist/packages/cli/src/screens/analyst-session.js +343 -0
  72. package/dist/packages/cli/src/screens/analyst.js +326 -0
  73. package/dist/packages/cli/src/screens/boot.js +74 -0
  74. package/dist/packages/cli/src/screens/bubbles.js +255 -0
  75. package/dist/packages/cli/src/screens/coin.js +33 -0
  76. package/dist/packages/cli/src/screens/follows.js +201 -0
  77. package/dist/packages/cli/src/screens/kol.js +90 -0
  78. package/dist/packages/cli/src/screens/narrative.js +90 -0
  79. package/dist/packages/cli/src/screens/newpairs.js +150 -0
  80. package/dist/packages/cli/src/screens/overlay.js +257 -0
  81. package/dist/packages/cli/src/screens/plans.js +126 -0
  82. package/dist/packages/cli/src/screens/positions.js +176 -0
  83. package/dist/packages/cli/src/screens/rules.js +170 -0
  84. package/dist/packages/cli/src/screens/screener.js +459 -0
  85. package/dist/packages/cli/src/screens/social-panel.js +107 -0
  86. package/dist/packages/cli/src/screens/ticket.js +342 -0
  87. package/dist/packages/cli/src/screens/token.js +312 -0
  88. package/dist/packages/cli/src/screens/trending.js +181 -0
  89. package/dist/packages/cli/src/screens/watchlist.js +104 -0
  90. package/dist/packages/cli/src/social/demo.js +96 -0
  91. package/dist/packages/cli/src/social/view.js +250 -0
  92. package/dist/packages/cli/src/state.js +463 -0
  93. package/dist/packages/cli/src/theme-cmd.js +126 -0
  94. package/dist/packages/cli/src/trade.js +319 -0
  95. package/dist/packages/cli/src/voice-hud.js +42 -0
  96. package/dist/packages/cli/src/wallet-cmd.js +440 -0
  97. package/dist/packages/cli/src/wallet-command.js +31 -0
  98. package/dist/packages/cli/src/widgets.js +208 -0
  99. package/dist/packages/cli/src/workspace-cmd.js +68 -0
  100. package/dist/packages/cli/src/x-cmd.js +154 -0
  101. package/dist/packages/custom/src/config.js +213 -0
  102. package/dist/packages/custom/src/index.js +10 -0
  103. package/dist/packages/custom/src/keymap.js +107 -0
  104. package/dist/packages/custom/src/layout.js +235 -0
  105. package/dist/packages/custom/src/packs.js +633 -0
  106. package/dist/packages/custom/src/rules.js +704 -0
  107. package/dist/packages/custom/src/schema.js +515 -0
  108. package/dist/packages/custom/src/themes.js +176 -0
  109. package/dist/packages/custom/src/widget-html.js +222 -0
  110. package/dist/packages/custom/src/workspace.js +141 -0
  111. package/dist/packages/data/src/analyst-actions.js +133 -0
  112. package/dist/packages/data/src/budget.js +88 -0
  113. package/dist/packages/data/src/cache.js +142 -0
  114. package/dist/packages/data/src/candles.js +168 -0
  115. package/dist/packages/data/src/clock.js +64 -0
  116. package/dist/packages/data/src/credits.js +137 -0
  117. package/dist/packages/data/src/detail.js +97 -0
  118. package/dist/packages/data/src/fast-lane.js +321 -0
  119. package/dist/packages/data/src/fixtures.js +135 -0
  120. package/dist/packages/data/src/health.js +245 -0
  121. package/dist/packages/data/src/http.js +277 -0
  122. package/dist/packages/data/src/images/cache.js +141 -0
  123. package/dist/packages/data/src/images/decode-worker.js +28 -0
  124. package/dist/packages/data/src/images/decode.js +81 -0
  125. package/dist/packages/data/src/images/fetch.js +162 -0
  126. package/dist/packages/data/src/images/gif.js +214 -0
  127. package/dist/packages/data/src/images/index.js +10 -0
  128. package/dist/packages/data/src/images/jpeg.js +544 -0
  129. package/dist/packages/data/src/images/png.js +310 -0
  130. package/dist/packages/data/src/images/service.js +334 -0
  131. package/dist/packages/data/src/images/types.js +27 -0
  132. package/dist/packages/data/src/index.js +208 -0
  133. package/dist/packages/data/src/intel/helius-history.js +59 -0
  134. package/dist/packages/data/src/intel/holder-class.js +125 -0
  135. package/dist/packages/data/src/intel/rules.js +421 -0
  136. package/dist/packages/data/src/intel/scan.js +170 -0
  137. package/dist/packages/data/src/larp/evidence.js +288 -0
  138. package/dist/packages/data/src/larp/links.js +137 -0
  139. package/dist/packages/data/src/larp/robots.js +90 -0
  140. package/dist/packages/data/src/larp/safe-fetch.js +389 -0
  141. package/dist/packages/data/src/limiter.js +341 -0
  142. package/dist/packages/data/src/model.js +12 -0
  143. package/dist/packages/data/src/paper.js +331 -0
  144. package/dist/packages/data/src/rpc-config.js +126 -0
  145. package/dist/packages/data/src/rpc-pool.js +166 -0
  146. package/dist/packages/data/src/social/chain.js +83 -0
  147. package/dist/packages/data/src/social/dedupe.js +205 -0
  148. package/dist/packages/data/src/social/feed.js +462 -0
  149. package/dist/packages/data/src/social/firewall.js +110 -0
  150. package/dist/packages/data/src/social/index.js +11 -0
  151. package/dist/packages/data/src/social/kol.js +269 -0
  152. package/dist/packages/data/src/social/model.js +11 -0
  153. package/dist/packages/data/src/social/rank.js +184 -0
  154. package/dist/packages/data/src/social/rss.js +113 -0
  155. package/dist/packages/data/src/social/summary.js +104 -0
  156. package/dist/packages/data/src/social/venues.js +186 -0
  157. package/dist/packages/data/src/sources/dexscreener.js +170 -0
  158. package/dist/packages/data/src/sources/geckoterminal.js +133 -0
  159. package/dist/packages/data/src/sources/goplus.js +161 -0
  160. package/dist/packages/data/src/sources/jupiter-swap.js +236 -0
  161. package/dist/packages/data/src/sources/jupiter.js +198 -0
  162. package/dist/packages/data/src/sources/pda.js +113 -0
  163. package/dist/packages/data/src/sources/pump-curve.js +58 -0
  164. package/dist/packages/data/src/sources/pumpportal.js +247 -0
  165. package/dist/packages/data/src/sources/rugcheck.js +71 -0
  166. package/dist/packages/data/src/sources/solana-rpc.js +299 -0
  167. package/dist/packages/data/src/sources/solana-ws.js +287 -0
  168. package/dist/packages/data/src/store.js +289 -0
  169. package/dist/packages/data/src/trade/bridge.js +464 -0
  170. package/dist/packages/data/src/trade/caps.js +323 -0
  171. package/dist/packages/data/src/trade/copy/auto.js +385 -0
  172. package/dist/packages/data/src/trade/copy/follows.js +103 -0
  173. package/dist/packages/data/src/trade/copy/index.js +9 -0
  174. package/dist/packages/data/src/trade/copy/mirror.js +91 -0
  175. package/dist/packages/data/src/trade/copy/stats.js +120 -0
  176. package/dist/packages/data/src/trade/copy/tracker.js +158 -0
  177. package/dist/packages/data/src/trade/copy/trades.js +87 -0
  178. package/dist/packages/data/src/trade/copy/types.js +6 -0
  179. package/dist/packages/data/src/trade/executor.js +933 -0
  180. package/dist/packages/data/src/trade/kill-switch.js +47 -0
  181. package/dist/packages/data/src/trade/link-store.js +52 -0
  182. package/dist/packages/data/src/trade/plans/confirm.js +157 -0
  183. package/dist/packages/data/src/trade/plans/engine.js +784 -0
  184. package/dist/packages/data/src/trade/plans/executor-live.js +220 -0
  185. package/dist/packages/data/src/trade/plans/executor-paper.js +44 -0
  186. package/dist/packages/data/src/trade/plans/executor.js +11 -0
  187. package/dist/packages/data/src/trade/plans/index.js +12 -0
  188. package/dist/packages/data/src/trade/plans/journal.js +77 -0
  189. package/dist/packages/data/src/trade/plans/mandate.js +129 -0
  190. package/dist/packages/data/src/trade/plans/plan.js +179 -0
  191. package/dist/packages/data/src/trade/plans/service.js +168 -0
  192. package/dist/packages/data/src/trade/plans/types.js +6 -0
  193. package/dist/packages/data/src/trade/rpc-exec.js +229 -0
  194. package/dist/packages/data/src/trade/signer/client.js +197 -0
  195. package/dist/packages/data/src/trade/signer/fast-wallet.js +154 -0
  196. package/dist/packages/data/src/trade/signer/host.js +97 -0
  197. package/dist/packages/data/src/trade/signer/main.js +121 -0
  198. package/dist/packages/data/src/trade/signer/probe-builder.js +85 -0
  199. package/dist/packages/data/src/trade/signer/protocol.js +92 -0
  200. package/dist/packages/data/src/trade/signer/service.js +400 -0
  201. package/dist/packages/data/src/trade/signer/sol-usd-feed.js +98 -0
  202. package/dist/packages/data/src/trade/sol-usd.js +86 -0
  203. package/dist/packages/data/src/trade/swap-build.js +108 -0
  204. package/dist/packages/data/src/trade/token-delta.js +201 -0
  205. package/dist/packages/data/src/trade/tx-decode.js +632 -0
  206. package/dist/packages/data/src/util.js +24 -0
  207. package/dist/packages/data/src/watchlist.js +176 -0
  208. package/dist/packages/data/src/x/api.js +256 -0
  209. package/dist/packages/data/src/x/budget.js +66 -0
  210. package/dist/packages/data/src/x/config.js +49 -0
  211. package/dist/packages/data/src/x/index.js +10 -0
  212. package/dist/packages/data/src/x/mock-server.js +217 -0
  213. package/dist/packages/data/src/x/oauth.js +242 -0
  214. package/dist/packages/data/src/x/pkce.js +21 -0
  215. package/dist/packages/data/src/x/source.js +285 -0
  216. package/dist/packages/data/src/x/token-store.js +134 -0
  217. package/dist/packages/data/src/x/transport.js +71 -0
  218. package/dist/packages/data/vendor/solana-web3/LICENSE +20 -0
  219. package/dist/packages/data/vendor/solana-web3/NOTICE.md +13 -0
  220. package/dist/packages/data/vendor/solana-web3/index.iife.min.js +20 -0
  221. package/dist/packages/mcp/assets/cases.json +1194 -0
  222. package/dist/packages/mcp/assets/kb/entries/cabal-and-coordinated-launches.md +28 -0
  223. package/dist/packages/mcp/assets/kb/entries/common-rug-patterns.md +40 -0
  224. package/dist/packages/mcp/assets/kb/entries/dbc-mechanics.md +30 -0
  225. package/dist/packages/mcp/assets/kb/entries/dev-wallet-behaviour.md +33 -0
  226. package/dist/packages/mcp/assets/kb/entries/glossary.md +35 -0
  227. package/dist/packages/mcp/assets/kb/entries/holder-concentration.md +30 -0
  228. package/dist/packages/mcp/assets/kb/entries/jito-bundles.md +29 -0
  229. package/dist/packages/mcp/assets/kb/entries/launchlab-curve.md +31 -0
  230. package/dist/packages/mcp/assets/kb/entries/lp-burn-vs-lock.md +31 -0
  231. package/dist/packages/mcp/assets/kb/entries/metadata-and-copycats.md +29 -0
  232. package/dist/packages/mcp/assets/kb/entries/mint-freeze-authority.md +31 -0
  233. package/dist/packages/mcp/assets/kb/entries/narrative-lifecycle.md +32 -0
  234. package/dist/packages/mcp/assets/kb/entries/pump-bonding-curve.md +33 -0
  235. package/dist/packages/mcp/assets/kb/entries/pumpswap-migration.md +29 -0
  236. package/dist/packages/mcp/assets/kb/entries/sniping-and-snipers.md +29 -0
  237. package/dist/packages/mcp/assets/kb/entries/token2022-extensions-risk.md +32 -0
  238. package/dist/packages/mcp/assets/kb/entries/wash-trading-fake-volume.md +33 -0
  239. package/dist/packages/mcp/assets/skills/rug-check.md +52 -0
  240. package/dist/packages/mcp/assets/skills/token-dossier.md +57 -0
  241. package/dist/packages/mcp/assets/skills/trench-scan.md +40 -0
  242. package/dist/packages/mcp/bin/dexterm-mcp.mjs +16 -0
  243. package/dist/packages/mcp/src/dossier.js +78 -0
  244. package/dist/packages/mcp/src/firewall.js +21 -0
  245. package/dist/packages/mcp/src/index.js +22 -0
  246. package/dist/packages/mcp/src/server.js +849 -0
  247. package/dist/packages/mcp/src/user-content.js +434 -0
  248. package/dist/packages/packs/src/backtest.js +183 -0
  249. package/dist/packages/packs/src/digest.js +95 -0
  250. package/dist/packages/packs/src/firewall.js +57 -0
  251. package/dist/packages/packs/src/index.js +19 -0
  252. package/dist/packages/packs/src/larp-eval.js +100 -0
  253. package/dist/packages/packs/src/narrative.js +309 -0
  254. package/dist/packages/packs/src/reason.js +135 -0
  255. package/dist/packages/packs/src/rug-model.js +137 -0
  256. package/dist/packages/packs/src/schema.js +54 -0
  257. package/dist/packages/packs/src/token-dossier.js +174 -0
  258. package/dist/packages/packs/src/verdicts.js +17 -0
  259. package/dist/packages/packs/src/wallet-dossier.js +105 -0
  260. package/dist/packages/popup/src/config.js +71 -0
  261. package/dist/packages/popup/src/dock.js +271 -0
  262. package/dist/packages/popup/src/host.js +210 -0
  263. package/dist/packages/popup/src/index.js +12 -0
  264. package/dist/packages/popup/src/loopback.js +53 -0
  265. package/dist/packages/popup/src/open.js +183 -0
  266. package/dist/packages/popup/src/pages/bubbles-lib.js +160 -0
  267. package/dist/packages/popup/src/pages/bubbles.css +23 -0
  268. package/dist/packages/popup/src/pages/bubbles.html +36 -0
  269. package/dist/packages/popup/src/pages/bubbles.js +214 -0
  270. package/dist/packages/popup/src/pages/chart-lib.js +262 -0
  271. package/dist/packages/popup/src/pages/chart.css +50 -0
  272. package/dist/packages/popup/src/pages/chart.html +56 -0
  273. package/dist/packages/popup/src/pages/chart.js +554 -0
  274. package/dist/packages/popup/src/pages/common.css +34 -0
  275. package/dist/packages/popup/src/pages/common.js +187 -0
  276. package/dist/packages/popup/src/pages/feeds.html +20 -0
  277. package/dist/packages/popup/src/pages/feeds.js +77 -0
  278. package/dist/packages/popup/src/pages/narrative.html +20 -0
  279. package/dist/packages/popup/src/pages/narrative.js +61 -0
  280. package/dist/packages/popup/src/pages/plans.css +30 -0
  281. package/dist/packages/popup/src/pages/plans.html +26 -0
  282. package/dist/packages/popup/src/pages/plans.js +82 -0
  283. package/dist/packages/popup/src/pages/roster.css +41 -0
  284. package/dist/packages/popup/src/pages/roster.html +25 -0
  285. package/dist/packages/popup/src/pages/roster.js +75 -0
  286. package/dist/packages/popup/src/pages/token.html +20 -0
  287. package/dist/packages/popup/src/pages/token.js +112 -0
  288. package/dist/packages/popup/src/pages/widget-sdk.js +224 -0
  289. package/dist/packages/popup/src/pages/widget.css +5 -0
  290. package/dist/packages/popup/src/pages/widget.html +21 -0
  291. package/dist/packages/popup/src/pages/widget.js +85 -0
  292. package/dist/packages/popup/src/protocol.js +31 -0
  293. package/dist/packages/popup/src/selftest.js +156 -0
  294. package/dist/packages/popup/src/server.js +582 -0
  295. package/dist/packages/popup/src/sinkproxy.js +167 -0
  296. package/dist/packages/popup/src/widget-html.js +231 -0
  297. package/dist/packages/popup/vendor/lightweight-charts/LICENSE +201 -0
  298. package/dist/packages/popup/vendor/lightweight-charts/NOTICE +2 -0
  299. package/dist/packages/popup/vendor/lightweight-charts/README.md +30 -0
  300. package/dist/packages/popup/vendor/lightweight-charts/VERSION +1 -0
  301. package/dist/packages/popup/vendor/lightweight-charts/lightweight-charts.standalone.production.js +7 -0
  302. package/dist/packages/recorder/bin/dexterm-recorder.mjs +11 -0
  303. package/dist/packages/recorder/src/cli.js +113 -0
  304. package/dist/packages/recorder/src/export.js +71 -0
  305. package/dist/packages/recorder/src/index.js +20 -0
  306. package/dist/packages/recorder/src/labels.js +151 -0
  307. package/dist/packages/recorder/src/open.js +29 -0
  308. package/dist/packages/recorder/src/recorder.js +553 -0
  309. package/dist/packages/recorder/src/schedule.js +43 -0
  310. package/dist/packages/recorder/src/schema.js +135 -0
  311. package/dist/packages/recorder/src/snapshot.js +191 -0
  312. package/dist/packages/recorder/src/sweep.js +52 -0
  313. package/dist/packages/recorder/src/verdicts.js +52 -0
  314. package/dist/packages/tui/src/bubbles.js +415 -0
  315. package/dist/packages/tui/src/canvas.js +370 -0
  316. package/dist/packages/tui/src/chrome.js +85 -0
  317. package/dist/packages/tui/src/color.js +133 -0
  318. package/dist/packages/tui/src/flush.js +62 -0
  319. package/dist/packages/tui/src/fmt.js +188 -0
  320. package/dist/packages/tui/src/fx-trade.js +278 -0
  321. package/dist/packages/tui/src/fx.js +527 -0
  322. package/dist/packages/tui/src/images/blocks.js +141 -0
  323. package/dist/packages/tui/src/images/coin.js +22 -0
  324. package/dist/packages/tui/src/images/detect.js +140 -0
  325. package/dist/packages/tui/src/images/index.js +7 -0
  326. package/dist/packages/tui/src/images/layer.js +146 -0
  327. package/dist/packages/tui/src/images/pixels.js +157 -0
  328. package/dist/packages/tui/src/images/protocols.js +87 -0
  329. package/dist/packages/tui/src/index.js +15 -0
  330. package/dist/packages/tui/src/keymap.js +355 -0
  331. package/dist/packages/tui/src/layout.js +11 -0
  332. package/dist/packages/tui/src/sound.js +177 -0
  333. package/dist/packages/tui/src/theme.js +182 -0
  334. package/dist/packages/tui/src/widgets.js +598 -0
  335. package/dist/packages/voice/src/controller.js +395 -0
  336. package/dist/packages/voice/src/doctor.js +63 -0
  337. package/dist/packages/voice/src/engines.js +44 -0
  338. package/dist/packages/voice/src/index.js +16 -0
  339. package/dist/packages/voice/src/router.js +502 -0
  340. package/dist/packages/voice/src/stt/apple-helper.swift.js +103 -0
  341. package/dist/packages/voice/src/stt/apple.js +179 -0
  342. package/dist/packages/voice/src/stt/fake.js +34 -0
  343. package/dist/packages/voice/src/stt/whisper.js +102 -0
  344. package/dist/packages/voice/src/summary.js +44 -0
  345. package/dist/packages/voice/src/tts/fake.js +30 -0
  346. package/dist/packages/voice/src/tts/say.js +96 -0
  347. package/dist/packages/voice/src/types.js +3 -0
  348. package/package.json +42 -4
  349. package/README.md +0 -3
@@ -0,0 +1,341 @@
1
+ // Per-bucket rate limiter (SPEC §3.4): a token bucket for smoothness plus a
2
+ // hard sliding-window ceiling so a bucket can never grant more than its budget
3
+ // in any 60 s window, whatever the burst setting. Over-budget callers queue
4
+ // FIFO; nothing is dropped.
5
+ import { systemClock } from "./clock.js";
6
+ const RANK = { idle: 0, low: 1, normal: 2, high: 3 };
7
+ /**
8
+ * A mutable priority shared between a request and whoever coalesced onto it: when a foreground caller
9
+ * joins a background request already queued for the same thing, it raises the ref and the bucket
10
+ * re-sorts its queue, so coalescing can never pin a user-visible fetch behind background priority.
11
+ */
12
+ export class PriorityRef {
13
+ level;
14
+ listeners = new Set();
15
+ constructor(level = 'normal') { this.level = level; }
16
+ /** Raise (never lower) the level; notifies listeners when it changed. */
17
+ raise(level) {
18
+ if (RANK[level] <= RANK[this.level])
19
+ return;
20
+ this.level = level;
21
+ for (const fn of [...this.listeners])
22
+ fn();
23
+ }
24
+ on(fn) { this.listeners.add(fn); return () => { this.listeners.delete(fn); }; }
25
+ }
26
+ /** acquire() at `idle` priority when the bucket is not idle: nothing was sent, try again later. */
27
+ export class RateDeferredError extends Error {
28
+ bucket;
29
+ constructor(bucket) {
30
+ super(`rate bucket ${bucket} busy: idle-priority request deferred`);
31
+ this.name = 'RateDeferredError';
32
+ this.bucket = bucket;
33
+ }
34
+ }
35
+ export const DEFAULT_SAFETY = 0.7;
36
+ export const WINDOW_MS = 60_000;
37
+ /**
38
+ * Documented keyless limits. Buckets, not sources: DexScreener has two
39
+ * classes of endpoint with separate limits; Jupiter Tokens v2 and Price v3
40
+ * share one keyless bucket.
41
+ */
42
+ export const DEFAULT_BUCKETS = {
43
+ // tokens/v1, token-pairs/v1, latest/dex/search, latest/dex/pairs
44
+ dexscreener: { rpm: 300, basis: 'docs.dexscreener.com/api/reference (OpenAPI), SPEC §3.1 S1' },
45
+ // token-profiles, token-boosts, community-takeovers, metas
46
+ 'dexscreener-slow': { rpm: 60, basis: 'docs.dexscreener.com/api/reference, SPEC §3.1 S1' },
47
+ // Tokens v2 + Price v3, keyless 0.5 rps (free key 1 rps). Enforced over a short window:
48
+ // the 2026-10-05 recording saw x-ratelimit-remaining 4..0 then a 429 on the 6th request
49
+ // in ~9 s, so no bursting (1 per ~2.9 s at the 0.7 safety factor = max 4 per 10 s).
50
+ jupiter: { rpm: 30, burst: 1, basis: 'developers.jup.ag/docs/portal/rate-limits, SPEC §3.1 S2/S3; observed 5 per short window' },
51
+ // Keyless public API; competitors file says 30/min, SPEC and GeckoTerminal docs say 10/min: take the lower.
52
+ // task-1323: burst 2 + reserve 1 — the budget is unchanged (7 per 60 s window at 0.7, one refill per
53
+ // ~8.6 s), but background traffic (trades tape, candle refreshes, prefetch) can never take the last
54
+ // token, so the chart the user just asked for goes out at once instead of queueing ~17 s behind them.
55
+ geckoterminal: { rpm: 10, burst: 2, reserve: 1, basis: 'docs/geckoterminal-api/api-page.md, SPEC §3.1 S4' },
56
+ // Undocumented: conservative guesses, tighten when D-06/D-08 land
57
+ rugcheck: { rpm: 10, basis: 'undocumented; conservative guess' },
58
+ // Public mainnet RPC documents 100 req/10 s per IP and 40/10 s per method, but
59
+ // getTokenLargestAccounts is throttled far harder in practice: stay slow, no bursts.
60
+ 'solana-rpc': { rpm: 30, burst: 1, basis: 'public RPC (docs: 100/10 s per IP, 40/10 s per method); conservative, no burst' },
61
+ pumpfun: { rpm: 6, basis: 'undocumented frontend API; conservative guess' },
62
+ // Helius Free: 10 req/s RPC (docs/helius/pricing.md). The credit meter (credits.ts) is the real ceiling.
63
+ helius: { rpm: 600, burst: 5, basis: 'Helius Free plan 10 rps RPC (docs/helius/pricing.md); credits metered separately' },
64
+ // GoPlus keyless Beta: undocumented, inventory 2026-10-06 §5 suggests starting at 30 rpm
65
+ goplus: { rpm: 30, burst: 2, basis: 'undocumented keyless tier; inventory §5 starting point' },
66
+ // task-1330 (I-03): CoinGecko keyless demo tier is 10/min (30/min with a demo key); one call per 60 s cycle.
67
+ coingecko: { rpm: 10, burst: 1, basis: 'CoinGecko public API keyless 10/min (INTEGRATIONS-DESIGN §4, measured 2026-10-09)' },
68
+ // Publishers' RSS: polite polling, one fetch per feed per 10 min; the bucket only guards against a bug.
69
+ 'news-rss': { rpm: 10, burst: 4, basis: 'polite RSS polling (INTEGRATIONS-DESIGN §4: every 10 min, cached)' },
70
+ // task-1357 (I-02): X v2 user-context reads. search/recent is 300 / 15 min PER USER (= 20 rpm), list tweets
71
+ // 900 / 15 min; one conservative bucket, and the adapter also honours every x-rate-limit-* header per endpoint.
72
+ 'x-api': { rpm: 20, burst: 2, basis: 'docs.x.com rate limits: search/recent 300 per 15 min per user (INTEGRATIONS-DESIGN §4)' },
73
+ };
74
+ /** Which bucket each source draws from. */
75
+ export const SOURCE_BUCKET = {
76
+ dexscreener: 'dexscreener',
77
+ 'jupiter-tokens': 'jupiter',
78
+ 'jupiter-price': 'jupiter',
79
+ // Swap *quote* for paper trading (task-1310): same keyless Jupiter bucket as Tokens/Price.
80
+ 'jupiter-swap': 'jupiter',
81
+ geckoterminal: 'geckoterminal',
82
+ rugcheck: 'rugcheck',
83
+ 'solana-rpc': 'solana-rpc',
84
+ pumpfun: 'pumpfun',
85
+ helius: 'helius',
86
+ goplus: 'goplus',
87
+ coingecko: 'coingecko',
88
+ 'news-rss': 'news-rss',
89
+ 'x-api': 'x-api',
90
+ };
91
+ export class TokenBucket {
92
+ name;
93
+ rpmLimit;
94
+ budget; // max grants in any WINDOW_MS window
95
+ capacity;
96
+ /** Tokens / window slots background (low/idle) work must leave untouched (task-1323). */
97
+ reserve;
98
+ refillPerMs;
99
+ tokens;
100
+ lastRefill;
101
+ grants = []; // grant timestamps within the window, ascending
102
+ queue = [];
103
+ pumping = false;
104
+ pausedUntil = 0;
105
+ clock;
106
+ // Cancels the pump()'s pending clock.sleep on close() so a quit while a bucket is parked in a rate
107
+ // wait does not keep the event loop alive for the whole delay (task-1319, QA M1). close() aborts it;
108
+ // so does a higher-priority arrival (task-1323), which makes the pump re-evaluate at once instead of
109
+ // sleeping out a background waiter's longer wait. A normal paced wait stays ref'd.
110
+ sleeper = null;
111
+ closed = false;
112
+ seq = 0;
113
+ onGrant;
114
+ constructor(name, cfg, clock = systemClock) {
115
+ this.name = name;
116
+ this.clock = clock;
117
+ this.rpmLimit = cfg.rpm;
118
+ const safety = cfg.safety ?? DEFAULT_SAFETY;
119
+ if (!(cfg.rpm > 0) || !(safety > 0 && safety <= 1))
120
+ throw new Error(`bad limiter config for ${name}`);
121
+ this.budget = Math.max(1, Math.floor(cfg.rpm * safety));
122
+ this.capacity = Math.max(1, Math.min(this.budget, cfg.burst ?? Math.ceil(this.budget / 10)));
123
+ this.reserve = Math.max(0, Math.min(this.capacity - 1, Math.floor(cfg.reserve ?? 0)));
124
+ this.refillPerMs = this.budget / WINDOW_MS;
125
+ this.tokens = this.capacity;
126
+ this.lastRefill = clock.now();
127
+ }
128
+ /** Grant immediately if allowed (and nobody is queued ahead); never waits. `level` applies the reserve rules. */
129
+ tryAcquire(level = 'normal') {
130
+ const now = this.clock.now();
131
+ if (this.queue.length > 0 || this.delayFor(level, now) > 0)
132
+ return false;
133
+ this.grant(now);
134
+ return true;
135
+ }
136
+ /** Stop granting and wake the pump's pending sleep; queued waiters are rejected (task-1319). */
137
+ close() {
138
+ if (this.closed)
139
+ return;
140
+ this.closed = true;
141
+ this.sleeper?.abort();
142
+ const q = this.queue.splice(0);
143
+ for (const w of q) {
144
+ if (w.signal && w.onAbort)
145
+ w.signal.removeEventListener('abort', w.onAbort);
146
+ w.offRaise?.();
147
+ w.reject(abortError());
148
+ }
149
+ }
150
+ /**
151
+ * Resolve when a request slot is granted. Queues behind earlier callers of the same or higher
152
+ * priority (FIFO within a class). `priority` may be a level or a shared PriorityRef (raised later by
153
+ * a coalescing foreground caller). `idle` never queues: it grants now or rejects with RateDeferredError.
154
+ */
155
+ acquire(signal, priority = 'normal') {
156
+ if (this.closed)
157
+ return Promise.reject(abortError());
158
+ if (signal?.aborted)
159
+ return Promise.reject(abortError());
160
+ const ref = typeof priority === 'string' ? new PriorityRef(priority) : priority;
161
+ if (ref.level === 'idle') {
162
+ return this.tryAcquire('idle') ? Promise.resolve() : Promise.reject(new RateDeferredError(this.name));
163
+ }
164
+ return new Promise((resolve, reject) => {
165
+ const w = { resolve, reject, signal, ref, seq: this.seq++ };
166
+ if (signal) {
167
+ w.onAbort = () => {
168
+ const i = this.queue.indexOf(w);
169
+ if (i >= 0)
170
+ this.queue.splice(i, 1);
171
+ w.offRaise?.();
172
+ reject(abortError());
173
+ };
174
+ signal.addEventListener('abort', w.onAbort, { once: true });
175
+ }
176
+ // A raise while queued (a foreground caller coalesced onto this request) re-sorts the queue.
177
+ w.offRaise = ref.on(() => this.nudge());
178
+ this.queue.push(w);
179
+ this.nudge();
180
+ });
181
+ }
182
+ /** Re-evaluate the queue now: wakes a pump parked on a lower-priority wait, or starts one. */
183
+ nudge() {
184
+ if (this.pumping)
185
+ this.sleeper?.abort();
186
+ else
187
+ void this.pump();
188
+ }
189
+ /** Stop granting for `ms` (e.g. after a 429 / Retry-After). */
190
+ pause(ms) {
191
+ this.pausedUntil = Math.max(this.pausedUntil, this.clock.now() + Math.max(0, ms));
192
+ }
193
+ stats() {
194
+ const now = this.clock.now();
195
+ this.expire(now);
196
+ return {
197
+ bucket: this.name,
198
+ rpmLimit: this.rpmLimit,
199
+ budget: this.budget,
200
+ rpmUsed: this.grants.length,
201
+ queued: this.queue.length,
202
+ pausedUntil: this.pausedUntil > now ? this.pausedUntil : 0,
203
+ };
204
+ }
205
+ /**
206
+ * Milliseconds until a grant at `level` would be allowed (0 = now). high/normal: the plain token +
207
+ * window rule (`delay`). low: additionally keep `reserve` tokens and window slots. idle: the bucket
208
+ * must be full (no recent grants at all) with the window reserve intact.
209
+ */
210
+ delayFor(level, now) {
211
+ let wait = this.delay(now);
212
+ if (level === 'high' || level === 'normal' || this.reserve === 0 && level === 'low')
213
+ return wait;
214
+ const needTokens = level === 'idle' ? this.capacity : 1 + this.reserve;
215
+ if (this.tokens < needTokens)
216
+ wait = Math.max(wait, Math.ceil((needTokens - this.tokens) / this.refillPerMs));
217
+ const maxInWindow = this.budget - this.reserve - (level === 'idle' ? 1 : 0);
218
+ if (maxInWindow <= 0)
219
+ return Number.POSITIVE_INFINITY;
220
+ if (this.grants.length >= maxInWindow) {
221
+ const oldestToExpire = this.grants[this.grants.length - maxInWindow];
222
+ wait = Math.max(wait, oldestToExpire + WINDOW_MS - now);
223
+ }
224
+ return wait > 0 ? Math.ceil(wait) : 0;
225
+ }
226
+ /** Milliseconds until the next grant would be allowed (0 = now). */
227
+ delay(now) {
228
+ this.refill(now);
229
+ this.expire(now);
230
+ let wait = 0;
231
+ if (this.pausedUntil > now)
232
+ wait = Math.max(wait, this.pausedUntil - now);
233
+ if (this.tokens < 1)
234
+ wait = Math.max(wait, (1 - this.tokens) / this.refillPerMs);
235
+ if (this.grants.length >= this.budget)
236
+ wait = Math.max(wait, this.grants[0] + WINDOW_MS - now);
237
+ return wait > 0 ? Math.ceil(wait) : 0;
238
+ }
239
+ async pump() {
240
+ if (this.pumping)
241
+ return;
242
+ this.pumping = true;
243
+ try {
244
+ while (this.queue.length > 0) {
245
+ if (this.closed)
246
+ return;
247
+ const now = this.clock.now();
248
+ // Highest priority first, FIFO within a class (levels are read live: a ref may have been raised).
249
+ let head = 0;
250
+ for (let i = 1; i < this.queue.length; i++) {
251
+ const a = this.queue[i], b = this.queue[head];
252
+ if (RANK[a.ref.level] > RANK[b.ref.level] || (RANK[a.ref.level] === RANK[b.ref.level] && a.seq < b.seq))
253
+ head = i;
254
+ }
255
+ const w = this.queue[head];
256
+ const wait = this.delayFor(w.ref.level, now);
257
+ if (wait > 0) {
258
+ // close() or a higher-priority arrival aborts this, so quit never waits it out and a
259
+ // foreground request never sleeps out a background waiter's (longer) reserve wait.
260
+ this.sleeper = new AbortController();
261
+ await this.clock.sleep(Number.isFinite(wait) ? wait : WINDOW_MS, this.sleeper.signal);
262
+ this.sleeper = null;
263
+ if (this.closed)
264
+ return;
265
+ continue;
266
+ }
267
+ this.queue.splice(head, 1);
268
+ if (w.signal && w.onAbort)
269
+ w.signal.removeEventListener('abort', w.onAbort);
270
+ w.offRaise?.();
271
+ this.grant(now);
272
+ w.resolve();
273
+ }
274
+ }
275
+ finally {
276
+ this.pumping = false;
277
+ }
278
+ }
279
+ grant(now) {
280
+ this.tokens -= 1;
281
+ this.grants.push(now);
282
+ this.onGrant?.(now);
283
+ }
284
+ refill(now) {
285
+ if (now > this.lastRefill) {
286
+ this.tokens = Math.min(this.capacity, this.tokens + (now - this.lastRefill) * this.refillPerMs);
287
+ this.lastRefill = now;
288
+ }
289
+ }
290
+ expire(now) {
291
+ let i = 0;
292
+ while (i < this.grants.length && this.grants[i] + WINDOW_MS <= now)
293
+ i++;
294
+ if (i > 0)
295
+ this.grants.splice(0, i);
296
+ }
297
+ }
298
+ export class RateLimiter {
299
+ buckets = new Map();
300
+ clock;
301
+ constructor(configs = DEFAULT_BUCKETS, clock = systemClock, safety) {
302
+ this.clock = clock;
303
+ for (const [name, cfg] of Object.entries(configs)) {
304
+ this.buckets.set(name, new TokenBucket(name, safety === undefined ? cfg : { ...cfg, safety: cfg.safety ?? safety }, clock));
305
+ }
306
+ }
307
+ bucket(name) {
308
+ const b = this.buckets.get(name);
309
+ if (!b)
310
+ throw new Error(`unknown rate-limit bucket: ${name}`);
311
+ return b;
312
+ }
313
+ /** Create a bucket on demand (idempotent); used by the RPC pool to give each endpoint its own budget. */
314
+ ensureBucket(name, cfg) {
315
+ let b = this.buckets.get(name);
316
+ if (!b) {
317
+ b = new TokenBucket(name, cfg, this.clock);
318
+ this.buckets.set(name, b);
319
+ }
320
+ return b;
321
+ }
322
+ acquire(name, signal, priority) {
323
+ return this.bucket(name).acquire(signal, priority);
324
+ }
325
+ pause(name, ms) {
326
+ this.bucket(name).pause(ms);
327
+ }
328
+ /** Close every bucket: wake pending rate-waits and reject queued acquires so a quit exits at once. */
329
+ close() {
330
+ for (const b of this.buckets.values())
331
+ b.close();
332
+ }
333
+ stats() {
334
+ return [...this.buckets.values()].map((b) => b.stats());
335
+ }
336
+ }
337
+ function abortError() {
338
+ const e = new Error('rate-limit wait aborted');
339
+ e.name = 'AbortError';
340
+ return e;
341
+ }
@@ -0,0 +1,12 @@
1
+ // @dexterm/data — normalized model shared by the TUI, the data layer and the MCP server.
2
+ // Source of truth: SPEC.md §3.3 "Normalized model". Agreed on day 1 between lane A (tui)
3
+ // and lane B (data). Changes to this file need a note in the handoff of whoever changes it.
4
+ //
5
+ // Conventions
6
+ // - All timestamps are epoch milliseconds (number). `null` means "source did not say".
7
+ // - Money is USD as a plain number; prices keep full precision (the UI compresses zeros).
8
+ // - Every record carries `source` and `fetchedAt` (Provenance) so the UI and the AI can say
9
+ // where a number came from and how old it is.
10
+ // - Plain interfaces and type aliases only (no enums/classes) so Node can run the sources
11
+ // with type stripping and the JSON shapes stay serialisable for the MCP tools.
12
+ export {};