dexterm-cli 0.1.6 → 0.1.7

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 (331) hide show
  1. package/dist/packages/agents/src/schema.js +22 -1
  2. package/dist/packages/agents/src/story.js +11 -2
  3. package/dist/packages/agents/src/tiers.js +27 -2
  4. package/dist/packages/agents/src/tools.js +30 -2
  5. package/dist/packages/autotrade/assets/exit-profile.schema.json +492 -0
  6. package/dist/packages/autotrade/assets/profiles/moonbag.json +46 -0
  7. package/dist/packages/autotrade/assets/profiles/runner.json +88 -0
  8. package/dist/packages/autotrade/assets/profiles/scalp.json +88 -0
  9. package/dist/packages/autotrade/assets/profiles/swing.json +88 -0
  10. package/dist/packages/autotrade/assets/strategies/moonbag.json +101 -0
  11. package/dist/packages/autotrade/assets/strategies/runner.json +101 -0
  12. package/dist/packages/autotrade/assets/strategies/sample-dip-ladder.json +188 -0
  13. package/dist/packages/autotrade/assets/strategies/scalp.json +98 -0
  14. package/dist/packages/autotrade/assets/strategies/swing.json +97 -0
  15. package/dist/packages/autotrade/assets/strategies/yolo.json +157 -0
  16. package/dist/packages/autotrade/assets/tapes/yolo-rehearsal.json +1 -0
  17. package/dist/packages/autotrade/src/account.js +74 -0
  18. package/dist/packages/autotrade/src/backtest.js +357 -0
  19. package/dist/packages/autotrade/src/basis-text.js +32 -0
  20. package/dist/packages/autotrade/src/chat/approvals.js +484 -0
  21. package/dist/packages/autotrade/src/chat/audit.js +140 -0
  22. package/dist/packages/autotrade/src/chat/config.js +93 -0
  23. package/dist/packages/autotrade/src/chat/connector.js +24 -0
  24. package/dist/packages/autotrade/src/chat/control.js +103 -0
  25. package/dist/packages/autotrade/src/chat/fake.js +100 -0
  26. package/dist/packages/autotrade/src/chat/format.js +71 -0
  27. package/dist/packages/autotrade/src/chat/hub.js +187 -0
  28. package/dist/packages/autotrade/src/chat/index.js +18 -0
  29. package/dist/packages/autotrade/src/chat/notify.js +292 -0
  30. package/dist/packages/autotrade/src/chat/pairing.js +46 -0
  31. package/dist/packages/autotrade/src/chat/redact.js +48 -0
  32. package/dist/packages/autotrade/src/chat/secrets.js +99 -0
  33. package/dist/packages/autotrade/src/chat/service.js +248 -0
  34. package/dist/packages/autotrade/src/chat/telegram.js +290 -0
  35. package/dist/packages/autotrade/src/desk-executor.js +188 -0
  36. package/dist/packages/autotrade/src/engine.js +387 -0
  37. package/dist/packages/autotrade/src/execution-port.js +97 -0
  38. package/dist/packages/autotrade/src/fleet-config.js +169 -0
  39. package/dist/packages/autotrade/src/fleet-control.js +276 -0
  40. package/dist/packages/autotrade/src/fleet.js +639 -0
  41. package/dist/packages/autotrade/src/index.js +53 -0
  42. package/dist/packages/autotrade/src/ledger.js +108 -0
  43. package/dist/packages/autotrade/src/live-source.js +182 -0
  44. package/dist/packages/autotrade/src/monitor-daemon.js +715 -0
  45. package/dist/packages/autotrade/src/monitor.js +190 -0
  46. package/dist/packages/autotrade/src/ollama-sessions.js +137 -0
  47. package/dist/packages/autotrade/src/paper-accounts.js +72 -0
  48. package/dist/packages/autotrade/src/replay.js +198 -0
  49. package/dist/packages/autotrade/src/runner-config.js +99 -0
  50. package/dist/packages/autotrade/src/runner.js +872 -0
  51. package/dist/packages/autotrade/src/safety.js +243 -0
  52. package/dist/packages/autotrade/src/session.js +269 -0
  53. package/dist/packages/autotrade/src/sessions.js +503 -0
  54. package/dist/packages/autotrade/src/store.js +250 -0
  55. package/dist/packages/autotrade/src/strategy.js +256 -0
  56. package/dist/packages/autotrade/src/trade-ledger.js +241 -0
  57. package/dist/packages/autotrade/src/yolo.js +140 -0
  58. package/dist/packages/cli/assets/claude/analyst-system.md +4 -4
  59. package/dist/packages/cli/assets/claude/plugin/skills/token-dossier/SKILL.md +1 -1
  60. package/dist/packages/cli/src/ai-cmd.js +412 -0
  61. package/dist/packages/cli/src/analyst/backend.js +82 -15
  62. package/dist/packages/cli/src/analyst/codex.js +14 -9
  63. package/dist/packages/cli/src/analyst/ollama.js +263 -0
  64. package/dist/packages/cli/src/analyst/session.js +5 -2
  65. package/dist/packages/cli/src/app-help-gen.js +44 -8
  66. package/dist/packages/cli/src/autotrade-cmd/audit.js +57 -0
  67. package/dist/packages/cli/src/autotrade-cmd/backtest.js +199 -0
  68. package/dist/packages/cli/src/autotrade-cmd/flatten.js +64 -0
  69. package/dist/packages/cli/src/autotrade-cmd/fleet.js +397 -0
  70. package/dist/packages/cli/src/autotrade-cmd/requests.js +79 -0
  71. package/dist/packages/cli/src/autotrade-cmd/run.js +413 -0
  72. package/dist/packages/cli/src/autotrade-cmd/stop.js +76 -0
  73. package/dist/packages/cli/src/autotrade-cmd/strategies.js +198 -0
  74. package/dist/packages/cli/src/autotrade-cmd/strategy-control.js +174 -0
  75. package/dist/packages/cli/src/autotrade-cmd/telegram-host.js +101 -0
  76. package/dist/packages/cli/src/autotrade-cmd.js +168 -0
  77. package/dist/packages/cli/src/display.js +156 -17
  78. package/dist/packages/cli/src/doctor.js +62 -3
  79. package/dist/packages/cli/src/export.js +10 -2
  80. package/dist/packages/cli/src/index.js +1 -1
  81. package/dist/packages/cli/src/ledger-cmd.js +288 -0
  82. package/dist/packages/cli/src/live/chart-fills.js +46 -0
  83. package/dist/packages/cli/src/live/index.js +23 -89
  84. package/dist/packages/cli/src/live/screens/token-live.js +9 -6
  85. package/dist/packages/cli/src/live/trade.js +12 -457
  86. package/dist/packages/cli/src/live/watchlist.js +1 -1
  87. package/dist/packages/cli/src/main.js +147 -190
  88. package/dist/packages/cli/src/mcp-cmd.js +7 -1
  89. package/dist/packages/cli/src/plan-cmd.js +1 -1
  90. package/dist/packages/cli/src/pnl-app.js +31 -21
  91. package/dist/packages/cli/src/pnl-card.js +158 -21
  92. package/dist/packages/cli/src/popup.js +22 -6
  93. package/dist/packages/cli/src/record-cmd.js +141 -20
  94. package/dist/packages/cli/src/screens/agent-hud.js +34 -2
  95. package/dist/packages/cli/src/screens/analyst-session.js +7 -4
  96. package/dist/packages/cli/src/screens/analyst.js +3 -2
  97. package/dist/packages/cli/src/screens/autotrade-keys.js +169 -0
  98. package/dist/packages/cli/src/screens/autotrade-proposals.js +123 -0
  99. package/dist/packages/cli/src/screens/autotrade-screen.js +725 -0
  100. package/dist/packages/cli/src/screens/autotrade-ui.js +640 -0
  101. package/dist/packages/cli/src/screens/autotrade-worker.js +89 -0
  102. package/dist/packages/cli/src/screens/brain.js +37 -11
  103. package/dist/packages/cli/src/screens/overlay.js +5 -2
  104. package/dist/packages/cli/src/screens/plans.js +5 -17
  105. package/dist/packages/cli/src/screens/pnl-chip.js +9 -8
  106. package/dist/packages/cli/src/screens/positions.js +6 -28
  107. package/dist/packages/cli/src/screens/ticket.js +38 -205
  108. package/dist/packages/cli/src/screens/token.js +3 -3
  109. package/dist/packages/cli/src/state.js +25 -19
  110. package/dist/packages/cli/src/telegram-cmd.js +451 -0
  111. package/dist/packages/cli/src/trade.js +3 -128
  112. package/dist/packages/cli/src/version.js +1 -1
  113. package/dist/packages/cli/src/wallet-cmd.js +39 -340
  114. package/dist/packages/cli/src/wallet-command.js +8 -11
  115. package/dist/packages/cli/src/widgets.js +0 -12
  116. package/dist/packages/custom/src/config.js +20 -2
  117. package/dist/packages/custom/src/schema.js +35 -10
  118. package/dist/packages/custom/src/workspace.js +3 -3
  119. package/dist/packages/data/src/basis.js +191 -0
  120. package/dist/packages/data/src/detail.js +53 -2
  121. package/dist/packages/data/src/index.js +0 -14
  122. package/dist/packages/data/src/store.js +14 -5
  123. package/dist/packages/data/src/trade/agent/paper-desk.js +228 -16
  124. package/dist/packages/data/src/trade/agent/rendezvous.js +3 -2
  125. package/dist/packages/data/src/trade/bridge.js +4 -102
  126. package/dist/packages/data/src/trade/ledger/export.js +101 -0
  127. package/dist/packages/data/src/trade/ledger/file.js +135 -0
  128. package/dist/packages/data/src/trade/ledger/fold.js +191 -0
  129. package/dist/packages/data/src/trade/ledger/index.js +9 -0
  130. package/dist/packages/data/src/trade/ledger/schema.js +83 -0
  131. package/dist/packages/data/src/trade/ledger/sources.js +307 -0
  132. package/dist/packages/data/src/trade/ledger/stats.js +123 -0
  133. package/dist/packages/data/src/trade/ledger/tags.js +116 -0
  134. package/dist/packages/data/src/trade/ledger/view.js +51 -0
  135. package/dist/packages/data/src/trade/plans/index.js +0 -1
  136. package/dist/packages/data/src/trade/plans/service.js +3 -27
  137. package/dist/packages/mcp/assets/kb/app-help/autotrade-chat.md +48 -0
  138. package/dist/packages/mcp/assets/kb/app-help/autotrade-parallel.md +42 -0
  139. package/dist/packages/mcp/assets/kb/app-help/autotrade-runner.md +35 -0
  140. package/dist/packages/mcp/assets/kb/app-help/autotrade-stop.md +37 -0
  141. package/dist/packages/mcp/assets/kb/app-help/autotrade-strategies.md +35 -0
  142. package/dist/packages/mcp/assets/kb/app-help/autotrade-telegram.md +40 -0
  143. package/dist/packages/mcp/assets/kb/app-help/chart-trade-markers.md +42 -0
  144. package/dist/packages/mcp/assets/kb/app-help/link-a-wallet.md +4 -10
  145. package/dist/packages/mcp/assets/kb/app-help/live-trading.md +38 -0
  146. package/dist/packages/mcp/assets/kb/app-help/live-yolo.md +34 -0
  147. package/dist/packages/mcp/assets/kb/app-help/order-plans.md +1 -1
  148. package/dist/packages/mcp/assets/kb/app-help/price-or-marketcap.md +5 -2
  149. package/dist/packages/mcp/assets/kb/app-help/screen-analyst.md +3 -0
  150. package/dist/packages/mcp/assets/kb/app-help/screen-autotrade.md +217 -0
  151. package/dist/packages/mcp/assets/kb/app-help/screen-kol.md +3 -0
  152. package/dist/packages/mcp/assets/kb/app-help/screen-newpairs.md +3 -0
  153. package/dist/packages/mcp/assets/kb/app-help/screen-positions.md +3 -0
  154. package/dist/packages/mcp/assets/kb/app-help/screen-screener.md +3 -0
  155. package/dist/packages/mcp/assets/kb/app-help/screen-token.md +3 -0
  156. package/dist/packages/mcp/assets/kb/app-help/screen-trending.md +3 -0
  157. package/dist/packages/mcp/assets/kb/app-help/screen-watchlist.md +3 -0
  158. package/dist/packages/mcp/assets/kb/app-help/standing-mandates.md +1 -1
  159. package/dist/packages/mcp/assets/kb/app-help/trade-ledger.md +54 -0
  160. package/dist/packages/mcp/assets/kb/app-help/use-local-model.md +38 -0
  161. package/dist/packages/mcp/assets/kb/docs/docs-agents-agent-paper-trading.md +4 -1
  162. package/dist/packages/mcp/assets/kb/docs/docs-agents-reading-your-trade-ledger.md +31 -0
  163. package/dist/packages/mcp/assets/kb/docs/docs-agents-untrusted-by-default.md +1 -1
  164. package/dist/packages/mcp/assets/kb/docs/docs-analyst-if-claude-is-missing.md +1 -1
  165. package/dist/packages/mcp/assets/kb/docs/docs-analyst-use-a-local-model-instead.md +27 -0
  166. package/dist/packages/mcp/assets/kb/docs/docs-analyst-what-it-sees.md +2 -0
  167. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-backtests-and-their-limits.md +56 -0
  168. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-change-a-strategy-by-chat.md +49 -0
  169. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-checking-the-record-of-a-run.md +28 -0
  170. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-comparing-them.md +41 -0
  171. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-exits-and-wakes.md +76 -0
  172. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-how-a-stop-reaches-the-runner.md +32 -0
  173. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-on-the-q-screen.md +37 -0
  174. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-one-strategy-or-all-of-them.md +35 -0
  175. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-paper-accounts.md +50 -0
  176. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-presets.md +37 -0
  177. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-running-it-all-day.md +31 -0
  178. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-sessions-and-their-limits.md +31 -0
  179. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-several-strategies-at-once.md +33 -0
  180. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-stopping-it.md +35 -0
  181. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-strategies-and-presets.md +34 -0
  182. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-the-autotrade-json-file.md +48 -0
  183. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-the-heartbeat.md +27 -0
  184. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-the-run-file-and-the-heartbeat.md +34 -0
  185. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-the-runner-and-candidate-sessions.md +45 -0
  186. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-what-each-session-shows-first.md +31 -0
  187. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-what-it-costs-claude-usage-per-session.md +58 -0
  188. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-what-it-is-paper-self-directed.md +43 -0
  189. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-what-it-will-not-do.md +31 -0
  190. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-which-account-day-caps-and-the-usage-guard.md +44 -0
  191. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-your-strategies.md +37 -0
  192. package/dist/packages/mcp/assets/kb/docs/docs-autotrade.md +22 -0
  193. package/dist/packages/mcp/assets/kb/docs/docs-beginners-before-any-experimental-trading.md +2 -2
  194. package/dist/packages/mcp/assets/kb/docs/docs-beginners.md +1 -1
  195. package/dist/packages/mcp/assets/kb/docs/docs-configuration-chart-markers.md +30 -0
  196. package/dist/packages/mcp/assets/kb/docs/docs-configuration-chart-y-axis.md +1 -1
  197. package/dist/packages/mcp/assets/kb/docs/docs-configuration-environment-variables.md +4 -1
  198. package/dist/packages/mcp/assets/kb/docs/docs-configuration-files-on-disk.md +1 -0
  199. package/dist/packages/mcp/assets/kb/docs/docs-configuration-headless-recorder-dexterm-record.md +3 -1
  200. package/dist/packages/mcp/assets/kb/docs/docs-configuration-price-display-mode.md +8 -6
  201. package/dist/packages/mcp/assets/kb/docs/docs-copy-trading-stage-2-the-one-key-mirror-ticket-a-proposal.md +1 -1
  202. package/dist/packages/mcp/assets/kb/docs/docs-copy-trading-stage-3-capped-auto-mirror-default-off-less.md +1 -1
  203. package/dist/packages/mcp/assets/kb/docs/docs-copy-trading-what-is-proven-what-is-not.md +1 -1
  204. package/dist/packages/mcp/assets/kb/docs/docs-copy-trading.md +1 -1
  205. package/dist/packages/mcp/assets/kb/docs/docs-data-sources-recorded-history-and-retention.md +36 -0
  206. package/dist/packages/mcp/assets/kb/docs/docs-data-sources-sources.md +1 -0
  207. package/dist/packages/mcp/assets/kb/docs/docs-getting-started-first-run.md +1 -1
  208. package/dist/packages/mcp/assets/kb/docs/docs-getting-started-install.md +3 -3
  209. package/dist/packages/mcp/assets/kb/docs/docs-getting-started-requirements.md +1 -1
  210. package/dist/packages/mcp/assets/kb/docs/docs-getting-started.md +1 -1
  211. package/dist/packages/mcp/assets/kb/docs/docs-live-trading-changed-in-0-1-7.md +26 -0
  212. package/dist/packages/mcp/assets/kb/docs/docs-live-trading-stopping.md +28 -0
  213. package/dist/packages/mcp/assets/kb/docs/docs-live-trading-the-short-version.md +34 -0
  214. package/dist/packages/mcp/assets/kb/docs/docs-live-trading-using-a-trading-bot-with-dexterm.md +33 -0
  215. package/dist/packages/mcp/assets/kb/docs/docs-live-trading-what-dexterm-does-not-do.md +30 -0
  216. package/dist/packages/mcp/assets/kb/docs/docs-live-trading-what-dexterm-does.md +29 -0
  217. package/dist/packages/mcp/assets/kb/docs/docs-live-trading.md +23 -0
  218. package/dist/packages/mcp/assets/kb/docs/docs-ollama-another-machine.md +28 -0
  219. package/dist/packages/mcp/assets/kb/docs/docs-ollama-autotrade-on-a-local-model.md +29 -0
  220. package/dist/packages/mcp/assets/kb/docs/docs-ollama-check-your-model-dexterm-ai-probe.md +38 -0
  221. package/dist/packages/mcp/assets/kb/docs/docs-ollama-how-we-checked.md +27 -0
  222. package/dist/packages/mcp/assets/kb/docs/docs-ollama-models-without-tool-calling.md +32 -0
  223. package/dist/packages/mcp/assets/kb/docs/docs-ollama-pick-the-engine-globally-or-per-surface.md +43 -0
  224. package/dist/packages/mcp/assets/kb/docs/docs-ollama-restriction-profiles.md +35 -0
  225. package/dist/packages/mcp/assets/kb/docs/docs-ollama-set-it-up-in-two-minutes.md +39 -0
  226. package/dist/packages/mcp/assets/kb/docs/docs-ollama-troubleshooting.md +35 -0
  227. package/dist/packages/mcp/assets/kb/docs/docs-ollama-what-runs-on-a-local-model.md +39 -0
  228. package/dist/packages/mcp/assets/kb/docs/docs-ollama-what-stays-outside-the-model.md +36 -0
  229. package/dist/packages/mcp/assets/kb/docs/docs-ollama-which-model.md +38 -0
  230. package/dist/packages/mcp/assets/kb/docs/docs-ollama-your-own-agent-on-the-local-model.md +28 -0
  231. package/dist/packages/mcp/assets/kb/docs/docs-ollama.md +28 -0
  232. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-letting-an-agent-paper-trade-experimental.md +3 -4
  233. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-link-a-wallet-read-only.md +30 -0
  234. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-order-plans-and-standing-mandates.md +3 -4
  235. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-panic.md +4 -7
  236. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-paper-only-mandates.md +6 -7
  237. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-pnl-cards.md +7 -7
  238. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-the-safety-model.md +34 -0
  239. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-the-ticket.md +3 -4
  240. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-the-trade-ledger.md +42 -0
  241. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-the-wallet.md +4 -5
  242. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-trade-moments.md +4 -5
  243. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading.md +4 -5
  244. package/dist/packages/mcp/assets/kb/docs/docs-popup-chart-buy-and-sell-markers.md +37 -0
  245. package/dist/packages/mcp/assets/kb/docs/docs-popup-chart-what-it-shows.md +2 -1
  246. package/dist/packages/mcp/assets/kb/docs/docs-screens-autotrade-paper.md +26 -0
  247. package/dist/packages/mcp/assets/kb/docs/docs-screens-order-plans.md +1 -1
  248. package/dist/packages/mcp/assets/kb/docs/docs-screens-token-screen.md +2 -0
  249. package/dist/packages/mcp/assets/kb/docs/docs-spectator-the-brain-view-and-the-pnl-chip.md +1 -1
  250. package/dist/packages/mcp/assets/kb/docs/docs-telegram-approve-one-tap-entries.md +50 -0
  251. package/dist/packages/mcp/assets/kb/docs/docs-telegram-control-the-commands.md +43 -0
  252. package/dist/packages/mcp/assets/kb/docs/docs-telegram-if-something-goes-wrong.md +30 -0
  253. package/dist/packages/mcp/assets/kb/docs/docs-telegram-notify-what-reaches-your-phone.md +41 -0
  254. package/dist/packages/mcp/assets/kb/docs/docs-telegram-set-it-up.md +47 -0
  255. package/dist/packages/mcp/assets/kb/docs/docs-telegram-the-record.md +26 -0
  256. package/dist/packages/mcp/assets/kb/docs/docs-telegram-what-it-is.md +33 -0
  257. package/dist/packages/mcp/assets/kb/docs/docs-telegram-what-it-will-not-do.md +31 -0
  258. package/dist/packages/mcp/assets/kb/docs/docs-telegram.md +23 -0
  259. package/dist/packages/mcp/assets/kb/docs/docs-troubleshooting-common-questions.md +1 -1
  260. package/dist/packages/mcp/assets/kb/docs/docs-troubleshooting-doctor-lines.md +4 -0
  261. package/dist/packages/mcp/assets/kb/docs/docs-voice-linux-and-windows.md +1 -1
  262. package/dist/packages/mcp/assets/kb/docs/docs-voice.md +1 -1
  263. package/dist/packages/mcp/assets/kb/docs/docs-yolo-1-replay-it-on-your-own-history.md +42 -0
  264. package/dist/packages/mcp/assets/kb/docs/docs-yolo-2-run-it-on-paper.md +34 -0
  265. package/dist/packages/mcp/assets/kb/docs/docs-yolo-3-watch-it-and-stop-it.md +32 -0
  266. package/dist/packages/mcp/assets/kb/docs/docs-yolo-the-rules.md +37 -0
  267. package/dist/packages/mcp/assets/kb/docs/docs-yolo-what-it-is.md +34 -0
  268. package/dist/packages/mcp/assets/kb/docs/docs-yolo-what-it-will-not-do.md +31 -0
  269. package/dist/packages/mcp/assets/kb/docs/docs-yolo.md +26 -0
  270. package/dist/packages/mcp/assets/kb/entries/autotrade.md +38 -0
  271. package/dist/packages/mcp/src/app-help.js +1 -1
  272. package/dist/packages/mcp/src/autotrade-tools.js +944 -0
  273. package/dist/packages/mcp/src/backtest-requests.js +71 -0
  274. package/dist/packages/mcp/src/engine/config.js +159 -0
  275. package/dist/packages/mcp/src/engine/index.js +10 -0
  276. package/dist/packages/mcp/src/engine/loop.js +101 -0
  277. package/dist/packages/mcp/src/engine/mcp-client.js +123 -0
  278. package/dist/packages/mcp/src/engine/ollama.js +258 -0
  279. package/dist/packages/mcp/src/engine/probe.js +110 -0
  280. package/dist/packages/mcp/src/engine/reason.js +35 -0
  281. package/dist/packages/mcp/src/engine/restrictions.js +111 -0
  282. package/dist/packages/mcp/src/index.js +7 -1
  283. package/dist/packages/mcp/src/ledger-tools.js +346 -0
  284. package/dist/packages/mcp/src/paper-agent.js +2 -0
  285. package/dist/packages/mcp/src/server.js +127 -19
  286. package/dist/packages/packs/src/backtest.js +3 -1
  287. package/dist/packages/popup/src/pages/chart-lib.js +134 -21
  288. package/dist/packages/popup/src/pages/chart.css +9 -0
  289. package/dist/packages/popup/src/pages/chart.html +3 -1
  290. package/dist/packages/popup/src/pages/chart.js +104 -7
  291. package/dist/packages/popup/src/protocol.js +2 -0
  292. package/dist/packages/popup/src/server.js +4 -0
  293. package/dist/packages/recorder/src/index.js +2 -0
  294. package/dist/packages/recorder/src/recorder.js +63 -6
  295. package/dist/packages/recorder/src/retention.js +100 -0
  296. package/dist/packages/recorder/src/schema.js +34 -1
  297. package/dist/packages/recorder/src/ticks.js +237 -0
  298. package/dist/packages/tui/src/index.js +1 -0
  299. package/dist/packages/tui/src/keymap.js +21 -1
  300. package/dist/packages/tui/src/markers.js +219 -0
  301. package/dist/packages/tui/src/widgets.js +149 -2
  302. package/package.json +2 -1
  303. package/dist/packages/data/src/trade/caps.js +0 -323
  304. package/dist/packages/data/src/trade/executor.js +0 -933
  305. package/dist/packages/data/src/trade/plans/executor-live.js +0 -220
  306. package/dist/packages/data/src/trade/rpc-exec.js +0 -229
  307. package/dist/packages/data/src/trade/signer/client.js +0 -197
  308. package/dist/packages/data/src/trade/signer/fast-wallet.js +0 -154
  309. package/dist/packages/data/src/trade/signer/host.js +0 -97
  310. package/dist/packages/data/src/trade/signer/main.js +0 -121
  311. package/dist/packages/data/src/trade/signer/probe-builder.js +0 -85
  312. package/dist/packages/data/src/trade/signer/protocol.js +0 -92
  313. package/dist/packages/data/src/trade/signer/service.js +0 -400
  314. package/dist/packages/data/src/trade/signer/sol-usd-feed.js +0 -98
  315. package/dist/packages/data/src/trade/sol-usd.js +0 -86
  316. package/dist/packages/data/src/trade/swap-build.js +0 -108
  317. package/dist/packages/data/src/trade/token-delta.js +0 -201
  318. package/dist/packages/data/vendor/solana-web3/LICENSE +0 -20
  319. package/dist/packages/data/vendor/solana-web3/NOTICE.md +0 -13
  320. package/dist/packages/data/vendor/solana-web3/index.iife.min.js +0 -20
  321. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-a-live-ticket.md +0 -42
  322. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-before-you-press-size-vs-caps.md +0 -34
  323. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-devnet-signer-mainnet-token.md +0 -35
  324. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-jupiter-rate-limits.md +0 -33
  325. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-link-a-wallet.md +0 -32
  326. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-live-trading-devnet-first.md +0 -30
  327. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-mainnet.md +0 -31
  328. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-the-live-fire-path-devnet-the-fast-wallet.md +0 -41
  329. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-the-signer-process.md +0 -34
  330. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-what-the-live-path-keeps.md +0 -37
  331. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-your-first-live-trade.md +0 -41
