dexterm-cli 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/LICENSE +661 -0
  2. package/dist/packages/agents/src/audit.js +122 -0
  3. package/dist/packages/agents/src/bus.js +379 -0
  4. package/dist/packages/agents/src/executor.js +177 -0
  5. package/dist/packages/agents/src/gate.js +176 -0
  6. package/dist/packages/agents/src/identity.js +179 -0
  7. package/dist/packages/agents/src/index.js +15 -0
  8. package/dist/packages/agents/src/proposals.js +153 -0
  9. package/dist/packages/agents/src/schema.js +87 -0
  10. package/dist/packages/agents/src/sdk.js +140 -0
  11. package/dist/packages/agents/src/tiers.js +114 -0
  12. package/dist/packages/agents/src/tools.js +69 -0
  13. package/dist/packages/agents/src/ws.js +158 -0
  14. package/dist/packages/cli/assets/claude/analyst-system.md +76 -0
  15. package/dist/packages/cli/assets/claude/plugin/.claude-plugin/plugin.json +5 -0
  16. package/dist/packages/cli/assets/claude/plugin/skills/REGISTRY.json +16 -0
  17. package/dist/packages/cli/assets/claude/plugin/skills/larp-check/SKILL.md +67 -0
  18. package/dist/packages/cli/assets/claude/plugin/skills/rug-check/SKILL.md +64 -0
  19. package/dist/packages/cli/assets/claude/plugin/skills/token-dossier/SKILL.md +63 -0
  20. package/dist/packages/cli/assets/claude/plugin/skills/trench-scan/SKILL.md +44 -0
  21. package/dist/packages/cli/assets/claude/schemas/larp.schema.json +117 -0
  22. package/dist/packages/cli/assets/claude/schemas/trench-scan.schema.json +71 -0
  23. package/dist/packages/cli/assets/claude/schemas/verdict.schema.json +115 -0
  24. package/dist/packages/cli/bin/dexterm.mjs +11 -0
  25. package/dist/packages/cli/src/agent-cmd.js +303 -0
  26. package/dist/packages/cli/src/agent-roster.js +26 -0
  27. package/dist/packages/cli/src/analyst/backend.js +526 -0
  28. package/dist/packages/cli/src/analyst/results.js +38 -0
  29. package/dist/packages/cli/src/analyst/session.js +319 -0
  30. package/dist/packages/cli/src/audit.js +51 -0
  31. package/dist/packages/cli/src/backtest-cmd.js +149 -0
  32. package/dist/packages/cli/src/boot-state.js +62 -0
  33. package/dist/packages/cli/src/custom.js +261 -0
  34. package/dist/packages/cli/src/display.js +191 -0
  35. package/dist/packages/cli/src/doctor.js +361 -0
  36. package/dist/packages/cli/src/feed.js +634 -0
  37. package/dist/packages/cli/src/fixtures.js +275 -0
  38. package/dist/packages/cli/src/follow-cmd.js +221 -0
  39. package/dist/packages/cli/src/images-config.js +59 -0
  40. package/dist/packages/cli/src/index.js +31 -0
  41. package/dist/packages/cli/src/kb-skill-cmd.js +240 -0
  42. package/dist/packages/cli/src/larp-record.js +21 -0
  43. package/dist/packages/cli/src/live/copy.js +80 -0
  44. package/dist/packages/cli/src/live/flow.js +233 -0
  45. package/dist/packages/cli/src/live/index.js +509 -0
  46. package/dist/packages/cli/src/live/intel.js +227 -0
  47. package/dist/packages/cli/src/live/newpairs.js +334 -0
  48. package/dist/packages/cli/src/live/screens/newpairs-live.js +219 -0
  49. package/dist/packages/cli/src/live/screens/token-live.js +459 -0
  50. package/dist/packages/cli/src/live/screens/watchlist-live.js +149 -0
  51. package/dist/packages/cli/src/live/token.js +585 -0
  52. package/dist/packages/cli/src/live/trade.js +929 -0
  53. package/dist/packages/cli/src/live/watchlist.js +178 -0
  54. package/dist/packages/cli/src/main.js +5583 -0
  55. package/dist/packages/cli/src/narrative-cmd.js +76 -0
  56. package/dist/packages/cli/src/pack-cmd.js +323 -0
  57. package/dist/packages/cli/src/plan-cmd.js +278 -0
  58. package/dist/packages/cli/src/popup.js +810 -0
  59. package/dist/packages/cli/src/rules-cmd.js +131 -0
  60. package/dist/packages/cli/src/rules.js +339 -0
  61. package/dist/packages/cli/src/scan/command.js +57 -0
  62. package/dist/packages/cli/src/scan/engine.js +419 -0
  63. package/dist/packages/cli/src/scan/observe.js +64 -0
  64. package/dist/packages/cli/src/scan/ui.js +98 -0
  65. package/dist/packages/cli/src/screener/filter.js +241 -0
  66. package/dist/packages/cli/src/screener/presets.js +80 -0
  67. package/dist/packages/cli/src/screener/rows.js +146 -0
  68. package/dist/packages/cli/src/screener/rug.js +50 -0
  69. package/dist/packages/cli/src/screener/sort.js +52 -0
  70. package/dist/packages/cli/src/screener/view.js +183 -0
  71. package/dist/packages/cli/src/screens/analyst-session.js +343 -0
  72. package/dist/packages/cli/src/screens/analyst.js +326 -0
  73. package/dist/packages/cli/src/screens/boot.js +74 -0
  74. package/dist/packages/cli/src/screens/bubbles.js +255 -0
  75. package/dist/packages/cli/src/screens/coin.js +33 -0
  76. package/dist/packages/cli/src/screens/follows.js +201 -0
  77. package/dist/packages/cli/src/screens/kol.js +90 -0
  78. package/dist/packages/cli/src/screens/narrative.js +90 -0
  79. package/dist/packages/cli/src/screens/newpairs.js +150 -0
  80. package/dist/packages/cli/src/screens/overlay.js +257 -0
  81. package/dist/packages/cli/src/screens/plans.js +126 -0
  82. package/dist/packages/cli/src/screens/positions.js +176 -0
  83. package/dist/packages/cli/src/screens/rules.js +170 -0
  84. package/dist/packages/cli/src/screens/screener.js +459 -0
  85. package/dist/packages/cli/src/screens/social-panel.js +107 -0
  86. package/dist/packages/cli/src/screens/ticket.js +342 -0
  87. package/dist/packages/cli/src/screens/token.js +312 -0
  88. package/dist/packages/cli/src/screens/trending.js +181 -0
  89. package/dist/packages/cli/src/screens/watchlist.js +104 -0
  90. package/dist/packages/cli/src/social/demo.js +96 -0
  91. package/dist/packages/cli/src/social/view.js +250 -0
  92. package/dist/packages/cli/src/state.js +463 -0
  93. package/dist/packages/cli/src/theme-cmd.js +126 -0
  94. package/dist/packages/cli/src/trade.js +319 -0
  95. package/dist/packages/cli/src/voice-hud.js +42 -0
  96. package/dist/packages/cli/src/wallet-cmd.js +440 -0
  97. package/dist/packages/cli/src/wallet-command.js +31 -0
  98. package/dist/packages/cli/src/widgets.js +208 -0
  99. package/dist/packages/cli/src/workspace-cmd.js +68 -0
  100. package/dist/packages/cli/src/x-cmd.js +154 -0
  101. package/dist/packages/custom/src/config.js +213 -0
  102. package/dist/packages/custom/src/index.js +10 -0
  103. package/dist/packages/custom/src/keymap.js +107 -0
  104. package/dist/packages/custom/src/layout.js +235 -0
  105. package/dist/packages/custom/src/packs.js +633 -0
  106. package/dist/packages/custom/src/rules.js +704 -0
  107. package/dist/packages/custom/src/schema.js +515 -0
  108. package/dist/packages/custom/src/themes.js +176 -0
  109. package/dist/packages/custom/src/widget-html.js +222 -0
  110. package/dist/packages/custom/src/workspace.js +141 -0
  111. package/dist/packages/data/src/analyst-actions.js +133 -0
  112. package/dist/packages/data/src/budget.js +88 -0
  113. package/dist/packages/data/src/cache.js +142 -0
  114. package/dist/packages/data/src/candles.js +168 -0
  115. package/dist/packages/data/src/clock.js +64 -0
  116. package/dist/packages/data/src/credits.js +137 -0
  117. package/dist/packages/data/src/detail.js +97 -0
  118. package/dist/packages/data/src/fast-lane.js +321 -0
  119. package/dist/packages/data/src/fixtures.js +135 -0
  120. package/dist/packages/data/src/health.js +245 -0
  121. package/dist/packages/data/src/http.js +277 -0
  122. package/dist/packages/data/src/images/cache.js +141 -0
  123. package/dist/packages/data/src/images/decode-worker.js +28 -0
  124. package/dist/packages/data/src/images/decode.js +81 -0
  125. package/dist/packages/data/src/images/fetch.js +162 -0
  126. package/dist/packages/data/src/images/gif.js +214 -0
  127. package/dist/packages/data/src/images/index.js +10 -0
  128. package/dist/packages/data/src/images/jpeg.js +544 -0
  129. package/dist/packages/data/src/images/png.js +310 -0
  130. package/dist/packages/data/src/images/service.js +334 -0
  131. package/dist/packages/data/src/images/types.js +27 -0
  132. package/dist/packages/data/src/index.js +208 -0
  133. package/dist/packages/data/src/intel/helius-history.js +59 -0
  134. package/dist/packages/data/src/intel/holder-class.js +125 -0
  135. package/dist/packages/data/src/intel/rules.js +421 -0
  136. package/dist/packages/data/src/intel/scan.js +170 -0
  137. package/dist/packages/data/src/larp/evidence.js +288 -0
  138. package/dist/packages/data/src/larp/links.js +137 -0
  139. package/dist/packages/data/src/larp/robots.js +90 -0
  140. package/dist/packages/data/src/larp/safe-fetch.js +389 -0
  141. package/dist/packages/data/src/limiter.js +341 -0
  142. package/dist/packages/data/src/model.js +12 -0
  143. package/dist/packages/data/src/paper.js +331 -0
  144. package/dist/packages/data/src/rpc-config.js +126 -0
  145. package/dist/packages/data/src/rpc-pool.js +166 -0
  146. package/dist/packages/data/src/social/chain.js +83 -0
  147. package/dist/packages/data/src/social/dedupe.js +205 -0
  148. package/dist/packages/data/src/social/feed.js +462 -0
  149. package/dist/packages/data/src/social/firewall.js +110 -0
  150. package/dist/packages/data/src/social/index.js +11 -0
  151. package/dist/packages/data/src/social/kol.js +269 -0
  152. package/dist/packages/data/src/social/model.js +11 -0
  153. package/dist/packages/data/src/social/rank.js +184 -0
  154. package/dist/packages/data/src/social/rss.js +113 -0
  155. package/dist/packages/data/src/social/summary.js +104 -0
  156. package/dist/packages/data/src/social/venues.js +186 -0
  157. package/dist/packages/data/src/sources/dexscreener.js +170 -0
  158. package/dist/packages/data/src/sources/geckoterminal.js +133 -0
  159. package/dist/packages/data/src/sources/goplus.js +161 -0
  160. package/dist/packages/data/src/sources/jupiter-swap.js +236 -0
  161. package/dist/packages/data/src/sources/jupiter.js +198 -0
  162. package/dist/packages/data/src/sources/pda.js +113 -0
  163. package/dist/packages/data/src/sources/pump-curve.js +58 -0
  164. package/dist/packages/data/src/sources/pumpportal.js +247 -0
  165. package/dist/packages/data/src/sources/rugcheck.js +71 -0
  166. package/dist/packages/data/src/sources/solana-rpc.js +299 -0
  167. package/dist/packages/data/src/sources/solana-ws.js +287 -0
  168. package/dist/packages/data/src/store.js +289 -0
  169. package/dist/packages/data/src/trade/bridge.js +464 -0
  170. package/dist/packages/data/src/trade/caps.js +323 -0
  171. package/dist/packages/data/src/trade/copy/auto.js +385 -0
  172. package/dist/packages/data/src/trade/copy/follows.js +103 -0
  173. package/dist/packages/data/src/trade/copy/index.js +9 -0
  174. package/dist/packages/data/src/trade/copy/mirror.js +91 -0
  175. package/dist/packages/data/src/trade/copy/stats.js +120 -0
  176. package/dist/packages/data/src/trade/copy/tracker.js +158 -0
  177. package/dist/packages/data/src/trade/copy/trades.js +87 -0
  178. package/dist/packages/data/src/trade/copy/types.js +6 -0
  179. package/dist/packages/data/src/trade/executor.js +933 -0
  180. package/dist/packages/data/src/trade/kill-switch.js +47 -0
  181. package/dist/packages/data/src/trade/link-store.js +52 -0
  182. package/dist/packages/data/src/trade/plans/confirm.js +157 -0
  183. package/dist/packages/data/src/trade/plans/engine.js +784 -0
  184. package/dist/packages/data/src/trade/plans/executor-live.js +220 -0
  185. package/dist/packages/data/src/trade/plans/executor-paper.js +44 -0
  186. package/dist/packages/data/src/trade/plans/executor.js +11 -0
  187. package/dist/packages/data/src/trade/plans/index.js +12 -0
  188. package/dist/packages/data/src/trade/plans/journal.js +77 -0
  189. package/dist/packages/data/src/trade/plans/mandate.js +129 -0
  190. package/dist/packages/data/src/trade/plans/plan.js +179 -0
  191. package/dist/packages/data/src/trade/plans/service.js +168 -0
  192. package/dist/packages/data/src/trade/plans/types.js +6 -0
  193. package/dist/packages/data/src/trade/rpc-exec.js +229 -0
  194. package/dist/packages/data/src/trade/signer/client.js +197 -0
  195. package/dist/packages/data/src/trade/signer/fast-wallet.js +154 -0
  196. package/dist/packages/data/src/trade/signer/host.js +97 -0
  197. package/dist/packages/data/src/trade/signer/main.js +121 -0
  198. package/dist/packages/data/src/trade/signer/probe-builder.js +85 -0
  199. package/dist/packages/data/src/trade/signer/protocol.js +92 -0
  200. package/dist/packages/data/src/trade/signer/service.js +400 -0
  201. package/dist/packages/data/src/trade/signer/sol-usd-feed.js +98 -0
  202. package/dist/packages/data/src/trade/sol-usd.js +86 -0
  203. package/dist/packages/data/src/trade/swap-build.js +108 -0
  204. package/dist/packages/data/src/trade/token-delta.js +201 -0
  205. package/dist/packages/data/src/trade/tx-decode.js +632 -0
  206. package/dist/packages/data/src/util.js +24 -0
  207. package/dist/packages/data/src/watchlist.js +176 -0
  208. package/dist/packages/data/src/x/api.js +256 -0
  209. package/dist/packages/data/src/x/budget.js +66 -0
  210. package/dist/packages/data/src/x/config.js +49 -0
  211. package/dist/packages/data/src/x/index.js +10 -0
  212. package/dist/packages/data/src/x/mock-server.js +217 -0
  213. package/dist/packages/data/src/x/oauth.js +242 -0
  214. package/dist/packages/data/src/x/pkce.js +21 -0
  215. package/dist/packages/data/src/x/source.js +285 -0
  216. package/dist/packages/data/src/x/token-store.js +134 -0
  217. package/dist/packages/data/src/x/transport.js +71 -0
  218. package/dist/packages/data/vendor/solana-web3/LICENSE +20 -0
  219. package/dist/packages/data/vendor/solana-web3/NOTICE.md +13 -0
  220. package/dist/packages/data/vendor/solana-web3/index.iife.min.js +20 -0
  221. package/dist/packages/mcp/assets/cases.json +1194 -0
  222. package/dist/packages/mcp/assets/kb/entries/cabal-and-coordinated-launches.md +28 -0
  223. package/dist/packages/mcp/assets/kb/entries/common-rug-patterns.md +40 -0
  224. package/dist/packages/mcp/assets/kb/entries/dbc-mechanics.md +30 -0
  225. package/dist/packages/mcp/assets/kb/entries/dev-wallet-behaviour.md +33 -0
  226. package/dist/packages/mcp/assets/kb/entries/glossary.md +35 -0
  227. package/dist/packages/mcp/assets/kb/entries/holder-concentration.md +30 -0
  228. package/dist/packages/mcp/assets/kb/entries/jito-bundles.md +29 -0
  229. package/dist/packages/mcp/assets/kb/entries/launchlab-curve.md +31 -0
  230. package/dist/packages/mcp/assets/kb/entries/lp-burn-vs-lock.md +31 -0
  231. package/dist/packages/mcp/assets/kb/entries/metadata-and-copycats.md +29 -0
  232. package/dist/packages/mcp/assets/kb/entries/mint-freeze-authority.md +31 -0
  233. package/dist/packages/mcp/assets/kb/entries/narrative-lifecycle.md +32 -0
  234. package/dist/packages/mcp/assets/kb/entries/pump-bonding-curve.md +33 -0
  235. package/dist/packages/mcp/assets/kb/entries/pumpswap-migration.md +29 -0
  236. package/dist/packages/mcp/assets/kb/entries/sniping-and-snipers.md +29 -0
  237. package/dist/packages/mcp/assets/kb/entries/token2022-extensions-risk.md +32 -0
  238. package/dist/packages/mcp/assets/kb/entries/wash-trading-fake-volume.md +33 -0
  239. package/dist/packages/mcp/assets/skills/rug-check.md +52 -0
  240. package/dist/packages/mcp/assets/skills/token-dossier.md +57 -0
  241. package/dist/packages/mcp/assets/skills/trench-scan.md +40 -0
  242. package/dist/packages/mcp/bin/dexterm-mcp.mjs +16 -0
  243. package/dist/packages/mcp/src/dossier.js +78 -0
  244. package/dist/packages/mcp/src/firewall.js +21 -0
  245. package/dist/packages/mcp/src/index.js +22 -0
  246. package/dist/packages/mcp/src/server.js +849 -0
  247. package/dist/packages/mcp/src/user-content.js +434 -0
  248. package/dist/packages/packs/src/backtest.js +183 -0
  249. package/dist/packages/packs/src/digest.js +95 -0
  250. package/dist/packages/packs/src/firewall.js +57 -0
  251. package/dist/packages/packs/src/index.js +19 -0
  252. package/dist/packages/packs/src/larp-eval.js +100 -0
  253. package/dist/packages/packs/src/narrative.js +309 -0
  254. package/dist/packages/packs/src/reason.js +135 -0
  255. package/dist/packages/packs/src/rug-model.js +137 -0
  256. package/dist/packages/packs/src/schema.js +54 -0
  257. package/dist/packages/packs/src/token-dossier.js +174 -0
  258. package/dist/packages/packs/src/verdicts.js +17 -0
  259. package/dist/packages/packs/src/wallet-dossier.js +105 -0
  260. package/dist/packages/popup/src/config.js +71 -0
  261. package/dist/packages/popup/src/dock.js +271 -0
  262. package/dist/packages/popup/src/host.js +210 -0
  263. package/dist/packages/popup/src/index.js +12 -0
  264. package/dist/packages/popup/src/loopback.js +53 -0
  265. package/dist/packages/popup/src/open.js +183 -0
  266. package/dist/packages/popup/src/pages/bubbles-lib.js +160 -0
  267. package/dist/packages/popup/src/pages/bubbles.css +23 -0
  268. package/dist/packages/popup/src/pages/bubbles.html +36 -0
  269. package/dist/packages/popup/src/pages/bubbles.js +214 -0
  270. package/dist/packages/popup/src/pages/chart-lib.js +262 -0
  271. package/dist/packages/popup/src/pages/chart.css +50 -0
  272. package/dist/packages/popup/src/pages/chart.html +56 -0
  273. package/dist/packages/popup/src/pages/chart.js +554 -0
  274. package/dist/packages/popup/src/pages/common.css +34 -0
  275. package/dist/packages/popup/src/pages/common.js +187 -0
  276. package/dist/packages/popup/src/pages/feeds.html +20 -0
  277. package/dist/packages/popup/src/pages/feeds.js +77 -0
  278. package/dist/packages/popup/src/pages/narrative.html +20 -0
  279. package/dist/packages/popup/src/pages/narrative.js +61 -0
  280. package/dist/packages/popup/src/pages/plans.css +30 -0
  281. package/dist/packages/popup/src/pages/plans.html +26 -0
  282. package/dist/packages/popup/src/pages/plans.js +82 -0
  283. package/dist/packages/popup/src/pages/roster.css +41 -0
  284. package/dist/packages/popup/src/pages/roster.html +25 -0
  285. package/dist/packages/popup/src/pages/roster.js +75 -0
  286. package/dist/packages/popup/src/pages/token.html +20 -0
  287. package/dist/packages/popup/src/pages/token.js +112 -0
  288. package/dist/packages/popup/src/pages/widget-sdk.js +224 -0
  289. package/dist/packages/popup/src/pages/widget.css +5 -0
  290. package/dist/packages/popup/src/pages/widget.html +21 -0
  291. package/dist/packages/popup/src/pages/widget.js +85 -0
  292. package/dist/packages/popup/src/protocol.js +31 -0
  293. package/dist/packages/popup/src/selftest.js +156 -0
  294. package/dist/packages/popup/src/server.js +582 -0
  295. package/dist/packages/popup/src/sinkproxy.js +167 -0
  296. package/dist/packages/popup/src/widget-html.js +231 -0
  297. package/dist/packages/popup/vendor/lightweight-charts/LICENSE +201 -0
  298. package/dist/packages/popup/vendor/lightweight-charts/NOTICE +2 -0
  299. package/dist/packages/popup/vendor/lightweight-charts/README.md +30 -0
  300. package/dist/packages/popup/vendor/lightweight-charts/VERSION +1 -0
  301. package/dist/packages/popup/vendor/lightweight-charts/lightweight-charts.standalone.production.js +7 -0
  302. package/dist/packages/recorder/bin/dexterm-recorder.mjs +11 -0
  303. package/dist/packages/recorder/src/cli.js +113 -0
  304. package/dist/packages/recorder/src/export.js +71 -0
  305. package/dist/packages/recorder/src/index.js +20 -0
  306. package/dist/packages/recorder/src/labels.js +151 -0
  307. package/dist/packages/recorder/src/open.js +29 -0
  308. package/dist/packages/recorder/src/recorder.js +553 -0
  309. package/dist/packages/recorder/src/schedule.js +43 -0
  310. package/dist/packages/recorder/src/schema.js +135 -0
  311. package/dist/packages/recorder/src/snapshot.js +191 -0
  312. package/dist/packages/recorder/src/sweep.js +52 -0
  313. package/dist/packages/recorder/src/verdicts.js +52 -0
  314. package/dist/packages/tui/src/bubbles.js +415 -0
  315. package/dist/packages/tui/src/canvas.js +370 -0
  316. package/dist/packages/tui/src/chrome.js +85 -0
  317. package/dist/packages/tui/src/color.js +133 -0
  318. package/dist/packages/tui/src/flush.js +62 -0
  319. package/dist/packages/tui/src/fmt.js +188 -0
  320. package/dist/packages/tui/src/fx-trade.js +278 -0
  321. package/dist/packages/tui/src/fx.js +527 -0
  322. package/dist/packages/tui/src/images/blocks.js +141 -0
  323. package/dist/packages/tui/src/images/coin.js +22 -0
  324. package/dist/packages/tui/src/images/detect.js +140 -0
  325. package/dist/packages/tui/src/images/index.js +7 -0
  326. package/dist/packages/tui/src/images/layer.js +146 -0
  327. package/dist/packages/tui/src/images/pixels.js +157 -0
  328. package/dist/packages/tui/src/images/protocols.js +87 -0
  329. package/dist/packages/tui/src/index.js +15 -0
  330. package/dist/packages/tui/src/keymap.js +355 -0
  331. package/dist/packages/tui/src/layout.js +11 -0
  332. package/dist/packages/tui/src/sound.js +177 -0
  333. package/dist/packages/tui/src/theme.js +182 -0
  334. package/dist/packages/tui/src/widgets.js +598 -0
  335. package/dist/packages/voice/src/controller.js +395 -0
  336. package/dist/packages/voice/src/doctor.js +63 -0
  337. package/dist/packages/voice/src/engines.js +44 -0
  338. package/dist/packages/voice/src/index.js +16 -0
  339. package/dist/packages/voice/src/router.js +502 -0
  340. package/dist/packages/voice/src/stt/apple-helper.swift.js +103 -0
  341. package/dist/packages/voice/src/stt/apple.js +179 -0
  342. package/dist/packages/voice/src/stt/fake.js +34 -0
  343. package/dist/packages/voice/src/stt/whisper.js +102 -0
  344. package/dist/packages/voice/src/summary.js +44 -0
  345. package/dist/packages/voice/src/tts/fake.js +30 -0
  346. package/dist/packages/voice/src/tts/say.js +96 -0
  347. package/dist/packages/voice/src/types.js +3 -0
  348. package/package.json +42 -4
  349. package/README.md +0 -3
