dexterm-cli 0.0.0-stage → 0.1.2
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 +394 -0
- package/dist/packages/agents/src/executor.js +202 -0
- package/dist/packages/agents/src/gate.js +179 -0
- package/dist/packages/agents/src/identity.js +218 -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 +119 -0
- package/dist/packages/agents/src/tools.js +72 -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 +75 -0
- package/dist/packages/cli/assets/claude/plugin/skills/rug-check/SKILL.md +74 -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 +336 -0
- package/dist/packages/cli/src/agent-roster.js +26 -0
- package/dist/packages/cli/src/alerts/adapters/desktop.js +40 -0
- package/dist/packages/cli/src/alerts/adapters/discord.js +36 -0
- package/dist/packages/cli/src/alerts/adapters/telegram.js +43 -0
- package/dist/packages/cli/src/alerts/adapters/toast.js +16 -0
- package/dist/packages/cli/src/alerts/creds.js +83 -0
- package/dist/packages/cli/src/alerts/format.js +41 -0
- package/dist/packages/cli/src/alerts/index.js +10 -0
- package/dist/packages/cli/src/alerts/notifier.js +53 -0
- package/dist/packages/cli/src/alerts/route.js +19 -0
- package/dist/packages/cli/src/alerts/types.js +1 -0
- package/dist/packages/cli/src/alerts-cmd.js +212 -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 +208 -0
- package/dist/packages/cli/src/boot-state.js +62 -0
- package/dist/packages/cli/src/coin-target.js +2 -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 +375 -0
- package/dist/packages/cli/src/export.js +235 -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 +511 -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 +5785 -0
- package/dist/packages/cli/src/mcp-cmd.js +326 -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 +358 -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/skill-eval-build.js +109 -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/update.js +294 -0
- package/dist/packages/cli/src/version.js +3 -0
- package/dist/packages/cli/src/voice-cmd.js +119 -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/watch-cmd.js +190 -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 +538 -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/coin-target.js +82 -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 +211 -0
- package/dist/packages/data/src/intel/helius-history.js +70 -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/link-baseline.js +196 -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 +184 -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 +252 -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 +936 -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 +20 -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/skill-backtest.js +300 -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 +18 -0
- package/dist/packages/tui/src/keymap.js +357 -0
- package/dist/packages/tui/src/layout.js +11 -0
- package/dist/packages/tui/src/raster-font.js +195 -0
- package/dist/packages/tui/src/raster.js +213 -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 +407 -0
- package/dist/packages/voice/src/doctor.js +131 -0
- package/dist/packages/voice/src/download.js +184 -0
- package/dist/packages/voice/src/engines.js +84 -0
- package/dist/packages/voice/src/index.js +20 -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 +112 -0
- package/dist/packages/voice/src/summary.js +44 -0
- package/dist/packages/voice/src/tts/espeak.js +131 -0
- package/dist/packages/voice/src/tts/fake.js +30 -0
- package/dist/packages/voice/src/tts/piper.js +206 -0
- package/dist/packages/voice/src/tts/say.js +132 -0
- package/dist/packages/voice/src/tts/voices.js +206 -0
- package/dist/packages/voice/src/types.js +3 -0
- package/package.json +38 -4
- package/README.md +0 -3
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
// Store: per-mint cached enrichment (DexScreener pair + Jupiter token/stats/audit
|
|
2
|
+
// + optional Jupiter price) and preset discovery feeds. Sources are fetched in
|
|
3
|
+
// parallel; a failed or degraded source degrades rows instead of failing them,
|
|
4
|
+
// and stale cache entries are served (flagged) when a refresh fails.
|
|
5
|
+
import { TTL } from "./cache.js";
|
|
6
|
+
/** Max ratio between DexScreener and Jupiter market caps for them to count as agreeing. */
|
|
7
|
+
export const MCAP_AGREE_RATIO = 5;
|
|
8
|
+
/**
|
|
9
|
+
* MCAP rule (D-02 open decision, resolved in D-06): DexScreener's pair `marketCap`
|
|
10
|
+
* (or `fdv` when absent) can reflect only the Solana-side supply of bridged/wrapped
|
|
11
|
+
* tokens. Take the larger of DexScreener and Jupiter `mcap` when they agree within
|
|
12
|
+
* 5x; otherwise keep DexScreener's number and flag the row. One side only: use it.
|
|
13
|
+
*/
|
|
14
|
+
export function resolveMcap(ds, jupMcap) {
|
|
15
|
+
const d = ds ? (ds.mcap ?? ds.fdv) : null;
|
|
16
|
+
const j = jupMcap ?? null;
|
|
17
|
+
const pos = (n) => n !== null && Number.isFinite(n) && n > 0;
|
|
18
|
+
if (pos(d) && pos(j)) {
|
|
19
|
+
const ratio = Math.max(d, j) / Math.min(d, j);
|
|
20
|
+
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 };
|
|
22
|
+
}
|
|
23
|
+
return { value: d, basis: 'dexscreener', flagged: true, dexscreener: d, jupiter: j };
|
|
24
|
+
}
|
|
25
|
+
if (pos(d))
|
|
26
|
+
return { value: d, basis: 'dexscreener', flagged: false, dexscreener: d, jupiter: j };
|
|
27
|
+
if (pos(j))
|
|
28
|
+
return { value: j, basis: 'jupiter', flagged: false, dexscreener: d, jupiter: j };
|
|
29
|
+
return { value: null, basis: null, flagged: false, dexscreener: d, jupiter: j };
|
|
30
|
+
}
|
|
31
|
+
const NS = { ds: 'ds:token', jup: 'jup:token', price: 'jup:price', list: 'list' };
|
|
32
|
+
export class Store {
|
|
33
|
+
cache;
|
|
34
|
+
ds;
|
|
35
|
+
jup;
|
|
36
|
+
/** Observation hook (task-1329); null = nobody listening. */
|
|
37
|
+
listener = null;
|
|
38
|
+
constructor(deps) {
|
|
39
|
+
this.cache = deps.cache;
|
|
40
|
+
this.ds = deps.dexscreener;
|
|
41
|
+
this.jup = deps.jupiter;
|
|
42
|
+
}
|
|
43
|
+
emitEnrich(rows, fetched) {
|
|
44
|
+
const l = this.listener;
|
|
45
|
+
if (!l?.onEnrich || rows.length === 0)
|
|
46
|
+
return;
|
|
47
|
+
try {
|
|
48
|
+
l.onEnrich({ rows, t: Date.now(), fetched });
|
|
49
|
+
}
|
|
50
|
+
catch { /* a listener never breaks a refresh */ }
|
|
51
|
+
}
|
|
52
|
+
emitDiscover(ev) {
|
|
53
|
+
const l = this.listener;
|
|
54
|
+
if (!l?.onDiscover)
|
|
55
|
+
return;
|
|
56
|
+
try {
|
|
57
|
+
l.onDiscover(ev);
|
|
58
|
+
}
|
|
59
|
+
catch { /* a listener never breaks a refresh */ }
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* `jup: 'cache'` (task-1323) serves the Jupiter token records from the cache only (fresh or stale) and
|
|
63
|
+
* never queues a Jupiter search: the first screener paint must not wait behind the keyless Jupiter
|
|
64
|
+
* bucket (one call per ~2.9 s, 429-prone). Jupiter list calls seed exactly those records, so rows from
|
|
65
|
+
* a Jupiter list stay fully enriched; others paint DexScreener-only and fill in on the next pass.
|
|
66
|
+
*/
|
|
67
|
+
async enrich(mints, opts = {}) {
|
|
68
|
+
const unique = [...new Set(mints)];
|
|
69
|
+
const jupCacheOnly = opts.jup === 'cache';
|
|
70
|
+
const [ds, jup, price] = await Promise.all([
|
|
71
|
+
this.lookup(NS.ds, unique, TTL.pairs, 'dexscreener', (m) => this.ds.tokens(m)),
|
|
72
|
+
jupCacheOnly ? Promise.resolve(this.cached(NS.jup, unique)) : this.lookup(NS.jup, unique, TTL.enrichment, 'jupiter-tokens', async (m) => {
|
|
73
|
+
const views = await this.jup.search(m);
|
|
74
|
+
return new Map(views.map((v) => [v.token.mint, v]));
|
|
75
|
+
}),
|
|
76
|
+
opts.price
|
|
77
|
+
? this.lookup(NS.price, unique, TTL.price, 'jupiter-price', (m) => this.jup.price(m))
|
|
78
|
+
: Promise.resolve({ values: new Map(), stale: new Set() }),
|
|
79
|
+
]);
|
|
80
|
+
const rows = [];
|
|
81
|
+
const missing = [];
|
|
82
|
+
for (const mint of unique) {
|
|
83
|
+
const d = ds.values.get(mint);
|
|
84
|
+
const j = jup.values.get(mint);
|
|
85
|
+
const p = price.values.get(mint);
|
|
86
|
+
const pair = d?.pair ?? j?.pair;
|
|
87
|
+
if (!pair || (!d && !j)) {
|
|
88
|
+
missing.push(mint);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const sources = [];
|
|
92
|
+
if (d)
|
|
93
|
+
sources.push('dexscreener');
|
|
94
|
+
if (j)
|
|
95
|
+
sources.push('jupiter-tokens');
|
|
96
|
+
if (p)
|
|
97
|
+
sources.push('jupiter-price');
|
|
98
|
+
rows.push({
|
|
99
|
+
mint,
|
|
100
|
+
token: mergeToken(d?.token, j?.token),
|
|
101
|
+
pair,
|
|
102
|
+
stats: j?.stats,
|
|
103
|
+
audit: j?.audit,
|
|
104
|
+
price: p,
|
|
105
|
+
sources,
|
|
106
|
+
stale: ds.stale.has(mint) || jup.stale.has(mint) || price.stale.has(mint),
|
|
107
|
+
mcap: resolveMcap(d?.pair, j?.pair.mcap),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
const latencyMs = {};
|
|
111
|
+
const errors = {};
|
|
112
|
+
const per = [['dexscreener', ds], ['jupiter-tokens', jup], ['jupiter-price', price]];
|
|
113
|
+
for (const [s, l] of per) {
|
|
114
|
+
if (l.latencyMs !== undefined)
|
|
115
|
+
latencyMs[s] = l.latencyMs;
|
|
116
|
+
if (l.error)
|
|
117
|
+
errors[s] = l.error;
|
|
118
|
+
}
|
|
119
|
+
this.emitEnrich(rows, Object.keys(latencyMs).length > 0);
|
|
120
|
+
return { rows, missing, latencyMs, errors };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Mints for a preset feed (SPEC §4.2). Two sizes:
|
|
124
|
+
* - default (`opts.max` unset): the compact feed (one or two lists), capped at `limit` — the
|
|
125
|
+
* historical behaviour the MCP tool and the recording scripts rely on.
|
|
126
|
+
* - pool mode (`opts.max` set, task-1303): a much wider candidate net — Jupiter
|
|
127
|
+
* toptrending/toporganicscore/toptraded across 5m/1h/24h (up to `limit` each, keyless pacing)
|
|
128
|
+
* plus DexScreener boosts (top + latest) and the latest token profiles — de-duplicated by mint
|
|
129
|
+
* and capped at `opts.max`. This is how the screener fills hundreds of rows.
|
|
130
|
+
*/
|
|
131
|
+
async discover(preset, limit = 30, opts = {}) {
|
|
132
|
+
const pool = opts.max !== undefined;
|
|
133
|
+
const max = opts.max ?? limit;
|
|
134
|
+
const feeds = this.discoverFeeds(preset, limit, pool);
|
|
135
|
+
const errors = {};
|
|
136
|
+
const lists = await Promise.all(feeds.map(async (f) => {
|
|
137
|
+
try {
|
|
138
|
+
const r = await this.cache.fetch(NS.list, f.name, f.load, { ttlMs: TTL.lists, source: f.source, swr: false });
|
|
139
|
+
return r.value;
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
errors[f.source] = errMsg(err);
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
}));
|
|
146
|
+
this.emitDiscover({ preset, pool, t: Date.now(), feeds: feeds.map((f, i) => ({ name: f.name, source: f.source, mints: lists[i] })) });
|
|
147
|
+
// Interleave feeds so every source is represented near the top.
|
|
148
|
+
const origin = {};
|
|
149
|
+
const mints = [];
|
|
150
|
+
const longest = Math.max(0, ...lists.map((l) => l.length));
|
|
151
|
+
for (let i = 0; i < longest && mints.length < max; i++) {
|
|
152
|
+
for (let f = 0; f < lists.length && mints.length < max; f++) {
|
|
153
|
+
const m = lists[f][i];
|
|
154
|
+
if (!m)
|
|
155
|
+
continue;
|
|
156
|
+
(origin[m] ??= []).push(feeds[f].name);
|
|
157
|
+
if (origin[m].length === 1)
|
|
158
|
+
mints.push(m);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return { mints, origin, errors };
|
|
162
|
+
}
|
|
163
|
+
/** The discovery sub-feeds for a preset. Compact by default; a wide net in pool mode (task-1303). */
|
|
164
|
+
discoverFeeds(preset, limit, pool) {
|
|
165
|
+
const feeds = [];
|
|
166
|
+
const jupCat = (cat, iv) => feeds.push({ name: `jup:${cat}-${iv}`, source: 'jupiter-tokens', load: () => this.jupList(() => this.jup.category(cat, iv, limit)) });
|
|
167
|
+
if (preset === 'trending') {
|
|
168
|
+
// Compact order is load-bearing: recordings/replays enrich exactly this mint set (do not reorder).
|
|
169
|
+
feeds.push({ name: 'ds:boosts-top', source: 'dexscreener', load: async () => (await this.ds.boostsTop()).map((b) => b.mint) });
|
|
170
|
+
feeds.push({ name: 'jup:toptrending-1h', source: 'jupiter-tokens', load: () => this.jupList(() => this.jup.category('toptrending', '1h', limit)) });
|
|
171
|
+
if (pool) {
|
|
172
|
+
jupCat('toptrending', '24h');
|
|
173
|
+
jupCat('toptraded', '24h');
|
|
174
|
+
jupCat('toptrending', '5m');
|
|
175
|
+
feeds.push({ name: 'ds:boosts-latest', source: 'dexscreener', load: async () => (await this.ds.boostsLatest()).map((b) => b.mint) });
|
|
176
|
+
feeds.push({ name: 'ds:profiles-latest', source: 'dexscreener', load: () => this.ds.profilesLatest() });
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else if (preset === 'organic') {
|
|
180
|
+
feeds.push({ name: 'jup:toporganicscore-1h', source: 'jupiter-tokens', load: () => this.jupList(() => this.jup.category('toporganicscore', '1h', limit)) });
|
|
181
|
+
if (pool) {
|
|
182
|
+
jupCat('toporganicscore', '24h');
|
|
183
|
+
jupCat('toporganicscore', '5m');
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else if (preset === 'traded') {
|
|
187
|
+
// Top-traded by volume (task-1303): the 'top traded' feed switcher entry.
|
|
188
|
+
feeds.push({ name: 'jup:toptraded-1h', source: 'jupiter-tokens', load: () => this.jupList(() => this.jup.category('toptraded', '1h', limit)) });
|
|
189
|
+
if (pool) {
|
|
190
|
+
jupCat('toptraded', '24h');
|
|
191
|
+
jupCat('toptraded', '5m');
|
|
192
|
+
jupCat('toptrending', '1h');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else if (preset === 'boosted') {
|
|
196
|
+
// Paid-boosted + freshly-listed tokens (task-1303): the 'boosted' feed switcher entry (DexScreener only).
|
|
197
|
+
feeds.push({ name: 'ds:boosts-top', source: 'dexscreener', load: async () => (await this.ds.boostsTop()).map((b) => b.mint) });
|
|
198
|
+
if (pool) {
|
|
199
|
+
feeds.push({ name: 'ds:boosts-latest', source: 'dexscreener', load: async () => (await this.ds.boostsLatest()).map((b) => b.mint) });
|
|
200
|
+
feeds.push({ name: 'ds:profiles-latest', source: 'dexscreener', load: () => this.ds.profilesLatest() });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
feeds.push({ name: 'jup:recent', source: 'jupiter-tokens', load: () => this.jupList(() => this.jup.recent()) });
|
|
205
|
+
if (pool) {
|
|
206
|
+
jupCat('toptrending', '5m');
|
|
207
|
+
feeds.push({ name: 'ds:profiles-latest', source: 'dexscreener', load: () => this.ds.profilesLatest() });
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return feeds;
|
|
211
|
+
}
|
|
212
|
+
/** Jupiter list endpoints return full token records: seed the enrichment cache from them. */
|
|
213
|
+
async jupList(load) {
|
|
214
|
+
const views = await load();
|
|
215
|
+
for (const v of views)
|
|
216
|
+
this.cache.set(NS.jup, v.token.mint, v, { ttlMs: TTL.enrichment, source: 'jupiter-tokens', fetchedAt: v.token.fetchedAt });
|
|
217
|
+
return views.map((v) => v.token.mint);
|
|
218
|
+
}
|
|
219
|
+
/** Cache-only lookup: fresh and stale hits, no network (stale ones flagged like a failed refresh). */
|
|
220
|
+
cached(ns, mints) {
|
|
221
|
+
const out = { values: new Map(), stale: new Set() };
|
|
222
|
+
for (const m of mints) {
|
|
223
|
+
const hit = this.cache.get(ns, m);
|
|
224
|
+
if (!hit)
|
|
225
|
+
continue;
|
|
226
|
+
out.values.set(m, hit.value);
|
|
227
|
+
if (hit.stale)
|
|
228
|
+
out.stale.add(m);
|
|
229
|
+
}
|
|
230
|
+
return out;
|
|
231
|
+
}
|
|
232
|
+
async lookup(ns, mints, ttlMs, source, fetchMany) {
|
|
233
|
+
const values = new Map();
|
|
234
|
+
const staleHits = new Map();
|
|
235
|
+
const need = [];
|
|
236
|
+
for (const m of mints) {
|
|
237
|
+
const hit = this.cache.get(ns, m);
|
|
238
|
+
if (hit && !hit.stale)
|
|
239
|
+
values.set(m, hit.value);
|
|
240
|
+
else {
|
|
241
|
+
if (hit)
|
|
242
|
+
staleHits.set(m, hit.value);
|
|
243
|
+
need.push(m);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const out = { values, stale: new Set() };
|
|
247
|
+
if (need.length === 0)
|
|
248
|
+
return out;
|
|
249
|
+
const t0 = performance.now();
|
|
250
|
+
try {
|
|
251
|
+
const fetched = await fetchMany(need);
|
|
252
|
+
out.latencyMs = Math.round(performance.now() - t0);
|
|
253
|
+
for (const [m, v] of fetched) {
|
|
254
|
+
this.cache.set(ns, m, v, { ttlMs, source });
|
|
255
|
+
values.set(m, v);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch (err) {
|
|
259
|
+
out.error = errMsg(err);
|
|
260
|
+
for (const [m, v] of staleHits) {
|
|
261
|
+
values.set(m, v);
|
|
262
|
+
out.stale.add(m);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return out;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Jupiter is preferred for identity fields (decimals, launchpad, verification); DexScreener fills gaps.
|
|
270
|
+
* The image is the exception (task-1326): DexScreener's CDN rendition first (small, transcoded, served from
|
|
271
|
+
* one reliable host), Jupiter's icon only when DexScreener has none — Jupiter icons are usually raw IPFS
|
|
272
|
+
* gateway links (the main public IPFS gateway answered 429 for 16 of 40 in the task-1326 live run).
|
|
273
|
+
*/
|
|
274
|
+
export function mergeToken(ds, jup) {
|
|
275
|
+
if (!jup)
|
|
276
|
+
return ds;
|
|
277
|
+
if (!ds)
|
|
278
|
+
return jup;
|
|
279
|
+
return {
|
|
280
|
+
...jup,
|
|
281
|
+
launchpad: jup.launchpad !== 'unknown' ? jup.launchpad : ds.launchpad,
|
|
282
|
+
createdAt: jup.createdAt ?? ds.createdAt,
|
|
283
|
+
image: ds.image ?? jup.image,
|
|
284
|
+
socials: { x: jup.socials.x ?? ds.socials.x, tg: jup.socials.tg ?? ds.socials.tg, web: jup.socials.web ?? ds.socials.web },
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
function errMsg(err) {
|
|
288
|
+
return err instanceof Error ? err.message : String(err);
|
|
289
|
+
}
|