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,326 @@
1
+ // `dexterm mcp …` — the read-only MCP server plus one-command setup for any agent (task-1405).
2
+ //
3
+ // dexterm mcp run the read-only MCP server on stdio (what the analyst uses and
4
+ // what `claude mcp add dexterm -- dexterm mcp` wires up)
5
+ // dexterm mcp install <client> write/print the MCP config for a client (claude-code, claude-desktop,
6
+ // cursor, codex, openclaw, generic). Shows the exact change, asks first,
7
+ // is idempotent, and backs the file up before editing.
8
+ // dexterm mcp doctor spawn the server over stdio, do the MCP handshake, and list the tools,
9
+ // prompts and resources the agent sees — proof the connection works.
10
+ //
11
+ // install writes nothing without consent: it prints the target file and the exact snippet, then (unless
12
+ // --yes) asks on a TTY; a non-TTY run without --yes prints the plan and stops. --print never writes. The
13
+ // config dir is resolved from the environment; --config FILE overrides it (tests point this at a temp dir),
14
+ // so this command NEVER has to touch the real ~/.claude, Cursor or Claude Desktop config to be exercised.
15
+ import { existsSync, readFileSync, writeFileSync, copyFileSync, mkdirSync } from 'node:fs';
16
+ import { dirname, join, resolve } from 'node:path';
17
+ import { homedir } from 'node:os';
18
+ import { fileURLToPath } from 'node:url';
19
+ import { spawn } from 'node:child_process';
20
+ import readline from 'node:readline';
21
+ function flag(rest, name) { const i = rest.indexOf(name); return i >= 0 ? rest[i + 1] : undefined; }
22
+ function has(rest, name) { return rest.includes(name); }
23
+ export function defaultCommand(env, useNode) {
24
+ if (!useNode)
25
+ return { command: 'dexterm', args: ['mcp'] };
26
+ // Fallback for when dexterm is not on PATH: run this repo's server bin with the current node.
27
+ return { command: process.execPath, args: [mcpBinPath(), 'mcp'] };
28
+ }
29
+ /** Where this repo's standalone MCP server bin lives (used by the --node command and by `doctor`). */
30
+ export function mcpBinPath() {
31
+ const here = dirname(fileURLToPath(import.meta.url)); // packages/cli/src
32
+ return resolve(here, '..', '..', 'mcp', 'bin', 'dexterm-mcp.mjs');
33
+ }
34
+ function home(env) { return env.HOME || env.USERPROFILE || homedir(); }
35
+ function appSupport(env, platform, app) {
36
+ if (platform === 'darwin')
37
+ return join(home(env), 'Library', 'Application Support', app);
38
+ if (platform === 'win32')
39
+ return join(env.APPDATA || join(home(env), 'AppData', 'Roaming'), app);
40
+ return join(env.XDG_CONFIG_HOME || join(home(env), '.config'), app);
41
+ }
42
+ export const CLIENTS = [
43
+ {
44
+ id: 'claude-code', label: 'Claude Code', format: 'json', keyPath: 'mcpServers',
45
+ path: (env) => join(env.DEXTERM_CWD || process.cwd(), '.mcp.json'),
46
+ note: 'project-scoped .mcp.json in the current directory; or run `claude mcp add dexterm -- dexterm mcp`.',
47
+ },
48
+ {
49
+ id: 'claude-desktop', label: 'Claude Desktop', format: 'json', keyPath: 'mcpServers',
50
+ path: (env, platform) => join(appSupport(env, platform, 'Claude'), 'claude_desktop_config.json'),
51
+ note: 'restart Claude Desktop after editing so it re-reads the config.',
52
+ },
53
+ {
54
+ id: 'cursor', label: 'Cursor', format: 'json', keyPath: 'mcpServers',
55
+ path: (env) => join(home(env), '.cursor', 'mcp.json'),
56
+ note: 'global Cursor MCP config (~/.cursor/mcp.json); a project .cursor/mcp.json works too.',
57
+ },
58
+ {
59
+ id: 'codex', label: 'Codex CLI', format: 'toml', keyPath: 'mcp_servers',
60
+ path: (env) => join(env.CODEX_HOME || join(home(env), '.codex'), 'config.toml'),
61
+ note: 'Codex reads MCP servers from the [mcp_servers.*] tables in ~/.codex/config.toml.',
62
+ },
63
+ {
64
+ id: 'openclaw', label: 'OpenClaw / generic agent', format: 'print', keyPath: 'mcpServers',
65
+ path: () => null,
66
+ note: 'OpenClaw and most agents take a standard mcpServers entry; paste this where your agent reads MCP servers, or pass --config FILE to write a JSON file.',
67
+ },
68
+ {
69
+ id: 'generic', label: 'Generic (print the snippet)', format: 'print', keyPath: 'mcpServers',
70
+ path: () => null,
71
+ note: 'the standard stdio MCP server entry; add it to your client\'s MCP config.',
72
+ },
73
+ ];
74
+ export function clientById(id) { return CLIENTS.find((c) => c.id === id); }
75
+ /** The JSON object a json-format client expects under its server map, for `dexterm`. */
76
+ export function serverEntryJson(cmd) {
77
+ return { command: cmd.command, args: cmd.args };
78
+ }
79
+ /** The TOML block a codex-style client expects. */
80
+ export function serverEntryToml(cmd) {
81
+ const args = cmd.args.map((a) => JSON.stringify(a)).join(', ');
82
+ return `[mcp_servers.dexterm]\ncommand = ${JSON.stringify(cmd.command)}\nargs = [${args}]\n`;
83
+ }
84
+ /** Plan a JSON merge: returns the new file text and whether anything changes. Preserves every other key. */
85
+ export function planJson(existingText, keyPath, entry) {
86
+ let obj = {};
87
+ if (existingText && existingText.trim()) {
88
+ try {
89
+ const parsed = JSON.parse(existingText);
90
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
91
+ obj = parsed;
92
+ }
93
+ catch {
94
+ throw new Error('the existing config is not valid JSON — fix or move it, then re-run');
95
+ }
96
+ }
97
+ const map = (obj[keyPath] && typeof obj[keyPath] === 'object' && !Array.isArray(obj[keyPath])) ? obj[keyPath] : {};
98
+ const prev = map.dexterm;
99
+ const was = prev === undefined ? 'absent' : JSON.stringify(prev) === JSON.stringify(entry) ? 'same' : 'different';
100
+ const next = { ...obj, [keyPath]: { ...map, dexterm: entry } };
101
+ return { text: JSON.stringify(next, null, 2) + '\n', changed: was !== 'same', was };
102
+ }
103
+ /** Plan a TOML merge: append the dexterm block when there is no [mcp_servers.dexterm] yet; never clobber. */
104
+ export function planToml(existingText, block) {
105
+ const cur = existingText ?? '';
106
+ if (cur.includes(block.trim()))
107
+ return { text: cur, changed: false, was: 'same', conflict: false };
108
+ if (/\[mcp_servers\.dexterm\]/.test(cur))
109
+ return { text: cur, changed: false, was: 'different', conflict: true };
110
+ const sep = cur.length && !cur.endsWith('\n\n') ? (cur.endsWith('\n') ? '\n' : '\n\n') : '';
111
+ return { text: cur + sep + block, changed: true, was: 'absent', conflict: false };
112
+ }
113
+ function readLineYesNo(io, prompt) {
114
+ const stdin = io.stdin;
115
+ if (!stdin || !stdin.isTTY)
116
+ return Promise.resolve(false);
117
+ return new Promise((res) => {
118
+ const rl = readline.createInterface({ input: stdin, output: io.stdout });
119
+ rl.question(prompt, (ans) => { rl.close(); res(/^y(es)?$/i.test(ans.trim())); });
120
+ });
121
+ }
122
+ function backupPath(file) {
123
+ const stamp = new Date().toISOString().replace(/[:.]/g, '-');
124
+ return `${file}.bak-${stamp}`;
125
+ }
126
+ async function install(rest, io) {
127
+ const out = (s) => io.stdout.write(s + '\n');
128
+ const errOut = (s) => io.stderr.write(s + '\n');
129
+ const id = rest.find((a) => !a.startsWith('-'));
130
+ const spec = id ? clientById(id) : undefined;
131
+ if (!spec) {
132
+ errOut(`usage: dexterm mcp install <${CLIENTS.map((c) => c.id).join('|')}> [--config FILE] [--print] [--node] [--yes]`);
133
+ if (id)
134
+ errOut(`unknown client "${id}". known: ${CLIENTS.map((c) => c.id).join(', ')}`);
135
+ return 2;
136
+ }
137
+ const printOnly = has(rest, '--print');
138
+ const useNode = has(rest, '--node');
139
+ const yes = has(rest, '--yes') || has(rest, '-y');
140
+ const cmd = defaultCommand(io.env, useNode);
141
+ const override = flag(rest, '--config');
142
+ const target = override ? resolve(override) : spec.path(io.env, process.platform);
143
+ const forcePrint = spec.format === 'print' && !override;
144
+ // The snippet we would add, always shown.
145
+ const snippet = spec.format === 'toml' ? serverEntryToml(cmd) : JSON.stringify({ [spec.keyPath]: { dexterm: serverEntryJson(cmd) } }, null, 2);
146
+ out(`dexterm MCP server for ${spec.label}:`);
147
+ out('');
148
+ out(indent(snippet));
149
+ out('');
150
+ if (spec.note)
151
+ out(`note: ${spec.note}`);
152
+ if (printOnly || forcePrint) {
153
+ if (forcePrint && !printOnly)
154
+ out('(this client has no single well-known config file — paste the snippet above, or pass --config FILE to write it.)');
155
+ return 0;
156
+ }
157
+ if (!target) {
158
+ out('pass --config FILE to write this to a specific file.');
159
+ return 0;
160
+ }
161
+ const existed = existsSync(target);
162
+ const existingText = existed ? readFileSync(target, 'utf8') : null;
163
+ let plan;
164
+ try {
165
+ plan = spec.format === 'toml'
166
+ ? planToml(existingText, serverEntryToml(cmd))
167
+ : planJson(existingText, spec.keyPath, serverEntryJson(cmd));
168
+ }
169
+ catch (e) {
170
+ errOut(`dexterm mcp install: ${e.message} (${target})`);
171
+ return 1;
172
+ }
173
+ out('');
174
+ out(`target: ${target}${existed ? '' : ' (new file)'}`);
175
+ if (plan.conflict) {
176
+ out('a [mcp_servers.dexterm] section already exists and differs; not modifying it. Review it by hand, or edit it to match the snippet above.');
177
+ return 0;
178
+ }
179
+ if (!plan.changed) {
180
+ out('already configured — nothing to change (idempotent).');
181
+ return 0;
182
+ }
183
+ out(plan.was === 'different' ? 'this UPDATES the existing dexterm entry.' : existed ? 'this ADDS a dexterm entry (your other servers are preserved).' : 'this CREATES the config file with a dexterm entry.');
184
+ if (!yes) {
185
+ const ok = await readLineYesNo(io, 'write this change? [y/N] ');
186
+ if (!ok) {
187
+ out(io.stdin?.isTTY ? 'cancelled; nothing was written.' : 'not a TTY and --yes was not given; nothing written. Re-run with --yes to write, or --print to just print.');
188
+ return io.stdin?.isTTY ? 0 : 0;
189
+ }
190
+ }
191
+ try {
192
+ mkdirSync(dirname(target), { recursive: true });
193
+ if (existed) {
194
+ const bak = backupPath(target);
195
+ copyFileSync(target, bak);
196
+ out(`backed up: ${bak}`);
197
+ }
198
+ writeFileSync(target, plan.text, { mode: 0o600 });
199
+ out(`wrote ${target}.`);
200
+ out(`verify it: dexterm mcp doctor`);
201
+ return 0;
202
+ }
203
+ catch (e) {
204
+ errOut(`dexterm mcp install: could not write ${target}: ${e.message}`);
205
+ return 1;
206
+ }
207
+ }
208
+ function indent(s) { return s.split('\n').map((l) => ' ' + l).join('\n'); }
209
+ async function doctor(rest, io) {
210
+ const out = (s) => io.stdout.write(s + '\n');
211
+ const errOut = (s) => io.stderr.write(s + '\n');
212
+ // Prefer the command install writes (`dexterm mcp`); fall back to this repo's node bin when dexterm is
213
+ // not on PATH (e.g. a dev checkout). Either way this is a real stdio child, not an in-process shortcut.
214
+ const useNode = has(rest, '--node');
215
+ const cmd = useNode ? defaultCommand(io.env, true) : { command: 'dexterm', args: ['mcp'] };
216
+ out(`dexterm mcp doctor — spawning: ${cmd.command} ${cmd.args.join(' ')}`);
217
+ const result = await probe(cmd, io.env).catch((e) => ({ error: e.message }));
218
+ if ('error' in result && !useNode && /ENOENT|not found|spawn/i.test(result.error)) {
219
+ // dexterm not on PATH: retry with the bundled node bin so doctor still verifies the server.
220
+ out(`(dexterm not on PATH; retrying with this checkout's server)`);
221
+ const fallback = defaultCommand(io.env, true);
222
+ out(`dexterm mcp doctor — spawning: ${fallback.command} ${fallback.args.join(' ')}`);
223
+ const r2 = await probe(fallback, io.env).catch((e) => ({ error: e.message }));
224
+ return report(r2, out, errOut);
225
+ }
226
+ return report(result, out, errOut);
227
+ }
228
+ function report(r, out, errOut) {
229
+ if ('error' in r) {
230
+ errOut(`✗ could not reach the MCP server: ${r.error}`);
231
+ return 1;
232
+ }
233
+ const info = r.serverInfo;
234
+ out(`✓ connected to ${info?.name ?? 'dexterm'} ${info?.version ?? ''} over stdio (MCP initialize ok)`);
235
+ out(`tools (${r.tools.length}): ${r.tools.join(', ')}`);
236
+ out(`prompts/skills (${r.prompts.length}): ${r.prompts.join(', ') || '(none)'}`);
237
+ out(`resources: ${r.resources}`);
238
+ out('the connection works; add it to your agent with `dexterm mcp install <client>`.');
239
+ return 0;
240
+ }
241
+ function probe(cmd, env) {
242
+ return new Promise((res, rej) => {
243
+ const child = spawn(cmd.command, cmd.args, { stdio: ['pipe', 'pipe', 'pipe'], env: { ...env, DEXTERM_OFFLINE: '1', NO_COLOR: '1' } });
244
+ const timer = setTimeout(() => { try {
245
+ child.kill();
246
+ }
247
+ catch { /* ignore */ } rej(new Error('timed out waiting for the server (10s)')); }, 10_000);
248
+ let stderr = '';
249
+ child.on('error', (e) => { clearTimeout(timer); rej(e); });
250
+ child.stderr.on('data', (d) => { stderr += String(d); });
251
+ const rl = readline.createInterface({ input: child.stdout });
252
+ const pending = new Map();
253
+ let seq = 0;
254
+ const send = (method, params) => {
255
+ const id = ++seq;
256
+ const msg = { jsonrpc: '2.0', id, method, ...(params ? { params } : {}) };
257
+ return new Promise((r) => { pending.set(id, r); child.stdin.write(JSON.stringify(msg) + '\n'); });
258
+ };
259
+ rl.on('line', (line) => {
260
+ if (!line.trim())
261
+ return;
262
+ let msg;
263
+ try {
264
+ msg = JSON.parse(line);
265
+ }
266
+ catch {
267
+ return;
268
+ }
269
+ if (typeof msg.id === 'number' && pending.has(msg.id)) {
270
+ const r = pending.get(msg.id);
271
+ pending.delete(msg.id);
272
+ r(msg.result ?? {});
273
+ }
274
+ });
275
+ (async () => {
276
+ try {
277
+ const init = await send('initialize', { protocolVersion: '2025-06-18', capabilities: {}, clientInfo: { name: 'dexterm-doctor', version: '1' } });
278
+ const toolsRes = await send('tools/list');
279
+ const promptsRes = await send('prompts/list');
280
+ const resRes = await send('resources/list');
281
+ clearTimeout(timer);
282
+ try {
283
+ child.stdin.end();
284
+ }
285
+ catch { /* ignore */ }
286
+ try {
287
+ child.kill();
288
+ }
289
+ catch { /* ignore */ }
290
+ const tools = Array.isArray(toolsRes.tools) ? toolsRes.tools.map((t) => String(t.name)) : [];
291
+ const prompts = Array.isArray(promptsRes.prompts) ? promptsRes.prompts.map((p) => String(p.name)) : [];
292
+ const resources = Array.isArray(resRes.resources) ? resRes.resources.length : 0;
293
+ res({ serverInfo: init.serverInfo ?? {}, tools, prompts, resources });
294
+ }
295
+ catch (e) {
296
+ clearTimeout(timer);
297
+ rej(new Error(`${e.message}${stderr ? ` · server stderr: ${stderr.slice(0, 200)}` : ''}`));
298
+ }
299
+ })();
300
+ });
301
+ }
302
+ const USAGE = `dexterm mcp [<command>]
303
+ (no command) run the read-only MCP server on stdio (claude mcp add dexterm -- dexterm mcp)
304
+ install <client> write/print the MCP config for a client and verify what changes
305
+ clients: ${CLIENTS.map((c) => c.id).join(', ')}
306
+ --config FILE write to a specific file (instead of the client's default)
307
+ --print only print the snippet, never write
308
+ --node emit a "node <path> mcp" command (when dexterm is not on PATH)
309
+ --yes write without the confirmation prompt
310
+ doctor spawn the server, do the MCP handshake, and list the tools/prompts/resources`;
311
+ /** `dexterm mcp …`. With no subcommand (or an arg the server consumes, e.g. --replay) it runs the server. */
312
+ export async function runMcp(rest, io) {
313
+ const sub = rest[0];
314
+ if (sub === 'install')
315
+ return install(rest.slice(1), io);
316
+ if (sub === 'doctor')
317
+ return doctor(rest.slice(1), io);
318
+ if (sub === 'help' || sub === '--help' || sub === '-h') {
319
+ io.stdout.write(USAGE + '\n');
320
+ return 0;
321
+ }
322
+ // Anything else (no args, or server flags like --replay) → the stdio server, unchanged.
323
+ const { runStdioServer } = await import('../../mcp/src/index.js');
324
+ await runStdioServer({ argv: rest });
325
+ return 0;
326
+ }
@@ -0,0 +1,76 @@
1
+ // `dexterm narrative [--window 1h|24h] [--summary] [--db PATH]` (task-1356, AI-SUITE-DESIGN §7).
2
+ // Computes the narrative board from the history recorder's snapshots and prints it (or the deterministic
3
+ // 90-second morning summary with --summary). No network, no model. Read-only on the DB.
4
+ import { DatabaseSync } from 'node:sqlite';
5
+ import { defaultDbPath } from '../../data/src/index.js';
6
+ import { computeBoard, recentNarrativeRows, loadDefaultLexicon, renderBoardText, summaryText } from '../../packs/src/index.js';
7
+ export const NARRATIVE_HELP = `dexterm narrative: the narrative board over recorded history (task-1356). No network, no model.
8
+
9
+ dexterm narrative [--window 1h|24h] [--summary] [--db PATH]
10
+
11
+ --window 1h (default) or 24h: which window the "what is working" score uses.
12
+ --summary print the deterministic 90-second spoken summary instead of the table (keyless, no model).
13
+ --db defaults to DEXTERM_DB_PATH, else ~/.local/share/dexterm/dexterm.db.
14
+
15
+ Narratives are clustered from token names against a versioned lexicon (owner: maintainers); X/Telegram-only
16
+ narratives are missed and the honest unclassified share is shown. The board needs the app to have been
17
+ running with the recorder on (switch off with --no-recorder / DEXTERM_RECORDER=0).`;
18
+ function parse(argv) {
19
+ const opts = {};
20
+ for (let i = 0; i < argv.length; i++) {
21
+ const a = argv[i];
22
+ if (!a.startsWith('--'))
23
+ continue;
24
+ const k = a.slice(2);
25
+ const v = argv[i + 1];
26
+ if (v !== undefined && !v.startsWith('--') && k !== 'summary') {
27
+ opts[k] = v;
28
+ i++;
29
+ }
30
+ else
31
+ opts[k] = true;
32
+ }
33
+ return opts;
34
+ }
35
+ export function narrativeCommand(argv, io) {
36
+ const opts = parse(argv);
37
+ if (opts.help || opts.h) {
38
+ io.stdout.write(NARRATIVE_HELP + '\n');
39
+ return 0;
40
+ }
41
+ const path = typeof opts.db === 'string' ? opts.db : (io.env.DEXTERM_DB_PATH || defaultDbPath(io.env));
42
+ if (path === ':memory:') {
43
+ io.stderr.write('dexterm narrative: an in-memory DB has no history\n');
44
+ return 2;
45
+ }
46
+ const window = opts.window === '24h' ? '24h' : '1h';
47
+ let db = null;
48
+ try {
49
+ db = new DatabaseSync(path, { readOnly: true });
50
+ const hasTable = db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'token_snapshots'").get();
51
+ if (!hasTable) {
52
+ io.stderr.write(`dexterm narrative: no recorded history in ${path} (run the app with the recorder on first)\n`);
53
+ return 2;
54
+ }
55
+ const rows = recentNarrativeRows(db, {});
56
+ const board = computeBoard(rows, loadDefaultLexicon(), { window });
57
+ if (opts.summary) {
58
+ const s = summaryText(board);
59
+ io.stdout.write(`${s.text}\n\n[${s.words} words ≈ ${s.approx_sec}s at 150 wpm; deterministic template, no model]\n`);
60
+ }
61
+ else {
62
+ io.stdout.write(renderBoardText(board));
63
+ }
64
+ return 0;
65
+ }
66
+ catch (e) {
67
+ io.stderr.write(`dexterm narrative: ${e instanceof Error ? e.message : String(e)}\n`);
68
+ return 1;
69
+ }
70
+ finally {
71
+ try {
72
+ db?.close();
73
+ }
74
+ catch { /* ignore */ }
75
+ }
76
+ }