dexterm-cli 0.0.0-stage → 0.1.2

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 (377) 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 +394 -0
  4. package/dist/packages/agents/src/executor.js +202 -0
  5. package/dist/packages/agents/src/gate.js +179 -0
  6. package/dist/packages/agents/src/identity.js +218 -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 +119 -0
  12. package/dist/packages/agents/src/tools.js +72 -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 +75 -0
  18. package/dist/packages/cli/assets/claude/plugin/skills/rug-check/SKILL.md +74 -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 +336 -0
  26. package/dist/packages/cli/src/agent-roster.js +26 -0
  27. package/dist/packages/cli/src/alerts/adapters/desktop.js +40 -0
  28. package/dist/packages/cli/src/alerts/adapters/discord.js +36 -0
  29. package/dist/packages/cli/src/alerts/adapters/telegram.js +43 -0
  30. package/dist/packages/cli/src/alerts/adapters/toast.js +16 -0
  31. package/dist/packages/cli/src/alerts/creds.js +83 -0
  32. package/dist/packages/cli/src/alerts/format.js +41 -0
  33. package/dist/packages/cli/src/alerts/index.js +10 -0
  34. package/dist/packages/cli/src/alerts/notifier.js +53 -0
  35. package/dist/packages/cli/src/alerts/route.js +19 -0
  36. package/dist/packages/cli/src/alerts/types.js +1 -0
  37. package/dist/packages/cli/src/alerts-cmd.js +212 -0
  38. package/dist/packages/cli/src/analyst/backend.js +526 -0
  39. package/dist/packages/cli/src/analyst/results.js +38 -0
  40. package/dist/packages/cli/src/analyst/session.js +319 -0
  41. package/dist/packages/cli/src/audit.js +51 -0
  42. package/dist/packages/cli/src/backtest-cmd.js +208 -0
  43. package/dist/packages/cli/src/boot-state.js +62 -0
  44. package/dist/packages/cli/src/coin-target.js +2 -0
  45. package/dist/packages/cli/src/custom.js +261 -0
  46. package/dist/packages/cli/src/display.js +191 -0
  47. package/dist/packages/cli/src/doctor.js +375 -0
  48. package/dist/packages/cli/src/export.js +235 -0
  49. package/dist/packages/cli/src/feed.js +634 -0
  50. package/dist/packages/cli/src/fixtures.js +275 -0
  51. package/dist/packages/cli/src/follow-cmd.js +221 -0
  52. package/dist/packages/cli/src/images-config.js +59 -0
  53. package/dist/packages/cli/src/index.js +31 -0
  54. package/dist/packages/cli/src/kb-skill-cmd.js +240 -0
  55. package/dist/packages/cli/src/larp-record.js +21 -0
  56. package/dist/packages/cli/src/live/copy.js +80 -0
  57. package/dist/packages/cli/src/live/flow.js +233 -0
  58. package/dist/packages/cli/src/live/index.js +511 -0
  59. package/dist/packages/cli/src/live/intel.js +227 -0
  60. package/dist/packages/cli/src/live/newpairs.js +334 -0
  61. package/dist/packages/cli/src/live/screens/newpairs-live.js +219 -0
  62. package/dist/packages/cli/src/live/screens/token-live.js +459 -0
  63. package/dist/packages/cli/src/live/screens/watchlist-live.js +149 -0
  64. package/dist/packages/cli/src/live/token.js +585 -0
  65. package/dist/packages/cli/src/live/trade.js +929 -0
  66. package/dist/packages/cli/src/live/watchlist.js +178 -0
  67. package/dist/packages/cli/src/main.js +5785 -0
  68. package/dist/packages/cli/src/mcp-cmd.js +326 -0
  69. package/dist/packages/cli/src/narrative-cmd.js +76 -0
  70. package/dist/packages/cli/src/pack-cmd.js +323 -0
  71. package/dist/packages/cli/src/plan-cmd.js +278 -0
  72. package/dist/packages/cli/src/popup.js +810 -0
  73. package/dist/packages/cli/src/rules-cmd.js +131 -0
  74. package/dist/packages/cli/src/rules.js +358 -0
  75. package/dist/packages/cli/src/scan/command.js +57 -0
  76. package/dist/packages/cli/src/scan/engine.js +419 -0
  77. package/dist/packages/cli/src/scan/observe.js +64 -0
  78. package/dist/packages/cli/src/scan/ui.js +98 -0
  79. package/dist/packages/cli/src/screener/filter.js +241 -0
  80. package/dist/packages/cli/src/screener/presets.js +80 -0
  81. package/dist/packages/cli/src/screener/rows.js +146 -0
  82. package/dist/packages/cli/src/screener/rug.js +50 -0
  83. package/dist/packages/cli/src/screener/sort.js +52 -0
  84. package/dist/packages/cli/src/screener/view.js +183 -0
  85. package/dist/packages/cli/src/screens/analyst-session.js +343 -0
  86. package/dist/packages/cli/src/screens/analyst.js +326 -0
  87. package/dist/packages/cli/src/screens/boot.js +74 -0
  88. package/dist/packages/cli/src/screens/bubbles.js +255 -0
  89. package/dist/packages/cli/src/screens/coin.js +33 -0
  90. package/dist/packages/cli/src/screens/follows.js +201 -0
  91. package/dist/packages/cli/src/screens/kol.js +90 -0
  92. package/dist/packages/cli/src/screens/narrative.js +90 -0
  93. package/dist/packages/cli/src/screens/newpairs.js +150 -0
  94. package/dist/packages/cli/src/screens/overlay.js +257 -0
  95. package/dist/packages/cli/src/screens/plans.js +126 -0
  96. package/dist/packages/cli/src/screens/positions.js +176 -0
  97. package/dist/packages/cli/src/screens/rules.js +170 -0
  98. package/dist/packages/cli/src/screens/screener.js +459 -0
  99. package/dist/packages/cli/src/screens/social-panel.js +107 -0
  100. package/dist/packages/cli/src/screens/ticket.js +342 -0
  101. package/dist/packages/cli/src/screens/token.js +312 -0
  102. package/dist/packages/cli/src/screens/trending.js +181 -0
  103. package/dist/packages/cli/src/screens/watchlist.js +104 -0
  104. package/dist/packages/cli/src/skill-eval-build.js +109 -0
  105. package/dist/packages/cli/src/social/demo.js +96 -0
  106. package/dist/packages/cli/src/social/view.js +250 -0
  107. package/dist/packages/cli/src/state.js +463 -0
  108. package/dist/packages/cli/src/theme-cmd.js +126 -0
  109. package/dist/packages/cli/src/trade.js +319 -0
  110. package/dist/packages/cli/src/update.js +294 -0
  111. package/dist/packages/cli/src/version.js +3 -0
  112. package/dist/packages/cli/src/voice-cmd.js +119 -0
  113. package/dist/packages/cli/src/voice-hud.js +42 -0
  114. package/dist/packages/cli/src/wallet-cmd.js +440 -0
  115. package/dist/packages/cli/src/wallet-command.js +31 -0
  116. package/dist/packages/cli/src/watch-cmd.js +190 -0
  117. package/dist/packages/cli/src/widgets.js +208 -0
  118. package/dist/packages/cli/src/workspace-cmd.js +68 -0
  119. package/dist/packages/cli/src/x-cmd.js +154 -0
  120. package/dist/packages/custom/src/config.js +213 -0
  121. package/dist/packages/custom/src/index.js +10 -0
  122. package/dist/packages/custom/src/keymap.js +107 -0
  123. package/dist/packages/custom/src/layout.js +235 -0
  124. package/dist/packages/custom/src/packs.js +633 -0
  125. package/dist/packages/custom/src/rules.js +704 -0
  126. package/dist/packages/custom/src/schema.js +538 -0
  127. package/dist/packages/custom/src/themes.js +176 -0
  128. package/dist/packages/custom/src/widget-html.js +222 -0
  129. package/dist/packages/custom/src/workspace.js +141 -0
  130. package/dist/packages/data/src/analyst-actions.js +133 -0
  131. package/dist/packages/data/src/budget.js +88 -0
  132. package/dist/packages/data/src/cache.js +142 -0
  133. package/dist/packages/data/src/candles.js +168 -0
  134. package/dist/packages/data/src/clock.js +64 -0
  135. package/dist/packages/data/src/coin-target.js +82 -0
  136. package/dist/packages/data/src/credits.js +137 -0
  137. package/dist/packages/data/src/detail.js +97 -0
  138. package/dist/packages/data/src/fast-lane.js +321 -0
  139. package/dist/packages/data/src/fixtures.js +135 -0
  140. package/dist/packages/data/src/health.js +245 -0
  141. package/dist/packages/data/src/http.js +277 -0
  142. package/dist/packages/data/src/images/cache.js +141 -0
  143. package/dist/packages/data/src/images/decode-worker.js +28 -0
  144. package/dist/packages/data/src/images/decode.js +81 -0
  145. package/dist/packages/data/src/images/fetch.js +162 -0
  146. package/dist/packages/data/src/images/gif.js +214 -0
  147. package/dist/packages/data/src/images/index.js +10 -0
  148. package/dist/packages/data/src/images/jpeg.js +544 -0
  149. package/dist/packages/data/src/images/png.js +310 -0
  150. package/dist/packages/data/src/images/service.js +334 -0
  151. package/dist/packages/data/src/images/types.js +27 -0
  152. package/dist/packages/data/src/index.js +211 -0
  153. package/dist/packages/data/src/intel/helius-history.js +70 -0
  154. package/dist/packages/data/src/intel/holder-class.js +125 -0
  155. package/dist/packages/data/src/intel/rules.js +421 -0
  156. package/dist/packages/data/src/intel/scan.js +170 -0
  157. package/dist/packages/data/src/larp/evidence.js +288 -0
  158. package/dist/packages/data/src/larp/link-baseline.js +196 -0
  159. package/dist/packages/data/src/larp/links.js +137 -0
  160. package/dist/packages/data/src/larp/robots.js +90 -0
  161. package/dist/packages/data/src/larp/safe-fetch.js +389 -0
  162. package/dist/packages/data/src/limiter.js +341 -0
  163. package/dist/packages/data/src/model.js +12 -0
  164. package/dist/packages/data/src/paper.js +331 -0
  165. package/dist/packages/data/src/rpc-config.js +126 -0
  166. package/dist/packages/data/src/rpc-pool.js +166 -0
  167. package/dist/packages/data/src/social/chain.js +83 -0
  168. package/dist/packages/data/src/social/dedupe.js +205 -0
  169. package/dist/packages/data/src/social/feed.js +462 -0
  170. package/dist/packages/data/src/social/firewall.js +110 -0
  171. package/dist/packages/data/src/social/index.js +11 -0
  172. package/dist/packages/data/src/social/kol.js +269 -0
  173. package/dist/packages/data/src/social/model.js +11 -0
  174. package/dist/packages/data/src/social/rank.js +184 -0
  175. package/dist/packages/data/src/social/rss.js +113 -0
  176. package/dist/packages/data/src/social/summary.js +104 -0
  177. package/dist/packages/data/src/social/venues.js +186 -0
  178. package/dist/packages/data/src/sources/dexscreener.js +184 -0
  179. package/dist/packages/data/src/sources/geckoterminal.js +133 -0
  180. package/dist/packages/data/src/sources/goplus.js +161 -0
  181. package/dist/packages/data/src/sources/jupiter-swap.js +236 -0
  182. package/dist/packages/data/src/sources/jupiter.js +198 -0
  183. package/dist/packages/data/src/sources/pda.js +113 -0
  184. package/dist/packages/data/src/sources/pump-curve.js +58 -0
  185. package/dist/packages/data/src/sources/pumpportal.js +252 -0
  186. package/dist/packages/data/src/sources/rugcheck.js +71 -0
  187. package/dist/packages/data/src/sources/solana-rpc.js +299 -0
  188. package/dist/packages/data/src/sources/solana-ws.js +287 -0
  189. package/dist/packages/data/src/store.js +289 -0
  190. package/dist/packages/data/src/trade/bridge.js +464 -0
  191. package/dist/packages/data/src/trade/caps.js +323 -0
  192. package/dist/packages/data/src/trade/copy/auto.js +385 -0
  193. package/dist/packages/data/src/trade/copy/follows.js +103 -0
  194. package/dist/packages/data/src/trade/copy/index.js +9 -0
  195. package/dist/packages/data/src/trade/copy/mirror.js +91 -0
  196. package/dist/packages/data/src/trade/copy/stats.js +120 -0
  197. package/dist/packages/data/src/trade/copy/tracker.js +158 -0
  198. package/dist/packages/data/src/trade/copy/trades.js +87 -0
  199. package/dist/packages/data/src/trade/copy/types.js +6 -0
  200. package/dist/packages/data/src/trade/executor.js +933 -0
  201. package/dist/packages/data/src/trade/kill-switch.js +47 -0
  202. package/dist/packages/data/src/trade/link-store.js +52 -0
  203. package/dist/packages/data/src/trade/plans/confirm.js +157 -0
  204. package/dist/packages/data/src/trade/plans/engine.js +784 -0
  205. package/dist/packages/data/src/trade/plans/executor-live.js +220 -0
  206. package/dist/packages/data/src/trade/plans/executor-paper.js +44 -0
  207. package/dist/packages/data/src/trade/plans/executor.js +11 -0
  208. package/dist/packages/data/src/trade/plans/index.js +12 -0
  209. package/dist/packages/data/src/trade/plans/journal.js +77 -0
  210. package/dist/packages/data/src/trade/plans/mandate.js +129 -0
  211. package/dist/packages/data/src/trade/plans/plan.js +179 -0
  212. package/dist/packages/data/src/trade/plans/service.js +168 -0
  213. package/dist/packages/data/src/trade/plans/types.js +6 -0
  214. package/dist/packages/data/src/trade/rpc-exec.js +229 -0
  215. package/dist/packages/data/src/trade/signer/client.js +197 -0
  216. package/dist/packages/data/src/trade/signer/fast-wallet.js +154 -0
  217. package/dist/packages/data/src/trade/signer/host.js +97 -0
  218. package/dist/packages/data/src/trade/signer/main.js +121 -0
  219. package/dist/packages/data/src/trade/signer/probe-builder.js +85 -0
  220. package/dist/packages/data/src/trade/signer/protocol.js +92 -0
  221. package/dist/packages/data/src/trade/signer/service.js +400 -0
  222. package/dist/packages/data/src/trade/signer/sol-usd-feed.js +98 -0
  223. package/dist/packages/data/src/trade/sol-usd.js +86 -0
  224. package/dist/packages/data/src/trade/swap-build.js +108 -0
  225. package/dist/packages/data/src/trade/token-delta.js +201 -0
  226. package/dist/packages/data/src/trade/tx-decode.js +632 -0
  227. package/dist/packages/data/src/util.js +24 -0
  228. package/dist/packages/data/src/watchlist.js +176 -0
  229. package/dist/packages/data/src/x/api.js +256 -0
  230. package/dist/packages/data/src/x/budget.js +66 -0
  231. package/dist/packages/data/src/x/config.js +49 -0
  232. package/dist/packages/data/src/x/index.js +10 -0
  233. package/dist/packages/data/src/x/mock-server.js +217 -0
  234. package/dist/packages/data/src/x/oauth.js +242 -0
  235. package/dist/packages/data/src/x/pkce.js +21 -0
  236. package/dist/packages/data/src/x/source.js +285 -0
  237. package/dist/packages/data/src/x/token-store.js +134 -0
  238. package/dist/packages/data/src/x/transport.js +71 -0
  239. package/dist/packages/data/vendor/solana-web3/LICENSE +20 -0
  240. package/dist/packages/data/vendor/solana-web3/NOTICE.md +13 -0
  241. package/dist/packages/data/vendor/solana-web3/index.iife.min.js +20 -0
  242. package/dist/packages/mcp/assets/cases.json +1194 -0
  243. package/dist/packages/mcp/assets/kb/entries/cabal-and-coordinated-launches.md +28 -0
  244. package/dist/packages/mcp/assets/kb/entries/common-rug-patterns.md +40 -0
  245. package/dist/packages/mcp/assets/kb/entries/dbc-mechanics.md +30 -0
  246. package/dist/packages/mcp/assets/kb/entries/dev-wallet-behaviour.md +33 -0
  247. package/dist/packages/mcp/assets/kb/entries/glossary.md +35 -0
  248. package/dist/packages/mcp/assets/kb/entries/holder-concentration.md +30 -0
  249. package/dist/packages/mcp/assets/kb/entries/jito-bundles.md +29 -0
  250. package/dist/packages/mcp/assets/kb/entries/launchlab-curve.md +31 -0
  251. package/dist/packages/mcp/assets/kb/entries/lp-burn-vs-lock.md +31 -0
  252. package/dist/packages/mcp/assets/kb/entries/metadata-and-copycats.md +29 -0
  253. package/dist/packages/mcp/assets/kb/entries/mint-freeze-authority.md +31 -0
  254. package/dist/packages/mcp/assets/kb/entries/narrative-lifecycle.md +32 -0
  255. package/dist/packages/mcp/assets/kb/entries/pump-bonding-curve.md +33 -0
  256. package/dist/packages/mcp/assets/kb/entries/pumpswap-migration.md +29 -0
  257. package/dist/packages/mcp/assets/kb/entries/sniping-and-snipers.md +29 -0
  258. package/dist/packages/mcp/assets/kb/entries/token2022-extensions-risk.md +32 -0
  259. package/dist/packages/mcp/assets/kb/entries/wash-trading-fake-volume.md +33 -0
  260. package/dist/packages/mcp/assets/skills/rug-check.md +52 -0
  261. package/dist/packages/mcp/assets/skills/token-dossier.md +57 -0
  262. package/dist/packages/mcp/assets/skills/trench-scan.md +40 -0
  263. package/dist/packages/mcp/bin/dexterm-mcp.mjs +16 -0
  264. package/dist/packages/mcp/src/dossier.js +78 -0
  265. package/dist/packages/mcp/src/firewall.js +21 -0
  266. package/dist/packages/mcp/src/index.js +22 -0
  267. package/dist/packages/mcp/src/server.js +936 -0
  268. package/dist/packages/mcp/src/user-content.js +434 -0
  269. package/dist/packages/packs/src/backtest.js +183 -0
  270. package/dist/packages/packs/src/digest.js +95 -0
  271. package/dist/packages/packs/src/firewall.js +57 -0
  272. package/dist/packages/packs/src/index.js +20 -0
  273. package/dist/packages/packs/src/larp-eval.js +100 -0
  274. package/dist/packages/packs/src/narrative.js +309 -0
  275. package/dist/packages/packs/src/reason.js +135 -0
  276. package/dist/packages/packs/src/rug-model.js +137 -0
  277. package/dist/packages/packs/src/schema.js +54 -0
  278. package/dist/packages/packs/src/skill-backtest.js +300 -0
  279. package/dist/packages/packs/src/token-dossier.js +174 -0
  280. package/dist/packages/packs/src/verdicts.js +17 -0
  281. package/dist/packages/packs/src/wallet-dossier.js +105 -0
  282. package/dist/packages/popup/src/config.js +71 -0
  283. package/dist/packages/popup/src/dock.js +271 -0
  284. package/dist/packages/popup/src/host.js +210 -0
  285. package/dist/packages/popup/src/index.js +12 -0
  286. package/dist/packages/popup/src/loopback.js +53 -0
  287. package/dist/packages/popup/src/open.js +183 -0
  288. package/dist/packages/popup/src/pages/bubbles-lib.js +160 -0
  289. package/dist/packages/popup/src/pages/bubbles.css +23 -0
  290. package/dist/packages/popup/src/pages/bubbles.html +36 -0
  291. package/dist/packages/popup/src/pages/bubbles.js +214 -0
  292. package/dist/packages/popup/src/pages/chart-lib.js +262 -0
  293. package/dist/packages/popup/src/pages/chart.css +50 -0
  294. package/dist/packages/popup/src/pages/chart.html +56 -0
  295. package/dist/packages/popup/src/pages/chart.js +554 -0
  296. package/dist/packages/popup/src/pages/common.css +34 -0
  297. package/dist/packages/popup/src/pages/common.js +187 -0
  298. package/dist/packages/popup/src/pages/feeds.html +20 -0
  299. package/dist/packages/popup/src/pages/feeds.js +77 -0
  300. package/dist/packages/popup/src/pages/narrative.html +20 -0
  301. package/dist/packages/popup/src/pages/narrative.js +61 -0
  302. package/dist/packages/popup/src/pages/plans.css +30 -0
  303. package/dist/packages/popup/src/pages/plans.html +26 -0
  304. package/dist/packages/popup/src/pages/plans.js +82 -0
  305. package/dist/packages/popup/src/pages/roster.css +41 -0
  306. package/dist/packages/popup/src/pages/roster.html +25 -0
  307. package/dist/packages/popup/src/pages/roster.js +75 -0
  308. package/dist/packages/popup/src/pages/token.html +20 -0
  309. package/dist/packages/popup/src/pages/token.js +112 -0
  310. package/dist/packages/popup/src/pages/widget-sdk.js +224 -0
  311. package/dist/packages/popup/src/pages/widget.css +5 -0
  312. package/dist/packages/popup/src/pages/widget.html +21 -0
  313. package/dist/packages/popup/src/pages/widget.js +85 -0
  314. package/dist/packages/popup/src/protocol.js +31 -0
  315. package/dist/packages/popup/src/selftest.js +156 -0
  316. package/dist/packages/popup/src/server.js +582 -0
  317. package/dist/packages/popup/src/sinkproxy.js +167 -0
  318. package/dist/packages/popup/src/widget-html.js +231 -0
  319. package/dist/packages/popup/vendor/lightweight-charts/LICENSE +201 -0
  320. package/dist/packages/popup/vendor/lightweight-charts/NOTICE +2 -0
  321. package/dist/packages/popup/vendor/lightweight-charts/README.md +30 -0
  322. package/dist/packages/popup/vendor/lightweight-charts/VERSION +1 -0
  323. package/dist/packages/popup/vendor/lightweight-charts/lightweight-charts.standalone.production.js +7 -0
  324. package/dist/packages/recorder/bin/dexterm-recorder.mjs +11 -0
  325. package/dist/packages/recorder/src/cli.js +113 -0
  326. package/dist/packages/recorder/src/export.js +71 -0
  327. package/dist/packages/recorder/src/index.js +20 -0
  328. package/dist/packages/recorder/src/labels.js +151 -0
  329. package/dist/packages/recorder/src/open.js +29 -0
  330. package/dist/packages/recorder/src/recorder.js +553 -0
  331. package/dist/packages/recorder/src/schedule.js +43 -0
  332. package/dist/packages/recorder/src/schema.js +135 -0
  333. package/dist/packages/recorder/src/snapshot.js +191 -0
  334. package/dist/packages/recorder/src/sweep.js +52 -0
  335. package/dist/packages/recorder/src/verdicts.js +52 -0
  336. package/dist/packages/tui/src/bubbles.js +415 -0
  337. package/dist/packages/tui/src/canvas.js +370 -0
  338. package/dist/packages/tui/src/chrome.js +85 -0
  339. package/dist/packages/tui/src/color.js +133 -0
  340. package/dist/packages/tui/src/flush.js +62 -0
  341. package/dist/packages/tui/src/fmt.js +188 -0
  342. package/dist/packages/tui/src/fx-trade.js +278 -0
  343. package/dist/packages/tui/src/fx.js +527 -0
  344. package/dist/packages/tui/src/images/blocks.js +141 -0
  345. package/dist/packages/tui/src/images/coin.js +22 -0
  346. package/dist/packages/tui/src/images/detect.js +140 -0
  347. package/dist/packages/tui/src/images/index.js +7 -0
  348. package/dist/packages/tui/src/images/layer.js +146 -0
  349. package/dist/packages/tui/src/images/pixels.js +157 -0
  350. package/dist/packages/tui/src/images/protocols.js +87 -0
  351. package/dist/packages/tui/src/index.js +18 -0
  352. package/dist/packages/tui/src/keymap.js +357 -0
  353. package/dist/packages/tui/src/layout.js +11 -0
  354. package/dist/packages/tui/src/raster-font.js +195 -0
  355. package/dist/packages/tui/src/raster.js +213 -0
  356. package/dist/packages/tui/src/sound.js +177 -0
  357. package/dist/packages/tui/src/theme.js +182 -0
  358. package/dist/packages/tui/src/widgets.js +598 -0
  359. package/dist/packages/voice/src/controller.js +407 -0
  360. package/dist/packages/voice/src/doctor.js +131 -0
  361. package/dist/packages/voice/src/download.js +184 -0
  362. package/dist/packages/voice/src/engines.js +84 -0
  363. package/dist/packages/voice/src/index.js +20 -0
  364. package/dist/packages/voice/src/router.js +502 -0
  365. package/dist/packages/voice/src/stt/apple-helper.swift.js +103 -0
  366. package/dist/packages/voice/src/stt/apple.js +179 -0
  367. package/dist/packages/voice/src/stt/fake.js +34 -0
  368. package/dist/packages/voice/src/stt/whisper.js +112 -0
  369. package/dist/packages/voice/src/summary.js +44 -0
  370. package/dist/packages/voice/src/tts/espeak.js +131 -0
  371. package/dist/packages/voice/src/tts/fake.js +30 -0
  372. package/dist/packages/voice/src/tts/piper.js +206 -0
  373. package/dist/packages/voice/src/tts/say.js +132 -0
  374. package/dist/packages/voice/src/tts/voices.js +206 -0
  375. package/dist/packages/voice/src/types.js +3 -0
  376. package/package.json +38 -4
  377. package/README.md +0 -3
