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,289 @@
1
+ // Store: per-mint cached enrichment (DexScreener pair + Jupiter token/stats/audit
2
+ // + optional Jupiter price) and preset discovery feeds. Sources are fetched in
3
+ // parallel; a failed or degraded source degrades rows instead of failing them,
4
+ // and stale cache entries are served (flagged) when a refresh fails.
5
+ import { TTL } from "./cache.js";
6
+ /** Max ratio between DexScreener and Jupiter market caps for them to count as agreeing. */
7
+ export const MCAP_AGREE_RATIO = 5;
8
+ /**
9
+ * MCAP rule (D-02 open decision, resolved in D-06): DexScreener's pair `marketCap`
10
+ * (or `fdv` when absent) can reflect only the Solana-side supply of bridged/wrapped
11
+ * tokens. Take the larger of DexScreener and Jupiter `mcap` when they agree within
12
+ * 5x; otherwise keep DexScreener's number and flag the row. One side only: use it.
13
+ */
14
+ export function resolveMcap(ds, jupMcap) {
15
+ const d = ds ? (ds.mcap ?? ds.fdv) : null;
16
+ const j = jupMcap ?? null;
17
+ const pos = (n) => n !== null && Number.isFinite(n) && n > 0;
18
+ if (pos(d) && pos(j)) {
19
+ const ratio = Math.max(d, j) / Math.min(d, j);
20
+ if (ratio <= MCAP_AGREE_RATIO) {
21
+ return j > d ? { value: j, basis: 'jupiter', flagged: false, dexscreener: d, jupiter: j } : { value: d, basis: 'dexscreener', flagged: false, dexscreener: d, jupiter: j };
22
+ }
23
+ return { value: d, basis: 'dexscreener', flagged: true, dexscreener: d, jupiter: j };
24
+ }
25
+ if (pos(d))
26
+ return { value: d, basis: 'dexscreener', flagged: false, dexscreener: d, jupiter: j };
27
+ if (pos(j))
28
+ return { value: j, basis: 'jupiter', flagged: false, dexscreener: d, jupiter: j };
29
+ return { value: null, basis: null, flagged: false, dexscreener: d, jupiter: j };
30
+ }
31
+ const NS = { ds: 'ds:token', jup: 'jup:token', price: 'jup:price', list: 'list' };
32
+ export class Store {
33
+ cache;
34
+ ds;
35
+ jup;
36
+ /** Observation hook (task-1329); null = nobody listening. */
37
+ listener = null;
38
+ constructor(deps) {
39
+ this.cache = deps.cache;
40
+ this.ds = deps.dexscreener;
41
+ this.jup = deps.jupiter;
42
+ }
43
+ emitEnrich(rows, fetched) {
44
+ const l = this.listener;
45
+ if (!l?.onEnrich || rows.length === 0)
46
+ return;
47
+ try {
48
+ l.onEnrich({ rows, t: Date.now(), fetched });
49
+ }
50
+ catch { /* a listener never breaks a refresh */ }
51
+ }
52
+ emitDiscover(ev) {
53
+ const l = this.listener;
54
+ if (!l?.onDiscover)
55
+ return;
56
+ try {
57
+ l.onDiscover(ev);
58
+ }
59
+ catch { /* a listener never breaks a refresh */ }
60
+ }
61
+ /**
62
+ * `jup: 'cache'` (task-1323) serves the Jupiter token records from the cache only (fresh or stale) and
63
+ * never queues a Jupiter search: the first screener paint must not wait behind the keyless Jupiter
64
+ * bucket (one call per ~2.9 s, 429-prone). Jupiter list calls seed exactly those records, so rows from
65
+ * a Jupiter list stay fully enriched; others paint DexScreener-only and fill in on the next pass.
66
+ */
67
+ async enrich(mints, opts = {}) {
68
+ const unique = [...new Set(mints)];
69
+ const jupCacheOnly = opts.jup === 'cache';
70
+ const [ds, jup, price] = await Promise.all([
71
+ this.lookup(NS.ds, unique, TTL.pairs, 'dexscreener', (m) => this.ds.tokens(m)),
72
+ jupCacheOnly ? Promise.resolve(this.cached(NS.jup, unique)) : this.lookup(NS.jup, unique, TTL.enrichment, 'jupiter-tokens', async (m) => {
73
+ const views = await this.jup.search(m);
74
+ return new Map(views.map((v) => [v.token.mint, v]));
75
+ }),
76
+ opts.price
77
+ ? this.lookup(NS.price, unique, TTL.price, 'jupiter-price', (m) => this.jup.price(m))
78
+ : Promise.resolve({ values: new Map(), stale: new Set() }),
79
+ ]);
80
+ const rows = [];
81
+ const missing = [];
82
+ for (const mint of unique) {
83
+ const d = ds.values.get(mint);
84
+ const j = jup.values.get(mint);
85
+ const p = price.values.get(mint);
86
+ const pair = d?.pair ?? j?.pair;
87
+ if (!pair || (!d && !j)) {
88
+ missing.push(mint);
89
+ continue;
90
+ }
91
+ const sources = [];
92
+ if (d)
93
+ sources.push('dexscreener');
94
+ if (j)
95
+ sources.push('jupiter-tokens');
96
+ if (p)
97
+ sources.push('jupiter-price');
98
+ rows.push({
99
+ mint,
100
+ token: mergeToken(d?.token, j?.token),
101
+ pair,
102
+ stats: j?.stats,
103
+ audit: j?.audit,
104
+ price: p,
105
+ sources,
106
+ stale: ds.stale.has(mint) || jup.stale.has(mint) || price.stale.has(mint),
107
+ mcap: resolveMcap(d?.pair, j?.pair.mcap),
108
+ });
109
+ }
110
+ const latencyMs = {};
111
+ const errors = {};
112
+ const per = [['dexscreener', ds], ['jupiter-tokens', jup], ['jupiter-price', price]];
113
+ for (const [s, l] of per) {
114
+ if (l.latencyMs !== undefined)
115
+ latencyMs[s] = l.latencyMs;
116
+ if (l.error)
117
+ errors[s] = l.error;
118
+ }
119
+ this.emitEnrich(rows, Object.keys(latencyMs).length > 0);
120
+ return { rows, missing, latencyMs, errors };
121
+ }
122
+ /**
123
+ * Mints for a preset feed (SPEC §4.2). Two sizes:
124
+ * - default (`opts.max` unset): the compact feed (one or two lists), capped at `limit` — the
125
+ * historical behaviour the MCP tool and the recording scripts rely on.
126
+ * - pool mode (`opts.max` set, task-1303): a much wider candidate net — Jupiter
127
+ * toptrending/toporganicscore/toptraded across 5m/1h/24h (up to `limit` each, keyless pacing)
128
+ * plus DexScreener boosts (top + latest) and the latest token profiles — de-duplicated by mint
129
+ * and capped at `opts.max`. This is how the screener fills hundreds of rows.
130
+ */
131
+ async discover(preset, limit = 30, opts = {}) {
132
+ const pool = opts.max !== undefined;
133
+ const max = opts.max ?? limit;
134
+ const feeds = this.discoverFeeds(preset, limit, pool);
135
+ const errors = {};
136
+ const lists = await Promise.all(feeds.map(async (f) => {
137
+ try {
138
+ const r = await this.cache.fetch(NS.list, f.name, f.load, { ttlMs: TTL.lists, source: f.source, swr: false });
139
+ return r.value;
140
+ }
141
+ catch (err) {
142
+ errors[f.source] = errMsg(err);
143
+ return [];
144
+ }
145
+ }));
146
+ this.emitDiscover({ preset, pool, t: Date.now(), feeds: feeds.map((f, i) => ({ name: f.name, source: f.source, mints: lists[i] })) });
147
+ // Interleave feeds so every source is represented near the top.
148
+ const origin = {};
149
+ const mints = [];
150
+ const longest = Math.max(0, ...lists.map((l) => l.length));
151
+ for (let i = 0; i < longest && mints.length < max; i++) {
152
+ for (let f = 0; f < lists.length && mints.length < max; f++) {
153
+ const m = lists[f][i];
154
+ if (!m)
155
+ continue;
156
+ (origin[m] ??= []).push(feeds[f].name);
157
+ if (origin[m].length === 1)
158
+ mints.push(m);
159
+ }
160
+ }
161
+ return { mints, origin, errors };
162
+ }
163
+ /** The discovery sub-feeds for a preset. Compact by default; a wide net in pool mode (task-1303). */
164
+ discoverFeeds(preset, limit, pool) {
165
+ const feeds = [];
166
+ const jupCat = (cat, iv) => feeds.push({ name: `jup:${cat}-${iv}`, source: 'jupiter-tokens', load: () => this.jupList(() => this.jup.category(cat, iv, limit)) });
167
+ if (preset === 'trending') {
168
+ // Compact order is load-bearing: recordings/replays enrich exactly this mint set (do not reorder).
169
+ feeds.push({ name: 'ds:boosts-top', source: 'dexscreener', load: async () => (await this.ds.boostsTop()).map((b) => b.mint) });
170
+ feeds.push({ name: 'jup:toptrending-1h', source: 'jupiter-tokens', load: () => this.jupList(() => this.jup.category('toptrending', '1h', limit)) });
171
+ if (pool) {
172
+ jupCat('toptrending', '24h');
173
+ jupCat('toptraded', '24h');
174
+ jupCat('toptrending', '5m');
175
+ feeds.push({ name: 'ds:boosts-latest', source: 'dexscreener', load: async () => (await this.ds.boostsLatest()).map((b) => b.mint) });
176
+ feeds.push({ name: 'ds:profiles-latest', source: 'dexscreener', load: () => this.ds.profilesLatest() });
177
+ }
178
+ }
179
+ else if (preset === 'organic') {
180
+ feeds.push({ name: 'jup:toporganicscore-1h', source: 'jupiter-tokens', load: () => this.jupList(() => this.jup.category('toporganicscore', '1h', limit)) });
181
+ if (pool) {
182
+ jupCat('toporganicscore', '24h');
183
+ jupCat('toporganicscore', '5m');
184
+ }
185
+ }
186
+ else if (preset === 'traded') {
187
+ // Top-traded by volume (task-1303): the 'top traded' feed switcher entry.
188
+ feeds.push({ name: 'jup:toptraded-1h', source: 'jupiter-tokens', load: () => this.jupList(() => this.jup.category('toptraded', '1h', limit)) });
189
+ if (pool) {
190
+ jupCat('toptraded', '24h');
191
+ jupCat('toptraded', '5m');
192
+ jupCat('toptrending', '1h');
193
+ }
194
+ }
195
+ else if (preset === 'boosted') {
196
+ // Paid-boosted + freshly-listed tokens (task-1303): the 'boosted' feed switcher entry (DexScreener only).
197
+ feeds.push({ name: 'ds:boosts-top', source: 'dexscreener', load: async () => (await this.ds.boostsTop()).map((b) => b.mint) });
198
+ if (pool) {
199
+ feeds.push({ name: 'ds:boosts-latest', source: 'dexscreener', load: async () => (await this.ds.boostsLatest()).map((b) => b.mint) });
200
+ feeds.push({ name: 'ds:profiles-latest', source: 'dexscreener', load: () => this.ds.profilesLatest() });
201
+ }
202
+ }
203
+ else {
204
+ feeds.push({ name: 'jup:recent', source: 'jupiter-tokens', load: () => this.jupList(() => this.jup.recent()) });
205
+ if (pool) {
206
+ jupCat('toptrending', '5m');
207
+ feeds.push({ name: 'ds:profiles-latest', source: 'dexscreener', load: () => this.ds.profilesLatest() });
208
+ }
209
+ }
210
+ return feeds;
211
+ }
212
+ /** Jupiter list endpoints return full token records: seed the enrichment cache from them. */
213
+ async jupList(load) {
214
+ const views = await load();
215
+ for (const v of views)
216
+ this.cache.set(NS.jup, v.token.mint, v, { ttlMs: TTL.enrichment, source: 'jupiter-tokens', fetchedAt: v.token.fetchedAt });
217
+ return views.map((v) => v.token.mint);
218
+ }
219
+ /** Cache-only lookup: fresh and stale hits, no network (stale ones flagged like a failed refresh). */
220
+ cached(ns, mints) {
221
+ const out = { values: new Map(), stale: new Set() };
222
+ for (const m of mints) {
223
+ const hit = this.cache.get(ns, m);
224
+ if (!hit)
225
+ continue;
226
+ out.values.set(m, hit.value);
227
+ if (hit.stale)
228
+ out.stale.add(m);
229
+ }
230
+ return out;
231
+ }
232
+ async lookup(ns, mints, ttlMs, source, fetchMany) {
233
+ const values = new Map();
234
+ const staleHits = new Map();
235
+ const need = [];
236
+ for (const m of mints) {
237
+ const hit = this.cache.get(ns, m);
238
+ if (hit && !hit.stale)
239
+ values.set(m, hit.value);
240
+ else {
241
+ if (hit)
242
+ staleHits.set(m, hit.value);
243
+ need.push(m);
244
+ }
245
+ }
246
+ const out = { values, stale: new Set() };
247
+ if (need.length === 0)
248
+ return out;
249
+ const t0 = performance.now();
250
+ try {
251
+ const fetched = await fetchMany(need);
252
+ out.latencyMs = Math.round(performance.now() - t0);
253
+ for (const [m, v] of fetched) {
254
+ this.cache.set(ns, m, v, { ttlMs, source });
255
+ values.set(m, v);
256
+ }
257
+ }
258
+ catch (err) {
259
+ out.error = errMsg(err);
260
+ for (const [m, v] of staleHits) {
261
+ values.set(m, v);
262
+ out.stale.add(m);
263
+ }
264
+ }
265
+ return out;
266
+ }
267
+ }
268
+ /**
269
+ * Jupiter is preferred for identity fields (decimals, launchpad, verification); DexScreener fills gaps.
270
+ * The image is the exception (task-1326): DexScreener's CDN rendition first (small, transcoded, served from
271
+ * one reliable host), Jupiter's icon only when DexScreener has none — Jupiter icons are usually raw IPFS
272
+ * gateway links (the main public IPFS gateway answered 429 for 16 of 40 in the task-1326 live run).
273
+ */
274
+ export function mergeToken(ds, jup) {
275
+ if (!jup)
276
+ return ds;
277
+ if (!ds)
278
+ return jup;
279
+ return {
280
+ ...jup,
281
+ launchpad: jup.launchpad !== 'unknown' ? jup.launchpad : ds.launchpad,
282
+ createdAt: jup.createdAt ?? ds.createdAt,
283
+ image: ds.image ?? jup.image,
284
+ socials: { x: jup.socials.x ?? ds.socials.x, tg: jup.socials.tg ?? ds.socials.tg, web: jup.socials.web ?? ds.socials.web },
285
+ };
286
+ }
287
+ function errMsg(err) {
288
+ return err instanceof Error ? err.message : String(err);
289
+ }