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,262 @@
1
+ // dexterm popup — chart v2 pure helpers (task-1325). No DOM, no network, no globals besides the export.
2
+ // Inlined into the chart page (before chart.js) under the page's CSP nonce; test/chart-lib.test.ts loads the
3
+ // same file through node:vm to unit-test the math. Everything here works on OUR data only: the ChartVM's
4
+ // candles (from the terminal's cached/derived series), its trade tape and its position fills.
5
+ (function (root) {
6
+ 'use strict';
7
+ const INTERVALS = ['1m', '5m', '15m', '1h', '4h', '1d'];
8
+ const PERIOD_MS = { '1m': 60e3, '5m': 300e3, '15m': 900e3, '1h': 3600e3, '4h': 14400e3, '1d': 86400e3 };
9
+ const INDICATORS = ['ema9', 'ema21', 'vwap', 'volma', 'volume', 'tape'];
10
+ const STYLES = ['candles', 'line', 'area'];
11
+ const SCALES = ['auto', 'log', 'percent'];
12
+ const DAY_MS = 86400e3;
13
+ const fin = (n) => typeof n === 'number' && Number.isFinite(n);
14
+ const sec = (ms) => Math.floor(ms / 1000);
15
+ // LWC lays out tick marks on UTC boundaries. To show the viewer's local wall time with correct day/month
16
+ // ticks, every bar time is shifted by ONE fixed offset (the page's current UTC offset, set once at load).
17
+ // A single offset (not per-timestamp) means a DST change can never make two bars collide.
18
+ let OFFSET_S = 0;
19
+ function setTzOffset(s) { OFFSET_S = fin(s) ? Math.trunc(s) : 0; }
20
+ const chartTime = (ms) => sec(ms) + OFFSET_S;
21
+
22
+ /** ChartVM candles (ms, OHLCV) → sorted, de-duplicated LWC bars. `t` keeps the real UTC ms; `time` is the
23
+ * chart time (UTC seconds + the fixed local offset). Non-finite bars are dropped. */
24
+ function toBars(candles) {
25
+ const byT = new Map();
26
+ for (const c of candles || []) {
27
+ if (!c || !fin(c.t) || !fin(c.o) || !fin(c.h) || !fin(c.l) || !fin(c.c)) continue;
28
+ byT.set(chartTime(c.t), { t: c.t, time: chartTime(c.t), open: c.o, high: Math.max(c.h, c.o, c.c), low: Math.min(c.l, c.o, c.c), close: c.c, volume: fin(c.v) && c.v > 0 ? c.v : 0 });
29
+ }
30
+ return [...byT.values()].sort((a, b) => a.time - b.time);
31
+ }
32
+
33
+ /** Merge a 'tail' (the last ≤2 bars of the same series) into bars: same time replaces, newer appends. */
34
+ function mergeTail(bars, tail) {
35
+ const out = bars.slice();
36
+ for (const b of toBars(tail)) {
37
+ const last = out[out.length - 1];
38
+ if (!last || b.time > last.time) out.push(b);
39
+ else {
40
+ // replace in place (usually the last or second-last bar); older-than-window tails are ignored
41
+ for (let i = out.length - 1; i >= Math.max(0, out.length - 4); i--) if (out[i].time === b.time) { out[i] = b; break; }
42
+ }
43
+ }
44
+ return out;
45
+ }
46
+
47
+ /** Exponential moving average of closes, seeded with the SMA of the first `period` closes. */
48
+ function ema(bars, period) {
49
+ const out = [];
50
+ if (!(period >= 1) || bars.length < period) return out;
51
+ const k = 2 / (period + 1);
52
+ let seed = 0;
53
+ for (let i = 0; i < period; i++) seed += bars[i].close;
54
+ let v = seed / period;
55
+ out.push({ time: bars[period - 1].time, value: v });
56
+ for (let i = period; i < bars.length; i++) { v = bars[i].close * k + v * (1 - k); out.push({ time: bars[i].time, value: v }); }
57
+ return out;
58
+ }
59
+
60
+ /** Simple moving average of `values` ({time, value}). */
61
+ function sma(points, period) {
62
+ const out = [];
63
+ if (!(period >= 1)) return out;
64
+ let sum = 0;
65
+ for (let i = 0; i < points.length; i++) {
66
+ sum += points[i].value;
67
+ if (i >= period) sum -= points[i - period].value;
68
+ if (i >= period - 1) out.push({ time: points[i].time, value: sum / period });
69
+ }
70
+ return out;
71
+ }
72
+
73
+ /**
74
+ * VWAP anchored to the UTC day (resets at 00:00 UTC, the usual 24/7 crypto session). Typical price
75
+ * (H+L+C)/3 weighted by the bar's volume — our volume is USD (GeckoTerminal), which still yields a
76
+ * volume-weighted average PRICE. A day with no volume so far carries the typical price.
77
+ */
78
+ function vwap(bars) {
79
+ const out = [];
80
+ let day = null, pv = 0, vol = 0;
81
+ for (const b of bars) {
82
+ const d = Math.floor((fin(b.t) ? b.t : b.time * 1000) / DAY_MS); // the real UTC day, not the shifted one
83
+ if (d !== day) { day = d; pv = 0; vol = 0; }
84
+ const tp = (b.high + b.low + b.close) / 3;
85
+ pv += tp * b.volume; vol += b.volume;
86
+ out.push({ time: b.time, value: vol > 0 ? pv / vol : tp });
87
+ }
88
+ return out;
89
+ }
90
+
91
+ /** Volume histogram points, coloured by candle direction. */
92
+ function volumes(bars, upColor, downColor) {
93
+ return bars.map((b) => ({ time: b.time, value: b.volume, color: b.close >= b.open ? upColor : downColor }));
94
+ }
95
+
96
+ /** The chart time of the bar a ms timestamp falls in, for a period (same shift as toBars). */
97
+ function barTimeOf(tMs, periodMs) { return chartTime(Math.floor(tMs / periodMs) * periodMs); }
98
+
99
+ /**
100
+ * Buy/sell markers from the tape, aggregated per bar and side (one arrow per side per bar; size grows with
101
+ * the USD traded in that bar). Only bars that exist in the series get a marker. Sorted by time.
102
+ */
103
+ function tapeMarkers(trades, periodMs, barTimes, colors) {
104
+ const agg = new Map();
105
+ for (const t of trades || []) {
106
+ if (!t || !fin(t.t) || (t.side !== 'buy' && t.side !== 'sell')) continue;
107
+ const time = barTimeOf(t.t, periodMs);
108
+ if (!barTimes.has(time)) continue;
109
+ const k = `${time}:${t.side}`;
110
+ const a = agg.get(k) || { time, side: t.side, n: 0, usd: 0 };
111
+ a.n++; a.usd += fin(t.usd) ? Math.max(0, t.usd) : 0;
112
+ agg.set(k, a);
113
+ }
114
+ const out = [];
115
+ for (const a of agg.values()) {
116
+ const size = Math.max(0.5, Math.min(1.6, 0.5 + Math.log10(1 + a.usd) / 4));
117
+ out.push(a.side === 'buy'
118
+ ? { time: a.time, position: 'belowBar', shape: 'arrowUp', color: colors.up, size, id: `tape-b-${a.time}` }
119
+ : { time: a.time, position: 'aboveBar', shape: 'arrowDown', color: colors.down, size, id: `tape-s-${a.time}` });
120
+ }
121
+ return out.sort((x, y) => x.time - y.time);
122
+ }
123
+
124
+ /**
125
+ * Position fill markers (paper ledger fills of the current position) at their fill time and exact fill
126
+ * price when known. Fills outside the loaded series are skipped (the row still shows the position).
127
+ */
128
+ function fillMarkers(fills, periodMs, barTimes, colors) {
129
+ const out = [];
130
+ let lastBar = -Infinity;
131
+ for (const t of barTimes) if (t > lastBar) lastBar = t;
132
+ for (const f of fills || []) {
133
+ if (!f || !fin(f.t) || (f.side !== 'buy' && f.side !== 'sell')) continue;
134
+ let time = barTimeOf(f.t, periodMs);
135
+ // A fill newer than the last candle (the candle feed lags 1–2 min) sits on the forming/last bar, the way
136
+ // a trading chart shows a fresh execution — up to 3 periods ahead; older gaps are skipped.
137
+ if (!barTimes.has(time) && time > lastBar && time - lastBar <= (3 * periodMs) / 1000) time = lastBar;
138
+ if (!barTimes.has(time)) continue;
139
+ const text = `${f.side === 'buy' ? 'BUY' : 'SELL'} ${fin(f.sol) ? fmtSol(f.sol) : ''}`.trim();
140
+ const m = { time, shape: f.side === 'buy' ? 'arrowUp' : 'arrowDown', color: f.side === 'buy' ? colors.buy : colors.sell, text, size: 1.4, id: `fill-${f.side}-${f.t}` };
141
+ if (fin(f.priceUsd) && f.priceUsd > 0) { m.position = f.side === 'buy' ? 'atPriceBottom' : 'atPriceTop'; m.price = f.priceUsd; }
142
+ else m.position = f.side === 'buy' ? 'belowBar' : 'aboveBar';
143
+ out.push(m);
144
+ }
145
+ return out.sort((x, y) => x.time - y.time);
146
+ }
147
+
148
+ /** LWC price format for a price magnitude: enough decimals for memecoin prices (down to 1e-12). */
149
+ function priceFormatFor(p) {
150
+ if (!fin(p) || p <= 0) return { type: 'price', precision: 6, minMove: 1e-6 };
151
+ const mag = Math.floor(Math.log10(p));
152
+ const precision = Math.max(2, Math.min(12, 3 - mag + (p < 1 ? 1 : 0)));
153
+ return { type: 'price', precision, minMove: Number((10 ** -precision).toPrecision(1)) };
154
+ }
155
+
156
+ // ---- formatting (mirrors @dexterm/tui fmtPrice: subscript zero-compression, $0.0₄123)
157
+ const SUB = '₀₁₂₃₄₅₆₇₈₉';
158
+ function fmtPrice(p) {
159
+ if (!fin(p)) return '—';
160
+ if (p < 0) return '-' + fmtPrice(-p);
161
+ if (p >= 1000) return '$' + p.toLocaleString('en-US', { maximumFractionDigits: 0 });
162
+ if (p >= 1) return '$' + p.toFixed(p >= 100 ? 2 : 3);
163
+ if (p >= 0.01) return '$' + p.toFixed(4);
164
+ if (p === 0) return '$0';
165
+ const s = p.toFixed(14);
166
+ const m = s.match(/^0\.(0*)(\d+)/);
167
+ if (!m) return '$' + p;
168
+ const zeros = m[1].length;
169
+ const digits = m[2].replace(/0+$/, '').slice(0, 4) || '0';
170
+ if (zeros < 3) return `$0.${m[1]}${digits}`;
171
+ return `$0.0${String(zeros).split('').map((c) => SUB[Number(c)]).join('')}${digits}`;
172
+ }
173
+ /** Axis/crosshair price label: fmtPrice without the $ (TradingView style). */
174
+ function fmtAxis(p) { return fmtPrice(p).replace('$', ''); }
175
+ function fmtUsd(x) {
176
+ if (!fin(x)) return '—';
177
+ const a = Math.abs(x), s = x < 0 ? '-' : '';
178
+ if (a >= 1e9) return `${s}$${(a / 1e9).toFixed(2)}B`;
179
+ if (a >= 1e6) return `${s}$${(a / 1e6).toFixed(2)}M`;
180
+ if (a >= 1e3) return `${s}$${(a / 1e3).toFixed(1)}K`;
181
+ return `${s}$${a.toFixed(0)}`;
182
+ }
183
+ // ---- task-1366 market cap (mirrors @dexterm/tui fmtMcapBare: K/M/B/T, ≤ 3 significant digits, never 1000K)
184
+ const MC_UNITS = ['', 'K', 'M', 'B', 'T'];
185
+ function fmtMcapAxis(n) {
186
+ if (!fin(n)) return '—';
187
+ const sign = n < 0 ? '-' : '';
188
+ let a = Math.abs(n);
189
+ if (a === 0) return '0';
190
+ if (a < 1) return sign + String(Number(a.toPrecision(2)));
191
+ let u = 0;
192
+ while (u < MC_UNITS.length - 1 && a >= 1000) { a /= 1000; u++; }
193
+ let r = Number(a.toPrecision(3));
194
+ if (r >= 1000 && u < MC_UNITS.length - 1) { r = Number((r / 1000).toPrecision(3)); u++; }
195
+ return `${sign}${r >= 1000 ? String(Math.round(r)) : String(r)}${MC_UNITS[u]}`;
196
+ }
197
+ const MCAP_LABEL = 'mcap (current supply)';
198
+ const MCAP_FALLBACK = 'supply unknown · showing price';
199
+ /**
200
+ * How the page shows numbers for a VM: `mcap` (with the supply multiplier) only when the terminal is in mcap mode AND
201
+ * sent a usable supply; mcap mode without one is `price` + a visible note. Never invents a supply.
202
+ */
203
+ function displayOf(vm) {
204
+ const wantMcap = !!vm && vm.priceMode === 'mcap';
205
+ const supply = wantMcap && fin(vm.supply) && vm.supply > 0 ? vm.supply : null;
206
+ // the key changes only when the supply moves in its 4th significant digit (no re-format on every tick)
207
+ if (supply) return { mode: 'mcap', supply, label: MCAP_LABEL, key: `mcap:${Number(supply.toPrecision(4))}` };
208
+ return { mode: 'price', supply: null, label: wantMcap ? MCAP_FALLBACK : null, key: wantMcap ? 'price:fallback' : 'price' };
209
+ }
210
+ /** The Y-axis / crosshair label formatter for a display: mcap = price × supply in K/M/B, else the price label. */
211
+ function axisFormatter(d) {
212
+ if (d && d.mode === 'mcap' && fin(d.supply)) { const s = d.supply; return (p) => fmtMcapAxis(p * s); }
213
+ return fmtAxis;
214
+ }
215
+ function fmtPct(frac, digits = 2) { return fin(frac) ? `${frac >= 0 ? '+' : '-'}${Math.abs(frac * 100).toFixed(digits)}%` : '—'; }
216
+ function fmtSol(n) { return `${n >= 100 ? n.toFixed(0) : n >= 0.01 ? n.toFixed(2) : n.toFixed(4)} SOL`; }
217
+
218
+ /**
219
+ * Crosshair/last-bar legend values for one bar (strings), with change vs the previous close. task-1366: with an mcap
220
+ * display, O/H/L/C read market cap and the close carries the price in parentheses (`C 1.2M ($0.0₄123)`).
221
+ */
222
+ function legendFor(bar, prevClose, display) {
223
+ if (!bar) return null;
224
+ const base = fin(prevClose) && prevClose > 0 ? prevClose : bar.open;
225
+ const chg = base > 0 ? (bar.close - base) / base : null;
226
+ const f = axisFormatter(display);
227
+ const mc = !!display && display.mode === 'mcap';
228
+ return { o: f(bar.open), h: f(bar.high), l: f(bar.low), c: mc ? `${f(bar.close)} (${fmtPrice(bar.close)})` : f(bar.close), v: fmtUsd(bar.volume), chg: fmtPct(chg), up: bar.close >= bar.open };
229
+ }
230
+
231
+ /** Index of the bar at `time` (binary search), or -1. */
232
+ function indexOfTime(bars, time) {
233
+ let lo = 0, hi = bars.length - 1;
234
+ while (lo <= hi) { const mid = (lo + hi) >> 1; const t = bars[mid].time; if (t === time) return mid; if (t < time) lo = mid + 1; else hi = mid - 1; }
235
+ return -1;
236
+ }
237
+
238
+ /** Fractional logical index for any time (extrapolated past either end by the bar period). */
239
+ function logicalOf(bars, time, periodS) {
240
+ if (!bars.length) return null;
241
+ const first = bars[0].time, last = bars[bars.length - 1].time;
242
+ if (time <= first) return (time - first) / periodS;
243
+ if (time >= last) return bars.length - 1 + (time - last) / periodS;
244
+ let lo = 0, hi = bars.length - 1;
245
+ while (hi - lo > 1) { const mid = (lo + hi) >> 1; if (bars[mid].time <= time) lo = mid; else hi = mid; }
246
+ const span = bars[hi].time - bars[lo].time;
247
+ return lo + (span > 0 ? (time - bars[lo].time) / span : 0);
248
+ }
249
+
250
+ /** Time (UTC s) for a fractional logical index (inverse of logicalOf). */
251
+ function timeOfLogical(bars, logical, periodS) {
252
+ if (!bars.length || !fin(logical)) return null;
253
+ const n = bars.length;
254
+ if (logical <= 0) return bars[0].time + logical * periodS;
255
+ if (logical >= n - 1) return bars[n - 1].time + (logical - (n - 1)) * periodS;
256
+ const i = Math.floor(logical), f = logical - i;
257
+ return bars[i].time + f * (bars[i + 1].time - bars[i].time);
258
+ }
259
+
260
+ const api = { setTzOffset, chartTime, INTERVALS, PERIOD_MS, INDICATORS, STYLES, SCALES, toBars, mergeTail, ema, sma, vwap, volumes, barTimeOf, tapeMarkers, fillMarkers, priceFormatFor, fmtPrice, fmtAxis, fmtUsd, fmtPct, fmtSol, legendFor, fmtMcapAxis, displayOf, axisFormatter, MCAP_LABEL, MCAP_FALLBACK, indexOfTime, logicalOf, timeOfLogical };
261
+ root.DTChart = Object.freeze(api);
262
+ })(typeof window !== 'undefined' ? window : globalThis);
@@ -0,0 +1,50 @@
1
+ /* dexterm popup — chart v2 (task-1325): TradingView Lightweight Charts in the cyberspace HUD.
2
+ Inlined after common.css under the page nonce. Compact, crisp, no scrollbars. */
3
+ .chart2 .drag { padding: 5px 10px; gap: 8px; }
4
+ .coin-img-slot { width: 16px; height: 16px; border-radius: 50%; flex: 0 0 16px; overflow: hidden; background: rgba(255,255,255,.06); }
5
+ .coin-img-slot img { width: 16px; height: 16px; display: block; object-fit: cover; }
6
+ .live { font-size: 10px; font-weight: 700; letter-spacing: .08em; padding: 1px 6px; border-radius: 3px; border: 1px solid currentColor; }
7
+ .live.on { color: var(--up); }
8
+ .live.on::first-letter { animation: dt-pulse 1.2s ease-in-out infinite; }
9
+ .live.stale { color: var(--warn); }
10
+ .live.wait { color: var(--dim); }
11
+ @keyframes dt-pulse { 50% { opacity: .25; } }
12
+ .toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 2px 6px; padding: 3px 8px; border-bottom: 1px solid var(--border); font-size: 11px; white-space: nowrap; overflow: hidden; }
13
+ .toolbar .grp { display: inline-flex; gap: 2px; }
14
+ .toolbar .sep { width: 1px; height: 14px; background: var(--border); }
15
+ .tb { -webkit-appearance: none; appearance: none; background: none; border: 1px solid transparent; color: var(--dim); font: inherit; padding: 1px 6px; border-radius: 4px; cursor: pointer; }
16
+ .tb:hover { color: var(--text); border-color: var(--border); }
17
+ .tb.on { color: var(--accent); border-color: rgba(0,240,255,.35); background: rgba(0,240,255,.07); }
18
+ .tb.pending { color: var(--warn); }
19
+ .banner { padding: 4px 10px; font-size: 11px; color: var(--warn); border-bottom: 1px solid var(--border); background: rgba(245,255,45,.05); }
20
+ .chart2 .stage { overflow: hidden; }
21
+ #rain { opacity: .22; }
22
+ .chart { position: absolute; inset: 0; }
23
+ .draw { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; z-index: 4; }
24
+ .draw.armed { pointer-events: auto; cursor: crosshair; }
25
+ .ohlc { position: absolute; left: 8px; top: 6px; z-index: 5; pointer-events: none; font-size: 11px; line-height: 1.5; color: var(--muted);
26
+ text-shadow: 0 0 4px var(--bg), 0 0 2px var(--bg); }
27
+ .ohlc .row1 b { color: var(--dim); font-weight: 400; margin-left: 6px; }
28
+ .ohlc .row1 b:first-child { margin-left: 0; }
29
+ .ohlc .up { color: var(--up); } .ohlc .down { color: var(--down); }
30
+ .ohlc .ind { margin-right: 10px; }
31
+ .hint { position: absolute; right: 70px; top: 6px; z-index: 5; font-size: 11px; color: var(--warn); pointer-events: none; }
32
+ .pos { border-top: 1px solid var(--border); padding: 3px 10px 4px; font-size: 11px; background: rgba(245,255,45,.025); }
33
+ .pos-head { display: flex; gap: 10px; }
34
+ .pos-title { color: var(--warn); font-weight: 700; letter-spacing: .04em; }
35
+ .pos-title.live-ledger { color: var(--text); }
36
+ .pos-cap { margin-left: auto; color: var(--dim); }
37
+ .pos-cells { display: flex; flex-wrap: wrap; gap: 2px 18px; margin-top: 2px; white-space: nowrap; }
38
+ .pos-cell { display: flex; flex-direction: column; }
39
+ .pos-cell .k { color: var(--dim); font-size: 10px; }
40
+ .pos-cell .v { color: var(--text); }
41
+ .pos-cell .v.up { color: var(--up); font-weight: 700; } .pos-cell .v.down { color: var(--down); font-weight: 700; }
42
+ .pos-cell .v.muted { color: var(--muted); } .pos-cell .v.warn { color: var(--warn); }
43
+ .chart2 .foot { flex-direction: column; gap: 1px; padding: 3px 10px 4px; }
44
+ .chart2 .foot .keys { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
45
+ /* the license attribution is never clipped: it wraps instead */
46
+ .chart2 .foot .attr { color: var(--muted); font-size: 10px; white-space: normal; }
47
+ .chart2 .foot a { color: var(--accent); text-decoration: none; }
48
+ /* LWC attribution logo: the library injects this exact rule too (allowed by CSP hash); repeated here so the
49
+ logo stays positioned even if a future build changes its inline style text. */
50
+ a#tv-attr-logo { position: absolute; left: 10px; bottom: 10px; height: 19px; width: 35px; margin: 0; padding: 0; border: 0; z-index: 3; }
@@ -0,0 +1,56 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="dexterm-ws" content="__WS_TOKEN__">
6
+ <meta name="dexterm-popup" content="__POPUP_ID__">
7
+ <meta name="dexterm-port" content="__PORT__">
8
+ <title>dexterm · chart</title>
9
+ <style nonce="__NONCE__">/*__CSS__*/</style>
10
+ </head>
11
+ <body>
12
+ <div id="hud" class="hud chart2">
13
+ <div id="drag" class="drag">
14
+ <span class="mark">✦</span>
15
+ <!-- task-1326: the coin image, a 16×16 <img> served by THIS loopback server from the terminal's cache
16
+ (`/img/<key>.png`); the page CSP allows images from that path prefix only. -->
17
+ <span id="coin-img-slot" class="coin-img-slot" hidden></span>
18
+ <span id="title" class="title">dexterm · CHART</span>
19
+ <span id="live" class="live wait" title="ticks from the terminal">● …</span>
20
+ <span id="status" class="status">connecting…</span>
21
+ <button id="close" class="close" type="button" aria-label="close">✕</button>
22
+ </div>
23
+ <div id="toolbar" class="toolbar">
24
+ <span class="grp" id="tf"></span>
25
+ <span class="sep"></span>
26
+ <span class="grp" id="styles"></span>
27
+ <span class="sep"></span>
28
+ <span class="grp" id="scales"></span>
29
+ <span class="sep"></span>
30
+ <span class="grp" id="inds"></span>
31
+ <span class="sep"></span>
32
+ <span class="grp" id="draws"></span>
33
+ </div>
34
+ <div id="banner" class="banner" hidden></div>
35
+ <div class="stage">
36
+ <canvas id="rain"></canvas>
37
+ <div id="chart" class="chart"></div>
38
+ <canvas id="draw" class="draw"></canvas>
39
+ <div id="legend" class="ohlc"></div>
40
+ <div id="hint" class="hint" hidden></div>
41
+ </div>
42
+ <div id="pos" class="pos" hidden>
43
+ <div class="pos-head"><span id="pos-title" class="pos-title">◈ POSITION · PAPER</span><span id="pos-cap" class="pos-cap"></span></div>
44
+ <div id="pos-cells" class="pos-cells"></div>
45
+ </div>
46
+ <div id="foot" class="foot">
47
+ <span class="keys">1–6 tf · c style · a/l/p scale · e ema · w vwap · m vol·ma · v vol · b tape · h/t draw · f fit · esc close</span>
48
+ <span class="attr" title="TradingView Lightweight Charts v__LWC_VERSION__ (Apache-2.0), self-hosted"><span id="notice">__LWC_NOTICE__</span> · <a id="tv-link" href="https://www.tradingview.com/" target="_blank" rel="noopener noreferrer">https://www.tradingview.com/</a></span>
49
+ </div>
50
+ </div>
51
+ <script nonce="__NONCE__">/*__COMMON_JS__*/</script>
52
+ <script nonce="__NONCE__" src="__LWC_SRC__"></script>
53
+ <script nonce="__NONCE__">/*__LIB_JS__*/</script>
54
+ <script nonce="__NONCE__">/*__JS__*/</script>
55
+ </body>
56
+ </html>