@@ -0,0 +1,191 @@
1
+ // @dexterm/data/basis (task-1537): THE price-basis module. Market cap is the default way dexterm shows and talks
2
+ // about a coin ("entered at $69.7K, exited at $264.9K, 3.8x"); USD price per token is the alternative when the user
3
+ // sets `display.priceMode: "price"` in ~/.dexterm/config.json (or for one run: `--price` / DEXTERM_PRICE_BASIS=price).
4
+ //
5
+ // One resolver (`resolveBasis`) decides what a price slot shows, one formatter pair (`fmtCap` / `fmtUsdPrice`) draws it,
6
+ // and `basisLanguage` is the paragraph every model-facing prompt carries so the agents speak the same basis as the UI.
7
+ //
8
+ // Supply rule (shared with the PnL card, task-1518): a market cap the data source reports, else price × a supply that
9
+ // is KNOWN: the source's own mcap ÷ price, the recorded FDV ÷ price, or pump.fun's fixed 1B for a pump.fun coin. A
10
+ // supply is never guessed: with none, the slot shows the price and says why (`fallback`).
11
+ //
12
+ // Pure: no I/O, no imports. Display and wording only; nothing here is read by the signer, caps, plans or tickets.
13
+ // JSON outputs keep BOTH `price` and `mcap` fields always (`withMcap`); only the human-facing text switches.
14
+ export const PRICE_BASES = ['mcap', 'price'];
15
+ /** The default basis everywhere (UI, CLI text, agent language) when config, flag and env say nothing. */
16
+ export const DEFAULT_PRICE_BASIS = 'mcap';
17
+ /** One-run override: `DEXTERM_PRICE_BASIS=price dexterm …` (the CLI flags `--price` / `--mcap` set it too). */
18
+ export const PRICE_BASIS_ENV = 'DEXTERM_PRICE_BASIS';
19
+ export function isPriceBasis(v) { return v === 'mcap' || v === 'price'; }
20
+ /** The one-run override from the environment, or null when unset / not a basis. */
21
+ export function envPriceBasis(env) {
22
+ const v = env?.[PRICE_BASIS_ENV]?.trim().toLowerCase();
23
+ return isPriceBasis(v) ? v : null;
24
+ }
25
+ /**
26
+ * The basis in effect: the one-run override (flag/env) wins, then the config value (`display.priceMode`), then mcap.
27
+ * A config written before task-1537 is migrated (custom v4 → v5), so `configured` is the user's saved choice.
28
+ */
29
+ export function pickBasis(configured, env) {
30
+ return envPriceBasis(env) ?? (isPriceBasis(configured) ? configured : DEFAULT_PRICE_BASIS);
31
+ }
32
+ // ------------------------------------------------------------------------------------------------ formatters
33
+ const SUB = '₀₁₂₃₄₅₆₇₈₉';
34
+ const trim = (s) => (s.includes('.') ? s.replace(/0+$/, '').replace(/\.$/, '') : s);
35
+ /**
36
+ * A market cap (or any large USD amount) in sentences, rows and lines: `$950`, `$69.7K`, `$264.9K`, `$1.2M`, `$1.23M`,
37
+ * `$4.5B`. K keeps one decimal, M / B / T two, trailing zeros dropped; the unit is promoted AFTER rounding so 999 960
38
+ * reads `$1M`, never `$1000K`. Null / non-finite → '—'. (Narrow table cells use the 3-significant-digit tui form.)
39
+ */
40
+ export function fmtCap(n) {
41
+ if (n === null || n === undefined || !Number.isFinite(n))
42
+ return '—';
43
+ const sign = n < 0 ? '-' : '';
44
+ const a = Math.abs(n);
45
+ if (a < 999.5)
46
+ return `${sign}$${a < 1 ? trim(a.toFixed(2)) : String(Math.round(a))}`;
47
+ const units = ['K', 'M', 'B', 'T'];
48
+ let u = 0, v = a / 1000;
49
+ while (u < units.length - 1 && v >= 1000) {
50
+ v /= 1000;
51
+ u++;
52
+ }
53
+ const dp = (i) => (i === 0 ? 1 : 2);
54
+ let r = Number(v.toFixed(dp(u)));
55
+ if (r >= 1000 && u < units.length - 1) {
56
+ u++;
57
+ r = Number((r / 1000).toFixed(dp(u)));
58
+ }
59
+ return `${sign}$${trim(r.toFixed(dp(u)))}${units[u]}`;
60
+ }
61
+ /**
62
+ * A USD price per token, the usual small-number form with subscript zeros: `$0.0₄123`, `$0.0123`, `$1.234`, `$142.50`.
63
+ * Matches `fmtPrice` in @dexterm/tui (tested), so a price reads the same on every surface.
64
+ */
65
+ export function fmtUsdPrice(p) {
66
+ if (p === null || p === undefined || !Number.isFinite(p))
67
+ return '—';
68
+ if (p < 0)
69
+ return `-${fmtUsdPrice(-p)}`;
70
+ if (p >= 1000)
71
+ return `$${p.toLocaleString('en-US', { maximumFractionDigits: 0 })}`;
72
+ if (p >= 1)
73
+ return `$${p.toFixed(p >= 100 ? 2 : 3)}`;
74
+ if (p >= 0.01)
75
+ return `$${p.toFixed(4)}`;
76
+ const m = p.toFixed(12).match(/^0\.(0*)(\d+)/);
77
+ if (!m)
78
+ return `$${p}`;
79
+ const zeros = m[1].length;
80
+ const digits = m[2].replace(/0+$/, '').slice(0, 4) || '0';
81
+ if (zeros < 3)
82
+ return `$0.${m[1]}${digits}`;
83
+ return `$0.0${String(zeros).split('').map((c) => SUB[Number(c)]).join('')}${digits}`;
84
+ }
85
+ /** An x-multiple between two levels of the same basis: `3.8x`, `0.42x`, `12x`. Null when either side is unusable. */
86
+ export function fmtX(from, to) {
87
+ if (from === null || from === undefined || to === null || to === undefined || !Number.isFinite(from) || !Number.isFinite(to) || from <= 0 || to < 0)
88
+ return null;
89
+ const x = to / from;
90
+ return `${x >= 10 ? x.toFixed(0) : x >= 1 ? x.toFixed(1) : x.toFixed(2)}x`;
91
+ }
92
+ // ------------------------------------------------------------------------------------------------ supply + resolver
93
+ /** pump.fun mints a fixed 1,000,000,000 supply per coin (none is minted later), so its market cap is price × 1B. */
94
+ export const PUMP_FUN_SUPPLY = 1_000_000_000;
95
+ const pos = (n) => n !== null && n !== undefined && Number.isFinite(n) && n > 0;
96
+ /**
97
+ * The KNOWN supply for a coin, or null. Order: an explicit supply; the source's mcap ÷ price; recorded FDV ÷ price
98
+ * (a fully diluted cap on a non-pump coin, and the source says so); pump.fun's fixed 1B for a pump.fun coin (by
99
+ * launchpad, or a `…pump` mint with no launchpad). Never guessed.
100
+ */
101
+ export function knownSupply(h) {
102
+ const via = h.via ? ` (${h.via})` : '';
103
+ if (pos(h.supply))
104
+ return { tokens: h.supply, source: `recorded supply${via}` };
105
+ if (pos(h.mcap) && pos(h.price) && Number.isFinite(h.mcap / h.price))
106
+ return { tokens: h.mcap / h.price, source: `market cap ÷ price${via}` };
107
+ if (pos(h.fdv) && pos(h.price) && Number.isFinite(h.fdv / h.price))
108
+ return { tokens: h.fdv / h.price, source: `recorded FDV ÷ price${via}` };
109
+ const mint = h.mint ?? '';
110
+ if (h.launchpad === 'pump.fun' || ((!h.launchpad || h.launchpad === 'unknown') && mint.endsWith('pump')))
111
+ return { tokens: PUMP_FUN_SUPPLY, source: 'pump.fun fixed supply' };
112
+ return null;
113
+ }
114
+ /** Why a slot that wanted market cap shows a price instead (said next to the number, never hidden). */
115
+ export const NO_SUPPLY_REASON = 'market cap unknown: no supply recorded, showing price';
116
+ /**
117
+ * THE resolver every screen, line, table and prompt calls: the headline figure for one price slot.
118
+ * `price` is the USD (or the caller's unit) price at that moment; `mcap` a cap the source reports for the SAME moment.
119
+ * A historical price (an entry fill) is turned into a cap with a known supply (`supply` / FDV / pump.fun 1B).
120
+ */
121
+ export function resolveBasis(want, o) {
122
+ const price = Number.isFinite(o.price) ? o.price : null;
123
+ const sup = knownSupply(o);
124
+ const mcap = pos(o.mcap) && !pos(o.supply) ? o.mcap : price !== null && sup ? price * sup.tokens : null;
125
+ const pText = fmtUsdPrice(price);
126
+ if (want === 'mcap' && mcap !== null) {
127
+ return { want, basis: 'mcap', price, mcap, text: fmtCap(mcap), both: price !== null ? `${fmtCap(mcap)} mcap (${pText})` : `${fmtCap(mcap)} mcap`, fallback: null, supply: sup };
128
+ }
129
+ const fallback = want === 'mcap' && price !== null ? NO_SUPPLY_REASON : null;
130
+ const both = mcap !== null ? `${pText} (mcap ${fmtCap(mcap)})` : fallback ? `${pText} (${fallback})` : pText;
131
+ return { want, basis: 'price', price, mcap, text: pText, both, fallback, supply: sup };
132
+ }
133
+ /** A level in a sentence: `$69.7K` (mcap) or `$0.0₄697` (price, or the mcap fallback with `· supply unknown`). */
134
+ export function fmtLevel(want, o) {
135
+ const v = resolveBasis(want, o);
136
+ return v.fallback ? `${v.text} (price; supply unknown)` : v.text;
137
+ }
138
+ /**
139
+ * An entry → exit (or → now) sentence in the basis: mcap `entered at $69.7K, exited at $264.9K (3.8x)`, price
140
+ * `entered at $0.0₄697, exited at $0.0₃265 (3.8x)`. Both levels use the same supply, so the multiple is the same in
141
+ * either basis. `exit` null with `now` → `…, now $120K (1.7x)`.
142
+ */
143
+ export function entryExitLine(want, o) {
144
+ const sup = knownSupply({ ...o, mcap: o.mcap, price: o.price });
145
+ const asCap = want === 'mcap' && sup !== null;
146
+ const f = (p) => (p === null || p === undefined || !Number.isFinite(p) ? '—' : asCap ? fmtCap(p * sup.tokens) : fmtUsdPrice(p));
147
+ const end = o.exit !== null && o.exit !== undefined ? o.exit : o.now ?? null;
148
+ const verb = o.exit !== null && o.exit !== undefined ? 'exited at' : 'now';
149
+ const x = fmtX(o.entry, end);
150
+ const tail = want === 'mcap' && !asCap ? ' (prices: supply unknown)' : '';
151
+ return `entered at ${f(o.entry)}${end !== null ? `, ${verb} ${f(end)}` : ''}${x ? ` (${x})` : ''}${tail}`;
152
+ }
153
+ /**
154
+ * JSON keeps BOTH numbers: return `obj` with a market-cap twin for each price key (`pairs` maps price key → cap key,
155
+ * e.g. `{ price: 'mcap', entryPrice: 'entryMcap' }`), from a known supply, else null. A cap already on the object (a
156
+ * source-reported one) is kept. Never removes or changes a price field.
157
+ */
158
+ export function withMcap(obj, pairs, h) {
159
+ const sup = knownSupply(h);
160
+ const out = { ...obj };
161
+ for (const [k, name] of Object.entries(pairs)) {
162
+ if (typeof out[name] === 'number' && Number.isFinite(out[name]))
163
+ continue;
164
+ const p = obj[k];
165
+ out[name] = typeof p === 'number' && Number.isFinite(p) && sup ? p * sup.tokens : null;
166
+ }
167
+ return out;
168
+ }
169
+ // ------------------------------------------------------------------------------------------------ agent language
170
+ /** A short hint for tool descriptions (MCP, agent tool table) so external agents also speak the basis. */
171
+ export const MCAP_FIELD_HINT = 'Every price field has a market-cap twin (`mcap`, `entryMcap`, …; null when the supply is unknown). basis: talk in market cap by default (cap at entry, cap now, targets/stops as cap levels, x-multiples); use the price fields only when the user\'s display.priceMode is "price" or the cap is null.';
172
+ /**
173
+ * The paragraph every model-facing prompt carries (the chat assistant, the autotrade candidate agent, help answers).
174
+ * Follows the basis AT RUN TIME: tests assert both texts.
175
+ */
176
+ export function basisLanguage(basis) {
177
+ if (basis === 'price') {
178
+ return [
179
+ 'PRICE BASIS: USD PRICE (the user set display.priceMode = "price").',
180
+ 'Talk in USD price per token: the price at entry, the price now, targets and stops as price levels (with x-multiples).',
181
+ 'Quote market cap only as a secondary number in brackets ("$0.0₄697 (mcap $69.7K)"). Tools return both `price` and `mcap` fields.',
182
+ ].join(' ');
183
+ }
184
+ return [
185
+ 'PRICE BASIS: MARKET CAP (the default; display.priceMode = "mcap").',
186
+ 'Talk about a coin the way traders do, in market cap: the cap at entry and the cap now ("in at $69.7K, now $264.9K, 3.8x"),',
187
+ 'targets and stops as market-cap levels ("take profit at $500K, stop at $40K"), and moves as x-multiples.',
188
+ 'Use the `mcap` / `*Mcap` fields tools return; write caps as $69.7K / $1.2M. A per-token price only in brackets when it helps,',
189
+ 'or alone when the cap is null (the supply is unknown): then say "price only, supply unknown". Never invent a supply.',
190
+ ].join(' ');
191
+ }
@@ -3,7 +3,10 @@
3
3
  // stale-while-revalidate, so the detail screen and the MCP tools share one
