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,83 @@
|
|
|
1
|
+
// @dexterm/data — on-chain "social" rows (task-1330; design §4 table row "on-chain social", §5.2).
|
|
2
|
+
// The truth layer that confirms or contradicts attention, rendered as posts with `platform: 'chain'`.
|
|
3
|
+
// Rows are RULE-DERIVED from data the app already has (labelled top holders, the trade tape); the text is
|
|
4
|
+
// ours (templates + numbers), the only untrusted parts are label words and short addresses, and even those
|
|
5
|
+
// go through the ingest firewall like every other post. task-1359: the wallet-intel scan (task-1340) feeds its
|
|
6
|
+
// linked clusters (R1 funder / R2 bundle / R3 transfer / R4 dev-linked) and the launch-window snipers through the
|
|
7
|
+
// same ChainSignal shape (chainSignalsFromIntel).
|
|
8
|
+
export const LARGE_TRADE_USD = 5_000;
|
|
9
|
+
export const CHAIN_ROWS_MAX = 12;
|
|
10
|
+
const short = (a) => (a.length > 10 ? `${a.slice(0, 4)}…${a.slice(-4)}` : a);
|
|
11
|
+
const usd = (n) => (n >= 1e6 ? `$${(n / 1e6).toFixed(2)}M` : n >= 1e3 ? `$${(n / 1e3).toFixed(1)}K` : `$${n.toFixed(0)}`);
|
|
12
|
+
/** Template the row text from OUR words; numbers formatted here, never free text from a source. */
|
|
13
|
+
export function chainSignalText(s) {
|
|
14
|
+
const who = s.label ? `${s.label} wallet ${short(s.wallet)}` : `wallet ${short(s.wallet)}`;
|
|
15
|
+
switch (s.kind) {
|
|
16
|
+
case 'kol-buy': return `${who} bought${s.usd !== null ? ` ${usd(s.usd)}` : ''} (tracked wallet, on-chain)`;
|
|
17
|
+
case 'labelled-holder': return `${who} holds ${s.pct !== null ? `${s.pct.toFixed(2)}%` : 'a top-20 slot'} of supply`;
|
|
18
|
+
case 'large-trade': return `${who} ${s.side === 'sell' ? 'sold' : 'bought'} ${s.usd !== null ? usd(s.usd) : ''} in one trade`.replace(/\s+/g, ' ').trim();
|
|
19
|
+
case 'dev-move': return `${who} moved ${s.pct !== null ? `${s.pct.toFixed(1)}%` : 'tokens'}${s.side === 'sell' ? ' out (sell)' : ''}`;
|
|
20
|
+
case 'cluster': {
|
|
21
|
+
// label = the cluster kind the wallet-intel rules assigned (rules.ts R1–R4); text says which rule linked them
|
|
22
|
+
const share = s.pct !== null ? `${s.pct.toFixed(1)}% of supply` : 'a share of supply';
|
|
23
|
+
const n = s.count !== undefined ? `${s.count} wallets` : 'linked wallets';
|
|
24
|
+
const why = s.label === 'bundle' ? 'bought in the same slot and share a funder (bundle, R2)'
|
|
25
|
+
: s.label === 'dev-linked' ? 'were funded by the creator wallet (dev-linked, R4)'
|
|
26
|
+
: s.label === 'transfer' ? 'are linked by direct token transfers at launch (R3)'
|
|
27
|
+
: 'share one funding wallet (R1)';
|
|
28
|
+
return `${share} sits in ${n} that ${why}`;
|
|
29
|
+
}
|
|
30
|
+
case 'snipers': return `${s.count ?? 0} sniper wallet${s.count === 1 ? '' : 's'} took ${s.pct !== null ? `${s.pct.toFixed(1)}%` : 'part'} of the launch window (first 3 slots)`;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function chainSignalToRaw(s, fetchedAt) {
|
|
34
|
+
const tier = s.label === 'kol' || s.label === 'smart' ? 'kol-b' : 'none';
|
|
35
|
+
return {
|
|
36
|
+
id: `chain:${s.mint.slice(0, 8)}:${s.kind}:${s.wallet.slice(0, 8)}:${Math.floor(s.t / 1000)}`,
|
|
37
|
+
t: s.t,
|
|
38
|
+
platform: 'chain',
|
|
39
|
+
author: { id: s.wallet, handle: short(s.wallet), tier, createdAt: null },
|
|
40
|
+
text: chainSignalText(s),
|
|
41
|
+
url: null,
|
|
42
|
+
lang: null,
|
|
43
|
+
metrics: {},
|
|
44
|
+
mints: [s.mint],
|
|
45
|
+
source: 'solana-rpc',
|
|
46
|
+
fetchedAt,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Rule-derived signals from the open token's panels: labelled top holders (dev / sniper / smart; LP
|
|
51
|
+
* and CEX skipped — they are plumbing, not people), tracked-wallet buys, and large single trades.
|
|
52
|
+
*/
|
|
53
|
+
export function chainSignalsFromToken(input) {
|
|
54
|
+
const out = [];
|
|
55
|
+
const large = input.largeTradeUsd ?? LARGE_TRADE_USD;
|
|
56
|
+
for (const h of input.holders) {
|
|
57
|
+
if (!h.label || h.label === 'LP' || h.label === 'cex' || h.label === 'bridge')
|
|
58
|
+
continue;
|
|
59
|
+
out.push({ mint: input.mint, kind: 'labelled-holder', wallet: h.address, label: h.label, side: null, usd: null, pct: h.pct, t: input.now, source: 'holders' });
|
|
60
|
+
}
|
|
61
|
+
for (const tr of input.trades) {
|
|
62
|
+
const kol = input.kolWallets?.has(tr.wallet.toLowerCase()) ?? false;
|
|
63
|
+
if (kol && tr.side === 'buy')
|
|
64
|
+
out.push({ mint: input.mint, kind: 'kol-buy', wallet: tr.wallet, label: 'kol', side: 'buy', usd: tr.usd, pct: null, t: tr.t, source: 'tape' });
|
|
65
|
+
else if (tr.usd >= large)
|
|
66
|
+
out.push({ mint: input.mint, kind: 'large-trade', wallet: tr.wallet, label: null, side: tr.side, usd: tr.usd, pct: null, t: tr.t, source: 'tape' });
|
|
67
|
+
}
|
|
68
|
+
out.sort((a, b) => b.t - a.t || (b.usd ?? 0) - (a.usd ?? 0));
|
|
69
|
+
return out.slice(0, input.max ?? CHAIN_ROWS_MAX);
|
|
70
|
+
}
|
|
71
|
+
/** Rule-derived rows from a wallet-intel scan: linked clusters (largest first) and the launch-window snipers. */
|
|
72
|
+
export function chainSignalsFromIntel(input) {
|
|
73
|
+
const out = [];
|
|
74
|
+
for (const c of input.clusters) {
|
|
75
|
+
if (c.kind === 'single' || c.members.length < 2 || !c.members[0])
|
|
76
|
+
continue;
|
|
77
|
+
out.push({ mint: input.mint, kind: 'cluster', wallet: c.members[0], label: c.kind, side: null, usd: null, pct: c.pct, t: input.t, source: 'wallet-intel', count: c.members.length });
|
|
78
|
+
}
|
|
79
|
+
out.sort((a, b) => (b.pct ?? 0) - (a.pct ?? 0));
|
|
80
|
+
if (input.snipers && input.snipers.count > 0)
|
|
81
|
+
out.unshift({ mint: input.mint, kind: 'snipers', wallet: 'snipers', label: null, side: null, usd: null, pct: input.snipers.launchWindowSharePct, t: input.t, source: 'wallet-intel', count: input.snipers.count });
|
|
82
|
+
return out.slice(0, input.max ?? 6);
|
|
83
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// @dexterm/data — dedupe and spam/bot rules (task-1330; design §5.5). All local, all deterministic,
|
|
2
|
+
// testable on recorded fixtures. Nothing here looks at follower counts.
|
|
3
|
+
//
|
|
4
|
+
// 1. Exact + near-duplicate text (normalized, URL/mint stripped, SimHash ≤ 3 bits) within 10 min → one
|
|
5
|
+
// cluster row with `dupCount`; the cluster is a single vote for velocity (members are `hidden`).
|
|
6
|
+
// 2. Account burst: ≥ 10 posts about one mint from accounts created within 30 days, inside 2 min → the
|
|
7
|
+
// posts are `spam`, excluded from velocity, shown collapsed on the head.
|
|
8
|
+
// 3. Cashtag squats: a `$SYM` whose text carries a different base58 address than the row's mint is
|
|
9
|
+
// `squat`; a symbol with ≥ 3 live mints and no resolved mint is `unverified-cashtag`.
|
|
10
|
+
export const DEDUPE_WINDOW_MS = 10 * 60_000;
|
|
11
|
+
export const DEDUPE_MAX_BITS = 3;
|
|
12
|
+
export const BURST_MIN_POSTS = 10;
|
|
13
|
+
export const BURST_SPAN_MS = 2 * 60_000;
|
|
14
|
+
export const FRESH_ACCOUNT_MS = 30 * 86_400_000;
|
|
15
|
+
export const SQUAT_MIN_LIVE_MINTS = 3;
|
|
16
|
+
/** Lower-case, drop `[url]`/`[addr]` placeholders, cashtags, @handles, punctuation and digits-only tokens; collapse spaces. */
|
|
17
|
+
export function normalizeForDedupe(text) {
|
|
18
|
+
return text
|
|
19
|
+
.toLowerCase()
|
|
20
|
+
.replace(/\b(?:https?:\/\/|www\.)\S+/g, ' ')
|
|
21
|
+
.replace(/\[(?:url|addr)\]/g, ' ')
|
|
22
|
+
.replace(/\$[a-z][a-z0-9_]*/g, ' ')
|
|
23
|
+
.replace(/@[a-z0-9_]+/g, ' ')
|
|
24
|
+
.replace(/[^\p{L}\p{N}\s]/gu, ' ')
|
|
25
|
+
.replace(/\s+/g, ' ')
|
|
26
|
+
.trim();
|
|
27
|
+
}
|
|
28
|
+
const FNV_OFFSET = 0xcbf29ce484222325n;
|
|
29
|
+
const FNV_PRIME = 0x100000001b3n;
|
|
30
|
+
const MASK64 = (1n << 64n) - 1n;
|
|
31
|
+
/** FNV-1a 64 over UTF-16 code units (deterministic across platforms, no deps). */
|
|
32
|
+
export function fnv1a64(s) {
|
|
33
|
+
let h = FNV_OFFSET;
|
|
34
|
+
for (let i = 0; i < s.length; i++) {
|
|
35
|
+
h ^= BigInt(s.charCodeAt(i));
|
|
36
|
+
h = (h * FNV_PRIME) & MASK64;
|
|
37
|
+
}
|
|
38
|
+
return h;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 64-bit SimHash over word shingles (unigrams + bigrams) of the normalized text. Near-identical posts
|
|
42
|
+
* (a swapped word, a different emoji, another handle) land within a few bits of each other.
|
|
43
|
+
*/
|
|
44
|
+
export function simhash64(normalized) {
|
|
45
|
+
const words = normalized.split(' ').filter(Boolean);
|
|
46
|
+
if (words.length === 0)
|
|
47
|
+
return 0n;
|
|
48
|
+
const shingles = [];
|
|
49
|
+
for (let i = 0; i < words.length; i++) {
|
|
50
|
+
shingles.push(words[i]);
|
|
51
|
+
if (i + 1 < words.length)
|
|
52
|
+
shingles.push(`${words[i]} ${words[i + 1]}`);
|
|
53
|
+
}
|
|
54
|
+
const v = new Array(64).fill(0);
|
|
55
|
+
for (const sh of shingles) {
|
|
56
|
+
const h = fnv1a64(sh);
|
|
57
|
+
for (let b = 0; b < 64; b++)
|
|
58
|
+
v[b] += (h >> BigInt(b)) & 1n ? 1 : -1;
|
|
59
|
+
}
|
|
60
|
+
let out = 0n;
|
|
61
|
+
for (let b = 0; b < 64; b++)
|
|
62
|
+
if (v[b] > 0)
|
|
63
|
+
out |= 1n << BigInt(b);
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
export function hamming(a, b) {
|
|
67
|
+
let x = a ^ b;
|
|
68
|
+
let n = 0;
|
|
69
|
+
while (x) {
|
|
70
|
+
x &= x - 1n;
|
|
71
|
+
n++;
|
|
72
|
+
}
|
|
73
|
+
return n;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Group near-duplicates (rule 1). Returns the same post objects with `cluster`, `dupCount` and
|
|
77
|
+
* `hidden` set: the earliest post of a cluster is the head (listed; carries dupCount), the rest hidden.
|
|
78
|
+
* Posts of different platforms or about different mints never cluster (a news headline is not a dupe
|
|
79
|
+
* of an X post quoting it). Idempotent.
|
|
80
|
+
*/
|
|
81
|
+
export function clusterPosts(posts, opts = {}) {
|
|
82
|
+
const windowMs = opts.windowMs ?? DEDUPE_WINDOW_MS;
|
|
83
|
+
const maxBits = opts.maxBits ?? DEDUPE_MAX_BITS;
|
|
84
|
+
const sorted = [...posts].sort((a, b) => a.t - b.t || a.id.localeCompare(b.id));
|
|
85
|
+
const heads = new Map(); // key: platform|mint
|
|
86
|
+
for (const p of sorted) {
|
|
87
|
+
const norm = normalizeForDedupe(p.text);
|
|
88
|
+
const hash = simhash64(norm);
|
|
89
|
+
const key = `${p.platform}|${p.mints[0] ?? ''}`;
|
|
90
|
+
const list = heads.get(key) ?? [];
|
|
91
|
+
let hit = null;
|
|
92
|
+
for (let i = list.length - 1; i >= 0; i--) {
|
|
93
|
+
const h = list[i];
|
|
94
|
+
if (p.t - h.t > windowMs)
|
|
95
|
+
break; // list is time-ordered; older heads cannot match
|
|
96
|
+
if (norm.length === 0)
|
|
97
|
+
continue; // empty text never clusters
|
|
98
|
+
if (h.hash === hash || hamming(h.hash, hash) <= maxBits) {
|
|
99
|
+
hit = h;
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (hit) {
|
|
104
|
+
hit.members.push(p);
|
|
105
|
+
p.cluster = hit.id;
|
|
106
|
+
p.hidden = true;
|
|
107
|
+
p.dupCount = 1;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
list.push({ id: p.id, t: p.t, hash, members: [p] });
|
|
111
|
+
heads.set(key, list);
|
|
112
|
+
p.cluster = null;
|
|
113
|
+
p.hidden = false;
|
|
114
|
+
p.dupCount = 1;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
for (const list of heads.values()) {
|
|
118
|
+
for (const h of list) {
|
|
119
|
+
if (h.members.length > 1) {
|
|
120
|
+
const head = h.members[0];
|
|
121
|
+
head.cluster = h.id;
|
|
122
|
+
head.dupCount = h.members.length;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return posts;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Rule 2, per mint: a sliding 2-minute window holding ≥ 10 posts from accounts younger than 30 days
|
|
130
|
+
* flags every post in it `spam`, demotes those authors to the `spam` tier and collapses the burst onto
|
|
131
|
+
* its earliest listed post. Accounts with an unknown creation time never count as fresh (a missing
|
|
132
|
+
* field is not evidence). Idempotent.
|
|
133
|
+
*/
|
|
134
|
+
export function markBurstSpam(posts, opts) {
|
|
135
|
+
const minPosts = opts.minPosts ?? BURST_MIN_POSTS;
|
|
136
|
+
const spanMs = opts.spanMs ?? BURST_SPAN_MS;
|
|
137
|
+
const freshMs = opts.freshAccountMs ?? FRESH_ACCOUNT_MS;
|
|
138
|
+
const byMint = new Map();
|
|
139
|
+
for (const p of posts) {
|
|
140
|
+
if (p.platform === 'news' || p.platform === 'chain')
|
|
141
|
+
continue;
|
|
142
|
+
const fresh = p.author.createdAt !== null && opts.now - p.author.createdAt <= freshMs;
|
|
143
|
+
if (!fresh)
|
|
144
|
+
continue;
|
|
145
|
+
for (const m of p.mints.length ? p.mints : ['']) {
|
|
146
|
+
const l = byMint.get(m) ?? [];
|
|
147
|
+
l.push(p);
|
|
148
|
+
byMint.set(m, l);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
for (const list of byMint.values()) {
|
|
152
|
+
list.sort((a, b) => a.t - b.t);
|
|
153
|
+
let j = 0;
|
|
154
|
+
const flagged = new Set();
|
|
155
|
+
for (let i = 0; i < list.length; i++) {
|
|
156
|
+
while (list[i].t - list[j].t > spanMs)
|
|
157
|
+
j++;
|
|
158
|
+
if (i - j + 1 >= minPosts)
|
|
159
|
+
for (let k = j; k <= i; k++)
|
|
160
|
+
flagged.add(list[k]);
|
|
161
|
+
}
|
|
162
|
+
if (flagged.size === 0)
|
|
163
|
+
continue;
|
|
164
|
+
const arr = [...flagged].sort((a, b) => a.t - b.t);
|
|
165
|
+
const accounts = new Set(arr.map((p) => p.author.id));
|
|
166
|
+
const spanSec = Math.max(1, Math.round((arr[arr.length - 1].t - arr[0].t) / 1000));
|
|
167
|
+
// collapse onto the earliest visible post of the burst (or the earliest post when all are hidden)
|
|
168
|
+
const head = arr.find((p) => !p.hidden) ?? arr[0];
|
|
169
|
+
for (const p of arr) {
|
|
170
|
+
if (!p.flags.includes('spam'))
|
|
171
|
+
p.flags.push('spam');
|
|
172
|
+
p.author.tier = 'spam';
|
|
173
|
+
if (p !== head)
|
|
174
|
+
p.hidden = true;
|
|
175
|
+
}
|
|
176
|
+
head.hidden = false;
|
|
177
|
+
head.cluster = head.cluster ?? head.id;
|
|
178
|
+
head.dupCount = Math.max(head.dupCount, arr.length);
|
|
179
|
+
head.collapsed = { posts: arr.length, accounts: accounts.size, spanSec };
|
|
180
|
+
}
|
|
181
|
+
return posts;
|
|
182
|
+
}
|
|
183
|
+
/** Rule 3: cashtag squats and unverified cashtags. Idempotent. */
|
|
184
|
+
export function markSquats(posts, opts = {}) {
|
|
185
|
+
for (const p of posts) {
|
|
186
|
+
if (p.platform === 'news' || p.platform === 'chain')
|
|
187
|
+
continue;
|
|
188
|
+
const addrs = opts.addressesOf?.(p) ?? [];
|
|
189
|
+
const own = new Set(p.mints);
|
|
190
|
+
if (p.cashtags.length && addrs.some((a) => !own.has(a))) {
|
|
191
|
+
if (!p.flags.includes('squat'))
|
|
192
|
+
p.flags.push('squat');
|
|
193
|
+
}
|
|
194
|
+
if (p.mints.length === 0 && p.cashtags.length && opts.mintsForSymbol) {
|
|
195
|
+
const ambiguous = p.cashtags.some((s) => opts.mintsForSymbol(s).length >= SQUAT_MIN_LIVE_MINTS);
|
|
196
|
+
if (ambiguous && !p.flags.includes('unverified-cashtag'))
|
|
197
|
+
p.flags.push('unverified-cashtag');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return posts;
|
|
201
|
+
}
|
|
202
|
+
/** Posts that count: listed heads, not spam, not squats/unverified, not injection. */
|
|
203
|
+
export function countsForVelocity(p) {
|
|
204
|
+
return !p.hidden && !p.flags.includes('spam') && !p.flags.includes('squat') && !p.flags.includes('unverified-cashtag') && !p.flags.includes('injection');
|
|
205
|
+
}
|