dexterm-cli 0.1.4 → 0.1.5

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.
Files changed (63) hide show
  1. package/dist/packages/cli/src/agent-paper.js +60 -0
  2. package/dist/packages/cli/src/analyst/backend.js +183 -0
  3. package/dist/packages/cli/src/analyst/codex.js +301 -0
  4. package/dist/packages/cli/src/analyst/session.js +9 -2
  5. package/dist/packages/cli/src/app-help-gen.js +15 -6
  6. package/dist/packages/cli/src/doctor.js +58 -2
  7. package/dist/packages/cli/src/live/dev-history.js +99 -0
  8. package/dist/packages/cli/src/live/newpairs.js +12 -0
  9. package/dist/packages/cli/src/live/screens/token-live.js +11 -1
  10. package/dist/packages/cli/src/live/token.js +1 -0
  11. package/dist/packages/cli/src/main.js +122 -8
  12. package/dist/packages/cli/src/mcp-follow.js +37 -7
  13. package/dist/packages/cli/src/record-cmd.js +2 -0
  14. package/dist/packages/cli/src/rules.js +25 -2
  15. package/dist/packages/cli/src/screens/analyst-session.js +5 -3
  16. package/dist/packages/cli/src/screens/analyst.js +4 -3
  17. package/dist/packages/cli/src/version.js +1 -1
  18. package/dist/packages/custom/src/rules.js +2 -2
  19. package/dist/packages/custom/src/schema.js +5 -1
  20. package/dist/packages/data/src/fixtures.js +28 -6
  21. package/dist/packages/data/src/index.js +3 -0
  22. package/dist/packages/data/src/sources/jupiter.js +1 -0
  23. package/dist/packages/data/src/trade/agent/paper-desk.js +336 -0
  24. package/dist/packages/data/src/trade/agent/rendezvous.js +161 -0
  25. package/dist/packages/mcp/assets/kb/app-help/agent-paper-trade.md +38 -0
  26. package/dist/packages/mcp/assets/kb/app-help/ask-the-analyst.md +1 -1
  27. package/dist/packages/mcp/assets/kb/app-help/connect-an-agent.md +1 -1
  28. package/dist/packages/mcp/assets/kb/app-help/dev-history.md +32 -0
  29. package/dist/packages/mcp/assets/kb/app-help/paper-trade.md +1 -1
  30. package/dist/packages/mcp/assets/kb/app-help/screen-positions.md +4 -1
  31. package/dist/packages/mcp/assets/kb/app-help/screen-token.md +1 -0
  32. package/dist/packages/mcp/assets/kb/app-help/use-codex-analyst.md +31 -0
  33. package/dist/packages/mcp/assets/kb/docs/docs-agents-agent-paper-trading.md +50 -0
  34. package/dist/packages/mcp/assets/kb/docs/docs-agents-directory-metadata-prepared-not-submitted.md +36 -0
  35. package/dist/packages/mcp/assets/kb/docs/docs-agents-install-in-one-command.md +2 -0
  36. package/dist/packages/mcp/assets/kb/docs/docs-analyst-if-claude-is-missing.md +1 -1
  37. package/dist/packages/mcp/assets/kb/docs/docs-analyst-use-codex-instead-of-claude.md +35 -0
  38. package/dist/packages/mcp/assets/kb/docs/docs-beginners-macos-or-linux-npm.md +1 -1
  39. package/dist/packages/mcp/assets/kb/docs/docs-beginners-windows-expectations.md +1 -1
  40. package/dist/packages/mcp/assets/kb/docs/docs-beginners-windows-powershell-experimental.md +1 -1
  41. package/dist/packages/mcp/assets/kb/docs/docs-configuration-environment-variables.md +2 -0
  42. package/dist/packages/mcp/assets/kb/docs/docs-configuration-rules-engine.md +1 -0
  43. package/dist/packages/mcp/assets/kb/docs/docs-configuration-the-analyst-s-launch.md +2 -0
  44. package/dist/packages/mcp/assets/kb/docs/docs-getting-started-install.md +13 -3
  45. package/dist/packages/mcp/assets/kb/docs/docs-getting-started-requirements.md +1 -1
  46. package/dist/packages/mcp/assets/kb/docs/docs-getting-started-supported-platforms.md +2 -2
  47. package/dist/packages/mcp/assets/kb/docs/docs-larp-measured-accuracy.md +0 -2
  48. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-letting-an-agent-paper-trade-experimental.md +32 -0
  49. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading-what-the-live-path-keeps.md +1 -1
  50. package/dist/packages/mcp/assets/kb/docs/docs-screens-dev-history.md +44 -0
  51. package/dist/packages/mcp/assets/kb/docs/docs-screens-how-well-it-predicts-measured-held-out.md +46 -0
  52. package/dist/packages/mcp/assets/kb/docs/docs-spectator-follow-over-mcp-in-the-running-terminal.md +1 -1
  53. package/dist/packages/mcp/assets/kb/docs/docs-troubleshooting-doctor-lines.md +2 -0
  54. package/dist/packages/mcp/src/index.js +5 -2
  55. package/dist/packages/mcp/src/paper-agent.js +92 -0
  56. package/dist/packages/mcp/src/server.js +206 -12
  57. package/dist/packages/mcp/src/spectator-sink.js +73 -4
  58. package/dist/packages/mcp/src/user-content.js +1 -0
  59. package/dist/packages/recorder/src/dev-history.js +129 -0
  60. package/dist/packages/recorder/src/index.js +1 -0
  61. package/dist/packages/recorder/src/recorder.js +23 -0
  62. package/dist/packages/recorder/src/schema.js +11 -0
  63. package/package.json +1 -1
