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,47 @@
1
+ // dexterm T1 — the PANIC kill switch (SPEC §6.4 "panic key", §6.5 `panic()`; task-1310 round 2).
2
+ //
3
+ // The cheapest safe version of the signer's panic path tonight: a marker file under ~/.dexterm. While
4
+ // it exists, the live executor refuses every plan and every confirm, in EVERY process that reads it
5
+ // (the file is re-read on each check, never cached), so `dexterm wallet panic` from a second terminal
6
+ // stops a trade that another dexterm is about to sign. A file we cannot parse counts as ENGAGED
7
+ // (fail closed). Releasing it (`dexterm wallet resume`) requires a real TTY keypress — see the CLI.
8
+ // This module holds no keys and performs no network I/O.
9
+ import { readFileSync, writeFileSync, rmSync, mkdirSync, existsSync } from 'node:fs';
10
+ import { dirname, join } from 'node:path';
11
+ import { homedir } from 'node:os';
12
+ export function defaultPanicPath() {
13
+ return join(homedir(), '.dexterm', 'trading.panic');
14
+ }
15
+ export class KillSwitch {
16
+ path;
17
+ constructor(path = defaultPanicPath()) { this.path = path; }
18
+ /** The engaged record, or null when live trading is allowed. Always re-reads the file. */
19
+ engaged() {
20
+ if (!existsSync(this.path))
21
+ return null;
22
+ try {
23
+ const raw = JSON.parse(readFileSync(this.path, 'utf8'));
24
+ return { engagedAt: Number(raw.engagedAt) || 0, reason: typeof raw.reason === 'string' ? raw.reason.slice(0, 200) : 'panic' };
25
+ }
26
+ catch {
27
+ return { engagedAt: 0, reason: 'panic file unreadable (treated as engaged)' };
28
+ }
29
+ }
30
+ /** Engage: disable live trading everywhere. Idempotent; the first reason is kept. */
31
+ engage(reason = 'panic', now = Date.now()) {
32
+ const existing = this.engaged();
33
+ if (existing)
34
+ return existing;
35
+ const rec = { engagedAt: now, reason: reason.slice(0, 200) };
36
+ mkdirSync(dirname(this.path), { recursive: true });
37
+ writeFileSync(this.path, JSON.stringify(rec, null, 2) + '\n', { mode: 0o600 });
38
+ return rec;
39
+ }
40
+ /** Release: returns true when a panic was engaged. The CLI gates this behind a TTY keypress. */
41
+ release() {
42
+ if (!existsSync(this.path))
43
+ return false;
44
+ rmSync(this.path, { force: true });
45
+ return true;
46
+ }
47
+ }
@@ -0,0 +1,52 @@
1
+ // dexterm T1 — the linked-wallet store. dexterm persists ONLY the public key (an address; never a
2
+ // private key, seed or signature). Kept in a small JSON file outside any repo, mode 600 as
3
+ // defence-in-depth even though a pubkey is public. The bridge (bridge.ts) produces the pubkey; this
4
+ // just remembers it so the status bar can show "linked: <short>" and the executor knows the signer.
5
+ import { readFileSync, writeFileSync, rmSync, mkdirSync, existsSync, chmodSync } from 'node:fs';
6
+ import { dirname, join } from 'node:path';
7
+ import { homedir } from 'node:os';
8
+ const B58 = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;
9
+ export function defaultLinkPath() {
10
+ return join(homedir(), '.dexterm', 'wallet-link.json');
11
+ }
12
+ export function shortPubkey(pk) {
13
+ return pk.length > 10 ? `${pk.slice(0, 4)}…${pk.slice(-4)}` : pk;
14
+ }
15
+ export class WalletLinkStore {
16
+ path;
17
+ constructor(path = defaultLinkPath()) { this.path = path; }
18
+ /** The linked wallet, or null when none / unreadable / malformed. */
19
+ get() {
20
+ try {
21
+ if (!existsSync(this.path))
22
+ return null;
23
+ const raw = JSON.parse(readFileSync(this.path, 'utf8'));
24
+ if (typeof raw.publicKey !== 'string' || !B58.test(raw.publicKey))
25
+ return null;
26
+ return { publicKey: raw.publicKey, linkedAt: Number(raw.linkedAt) || 0, network: typeof raw.network === 'string' ? raw.network : undefined };
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ /** Persist a linked wallet. Validates the pubkey is base58; refuses anything that is not an address. */
33
+ set(publicKey, opts = {}) {
34
+ if (!B58.test(publicKey))
35
+ throw new Error('refusing to store a non-base58 value as a wallet pubkey');
36
+ const rec = { publicKey, linkedAt: opts.now ?? Date.now(), network: opts.network };
37
+ mkdirSync(dirname(this.path), { recursive: true });
38
+ writeFileSync(this.path, JSON.stringify(rec, null, 2) + '\n', { mode: 0o600 });
39
+ try {
40
+ chmodSync(this.path, 0o600);
41
+ }
42
+ catch { /* best effort on platforms without chmod */ }
43
+ return rec;
44
+ }
45
+ /** Remove the link; returns true when a link existed. */
46
+ clear() {
47
+ if (!existsSync(this.path))
48
+ return false;
49
+ rmSync(this.path, { force: true });
50
+ return true;
51
+ }
52
+ }
@@ -0,0 +1,157 @@
1
+ // task-1355 — the CONFIRM GATE: three confirmation tiers, all bound to the plan hash (SPEC §6.13.4).
2
+ //
3
+ // tier 1 keypress (DEFAULT) hold a physical key >= HOLD_MS on the plan card, or a Phantom approval
4
+ // tier 2 ptt-held speak "send it <code>" WHILE the push-to-talk key is physically held
5
+ // tier 3 hands-free speak "send it <code>" with the key up — only after the "this is less
6
+ // safe" risk popup was accepted by keypress (local, logged, reversible,
7
+ // expires), and with lower caps
8
+ //
9
+ // The signer side issues a CHALLENGE for one plan hash: {code, readBack, expiresAt}. The read-back is
10
+ // what is spoken/rendered; the two-digit code inside it is what the user must echo. A confirmation is
11
+ // accepted only if the challenge is unconsumed, unexpired, for the CURRENT plan hash, and the evidence
12
+ // satisfies the tier. On success the gate returns a GESTURE PROOF (single-use) that the engine's `arm`
13
+ // consumes. Nothing in this file can execute anything; it only decides whether a proof exists.
14
+ // Ported from the task-1292 reference simulation (research/task-1292/sim/confirm.mjs), typed.
15
+ export const HOLD_MS = 400;
16
+ export const CHALLENGE_TTL_MS = { 'keypress': 90_000, 'ptt-held': 20_000, 'hands-free': 12_000 };
17
+ /** The mic is muted while the read-back is spoken; a "confirm" that lands inside this window after it is echo. */
18
+ export const ECHO_GUARD_MS = 300;
19
+ export const RISK_ACCEPT_TTL_MS = 24 * 3600_000;
20
+ const PHRASE_RE = /^\s*send it[,\s]+(\d{2})\s*$/i;
21
+ export class ConfirmError extends Error {
22
+ reason;
23
+ constructor(reason, message) {
24
+ super(message);
25
+ this.name = 'ConfirmError';
26
+ this.reason = reason;
27
+ }
28
+ }
29
+ export class Settings {
30
+ clock;
31
+ journal;
32
+ gateOff = false;
33
+ risk = null;
34
+ constructor(clock, journal) { this.clock = clock; this.journal = journal; }
35
+ /** Turning the keypress gate off needs the risk popup accepted BY KEYPRESS. Logged. Expires. Reversible. */
36
+ acceptRiskPopup(gesture) {
37
+ if (gesture?.gesture !== 'keypress')
38
+ throw new ConfirmError('risk-needs-keypress', 'the "less safe" popup can only be accepted with a keypress');
39
+ const now = this.clock.now();
40
+ this.risk = { acceptedAt: now, expiresAt: now + RISK_ACCEPT_TTL_MS, text: 'this is less safe' };
41
+ this.gateOff = true;
42
+ this.journal?.append('settings.gate-off', { data: { acceptedAt: now, expiresAt: this.risk.expiresAt, by: 'keypress' } });
43
+ }
44
+ restoreGate() { this.gateOff = false; this.risk = null; this.journal?.append('settings.gate-on', {}); }
45
+ handsFreeAllowed(now) { return this.gateOff && this.risk !== null && now <= this.risk.expiresAt; }
46
+ }
47
+ export class ConfirmGate {
48
+ clock;
49
+ journal;
50
+ settings;
51
+ rng;
52
+ challenges = new Map();
53
+ proofs = new Map();
54
+ n = 0;
55
+ handsFreeAllowed() { return this.settings.handsFreeAllowed(this.clock.now()); }
56
+ constructor({ clock, journal, settings, rng = Math.random }) {
57
+ this.clock = clock;
58
+ this.journal = journal;
59
+ this.settings = settings;
60
+ this.rng = rng;
61
+ }
62
+ /** Issue a challenge for a plan at a tier. The code is random per challenge so a recording cannot be replayed. */
63
+ issue(plan, tier, readBackText) {
64
+ if (!(tier in CHALLENGE_TTL_MS))
65
+ throw new ConfirmError('bad-tier', 'unknown tier');
66
+ const now = this.clock.now();
67
+ const code = String(10 + Math.floor(this.rng() * 90)); // 10..99
68
+ const c = {
69
+ id: `ch_${++this.n}`, planId: plan.id, planHash: plan.hash, tier, code, issuedAt: now, expiresAt: now + CHALLENGE_TTL_MS[tier],
70
+ readBack: `${readBackText} Confirm code ${code}.`, readBackSpokenUntil: now + 2500, consumed: false,
71
+ };
72
+ this.challenges.set(c.id, c);
73
+ this.journal?.append('confirm.challenge', { planId: plan.id, data: { challengeId: c.id, planHash: plan.hash, tier, expiresAt: c.expiresAt } });
74
+ return c;
75
+ }
76
+ /**
77
+ * Try to confirm. `currentPlan` is the plan the engine holds NOW for that id (hash may have moved).
78
+ * Returns a gesture proof, or throws ConfirmError with a typed reason. Every outcome is journaled.
79
+ */
80
+ confirm({ challengeId, evidence }, currentPlan) {
81
+ const c = this.challenges.get(challengeId);
82
+ const now = this.clock.now();
83
+ const journal = this.journal;
84
+ // function declaration (not an arrow) so its `never` return narrows `c`/`currentPlan` below.
85
+ function fail(reason, message) {
86
+ journal?.append('confirm.refused', { planId: c?.planId ?? null, data: { challengeId, reason } });
87
+ throw new ConfirmError(reason, message);
88
+ }
89
+ if (!c)
90
+ fail('unknown-challenge', 'no such challenge');
91
+ if (c.consumed)
92
+ fail('challenge-consumed', 'this confirmation was already used (replay)');
93
+ if (now > c.expiresAt)
94
+ fail('challenge-expired', 'the confirmation window closed; re-read the plan');
95
+ if (!currentPlan || currentPlan.id !== c.planId)
96
+ fail('plan-gone', 'the plan no longer exists');
97
+ if (currentPlan.hash !== c.planHash)
98
+ fail('plan-hash-mismatch', 'the plan changed since it was read back; confirm the new one');
99
+ if (currentPlan.status !== 'proposed')
100
+ fail('plan-not-proposed', `plan is ${currentPlan.status}`);
101
+ const gesture = this.checkEvidence(c, evidence, now, fail);
102
+ c.consumed = true;
103
+ const proof = { id: `proof_${c.id}`, kind: 'gesture', signerIssued: true, gesture, tier: c.tier, subject: `plan:${c.planId}:${c.planHash}`, at: now, consumed: false };
104
+ this.proofs.set(proof.id, proof);
105
+ this.journal?.append('confirm.accepted', { planId: c.planId, data: { challengeId: c.id, tier: c.tier, gesture, planHash: c.planHash } });
106
+ return proof;
107
+ }
108
+ checkEvidence(c, ev, now, fail) {
109
+ if (!ev || typeof ev !== 'object')
110
+ fail('no-evidence', 'no confirmation evidence');
111
+ const e = ev;
112
+ if (c.tier === 'keypress') {
113
+ if (e.kind === 'phantom-approval' && e.approvedPlanHash === c.planHash)
114
+ return 'phantom';
115
+ if (e.kind !== 'keypress')
116
+ fail('tier-mismatch', 'a keypress-tier challenge needs a keypress (or Phantom approval)');
117
+ const kp = e;
118
+ if (!(kp.holdMs >= HOLD_MS))
119
+ fail('hold-too-short', `hold the key for at least ${HOLD_MS} ms`);
120
+ if (kp.synthetic)
121
+ fail('synthetic-key', 'synthetic key events are not a gesture');
122
+ return 'keypress';
123
+ }
124
+ // spoken tiers
125
+ if (e.kind !== 'spoken')
126
+ fail('tier-mismatch', 'this challenge needs a spoken confirmation');
127
+ const sp = e;
128
+ if (sp.speakerCount !== 1)
129
+ fail('multiple-speakers', 'more than one speaker');
130
+ if (sp.echoFlag)
131
+ fail('echo', 'the recogniser flagged echo of our own audio');
132
+ if (sp.utteranceStart < c.readBackSpokenUntil + ECHO_GUARD_MS)
133
+ fail('echo-window', 'confirmation arrived while the read-back was still being spoken');
134
+ const m = PHRASE_RE.exec(sp.phrase ?? '');
135
+ if (!m)
136
+ fail('bad-phrase', 'say "send it" followed by the two-digit code');
137
+ if (m[1] !== c.code)
138
+ fail('bad-code', 'wrong confirmation code');
139
+ if (c.tier === 'ptt-held') {
140
+ if (!(typeof sp.pttDownAt === 'number' && typeof sp.pttUpAt === 'number'))
141
+ fail('ptt-not-held', 'push-to-talk was not held');
142
+ if (!(sp.pttDownAt <= sp.utteranceStart && sp.utteranceEnd <= sp.pttUpAt))
143
+ fail('ptt-not-held', 'the confirmation must be spoken entirely while the talk key is held');
144
+ return 'spoken-ptt';
145
+ }
146
+ // hands-free
147
+ if (!this.settings.handsFreeAllowed(now))
148
+ fail('gate-on', 'hands-free confirm is off: the keypress gate is on (accept the "less safe" popup first)');
149
+ if (sp.pttHeld)
150
+ return 'spoken-ptt'; // holding the key is always at least as good
151
+ return 'spoken-free';
152
+ }
153
+ }
154
+ /** The caps multiplier a gesture earns (keypress/phantom = full mandate caps; spoken = less). */
155
+ export function gestureTier(gesture) {
156
+ return gesture === 'keypress' || gesture === 'phantom' ? 'keypress' : gesture === 'spoken-ptt' ? 'ptt-held' : 'hands-free';
157
+ }