dexterm-cli 0.1.2 → 0.1.4
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/dist/packages/agents/src/bus.js +37 -1
- package/dist/packages/agents/src/follow.js +105 -0
- package/dist/packages/agents/src/index.js +5 -0
- package/dist/packages/agents/src/spectator-server.js +153 -0
- package/dist/packages/agents/src/spectator.js +212 -0
- package/dist/packages/cli/assets/claude/analyst-system.md +7 -1
- package/dist/packages/cli/src/agent-cmd.js +71 -7
- package/dist/packages/cli/src/agent-spectator.js +37 -0
- package/dist/packages/cli/src/alerts/format.js +25 -0
- package/dist/packages/cli/src/app-help-gen.js +365 -0
- package/dist/packages/cli/src/docs-kb-gen.js +228 -0
- package/dist/packages/cli/src/doctor.js +28 -12
- package/dist/packages/cli/src/follow-cmd.js +107 -1
- package/dist/packages/cli/src/help-cmd.js +48 -0
- package/dist/packages/cli/src/index.js +1 -1
- package/dist/packages/cli/src/kb-skill-cmd.js +3 -0
- package/dist/packages/cli/src/larp-detected.js +209 -0
- package/dist/packages/cli/src/live/index.js +64 -3
- package/dist/packages/cli/src/live/screens/token-live.js +24 -0
- package/dist/packages/cli/src/live/signals.js +109 -0
- package/dist/packages/cli/src/live/token.js +38 -1
- package/dist/packages/cli/src/live/trade.js +24 -1
- package/dist/packages/cli/src/main.js +495 -11
- package/dist/packages/cli/src/mcp-cmd.js +2 -7
- package/dist/packages/cli/src/mcp-follow.js +225 -0
- package/dist/packages/cli/src/pnl-app.js +221 -0
- package/dist/packages/cli/src/pnl-card.js +615 -0
- package/dist/packages/cli/src/record-cmd.js +455 -0
- package/dist/packages/cli/src/rules.js +50 -2
- package/dist/packages/cli/src/screens/follows.js +91 -2
- package/dist/packages/cli/src/screens/overlay.js +3 -0
- package/dist/packages/cli/src/screens/positions.js +1 -1
- package/dist/packages/cli/src/screens/rules.js +1 -1
- package/dist/packages/cli/src/spectate-cmd.js +115 -0
- package/dist/packages/cli/src/state.js +1 -1
- package/dist/packages/cli/src/version.js +1 -1
- package/dist/packages/cli/src/voice-cmd.js +86 -11
- package/dist/packages/cli/src/voice-hud.js +1 -1
- package/dist/packages/cli/src/x-cmd.js +11 -5
- package/dist/packages/custom/src/rules.js +2 -1
- package/dist/packages/data/src/analyst-actions.js +130 -3
- package/dist/packages/data/src/fast-lane.js +16 -2
- package/dist/packages/data/src/index.js +1 -0
- package/dist/packages/data/src/intel/live-signals.js +185 -0
- package/dist/packages/data/src/trade/copy/index.js +1 -1
- package/dist/packages/data/src/trade/copy/stats.js +36 -2
- package/dist/packages/data/src/trade/copy/tracker.js +3 -2
- package/dist/packages/mcp/assets/kb/app-help/app-help-command.md +35 -0
- package/dist/packages/mcp/assets/kb/app-help/ask-the-analyst.md +43 -0
- package/dist/packages/mcp/assets/kb/app-help/backtest.md +33 -0
- package/dist/packages/mcp/assets/kb/app-help/bubble-map.md +35 -0
- package/dist/packages/mcp/assets/kb/app-help/calm-mode.md +31 -0
- package/dist/packages/mcp/assets/kb/app-help/change-voice-speed.md +31 -0
- package/dist/packages/mcp/assets/kb/app-help/change-voice.md +30 -0
- package/dist/packages/mcp/assets/kb/app-help/chart-popup-selftest.md +32 -0
- package/dist/packages/mcp/assets/kb/app-help/coin-images.md +29 -0
- package/dist/packages/mcp/assets/kb/app-help/configure-rpc-key.md +28 -0
- package/dist/packages/mcp/assets/kb/app-help/connect-an-agent-registry.md +35 -0
- package/dist/packages/mcp/assets/kb/app-help/connect-an-agent.md +39 -0
- package/dist/packages/mcp/assets/kb/app-help/custom-keymap.md +32 -0
- package/dist/packages/mcp/assets/kb/app-help/edit-kb-or-skill.md +36 -0
- package/dist/packages/mcp/assets/kb/app-help/edit-rules.md +34 -0
- package/dist/packages/mcp/assets/kb/app-help/export-a-view.md +36 -0
- package/dist/packages/mcp/assets/kb/app-help/follow-a-wallet.md +33 -0
- package/dist/packages/mcp/assets/kb/app-help/getting-started.md +37 -0
- package/dist/packages/mcp/assets/kb/app-help/kol-lists.md +34 -0
- package/dist/packages/mcp/assets/kb/app-help/larp-check.md +36 -0
- package/dist/packages/mcp/assets/kb/app-help/link-a-wallet.md +41 -0
- package/dist/packages/mcp/assets/kb/app-help/login-with-x.md +33 -0
- package/dist/packages/mcp/assets/kb/app-help/narrative-board.md +32 -0
- package/dist/packages/mcp/assets/kb/app-help/open-a-coin.md +43 -0
- package/dist/packages/mcp/assets/kb/app-help/open-chart-popup.md +33 -0
- package/dist/packages/mcp/assets/kb/app-help/order-plans.md +33 -0
- package/dist/packages/mcp/assets/kb/app-help/paper-trade.md +36 -0
- package/dist/packages/mcp/assets/kb/app-help/price-or-marketcap.md +38 -0
- package/dist/packages/mcp/assets/kb/app-help/record-headless.md +34 -0
- package/dist/packages/mcp/assets/kb/app-help/recorder-history.md +39 -0
- package/dist/packages/mcp/assets/kb/app-help/rug-check.md +39 -0
- package/dist/packages/mcp/assets/kb/app-help/run-doctor.md +32 -0
- package/dist/packages/mcp/assets/kb/app-help/scan-mode.md +37 -0
- package/dist/packages/mcp/assets/kb/app-help/screen-analyst.md +181 -0
- package/dist/packages/mcp/assets/kb/app-help/screen-kol.md +190 -0
- package/dist/packages/mcp/assets/kb/app-help/screen-newpairs.md +181 -0
- package/dist/packages/mcp/assets/kb/app-help/screen-positions.md +180 -0
- package/dist/packages/mcp/assets/kb/app-help/screen-screener.md +199 -0
- package/dist/packages/mcp/assets/kb/app-help/screen-token.md +240 -0
- package/dist/packages/mcp/assets/kb/app-help/screen-trending.md +192 -0
- package/dist/packages/mcp/assets/kb/app-help/screen-watchlist.md +181 -0
- package/dist/packages/mcp/assets/kb/app-help/set-a-filter.md +36 -0
- package/dist/packages/mcp/assets/kb/app-help/setup-neural-voice.md +36 -0
- package/dist/packages/mcp/assets/kb/app-help/share-packs.md +34 -0
- package/dist/packages/mcp/assets/kb/app-help/sort-the-screener.md +34 -0
- package/dist/packages/mcp/assets/kb/app-help/spectate-an-agent.md +39 -0
- package/dist/packages/mcp/assets/kb/app-help/standing-mandates.md +33 -0
- package/dist/packages/mcp/assets/kb/app-help/switch-theme.md +42 -0
- package/dist/packages/mcp/assets/kb/app-help/turn-on-alerts.md +37 -0
- package/dist/packages/mcp/assets/kb/app-help/update-dexterm.md +30 -0
- package/dist/packages/mcp/assets/kb/app-help/use-presets.md +42 -0
- package/dist/packages/mcp/assets/kb/app-help/use-voice-mode.md +36 -0
- package/dist/packages/mcp/assets/kb/app-help/watch-a-coin.md +34 -0
- package/dist/packages/mcp/assets/kb/app-help/watch-headless.md +35 -0
- package/dist/packages/mcp/assets/kb/app-help/what-dexterm-shows-agents.md +31 -0
- package/dist/packages/mcp/assets/kb/app-help/workspaces.md +38 -0
- package/dist/packages/mcp/assets/kb/docs/docs-agents-capability-tiers-enforced-server-side.md +38 -0
- package/dist/packages/mcp/assets/kb/docs/docs-agents-install-in-one-command.md +49 -0
- package/dist/packages/mcp/assets/kb/docs/docs-agents-per-agent-mandates.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-agents-recipes.md +43 -0
- package/dist/packages/mcp/assets/kb/docs/docs-agents-red-team-coverage.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-agents-two-ways-to-connect.md +37 -0
- package/dist/packages/mcp/assets/kb/docs/docs-agents-untrusted-by-default.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-agents-watch-an-agent-work-spectator-view.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-agents.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-analyst-answer-style.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-analyst-if-claude-is-missing.md +25 -0
- package/dist/packages/mcp/assets/kb/docs/docs-analyst-it-knows-the-app.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-analyst-mcp-tools.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-analyst-plain-language-filters.md +25 -0
- package/dist/packages/mcp/assets/kb/docs/docs-analyst-skills.md +31 -0
- package/dist/packages/mcp/assets/kb/docs/docs-analyst-starting-a-run.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-analyst-what-it-can-change-three-tiers.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-analyst-what-it-sees.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-analyst-what-the-analyst-can-never-do.md +31 -0
- package/dist/packages/mcp/assets/kb/docs/docs-analyst.md +23 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-1-start-dexterm.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-2-open-a-real-coin-by-contract-address.md +43 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-3-read-the-safety-panel.md +40 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-4-read-the-holder-panel.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-5-optionally-ask-the-analyst.md +39 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-6-export-or-share-what-you-see.md +34 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-7-quit-safely.md +34 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-before-any-experimental-trading.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-check-the-installation-with-doctor.md +38 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-choose-a-setup-path.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-common-mistakes-and-recovery.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-copy-and-paste-without-surprises.md +39 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-if-data-says-unavailable-stale-or-rate-limited.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-if-dexterm-says-command-not-found.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-if-optional-help-is-unavailable.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-if-paste-does-nothing-or-pastes-twice.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-if-the-screen-looks-broken.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-if-you-typed-the-wrong-thing.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-install-node-js-first.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-linux.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-macos-homebrew.md +46 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-macos-or-linux-npm.md +39 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-macos.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-open-the-terminal.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-reopen-dexterm-later.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-ten-minute-first-win.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-terminal-shell-prompt-command-output-and-path.md +40 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-where-to-go-next.md +32 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-windows-expectations.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-windows-powershell-experimental.md +39 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-windows.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-beginners.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-cli-dexterm-help.md +31 -0
- package/dist/packages/mcp/assets/kb/docs/docs-cli-filter-grammar.md +37 -0
- package/dist/packages/mcp/assets/kb/docs/docs-cli-flags.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-cli-invocations.md +43 -0
- package/dist/packages/mcp/assets/kb/docs/docs-cli-presets.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-cli-scan-commands.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-cli-sort-keys.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-cli-subcommands.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-cli.md +25 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-environment-variables.md +45 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-files-on-disk.md +41 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-headless-recorder-dexterm-record.md +44 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-history-recorder.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-packs.md +38 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-price-display-mode.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-push-alerts-and-dexterm-watch.md +45 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-rules-engine.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-the-analyst-s-launch.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-the-optional-free-rpc-key.md +42 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-themes-and-keymaps.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-themes-and-look.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-widgets.md +31 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-workspaces.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-configuration.md +25 -0
- package/dist/packages/mcp/assets/kb/docs/docs-copy-trading-stage-1-follow-a-wallet-see-what-it-does.md +51 -0
- package/dist/packages/mcp/assets/kb/docs/docs-copy-trading-stage-2-the-one-key-mirror-ticket-a-proposal.md +56 -0
- package/dist/packages/mcp/assets/kb/docs/docs-copy-trading-stage-3-capped-auto-mirror-default-off-less.md +47 -0
- package/dist/packages/mcp/assets/kb/docs/docs-copy-trading-what-is-proven-what-is-not.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-copy-trading.md +31 -0
- package/dist/packages/mcp/assets/kb/docs/docs-data-sources-cache.md +32 -0
- package/dist/packages/mcp/assets/kb/docs/docs-data-sources-health-registry.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-data-sources-rate-limits-and-pacing.md +32 -0
- package/dist/packages/mcp/assets/kb/docs/docs-data-sources-request-budget-meter.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-data-sources-sources.md +47 -0
- package/dist/packages/mcp/assets/kb/docs/docs-data-sources-the-helius-credit-meter.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-data-sources.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-getting-started-dexterm-doctor.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-getting-started-first-run.md +34 -0
- package/dist/packages/mcp/assets/kb/docs/docs-getting-started-install.md +71 -0
- package/dist/packages/mcp/assets/kb/docs/docs-getting-started-next.md +32 -0
- package/dist/packages/mcp/assets/kb/docs/docs-getting-started-requirements.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-getting-started-running-the-tests.md +34 -0
- package/dist/packages/mcp/assets/kb/docs/docs-getting-started-supported-platforms.md +44 -0
- package/dist/packages/mcp/assets/kb/docs/docs-getting-started-updating.md +28 -0
- package/dist/packages/mcp/assets/kb/docs/docs-getting-started.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-keyboard-global-keys.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-keyboard-keys-handled-by-the-loop.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-keyboard-per-screen-keys.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-keyboard-what-shows.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-keyboard.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-larp-measured-accuracy.md +55 -0
- package/dist/packages/mcp/assets/kb/docs/docs-larp-open-link-keys.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-larp-paste-a-coin-on-the-web.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-larp-the-verdict.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-larp-timestamped-follow-up-drafts.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-larp-what-it-looks-at.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-larp.md +24 -0
- package/dist/packages/mcp/assets/kb/docs/docs-login-with-x-degraded-states-you-will-see.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-login-with-x-free-vs-paid-x-api-tiers-your-bill-your-limits.md +37 -0
- package/dist/packages/mcp/assets/kb/docs/docs-login-with-x-kol-lists-and-the-per-handle-filter.md +28 -0
- package/dist/packages/mcp/assets/kb/docs/docs-login-with-x-tests.md +25 -0
- package/dist/packages/mcp/assets/kb/docs/docs-login-with-x-what-is-read-and-when.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-login-with-x-what-you-set-up-once.md +40 -0
- package/dist/packages/mcp/assets/kb/docs/docs-login-with-x-where-the-tokens-live.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-login-with-x.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-a-live-ticket.md +42 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-before-you-press-size-vs-caps.md +34 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-devnet-signer-mainnet-token.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-jupiter-rate-limits.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-link-a-wallet.md +32 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-live-trading-devnet-first.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-mainnet.md +31 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-order-plans-and-standing-mandates.md +44 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-panic.md +31 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-pnl-cards.md +37 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-the-live-fire-path-devnet-the-fast-wallet.md +41 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-the-signer-process.md +34 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-the-ticket.md +31 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-the-wallet.md +34 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-trade-moments.md +32 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-what-the-live-path-keeps.md +37 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-your-first-live-trade.md +41 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading.md +32 -0
- package/dist/packages/mcp/assets/kb/docs/docs-popup-chart-bubble-map-popup.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-popup-chart-build-the-native-window.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-popup-chart-config-dexterm-popup-json.md +38 -0
- package/dist/packages/mcp/assets/kb/docs/docs-popup-chart-docking-macos.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-popup-chart-keys-in-the-popup.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-popup-chart-market-cap-axis.md +28 -0
- package/dist/packages/mcp/assets/kb/docs/docs-popup-chart-security-model.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-popup-chart-token-and-feeds-popups.md +38 -0
- package/dist/packages/mcp/assets/kb/docs/docs-popup-chart-what-it-shows.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-popup-chart.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scan-cost-control.md +28 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scan-keys-flag-command.md +34 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scan-safety-four-layers.md +32 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scan-states.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scan-the-read.md +25 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scan-triggers-and-score.md +37 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scan.md +24 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scorecard-frozen-canary.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scorecard-frozen-task-1401-evaluation.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scorecard-latest-skill-care-run.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scorecard-links-only-larp-baseline-where-it-is-weak.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scorecard-not-measured.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scorecard-rug-verdict-rules.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scorecard-source-and-rebuild.md +31 -0
- package/dist/packages/mcp/assets/kb/docs/docs-scorecard.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-screens-1-screener.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-screens-2-new-pairs.md +28 -0
- package/dist/packages/mcp/assets/kb/docs/docs-screens-3-watchlist.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-screens-4-analyst-tab.md +28 -0
- package/dist/packages/mcp/assets/kb/docs/docs-screens-bubble-map.md +32 -0
- package/dist/packages/mcp/assets/kb/docs/docs-screens-coin-images.md +32 -0
- package/dist/packages/mcp/assets/kb/docs/docs-screens-live-holder-and-rug-signals.md +51 -0
- package/dist/packages/mcp/assets/kb/docs/docs-screens-order-plans.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-screens-paper-ticket-and-positions.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-screens-the-look.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-screens-token-screen.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-screens-trending-social-and-kol-lists.md +34 -0
- package/dist/packages/mcp/assets/kb/docs/docs-screens.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-spectator-1-the-agent-activity-window-follow-mode.md +56 -0
- package/dist/packages/mcp/assets/kb/docs/docs-spectator-2-the-read-only-stream-spectate.md +42 -0
- package/dist/packages/mcp/assets/kb/docs/docs-spectator-3-save-and-replay-record-file-dexterm-spectate.md +41 -0
- package/dist/packages/mcp/assets/kb/docs/docs-spectator-follow-over-mcp-in-the-running-terminal.md +39 -0
- package/dist/packages/mcp/assets/kb/docs/docs-spectator-limits.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-spectator-quick-start.md +37 -0
- package/dist/packages/mcp/assets/kb/docs/docs-spectator-security-model.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-spectator-see-also.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-spectator-streaming-it.md +32 -0
- package/dist/packages/mcp/assets/kb/docs/docs-spectator-the-three-surfaces.md +37 -0
- package/dist/packages/mcp/assets/kb/docs/docs-spectator-what-is-redacted.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-spectator.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-troubleshooting-common-questions.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-troubleshooting-doctor-lines.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-troubleshooting-in-app-messages.md +42 -0
- package/dist/packages/mcp/assets/kb/docs/docs-troubleshooting-reporting-a-problem.md +25 -0
- package/dist/packages/mcp/assets/kb/docs/docs-troubleshooting.md +23 -0
- package/dist/packages/mcp/assets/kb/docs/docs-voice-doctor.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-voice-it-clarifies-it-never-guesses.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-voice-latency.md +38 -0
- package/dist/packages/mcp/assets/kb/docs/docs-voice-linux-and-windows.md +32 -0
- package/dist/packages/mcp/assets/kb/docs/docs-voice-privacy.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-voice-still-unverified.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-voice-the-voice-neural-by-default.md +48 -0
- package/dist/packages/mcp/assets/kb/docs/docs-voice-what-it-can-never-do.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-voice-what-you-can-say.md +38 -0
- package/dist/packages/mcp/assets/kb/docs/docs-voice.md +25 -0
- package/dist/packages/mcp/src/app-help.js +258 -0
- package/dist/packages/mcp/src/firewall.js +2 -2
- package/dist/packages/mcp/src/index.js +5 -1
- package/dist/packages/mcp/src/server.js +129 -4
- package/dist/packages/mcp/src/spectator-sink.js +144 -0
- package/dist/packages/packs/src/index.js +2 -0
- package/dist/packages/packs/src/skill-care.js +206 -0
- package/dist/packages/popup/src/pages/spectator.css +45 -0
- package/dist/packages/popup/src/pages/spectator.html +25 -0
- package/dist/packages/popup/src/pages/spectator.js +74 -0
- package/dist/packages/popup/src/selftest.js +19 -0
- package/dist/packages/popup/src/server.js +7 -1
- package/dist/packages/tui/src/keymap.js +10 -0
- package/dist/packages/voice/src/controller.js +42 -1
- package/dist/packages/voice/src/doctor.js +25 -8
- package/dist/packages/voice/src/engines.js +8 -1
- package/dist/packages/voice/src/index.js +3 -1
- package/dist/packages/voice/src/speakable.js +111 -0
- package/dist/packages/voice/src/stt/whisper.js +4 -2
- package/dist/packages/voice/src/tts/piper-setup.js +229 -0
- package/dist/packages/voice/src/tts/piper.js +309 -66
- package/dist/packages/voice/src/tts/say.js +3 -2
- package/dist/packages/voice/src/tts/voices.js +8 -5
- package/package.json +6 -5
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// dexterm — LIVE holder / rug SIGNALS engine (task-1404). Pure + deterministic.
|
|
2
|
+
//
|
|
3
|
+
// The token screen used to read holders and safety ONCE, when you opened it. This engine turns a stream of
|
|
4
|
+
// repeated OBSERVATIONS of a token's holder/rug state into SIGNAL events — the changes worth telling a trader
|
|
5
|
+
// about while the token is open or on the watchlist: a dev/creator sell, a top-holder / top-10 concentration
|
|
6
|
+
// shift, LP removal or an unlock change, a mint/freeze authority flip, a new bundle / sniper cluster, a
|
|
7
|
+
// fresh-wallet inflow, bonding-curve progress, a migration.
|
|
8
|
+
//
|
|
9
|
+
// Every signal is a RISK FLAG, never a certificate, and carries its SOURCE and the AGE of the data it read, with
|
|
10
|
+
// an honest `stale` flag. No I/O, no clock, no randomness: the caller feeds `now` and already-fetched readings,
|
|
11
|
+
// so a recording replays to the same signals and the tests can assert each one. Nothing here signs or trades.
|
|
12
|
+
//
|
|
13
|
+
// Baseline rule: a signal only fires on a comparison between two FRESH readings of the same field. A reading that
|
|
14
|
+
// is stale (its panel kept the last value after a failed refresh, or it is older than `staleAfterMs`) updates the
|
|
15
|
+
// latest-known value but never fires a signal off it — we cannot honestly timestamp a change we did not see land.
|
|
16
|
+
// The first observation of a mint sets the baseline and fires nothing (so opening a token never floods).
|
|
17
|
+
export const DEFAULT_SIGNAL_THRESHOLDS = {
|
|
18
|
+
devSellPct: 1,
|
|
19
|
+
concentrationPct: 3,
|
|
20
|
+
lpDropPct: 1,
|
|
21
|
+
liqDropFrac: 0.25,
|
|
22
|
+
bundlePct: 1,
|
|
23
|
+
sniperCount: 1,
|
|
24
|
+
freshPct: 5,
|
|
25
|
+
bondingStepPct: 5,
|
|
26
|
+
staleAfterMs: 60_000,
|
|
27
|
+
};
|
|
28
|
+
/** Every signal kind, for docs / UI / the alerts trigger catalogue. */
|
|
29
|
+
export const SIGNAL_KINDS = [
|
|
30
|
+
'dev-sell', 'concentration', 'lp-unlock', 'liquidity', 'authority', 'bundle', 'sniper', 'fresh-wallet', 'bonding', 'migrated',
|
|
31
|
+
];
|
|
32
|
+
const CUMULATIVE = new Set(['bonding', 'bundled', 'snipers', 'fresh']);
|
|
33
|
+
const r1 = (n) => Math.round(n * 10) / 10;
|
|
34
|
+
export class LiveSignalsEngine {
|
|
35
|
+
thresholds;
|
|
36
|
+
state = new Map();
|
|
37
|
+
constructor(opts = {}) {
|
|
38
|
+
this.thresholds = { ...DEFAULT_SIGNAL_THRESHOLDS, ...opts.thresholds };
|
|
39
|
+
}
|
|
40
|
+
/** Whether a reading is too stale to fire a signal from (still updates the latest-known baseline). */
|
|
41
|
+
stale(reading, now) {
|
|
42
|
+
return reading.stale || now - reading.fetchedAt > this.thresholds.staleAfterMs;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Record one observation and return the signals it produced (empty for the first observation of a mint, or
|
|
46
|
+
* when nothing crossed a threshold). Baseline discipline (see module note):
|
|
47
|
+
* - the first reading of a field sets the baseline and fires nothing;
|
|
48
|
+
* - a STALE reading neither fires nor advances the baseline (so when it is fresh again we compare to the last
|
|
49
|
+
* value we actually saw and never miss a change that happened while stale, nor fire off stale data);
|
|
50
|
+
* - a fresh LEVEL field (dev / top10 / lpLocked / liq / authorities) is compared to the previous value and the
|
|
51
|
+
* baseline then advances to the current value;
|
|
52
|
+
* - a fresh CUMULATIVE field (bonding / bundled / snipers / fresh) advances its baseline ONLY when it fires, so
|
|
53
|
+
* gradual drift between fast pushes accumulates until it crosses the threshold instead of being lost.
|
|
54
|
+
*/
|
|
55
|
+
observe(obs) {
|
|
56
|
+
const t = this.thresholds;
|
|
57
|
+
const now = obs.at;
|
|
58
|
+
const prev = this.state.get(obs.mint) ?? { latest: {}, latestBool: {}, anchor: {} };
|
|
59
|
+
const next = { latest: { ...prev.latest }, latestBool: { ...prev.latestBool }, anchor: { ...prev.anchor } };
|
|
60
|
+
const out = [];
|
|
61
|
+
const mk = (kind, level, title, text, reading, value, delta) => {
|
|
62
|
+
out.push({ kind, mint: obs.mint, level, title, text, source: reading.source, dataAgeMs: Math.max(0, now - reading.fetchedAt), stale: false, value, delta, at: now });
|
|
63
|
+
return true;
|
|
64
|
+
};
|
|
65
|
+
const num = (key, reading, fire) => {
|
|
66
|
+
if (!reading || reading.value === null || !Number.isFinite(reading.value))
|
|
67
|
+
return;
|
|
68
|
+
const cur = reading.value;
|
|
69
|
+
const prevLatest = prev.latest[key];
|
|
70
|
+
const state = { value: cur, source: reading.source, fetchedAt: reading.fetchedAt };
|
|
71
|
+
const cumulative = CUMULATIVE.has(key);
|
|
72
|
+
if (!prevLatest) {
|
|
73
|
+
next.latest[key] = state;
|
|
74
|
+
if (cumulative)
|
|
75
|
+
next.anchor[key] = cur;
|
|
76
|
+
return;
|
|
77
|
+
} // first: baseline only
|
|
78
|
+
if (this.stale(reading, now))
|
|
79
|
+
return; // stale: keep the last fresh value, fire nothing, do not advance
|
|
80
|
+
next.latest[key] = state; // latest always tracks the newest fresh value
|
|
81
|
+
const anchor = cumulative ? (prev.anchor[key] ?? prevLatest.value) : prevLatest.value;
|
|
82
|
+
const fired = fire(anchor, cur, reading) === true;
|
|
83
|
+
if (cumulative && fired)
|
|
84
|
+
next.anchor[key] = cur; // cumulative anchor advances only when a signal fires
|
|
85
|
+
};
|
|
86
|
+
num('dev', obs.dev, (was, cur, reading) => was - cur >= t.devSellPct && mk('dev-sell', 'warn', 'dev sold', `creator sold — dev holding ${r1(was)}% → ${r1(cur)}%`, reading, r1(cur), r1(cur - was)));
|
|
87
|
+
num('top10', obs.top10, (was, cur, reading) => {
|
|
88
|
+
const d = cur - was;
|
|
89
|
+
return Math.abs(d) >= t.concentrationPct && mk('concentration', d > 0 ? 'warn' : 'info', d > 0 ? 'top-10 up' : 'top-10 down', `top-10 concentration ${r1(was)}% → ${r1(cur)}% (pools excluded)`, reading, r1(cur), r1(d));
|
|
90
|
+
});
|
|
91
|
+
num('lpLocked', obs.lpLocked, (was, cur, reading) => was - cur >= t.lpDropPct && mk('lp-unlock', 'down', 'LP unlocked', `LP locked dropped ${r1(was)}% → ${r1(cur)}%`, reading, r1(cur), r1(cur - was)));
|
|
92
|
+
num('liq', obs.liq, (was, cur, reading) => {
|
|
93
|
+
if (was > 0 && cur < was && (was - cur) / was >= t.liqDropFrac) {
|
|
94
|
+
const pct = Math.round(((was - cur) / was) * 100);
|
|
95
|
+
return mk('liquidity', 'down', 'liquidity fell', `liquidity fell ~${pct}% ($${fmtUsd(was)} → $${fmtUsd(cur)})`, reading, Math.round(cur), Math.round(cur - was));
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
});
|
|
99
|
+
num('bundled', obs.bundled, (was, cur, reading) => cur - was >= t.bundlePct && mk('bundle', 'warn', 'bundle up', `bundled supply ${r1(was)}% → ${r1(cur)}% of the top sample`, reading, r1(cur), r1(cur - was)));
|
|
100
|
+
num('snipers', obs.snipers, (was, cur, reading) => cur - was >= t.sniperCount && mk('sniper', 'warn', 'snipers up', `snipers ${Math.round(was)} → ${Math.round(cur)} in the launch window`, reading, Math.round(cur), Math.round(cur - was)));
|
|
101
|
+
num('fresh', obs.fresh, (was, cur, reading) => cur - was >= t.freshPct && mk('fresh-wallet', 'warn', 'fresh wallets', `fresh-at-buy wallets ${r1(was)}% → ${r1(cur)}% of the top sample`, reading, r1(cur), r1(cur - was)));
|
|
102
|
+
num('cluster', obs.cluster, () => false); // tracked for the rules field only; concentration covers the UI
|
|
103
|
+
num('bonding', obs.bonding, (was, cur, reading) => cur - was >= t.bondingStepPct && mk('bonding', 'info', 'bonding', `bonding curve ${r1(was)}% → ${r1(cur)}%`, reading, r1(cur), r1(cur - was)));
|
|
104
|
+
// --- authorities: a false→true flip is the risk (minting / freezing re-enabled); true→false is good news.
|
|
105
|
+
const auth = (key, reading, label, risk) => {
|
|
106
|
+
if (!reading || reading.present === null)
|
|
107
|
+
return;
|
|
108
|
+
const cur = reading.present;
|
|
109
|
+
const was = prev.latestBool[key];
|
|
110
|
+
const state = { value: cur, source: reading.source, fetchedAt: reading.fetchedAt };
|
|
111
|
+
if (!was) {
|
|
112
|
+
next.latestBool[key] = state;
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (this.stale(reading, now))
|
|
116
|
+
return;
|
|
117
|
+
if (was.value !== cur) {
|
|
118
|
+
if (cur)
|
|
119
|
+
mk('authority', 'warn', `${label} on`, `${label} re-enabled — ${risk}`, reading, 1, 1);
|
|
120
|
+
else
|
|
121
|
+
mk('authority', 'up', `${label} revoked`, `${label} revoked`, reading, 0, -1);
|
|
122
|
+
}
|
|
123
|
+
next.latestBool[key] = state;
|
|
124
|
+
};
|
|
125
|
+
auth('mintAuth', obs.mintAuth, 'mint authority', 'new supply can be minted');
|
|
126
|
+
auth('freezeAuth', obs.freezeAuth, 'freeze authority', 'transfers can be frozen');
|
|
127
|
+
// --- migration: once, on the false→true flip.
|
|
128
|
+
if (obs.migrated && obs.migrated.value !== null) {
|
|
129
|
+
const cur = obs.migrated.value;
|
|
130
|
+
const was = prev.latestBool.migrated;
|
|
131
|
+
const state = { value: cur, source: obs.migrated.source, fetchedAt: obs.migrated.fetchedAt };
|
|
132
|
+
if (!was) {
|
|
133
|
+
next.latestBool.migrated = state;
|
|
134
|
+
}
|
|
135
|
+
else if (!this.stale(obs.migrated, now)) {
|
|
136
|
+
if (!was.value && cur)
|
|
137
|
+
mk('migrated', 'info', 'migrated', 'migrated to a DEX pool — bonding curve closed', obs.migrated, 1, 1);
|
|
138
|
+
next.latestBool.migrated = state;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
this.state.set(obs.mint, next);
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
/** The latest-known numeric fields for a mint, for the rules engine (null when never observed). */
|
|
145
|
+
fields(mint) {
|
|
146
|
+
const s = this.state.get(mint);
|
|
147
|
+
const n = (x) => (x ? x.value : null);
|
|
148
|
+
const b = (x) => (x ? (x.value ? 1 : 0) : null);
|
|
149
|
+
return {
|
|
150
|
+
top10: n(s?.latest.top10), dev: n(s?.latest.dev), bundled: n(s?.latest.bundled), snipers: n(s?.latest.snipers), fresh: n(s?.latest.fresh),
|
|
151
|
+
cluster: n(s?.latest.cluster), lpLocked: n(s?.latest.lpLocked), bonding: n(s?.latest.bonding),
|
|
152
|
+
mintable: b(s?.latestBool.mintAuth), freezable: b(s?.latestBool.freezeAuth),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/** A per-field snapshot with age + stale for the UI (null source = never observed). */
|
|
156
|
+
snapshot(mint, now) {
|
|
157
|
+
const s = this.state.get(mint);
|
|
158
|
+
const fromNum = (x) => this.snap(x, now);
|
|
159
|
+
const fromBool = (x) => (x ? { value: x.value ? 1 : 0, source: x.source, ageMs: Math.max(0, now - x.fetchedAt), stale: now - x.fetchedAt > this.thresholds.staleAfterMs } : { value: null, source: null, ageMs: null, stale: false });
|
|
160
|
+
return {
|
|
161
|
+
top10: fromNum(s?.latest.top10), dev: fromNum(s?.latest.dev), bundled: fromNum(s?.latest.bundled), snipers: fromNum(s?.latest.snipers),
|
|
162
|
+
fresh: fromNum(s?.latest.fresh), cluster: fromNum(s?.latest.cluster), lpLocked: fromNum(s?.latest.lpLocked), bonding: fromNum(s?.latest.bonding),
|
|
163
|
+
liq: fromNum(s?.latest.liq), mintable: fromBool(s?.latestBool.mintAuth), freezable: fromBool(s?.latestBool.freezeAuth), migrated: fromBool(s?.latestBool.migrated),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
snap(x, now) {
|
|
167
|
+
if (!x)
|
|
168
|
+
return { value: null, source: null, ageMs: null, stale: false };
|
|
169
|
+
return { value: x.value, source: x.source, ageMs: Math.max(0, now - x.fetchedAt), stale: now - x.fetchedAt > this.thresholds.staleAfterMs };
|
|
170
|
+
}
|
|
171
|
+
/** Drop a mint's baseline (closed token the UI no longer tracks). */
|
|
172
|
+
forget(mint) { this.state.delete(mint); }
|
|
173
|
+
/** Known mints (for hygiene / tests). */
|
|
174
|
+
tracked() { return [...this.state.keys()]; }
|
|
175
|
+
}
|
|
176
|
+
function fmtUsd(n) {
|
|
177
|
+
const a = Math.abs(n);
|
|
178
|
+
if (a >= 1e9)
|
|
179
|
+
return `${r1(n / 1e9)}B`;
|
|
180
|
+
if (a >= 1e6)
|
|
181
|
+
return `${r1(n / 1e6)}M`;
|
|
182
|
+
if (a >= 1e3)
|
|
183
|
+
return `${r1(n / 1e3)}K`;
|
|
184
|
+
return String(Math.round(n));
|
|
185
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// capped auto-mirror copy mandate (Tier 3). Personal, self-directed, non-custodial; paper/devnet only; nothing
|
|
3
3
|
// here signs, holds a key, or arms anything without the plan engine's own keypress gate.
|
|
4
4
|
export { SOL_LEG_MIN_LAMPORTS, tokenDeltasForOwner, lamportsDeltaFor, decodeTx, decodeWalletTrades } from "./trades.js";
|
|
5
|
-
export { WIN_RATE_MIN_N, positionsOf, earlyEntryScore, walletStats } from "./stats.js";
|
|
5
|
+
export { WIN_RATE_MIN_N, positionsOf, earlyEntryScore, walletStats, fmtHoldMs } from "./stats.js";
|
|
6
6
|
export { FOLLOW_NAME_MAX, FOLLOWS_MAX, defaultFollowsPath, isWalletAddress, cleanFollowName, FollowStore, shortAddr } from "./follows.js";
|
|
7
7
|
export { WalletTracker, TRACKER_DEFAULTS } from "./tracker.js";
|
|
8
8
|
export { MIRROR_LIMITS, leaderFillPriceUsd, buildMirror, leaderSoldSince } from "./mirror.js";
|
|
@@ -17,12 +17,13 @@ export function positionsOf(trades) {
|
|
|
17
17
|
const delta = BigInt(tr.tokenDelta);
|
|
18
18
|
let p = pos.get(tr.mint);
|
|
19
19
|
if (!p) {
|
|
20
|
-
p = { mint: tr.mint, tokensRaw: 0n, peakRaw: 0n, costSol: 0, realisedSol: 0, buys: 0, sells: 0, transfers: 0, flagged: false, closed: false, firstT: tr.t, lastT: tr.t };
|
|
20
|
+
p = { mint: tr.mint, tokensRaw: 0n, peakRaw: 0n, costSol: 0, realisedSol: 0, buys: 0, sells: 0, transfers: 0, flagged: false, closed: false, firstT: tr.t, lastT: tr.t, firstKnown: tr.tKnown, lastKnown: tr.tKnown, holdMs: null };
|
|
21
21
|
pos.set(tr.mint, p);
|
|
22
22
|
}
|
|
23
23
|
const L = lots.get(tr.mint) ?? [];
|
|
24
24
|
lots.set(tr.mint, L);
|
|
25
25
|
p.lastT = tr.t;
|
|
26
|
+
p.lastKnown = tr.tKnown;
|
|
26
27
|
if (delta > 0n) {
|
|
27
28
|
// a buy with a SOL leg carries cost; a token-swap leg or an airdrop is cost 0 and flagged
|
|
28
29
|
const cost = tr.side === 'buy' && tr.solDelta !== null ? Math.abs(tr.solDelta) : 0;
|
|
@@ -76,8 +77,34 @@ export function positionsOf(trades) {
|
|
|
76
77
|
}
|
|
77
78
|
p.closed = closedNow(p);
|
|
78
79
|
}
|
|
80
|
+
// hold time = first buy → last sell, only trustworthy for a CLOSED position whose first+last block times are both real
|
|
81
|
+
for (const p of pos.values())
|
|
82
|
+
p.holdMs = p.closed && p.firstKnown && p.lastKnown && p.lastT > p.firstT ? p.lastT - p.firstT : null;
|
|
79
83
|
return [...pos.values()].sort((a, b) => b.lastT - a.lastT);
|
|
80
84
|
}
|
|
85
|
+
/** Compact human hold time: 45s · 12m · 3.2h · 2.1d. null → '—'. */
|
|
86
|
+
export function fmtHoldMs(ms) {
|
|
87
|
+
if (ms === null)
|
|
88
|
+
return '—';
|
|
89
|
+
const s = ms / 1000;
|
|
90
|
+
if (s < 90)
|
|
91
|
+
return `${Math.round(s)}s`;
|
|
92
|
+
const m = s / 60;
|
|
93
|
+
if (m < 90)
|
|
94
|
+
return `${Math.round(m)}m`;
|
|
95
|
+
const h = m / 60;
|
|
96
|
+
if (h < 48)
|
|
97
|
+
return `${h.toFixed(1)}h`;
|
|
98
|
+
return `${(h / 24).toFixed(1)}d`;
|
|
99
|
+
}
|
|
100
|
+
/** Median over the numbers (already finite); undefined on an empty list. */
|
|
101
|
+
function median(xs) {
|
|
102
|
+
if (!xs.length)
|
|
103
|
+
return undefined;
|
|
104
|
+
const s = [...xs].sort((a, b) => a - b);
|
|
105
|
+
const mid = Math.floor(s.length / 2);
|
|
106
|
+
return s.length % 2 ? s[mid] : (s[mid - 1] + s[mid]) / 2;
|
|
107
|
+
}
|
|
81
108
|
/** Early-entry score = median over tokens of (1 − rank / buyers); null without ranks (design §4.3). */
|
|
82
109
|
export function earlyEntryScore(inputs) {
|
|
83
110
|
const xs = inputs.filter((e) => e.buyers > 0 && e.rank >= 0 && e.rank < e.buyers).map((e) => 1 - e.rank / e.buyers).sort((a, b) => a - b);
|
|
@@ -96,6 +123,11 @@ export function walletStats(wallet, trades, opts = {}) {
|
|
|
96
123
|
const ts = trades.map((t) => t.t).filter((t) => t > 0);
|
|
97
124
|
const winRate = closed.length >= WIN_RATE_MIN_N ? wins / closed.length : null;
|
|
98
125
|
const txs = opts.txs ?? new Set(trades.map((t) => t.sig)).size;
|
|
126
|
+
const holds = closed.map((p) => p.holdMs).filter((m) => m !== null);
|
|
127
|
+
const holdMedianMs = median(holds) ?? null;
|
|
128
|
+
const holdNote = holdMedianMs === null
|
|
129
|
+
? (closed.length ? `no closed position with both block times known (${closed.length} closed)` : 'no closed positions yet')
|
|
130
|
+
: `median first-buy→last-sell over ${holds.length} closed position${holds.length === 1 ? '' : 's'} with known times`;
|
|
99
131
|
return {
|
|
100
132
|
wallet,
|
|
101
133
|
trades: trades.length,
|
|
@@ -112,9 +144,11 @@ export function walletStats(wallet, trades, opts = {}) {
|
|
|
112
144
|
winRateNote: closed.length >= WIN_RATE_MIN_N ? `${wins}/${closed.length} closed` : `hidden under n=${WIN_RATE_MIN_N} (${wins}/${closed.length} closed so far)`,
|
|
113
145
|
open: positions.length - closed.length,
|
|
114
146
|
earlyEntry: earlyEntryScore(opts.earlyEntry ?? []),
|
|
147
|
+
holdMedianMs,
|
|
148
|
+
holdNote,
|
|
115
149
|
positions,
|
|
116
150
|
firstT: ts.length ? Math.min(...ts) : null,
|
|
117
151
|
lastT: ts.length ? Math.max(...ts) : null,
|
|
118
|
-
sample: { txs, complete: !!opts.complete, note: opts.complete ? `all ${txs} txs` : `last ${txs} txs only · older history not fetched
|
|
152
|
+
sample: { txs, complete: !!opts.complete, note: opts.complete ? `all ${txs} txs` : `last ${txs} txs only · older history not fetched`, source: 'helius-history', asOf: opts.asOf ?? null },
|
|
119
153
|
};
|
|
120
154
|
}
|
|
@@ -63,7 +63,7 @@ export class WalletTracker {
|
|
|
63
63
|
alerts(limit = 50) { return this.alertLog.slice(-limit).reverse(); }
|
|
64
64
|
stats(addr) {
|
|
65
65
|
const w = this.wallets.get(addr);
|
|
66
|
-
return walletStats(addr, w?.trades ?? [], { solUsd: this.solUsd(), txs: w?.txs ?? 0, complete: w?.complete ?? false, earlyEntry: this.earlyEntry(addr) });
|
|
66
|
+
return walletStats(addr, w?.trades ?? [], { solUsd: this.solUsd(), txs: w?.txs ?? 0, complete: w?.complete ?? false, earlyEntry: this.earlyEntry(addr), asOf: w?.asOf ?? null });
|
|
67
67
|
}
|
|
68
68
|
/** Per-wallet poll error (shown on the row), null when the last poll was clean. */
|
|
69
69
|
walletError(addr) { return this.wallets.get(addr)?.error ?? null; }
|
|
@@ -89,11 +89,12 @@ export class WalletTracker {
|
|
|
89
89
|
for (const f of this.follows.list()) {
|
|
90
90
|
let w = this.wallets.get(f.addr);
|
|
91
91
|
if (!w) {
|
|
92
|
-
w = { primed: false, seen: new Set(), trades: [], txs: 0, complete: false, lastSlot: 0, error: null };
|
|
92
|
+
w = { primed: false, seen: new Set(), trades: [], txs: 0, complete: false, lastSlot: 0, error: null, asOf: null };
|
|
93
93
|
this.wallets.set(f.addr, w);
|
|
94
94
|
}
|
|
95
95
|
try {
|
|
96
96
|
const page = await this.history.transactions(f.addr, { limit: w.primed ? this.pageLimit : this.backfillLimit, sortOrder: 'desc' });
|
|
97
|
+
w.asOf = page.fetchedAt;
|
|
97
98
|
const fresh = page.data.filter((tx) => { const s = tx.transaction?.signatures?.[0]; return !!s && !w.seen.has(s); });
|
|
98
99
|
for (const tx of fresh)
|
|
99
100
|
w.seen.add(tx.transaction.signatures[0]);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: app-help-command
|
|
3
|
+
title: Get help on how dexterm works (dexterm help)
|
|
4
|
+
kind: app-help
|
|
5
|
+
screen: all
|
|
6
|
+
feature: app-help
|
|
7
|
+
tags:
|
|
8
|
+
- app-help
|
|
9
|
+
- help
|
|
10
|
+
- how
|
|
11
|
+
- topic
|
|
12
|
+
- topics
|
|
13
|
+
- guide
|
|
14
|
+
- manual
|
|
15
|
+
- docs
|
|
16
|
+
- commands
|
|
17
|
+
commands:
|
|
18
|
+
- help
|
|
19
|
+
flags:
|
|
20
|
+
- --help
|
|
21
|
+
confidence: high
|
|
22
|
+
owner: maintainers
|
|
23
|
+
origin: app-help-generated
|
|
24
|
+
reviewed_by: generated@2026-10-16
|
|
25
|
+
generated_from: dexterm/app keymap + overlay + mcp tools + cli (task-1413)
|
|
26
|
+
sources:
|
|
27
|
+
- packages/tui/src/keymap.ts
|
|
28
|
+
- packages/cli/src/main.ts
|
|
29
|
+
- packages/mcp/src/server.ts
|
|
30
|
+
date: 2026-10-16
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
`dexterm help [topic]` answers "how do I ..." from the generated app-help knowledge base — the same entries the analyst's `app_help` tool uses, so they cannot drift from the app. `dexterm help` lists the topics; `dexterm help <topic|key|command>` prints the matching entry with the exact key or command. `--help` (or `-h`) on any command prints its usage. The analyst searches app-help first and never invents a key.
|
|
34
|
+
|
|
35
|
+
CLI: `dexterm help`.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ask-the-analyst
|
|
3
|
+
title: Ask the analyst a question
|
|
4
|
+
kind: app-help
|
|
5
|
+
screen: analyst
|
|
6
|
+
feature: analyst
|
|
7
|
+
tags:
|
|
8
|
+
- app-help
|
|
9
|
+
- analyst
|
|
10
|
+
- ask
|
|
11
|
+
- claude
|
|
12
|
+
- ai
|
|
13
|
+
- question
|
|
14
|
+
- dossier
|
|
15
|
+
- chat
|
|
16
|
+
keys:
|
|
17
|
+
- a
|
|
18
|
+
- enter
|
|
19
|
+
actions:
|
|
20
|
+
- analyst.toggle
|
|
21
|
+
- open
|
|
22
|
+
flags:
|
|
23
|
+
- --no-ai
|
|
24
|
+
tools:
|
|
25
|
+
- get_dossier
|
|
26
|
+
- kb_search
|
|
27
|
+
- app_help
|
|
28
|
+
- case_lookup
|
|
29
|
+
confidence: high
|
|
30
|
+
owner: maintainers
|
|
31
|
+
origin: app-help-generated
|
|
32
|
+
reviewed_by: generated@2026-10-16
|
|
33
|
+
generated_from: dexterm/app keymap + overlay + mcp tools + cli (task-1413)
|
|
34
|
+
sources:
|
|
35
|
+
- packages/tui/src/keymap.ts
|
|
36
|
+
- packages/cli/src/main.ts
|
|
37
|
+
- packages/mcp/src/server.ts
|
|
38
|
+
date: 2026-10-16
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
The analyst is your own `claude` login. ⏎ on a coin runs a full dossier; `a` runs a rug-check (or a trench-scan of the screener when nothing is selected). Type a follow-up and ⏎ to send. If `claude` is missing or logged out the panel shows the one-line fix and the rest of dexterm keeps working. Start without AI using `--no-ai`.
|
|
42
|
+
|
|
43
|
+
Keys: `a`, `⏎` (screener).
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: backtest
|
|
3
|
+
title: Backtest the rug model or skills
|
|
4
|
+
kind: app-help
|
|
5
|
+
screen: all
|
|
6
|
+
feature: skill-backtest
|
|
7
|
+
tags:
|
|
8
|
+
- app-help
|
|
9
|
+
- backtest
|
|
10
|
+
- eval
|
|
11
|
+
- accuracy
|
|
12
|
+
- model
|
|
13
|
+
- metrics
|
|
14
|
+
- history
|
|
15
|
+
commands:
|
|
16
|
+
- backtest
|
|
17
|
+
tools:
|
|
18
|
+
- rug_backtest
|
|
19
|
+
confidence: high
|
|
20
|
+
owner: maintainers
|
|
21
|
+
origin: app-help-generated
|
|
22
|
+
reviewed_by: generated@2026-10-16
|
|
23
|
+
generated_from: dexterm/app keymap + overlay + mcp tools + cli (task-1413)
|
|
24
|
+
sources:
|
|
25
|
+
- packages/tui/src/keymap.ts
|
|
26
|
+
- packages/cli/src/main.ts
|
|
27
|
+
- packages/mcp/src/server.ts
|
|
28
|
+
date: 2026-10-16
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
`dexterm backtest --subject heuristic|skills|larp|pack_verdicts` scores a subject against the recorder's outcome-labelled history and prints honest metrics (precision/recall, Brier vs base rate, AUC, calibration) with leakage checks. With no labelled outcomes it says so and prints no metrics rather than fabricating any.
|
|
32
|
+
|
|
33
|
+
CLI: `dexterm backtest`.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: bubble-map
|
|
3
|
+
title: Open the bubble map
|
|
4
|
+
kind: app-help
|
|
5
|
+
screen: token
|
|
6
|
+
feature: bubble-map
|
|
7
|
+
tags:
|
|
8
|
+
- app-help
|
|
9
|
+
- bubble
|
|
10
|
+
- bubbles
|
|
11
|
+
- map
|
|
12
|
+
- cluster
|
|
13
|
+
- clusters
|
|
14
|
+
- holders
|
|
15
|
+
- wallets
|
|
16
|
+
- cabal
|
|
17
|
+
keys:
|
|
18
|
+
- M
|
|
19
|
+
actions:
|
|
20
|
+
- intel.bubbles
|
|
21
|
+
confidence: high
|
|
22
|
+
owner: maintainers
|
|
23
|
+
origin: app-help-generated
|
|
24
|
+
reviewed_by: generated@2026-10-16
|
|
25
|
+
generated_from: dexterm/app keymap + overlay + mcp tools + cli (task-1413)
|
|
26
|
+
sources:
|
|
27
|
+
- packages/tui/src/keymap.ts
|
|
28
|
+
- packages/cli/src/main.ts
|
|
29
|
+
- packages/mcp/src/server.ts
|
|
30
|
+
date: 2026-10-16
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
Press `M` on a token to open the BUBBLE MAP: top holders as discs (area = share of supply, colour = the rule that labelled the wallet), linked-cluster rings, a CLUSTERS table and a WHY THIS LABEL panel. Keyless it uses the public holder list with static labels; a free Helius key adds funders and the launch window.
|
|
34
|
+
|
|
35
|
+
Keys: `M` (token).
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: calm-mode
|
|
3
|
+
title: Turn on calm mode (effects off)
|
|
4
|
+
kind: app-help
|
|
5
|
+
screen: all
|
|
6
|
+
feature: look
|
|
7
|
+
tags:
|
|
8
|
+
- app-help
|
|
9
|
+
- calm
|
|
10
|
+
- effects
|
|
11
|
+
- rain
|
|
12
|
+
- glitch
|
|
13
|
+
- quiet
|
|
14
|
+
- still
|
|
15
|
+
- intensity
|
|
16
|
+
flags:
|
|
17
|
+
- --calm
|
|
18
|
+
- --intensity
|
|
19
|
+
confidence: high
|
|
20
|
+
owner: maintainers
|
|
21
|
+
origin: app-help-generated
|
|
22
|
+
reviewed_by: generated@2026-10-16
|
|
23
|
+
generated_from: dexterm/app keymap + overlay + mcp tools + cli (task-1413)
|
|
24
|
+
sources:
|
|
25
|
+
- packages/tui/src/keymap.ts
|
|
26
|
+
- packages/cli/src/main.ts
|
|
27
|
+
- packages/mcp/src/server.ts
|
|
28
|
+
date: 2026-10-16
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
Press `c` to toggle calm mode: rain, glitch, blink and scanlines off, back to the last intensity when pressed again. Start calm with `--calm` (or `DEXTERM_CALM=1`); `--intensity normal|fever|off` picks a tier. The analyst can toggle calm for you.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: change-voice-speed
|
|
3
|
+
title: Change the voice speed (rate)
|
|
4
|
+
kind: app-help
|
|
5
|
+
screen: all
|
|
6
|
+
feature: jarvis
|
|
7
|
+
tags:
|
|
8
|
+
- app-help
|
|
9
|
+
- voice
|
|
10
|
+
- speed
|
|
11
|
+
- rate
|
|
12
|
+
- faster
|
|
13
|
+
- slower
|
|
14
|
+
- wpm
|
|
15
|
+
commands:
|
|
16
|
+
- voice
|
|
17
|
+
confidence: high
|
|
18
|
+
owner: maintainers
|
|
19
|
+
origin: app-help-generated
|
|
20
|
+
reviewed_by: generated@2026-10-16
|
|
21
|
+
generated_from: dexterm/app keymap + overlay + mcp tools + cli (task-1413)
|
|
22
|
+
sources:
|
|
23
|
+
- packages/tui/src/keymap.ts
|
|
24
|
+
- packages/cli/src/main.ts
|
|
25
|
+
- packages/mcp/src/server.ts
|
|
26
|
+
date: 2026-10-16
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
Voice speed is `voice.rate` in `~/.dexterm/config.json` (words per minute, 80–400). Edit it there and restart. Voice settings are yours alone: the analyst/agent CANNOT change them (the voice path is denied to models) — only you set them. `dexterm voice status` shows the current voice engines.
|
|
30
|
+
|
|
31
|
+
CLI: `dexterm voice`.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: change-voice
|
|
3
|
+
title: Change which voice speaks
|
|
4
|
+
kind: app-help
|
|
5
|
+
screen: all
|
|
6
|
+
feature: jarvis
|
|
7
|
+
tags:
|
|
8
|
+
- app-help
|
|
9
|
+
- voice
|
|
10
|
+
- choose
|
|
11
|
+
- speak
|
|
12
|
+
- say
|
|
13
|
+
- name
|
|
14
|
+
commands:
|
|
15
|
+
- voice
|
|
16
|
+
confidence: high
|
|
17
|
+
owner: maintainers
|
|
18
|
+
origin: app-help-generated
|
|
19
|
+
reviewed_by: generated@2026-10-16
|
|
20
|
+
generated_from: dexterm/app keymap + overlay + mcp tools + cli (task-1413)
|
|
21
|
+
sources:
|
|
22
|
+
- packages/tui/src/keymap.ts
|
|
23
|
+
- packages/cli/src/main.ts
|
|
24
|
+
- packages/mcp/src/server.ts
|
|
25
|
+
date: 2026-10-16
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
The default speaking voice is the neural Piper voice once it is set up (`dexterm voice setup`), with the built-in macOS `say` as the fallback. Press `,` to cycle the `say` voice while running, or set `voice.name` in `~/.dexterm/config.json` (that chooses the `say` fallback voice; Piper has one fixed voice). Nothing is sent to a paid API. Voice is user-only: the analyst/agent cannot change it (the voice path is denied to models) — only the keyboard or your config sets it.
|
|
29
|
+
|
|
30
|
+
CLI: `dexterm voice`.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: chart-popup-selftest
|
|
3
|
+
title: Run the popup self-test (dexterm popup --self-test)
|
|
4
|
+
kind: app-help
|
|
5
|
+
screen: all
|
|
6
|
+
feature: popup-selftest
|
|
7
|
+
tags:
|
|
8
|
+
- app-help
|
|
9
|
+
- self-test
|
|
10
|
+
- selftest
|
|
11
|
+
- test
|
|
12
|
+
- shell
|
|
13
|
+
- fps
|
|
14
|
+
- diagnose
|
|
15
|
+
- hotkey
|
|
16
|
+
commands:
|
|
17
|
+
- popup
|
|
18
|
+
confidence: high
|
|
19
|
+
owner: maintainers
|
|
20
|
+
origin: app-help-generated
|
|
21
|
+
reviewed_by: generated@2026-10-16
|
|
22
|
+
generated_from: dexterm/app keymap + overlay + mcp tools + cli (task-1413)
|
|
23
|
+
sources:
|
|
24
|
+
- packages/tui/src/keymap.ts
|
|
25
|
+
- packages/cli/src/main.ts
|
|
26
|
+
- packages/mcp/src/server.ts
|
|
27
|
+
date: 2026-10-16
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
`dexterm popup --self-test [--browser] [--seconds N] [--theme NAME]` opens a chart popup on fixture data and reports the shell, hotkey and fps it can measure headlessly, labelling what still needs a human at an unlocked Mac. In-app, open the popup for real with `C` on the token screen (see "Open the chart popup").
|
|
31
|
+
|
|
32
|
+
CLI: `dexterm popup`.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: coin-images
|
|
3
|
+
title: Turn coin images on or off
|
|
4
|
+
kind: app-help
|
|
5
|
+
screen: all
|
|
6
|
+
feature: coin-images
|
|
7
|
+
tags:
|
|
8
|
+
- app-help
|
|
9
|
+
- images
|
|
10
|
+
- image
|
|
11
|
+
- pictures
|
|
12
|
+
- icons
|
|
13
|
+
- logos
|
|
14
|
+
- off
|
|
15
|
+
flags:
|
|
16
|
+
- --no-images
|
|
17
|
+
confidence: high
|
|
18
|
+
owner: maintainers
|
|
19
|
+
origin: app-help-generated
|
|
20
|
+
reviewed_by: generated@2026-10-16
|
|
21
|
+
generated_from: dexterm/app keymap + overlay + mcp tools + cli (task-1413)
|
|
22
|
+
sources:
|
|
23
|
+
- packages/tui/src/keymap.ts
|
|
24
|
+
- packages/cli/src/main.ts
|
|
25
|
+
- packages/mcp/src/server.ts
|
|
26
|
+
date: 2026-10-16
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
Coin pictures render as real pixels in image-capable terminals (kitty/iTerm2/sixel) and as block art everywhere else. Turn them off with `--no-images` (or `DEXTERM_IMAGES=0`, or `enabled:false` in `~/.dexterm/images.json`). `dexterm doctor` has a Coin images line that says which path you get.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: configure-rpc-key
|
|
3
|
+
title: Configure a Helius / RPC key for holders
|
|
4
|
+
kind: app-help
|
|
5
|
+
screen: all
|
|
6
|
+
feature: keyless
|
|
7
|
+
tags:
|
|
8
|
+
- app-help
|
|
9
|
+
- helius
|
|
10
|
+
- rpc
|
|
11
|
+
- key
|
|
12
|
+
- holders
|
|
13
|
+
- free
|
|
14
|
+
- api
|
|
15
|
+
- ranked
|
|
16
|
+
confidence: high
|
|
17
|
+
owner: maintainers
|
|
18
|
+
origin: app-help-generated
|
|
19
|
+
reviewed_by: generated@2026-10-16
|
|
20
|
+
generated_from: dexterm/app keymap + overlay + mcp tools + cli (task-1413)
|
|
21
|
+
sources:
|
|
22
|
+
- packages/tui/src/keymap.ts
|
|
23
|
+
- packages/cli/src/main.ts
|
|
24
|
+
- packages/mcp/src/server.ts
|
|
25
|
+
date: 2026-10-16
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
dexterm is free-forever and keyless by default. The one real keyless gap is the ranked top-holder list: add a free RPC key for it. Save a Helius key ONLY at `~/.dexterm/helius.key` (mode 600, never a repo or command line), or set `DEXTERM_RPC_URL` to any read-only RPC. `dexterm doctor` prints the exact command. Without a key the holders panel shows count + top-10% via Jupiter.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: connect-an-agent-registry
|
|
3
|
+
title: Manage connected agents (dexterm agent)
|
|
4
|
+
kind: app-help
|
|
5
|
+
screen: all
|
|
6
|
+
feature: mcp
|
|
7
|
+
tags:
|
|
8
|
+
- app-help
|
|
9
|
+
- agent
|
|
10
|
+
- agents
|
|
11
|
+
- registry
|
|
12
|
+
- tier
|
|
13
|
+
- pause
|
|
14
|
+
- resume
|
|
15
|
+
- kick
|
|
16
|
+
- audit
|
|
17
|
+
- bus
|
|
18
|
+
- serve
|
|
19
|
+
commands:
|
|
20
|
+
- agent
|
|
21
|
+
confidence: high
|
|
22
|
+
owner: maintainers
|
|
23
|
+
origin: app-help-generated
|
|
24
|
+
reviewed_by: generated@2026-10-16
|
|
25
|
+
generated_from: dexterm/app keymap + overlay + mcp tools + cli (task-1413)
|
|
26
|
+
sources:
|
|
27
|
+
- packages/tui/src/keymap.ts
|
|
28
|
+
- packages/cli/src/main.ts
|
|
29
|
+
- packages/mcp/src/server.ts
|
|
30
|
+
date: 2026-10-16
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
`dexterm agent add|list|rotate|remove|tier|pause|resume|kick|audit|packs` manages your bring-your-own-agent registry and the loopback bus; `dexterm agent serve` runs a standalone bus on fixtures and `connect` attaches one. Every agent is untrusted and read-only: it can never sign, arm, raise a cap, touch keys or change network settings.
|
|
34
|
+
|
|
35
|
+
CLI: `dexterm agent`.
|