@@ -30,6 +30,7 @@ export const LABEL_RETRY_MS = 300_000;
30
30
  export const LABEL_BATCH = 300;
31
31
  /** In-memory last-row cache: entries not observed for this long are dropped (re-read from the DB on return). */
32
32
  export const SEEN_EVICT_MS = 2 * 3_600_000;
33
+ const BASE58 = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;
33
34
  export class Recorder {
34
35
  enabled;
35
36
  path;
@@ -58,6 +59,8 @@ export class Recorder {
58
59
  /** Counters for the handoff / --verbose. */
59
60
  counters = { observed: 0, written: 0, heartbeat: 0, members: 0, sweepCalls: 0, labelled: 0 };
60
61
  stmts;
62
+ /** Mints whose creator link is already stored (this run), so a refresh costs no write. */
63
+ creatorKnown = new Set();
61
64
  constructor(opts = {}) {
62
65
  this.enabled = opts.enabled ?? true;
63
66
  this.path = opts.path ?? ':memory:';
@@ -87,6 +90,7 @@ export class Recorder {
87
90
  insertMember: this.db.prepare('INSERT OR IGNORE INTO feed_members (t, feed, rank, mint) VALUES (?, ?, ?, ?)'),
88
91
  lastIdentity: this.db.prepare('SELECT symbol, name, launchpad, created_at FROM token_snapshots WHERE mint = ? ORDER BY t DESC LIMIT 1'),
89
92
  lastLive: this.db.prepare(`SELECT t, hash, sources, ${cols} FROM token_snapshots WHERE mint = ? AND kind = 'live' ORDER BY t DESC LIMIT 1`),
93
+ insertCreator: this.db.prepare('INSERT OR IGNORE INTO creators (mint, creator, source, first_t, created_at) VALUES (?, ?, ?, ?, ?)'),
90
94
  };
91
95
  }
92
96
  /** Attach as the data layer's store listener (and detach any previous one). */
@@ -120,6 +124,10 @@ export class Recorder {
120
124
  const pending = [];
121
125
  for (const r of rows) {
122
126
  this.counters.observed++;
127
+ // 0.1.5 dev history: the creator the row's source names (Jupiter `dev`), stored once per mint.
128
+ const dev = r.audit?.devAddress;
129
+ if (r.mint && dev)
130
+ this.recordCreator(r.mint, dev, r.audit?.source ?? 'jupiter-tokens', now, r.token?.createdAt ?? null);
123
131
  if (!r.mint || !r.pair) {
124
132
  res.skipped++;
125
133
  continue;
@@ -173,6 +181,21 @@ export class Recorder {
173
181
  this.counters.heartbeat += res.heartbeat;
174
182
  return res;
175
183
  }
184
+ /**
185
+ * Record which wallet created `mint`, as `source` named it (0.1.5 dev history). First writer wins; a mint or
186
+ * creator that is not a base58 address is ignored. Returns true when a new link was stored.
187
+ */
188
+ recordCreator(mint, creator, source, now = this.clock.now(), createdAt = null) {
189
+ if (!this.enabled || this.closed || this.creatorKnown.has(mint))
190
+ return false;
191
+ if (!BASE58.test(mint) || !BASE58.test(creator) || mint === creator)
192
+ return false;
193
+ this.creatorKnown.add(mint);
194
+ if (this.creatorKnown.size > 200_000)
195
+ this.creatorKnown.clear();
196
+ const r = this.stmts.insertCreator.run(mint, creator, String(source).slice(0, 24), now, createdAt !== null && Number.isFinite(createdAt) ? Math.round(createdAt) : null);
197
+ return Number(r.changes) > 0;
198
+ }
176
199
  /** The mint's last stored live row (one indexed read; only paid the first time a mint is seen this run). */
177
200
  lastStored(mint) {
178
201
  const row = this.stmts.lastLive.get(mint);
@@ -132,4 +132,15 @@ CREATE TABLE IF NOT EXISTS verdicts (
132
132
  run_file TEXT
133
133
  );
134
134
  CREATE INDEX IF NOT EXISTS verdicts_mint_t ON verdicts (mint, t);
135
+
136
+ -- 0.1.5 dev history: which wallet created a coin, as a keyless source named it when dexterm saw the coin
137
+ -- (Jupiter tokens v2 \`dev\`, a PumpPortal create, RugCheck new_tokens). First writer wins; never a guess.
138
+ CREATE TABLE IF NOT EXISTS creators (
139
+ mint TEXT PRIMARY KEY,
140
+ creator TEXT NOT NULL,
141
+ source TEXT NOT NULL, -- 'jupiter-tokens' | 'pumpportal' | 'rugcheck' | 'goplus'
142
+ first_t INTEGER NOT NULL, -- unix ms dexterm first recorded the link
143
+ created_at INTEGER -- the coin's creation time when the source gave one
144
+ ) WITHOUT ROWID;
145
+ CREATE INDEX IF NOT EXISTS creators_creator ON creators (creator, first_t);
135
146
  `;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dexterm-cli",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "mcpName": "io.github.dexterm-xyz/dexterm",
5
5
  "description": "dexterm: terminal DEX screener with a local Claude CLI analyst",
6
6
  "author": "The dexterm authors",