4
4
  // set of requests.
5
5
  import { TTL } from "./cache.js";
6
- const NS = { mint: 'rpc:mint', holders: 'rpc:holders', rug: 'rugcheck', pools: 'gt:pools', goplus: 'goplus', trades: 'gt:trades' };
6
+ import { classifyHolder, EX_POOL_TAGS } from "./intel/holder-class.js";
7
+ const NS = { mint: 'rpc:mint', holders: 'rpc:holders', ownerMeta: 'rpc:owner-meta', rug: 'rugcheck', pools: 'gt:pools', goplus: 'goplus', trades: 'gt:trades' };
8
+ /** The program that owns an account (a pool, a curve PDA, a wallet) does not change: a week per owner. */
9
+ const OWNER_META_TTL = 7 * 86_400_000;
7
10
  /** Pools for a mint change rarely; one lookup per hour per mint. */
8
11
  const POOLS_TTL = 3_600_000;
9
12
  /** The trades tape shares GeckoTerminal's 10/min bucket with the candles: refresh at most every 20 s per pool. */
@@ -51,7 +54,7 @@ export class TokenDetail {
51
54
  return this.cache.fetch(NS.holders, mint, async () => {
52
55
  const info = (await this.mintInfo(mint)).value;
53
56
  try {
54
- return await this.pool.topHolders(mint, { info });
57
+ return await this.exPool(await this.pool.topHolders(mint, { info }));
55
58
  }
56
59
  catch (rpcErr) {
57
60
  const agg = await this.aggregateHolders(mint, info).catch(() => null);
@@ -61,6 +64,54 @@ export class TokenDetail {
61
64
  }
62
65
  }, { ttlMs: TTL.holders, source: this.pool.primary.source });
63
66
  }
67
+ /**
68
+ * The HOLDERS panel's ex-pool rule (task-1367 `classifyHolder`) for every caller of `holders()` (the MCP
69
+ * `get_holders` / `get_dossier` concentration, the autotrade dossier, rug-check), task-1518. A top account whose
70
+ * owner is a pool, a bonding curve, a launch vault, a lock or the burn address is not a person's position: it gets
71
+ * `poolSide` (and `label: 'LP'` for a pool, curve or vault) and is left out of `top10Pct`. Without this, every young
72
+ * PumpSwap pool (the vault owner is the pool account) and every Meteora DAMM v2 pool (the global pool authority)
73
+ * read as one 80-95 % "holder". One extra getMultipleAccounts over the owners not yet known (no data, <= 20
74
+ * addresses, cached a week per owner: an account's program does not change), the same lookup the wallet-intel scan
75
+ * makes; when it fails, only the derived authorities and the pump.fun curve are recognised and every other owner
76
+ * stays counted (never hidden).
77
+ */
78
+ async exPool(h) {
79
+ if (h.aggregateOnly || !h.holders.length)
80
+ return h;
81
+ const owners = [...new Set(h.holders.map((x) => x.owner).filter((o) => !!o))];
82
+ const meta = new Map();
83
+ const misses = [];
84
+ for (const o of owners) {
85
+ const hit = this.cache.get(NS.ownerMeta, o);
86
+ if (hit)
87
+ meta.set(o, hit.value);
88
+ else
89
+ misses.push(o);
90
+ }
91
+ if (misses.length) {
92
+ try {
93
+ const got = await this.pool.accountMeta(misses);
94
+ // an address with no account yet can be created later: an hour for those, a week for accounts that exist
95
+ for (const [o, m] of got) {
96
+ meta.set(o, m);
97
+ this.cache.set(NS.ownerMeta, o, m, { ttlMs: m.exists ? OWNER_META_TTL : 3_600_000, source: this.pool.primary.source });
98
+ }
99
+ }
100
+ catch { /* counted, never hidden */ }
101
+ }
102
+ const holders = h.holders.map((x) => {
103
+ if (!x.owner || x.label)
104
+ return x;
105
+ const c = classifyHolder({ mint: h.mint, owner: x.owner, tokenAccounts: [x.tokenAccount], meta: meta.get(x.owner), cex: null, dev: null, poolRule: null, linked: null });
106
+ if (!EX_POOL_TAGS.has(c.tag))
107
+ return x;
108
+ return { ...x, ...(c.tag === 'POOL' || c.tag === 'CURVE' || c.tag === 'VAULT' ? { label: 'LP' } : {}), poolSide: { tag: c.tag, program: c.program, reason: c.reason } };
109
+ });
110
+ const sum = (xs) => Math.round(xs.reduce((s, x) => s + x.pct, 0) * 1000) / 1000;
111
+ const notCounted = new Set(['LP', 'cex', 'bridge']);
112
+ const counted = holders.filter((x) => !x.poolSide && !(x.label && notCounted.has(x.label))).slice(0, 10);
113
+ return { ...h, holders, top10Pct: h.top10Pct === null ? null : sum(counted), top10PctRaw: h.top10Pct === null ? null : sum(holders.slice(0, 10)) };
114
+ }
64
115
  /** Build an aggregate-only TopHolders from the keyless Jupiter holder data; null when unavailable. */
65
116
  async aggregateHolders(mint, info) {
66
117
  if (!this.holdersAggregate)
@@ -28,27 +28,13 @@ export * from "./credits.js";
28
28
  export * from "./budget.js";
29
29
  export * from "./watchlist.js";
30
30
  export * from "./paper.js";
31
- export * from "./trade/caps.js";
32
31
  export * from "./trade/bridge.js";
33
- export * from "./trade/swap-build.js";
34
- export * from "./trade/rpc-exec.js";
35
- export * from "./trade/executor.js";
36
32
  export * from "./trade/link-store.js";
37
33
  export * from "./trade/tx-decode.js";
38
- export * from "./trade/sol-usd.js";
39
34
  export * from "./trade/kill-switch.js";
40
- export * from "./trade/token-delta.js";
41
35
  // task-1443: the paper agent desk + its rendezvous (agents paper-trade inside an armed mandate; never sign/send).
42
36
  export * from "./trade/agent/paper-desk.js";
43
37
  export * from "./trade/agent/rendezvous.js";
44
- export * from "./trade/signer/protocol.js";
45
- export * from "./trade/signer/service.js";
46
- export * from "./trade/signer/host.js";
47
- export * from "./trade/signer/client.js";
48
- export * from "./trade/signer/probe-builder.js";
49
- export * from "./trade/signer/fast-wallet.js";
50
- export * from "./trade/signer/sol-usd-feed.js";
51
- export { parseSignerArgs, buildSignerService } from "./trade/signer/main.js";
52
38
  export * from "./larp/links.js";
53
39
  export * from "./larp/safe-fetch.js";
54
40
  export * from "./larp/evidence.js";
@@ -10,15 +10,24 @@ export const MCAP_AGREE_RATIO = 5;
10
10
  * (or `fdv` when absent) can reflect only the Solana-side supply of bridged/wrapped
11
11
  * tokens. Take the larger of DexScreener and Jupiter `mcap` when they agree within
12
12
  * 5x; otherwise keep DexScreener's number and flag the row. One side only: use it.
13
+ *
14
+ * task-1518: when both sources' prices are known, Jupiter's cap is first moved to DexScreener's price (its implied
15
+ * supply x the newer price), so "agree" compares the SUPPLY each source counts, which is what the rule is about. A
16
+ * Jupiter record served from the cache can be minutes old: on a coin that ran 6x since, the raw caps are 6x apart
17
+ * while both count the same supply. Comparing the raw caps flagged every fast runner (and the autotrade thesis-split
18
+ * exit sold it, "market-cap sources 1.0x apart"), and on a coin that dumped it showed the stale, larger cap.
13
19
  */
14
- export function resolveMcap(ds, jupMcap) {
20
+ export function resolveMcap(ds, jupMcap, prices) {
15
21
  const d = ds ? (ds.mcap ?? ds.fdv) : null;
16
22
  const j = jupMcap ?? null;
17
- const pos = (n) => n !== null && Number.isFinite(n) && n > 0;
23
+ const pos = (n) => n !== null && n !== undefined && Number.isFinite(n) && n > 0;
18
24
  if (pos(d) && pos(j)) {
19
- const ratio = Math.max(d, j) / Math.min(d, j);
25
+ const dp = prices?.dexscreener, jp = prices?.jupiter;
26
+ // Jupiter's cap at DexScreener's (newer) price: its supply x the price the row shows.
27
+ const jNow = pos(dp) && pos(jp) ? j * (dp / jp) : j;
28
+ const ratio = Math.max(d, jNow) / Math.min(d, jNow);
20
29
  if (ratio <= MCAP_AGREE_RATIO) {
21
- return j > d ? { value: j, basis: 'jupiter', flagged: false, dexscreener: d, jupiter: j } : { value: d, basis: 'dexscreener', flagged: false, dexscreener: d, jupiter: j };
30
+ return jNow > d ? { value: jNow, basis: 'jupiter', flagged: false, dexscreener: d, jupiter: j } : { value: d, basis: 'dexscreener', flagged: false, dexscreener: d, jupiter: j };
22
31
  }
23
32
  return { value: d, basis: 'dexscreener', flagged: true, dexscreener: d, jupiter: j };
24
33
  }
@@ -104,7 +113,7 @@ export class Store {
104
113
  price: p,
105
114
  sources,
106
115
  stale: ds.stale.has(mint) || jup.stale.has(mint) || price.stale.has(mint),
107
- mcap: resolveMcap(d?.pair, j?.pair.mcap),
116
+ mcap: resolveMcap(d?.pair, j?.pair.mcap, { dexscreener: d?.pair.priceUsd, jupiter: j?.pair.priceUsd }),
108
117
  });
109
118
  }
110
119
  const latencyMs = {};