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.
- package/LICENSE +661 -0
- package/dist/packages/agents/src/audit.js +122 -0
- package/dist/packages/agents/src/bus.js +379 -0
- package/dist/packages/agents/src/executor.js +177 -0
- package/dist/packages/agents/src/gate.js +176 -0
- package/dist/packages/agents/src/identity.js +179 -0
- package/dist/packages/agents/src/index.js +15 -0
- package/dist/packages/agents/src/proposals.js +153 -0
- package/dist/packages/agents/src/schema.js +87 -0
- package/dist/packages/agents/src/sdk.js +140 -0
- package/dist/packages/agents/src/tiers.js +114 -0
- package/dist/packages/agents/src/tools.js +69 -0
- package/dist/packages/agents/src/ws.js +158 -0
- package/dist/packages/cli/assets/claude/analyst-system.md +76 -0
- package/dist/packages/cli/assets/claude/plugin/.claude-plugin/plugin.json +5 -0
- package/dist/packages/cli/assets/claude/plugin/skills/REGISTRY.json +16 -0
- package/dist/packages/cli/assets/claude/plugin/skills/larp-check/SKILL.md +67 -0
- package/dist/packages/cli/assets/claude/plugin/skills/rug-check/SKILL.md +64 -0
- package/dist/packages/cli/assets/claude/plugin/skills/token-dossier/SKILL.md +63 -0
- package/dist/packages/cli/assets/claude/plugin/skills/trench-scan/SKILL.md +44 -0
- package/dist/packages/cli/assets/claude/schemas/larp.schema.json +117 -0
- package/dist/packages/cli/assets/claude/schemas/trench-scan.schema.json +71 -0
- package/dist/packages/cli/assets/claude/schemas/verdict.schema.json +115 -0
- package/dist/packages/cli/bin/dexterm.mjs +11 -0
- package/dist/packages/cli/src/agent-cmd.js +303 -0
- package/dist/packages/cli/src/agent-roster.js +26 -0
- package/dist/packages/cli/src/analyst/backend.js +526 -0
- package/dist/packages/cli/src/analyst/results.js +38 -0
- package/dist/packages/cli/src/analyst/session.js +319 -0
- package/dist/packages/cli/src/audit.js +51 -0
- package/dist/packages/cli/src/backtest-cmd.js +149 -0
- package/dist/packages/cli/src/boot-state.js +62 -0
- package/dist/packages/cli/src/custom.js +261 -0
- package/dist/packages/cli/src/display.js +191 -0
- package/dist/packages/cli/src/doctor.js +361 -0
- package/dist/packages/cli/src/feed.js +634 -0
- package/dist/packages/cli/src/fixtures.js +275 -0
- package/dist/packages/cli/src/follow-cmd.js +221 -0
- package/dist/packages/cli/src/images-config.js +59 -0
- package/dist/packages/cli/src/index.js +31 -0
- package/dist/packages/cli/src/kb-skill-cmd.js +240 -0
- package/dist/packages/cli/src/larp-record.js +21 -0
- package/dist/packages/cli/src/live/copy.js +80 -0
- package/dist/packages/cli/src/live/flow.js +233 -0
- package/dist/packages/cli/src/live/index.js +509 -0
- package/dist/packages/cli/src/live/intel.js +227 -0
- package/dist/packages/cli/src/live/newpairs.js +334 -0
- package/dist/packages/cli/src/live/screens/newpairs-live.js +219 -0
- package/dist/packages/cli/src/live/screens/token-live.js +459 -0
- package/dist/packages/cli/src/live/screens/watchlist-live.js +149 -0
- package/dist/packages/cli/src/live/token.js +585 -0
- package/dist/packages/cli/src/live/trade.js +929 -0
- package/dist/packages/cli/src/live/watchlist.js +178 -0
- package/dist/packages/cli/src/main.js +5583 -0
- package/dist/packages/cli/src/narrative-cmd.js +76 -0
- package/dist/packages/cli/src/pack-cmd.js +323 -0
- package/dist/packages/cli/src/plan-cmd.js +278 -0
- package/dist/packages/cli/src/popup.js +810 -0
- package/dist/packages/cli/src/rules-cmd.js +131 -0
- package/dist/packages/cli/src/rules.js +339 -0
- package/dist/packages/cli/src/scan/command.js +57 -0
- package/dist/packages/cli/src/scan/engine.js +419 -0
- package/dist/packages/cli/src/scan/observe.js +64 -0
- package/dist/packages/cli/src/scan/ui.js +98 -0
- package/dist/packages/cli/src/screener/filter.js +241 -0
- package/dist/packages/cli/src/screener/presets.js +80 -0
- package/dist/packages/cli/src/screener/rows.js +146 -0
- package/dist/packages/cli/src/screener/rug.js +50 -0
- package/dist/packages/cli/src/screener/sort.js +52 -0
- package/dist/packages/cli/src/screener/view.js +183 -0
- package/dist/packages/cli/src/screens/analyst-session.js +343 -0
- package/dist/packages/cli/src/screens/analyst.js +326 -0
- package/dist/packages/cli/src/screens/boot.js +74 -0
- package/dist/packages/cli/src/screens/bubbles.js +255 -0
- package/dist/packages/cli/src/screens/coin.js +33 -0
- package/dist/packages/cli/src/screens/follows.js +201 -0
- package/dist/packages/cli/src/screens/kol.js +90 -0
- package/dist/packages/cli/src/screens/narrative.js +90 -0
- package/dist/packages/cli/src/screens/newpairs.js +150 -0
- package/dist/packages/cli/src/screens/overlay.js +257 -0
- package/dist/packages/cli/src/screens/plans.js +126 -0
- package/dist/packages/cli/src/screens/positions.js +176 -0
- package/dist/packages/cli/src/screens/rules.js +170 -0
- package/dist/packages/cli/src/screens/screener.js +459 -0
- package/dist/packages/cli/src/screens/social-panel.js +107 -0
- package/dist/packages/cli/src/screens/ticket.js +342 -0
- package/dist/packages/cli/src/screens/token.js +312 -0
- package/dist/packages/cli/src/screens/trending.js +181 -0
- package/dist/packages/cli/src/screens/watchlist.js +104 -0
- package/dist/packages/cli/src/social/demo.js +96 -0
- package/dist/packages/cli/src/social/view.js +250 -0
- package/dist/packages/cli/src/state.js +463 -0
- package/dist/packages/cli/src/theme-cmd.js +126 -0
- package/dist/packages/cli/src/trade.js +319 -0
- package/dist/packages/cli/src/voice-hud.js +42 -0
- package/dist/packages/cli/src/wallet-cmd.js +440 -0
- package/dist/packages/cli/src/wallet-command.js +31 -0
- package/dist/packages/cli/src/widgets.js +208 -0
- package/dist/packages/cli/src/workspace-cmd.js +68 -0
- package/dist/packages/cli/src/x-cmd.js +154 -0
- package/dist/packages/custom/src/config.js +213 -0
- package/dist/packages/custom/src/index.js +10 -0
- package/dist/packages/custom/src/keymap.js +107 -0
- package/dist/packages/custom/src/layout.js +235 -0
- package/dist/packages/custom/src/packs.js +633 -0
- package/dist/packages/custom/src/rules.js +704 -0
- package/dist/packages/custom/src/schema.js +515 -0
- package/dist/packages/custom/src/themes.js +176 -0
- package/dist/packages/custom/src/widget-html.js +222 -0
- package/dist/packages/custom/src/workspace.js +141 -0
- package/dist/packages/data/src/analyst-actions.js +133 -0
- package/dist/packages/data/src/budget.js +88 -0
- package/dist/packages/data/src/cache.js +142 -0
- package/dist/packages/data/src/candles.js +168 -0
- package/dist/packages/data/src/clock.js +64 -0
- package/dist/packages/data/src/credits.js +137 -0
- package/dist/packages/data/src/detail.js +97 -0
- package/dist/packages/data/src/fast-lane.js +321 -0
- package/dist/packages/data/src/fixtures.js +135 -0
- package/dist/packages/data/src/health.js +245 -0
- package/dist/packages/data/src/http.js +277 -0
- package/dist/packages/data/src/images/cache.js +141 -0
- package/dist/packages/data/src/images/decode-worker.js +28 -0
- package/dist/packages/data/src/images/decode.js +81 -0
- package/dist/packages/data/src/images/fetch.js +162 -0
- package/dist/packages/data/src/images/gif.js +214 -0
- package/dist/packages/data/src/images/index.js +10 -0
- package/dist/packages/data/src/images/jpeg.js +544 -0
- package/dist/packages/data/src/images/png.js +310 -0
- package/dist/packages/data/src/images/service.js +334 -0
- package/dist/packages/data/src/images/types.js +27 -0
- package/dist/packages/data/src/index.js +208 -0
- package/dist/packages/data/src/intel/helius-history.js +59 -0
- package/dist/packages/data/src/intel/holder-class.js +125 -0
- package/dist/packages/data/src/intel/rules.js +421 -0
- package/dist/packages/data/src/intel/scan.js +170 -0
- package/dist/packages/data/src/larp/evidence.js +288 -0
- package/dist/packages/data/src/larp/links.js +137 -0
- package/dist/packages/data/src/larp/robots.js +90 -0
- package/dist/packages/data/src/larp/safe-fetch.js +389 -0
- package/dist/packages/data/src/limiter.js +341 -0
- package/dist/packages/data/src/model.js +12 -0
- package/dist/packages/data/src/paper.js +331 -0
- package/dist/packages/data/src/rpc-config.js +126 -0
- package/dist/packages/data/src/rpc-pool.js +166 -0
- package/dist/packages/data/src/social/chain.js +83 -0
- package/dist/packages/data/src/social/dedupe.js +205 -0
- package/dist/packages/data/src/social/feed.js +462 -0
- package/dist/packages/data/src/social/firewall.js +110 -0
- package/dist/packages/data/src/social/index.js +11 -0
- package/dist/packages/data/src/social/kol.js +269 -0
- package/dist/packages/data/src/social/model.js +11 -0
- package/dist/packages/data/src/social/rank.js +184 -0
- package/dist/packages/data/src/social/rss.js +113 -0
- package/dist/packages/data/src/social/summary.js +104 -0
- package/dist/packages/data/src/social/venues.js +186 -0
- package/dist/packages/data/src/sources/dexscreener.js +170 -0
- package/dist/packages/data/src/sources/geckoterminal.js +133 -0
- package/dist/packages/data/src/sources/goplus.js +161 -0
- package/dist/packages/data/src/sources/jupiter-swap.js +236 -0
- package/dist/packages/data/src/sources/jupiter.js +198 -0
- package/dist/packages/data/src/sources/pda.js +113 -0
- package/dist/packages/data/src/sources/pump-curve.js +58 -0
- package/dist/packages/data/src/sources/pumpportal.js +247 -0
- package/dist/packages/data/src/sources/rugcheck.js +71 -0
- package/dist/packages/data/src/sources/solana-rpc.js +299 -0
- package/dist/packages/data/src/sources/solana-ws.js +287 -0
- package/dist/packages/data/src/store.js +289 -0
- package/dist/packages/data/src/trade/bridge.js +464 -0
- package/dist/packages/data/src/trade/caps.js +323 -0
- package/dist/packages/data/src/trade/copy/auto.js +385 -0
- package/dist/packages/data/src/trade/copy/follows.js +103 -0
- package/dist/packages/data/src/trade/copy/index.js +9 -0
- package/dist/packages/data/src/trade/copy/mirror.js +91 -0
- package/dist/packages/data/src/trade/copy/stats.js +120 -0
- package/dist/packages/data/src/trade/copy/tracker.js +158 -0
- package/dist/packages/data/src/trade/copy/trades.js +87 -0
- package/dist/packages/data/src/trade/copy/types.js +6 -0
- package/dist/packages/data/src/trade/executor.js +933 -0
- package/dist/packages/data/src/trade/kill-switch.js +47 -0
- package/dist/packages/data/src/trade/link-store.js +52 -0
- package/dist/packages/data/src/trade/plans/confirm.js +157 -0
- package/dist/packages/data/src/trade/plans/engine.js +784 -0
- package/dist/packages/data/src/trade/plans/executor-live.js +220 -0
- package/dist/packages/data/src/trade/plans/executor-paper.js +44 -0
- package/dist/packages/data/src/trade/plans/executor.js +11 -0
- package/dist/packages/data/src/trade/plans/index.js +12 -0
- package/dist/packages/data/src/trade/plans/journal.js +77 -0
- package/dist/packages/data/src/trade/plans/mandate.js +129 -0
- package/dist/packages/data/src/trade/plans/plan.js +179 -0
- package/dist/packages/data/src/trade/plans/service.js +168 -0
- package/dist/packages/data/src/trade/plans/types.js +6 -0
- package/dist/packages/data/src/trade/rpc-exec.js +229 -0
- package/dist/packages/data/src/trade/signer/client.js +197 -0
- package/dist/packages/data/src/trade/signer/fast-wallet.js +154 -0
- package/dist/packages/data/src/trade/signer/host.js +97 -0
- package/dist/packages/data/src/trade/signer/main.js +121 -0
- package/dist/packages/data/src/trade/signer/probe-builder.js +85 -0
- package/dist/packages/data/src/trade/signer/protocol.js +92 -0
- package/dist/packages/data/src/trade/signer/service.js +400 -0
- package/dist/packages/data/src/trade/signer/sol-usd-feed.js +98 -0
- package/dist/packages/data/src/trade/sol-usd.js +86 -0
- package/dist/packages/data/src/trade/swap-build.js +108 -0
- package/dist/packages/data/src/trade/token-delta.js +201 -0
- package/dist/packages/data/src/trade/tx-decode.js +632 -0
- package/dist/packages/data/src/util.js +24 -0
- package/dist/packages/data/src/watchlist.js +176 -0
- package/dist/packages/data/src/x/api.js +256 -0
- package/dist/packages/data/src/x/budget.js +66 -0
- package/dist/packages/data/src/x/config.js +49 -0
- package/dist/packages/data/src/x/index.js +10 -0
- package/dist/packages/data/src/x/mock-server.js +217 -0
- package/dist/packages/data/src/x/oauth.js +242 -0
- package/dist/packages/data/src/x/pkce.js +21 -0
- package/dist/packages/data/src/x/source.js +285 -0
- package/dist/packages/data/src/x/token-store.js +134 -0
- package/dist/packages/data/src/x/transport.js +71 -0
- package/dist/packages/data/vendor/solana-web3/LICENSE +20 -0
- package/dist/packages/data/vendor/solana-web3/NOTICE.md +13 -0
- package/dist/packages/data/vendor/solana-web3/index.iife.min.js +20 -0
- package/dist/packages/mcp/assets/cases.json +1194 -0
- package/dist/packages/mcp/assets/kb/entries/cabal-and-coordinated-launches.md +28 -0
- package/dist/packages/mcp/assets/kb/entries/common-rug-patterns.md +40 -0
- package/dist/packages/mcp/assets/kb/entries/dbc-mechanics.md +30 -0
- package/dist/packages/mcp/assets/kb/entries/dev-wallet-behaviour.md +33 -0
- package/dist/packages/mcp/assets/kb/entries/glossary.md +35 -0
- package/dist/packages/mcp/assets/kb/entries/holder-concentration.md +30 -0
- package/dist/packages/mcp/assets/kb/entries/jito-bundles.md +29 -0
- package/dist/packages/mcp/assets/kb/entries/launchlab-curve.md +31 -0
- package/dist/packages/mcp/assets/kb/entries/lp-burn-vs-lock.md +31 -0
- package/dist/packages/mcp/assets/kb/entries/metadata-and-copycats.md +29 -0
- package/dist/packages/mcp/assets/kb/entries/mint-freeze-authority.md +31 -0
- package/dist/packages/mcp/assets/kb/entries/narrative-lifecycle.md +32 -0
- package/dist/packages/mcp/assets/kb/entries/pump-bonding-curve.md +33 -0
- package/dist/packages/mcp/assets/kb/entries/pumpswap-migration.md +29 -0
- package/dist/packages/mcp/assets/kb/entries/sniping-and-snipers.md +29 -0
- package/dist/packages/mcp/assets/kb/entries/token2022-extensions-risk.md +32 -0
- package/dist/packages/mcp/assets/kb/entries/wash-trading-fake-volume.md +33 -0
- package/dist/packages/mcp/assets/skills/rug-check.md +52 -0
- package/dist/packages/mcp/assets/skills/token-dossier.md +57 -0
- package/dist/packages/mcp/assets/skills/trench-scan.md +40 -0
- package/dist/packages/mcp/bin/dexterm-mcp.mjs +16 -0
- package/dist/packages/mcp/src/dossier.js +78 -0
- package/dist/packages/mcp/src/firewall.js +21 -0
- package/dist/packages/mcp/src/index.js +22 -0
- package/dist/packages/mcp/src/server.js +849 -0
- package/dist/packages/mcp/src/user-content.js +434 -0
- package/dist/packages/packs/src/backtest.js +183 -0
- package/dist/packages/packs/src/digest.js +95 -0
- package/dist/packages/packs/src/firewall.js +57 -0
- package/dist/packages/packs/src/index.js +19 -0
- package/dist/packages/packs/src/larp-eval.js +100 -0
- package/dist/packages/packs/src/narrative.js +309 -0
- package/dist/packages/packs/src/reason.js +135 -0
- package/dist/packages/packs/src/rug-model.js +137 -0
- package/dist/packages/packs/src/schema.js +54 -0
- package/dist/packages/packs/src/token-dossier.js +174 -0
- package/dist/packages/packs/src/verdicts.js +17 -0
- package/dist/packages/packs/src/wallet-dossier.js +105 -0
- package/dist/packages/popup/src/config.js +71 -0
- package/dist/packages/popup/src/dock.js +271 -0
- package/dist/packages/popup/src/host.js +210 -0
- package/dist/packages/popup/src/index.js +12 -0
- package/dist/packages/popup/src/loopback.js +53 -0
- package/dist/packages/popup/src/open.js +183 -0
- package/dist/packages/popup/src/pages/bubbles-lib.js +160 -0
- package/dist/packages/popup/src/pages/bubbles.css +23 -0
- package/dist/packages/popup/src/pages/bubbles.html +36 -0
- package/dist/packages/popup/src/pages/bubbles.js +214 -0
- package/dist/packages/popup/src/pages/chart-lib.js +262 -0
- package/dist/packages/popup/src/pages/chart.css +50 -0
- package/dist/packages/popup/src/pages/chart.html +56 -0
- package/dist/packages/popup/src/pages/chart.js +554 -0
- package/dist/packages/popup/src/pages/common.css +34 -0
- package/dist/packages/popup/src/pages/common.js +187 -0
- package/dist/packages/popup/src/pages/feeds.html +20 -0
- package/dist/packages/popup/src/pages/feeds.js +77 -0
- package/dist/packages/popup/src/pages/narrative.html +20 -0
- package/dist/packages/popup/src/pages/narrative.js +61 -0
- package/dist/packages/popup/src/pages/plans.css +30 -0
- package/dist/packages/popup/src/pages/plans.html +26 -0
- package/dist/packages/popup/src/pages/plans.js +82 -0
- package/dist/packages/popup/src/pages/roster.css +41 -0
- package/dist/packages/popup/src/pages/roster.html +25 -0
- package/dist/packages/popup/src/pages/roster.js +75 -0
- package/dist/packages/popup/src/pages/token.html +20 -0
- package/dist/packages/popup/src/pages/token.js +112 -0
- package/dist/packages/popup/src/pages/widget-sdk.js +224 -0
- package/dist/packages/popup/src/pages/widget.css +5 -0
- package/dist/packages/popup/src/pages/widget.html +21 -0
- package/dist/packages/popup/src/pages/widget.js +85 -0
- package/dist/packages/popup/src/protocol.js +31 -0
- package/dist/packages/popup/src/selftest.js +156 -0
- package/dist/packages/popup/src/server.js +582 -0
- package/dist/packages/popup/src/sinkproxy.js +167 -0
- package/dist/packages/popup/src/widget-html.js +231 -0
- package/dist/packages/popup/vendor/lightweight-charts/LICENSE +201 -0
- package/dist/packages/popup/vendor/lightweight-charts/NOTICE +2 -0
- package/dist/packages/popup/vendor/lightweight-charts/README.md +30 -0
- package/dist/packages/popup/vendor/lightweight-charts/VERSION +1 -0
- package/dist/packages/popup/vendor/lightweight-charts/lightweight-charts.standalone.production.js +7 -0
- package/dist/packages/recorder/bin/dexterm-recorder.mjs +11 -0
- package/dist/packages/recorder/src/cli.js +113 -0
- package/dist/packages/recorder/src/export.js +71 -0
- package/dist/packages/recorder/src/index.js +20 -0
- package/dist/packages/recorder/src/labels.js +151 -0
- package/dist/packages/recorder/src/open.js +29 -0
- package/dist/packages/recorder/src/recorder.js +553 -0
- package/dist/packages/recorder/src/schedule.js +43 -0
- package/dist/packages/recorder/src/schema.js +135 -0
- package/dist/packages/recorder/src/snapshot.js +191 -0
- package/dist/packages/recorder/src/sweep.js +52 -0
- package/dist/packages/recorder/src/verdicts.js +52 -0
- package/dist/packages/tui/src/bubbles.js +415 -0
- package/dist/packages/tui/src/canvas.js +370 -0
- package/dist/packages/tui/src/chrome.js +85 -0
- package/dist/packages/tui/src/color.js +133 -0
- package/dist/packages/tui/src/flush.js +62 -0
- package/dist/packages/tui/src/fmt.js +188 -0
- package/dist/packages/tui/src/fx-trade.js +278 -0
- package/dist/packages/tui/src/fx.js +527 -0
- package/dist/packages/tui/src/images/blocks.js +141 -0
- package/dist/packages/tui/src/images/coin.js +22 -0
- package/dist/packages/tui/src/images/detect.js +140 -0
- package/dist/packages/tui/src/images/index.js +7 -0
- package/dist/packages/tui/src/images/layer.js +146 -0
- package/dist/packages/tui/src/images/pixels.js +157 -0
- package/dist/packages/tui/src/images/protocols.js +87 -0
- package/dist/packages/tui/src/index.js +15 -0
- package/dist/packages/tui/src/keymap.js +355 -0
- package/dist/packages/tui/src/layout.js +11 -0
- package/dist/packages/tui/src/sound.js +177 -0
- package/dist/packages/tui/src/theme.js +182 -0
- package/dist/packages/tui/src/widgets.js +598 -0
- package/dist/packages/voice/src/controller.js +395 -0
- package/dist/packages/voice/src/doctor.js +63 -0
- package/dist/packages/voice/src/engines.js +44 -0
- package/dist/packages/voice/src/index.js +16 -0
- package/dist/packages/voice/src/router.js +502 -0
- package/dist/packages/voice/src/stt/apple-helper.swift.js +103 -0
- package/dist/packages/voice/src/stt/apple.js +179 -0
- package/dist/packages/voice/src/stt/fake.js +34 -0
- package/dist/packages/voice/src/stt/whisper.js +102 -0
- package/dist/packages/voice/src/summary.js +44 -0
- package/dist/packages/voice/src/tts/fake.js +30 -0
- package/dist/packages/voice/src/tts/say.js +96 -0
- package/dist/packages/voice/src/types.js +3 -0
- package/package.json +42 -4
- package/README.md +0 -3
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
// dexterm — live NEW PAIRS screen (task-1298): the layout of screens/newpairs.ts over NewPairRows.
|
|
2
|
+
// The table caption names the push source and its rate, the sub-tabs count real rows, forensics
|
|
3
|
+
// columns the keyless sources cannot answer dash out and the spotlight says what is missing and why.
|
|
4
|
+
import { Canvas, table, sparkline, sparkArea, launchpadBadge, bar, badge, statGrid, ratioBar, heatPct, fmtUsd, fmtPrice, fmtAge, fmtNum, fmtPct, shortAddr, header, footer, breakpoint, mix, } from '../../../../tui/src/index.js';
|
|
5
|
+
import { headerModel } from "../../state.js";
|
|
6
|
+
import { PUMP_GRADUATION_USD } from "../newpairs.js";
|
|
7
|
+
import { drawCoin, imagesOn } from "../../screens/coin.js";
|
|
8
|
+
import { COIN_ICON_W } from '../../../../tui/src/index.js';
|
|
9
|
+
import { launchIntelCells } from "../intel.js";
|
|
10
|
+
import { priceCell, priceModeOf, fallbackCount, fallbackCaption, FALLBACK_MARK, MCAP_FALLBACK_NOTE } from "../../display.js";
|
|
11
|
+
export function renderNewPairsLive(c, state, live) {
|
|
12
|
+
const t = c.theme;
|
|
13
|
+
const bp = breakpoint(c.w);
|
|
14
|
+
header(c, headerModel(state));
|
|
15
|
+
const now = state.now.getTime();
|
|
16
|
+
const top = 2, bottom = c.h - 1;
|
|
17
|
+
const sideW = bp === 'wide' ? 46 : 0;
|
|
18
|
+
const tableW = c.w - sideW - (sideW ? 1 : 0);
|
|
19
|
+
const rows = live.list();
|
|
20
|
+
const sel = Math.min(Math.max(0, state.selected || 0), Math.max(0, rows.length - 1));
|
|
21
|
+
const st = live.status();
|
|
22
|
+
const dash = (cv, x, y, w, bg, align = 'right') => {
|
|
23
|
+
if (align === 'right')
|
|
24
|
+
cv.textR(x, y, w, '—', { fg: t.dim, bg });
|
|
25
|
+
else
|
|
26
|
+
cv.text(x, y, '—', { fg: t.dim, bg });
|
|
27
|
+
};
|
|
28
|
+
const intel = state.live?.intel;
|
|
29
|
+
const intelCell = (cv, x, y, w, cell, bg) => {
|
|
30
|
+
cv.textR(x, y, w, cell.short, { fg: cell.level === 'bad' ? t.down : cell.level === 'warn' ? t.warn : cell.level === 'ok' ? t.muted : t.dim, bg });
|
|
31
|
+
};
|
|
32
|
+
// sub-tabs (real counts)
|
|
33
|
+
const fy = top;
|
|
34
|
+
let x = 1;
|
|
35
|
+
const graduating = rows.filter((r) => r.bonding !== null && r.bonding >= 80 && !r.migrated).length;
|
|
36
|
+
const migrated = rows.filter((r) => r.migrated).length;
|
|
37
|
+
const tabs = [['New', rows.length], ['Graduating', graduating], ['Migrated', migrated]];
|
|
38
|
+
for (const [lab, n] of tabs) {
|
|
39
|
+
const active = lab === 'New';
|
|
40
|
+
x = c.text(x, fy, ` ${lab} `, active ? { fg: t.text, bg: t.tabActiveBg, b: true } : { fg: t.muted, bg: t.bg });
|
|
41
|
+
x = c.text(x, fy, `${n} `, { fg: active ? t.accent : t.dim, bg: active ? t.tabActiveBg : t.bg }) + 1;
|
|
42
|
+
}
|
|
43
|
+
const lat = st.latency.p50 !== null ? `event→row p50 ${Math.round(st.latency.p50)}ms` : '';
|
|
44
|
+
const rlat = st.renderLatency.p50 !== null ? ` · →screen p50 ${Math.round(st.renderLatency.p50)}ms` : '';
|
|
45
|
+
const note = state.live?.notice ?? '';
|
|
46
|
+
c.text(x + 2, fy, note || `${lat}${rlat}` || 'waiting for the first create…', { fg: note ? t.warn : t.dim, bg: t.bg, i: true }, tableW - x - 4);
|
|
47
|
+
const mode = priceModeOf(state); // task-1366
|
|
48
|
+
const fb = mode === 'mcap' ? fallbackCaption(fallbackCount(rows, (r) => r)) : null;
|
|
49
|
+
const box = c.box(0, top + 1, tableW, bottom - top - 1, { title: 'NEW PAIRS', caption: fb ? `${st.caption} · ${fb}` : st.caption, captionFg: st.headerStatus ? t.warn : undefined });
|
|
50
|
+
const cols = [
|
|
51
|
+
{ key: 'age', label: 'AGE', w: 5, align: 'right', prio: 0, render: (cv, x, y, w, r, bg) => { const m = Math.max(0, (now - r.createdAt) / 60000); cv.textR(x, y, w, fmtAge(m), { fg: m < 2 ? t.accent : t.muted, bg, b: m < 2 }); } },
|
|
52
|
+
// task-1326: the coin image once a poll has seen the mint (a fresh create has none yet → the ticker placeholder).
|
|
53
|
+
...(imagesOn(state) && bp !== 'compact' ? [{ key: 'img', label: '', w: COIN_ICON_W, prio: 2, render: (cv, x, y, w, r, bg) => { drawCoin(cv, state, { x, y, w, h: 1, url: r.image, symbol: r.symbol, bg, prio: 1, mode: 'quad' }); } }] : []),
|
|
54
|
+
{ key: 'token', label: 'TOKEN', w: bp === 'compact' ? 12 : 20, prio: 0, flex: bp !== 'compact', render: (cv, x, y, w, r, bg) => {
|
|
55
|
+
const cx = cv.text(x, y, r.symbol, { fg: t.text, bg, b: true }, Math.min(10, w));
|
|
56
|
+
if (w > 14)
|
|
57
|
+
cv.text(cx + 1, y, r.name, { fg: t.muted, bg }, w - (cx - x) - 1);
|
|
58
|
+
} },
|
|
59
|
+
{ key: 'lp', label: 'LAUNCH', w: 6, prio: 1, render: (cv, x, y, w, r, bg) => { if (r.launchpad === 'unknown')
|
|
60
|
+
dash(cv, x, y, w, bg, 'left');
|
|
61
|
+
else
|
|
62
|
+
launchpadBadge(cv, x, y, r.launchpad, { on: bg }); } },
|
|
63
|
+
{ key: 'bond', label: 'BONDING', w: 14, prio: 1, render: (cv, x, y, w, r, bg) => {
|
|
64
|
+
if (r.migrated) {
|
|
65
|
+
cv.text(x, y, 'migrated', { fg: t.dim, bg });
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (r.bonding === null) {
|
|
69
|
+
dash(cv, x, y, w, bg, 'left');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
bar(cv, x, y, w - 5, r.bonding, { bg, color: r.bonding > 80 ? t.warn : t.pump });
|
|
73
|
+
cv.textR(x + w - 4, y, 4, `${Math.round(r.bonding)}%`, { fg: r.bonding > 80 ? t.warn : t.muted, bg });
|
|
74
|
+
} },
|
|
75
|
+
{ key: 'mcap', label: 'MCAP', w: 8, align: 'right', prio: 0, render: (cv, x, y, w, r, bg) => {
|
|
76
|
+
// task-1366: in mcap mode a launch without a supply shows its price here, marked ᵖ in amber
|
|
77
|
+
if (r.mcap === null && mode === 'mcap' && r.price !== null) {
|
|
78
|
+
cv.textR(x, y, w, fmtPrice(r.price) + FALLBACK_MARK, { fg: t.warn, bg });
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (r.mcap === null)
|
|
82
|
+
dash(cv, x, y, w, bg);
|
|
83
|
+
else
|
|
84
|
+
cv.textR(x, y, w, fmtUsd(r.mcap, { digits: 1 }), { fg: t.text, bg });
|
|
85
|
+
} },
|
|
86
|
+
{ key: 'liq', label: 'LIQ', w: 7, align: 'right', prio: 2, render: (cv, x, y, w, r, bg) => { if (r.liq === null)
|
|
87
|
+
dash(cv, x, y, w, bg);
|
|
88
|
+
else
|
|
89
|
+
cv.textR(x, y, w, fmtUsd(r.liq, { digits: 1 }), { fg: t.text, bg }); } },
|
|
90
|
+
{ key: 'm5', label: '5M', w: 7, align: 'right', prio: 0, render: (cv, x, y, w, r, bg) => heatPct(cv, x, y, w, r.chg.m5, bg) },
|
|
91
|
+
{ key: 'h1', label: '1H', w: 7, align: 'right', prio: 3, render: (cv, x, y, w, r, bg) => heatPct(cv, x, y, w, r.chg.h1, bg) },
|
|
92
|
+
{ key: 'holders', label: 'HLD', w: 5, align: 'right', prio: 2, render: (cv, x, y, w, r, bg) => { if (r.holders === null)
|
|
93
|
+
dash(cv, x, y, w, bg);
|
|
94
|
+
else
|
|
95
|
+
cv.textR(x, y, w, fmtNum(r.holders), { fg: t.text, bg }); } },
|
|
96
|
+
{ key: 'bs', label: 'B/S 5M', w: 8, prio: 4, render: (cv, x, y, w, r, bg) => { if (r.buys === null || r.sells === null)
|
|
97
|
+
dash(cv, x, y, w, bg, 'left');
|
|
98
|
+
else
|
|
99
|
+
ratioBar(cv, x, y, w, Math.max(0, r.buys), Math.max(0, r.sells), { bg }); } },
|
|
100
|
+
{ key: 'dev', label: 'DEV', w: 5, align: 'right', prio: 3, render: (cv, x, y, w, r, bg) => { if (r.dev === null)
|
|
101
|
+
dash(cv, x, y, w, bg);
|
|
102
|
+
else
|
|
103
|
+
cv.textR(x, y, w, `${r.dev.toFixed(1)}%`, { fg: r.dev > 5 ? t.down : t.muted, bg }); } },
|
|
104
|
+
// task-1359: SNIPE / BUNDLE come from the wallet-intel scan of that mint (the selected row is scanned after a
|
|
105
|
+
// short dwell when a free Helius key is set); an unscanned row keeps the dash, a scan in flight shows `…`.
|
|
106
|
+
{ key: 'snipe', label: 'SNIPE', w: 5, align: 'right', prio: 4, render: (cv, x, y, w, r, bg) => intelCell(cv, x, y, w, launchIntelCells(intel, r.mint).snipers, bg) },
|
|
107
|
+
{ key: 'bund', label: 'BUNDLE', w: 6, align: 'right', prio: 4, render: (cv, x, y, w, r, bg) => intelCell(cv, x, y, w, launchIntelCells(intel, r.mint).bundle, bg) },
|
|
108
|
+
{ key: 'spark', label: 'TREND', w: 12, prio: 2, render: (cv, x, y, w, r, bg) => { if (r.spark)
|
|
109
|
+
sparkline(cv, x, y, w, r.spark, { bg });
|
|
110
|
+
else
|
|
111
|
+
dash(cv, x, y, w, bg, 'left'); } },
|
|
112
|
+
{ key: 'flags', label: 'RISK', w: 13, prio: 5, render: (cv, x, y, w, r, bg) => {
|
|
113
|
+
let cx = x;
|
|
114
|
+
for (const f of r.flags.slice(0, 2)) {
|
|
115
|
+
if (cx + f.length + 2 > x + w)
|
|
116
|
+
break;
|
|
117
|
+
cx = badge(cv, cx, y, f, f === 'MINT' || f === 'FREEZE' ? t.down : t.warn, { on: bg }) + 1;
|
|
118
|
+
}
|
|
119
|
+
if (!r.flags.length) {
|
|
120
|
+
if (r.mintAuth === null && r.freezeAuth === null)
|
|
121
|
+
cv.text(x, y, '—', { fg: t.dim, bg });
|
|
122
|
+
else
|
|
123
|
+
cv.text(x, y, '✓ clean', { fg: mix(bg, t.up, 0.7), bg });
|
|
124
|
+
}
|
|
125
|
+
} },
|
|
126
|
+
];
|
|
127
|
+
if (rows.length)
|
|
128
|
+
table(c, box.x + 1, box.y, box.w - 2, box.h, { columns: cols, rows, selected: sel, scroll: 0, bg: box.bg });
|
|
129
|
+
else {
|
|
130
|
+
const s = st.stream;
|
|
131
|
+
const msg = st.mode === 'off' ? 'push feed off · r to poll jup recent' : s?.state === 'open' ? `connected to pumpportal · waiting for the first create (≈15/min measured)` : `pumpportal ${s?.state ?? 'connecting'}${s?.lastError ? ` · ${s.lastError}` : ''} · polling jup recent`;
|
|
132
|
+
c.textC(box.x, box.y + Math.min(4, Math.floor(box.h / 2)), box.w, msg, { fg: t.muted, bg: box.bg, i: true });
|
|
133
|
+
}
|
|
134
|
+
if (sideW && rows[sel])
|
|
135
|
+
pairSpotlight(c, c.w - sideW, top, sideW, bottom - top, rows[sel], now, state);
|
|
136
|
+
const watched = rows[sel] && state.live?.watch?.has(rows[sel].mint) ? 'unwatch' : 'watch';
|
|
137
|
+
footer(c, [['j/k', 'move'], ['⏎', 'open'], ['p', 'pause feed'], ['w', watched], ['b', 'alert'], ['r', 'refresh'], ['q', 'quit']], state.theme.name);
|
|
138
|
+
}
|
|
139
|
+
function pairSpotlight(c, x, y, w, h, r, now, state) {
|
|
140
|
+
const t = c.theme;
|
|
141
|
+
const ageMin = Math.max(0, (now - r.createdAt) / 60000);
|
|
142
|
+
const box = c.box(x, y, w, h, { title: `$${r.symbol}`, caption: `${fmtAge(ageMin)} old · ${shortAddr(r.mint, 4)}`, focus: true });
|
|
143
|
+
const bg = box.bg;
|
|
144
|
+
let cy = box.y;
|
|
145
|
+
c.text(box.x + 1, cy, r.name, { fg: t.muted, bg }, box.w - 10);
|
|
146
|
+
if (r.launchpad !== 'unknown')
|
|
147
|
+
launchpadBadge(c, box.x + box.w - 8, cy, r.launchpad, { on: bg });
|
|
148
|
+
cy += 1;
|
|
149
|
+
// task-1366: the headline follows the price mode (mcap, then the price beside it; a price + note without a supply)
|
|
150
|
+
const head = priceCell(priceModeOf(state), r.price, r.mcap);
|
|
151
|
+
let cx = c.text(box.x + 1, cy, head.text, { fg: head.text === '—' ? t.dim : head.fallback ? t.warn : t.text, bg, b: true });
|
|
152
|
+
if (head.kind === 'mcap' && r.price !== null)
|
|
153
|
+
cx = c.text(cx + 1, cy, `(${fmtPrice(r.price)})`, { fg: t.dim, bg });
|
|
154
|
+
c.text(cx + 1, cy, r.chg.h1 === null ? '' : fmtPct(r.chg.h1), { fg: (r.chg.h1 ?? 0) >= 0 ? t.up : t.down, bg });
|
|
155
|
+
if (head.fallback)
|
|
156
|
+
c.text(box.x + 1, cy + 1, MCAP_FALLBACK_NOTE, { fg: t.warn, bg, i: true }, box.w - 8);
|
|
157
|
+
// Fast lane (task-1312): honest feed badge — LIVE when this launch arrived via the PumpPortal push,
|
|
158
|
+
// POLL when it came from the Jupiter-recent poll (the fallback when the socket is down).
|
|
159
|
+
const pushed = r.latencyMs !== null;
|
|
160
|
+
badge(c, box.x + box.w - 6, cy, pushed ? 'LIVE' : 'POLL', pushed ? t.up : t.dim, { on: bg });
|
|
161
|
+
cy += 2;
|
|
162
|
+
if (r.migrated) {
|
|
163
|
+
c.text(box.x + 1, cy, 'MIGRATED', { fg: t.dim, bg });
|
|
164
|
+
c.textR(box.x + 1, cy, box.w - 2, 'bonding complete → PumpSwap', { fg: t.muted, bg });
|
|
165
|
+
cy += 2;
|
|
166
|
+
}
|
|
167
|
+
else if (r.bonding !== null) {
|
|
168
|
+
c.text(box.x + 1, cy, 'BONDING CURVE', { fg: t.dim, bg });
|
|
169
|
+
c.textR(box.x + 1, cy, box.w - 2, `${Math.round(r.bonding)}% → PumpSwap at ${fmtUsd(PUMP_GRADUATION_USD, { digits: 0 })}`, { fg: t.muted, bg });
|
|
170
|
+
cy += 1;
|
|
171
|
+
bar(c, box.x + 1, cy, box.w - 2, r.bonding, { bg, color: r.bonding > 80 ? t.warn : t.pump });
|
|
172
|
+
cy += 1;
|
|
173
|
+
c.text(box.x + 1, cy, 'est. from curve reserves at create (pumpportal)', { fg: t.dim, bg, i: true }, box.w - 2);
|
|
174
|
+
cy += 1;
|
|
175
|
+
}
|
|
176
|
+
if (r.spark)
|
|
177
|
+
sparkArea(c, box.x + 1, cy, box.w - 2, 3, r.spark, { bg });
|
|
178
|
+
else
|
|
179
|
+
c.text(box.x + 1, cy + 1, 'no price history yet', { fg: t.dim, bg, i: true });
|
|
180
|
+
cy += 4;
|
|
181
|
+
const d = (n, f) => (n === null ? '—' : f(n));
|
|
182
|
+
cy += statGrid(c, box.x + 1, cy, box.w - 2, [
|
|
183
|
+
{ label: 'mcap', value: d(r.mcap, (n) => fmtUsd(n, { digits: 1 })), sub: r.marketCapSol !== null ? `${r.marketCapSol.toFixed(1)} SOL at create` : undefined },
|
|
184
|
+
{ label: 'liquidity', value: d(r.liq, (n) => fmtUsd(n, { digits: 1 })) },
|
|
185
|
+
{ label: 'holders', value: d(r.holders, fmtNum) },
|
|
186
|
+
{ label: 'vol 24h', value: d(r.vol, (n) => fmtUsd(n, { digits: 1 })) },
|
|
187
|
+
], { bg, cols: 2 });
|
|
188
|
+
cy += 1;
|
|
189
|
+
c.text(box.x + 1, cy, 'LAUNCH FORENSICS', { fg: t.dim, bg });
|
|
190
|
+
c.textR(box.x + 1, cy, box.w - 2, `via ${r.via.map((s) => (s === 'jupiter-tokens' ? 'jup' : s)).join(' · ') || '—'}`, { fg: t.dim, bg });
|
|
191
|
+
cy += 1;
|
|
192
|
+
const auth = r.mintAuth === null && r.freezeAuth === null ? null : !!(r.mintAuth || r.freezeAuth);
|
|
193
|
+
const cells = launchIntelCells(state.live?.intel, r.mint, 'scans after ~2 s on this row');
|
|
194
|
+
const rows = [
|
|
195
|
+
['Dev wallet', r.dev === null ? (r.creator ? `creator ${shortAddr(r.creator, 4)} · share unknown` : '— (jup not yet indexed)') : `${r.dev.toFixed(1)}%${r.creator ? ` · ${shortAddr(r.creator, 4)}` : ''}`, r.dev === null ? 'na' : r.dev > 5 ? 'warn' : 'ok'],
|
|
196
|
+
['Initial buy', r.initialBuySol === null ? '—' : `${r.initialBuySol.toFixed(2)} SOL by creator`, r.initialBuySol === null ? 'na' : r.initialBuySol > 2 ? 'warn' : 'ok'],
|
|
197
|
+
['Bundled at launch', cells.bundle.text, cells.bundle.level],
|
|
198
|
+
['Snipers (first 3 slots)', cells.snipers.text, cells.snipers.level],
|
|
199
|
+
['Mint / freeze', auth === null ? '— (rugcheck/jup pending)' : auth ? 'ENABLED' : 'revoked', auth === null ? 'na' : auth ? 'bad' : 'ok'],
|
|
200
|
+
['Socials', `${[r.socials.x && 'X', r.socials.tg && 'TG', r.socials.web && 'web'].filter(Boolean).join(' ') || (r.via.includes('jupiter-tokens') ? 'none' : '—')}`, r.socials.x || r.socials.tg || r.socials.web ? 'ok' : r.via.includes('jupiter-tokens') ? 'warn' : 'na'],
|
|
201
|
+
];
|
|
202
|
+
for (const [label, val, lvl] of rows) {
|
|
203
|
+
if (cy >= box.y + box.h - 5)
|
|
204
|
+
break;
|
|
205
|
+
const color = lvl === 'ok' ? t.up : lvl === 'warn' ? t.warn : lvl === 'bad' ? t.down : t.dim;
|
|
206
|
+
c.text(box.x + 1, cy, lvl === 'ok' ? '●' : lvl === 'warn' ? '◐' : lvl === 'bad' ? '○' : '·', { fg: color, bg });
|
|
207
|
+
c.text(box.x + 3, cy, label, { fg: t.muted, bg });
|
|
208
|
+
cy += 1;
|
|
209
|
+
c.text(box.x + 3, cy, val, { fg: lvl === 'ok' ? t.text : lvl === 'na' ? t.dim : color, bg, i: lvl === 'na' }, box.w - 4);
|
|
210
|
+
cy += 1;
|
|
211
|
+
}
|
|
212
|
+
const ay = box.y + box.h - 3;
|
|
213
|
+
c.hline(box.x, ay - 1, box.w, { fg: t.border, bg });
|
|
214
|
+
c.text(box.x + 1, ay, '✦ claude', { fg: t.ai, bg, b: true });
|
|
215
|
+
c.text(box.x + 10, ay, '◌ demo data · not wired yet', { fg: t.warn, bg, i: true }, box.w - 11);
|
|
216
|
+
const lat = r.latencyMs === null ? 'polled (jup recent)' : `pushed · event→row ${Math.round(r.latencyMs)}ms${r.drawnAt !== null && r.receivedAt !== null ? ` · →screen ${Math.round(r.drawnAt - r.receivedAt)}ms` : ''}`;
|
|
217
|
+
c.text(box.x + 1, ay + 1, lat, { fg: t.dim, bg }, box.w - 2);
|
|
218
|
+
void state;
|
|
219
|
+
}
|