dexterm-cli 0.1.7 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/packages/agents/src/spectator.js +31 -3
- package/dist/packages/agents/src/tiers.js +12 -0
- package/dist/packages/agents/src/tools.js +13 -5
- package/dist/packages/autotrade/assets/limits.schema.json +569 -0
- package/dist/packages/autotrade/examples/executor/README.md +70 -0
- package/dist/packages/autotrade/examples/executor/jsonl-tail-executor.mjs +57 -0
- package/dist/packages/autotrade/examples/executor/kit.mjs +144 -0
- package/dist/packages/autotrade/examples/executor/signal-cmd-executor.mjs +25 -0
- package/dist/packages/autotrade/examples/executor/telegram-bot-recipe.md +47 -0
- package/dist/packages/autotrade/examples/executor/webhook-executor.mjs +47 -0
- package/dist/packages/autotrade/src/backtest.js +7 -2
- package/dist/packages/autotrade/src/chat/config.js +4 -2
- package/dist/packages/autotrade/src/chat/control.js +1 -0
- package/dist/packages/autotrade/src/chat/notify.js +16 -6
- package/dist/packages/autotrade/src/chat/secrets.js +25 -18
- package/dist/packages/autotrade/src/chat/service.js +3 -0
- package/dist/packages/autotrade/src/engine.js +16 -2
- package/dist/packages/autotrade/src/executor-health.js +217 -0
- package/dist/packages/autotrade/src/fleet.js +5 -2
- package/dist/packages/autotrade/src/forward.js +355 -0
- package/dist/packages/autotrade/src/index.js +21 -0
- package/dist/packages/autotrade/src/journey.js +477 -0
- package/dist/packages/autotrade/src/limits.js +682 -0
- package/dist/packages/autotrade/src/outbox.js +394 -0
- package/dist/packages/autotrade/src/paper-limits.js +87 -0
- package/dist/packages/autotrade/src/real-mode.js +688 -0
- package/dist/packages/autotrade/src/receipts.js +330 -0
- package/dist/packages/autotrade/src/report.js +168 -0
- package/dist/packages/autotrade/src/rugproof-probe.js +415 -0
- package/dist/packages/autotrade/src/rugproof.js +231 -0
- package/dist/packages/autotrade/src/runner.js +194 -28
- package/dist/packages/autotrade/src/service-guard.js +125 -0
- package/dist/packages/autotrade/src/service-install.js +215 -0
- package/dist/packages/autotrade/src/service-recover.js +232 -0
- package/dist/packages/autotrade/src/service.js +289 -0
- package/dist/packages/autotrade/src/sessions.js +16 -7
- package/dist/packages/autotrade/src/signal-channels.js +312 -0
- package/dist/packages/autotrade/src/signal.js +196 -0
- package/dist/packages/autotrade/src/strategy-stats.js +344 -0
- package/dist/packages/autotrade/src/strategy.js +15 -2
- package/dist/packages/autotrade/src/trade-ledger.js +2 -2
- package/dist/packages/classifier/src/calibrate.js +138 -0
- package/dist/packages/classifier/src/classify.js +107 -0
- package/dist/packages/classifier/src/config.js +220 -0
- package/dist/packages/classifier/src/dossier.js +95 -0
- package/dist/packages/classifier/src/hardware.js +63 -0
- package/dist/packages/classifier/src/index.js +18 -0
- package/dist/packages/classifier/src/models.js +111 -0
- package/dist/packages/classifier/src/providers/heuristic.js +77 -0
- package/dist/packages/classifier/src/providers/http.js +63 -0
- package/dist/packages/classifier/src/providers/jev-open.js +86 -0
- package/dist/packages/classifier/src/providers/llm.js +89 -0
- package/dist/packages/classifier/src/providers/systemone-http.js +95 -0
- package/dist/packages/classifier/src/questions.js +97 -0
- package/dist/packages/classifier/src/registry.js +42 -0
- package/dist/packages/classifier/src/snapshot.js +31 -0
- package/dist/packages/classifier/src/systemone.js +88 -0
- package/dist/packages/classifier/src/types.js +18 -0
- package/dist/packages/cli/assets/dash/dash.css +139 -0
- package/dist/packages/cli/assets/dash/dash.js +200 -0
- package/dist/packages/cli/assets/dash/icon.svg +1 -0
- package/dist/packages/cli/assets/dash/index.html +36 -0
- package/dist/packages/cli/src/analyst/backend.js +3 -2
- package/dist/packages/cli/src/analyst/codex.js +3 -2
- package/dist/packages/cli/src/app-help-gen.js +26 -2
- package/dist/packages/cli/src/autotrade-cmd/audit.js +19 -2
- package/dist/packages/cli/src/autotrade-cmd/backtest.js +21 -4
- package/dist/packages/cli/src/autotrade-cmd/executor.js +91 -0
- package/dist/packages/cli/src/autotrade-cmd/fleet.js +16 -5
- package/dist/packages/cli/src/autotrade-cmd/forward.js +283 -0
- package/dist/packages/cli/src/autotrade-cmd/journey.js +208 -0
- package/dist/packages/cli/src/autotrade-cmd/limits.js +393 -0
- package/dist/packages/cli/src/autotrade-cmd/receipt.js +63 -0
- package/dist/packages/cli/src/autotrade-cmd/report.js +79 -0
- package/dist/packages/cli/src/autotrade-cmd/run.js +268 -14
- package/dist/packages/cli/src/autotrade-cmd/service.js +873 -0
- package/dist/packages/cli/src/autotrade-cmd/signal.js +824 -0
- package/dist/packages/cli/src/autotrade-cmd.js +50 -4
- package/dist/packages/cli/src/classifier-cmd.js +353 -0
- package/dist/packages/cli/src/classifier-live.js +81 -0
- package/dist/packages/cli/src/dash/data.js +217 -0
- package/dist/packages/cli/src/dash/server.js +92 -0
- package/dist/packages/cli/src/dash-cmd.js +113 -0
- package/dist/packages/cli/src/doctor.js +34 -0
- package/dist/packages/cli/src/ledger-cmd.js +4 -2
- package/dist/packages/cli/src/live/screens/token-live.js +4 -0
- package/dist/packages/cli/src/live/signals.js +8 -0
- package/dist/packages/cli/src/main.js +98 -6
- package/dist/packages/cli/src/mcp-follow.js +21 -1
- package/dist/packages/cli/src/narratives-cmd.js +147 -0
- package/dist/packages/cli/src/narratives.js +114 -0
- package/dist/packages/cli/src/overlay/model.js +147 -0
- package/dist/packages/cli/src/overlay/page.js +146 -0
- package/dist/packages/cli/src/overlay/pnl.js +75 -0
- package/dist/packages/cli/src/overlay/server.js +170 -0
- package/dist/packages/cli/src/overlay-cmd.js +367 -0
- package/dist/packages/cli/src/pnl-card.js +4 -0
- package/dist/packages/cli/src/record-cmd.js +82 -11
- package/dist/packages/cli/src/rules-cmd.js +2 -1
- package/dist/packages/cli/src/rules.js +24 -4
- package/dist/packages/cli/src/screens/autotrade-journey.js +134 -0
- package/dist/packages/cli/src/screens/autotrade-keys.js +13 -0
- package/dist/packages/cli/src/screens/autotrade-screen.js +57 -6
- package/dist/packages/cli/src/screens/autotrade-ui.js +17 -7
- package/dist/packages/cli/src/screens/autotrade-worker.js +4 -2
- package/dist/packages/cli/src/screens/narrative.js +154 -2
- package/dist/packages/cli/src/state.js +1 -0
- package/dist/packages/cli/src/telegram-cmd.js +4 -1
- package/dist/packages/cli/src/version.js +1 -1
- package/dist/packages/custom/src/rules.js +5 -1
- package/dist/packages/data/src/trade/ledger/schema.js +1 -1
- package/dist/packages/mcp/assets/kb/app-help/autotrade-executor-kit.md +44 -0
- package/dist/packages/mcp/assets/kb/app-help/autotrade-journey.md +46 -0
- package/dist/packages/mcp/assets/kb/app-help/autotrade-limits.md +48 -0
- package/dist/packages/mcp/assets/kb/app-help/autotrade-real-signal.md +45 -0
- package/dist/packages/mcp/assets/kb/app-help/classification-models.md +41 -0
- package/dist/packages/mcp/assets/kb/app-help/live-trading.md +1 -1
- package/dist/packages/mcp/assets/kb/app-help/narratives-tracker.md +45 -0
- package/dist/packages/mcp/assets/kb/app-help/screen-autotrade.md +12 -0
- package/dist/packages/mcp/assets/kb/app-help/strategy-dashboard.md +38 -0
- package/dist/packages/mcp/assets/kb/app-help/streamer-overlay.md +36 -0
- package/dist/packages/mcp/assets/kb/app-help/trade-ledger.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-autotrade-change-a-strategy-by-chat.md +3 -1
- package/dist/packages/mcp/assets/kb/docs/docs-autotrade-on-the-q-screen.md +1 -0
- package/dist/packages/mcp/assets/kb/docs/docs-autotrade-rug-proof-entries-experimental.md +52 -0
- package/dist/packages/mcp/assets/kb/docs/docs-autotrade-running-it-all-day.md +2 -2
- package/dist/packages/mcp/assets/kb/docs/docs-autotrade-stopping-it.md +2 -0
- package/dist/packages/mcp/assets/kb/docs/docs-autotrade-the-always-on-service.md +59 -0
- package/dist/packages/mcp/assets/kb/docs/docs-autotrade-the-strategy-dashboard-dexterm-dash.md +37 -0
- package/dist/packages/mcp/assets/kb/docs/docs-autotrade-what-it-is-paper-self-directed.md +9 -2
- package/dist/packages/mcp/assets/kb/docs/docs-autotrade-what-it-will-not-do.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-autotrade.md +3 -1
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-before-any-experimental-trading.md +2 -2
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-copy-and-paste-without-surprises.md +0 -1
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-if-dexterm-says-command-not-found.md +2 -2
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-reopen-dexterm-later.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-terminal-shell-prompt-command-output-and-path.md +2 -2
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-windows-expectations.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-windows.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-build-a-strategy-by-chat-1-ask-for-a-strategy.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-build-a-strategy-by-chat-2-backtest-it-held-out-split.md +31 -0
- package/dist/packages/mcp/assets/kb/docs/docs-build-a-strategy-by-chat-3-forward-test-it-on-live-data.md +44 -0
- package/dist/packages/mcp/assets/kb/docs/docs-build-a-strategy-by-chat-4-promote-it-to-always-on-paper.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-build-a-strategy-by-chat-5-real-only-if-you-choose.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-build-a-strategy-by-chat-the-ladder.md +41 -0
- package/dist/packages/mcp/assets/kb/docs/docs-build-a-strategy-by-chat-the-report.md +31 -0
- package/dist/packages/mcp/assets/kb/docs/docs-build-a-strategy-by-chat-what-the-analyst-knows.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-build-a-strategy-by-chat.md +26 -0
- package/dist/packages/mcp/assets/kb/docs/docs-classifier-hosted-jev-with-your-own-key.md +34 -0
- package/dist/packages/mcp/assets/kb/docs/docs-classifier-how-they-measured-on-dexterm-s-own-history.md +52 -0
- package/dist/packages/mcp/assets/kb/docs/docs-classifier-set-up-kev-on-your-own-machine.md +39 -0
- package/dist/packages/mcp/assets/kb/docs/docs-classifier-settings.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-classifier-the-choices.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-classifier-where-it-plugs-in.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-classifier-which-model-for-which-machine.md +42 -0
- package/dist/packages/mcp/assets/kb/docs/docs-classifier.md +32 -0
- package/dist/packages/mcp/assets/kb/docs/docs-cli-invocations.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-configuration-headless-recorder-dexterm-record.md +3 -0
- package/dist/packages/mcp/assets/kb/docs/docs-copy-trading.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-data-sources-recorded-history-and-retention.md +1 -0
- package/dist/packages/mcp/assets/kb/docs/docs-getting-started-install.md +3 -3
- package/dist/packages/mcp/assets/kb/docs/docs-getting-started-requirements.md +2 -2
- package/dist/packages/mcp/assets/kb/docs/docs-getting-started-supported-platforms.md +2 -11
- package/dist/packages/mcp/assets/kb/docs/docs-getting-started.md +2 -2
- package/dist/packages/mcp/assets/kb/docs/docs-going-real-executor-health.md +38 -0
- package/dist/packages/mcp/assets/kb/docs/docs-going-real-paper-vs-real.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-going-real-the-digest.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-going-real-the-executor-kit.md +48 -0
- package/dist/packages/mcp/assets/kb/docs/docs-going-real-the-whole-path.md +37 -0
- package/dist/packages/mcp/assets/kb/docs/docs-going-real-what-dexterm-does-and-never-does.md +44 -0
- package/dist/packages/mcp/assets/kb/docs/docs-going-real-your-limits.md +77 -0
- package/dist/packages/mcp/assets/kb/docs/docs-going-real.md +24 -0
- package/dist/packages/mcp/assets/kb/docs/docs-larp-measured-accuracy.md +2 -2
- package/dist/packages/mcp/assets/kb/docs/docs-larp-paste-a-coin-on-the-web.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-larp-the-larp-score.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-live-trading-changed-in-0-1-7.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-live-trading-real-mode-your-strategy-s-trades-to-your.md +31 -0
- package/dist/packages/mcp/assets/kb/docs/docs-live-trading-the-short-version.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-live-trading-using-a-trading-bot-with-dexterm.md +0 -2
- package/dist/packages/mcp/assets/kb/docs/docs-live-trading-what-dexterm-does-not-do.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-narratives-how-coins-are-grouped.md +39 -0
- package/dist/packages/mcp/assets/kb/docs/docs-narratives-limits.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-narratives-what-is-measured.md +44 -0
- package/dist/packages/mcp/assets/kb/docs/docs-narratives-what-testing-showed.md +43 -0
- package/dist/packages/mcp/assets/kb/docs/docs-narratives-where-to-find-it.md +37 -0
- package/dist/packages/mcp/assets/kb/docs/docs-narratives.md +29 -0
- package/dist/packages/mcp/assets/kb/docs/docs-overlay-before-you-start.md +33 -0
- package/dist/packages/mcp/assets/kb/docs/docs-overlay-limits.md +30 -0
- package/dist/packages/mcp/assets/kb/docs/docs-overlay-options.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-overlay-security-model.md +36 -0
- package/dist/packages/mcp/assets/kb/docs/docs-overlay-set-it-up-in-obs-step-by-step.md +49 -0
- package/dist/packages/mcp/assets/kb/docs/docs-overlay-the-pnl-scene-paper-and-live.md +34 -0
- package/dist/packages/mcp/assets/kb/docs/docs-overlay-the-three-scenes.md +35 -0
- package/dist/packages/mcp/assets/kb/docs/docs-overlay-what-is-redacted.md +31 -0
- package/dist/packages/mcp/assets/kb/docs/docs-overlay.md +25 -0
- package/dist/packages/mcp/assets/kb/docs/docs-paper-trading.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-real-mode-receipts-what-your-executor-did.md +42 -0
- package/dist/packages/mcp/assets/kb/docs/docs-real-mode-safety.md +34 -0
- package/dist/packages/mcp/assets/kb/docs/docs-real-mode-set-it-up.md +47 -0
- package/dist/packages/mcp/assets/kb/docs/docs-real-mode-the-channels.md +42 -0
- package/dist/packages/mcp/assets/kb/docs/docs-real-mode-the-signal.md +48 -0
- package/dist/packages/mcp/assets/kb/docs/docs-real-mode-what-it-is.md +37 -0
- package/dist/packages/mcp/assets/kb/docs/docs-real-mode-what-it-will-not-do.md +34 -0
- package/dist/packages/mcp/assets/kb/docs/docs-real-mode-where-you-see-it.md +34 -0
- package/dist/packages/mcp/assets/kb/docs/docs-real-mode.md +27 -0
- package/dist/packages/mcp/assets/kb/docs/docs-screens-bubble-map.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-spectator-streaming-it.md +1 -0
- package/dist/packages/mcp/assets/kb/docs/docs-telegram-what-it-is.md +1 -1
- package/dist/packages/mcp/assets/kb/docs/docs-voice-linux-and-windows.md +2 -2
- package/dist/packages/mcp/assets/kb/entries/autotrade.md +4 -2
- package/dist/packages/mcp/assets/kb/entries/narratives-tracker.md +45 -0
- package/dist/packages/mcp/src/autotrade-tools.js +168 -5
- package/dist/packages/mcp/src/engine/restrictions.js +3 -3
- package/dist/packages/mcp/src/index.js +1 -1
- package/dist/packages/mcp/src/ledger-tools.js +155 -7
- package/dist/packages/mcp/src/server.js +125 -10
- package/dist/packages/mcp/src/spectator-sink.js +27 -0
- package/dist/packages/narratives/src/cluster.js +193 -0
- package/dist/packages/narratives/src/embed.js +184 -0
- package/dist/packages/narratives/src/export.js +60 -0
- package/dist/packages/narratives/src/index.js +10 -0
- package/dist/packages/narratives/src/label.js +48 -0
- package/dist/packages/narratives/src/normalize.js +179 -0
- package/dist/packages/narratives/src/recorder.js +93 -0
- package/dist/packages/narratives/src/tracker.js +328 -0
- package/dist/packages/recorder/src/exit-probes.js +215 -0
- package/dist/packages/recorder/src/index.js +1 -0
- package/dist/packages/recorder/src/recorder.js +11 -1
- package/dist/packages/recorder/src/retention.js +4 -0
- package/dist/packages/recorder/src/schema.js +20 -1
- package/dist/packages/tui/src/keymap.js +12 -0
- package/package.json +3 -1
- package/dist/packages/mcp/assets/kb/docs/docs-beginners-windows-powershell-experimental.md +0 -39
|
@@ -20,7 +20,9 @@ const ADDR_RE = new RegExp(`${BASE58}{32,44}`, 'g');
|
|
|
20
20
|
const LONG_B58_RE = new RegExp(`${BASE58}{45,}`, 'g');
|
|
21
21
|
/** A hex run of ≥64 chars is a 32-byte key / signature. */
|
|
22
22
|
const HEX_KEY_RE = /\b[0-9a-fA-F]{64,}\b/g;
|
|
23
|
-
|
|
23
|
+
// task-1645: real mode's trade-fire signals and receipts stay out of shared views (`sig` already covers signal,
|
|
24
|
+
// signalId and txSig; receipt, nonce and trade_fire are added).
|
|
25
|
+
export const SENSITIVE_KEY_RE = /(secret|private|privkey|mnemonic|seed|passphrase|password|signature|sig|apikey|api[_-]?key|keypair|token|receipt|nonce|trade[_-]?fire)/i;
|
|
24
26
|
/** Mask one address the way the product's shortAddr does (head4…tail4). */
|
|
25
27
|
export function maskAddress(s) {
|
|
26
28
|
return s.length <= 10 ? s : `${s.slice(0, 4)}…${s.slice(-4)}`;
|
|
@@ -93,13 +95,18 @@ const finiteOr = (x, d = null) => (typeof x === 'number' && Number.isFinite(x) ?
|
|
|
93
95
|
// eslint-disable-next-line no-control-regex
|
|
94
96
|
const UNSAFE_RE = /[\u0000-\u001f\u007f-\u009f---]/g;
|
|
95
97
|
const shortStr = (x, max) => (typeof x === 'string' ? x.replace(UNSAFE_RE, '').slice(0, max) : '');
|
|
96
|
-
const
|
|
98
|
+
const isFullMint = (x) => typeof x === 'string' && /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(x);
|
|
99
|
+
/** A mint as the redactor leaves it (maskAddress: head4…tail4). */
|
|
100
|
+
const isMaskedMint = (x) => typeof x === 'string' && /^[1-9A-HJ-NP-Za-km-z]{4}…[1-9A-HJ-NP-Za-km-z]{4}$/.test(x);
|
|
97
101
|
/**
|
|
98
102
|
* task-1466: re-validate a detail read off the local channel (shape, types, lengths). The channel is our own
|
|
99
103
|
* server's 0600 file and token-checked, but the viewer still treats it as data: anything malformed is dropped,
|
|
100
104
|
* strings are stripped of control/bidi characters and capped, numbers must be finite. Returns null when empty.
|
|
101
105
|
*/
|
|
102
|
-
export function sanitizeDetail(raw) {
|
|
106
|
+
export function sanitizeDetail(raw, opts = {}) {
|
|
107
|
+
// task-1427: a detail read off the SHARED stream (or a saved file) is already redacted, so its mints are head…tail;
|
|
108
|
+
// `masked` accepts that shape (and only that shape) instead of a full mint. The local channel keeps the strict check.
|
|
109
|
+
const isMintish = (x) => (opts.masked ? isMaskedMint(x) : isFullMint(x));
|
|
103
110
|
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
104
111
|
return null;
|
|
105
112
|
const r = raw;
|
|
@@ -138,6 +145,27 @@ export function sanitizeDetail(raw) {
|
|
|
138
145
|
out.caps = { perTradeUsd: cp.perTradeUsd, totalUsd: cp.totalUsd, maxPriceImpactPct: finiteOr(cp.maxPriceImpactPct) };
|
|
139
146
|
if (typeof r.refusal === 'string' && r.refusal)
|
|
140
147
|
out.refusal = shortStr(r.refusal, 40);
|
|
148
|
+
const h = r.holders;
|
|
149
|
+
const top10 = h ? finiteOr(h.top10Pct) : null;
|
|
150
|
+
if (h && top10 !== null && top10 >= 0 && top10 <= 100 && (h.basis === 'ex-pools' || h.basis === 'raw')) {
|
|
151
|
+
const count = finiteOr(h.count), ageSec = finiteOr(h.ageSec);
|
|
152
|
+
out.holders = { top10Pct: top10, count: count !== null && count >= 0 ? Math.round(count) : null, basis: h.basis, ageSec: ageSec !== null && ageSec >= 0 ? ageSec : null };
|
|
153
|
+
}
|
|
154
|
+
if (Array.isArray(r.liveFlags)) {
|
|
155
|
+
const LEVELS = ['up', 'down', 'info', 'warn'];
|
|
156
|
+
const sigs = r.liveFlags.slice(0, 8).flatMap((x) => {
|
|
157
|
+
const o = x;
|
|
158
|
+
if (!o || typeof o !== 'object')
|
|
159
|
+
return [];
|
|
160
|
+
const kind = shortStr(o.kind, 16), title = shortStr(o.title, 24), text = shortStr(o.text, 120);
|
|
161
|
+
const at = finiteOr(o.at), ageSec = finiteOr(o.ageSec);
|
|
162
|
+
if (!kind || !title || at === null || ageSec === null || ageSec < 0 || !LEVELS.includes(o.level))
|
|
163
|
+
return [];
|
|
164
|
+
return [{ kind, level: o.level, title, text, source: shortStr(o.source, 24) || '?', at, ageSec, stale: o.stale === true }];
|
|
165
|
+
});
|
|
166
|
+
if (sigs.length)
|
|
167
|
+
out.liveFlags = sigs;
|
|
168
|
+
}
|
|
141
169
|
return Object.keys(out).length ? out : null;
|
|
142
170
|
}
|
|
143
171
|
// ---------------------------------------------------------------------------------------------------
|
|
@@ -46,6 +46,9 @@ export const TOOL_TIERS = Object.freeze({
|
|
|
46
46
|
// agents in task-1405 so a bring-your-own-agent gets the same code-stage analysis the built-in analyst does.
|
|
47
47
|
analyze_token: 'observe',
|
|
48
48
|
narrative_board: 'observe',
|
|
49
|
+
narratives_top: 'observe',
|
|
50
|
+
narrative_detail: 'observe',
|
|
51
|
+
narrative_of: 'observe',
|
|
49
52
|
rug_backtest: 'observe',
|
|
50
53
|
kb_lookup: 'observe',
|
|
51
54
|
kb_search: 'observe',
|
|
@@ -76,6 +79,9 @@ export const TOOL_TIERS = Object.freeze({
|
|
|
76
79
|
telegram_status: 'observe',
|
|
77
80
|
trading_status: 'observe',
|
|
78
81
|
backtest_requests: 'observe',
|
|
82
|
+
// THE JOURNEY (task-1647): a strategy's ladder and a forward test's report vs its backtest
|
|
83
|
+
strategy_journey: 'observe',
|
|
84
|
+
strategy_forward_report: 'observe',
|
|
79
85
|
subscribe: 'observe',
|
|
80
86
|
unsubscribe: 'observe',
|
|
81
87
|
// ---- annotate: non-financial navigation + agent-owned annotations
|
|
@@ -93,6 +99,12 @@ export const TOOL_TIERS = Object.freeze({
|
|
|
93
99
|
strategy_propose_new: 'propose',
|
|
94
100
|
// a backtest REQUEST (task-1530): a file the user runs or dismisses with `dexterm autotrade requests`
|
|
95
101
|
backtest_request: 'propose',
|
|
102
|
+
// THE JOURNEY (task-1647): a paper forward test (the strategy's own bankroll, a bounded window, never real) and a
|
|
103
|
+
// promotion PROPOSAL the user applies (always-on: a key; real: their own caps + a typed phrase on their terminal).
|
|
104
|
+
// Vetted by hand: "promote" is on the never-list for agent tiers; this one only writes a proposal file.
|
|
105
|
+
strategy_forward_start: 'propose',
|
|
106
|
+
strategy_forward_stop: 'propose',
|
|
107
|
+
strategy_promote_propose: 'propose',
|
|
96
108
|
});
|
|
97
109
|
/** Tools that are proposals (write-shaped): they need an idempotency key and count against the proposal quota. */
|
|
98
110
|
export const PROPOSAL_TOOLS = new Set(['propose_alert', 'propose_order_plan', 'add_to_watchlist']);
|
|
@@ -35,6 +35,9 @@ const TOOLS_DEF = [
|
|
|
35
35
|
{ name: 'get_dev_history', tier: 'observe', description: 'Creator address and prior-launch forensics. Tier-1 fields need a key and are null on the keyless tier.', inputSchema: { type: 'object', properties: { mint: MINT }, required: ['mint'], additionalProperties: false } },
|
|
36
36
|
{ name: 'analyze_token', tier: 'observe', description: 'Deterministic token-dossier analysis pack: numeric features, named rule flags, a WATCH/SPECULATIVE/AVOID verdict, a p(rug) heuristic and data ages. No model, no token cost; a reasoning stage may only tighten the verdict, never loosen it.', inputSchema: { type: 'object', properties: { mint: MINT, symbol: SYMBOL, interval: { type: 'string', enum: ['1m', '5m', '15m', '1h', '4h', '1d'] } }, additionalProperties: false } },
|
|
37
37
|
{ name: 'narrative_board', tier: 'observe', description: 'The narrative board over recorded + trending tokens: per-narrative volume, new launches, runners and a "what is working" score. No model; returns a note when there is no recorded history yet.', inputSchema: { type: 'object', properties: { window: { type: 'string', enum: ['1h', '24h'] }, limit: { type: 'integer', minimum: 1, maximum: 50 }, summary: { type: 'boolean' } }, additionalProperties: false } },
|
|
38
|
+
{ name: 'narratives_top', tier: 'observe', description: 'MEMES + NARRATIVES tracker: the hottest name/ticker-theme clusters of the last 26 h with lifecycle (spark/ignition/peak/fading/dead), copy-cat saturation, volume share and a traction score. Measured heat, not advice.', inputSchema: { type: 'object', properties: { limit: { type: 'integer', minimum: 1, maximum: 50 }, lifecycle: { type: 'string', enum: ['spark', 'ignition', 'peak', 'fading'] } }, additionalProperties: false } },
|
|
39
|
+
{ name: 'narrative_detail', tier: 'observe', description: 'One narrative by id: per-window metrics, lifecycle rule and member coins in spawn order. Measured heat, not advice.', inputSchema: { type: 'object', properties: { id: { type: 'string' }, limit: { type: 'integer', minimum: 1, maximum: 100 } }, required: ['id'], additionalProperties: false } },
|
|
40
|
+
{ name: 'narrative_of', tier: 'observe', description: 'Which narrative a coin belongs to: label, lifecycle, rank, spawn index, saturation. Measured heat, not advice.', inputSchema: { type: 'object', properties: { mint: { type: 'string' } }, required: ['mint'], additionalProperties: false } },
|
|
38
41
|
{ name: 'rug_backtest', tier: 'observe', description: 'Backtest the rug model or recorded pack verdicts against RECORDED outcomes: honest precision/recall, Brier, AUC and calibration. Leakage-free by construction; returns a note when there is not enough history. Read-only.', inputSchema: { type: 'object', properties: { kind: { type: 'string', enum: ['heuristic', 'pack_verdicts'] }, horizon_sec: { type: 'integer', enum: [3600, 7200, 21600, 86400, 259200] }, positive_labels: { type: 'array', items: { type: 'string', enum: ['rug', 'dead', 'fade', 'flat', 'runner'] }, maxItems: 5 } }, additionalProperties: false } },
|
|
39
42
|
{ name: 'kb_lookup', tier: 'observe', description: 'One knowledge-base entry by id (mechanics / patterns / glossary). KB never holds facts about a live token.', inputSchema: { type: 'object', properties: { id: { type: 'string', maxLength: 64 } }, required: ['id'], additionalProperties: false } },
|
|
40
43
|
{ name: 'kb_search', tier: 'observe', description: 'Search the knowledge base; returns ids, titles and an excerpt.', inputSchema: { type: 'object', properties: { query: { type: 'string', maxLength: 200 }, limit: { type: 'integer', minimum: 1, maximum: 10 } }, required: ['query'], additionalProperties: false } },
|
|
@@ -50,16 +53,18 @@ const TOOLS_DEF = [
|
|
|
50
53
|
{ name: 'strategy_validate', tier: 'observe', description: 'AUTOTRADE (paper): validate a whole dexterm-strategy/1 document ({ok, errors, warnings}). Saves nothing.', inputSchema: { type: 'object', properties: { doc: { free: true } }, required: ['doc'], additionalProperties: false } },
|
|
51
54
|
{ name: 'strategy_backtest', tier: 'observe', description: 'AUTOTRADE (paper): backtest a strategy or a pending proposal on recorded history (days <= 14). Read-only, one at a time, rate-limited.', inputSchema: { type: 'object', properties: { id: STRATEGY, proposalId: { type: 'string', maxLength: 40 }, tape: { type: 'string', enum: ['recorded'] }, days: { type: 'integer', minimum: 1, maximum: 14 } }, additionalProperties: false } },
|
|
52
55
|
{ name: 'autotrade_status', tier: 'observe', description: 'AUTOTRADE (paper): the paper runner\'s status, the strategy count and the proposals waiting for the user.', inputSchema: { type: 'object', properties: {}, additionalProperties: false } },
|
|
53
|
-
{ name: 'ledger_trades', tier: 'observe', description: 'TRADE LEDGER: trades from the unified ledger (paper, the agent paper desk, autotrade runs, the live signer), newest first: strategy id+version+hash, profile + entry reason and where each came from, exit reason, size and % of book, entry/exit price and market cap, fees, impact, hold, MFE/MAE, rug flag, wallet mode, tx signatures, model session ids and cost. PAPER rows are simulated.', inputSchema: { type: 'object', properties: { source: { type: 'string', enum: ['paper', 'desk', 'autotrade', 'live'] }, mode: { type: 'string', enum: ['paper', 'devnet', 'live'] }, strategy: { type: 'string', maxLength: 50, pattern: '^[a-z][a-z0-9-]{0,31}(@[0-9a-z.]{1,16})?$' }, profile: PROFILE, exit_reason: PROFILE, mint: MINT, run_id: RUN_ID, days: { type: 'number', minimum: 0, maximum: 3650 }, status: { type: 'string', enum: ['open', 'closed'] }, limit: { type: 'integer', minimum: 1, maximum: 200 }, fills: { type: 'boolean' } }, additionalProperties: false } },
|
|
54
|
-
{ name: 'ledger_positions', tier: 'observe', description: 'TRADE LEDGER: the open trades (cost, % of book, held time, profile). No price fetch, no balance.', inputSchema: { type: 'object', properties: { source: { type: 'string', enum: ['paper', 'desk', 'autotrade', 'live'] }, mode: { type: 'string', enum: ['paper', 'devnet', 'live'] }, strategy: { type: 'string', maxLength: 50, pattern: '^[a-z][a-z0-9-]{0,31}(@[0-9a-z.]{1,16})?$' }, profile: PROFILE, exit_reason: PROFILE, mint: MINT, run_id: RUN_ID, days: { type: 'number', minimum: 0, maximum: 3650 }, limit: { type: 'integer', minimum: 1, maximum: 200 } }, additionalProperties: false } },
|
|
55
|
-
{ name: 'ledger_equity', tier: 'observe', description: 'TRADE LEDGER: the realized equity curve and its max drawdown (at most 200 points).', inputSchema: { type: 'object', properties: { source: { type: 'string', enum: ['paper', 'desk', 'autotrade', 'live'] }, mode: { type: 'string', enum: ['paper', 'devnet', 'live'] }, strategy: { type: 'string', maxLength: 50, pattern: '^[a-z][a-z0-9-]{0,31}(@[0-9a-z.]{1,16})?$' }, profile: PROFILE, exit_reason: PROFILE, mint: MINT, run_id: RUN_ID, days: { type: 'number', minimum: 0, maximum: 3650 } }, additionalProperties: false } },
|
|
56
|
-
{ name: 'ledger_summary', tier: 'observe', description: 'TRADE LEDGER: win rate with its 95% interval, P/L, drawdown, rug rate, hold, MFE/MAE, declared-tag coverage, and breakdowns by profile, exit reason, strategy, source and mode.', inputSchema: { type: 'object', properties: { source: { type: 'string', enum: ['paper', 'desk', 'autotrade', 'live'] }, mode: { type: 'string', enum: ['paper', 'devnet', 'live'] }, strategy: { type: 'string', maxLength: 50, pattern: '^[a-z][a-z0-9-]{0,31}(@[0-9a-z.]{1,16})?$' }, profile: PROFILE, exit_reason: PROFILE, mint: MINT, run_id: RUN_ID, days: { type: 'number', minimum: 0, maximum: 3650 } }, additionalProperties: false } },
|
|
57
|
-
{ name: 'ledger_compare', tier: 'observe', description: 'TRADE LEDGER: one row per strategy version side by side (the forward-test table).', inputSchema: { type: 'object', properties: { source: { type: 'string', enum: ['paper', 'desk', 'autotrade', 'live'] }, mode: { type: 'string', enum: ['paper', 'devnet', 'live'] }, strategy: { type: 'string', maxLength: 50, pattern: '^[a-z][a-z0-9-]{0,31}(@[0-9a-z.]{1,16})?$' }, profile: PROFILE, exit_reason: PROFILE, mint: MINT, run_id: RUN_ID, days: { type: 'number', minimum: 0, maximum: 3650 } }, additionalProperties: false } },
|
|
56
|
+
{ name: 'ledger_trades', tier: 'observe', description: 'TRADE LEDGER: trades from the unified ledger (paper, the agent paper desk, autotrade runs, the live signer), newest first: strategy id+version+hash, profile + entry reason and where each came from, exit reason, size and % of book, entry/exit price and market cap, fees, impact, hold, MFE/MAE, rug flag, wallet mode, tx signatures, model session ids and cost. PAPER rows are simulated.', inputSchema: { type: 'object', properties: { source: { type: 'string', enum: ['paper', 'desk', 'autotrade', 'live'] }, mode: { type: 'string', enum: ['paper', 'devnet', 'live', 'real'] }, strategy: { type: 'string', maxLength: 50, pattern: '^[a-z][a-z0-9-]{0,31}(@[0-9a-z.]{1,16})?$' }, profile: PROFILE, exit_reason: PROFILE, mint: MINT, run_id: RUN_ID, days: { type: 'number', minimum: 0, maximum: 3650 }, status: { type: 'string', enum: ['open', 'closed'] }, limit: { type: 'integer', minimum: 1, maximum: 200 }, fills: { type: 'boolean' } }, additionalProperties: false } },
|
|
57
|
+
{ name: 'ledger_positions', tier: 'observe', description: 'TRADE LEDGER: the open trades (cost, % of book, held time, profile). No price fetch, no balance.', inputSchema: { type: 'object', properties: { source: { type: 'string', enum: ['paper', 'desk', 'autotrade', 'live'] }, mode: { type: 'string', enum: ['paper', 'devnet', 'live', 'real'] }, strategy: { type: 'string', maxLength: 50, pattern: '^[a-z][a-z0-9-]{0,31}(@[0-9a-z.]{1,16})?$' }, profile: PROFILE, exit_reason: PROFILE, mint: MINT, run_id: RUN_ID, days: { type: 'number', minimum: 0, maximum: 3650 }, limit: { type: 'integer', minimum: 1, maximum: 200 } }, additionalProperties: false } },
|
|
58
|
+
{ name: 'ledger_equity', tier: 'observe', description: 'TRADE LEDGER: the realized equity curve and its max drawdown (at most 200 points).', inputSchema: { type: 'object', properties: { source: { type: 'string', enum: ['paper', 'desk', 'autotrade', 'live'] }, mode: { type: 'string', enum: ['paper', 'devnet', 'live', 'real'] }, strategy: { type: 'string', maxLength: 50, pattern: '^[a-z][a-z0-9-]{0,31}(@[0-9a-z.]{1,16})?$' }, profile: PROFILE, exit_reason: PROFILE, mint: MINT, run_id: RUN_ID, days: { type: 'number', minimum: 0, maximum: 3650 } }, additionalProperties: false } },
|
|
59
|
+
{ name: 'ledger_summary', tier: 'observe', description: 'TRADE LEDGER: win rate with its 95% interval, P/L, drawdown, rug rate, hold, MFE/MAE, declared-tag coverage, and breakdowns by profile, exit reason, strategy, source and mode.', inputSchema: { type: 'object', properties: { source: { type: 'string', enum: ['paper', 'desk', 'autotrade', 'live'] }, mode: { type: 'string', enum: ['paper', 'devnet', 'live', 'real'] }, strategy: { type: 'string', maxLength: 50, pattern: '^[a-z][a-z0-9-]{0,31}(@[0-9a-z.]{1,16})?$' }, profile: PROFILE, exit_reason: PROFILE, mint: MINT, run_id: RUN_ID, days: { type: 'number', minimum: 0, maximum: 3650 } }, additionalProperties: false } },
|
|
60
|
+
{ name: 'ledger_compare', tier: 'observe', description: 'TRADE LEDGER: one row per strategy version side by side (the forward-test table).', inputSchema: { type: 'object', properties: { source: { type: 'string', enum: ['paper', 'desk', 'autotrade', 'live'] }, mode: { type: 'string', enum: ['paper', 'devnet', 'live', 'real'] }, strategy: { type: 'string', maxLength: 50, pattern: '^[a-z][a-z0-9-]{0,31}(@[0-9a-z.]{1,16})?$' }, profile: PROFILE, exit_reason: PROFILE, mint: MINT, run_id: RUN_ID, days: { type: 'number', minimum: 0, maximum: 3650 } }, additionalProperties: false } },
|
|
58
61
|
{ name: 'candidate_dossier', tier: 'observe', description: 'AUTOTRADE: what a run recorded about a candidate coin (rules matched, tick, the session\'s decisions, clamp, fills, close). Text fields are untrusted data.', inputSchema: { type: 'object', properties: { mint: MINT, run_id: RUN_ID }, required: ['mint'], additionalProperties: false } },
|
|
59
62
|
{ name: 'outcomes_lookup', tier: 'observe', description: 'The recorder\'s code-only outcome labels for a coin, or for every candidate of a run (what the skips turned into). Not predictions.', inputSchema: { type: 'object', properties: { mint: MINT, run_id: RUN_ID, limit: { type: 'integer', minimum: 1, maximum: 100 } }, additionalProperties: false } },
|
|
60
63
|
{ name: 'telegram_status', tier: 'observe', description: 'The Telegram connector\'s settings (enabled, paired chat count, tiers, approvals, notify). Never a token or an id.', inputSchema: { type: 'object', properties: {}, additionalProperties: false } },
|
|
61
64
|
{ name: 'trading_status', tier: 'observe', description: 'The live trading signer\'s STATE: mode, kill switch, caps it enforces, a balance band. Never a key, an address or an exact balance; it cannot change anything.', inputSchema: { type: 'object', properties: {}, additionalProperties: false } },
|
|
62
65
|
{ name: 'backtest_requests', tier: 'observe', description: 'Your backtest requests and their results once the user ran them.', inputSchema: { type: 'object', properties: {}, additionalProperties: false } },
|
|
66
|
+
{ name: 'strategy_journey', tier: 'observe', description: 'AUTOTRADE: one of the user\'s strategies on the ladder draft → backtested → forward-tested → always-on → real: the evidence per rung on these exact rules and what the next rung needs. Read-only.', inputSchema: { type: 'object', properties: { id: STRATEGY }, required: ['id'], additionalProperties: false } },
|
|
67
|
+
{ name: 'strategy_forward_report', tier: 'observe', description: 'AUTOTRADE (paper): a forward test next to the backtest of the same rules, with plain verdict lines (it says when a sample is too small). Read-only.', inputSchema: { type: 'object', properties: { id: STRATEGY, forwardId: { type: 'string', maxLength: 40 } }, additionalProperties: false } },
|
|
63
68
|
// ---------------------------------------------------------------- annotate: non-financial navigation + agent-owned notes
|
|
64
69
|
{ name: 'open_token', tier: 'annotate', description: "Open a token's detail screen so the user can see it. `mint` must be one of the mints currently on screen (see screen_state). Non-financial navigation; it never trades.", inputSchema: { type: 'object', properties: { mint: MINT }, required: ['mint'], additionalProperties: false } },
|
|
65
70
|
{ name: 'show_in_screener', tier: 'annotate', description: "Show the screener with an optional filter / sort / highlighted mint. `filter` is dexterm's grammar; `highlight` must be a mint on screen.", inputSchema: { type: 'object', properties: { filter: { type: 'string', maxLength: 200 }, sort: { type: 'object', properties: { key: { type: 'string', maxLength: 24 }, dir: { type: 'string', enum: ['asc', 'desc'] } }, required: ['key'], additionalProperties: false }, highlight: MINT }, additionalProperties: false } },
|
|
@@ -71,6 +76,9 @@ const TOOLS_DEF = [
|
|
|
71
76
|
{ name: 'strategy_propose_edit', tier: 'propose', description: 'AUTOTRADE (paper): PROPOSE JSON-patch ops (<= 20) on one of the user\'s strategies, with a why. Returns the diff, validation and riskDelta. Never applied by you: the user applies it with a key on the Q screen (a looser edit needs a second key). /mode, /bankroll, /agent/budgetUsdPerDay and /execution/minExitLiquidityUsd are user-only.', inputSchema: { type: 'object', properties: { id: STRATEGY, ops: PATCH_OPS, why: { type: 'string', maxLength: 200 } }, required: ['id', 'ops', 'why'], additionalProperties: false } },
|
|
72
77
|
{ name: 'strategy_propose_new', tier: 'propose', description: 'AUTOTRADE (paper): PROPOSE a new paper strategy copied from a preset under a new id and name, with optional ops (<= 20). Never applied by you; the user confirms it with a key.', inputSchema: { type: 'object', properties: { fromPreset: STRATEGY, id: STRATEGY, name: { type: 'string', maxLength: 80 }, ops: PATCH_OPS, why: { type: 'string', maxLength: 200 } }, required: ['fromPreset', 'id', 'name'], additionalProperties: false } },
|
|
73
78
|
{ name: 'backtest_request', tier: 'propose', description: 'PROPOSE a longer backtest (a stored strategy id, 1 to 60 days, optionally every candidate) with a why. The user runs or dismisses it with `dexterm autotrade requests`; nothing runs here.', inputSchema: { type: 'object', properties: { id: STRATEGY, days: { type: 'integer', minimum: 1, maximum: 60 }, every_candidate: { type: 'boolean' }, why: { type: 'string', maxLength: 200 } }, required: ['id', 'why'], additionalProperties: false } },
|
|
79
|
+
{ name: 'strategy_forward_start', tier: 'propose', description: 'AUTOTRADE (paper): start a forward test of one of the user\'s strategies on live data, on paper, with its own bankroll, for hours (0.25-72) and/or closed trades (1-200). Needs a backtest first. Never real; cannot set a bankroll or a cap.', inputSchema: { type: 'object', properties: { id: STRATEGY, hours: { type: 'number', minimum: 0.25, maximum: 72 }, trades: { type: 'integer', minimum: 1, maximum: 200 } }, required: ['id'], additionalProperties: false } },
|
|
80
|
+
{ name: 'strategy_forward_stop', tier: 'propose', description: 'AUTOTRADE (paper): stop a running forward test (it flattens and writes its report; an early stop does not count).', inputSchema: { type: 'object', properties: { id: STRATEGY, forwardId: { type: 'string', maxLength: 40 } }, additionalProperties: false } },
|
|
81
|
+
{ name: 'strategy_promote_propose', tier: 'propose', description: 'AUTOTRADE: PROPOSE promoting a strategy one rung (always-on or real) with an evidence card. Never applied by you and no rung can be skipped: the user applies always-on with a key, real only above their evidence floor (a completed forward test with their minimum of closed paper trades + a backtest), with their own caps and a typed phrase on their terminal.', inputSchema: { type: 'object', properties: { id: STRATEGY, to: { type: 'string', enum: ['always-on', 'real'] }, why: { type: 'string', maxLength: 200 } }, required: ['id', 'to', 'why'], additionalProperties: false } },
|
|
74
82
|
{ name: 'add_to_watchlist', tier: 'propose', description: "Propose adding a token to the user's watchlist. Appears as a PROPOSAL labelled with this agent. Needs idempotency_key.", inputSchema: { type: 'object', properties: { mint: MINT, note: { type: 'string', maxLength: 200 }, idempotency_key: IDEMPOTENCY }, required: ['mint', 'idempotency_key'], additionalProperties: false } },
|
|
75
83
|
];
|
|
76
84
|
/** task-1537: the read tools whose results carry prices also carry market-cap twins; their descriptions say so + the basis. */
|