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,113 @@
1
+ // `dexterm recorder <cmd>` / `dexterm-recorder <cmd>`: stats, label, prune, export. No network.
2
+ import { writeFileSync } from 'node:fs';
3
+ import { defaultDbPath } from '../../data/src/index.js';
4
+ import { Recorder } from "./recorder.js";
5
+ import { exportRecorded } from "./export.js";
6
+ export const RECORDER_HELP = `dexterm recorder: the history recorder's tables (snapshots, feed membership, outcomes)
7
+
8
+ dexterm recorder stats [--db PATH] rows, labels, bytes per snapshot, DB size
9
+ dexterm recorder label [--db PATH] label every due t0 anchor now (code only, no model)
10
+ dexterm recorder prune [--db PATH] run retention now (raw 7 d, 1/min after 24 h, columns 90 d)
11
+ dexterm recorder export [--db PATH] [--out FILE] [--since T] [--until T] [--labelled-only] [--limit N]
12
+ eval export (T = ISO date or unix ms); stdout without --out
13
+
14
+ --db defaults to DEXTERM_DB_PATH, else ~/.local/share/dexterm/dexterm.db. The recorder itself runs
15
+ inside the live app; switch it off with --no-recorder or DEXTERM_RECORDER=0.`;
16
+ function parse(argv) {
17
+ const opts = {};
18
+ let cmd = '';
19
+ for (let i = 0; i < argv.length; i++) {
20
+ const a = argv[i];
21
+ if (a.startsWith('--')) {
22
+ const k = a.slice(2);
23
+ const v = argv[i + 1];
24
+ if (v !== undefined && !v.startsWith('--') && k !== 'labelled-only') {
25
+ opts[k] = v;
26
+ i++;
27
+ }
28
+ else
29
+ opts[k] = true;
30
+ }
31
+ else if (!cmd)
32
+ cmd = a;
33
+ }
34
+ return { cmd, opts };
35
+ }
36
+ function time(v) {
37
+ if (v === undefined || v === true)
38
+ return undefined;
39
+ const n = Number(v);
40
+ if (Number.isFinite(n))
41
+ return n;
42
+ const t = Date.parse(v);
43
+ if (!Number.isFinite(t))
44
+ throw new Error(`bad time ${JSON.stringify(v)} (ISO date or unix ms)`);
45
+ return t;
46
+ }
47
+ export async function recorderCli(argv, io) {
48
+ const { cmd, opts } = parse(argv);
49
+ if (!cmd || cmd === 'help' || opts.help || opts.h) {
50
+ io.stdout.write(RECORDER_HELP + '\n');
51
+ return cmd ? 0 : 2;
52
+ }
53
+ const path = typeof opts.db === 'string' ? opts.db : (io.env.DEXTERM_DB_PATH || defaultDbPath(io.env));
54
+ if (path === ':memory:') {
55
+ io.stderr.write('dexterm recorder: an in-memory DB has no history\n');
56
+ return 2;
57
+ }
58
+ let rec = null;
59
+ try {
60
+ rec = new Recorder({ path });
61
+ if (cmd === 'stats') {
62
+ const s = rec.stats();
63
+ const mb = (b) => (b === null ? '—' : `${(b / 1e6).toFixed(1)} MB`);
64
+ const when = (t) => (t === null ? '—' : new Date(t).toISOString());
65
+ io.stdout.write([
66
+ `db ${path} (${mb(s.dbBytes)}, every table)`,
67
+ `recorder bytes ${s.recorderBytes === null ? '—' : s.recorderBytes} (${mb(s.recorderBytes)}, its own tables + indexes)`,
68
+ `schema v${s.schemaVersion} · labeler ${s.labelerVersion}`,
69
+ `snapshots ${s.snapshots} (live ${s.live}, sweep ${s.sweep}, t0 anchors ${s.t0}, with raw JSON ${s.withRaw})`,
70
+ `bytes/snapshot ${s.bytesPerSnapshot === null ? '—' : s.bytesPerSnapshot.toFixed(0)}`,
71
+ `mints ${s.mints}`,
72
+ `feed_members ${s.feedMembers}`,
73
+ `outcomes ${s.outcomes}${s.outcomes ? ' (' + Object.entries(s.outcomesByLabel).map(([k, v]) => `${k} ${v}`).join(', ') + ')' : ''}`,
74
+ `sweeps ${s.sweeps} runs · ${s.sweepCallsToday} DexScreener calls today`,
75
+ `span ${when(s.oldestT)} → ${when(s.newestT)}`,
76
+ ].join('\n') + '\n');
77
+ return 0;
78
+ }
79
+ if (cmd === 'label') {
80
+ const r = rec.labelPending(Date.now(), 1_000_000);
81
+ io.stdout.write(`labelled ${r.labelled} (${Object.entries(r.counts).map(([k, v]) => `${k} ${v}`).join(', ') || 'nothing due'}); ${r.pending} t0 rows still open\n`);
82
+ return 0;
83
+ }
84
+ if (cmd === 'prune') {
85
+ const r = rec.prune();
86
+ io.stdout.write(`raw cleared ${r.rawCleared} · downsampled ${r.downsampled} · expired ${r.expired} snapshots, ${r.membersExpired} feed rows\n`);
87
+ return 0;
88
+ }
89
+ if (cmd === 'export') {
90
+ const doc = exportRecorded(rec.database, {
91
+ since: time(opts.since), until: time(opts.until), labelledOnly: opts['labelled-only'] === true,
92
+ limit: typeof opts.limit === 'string' ? Number(opts.limit) : undefined,
93
+ });
94
+ const text = JSON.stringify(doc, null, 1);
95
+ if (typeof opts.out === 'string') {
96
+ writeFileSync(opts.out, text);
97
+ io.stderr.write(`wrote ${opts.out}: ${doc.counts.records} records, ${doc.counts.with_any_outcome} with outcomes\n`);
98
+ }
99
+ else
100
+ io.stdout.write(text + '\n');
101
+ return 0;
102
+ }
103
+ io.stderr.write(`dexterm recorder: unknown command ${cmd}\n${RECORDER_HELP}\n`);
104
+ return 2;
105
+ }
106
+ catch (err) {
107
+ io.stderr.write(`dexterm recorder: ${err instanceof Error ? err.message : String(err)}\n`);
108
+ return 1;
109
+ }
110
+ finally {
111
+ rec?.close();
112
+ }
113
+ }
@@ -0,0 +1,71 @@
1
+ // Export for the eval / backtest harness (AI-SUITE-DESIGN §4.1 "export": `eval/recorded.json`). One
2
+ // record per t0 anchor: the t0 features exactly as the user would have seen them (no later column),
3
+ // the feeds that surfaced the mint in the hour before t0, and the outcome per horizon. Leakage rule
4
+ // printed in the document: features are from t0 only; labels are after t0.
5
+ import { HORIZONS_SEC } from "./schema.js";
6
+ import { COLUMN_NAMES } from "./snapshot.js";
7
+ import { LABELER_VERSION, isPositive } from "./labels.js";
8
+ export const EXPORT_SCHEMA = 'dexterm-recorder-export/1';
9
+ const FEATURES = COLUMN_NAMES.filter((c) => c !== 'mint');
10
+ export function exportRecorded(db, opts = {}, now = Date.now()) {
11
+ const where = ['is_t0 = 1'];
12
+ const args = [];
13
+ if (opts.since !== undefined) {
14
+ where.push('t >= ?');
15
+ args.push(opts.since);
16
+ }
17
+ if (opts.until !== undefined) {
18
+ where.push('t < ?');
19
+ args.push(opts.until);
20
+ }
21
+ const limit = opts.limit !== undefined ? ` LIMIT ${Math.max(0, Math.floor(opts.limit))}` : '';
22
+ const order = opts.limit !== undefined ? 'DESC' : 'ASC';
23
+ const t0s = db.prepare(`SELECT snap_id, t, ${COLUMN_NAMES.join(', ')} FROM token_snapshots WHERE ${where.join(' AND ')} ORDER BY t ${order}${limit}`).all(...args);
24
+ const feedsStmt = db.prepare('SELECT DISTINCT feed FROM feed_members WHERE mint = ? AND t > ? AND t <= ? ORDER BY feed');
25
+ const firstStmt = db.prepare('SELECT first_t FROM mints WHERE mint = ?');
26
+ const outStmt = db.prepare('SELECT horizon_sec, t1, label, label_tier, mcap_ratio, liq_ratio, price_ratio, max_mcap_ratio FROM outcomes WHERE mint = ? AND t0 = ?');
27
+ const records = [];
28
+ const byLabel = {};
29
+ let withAny = 0;
30
+ for (const r of t0s) {
31
+ const mint = String(r.mint);
32
+ const t0 = Number(r.t);
33
+ const outcomes = {};
34
+ const rows = outStmt.all(mint, t0);
35
+ for (const o of rows) {
36
+ outcomes[`${Number(o.horizon_sec)}`] = {
37
+ label: o.label, tier: o.label_tier, t1: o.t1 === null ? null : Number(o.t1),
38
+ mcap_ratio: o.mcap_ratio, liq_ratio: o.liq_ratio, price_ratio: o.price_ratio, max_mcap_ratio: o.max_mcap_ratio,
39
+ positive: isPositive(o.label, o.label_tier),
40
+ };
41
+ byLabel[o.label] = (byLabel[o.label] ?? 0) + 1;
42
+ }
43
+ if (rows.length)
44
+ withAny++;
45
+ else if (opts.labelledOnly)
46
+ continue;
47
+ const features = {};
48
+ for (const c of FEATURES)
49
+ features[c] = r[c] ?? null;
50
+ const first = firstStmt.get(mint);
51
+ records.push({
52
+ mint, t0,
53
+ known_sec: first ? Math.max(0, Math.round((t0 - Number(first.first_t)) / 1000)) : 0,
54
+ feeds: feedsStmt.all(mint, t0 - 3_600_000, t0).map((f) => f.feed),
55
+ features,
56
+ outcomes,
57
+ });
58
+ }
59
+ if (order === 'DESC')
60
+ records.reverse();
61
+ return {
62
+ schema: EXPORT_SCHEMA,
63
+ exported_at: new Date(now).toISOString(),
64
+ labeler_version: LABELER_VERSION,
65
+ data_tier: 'keyless-proxy',
66
+ leakage_rule: 'features are the t0 row only (the row the user saw); every outcome is computed from observations strictly after t0; the universe at t is every mint recorded at or before t, dead ones included',
67
+ horizons_sec: [...HORIZONS_SEC],
68
+ counts: { records: records.length, with_any_outcome: withAny, by_label: byLabel },
69
+ records,
70
+ };
71
+ }
@@ -0,0 +1,20 @@
1
+ // @dexterm/recorder public surface (lane R-01).
2
+ export * from "./schema.js";
3
+ export * from "./snapshot.js";
4
+ export * from "./labels.js";
5
+ export * from "./sweep.js";
6
+ export * from "./recorder.js";
7
+ export * from "./export.js";
8
+ export * from "./open.js";
9
+ export * from "./verdicts.js";
10
+ export * from "./schedule.js";
11
+ export { recorderCli, RECORDER_HELP } from "./cli.js";
12
+ /** `--no-recorder` / `DEXTERM_RECORDER=0` resolution: the recorder is on in live mode unless either says no. */
13
+ export function recorderEnabled(env, flagOff) {
14
+ if (flagOff)
15
+ return false;
16
+ const v = env.DEXTERM_RECORDER;
17
+ if (v === undefined || v === '')
18
+ return true;
19
+ return !(v === '0' || v.toLowerCase() === 'off' || v.toLowerCase() === 'false' || v.toLowerCase() === 'no');
20
+ }
@@ -0,0 +1,151 @@
1
+ // Outcome labeler (lane R-01): a port of dexterm/research/task-1287/recorder/labels.mjs. Deterministic,
2
+ // code only, never a model (CLAUDE-LAYER §7 circularity rule). Rules: research/task-1287/recorder/labels.md
3
+ // (v0.1) plus the two v0.2 additions BACKTEST.md §3/§4 proposed after the t1 sweep:
4
+ // D2 curve-dead a bonding-curve launch whose t1 shows liquidity <= $100 and vol_h1 < $100 is `dead`
5
+ // regardless of market source and mcap ratio (a never-traded curve keeps its mcap pinned
6
+ // at the floor, so no ratio rule can see it);
7
+ // source rule t0 without a pair (market source = Jupiter) and t1 with a DexScreener pair is no
8
+ // longer `unobserved`: ratios are computed across sources but the evidence says so
9
+ // (`cross_source: true`). Non-curve tokens keep the strict same-source rule.
10
+ // `version: '0.1'` reproduces the prototype byte for byte (the test replays its 178 labels).
11
+ export const LABELER_VERSION = '0.2.0';
12
+ export const HORIZONS = [3600, 7200, 21600, 86400, 259200];
13
+ /**
14
+ * Launchpads (the data layer's normalised `Launchpad`) whose tokens start on a bonding curve with no
15
+ * pool until migration: pump.fun, bonk (letsbonk), Meteora DBC, and Raydium LaunchLab (`raydium`).
16
+ */
17
+ export const CURVE_LAUNCHPADS = new Set(['pump.fun', 'bonk', 'dbc', 'raydium']);
18
+ /** Thresholds (labels.md). */
19
+ export const RULES = {
20
+ rugMinLiqT0: 5000,
21
+ rugLiqRatio: 0.10,
22
+ rugPriceRatio: 0.50,
23
+ deadMcapRatio: 0.20,
24
+ deadVolH1: 500,
25
+ fadeMcapRatio: 0.50,
26
+ runnerRatio: 2.0,
27
+ curveDeadLiq: 100,
28
+ curveDeadVolH1: 100,
29
+ };
30
+ const ratio = (a, b) => (a === null || b === null || !b ? null : a / b);
31
+ /**
32
+ * Label one (t0, observations) pair. `obs` are the observations after t0 for the same mint, ascending
33
+ * by t; the LAST one is t1 (the caller picks the window). Returns null for an empty `obs`.
34
+ * This is the prototype's `label()` with the horizon bucketed from Δt (for the replay test); the app
35
+ * calls `labelAtHorizon` which fixes the horizon and passes the right window.
36
+ */
37
+ export function label(t0, obs, opts = {}) {
38
+ if (!obs.length)
39
+ return null;
40
+ const t1 = obs[obs.length - 1];
41
+ const dt = Math.round((t1.t - t0.t) / 1000);
42
+ const horizon = [...HORIZONS].reverse().find((h) => dt >= h) ?? null;
43
+ const minDt = opts.minDtSec ?? 3000;
44
+ if (horizon === null || dt < minDt)
45
+ return classify(t0, obs, 0, opts, 'below-min-horizon');
46
+ return classify(t0, obs, horizon, opts);
47
+ }
48
+ const isJup = (s) => !!s && s.startsWith('jupiter');
49
+ /**
50
+ * Label a t0 row at a fixed horizon: `obs` = observations in (t0, t1] with t1 the first observation at or
51
+ * after t0 + horizon (the caller enforces the ≤ 2x window). An empty `obs` means the window closed with
52
+ * nothing seen → `unobserved` with t1 = null.
53
+ */
54
+ export function labelAtHorizon(t0, obs, horizonSec, opts = {}) {
55
+ if (!obs.length)
56
+ return outcome(t0, null, horizonSec, 'unobserved', null, null, null, null, { reason: 'no-observation-in-window' }, opts);
57
+ return classify(t0, obs, horizonSec, opts);
58
+ }
59
+ function classify(t0, obs, horizon, opts, forceUnobserved) {
60
+ const rules = opts.rules ?? '0.2';
61
+ const t1 = obs[obs.length - 1];
62
+ const dt = Math.round((t1.t - t0.t) / 1000);
63
+ const vanished = t0.pair_address !== null && t1.pair_address === null;
64
+ const r_mcap = vanished ? 0 : ratio(t1.mcap, t0.mcap);
65
+ const r_liq = vanished ? 0 : ratio(t1.liquidity_usd, t0.liquidity_usd);
66
+ const r_price = vanished ? 0 : ratio(t1.price_usd, t0.price_usd);
67
+ const max_r = Math.max(...obs.map((o) => ratio(o.mcap, t0.mcap) ?? 0), r_mcap ?? 0);
68
+ const ev = {
69
+ dt_sec: dt, r_mcap, r_liq, r_price, max_mcap_ratio: max_r, vanished,
70
+ t0: { mcap: t0.mcap, liq: t0.liquidity_usd, price: t0.price_usd, vol_h1: t0.vol_h1, src: t0.src_market },
71
+ t1: { mcap: t1.mcap, liq: t1.liquidity_usd, price: t1.price_usd, vol_h1: t1.vol_h1, src: t1.src_market },
72
+ };
73
+ const curve = CURVE_LAUNCHPADS.has(t0.launchpad ?? '');
74
+ const sourceMismatch = t0.src_market !== t1.src_market && !vanished;
75
+ let lab;
76
+ let tier = 'keyless-proxy';
77
+ const chain = chainVerified(opts.chainEvents);
78
+ if (forceUnobserved) {
79
+ lab = 'unobserved';
80
+ ev.reason = forceUnobserved;
81
+ }
82
+ else if (chain) {
83
+ lab = chain.label;
84
+ tier = 'chain-verified';
85
+ ev.rule = chain.rule;
86
+ }
87
+ else if (rules === '0.2' && curve && (t1.liquidity_usd ?? 0) <= RULES.curveDeadLiq && (t1.vol_h1 ?? 0) < RULES.curveDeadVolH1 && t1.src_market !== null && t1.src_market !== 'none') {
88
+ // D2 (v0.2): a bonding-curve launch with no pool and no trades at t1 is dead, whatever the ratios say.
89
+ lab = 'dead';
90
+ ev.rule = 'D2 curve-dead: liq<=100 & vol_h1<100';
91
+ if (sourceMismatch)
92
+ ev.cross_source = true;
93
+ }
94
+ else if (sourceMismatch && !(rules === '0.2' && curve && isJup(t0.src_market) && t1.src_market === 'dexscreener')) {
95
+ lab = 'unobserved';
96
+ ev.reason = 'source-mismatch';
97
+ }
98
+ else if (t0.mcap === null || t0.mcap === 0) {
99
+ lab = 'unobserved';
100
+ ev.reason = 'no-mcap-at-t0';
101
+ }
102
+ else {
103
+ if (sourceMismatch)
104
+ ev.cross_source = true;
105
+ if ((t0.liquidity_usd ?? 0) >= RULES.rugMinLiqT0 && r_liq !== null && r_liq <= RULES.rugLiqRatio && r_price !== null && r_price <= RULES.rugPriceRatio) {
106
+ lab = 'rug';
107
+ ev.rule = 'R1 liq<=10% & price<=50%';
108
+ }
109
+ else if (r_mcap !== null && r_mcap <= RULES.deadMcapRatio && (t1.vol_h1 ?? 0) < RULES.deadVolH1) {
110
+ lab = 'dead';
111
+ ev.rule = 'D1 mcap<=20% & vol_h1<500';
112
+ }
113
+ else if (r_mcap !== null && r_mcap <= RULES.fadeMcapRatio) {
114
+ lab = 'fade';
115
+ ev.rule = 'F1 mcap<=50%';
116
+ }
117
+ else if (max_r >= RULES.runnerRatio) {
118
+ lab = 'runner';
119
+ ev.rule = 'U1 max mcap>=2x';
120
+ }
121
+ else
122
+ lab = 'flat';
123
+ }
124
+ return outcome(t0, t1, horizon, lab, r_mcap, r_liq, r_price, max_r, ev, opts, tier);
125
+ }
126
+ /** Tier-1 override (labels.md): LP withdraw / freeze / dev sell ≥ 20 % between t0 and t1 is a chain-verified rug. */
127
+ function chainVerified(events) {
128
+ if (!events || !events.length)
129
+ return null;
130
+ for (const e of events) {
131
+ if (e.kind === 'lp_withdraw')
132
+ return { label: 'rug', rule: 'C1 lp_withdraw' };
133
+ if (e.kind === 'freeze')
134
+ return { label: 'rug', rule: 'C2 freeze' };
135
+ if (e.kind === 'dev_sell' && (e.amount ?? 0) >= 20)
136
+ return { label: 'rug', rule: 'C3 dev_sell>=20%' };
137
+ }
138
+ return null;
139
+ }
140
+ function outcome(t0, t1, horizon, lab, r_mcap, r_liq, r_price, max_r, ev, opts, tier = 'keyless-proxy') {
141
+ const rules = opts.rules ?? '0.2';
142
+ return {
143
+ mint: t0.mint, t0: t0.t, horizon_sec: horizon, t1: t1 ? t1.t : null, label: lab, label_tier: tier,
144
+ mcap_ratio: r_mcap, liq_ratio: r_liq, price_ratio: r_price, max_mcap_ratio: max_r,
145
+ evidence: JSON.stringify(ev), labeler_version: rules === '0.1' ? '0.1.0' : LABELER_VERSION,
146
+ };
147
+ }
148
+ /** Positive class for the rug model on keyless data (labels.md): rug ∪ dead. */
149
+ export function isPositive(l, tier = 'keyless-proxy') {
150
+ return l === 'rug' || (tier === 'keyless-proxy' && l === 'dead');
151
+ }
@@ -0,0 +1,29 @@
1
+ // Shared read-only open for the recorder tables. Three consumers (the MCP `historyDb()`, `dexterm
2
+ // narrative`, and now `dexterm backtest` / the `rug_backtest` MCP tool) each opened a read-only
3
+ // DatabaseSync and inline-checked that `token_snapshots` exists before querying; this is that one check.
4
+ //
5
+ // It never creates the schema (read-only; the live Recorder owns writes) and returns null when the file
6
+ // has no recorder history yet, so a caller can say "no history recorded" instead of throwing.
7
+ import { DatabaseSync } from 'node:sqlite';
8
+ /**
9
+ * Open the app DB read-only and confirm the recorder schema exists. Returns null (and closes the handle)
10
+ * when `token_snapshots` is absent — i.e. nothing has been recorded into this file yet. `:memory:` has no
11
+ * on-disk history, so it returns null too. Throws only on a genuine open error (missing file, locked).
12
+ */
13
+ export function openHistoryReadOnly(path) {
14
+ if (path === ':memory:')
15
+ return null;
16
+ const db = new DatabaseSync(path, { readOnly: true });
17
+ try {
18
+ const t = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='token_snapshots'").get();
19
+ if (!t) {
20
+ db.close();
21
+ return null;
22
+ }
23
+ return db;
24
+ }
25
+ catch (e) {
26
+ db.close();
27
+ throw e;
28
+ }
29
+ }