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,278 @@
1
+ // `dexterm plan …` and `dexterm mandate …` — typed order-plan + standing-mandate CLI (task-1355).
2
+ //
3
+ // dexterm plan propose --mint M --symbol S --size 20 --entry mc-below:300k [--tp mc-above:600k:50%]…
4
+ // [--stop mc-below:150k] [--decimals 6] [--supply 1b] [--slippage 300]
5
+ // dexterm plan list [--json]
6
+ // dexterm plan arm <planId> --mandate <id> # requires a PHYSICAL keypress on a TTY (refuses pipes)
7
+ // dexterm plan amend <planId> [--size 25] [--entry …] [--tp …]… [--stop …|none] [--slippage N] # task-1363
8
+ // dexterm plan cancel <planId>
9
+ // dexterm plan journal [--verify] [--export]
10
+ // dexterm mandate draft [--total 100] [--per-trade 20] [--per-coin 40] [--daily-loss 50]
11
+ // [--max-tier keypress|ptt-held|hands-free] [--ttl-hours 4]
12
+ // dexterm mandate list [--json] | arm <id> | revoke <id>
13
+ //
14
+ // Arming is the only gate: `arm` reads ONE real keystroke in raw mode (ttyKeypress) and refuses a pipe,
15
+ // a subprocess, a voice router or an agent — exactly like `dexterm wallet resume`. Proposing never arms.
16
+ // Default runs are PAPER (no key, no wallet, no mainnet); the journal under ~/.dexterm/plans.journal is
17
+ // the hash-chained audit log + recovery source.
18
+ import { PlanService, defaultPlansJournalPath, parseAmount, parseTrigger, parseExit, planStatusLabel, fmtUsd, PlanError, PolicyRefusal, MandateError, ConfirmError, } from '../../data/src/trade/plans/index.js';
19
+ import { ttyKeypress } from "./wallet-cmd.js";
20
+ function flag(rest, name) { const i = rest.indexOf(name); return i >= 0 ? rest[i + 1] : undefined; }
21
+ function has(rest, name) { return rest.includes(name); }
22
+ /** Collect every value after each occurrence of `name` (for repeatable flags like --tp). */
23
+ function flags(rest, name) { const out = []; for (let i = 0; i < rest.length; i++)
24
+ if (rest[i] === name && rest[i + 1] !== undefined)
25
+ out.push(rest[i + 1]); return out; }
26
+ function openService(rest, io) {
27
+ const journalPath = flag(rest, '--journal') ?? defaultPlansJournalPath(io.env);
28
+ return new PlanService({ journalPath });
29
+ }
30
+ function errMsg(e) {
31
+ if (e instanceof PlanError || e instanceof PolicyRefusal || e instanceof MandateError || e instanceof ConfirmError)
32
+ return `${e.reason}: ${e.message}`;
33
+ return e instanceof Error ? e.message : String(e);
34
+ }
35
+ const PLAN_USAGE = `dexterm plan <command>
36
+ propose --mint M --size 20 --entry mc-below:300k [--symbol S] [--decimals 6] [--supply 1b]
37
+ [--tp mc-above:600k:50%]… [--stop mc-below:150k] [--slippage 300] [--side buy|sell] [--json]
38
+ list [--json]
39
+ arm <planId> --mandate <id> (needs a physical keypress on a TTY; a pipe/agent is refused)
40
+ amend <planId> [--size 25] [--entry mc-below:280k] [--tp mc-above:600k:50%]… [--stop mc-below:150k|none] [--slippage N]
41
+ (a PROPOSED plan only: the edit is a NEW plan with a new hash; the old one is
42
+ superseded and every earlier confirmation is void; re-arm by keypress)
43
+ cancel <planId>
44
+ journal [--verify] [--export]`;
45
+ const MANDATE_USAGE = `dexterm mandate <command>
46
+ draft [--total 100] [--per-trade 20] [--per-coin 40] [--daily-loss 50]
47
+ [--max-tier keypress|ptt-held|hands-free] [--ttl-hours 4] [--json]
48
+ list [--json]
49
+ arm <id> (needs a physical keypress on a TTY; a pipe/agent is refused)
50
+ revoke <id>`;
51
+ export async function runPlan(rest, io) {
52
+ const cmd = rest[0];
53
+ const out = (s) => io.stdout.write(s + '\n');
54
+ const errOut = (s) => io.stderr.write(s + '\n');
55
+ try {
56
+ switch (cmd) {
57
+ case 'propose': {
58
+ const mint = flag(rest, '--mint');
59
+ if (!mint) {
60
+ errOut('dexterm plan propose: --mint is required');
61
+ return 2;
62
+ }
63
+ const sizeStr = flag(rest, '--size');
64
+ if (!sizeStr) {
65
+ errOut('dexterm plan propose: --size is required (USD)');
66
+ return 2;
67
+ }
68
+ const entryStr = flag(rest, '--entry') ?? 'immediate';
69
+ const supply = parseAmount(flag(rest, '--supply') ?? '1b');
70
+ const input = {
71
+ mint, symbol: flag(rest, '--symbol'), decimals: Number(flag(rest, '--decimals') ?? 6),
72
+ side: flag(rest, '--side') ?? 'buy', sizeUsd: parseAmount(sizeStr),
73
+ entry: parseTrigger(entryStr),
74
+ exits: flags(rest, '--tp').map(parseExit),
75
+ stop: flag(rest, '--stop') ? parseTrigger(flag(rest, '--stop')) : null,
76
+ slippageBps: flag(rest, '--slippage') ? Number(flag(rest, '--slippage')) : undefined,
77
+ };
78
+ const svc = openService(rest, io);
79
+ const plan = svc.propose(input, { supply, by: 'user' });
80
+ if (has(rest, '--json')) {
81
+ out(JSON.stringify({ id: plan.id, hash: plan.hash, readBack: svc.readBack(plan.id) }));
82
+ return 0;
83
+ }
84
+ out(`proposed ${plan.id}`);
85
+ out(` ${svc.readBack(plan.id)}`);
86
+ out(' PROPOSAL only — not armed. Arm with: dexterm plan arm ' + plan.id + ' --mandate <id> (physical keypress)');
87
+ return 0;
88
+ }
89
+ case 'list': {
90
+ const svc = openService(rest, io);
91
+ const rows = svc.listPlans();
92
+ if (has(rest, '--json')) {
93
+ out(JSON.stringify(rows));
94
+ return 0;
95
+ }
96
+ if (!rows.length) {
97
+ out('no plans');
98
+ return 0;
99
+ }
100
+ for (const r of rows)
101
+ out(`${r.id.padEnd(22)} ${planStatusLabel(r)}`);
102
+ return 0;
103
+ }
104
+ case 'arm': {
105
+ const planId = rest[1];
106
+ const mandateId = flag(rest, '--mandate');
107
+ if (!planId || !mandateId) {
108
+ errOut('usage: dexterm plan arm <planId> --mandate <id>');
109
+ return 2;
110
+ }
111
+ const svc = openService(rest, io);
112
+ const plan = svc.engine.plan(planId);
113
+ if (!plan) {
114
+ errOut(`no such plan ${planId}`);
115
+ return 1;
116
+ }
117
+ out(`Arm this plan into ${mandateId}?`);
118
+ out(` ${svc.readBack(planId)}`);
119
+ out('Hold any key to confirm (physical keypress). A pipe or agent cannot arm. Waiting 15s…');
120
+ const key = await ttyKeypress(io.stdin, 15_000);
121
+ if (key === null) {
122
+ errOut('refused: no physical keypress (stdin is not a TTY, or timed out). Voice/agents can never arm.');
123
+ return 1;
124
+ }
125
+ svc.armPlanByKeypress(planId, mandateId);
126
+ out(`armed ${planId} into ${mandateId}`);
127
+ return 0;
128
+ }
129
+ case 'amend': {
130
+ // task-1363 (card item 3): edit a PROPOSED plan without the cancel + re-propose dance. The engine's amend
131
+ // is the existing primitive: a mutated plan is a NEW plan (new id, new hash), the old proposal is
132
+ // superseded, and nothing armed can be edited (cancel it first). Arming the new plan is a new keypress.
133
+ const planId = rest[1];
134
+ if (!planId) {
135
+ errOut('usage: dexterm plan amend <planId> [--size USD] [--entry TRIGGER] [--tp EXIT]… [--stop TRIGGER|none] [--slippage BPS]');
136
+ return 2;
137
+ }
138
+ const patch = {};
139
+ if (flag(rest, '--size'))
140
+ patch.sizeUsd = parseAmount(flag(rest, '--size'));
141
+ if (flag(rest, '--entry'))
142
+ patch.entry = parseTrigger(flag(rest, '--entry'));
143
+ if (flags(rest, '--tp').length)
144
+ patch.exits = flags(rest, '--tp').map(parseExit);
145
+ if (flag(rest, '--stop'))
146
+ patch.stop = flag(rest, '--stop') === 'none' ? null : parseTrigger(flag(rest, '--stop'));
147
+ if (flag(rest, '--slippage'))
148
+ patch.slippageBps = Number(flag(rest, '--slippage'));
149
+ if (!Object.keys(patch).length) {
150
+ errOut('dexterm plan amend: nothing to change (pass --size / --entry / --tp / --stop / --slippage)');
151
+ return 2;
152
+ }
153
+ const svc = openService(rest, io);
154
+ const next = svc.engine.amend(planId, patch, { by: 'user' });
155
+ if (has(rest, '--json')) {
156
+ out(JSON.stringify({ id: next.id, hash: next.hash, supersedes: planId, readBack: svc.readBack(next.id) }));
157
+ return 0;
158
+ }
159
+ out(`amended: ${planId} → ${next.id} (superseded; every earlier confirmation is void)`);
160
+ out(` ${svc.readBack(next.id)}`);
161
+ out(' PROPOSAL only — not armed. Arm with: dexterm plan arm ' + next.id + ' --mandate <id> (physical keypress)');
162
+ return 0;
163
+ }
164
+ case 'cancel': {
165
+ const planId = rest[1];
166
+ if (!planId) {
167
+ errOut('usage: dexterm plan cancel <planId>');
168
+ return 2;
169
+ }
170
+ const svc = openService(rest, io);
171
+ const status = svc.cancelPlan(planId, 'user');
172
+ out(`${planId}: ${status}`);
173
+ return 0;
174
+ }
175
+ case 'journal': {
176
+ const svc = openService(rest, io);
177
+ if (has(rest, '--export')) {
178
+ out(svc.exportJournal());
179
+ return 0;
180
+ }
181
+ const v = svc.verifyJournal();
182
+ out(v.ok ? `audit log OK — ${v.count} events, hash chain verified` : `audit log BROKEN at seq ${v.atSeq}: ${v.why}`);
183
+ return v.ok ? 0 : 1;
184
+ }
185
+ default:
186
+ (cmd ? errOut(`unknown subcommand: ${cmd}`) : out(PLAN_USAGE));
187
+ return cmd ? 2 : 0;
188
+ }
189
+ }
190
+ catch (e) {
191
+ errOut(`dexterm plan: ${errMsg(e)}`);
192
+ return 1;
193
+ }
194
+ }
195
+ export async function runMandate(rest, io) {
196
+ const cmd = rest[0];
197
+ const out = (s) => io.stdout.write(s + '\n');
198
+ const errOut = (s) => io.stderr.write(s + '\n');
199
+ try {
200
+ switch (cmd) {
201
+ case 'draft': {
202
+ const svc = openService(rest, io);
203
+ const num = (n) => (flag(rest, n) !== undefined ? parseAmount(flag(rest, n)) : undefined);
204
+ const maxTier = flag(rest, '--max-tier');
205
+ const ttlHours = flag(rest, '--ttl-hours') ? Number(flag(rest, '--ttl-hours')) : undefined;
206
+ const m = svc.draftMandate({
207
+ totalUsd: num('--total'), perTradeUsd: num('--per-trade'), perCoinUsd: num('--per-coin'),
208
+ dailyLossUsd: num('--daily-loss'), maxTier, ttlMs: ttlHours ? ttlHours * 3600_000 : undefined,
209
+ });
210
+ if (has(rest, '--json')) {
211
+ out(JSON.stringify({ id: m.id, budget: m.budget, maxTier: m.maxTier }));
212
+ return 0;
213
+ }
214
+ out(`drafted ${m.id}`);
215
+ out(` total ${fmtUsd(m.budget.totalUsd)} · per-trade ${fmtUsd(m.budget.perTradeUsd)} · per-coin ${fmtUsd(m.budget.perCoinUsd)} · daily-loss ${fmtUsd(m.budget.dailyLossUsd)} · maxTier ${m.maxTier}`);
216
+ out(' DRAFT only — not armed. Arm with: dexterm mandate arm ' + m.id + ' (physical keypress)');
217
+ return 0;
218
+ }
219
+ case 'list': {
220
+ const svc = openService(rest, io);
221
+ const rows = svc.listMandates();
222
+ if (has(rest, '--json')) {
223
+ out(JSON.stringify(rows));
224
+ return 0;
225
+ }
226
+ if (!rows.length) {
227
+ out('no mandates');
228
+ return 0;
229
+ }
230
+ for (const r of rows)
231
+ out(`${r.id.padEnd(24)} ${r.status.padEnd(7)} total ${fmtUsd(r.totalUsd)} · reserved ${fmtUsd(r.reservedUsd)} · spent ${fmtUsd(r.spentUsd)} · maxTier ${r.maxTier}`);
232
+ return 0;
233
+ }
234
+ case 'arm': {
235
+ const id = rest[1];
236
+ if (!id) {
237
+ errOut('usage: dexterm mandate arm <id>');
238
+ return 2;
239
+ }
240
+ const svc = openService(rest, io);
241
+ const row = svc.listMandates().find((m) => m.id === id);
242
+ if (!row) {
243
+ errOut(`no such mandate ${id}`);
244
+ return 1;
245
+ }
246
+ out(`Arm standing mandate ${id}? This lets armed plans fire at machine speed from the capped fast wallet.`);
247
+ out(` total ${fmtUsd(row.totalUsd)} · per-trade ${fmtUsd(row.perTradeUsd)} · per-coin ${fmtUsd(row.perCoinUsd)} · maxTier ${row.maxTier}`);
248
+ out('Hold any key to confirm (physical keypress). A pipe or agent cannot arm. Waiting 15s…');
249
+ const key = await ttyKeypress(io.stdin, 15_000);
250
+ if (key === null) {
251
+ errOut('refused: no physical keypress (stdin is not a TTY, or timed out). Voice/agents can never arm a mandate.');
252
+ return 1;
253
+ }
254
+ svc.armMandateByKeypress(id);
255
+ out(`armed mandate ${id}`);
256
+ return 0;
257
+ }
258
+ case 'revoke': {
259
+ const id = rest[1];
260
+ if (!id) {
261
+ errOut('usage: dexterm mandate revoke <id>');
262
+ return 2;
263
+ }
264
+ const svc = openService(rest, io);
265
+ svc.revokeMandate(id, 'user');
266
+ out(`revoked ${id}`);
267
+ return 0;
268
+ }
269
+ default:
270
+ (cmd ? errOut(`unknown subcommand: ${cmd}`) : out(MANDATE_USAGE));
271
+ return cmd ? 2 : 0;
272
+ }
273
+ }
274
+ catch (e) {
275
+ errOut(`dexterm mandate: ${errMsg(e)}`);
276
+ return 1;
277
+ }
278
+ }