@@ -0,0 +1,107 @@
1
+ // @dexterm/custom — keymap overrides (task-1358 Tier 2). `config.keymap.global[action] = keys[]` and
2
+ // `config.keymap.screens[screen][action] = keys[]` re-bind the app's actions (the AppAction ids of
3
+ // @dexterm/tui) over the shipped defaults. Validation refuses what a shared config must never do:
4
+ // * RESERVED KEYS cannot be assigned to anything: ctrl+c (quit), esc, enter, y / Y (confirm), ! (panic);
5
+ // * RESERVED ACTIONS keep their default keys: quit, back, alert.confirm / alert.dismiss, plans.arm,
6
+ // plans.panic, plans.gate (the money-adjacent confirms and the panic key);
7
+ // * no two actions on the same key within one scope (global, or one screen); a global key may still be
8
+ // shadowed by a screen binding, as the defaults already do;
9
+ // * a chord prefix (the first key of "ctrl+w s") cannot also be bound on its own;
10
+ // * at most 4 keys per action, every key a valid id (the KEY pattern in schema.ts).
11
+ // Pure: takes the default binding table, returns a new one plus the errors. Nothing here reads a file.
12
+ import { validate } from "./schema.js";
13
+ export const RESERVED_KEYS = new Set(['ctrl+c', 'esc', 'enter', 'y', 'Y', '!']);
14
+ export const RESERVED_ACTIONS = new Set(['quit', 'back', 'alert.confirm', 'alert.dismiss', 'plans.arm', 'plans.panic', 'plans.gate']);
15
+ /**
16
+ * Layer `cfg` over `defaults`. On ANY error the defaults are returned untouched (a half-applied keymap is worse
17
+ * than none) with every problem listed, so the user fixes the file once.
18
+ */
19
+ export function applyKeymapConfig(defaults, cfg) {
20
+ const errors = cfg ? validate('keymap', cfg, '/keymap') : [];
21
+ const overridden = [];
22
+ if (!cfg || errors.length)
23
+ return { bindings: defaults.map((b) => ({ ...b, keys: [...b.keys] })), errors, overridden };
24
+ const bindings = defaults.map((b) => ({ ...b, keys: [...b.keys] }));
25
+ const known = new Set(defaults.map((b) => b.action));
26
+ const globalLabel = new Map();
27
+ for (const b of defaults)
28
+ if (!b.screen)
29
+ globalLabel.set(b.action, b.label);
30
+ const apply = (screen, action, keys) => {
31
+ const where = screen ? `/keymap/screens/${screen}/${action}` : `/keymap/global/${action}`;
32
+ if (!known.has(action)) {
33
+ errors.push({ path: where, msg: `unknown action "${action}"` });
34
+ return;
35
+ }
36
+ if (RESERVED_ACTIONS.has(action)) {
37
+ errors.push({ path: where, msg: `"${action}" keeps its default keys (reserved: confirm / dismiss / panic / quit / back)` });
38
+ return;
39
+ }
40
+ for (const k of keys) {
41
+ const parts = k.split(' ');
42
+ if (parts.some((p) => RESERVED_KEYS.has(p)) && !(parts.length === 2 && !RESERVED_KEYS.has(parts[0]))) {
43
+ errors.push({ path: where, msg: `"${k}" is reserved (${[...RESERVED_KEYS].join(' ')})` });
44
+ return;
45
+ }
46
+ }
47
+ const i = bindings.findIndex((b) => b.action === action && (screen ? b.screen === screen : !b.screen));
48
+ if (i >= 0)
49
+ bindings[i] = { ...bindings[i], keys: [...keys] };
50
+ else
51
+ bindings.push({ keys: [...keys], action: action, label: globalLabel.get(action) ?? defaults.find((b) => b.action === action)?.label, screen: screen ?? undefined });
52
+ overridden.push({ action: action, screen, keys: [...keys] });
53
+ };
54
+ for (const [action, keys] of Object.entries(cfg.global ?? {}))
55
+ apply(null, action, keys);
56
+ for (const [screen, table] of Object.entries(cfg.screens ?? {})) {
57
+ if (!/^[a-z]+$/.test(screen)) {
58
+ errors.push({ path: `/keymap/screens/${screen}`, msg: 'bad screen name' });
59
+ continue;
60
+ }
61
+ for (const [action, keys] of Object.entries(table))
62
+ apply(screen, action, keys);
63
+ }
64
+ if (!errors.length)
65
+ errors.push(...collisions(bindings));
66
+ if (errors.length)
67
+ return { bindings: defaults.map((b) => ({ ...b, keys: [...b.keys] })), errors, overridden: [] };
68
+ return { bindings, errors: [], overridden };
69
+ }
70
+ /** Two actions on one key within the same scope, or a chord prefix bound on its own. */
71
+ export function collisions(bindings) {
72
+ const errors = [];
73
+ const byScope = new Map();
74
+ const prefixes = new Set();
75
+ for (const b of bindings)
76
+ for (const k of b.keys) {
77
+ const sp = k.indexOf(' ');
78
+ if (sp > 0)
79
+ prefixes.add(k.slice(0, sp));
80
+ }
81
+ for (const b of bindings) {
82
+ const scope = b.screen ?? '';
83
+ let m = byScope.get(scope);
84
+ if (!m) {
85
+ m = new Map();
86
+ byScope.set(scope, m);
87
+ }
88
+ for (const k of b.keys) {
89
+ const other = m.get(k);
90
+ if (other && other !== b.action)
91
+ errors.push({ path: scope ? `/keymap/screens/${scope}` : '/keymap/global', msg: `"${k}" is bound to both ${other} and ${b.action}` });
92
+ m.set(k, b.action);
93
+ if (prefixes.has(k))
94
+ errors.push({ path: scope ? `/keymap/screens/${scope}` : '/keymap/global', msg: `"${k}" starts a chord and cannot also be bound alone (${b.action})` });
95
+ }
96
+ }
97
+ return errors;
98
+ }
99
+ /** `dexterm keymap`: one line per binding, user overrides marked with `·`. */
100
+ export function renderKeymap(r, screen) {
101
+ const ov = new Set(r.overridden.map((o) => `${o.screen ?? ''}|${o.action}`));
102
+ const rows = r.bindings.filter((b) => !screen || !b.screen || b.screen === screen);
103
+ const lines = rows.map((b) => `${ov.has(`${b.screen ?? ''}|${b.action}`) ? '·' : ' '} ${(b.screen ?? 'global').padEnd(10)} ${b.action.padEnd(22)} ${b.keys.join(' / ').padEnd(24)} ${b.label ?? ''}`);
104
+ if (r.errors.length)
105
+ lines.unshift(...r.errors.map((e) => `✗ ${e.path} ${e.msg}`), ' (keymap config refused: the defaults are in use)');
106
+ return lines.join('\n');
107
+ }
@@ -0,0 +1,235 @@
1
+ // @dexterm/custom — layout engine (task-1358, from the task-1288 design): a pane tree (splits + widget panes)
2
+ // solved into integer rects for a screen size and breakpoint. Deterministic, pure, no canvas dependency.
3
+ //
4
+ // Rules (they mirror the SPEC §7.4 column-drop rule so users get one mental model):
5
+ // * breakpoints: compact < 100 cols, standard < 140, wide ≥ 140 (same as @dexterm/tui);
6
+ // * a pane with collapseBelow: 'wide' is dropped at standard/compact, etc.;
7
+ // * every widget has a minimum size; when a split cannot give every child its minimum, the LEAF with the
8
+ // highest priority number among the overflowing children is dropped and the split re-solved (priority 0
9
+ // never drops: it is solved anyway and the renderer clips);
10
+ // * fixed sizes come first, the remainder is shared by weight with largest-remainder rounding so the
11
+ // rects tile exactly (no 1-cell seams); an optional 1-cell gutter between children rains.
12
+ import { BUILTIN_WIDGETS } from "./schema.js";
13
+ export function breakpoint(w) { return w < 100 ? 'compact' : w < 140 ? 'standard' : 'wide'; }
14
+ const BP_RANK = { compact: 0, standard: 1, wide: 2 };
15
+ export function widgetSpec(id, registry = {}) {
16
+ return BUILTIN_WIDGETS[id] ?? registry[id] ?? null;
17
+ }
18
+ /** Pick the tree for this breakpoint: per-breakpoint object (nearest smaller defined, else larger) or the single tree. */
19
+ export function treeFor(layout, bp) {
20
+ if (!layout)
21
+ return null;
22
+ if ('kind' in layout)
23
+ return layout;
24
+ const order = ['wide', 'standard', 'compact'];
25
+ const start = order.indexOf(bp);
26
+ for (let i = start; i < order.length; i++) {
27
+ const t = layout[order[i]];
28
+ if (t)
29
+ return t;
30
+ }
31
+ for (let i = start - 1; i >= 0; i--) {
32
+ const t = layout[order[i]];
33
+ if (t)
34
+ return t;
35
+ }
36
+ return null;
37
+ }
38
+ function visible(node, bp) {
39
+ if (node.kind === 'pane')
40
+ return !node.collapseBelow || BP_RANK[bp] >= BP_RANK[node.collapseBelow];
41
+ return node.children.some((c) => visible(c.node, bp));
42
+ }
43
+ /** Minimum size a node needs (sum along its axis, max across), ignoring collapsed children. */
44
+ function minSize(node, bp, registry) {
45
+ if (node.kind === 'pane') {
46
+ const spec = widgetSpec(node.widget, registry);
47
+ return spec ? { ...spec.min } : { w: 10, h: 3 };
48
+ }
49
+ const kids = node.children.filter((c) => visible(c.node, bp));
50
+ const g = node.gutter ? Math.max(0, kids.length - 1) : 0;
51
+ let along = g, across = 0;
52
+ for (const c of kids) {
53
+ const m = minSize(c.node, bp, registry);
54
+ if (node.dir === 'row') {
55
+ along += c.fixed ?? m.w;
56
+ across = Math.max(across, m.h);
57
+ }
58
+ else {
59
+ along += c.fixed ?? m.h;
60
+ across = Math.max(across, m.w);
61
+ }
62
+ }
63
+ return node.dir === 'row' ? { w: along, h: across } : { w: across, h: along };
64
+ }
65
+ /** Largest-remainder share of `total` by weights after fixed sizes; integer sizes that sum to total. */
66
+ function share(children, total) {
67
+ const fixedSum = children.reduce((s, c) => s + (c.fixed ?? 0), 0);
68
+ const flex = children.filter((c) => c.fixed === undefined);
69
+ const wsum = flex.reduce((s, c) => s + (c.weight ?? 1), 0) || 1;
70
+ const remain = Math.max(0, total - fixedSum);
71
+ const sizes = children.map((c) => (c.fixed !== undefined ? Math.min(c.fixed, total) : 0));
72
+ const raw = flex.map((c) => (remain * (c.weight ?? 1)) / wsum);
73
+ const floors = raw.map(Math.floor);
74
+ let left = remain - floors.reduce((a, b) => a + b, 0);
75
+ const order = raw.map((r, i) => [r - floors[i], i]).sort((a, b) => b[0] - a[0]);
76
+ for (const [, i] of order) {
77
+ if (left <= 0)
78
+ break;
79
+ floors[i] += 1;
80
+ left -= 1;
81
+ }
82
+ let fi = 0;
83
+ for (let i = 0; i < children.length; i++)
84
+ if (children[i].fixed === undefined)
85
+ sizes[i] = floors[fi++];
86
+ // if fixed sizes overflow, trim from the last fixed child
87
+ let over = sizes.reduce((a, b) => a + b, 0) - total;
88
+ for (let i = children.length - 1; i >= 0 && over > 0; i--) {
89
+ const cut = Math.min(over, sizes[i]);
90
+ sizes[i] -= cut;
91
+ over -= cut;
92
+ }
93
+ return sizes;
94
+ }
95
+ /** Solve a tree into panes for `rect`. */
96
+ export function solve(tree, rect, opts = {}) {
97
+ const bp = opts.breakpoint ?? breakpoint(rect.w);
98
+ const registry = opts.registry ?? {};
99
+ const out = { panes: [], dropped: [], gutters: [], breakpoint: bp };
100
+ solveNode(tree, rect, bp, registry, out);
101
+ return out;
102
+ }
103
+ function solveNode(node, rect, bp, registry, out) {
104
+ if (!visible(node, bp)) {
105
+ collect(node, (p) => out.dropped.push({ widget: p.widget, reason: `collapsed below ${p.collapseBelow}` }));
106
+ return;
107
+ }
108
+ if (node.kind === 'pane') {
109
+ const m = minSize(node, bp, registry);
110
+ if (rect.w < m.w || rect.h < m.h) {
111
+ if ((node.priority ?? 1) === 0)
112
+ out.panes.push({ widget: node.widget, rect, node, clipped: true });
113
+ else
114
+ out.dropped.push({ widget: node.widget, reason: `needs ${m.w}×${m.h}, has ${rect.w}×${rect.h}` });
115
+ return;
116
+ }
117
+ out.panes.push({ widget: node.widget, rect, node });
118
+ return;
119
+ }
120
+ for (const c of node.children)
121
+ if (!visible(c.node, bp))
122
+ collect(c.node, (p) => out.dropped.push({ widget: p.widget, reason: `collapsed below ${p.collapseBelow}` }));
123
+ let kids = node.children.filter((c) => visible(c.node, bp));
124
+ // Drop the highest-priority LEAF among the children that actually overflow (never an innocent sibling)
125
+ // until the minimums fit. Across-axis overflow (a child too tall for a row) is resolved inside that child;
126
+ // along-axis overflow (the sum too wide) may take a leaf from any child.
127
+ for (;;) {
128
+ const need = minSize({ ...node, children: kids }, bp, registry);
129
+ const fits = need.w <= rect.w && need.h <= rect.h;
130
+ if (fits || kids.length === 0)
131
+ break;
132
+ const across = node.dir === 'row' ? 'h' : 'w';
133
+ const over = kids.filter((c) => minSize(c.node, bp, registry)[across] > rect[across]);
134
+ const victim = highestLeaf({ ...node, children: over.length ? over : kids });
135
+ if (!victim || (victim.priority ?? 1) === 0)
136
+ break;
137
+ out.dropped.push({ widget: victim.widget, reason: `no room at ${rect.w}×${rect.h} (priority ${victim.priority ?? 1})` });
138
+ kids = kids.map((c) => ({ ...c, node: removeLeaf(c.node, victim) })).filter((c) => c.node !== null);
139
+ }
140
+ if (!kids.length)
141
+ return;
142
+ const g = node.gutter ? 1 : 0;
143
+ const along = node.dir === 'row' ? rect.w : rect.h;
144
+ const sizes = share(kids, along - g * (kids.length - 1));
145
+ let pos = node.dir === 'row' ? rect.x : rect.y;
146
+ kids.forEach((c, i) => {
147
+ const r = node.dir === 'row' ? { x: pos, y: rect.y, w: sizes[i], h: rect.h } : { x: rect.x, y: pos, w: rect.w, h: sizes[i] };
148
+ if (r.w > 0 && r.h > 0)
149
+ solveNode(c.node, r, bp, registry, out);
150
+ pos += sizes[i];
151
+ if (g && i < kids.length - 1) {
152
+ out.gutters.push(node.dir === 'row' ? { x: pos, y: rect.y, w: 1, h: rect.h } : { x: rect.x, y: pos, w: rect.w, h: 1 });
153
+ pos += 1;
154
+ }
155
+ });
156
+ }
157
+ /** The pane with the highest priority number in a subtree (ties: the later one in document order). */
158
+ function highestLeaf(node) {
159
+ let best = null;
160
+ collect(node, (p) => { if (!best || (p.priority ?? 1) >= (best.priority ?? 1))
161
+ best = p; });
162
+ return best;
163
+ }
164
+ /** Remove one pane (by identity) from a subtree; splits left with no children collapse to null. */
165
+ function removeLeaf(node, leaf) {
166
+ if (node.kind === 'pane')
167
+ return node === leaf ? null : node;
168
+ const children = node.children.map((c) => ({ ...c, node: removeLeaf(c.node, leaf) })).filter((c) => c.node !== null);
169
+ return children.length ? { ...node, children } : null;
170
+ }
171
+ function collect(node, fn) { if (node.kind === 'pane')
172
+ fn(node);
173
+ else
174
+ node.children.forEach((c) => collect(c.node, fn)); }
175
+ /** Every widget id a tree references (for validation against the registry). */
176
+ export function widgetsIn(node) { const ids = []; collect(node, (p) => ids.push(p.widget)); return ids; }
177
+ // ------------------------------------------------------------------ plain-text render (previews, tests, proposal cards)
178
+ export function renderPlain(solved, w, h, opts = {}) {
179
+ const grid = Array.from({ length: h }, () => Array(w).fill(' '));
180
+ const put = (x, y, s) => { for (let i = 0; i < s.length; i++)
181
+ if (x + i >= 0 && x + i < w && y >= 0 && y < h)
182
+ grid[y][x + i] = s[i]; };
183
+ for (const gt of solved.gutters)
184
+ for (let y = gt.y; y < gt.y + gt.h; y++)
185
+ for (let x = gt.x; x < gt.x + gt.w; x++)
186
+ if (x < w && y < h)
187
+ grid[y][x] = '·';
188
+ for (const p of solved.panes) {
189
+ const { x, y, w: pw, h: ph } = p.rect;
190
+ if (pw < 2 || ph < 2)
191
+ continue;
192
+ put(x, y, '╭' + '─'.repeat(pw - 2) + '╮');
193
+ for (let yy = y + 1; yy < y + ph - 1; yy++) {
194
+ put(x, yy, '│');
195
+ put(x + pw - 1, yy, '│');
196
+ }
197
+ put(x, y + ph - 1, '╰' + '─'.repeat(pw - 2) + '╯');
198
+ const spec = widgetSpec(p.widget, opts.registry ?? {});
199
+ const title = ` ${(p.node.title ?? spec?.title ?? p.widget).toUpperCase()} `;
200
+ if (title.trim())
201
+ put(x + 2, y, title.slice(0, Math.max(0, pw - 4)));
202
+ const info = `${p.widget} ${pw}×${ph}${p.clipped ? ' (clipped)' : ''}`;
203
+ put(x + 2, y + 1, info.slice(0, Math.max(0, pw - 4)));
204
+ }
205
+ return grid.map((r) => r.join('')).join('\n');
206
+ }
207
+ /** The app's shipped screens expressed as trees (so "default" is a workspace too, and the numbers are the renderers'). */
208
+ export function builtinScreens() {
209
+ return {
210
+ screener: { kind: 'split', dir: 'row', gutter: true, children: [
211
+ { node: { kind: 'pane', widget: 'screener.table', priority: 0 } },
212
+ { node: { kind: 'pane', widget: 'screener.spotlight', priority: 2, collapseBelow: 'wide' }, fixed: 44 },
213
+ ] },
214
+ token: { kind: 'split', dir: 'row', children: [
215
+ { node: { kind: 'split', dir: 'col', children: [
216
+ { node: { kind: 'pane', widget: 'token.chart', priority: 0 }, weight: 46 },
217
+ { node: { kind: 'split', dir: 'row', children: [
218
+ { node: { kind: 'pane', widget: 'token.onchain', priority: 1 }, weight: 40 },
219
+ { node: { kind: 'pane', widget: 'token.flow', priority: 2 }, weight: 60 },
220
+ ] }, weight: 54 },
221
+ ] } },
222
+ { node: { kind: 'pane', widget: 'analyst.panel', priority: 3, collapseBelow: 'standard' }, fixed: 46 },
223
+ ] },
224
+ newpairs: { kind: 'split', dir: 'row', gutter: true, children: [
225
+ { node: { kind: 'pane', widget: 'newpairs.table', priority: 0 } },
226
+ { node: { kind: 'pane', widget: 'newpairs.spotlight', priority: 2, collapseBelow: 'wide' }, fixed: 46 },
227
+ ] },
228
+ watchlist: { kind: 'pane', widget: 'watchlist.table', priority: 0 },
229
+ analyst: { kind: 'split', dir: 'row', children: [
230
+ { node: { kind: 'pane', widget: 'analyst.panel', priority: 0 } },
231
+ { node: { kind: 'pane', widget: 'analyst.context', priority: 2, collapseBelow: 'wide' }, fixed: 36 },
232
+ ] },
233
+ positions: { kind: 'pane', widget: 'positions.table', priority: 0 },
234
+ };
235
+ }