@@ -0,0 +1,184 @@
1
+ // Voice model downloader (task-1408). The whisper.cpp base.en model and the Piper en_GB-alan-medium
2
+ // voice are NOT shipped (free-forever rule: no bundled large binaries, no keys). dexterm downloads them
3
+ // on request, and ONLY on request:
4
+ // - from the OFFICIAL source (the ggml-org / rhasspy repositories on Hugging Face),
5
+ // - after EXPLICIT user confirmation (never a silent auto-download),
6
+ // - and verified against a checksum pinned here from the upstream LFS pointer, so a corrupted or
7
+ // tampered download is rejected and never written into place.
8
+ //
9
+ // This module is pure logic + injected fetch/confirm/log, so it is unit-testable with a fake registry
10
+ // and never touches the real network in tests. The CLI (`dexterm voice download …`) wires the real
11
+ // global fetch, a readline y/N prompt, and stdout.
12
+ import { createHash } from 'node:crypto';
13
+ import { createWriteStream } from 'node:fs';
14
+ import { mkdir, rename, rm, readFile } from 'node:fs/promises';
15
+ import { existsSync } from 'node:fs';
16
+ import { homedir } from 'node:os';
17
+ import { dirname, join } from 'node:path';
18
+ import { Readable } from 'node:stream';
19
+ import { once } from 'node:events';
20
+ /** Total download size of a spec, in whole MB (for the prompt). */
21
+ export function specSizeMB(spec) {
22
+ return Math.round(spec.files.reduce((n, f) => n + (f.size ?? 0), 0) / (1024 * 1024));
23
+ }
24
+ /**
25
+ * The downloadable voice models, keyed by id. `home` is the dexterm home (~/.dexterm) so tests can
26
+ * point it at a temp dir. Checksums are pinned from the upstream Hugging Face LFS pointers (verified
27
+ * 2026-10-16): ggerganov/whisper.cpp and rhasspy/piper-voices@v1.0.0.
28
+ */
29
+ export function modelRegistry(home = join(homedir(), '.dexterm')) {
30
+ const models = join(home, 'models');
31
+ return {
32
+ whisper: {
33
+ id: 'whisper',
34
+ label: 'whisper.cpp base.en (speech-to-text)',
35
+ note: 'whisper.cpp base.en — on-device speech recognition, ~141 MB, MIT (ggml-org/whisper.cpp)',
36
+ files: [{
37
+ url: 'https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin',
38
+ dest: join(models, 'ggml-base.en.bin'),
39
+ sha256: 'a03779c86df3323075f5e796cb2ce5029f00ec8869eee3fdfb897afe36c6d002',
40
+ size: 147964211,
41
+ }],
42
+ },
43
+ 'piper-voice': {
44
+ id: 'piper-voice',
45
+ label: 'Piper en_GB-alan-medium (neural voice)',
46
+ note: 'Piper en_GB-alan-medium — British male neural voice, ~61 MB, MIT (rhasspy/piper-voices)',
47
+ files: [
48
+ {
49
+ url: 'https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/alan/medium/en_GB-alan-medium.onnx',
50
+ dest: join(models, 'en_GB-alan-medium.onnx'),
51
+ sha256: '0a309668932205e762801f1efc2736cd4b0120329622adf62be09e56339d3330',
52
+ size: 63201294,
53
+ },
54
+ {
55
+ url: 'https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/alan/medium/en_GB-alan-medium.onnx.json',
56
+ dest: join(models, 'en_GB-alan-medium.onnx.json'),
57
+ validateJson: true,
58
+ },
59
+ ],
60
+ },
61
+ };
62
+ }
63
+ /** sha256 of an existing file, or null if it cannot be read. */
64
+ async function fileSha256(path) {
65
+ try {
66
+ const h = createHash('sha256');
67
+ h.update(await readFile(path));
68
+ return h.digest('hex');
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ /** True when `file` is already present AND valid (checksum match, or parses as JSON for config files). */
75
+ async function isPresentAndValid(file) {
76
+ if (!existsSync(file.dest))
77
+ return false;
78
+ if (file.validateJson) {
79
+ try {
80
+ JSON.parse(await readFile(file.dest, 'utf8'));
81
+ return true;
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ if (file.sha256)
88
+ return (await fileSha256(file.dest)) === file.sha256.toLowerCase();
89
+ return true;
90
+ }
91
+ /**
92
+ * Download and verify one file. Streams to a `.part` temp alongside the destination (bounded memory),
93
+ * verifies size + sha256 (or JSON), then atomically renames into place. On ANY failure the temp is
94
+ * removed and nothing is written to the destination.
95
+ */
96
+ async function downloadFile(file, fetchImpl, log) {
97
+ await mkdir(dirname(file.dest), { recursive: true });
98
+ const tmp = `${file.dest}.part`;
99
+ await rm(tmp, { force: true });
100
+ log(` ↓ ${file.url}`);
101
+ let res;
102
+ try {
103
+ res = await fetchImpl(file.url, { redirect: 'follow' });
104
+ }
105
+ catch (e) {
106
+ throw new Error(`download failed (${file.url}): ${e.message}`);
107
+ }
108
+ if (!res.ok || !res.body)
109
+ throw new Error(`download failed (${file.url}): HTTP ${res.status}`);
110
+ const hash = createHash('sha256');
111
+ const out = createWriteStream(tmp);
112
+ let bytes = 0;
113
+ try {
114
+ for await (const chunk of Readable.fromWeb(res.body)) {
115
+ const buf = chunk;
116
+ bytes += buf.length;
117
+ hash.update(buf);
118
+ if (!out.write(buf))
119
+ await once(out, 'drain');
120
+ }
121
+ out.end();
122
+ await once(out, 'finish');
123
+ }
124
+ catch (e) {
125
+ out.destroy();
126
+ await rm(tmp, { force: true });
127
+ throw new Error(`download failed (${file.url}): ${e.message}`);
128
+ }
129
+ // Verify before anything lands at the real path.
130
+ try {
131
+ if (file.size !== undefined && bytes !== file.size) {
132
+ throw new Error(`size mismatch: got ${bytes} bytes, expected ${file.size}`);
133
+ }
134
+ if (file.sha256) {
135
+ const got = hash.digest('hex');
136
+ if (got !== file.sha256.toLowerCase())
137
+ throw new Error(`checksum mismatch: got ${got}, expected ${file.sha256}`);
138
+ }
139
+ else if (file.validateJson) {
140
+ JSON.parse(await readFile(tmp, 'utf8'));
141
+ }
142
+ }
143
+ catch (e) {
144
+ await rm(tmp, { force: true });
145
+ throw new Error(`verification failed (${file.url}): ${e.message}`);
146
+ }
147
+ await rename(tmp, file.dest);
148
+ const mb = (bytes / (1024 * 1024)).toFixed(1);
149
+ log(` ✓ ${file.dest} (${mb} MB${file.sha256 ? ', sha256 ok' : ', json ok'})`);
150
+ }
151
+ /**
152
+ * Download a model after explicit confirmation. If every file is already present and valid, returns
153
+ * `already` WITHOUT prompting or touching the network. Otherwise it builds a one-prompt summary of what
154
+ * will be fetched and where, calls `confirm()`, and only then downloads + verifies each missing file.
155
+ */
156
+ export async function downloadModel(spec, deps) {
157
+ const fetchImpl = deps.fetchImpl ?? fetch;
158
+ const log = deps.log ?? (() => { });
159
+ const presence = await Promise.all(spec.files.map(isPresentAndValid));
160
+ const missing = spec.files.filter((_, i) => !presence[i]);
161
+ if (missing.length === 0) {
162
+ log(`${spec.label} is already installed and verified.`);
163
+ return { status: 'already', files: spec.files.map((f) => f.dest) };
164
+ }
165
+ const dir = dirname(spec.files[0].dest);
166
+ const prompt = [
167
+ `Download ${spec.note}`,
168
+ ` from the official source to ${dir}`,
169
+ ` ${missing.length} file${missing.length === 1 ? '' : 's'}, ~${specSizeMB(spec)} MB, checksum-verified. Proceed?`,
170
+ ].join('\n');
171
+ if (!(await deps.confirm(prompt))) {
172
+ log('Cancelled — nothing downloaded.');
173
+ return { status: 'cancelled', files: spec.files.filter((_, i) => presence[i]).map((f) => f.dest) };
174
+ }
175
+ for (const f of missing)
176
+ await downloadFile(f, fetchImpl, log);
177
+ log(`${spec.label} installed.`);
178
+ return { status: 'ok', files: spec.files.map((f) => f.dest) };
179
+ }
180
+ /** Which model files exist and verify right now (for a status report; never touches the network). */
181
+ export async function modelStatus(spec) {
182
+ const files = await Promise.all(spec.files.map(async (f) => ({ dest: f.dest, ok: await isPresentAndValid(f) })));
183
+ return { installed: files.every((f) => f.ok), files };
184
+ }
@@ -0,0 +1,84 @@
1
+ // Engine selection (task-1282). Picks the STT and TTS engines for this machine, honouring explicit
2
+ // env overrides and falling back gracefully. The app degrades to text (never crashes) when nothing is
3
+ // available; selectStt() returns null in that case and the controller says so.
4
+ import { AppleStt } from "./stt/apple.js";
5
+ import { WhisperStt } from "./stt/whisper.js";
6
+ import { FakeStt } from "./stt/fake.js";
7
+ import { SayTts } from "./tts/say.js";
8
+ import { EspeakTts, espeakVoiceFor } from "./tts/espeak.js";
9
+ import { PiperTts } from "./tts/piper.js";
10
+ import { FakeTts } from "./tts/fake.js";
11
+ import { resolveVoice } from "./tts/voices.js";
12
+ /**
13
+ * Resolve the STT engine. `auto` prefers Apple Speech (on-device, streaming), then whisper base.en,
14
+ * then none. An explicit choice is returned even if it later proves unavailable, so the doctor and the
15
+ * status line can report exactly why voice-in is off.
16
+ */
17
+ export async function selectStt(choice = process.env.DEXTERM_VOICE_STT || 'auto') {
18
+ if (choice === 'none')
19
+ return null;
20
+ if (choice === 'fake')
21
+ return new FakeStt();
22
+ if (choice === 'apple')
23
+ return new AppleStt();
24
+ if (choice === 'whisper')
25
+ return new WhisperStt();
26
+ // auto: probe in preference order.
27
+ const apple = new AppleStt();
28
+ if (await apple.available())
29
+ return apple;
30
+ const whisper = new WhisperStt();
31
+ if (await whisper.available())
32
+ return whisper;
33
+ return null;
34
+ }
35
+ /**
36
+ * Resolve the default `say` voice for this machine: the user's configured voice if it is installed and
37
+ * safe, else a deep British male (Daniel first), never a novelty voice and never the OS system default.
38
+ * Returns the full resolution (voice + why) so the controller and `dexterm doctor` can show it.
39
+ */
40
+ export async function resolveSayVoice(say, configured) {
41
+ const installed = await say.listVoicesDetailed();
42
+ return resolveVoice({ configured, installed });
43
+ }
44
+ /**
45
+ * Resolve the TTS engine. `auto` uses macOS `say` when present, else none (voice replies off). When
46
+ * `say` is chosen, its default voice is resolved to an explicit deep British male so it can NEVER fall
47
+ * back to the machine's system voice (task-1393). `configuredVoice` is the user's `config.voice.name`.
48
+ */
49
+ export async function selectTts(choice = process.env.DEXTERM_VOICE_TTS || 'auto', configuredVoice) {
50
+ if (choice === 'none')
51
+ return null;
52
+ if (choice === 'fake')
53
+ return new FakeTts();
54
+ // Piper and espeak are the off-macOS engines. A macOS voice name (config.voice.name is e.g.
55
+ // "Eddy (English (UK))") is NEVER passed to them verbatim: Piper's voice is its model, and espeak
56
+ // only honours a real espeak voice token (espeakVoiceFor drops a Mac name → the British default).
57
+ if (choice === 'piper') {
58
+ const p = new PiperTts();
59
+ return (await p.available()) ? p : null;
60
+ }
61
+ if (choice === 'espeak') {
62
+ const e = new EspeakTts(espeakVoiceFor(configuredVoice) ?? undefined);
63
+ return (await e.available()) ? e : null;
64
+ }
65
+ // On macOS, prefer `say`. Off macOS, `say` does not exist — use the portable engines below.
66
+ if (choice === 'say' || (choice === 'auto' && process.platform === 'darwin')) {
67
+ const probe = new SayTts();
68
+ if (choice === 'auto' && !(await probe.available()))
69
+ return null;
70
+ const r = await resolveSayVoice(probe, configuredVoice);
71
+ // No safe voice installed (only novelty voices): voice-out stays OFF so `say` can never be invoked
72
+ // without an explicit voice and fall back to the machine's system voice (task-1393). Text still works.
73
+ if (r.voice === null)
74
+ return null;
75
+ return new SayTts(r.voice);
76
+ }
77
+ // auto, non-darwin: Piper (neural, higher quality) when it can speak aloud, else espeak-ng, else
78
+ // text-only. Neither engine is ever handed a macOS voice name (task-1408).
79
+ const piper = new PiperTts();
80
+ if (await piper.available())
81
+ return piper;
82
+ const espeak = new EspeakTts(espeakVoiceFor(configuredVoice) ?? undefined);
83
+ return (await espeak.available()) ? espeak : null;
84
+ }
@@ -0,0 +1,20 @@
1
+ // @dexterm/voice — JARVIS voice mode (task-1282). Public surface.
2
+ //
3
+ // Free and portable by requirement: macOS `say` for speech-out, on-device Apple Speech (compiled with
4
+ // swiftc) or local whisper.cpp for speech-in — no paid APIs, no shipped keys. Voice can only ask the
5
+ // analyst or trigger its existing safe actions; it can NEVER confirm, sign, or execute a trade.
6
+ export * from "./types.js";
7
+ export { route, isSafe } from "./router.js";
8
+ export { spokenSummary, splitSentences } from "./summary.js";
9
+ export { VoiceController } from "./controller.js";
10
+ export { selectStt, selectTts, resolveSayVoice } from "./engines.js";
11
+ export { voiceDoctor } from "./doctor.js";
12
+ export { resolveVoice, isBannedVoice, normalizeVoiceName, parseSayVoices, sanitizeSpeech, BANNED_VOICE_NAMES, BRITISH_MALE_PREFERENCE, MAX_SPEAK_CHARS, VOICE_STYLE_DEFAULTS, voiceStyleDefaults, } from "./tts/voices.js";
13
+ export { SayTts, DEFAULT_RATE } from "./tts/say.js";
14
+ export { EspeakTts, DEFAULT_ESPEAK_VOICE, resolveEspeakBin, espeakVoiceFor } from "./tts/espeak.js";
15
+ export { PiperTts, DEFAULT_PIPER_VOICE, PIPER_MODEL, PIPER_PLAYERS, resolvePiperBin, pickPlayer } from "./tts/piper.js";
16
+ export { FakeTts } from "./tts/fake.js";
17
+ export { WhisperStt, WHISPER_MODEL, WHISPER_MODEL_DIR, pickRecorder } from "./stt/whisper.js";
18
+ export { modelRegistry, downloadModel, modelStatus, specSizeMB, } from "./download.js";
19
+ export { AppleStt, ensureHelper } from "./stt/apple.js";
20
+ export { FakeStt } from "./stt/fake.js";