adaptive-memory-multi-model-router 2.13.13 โ†’ 2.13.15

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/README.md CHANGED
@@ -17,6 +17,16 @@
17
17
 
18
18
  ### Quick Start: [`docs/QUICK_START.md`](./docs/QUICK_START.md)
19
19
 
20
+ ### ๐Ÿ’… Terminal UI
21
+
22
+ ```bash
23
+ npx a3m
24
+ # or directly:
25
+ node dist/tui/dashboard.js
26
+ ```
27
+
28
+ Sakura pink overlay box. Commands: `/route`, `/cost`, `/health`, `/models`, `/model <provider>`. Type anything to auto-route. `esc` to quit.
29
+
20
30
  ### ๐Ÿ“Š By the Numbers
21
31
 
22
32
  | Metric | Value | Context |
package/dist/cli.js CHANGED
@@ -17,6 +17,7 @@
17
17
  * npx a3m-router models List known models
18
18
  * npx a3m-router memory add/search/stats Memory operations
19
19
  * npx a3m-router status Show router status
20
+ * npx a3m-router tui Launch terminal UI overlay
20
21
  */
21
22
 
22
23
  const { execSync } = require('child_process');
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * A3M Router โ€” Overlay Box (blessed, non-fullscreen)
3
+ * A3M Router โ€” Overlay Box TUI (Sakura Light Theme)
4
4
  */
5
5
  export {};
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
  /**
4
- * A3M Router โ€” Overlay Box (blessed, non-fullscreen)
4
+ * A3M Router โ€” Overlay Box TUI (Sakura Light Theme)
5
5
  */
6
6
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
7
  if (k2 === undefined) k2 = k;
@@ -38,67 +38,61 @@ var __importStar = (this && this.__importStar) || (function () {
38
38
  })();
39
39
  Object.defineProperty(exports, "__esModule", { value: true });
40
40
  const blessed = __importStar(require("blessed"));
41
- // State
41
+ // โ”€โ”€ State โ”€โ”€
42
42
  let activeModel = 'nvidia/llama-3.1-8b';
43
43
  let totalCost = 0.000087;
44
44
  let reqCount = 4;
45
45
  const log = [];
46
- // Screen โ€” floating overlay, not fullscreen
46
+ // โ”€โ”€ Screen โ”€โ”€
47
47
  const screen = blessed.screen({
48
48
  smartCSR: true,
49
49
  fullUnicode: true,
50
50
  dockBorders: false,
51
51
  cursor: { shape: 'line', blink: true },
52
52
  });
53
- // Box settings
54
53
  const BW = 82;
55
54
  const BH = 18;
56
- function boxLeft() { return Math.max(0, Math.floor((screen.width - BW) / 2)); }
57
- function boxTop() { return Math.max(0, Math.floor((screen.height - BH) / 2)); }
58
- // Overlay box
55
+ function L() { return Math.max(0, Math.floor((screen.width - BW) / 2)); }
56
+ function T() { return Math.max(0, Math.floor((screen.height - BH) / 2)); }
57
+ // โ”€โ”€ SAKURA LIGHT THEME โ”€โ”€
58
+ // bg: #fff5f7 (blush white)
59
+ // srf: #fce7f3 (light pink)
60
+ // dim: #d8a4b8 (muted rose)
61
+ // txt: #831843 (deep maroon)
62
+ // pink:#be185d (hot pink)
63
+ // grn: #059669 (emerald)
64
+ // blu: #2563eb (royal blue)
65
+ // amb: #d97706 (amber)
66
+ // red: #dc2626 (crimson)
67
+ // cyn: #0891b2 (teal)
68
+ // prp: #7c3aed (violet)
59
69
  const box = blessed.box({
60
- top: boxTop(),
61
- left: boxLeft(),
62
- width: BW,
63
- height: BH,
64
- border: { type: 'line', fg: 'magenta' },
65
- style: { fg: '#c0caf5', bg: '#1a1b26' },
66
- tags: true,
67
- scrollable: true,
68
- mouse: true,
69
- keys: true,
70
+ top: T(), left: L(), width: BW, height: BH,
71
+ border: { type: 'line', fg: '#f472b6' },
72
+ style: { fg: '#831843', bg: '#fff5f7' },
73
+ tags: true, scrollable: true, mouse: true, keys: true,
70
74
  padding: { left: 1, right: 1, top: 0, bottom: 0 },
71
75
  });
72
- // Prompt
73
76
  const prompt = blessed.textbox({
74
- parent: box,
75
- bottom: 1,
76
- left: 0,
77
- width: BW - 4,
78
- height: 1,
79
- style: { fg: '#c0caf5', bg: '#24283b' },
80
- inputOnFocus: true,
81
- keys: true,
82
- tags: true,
77
+ parent: box, bottom: 1, left: 0, width: BW - 4, height: 1,
78
+ style: { fg: '#831843', bg: '#fce7f3' },
79
+ inputOnFocus: true, keys: true, tags: true,
83
80
  });
84
- // Helpers
85
- const D = (s) => `{#565f89-fg}${s}{/}`;
81
+ const D = (s) => `{#d8a4b8-fg}${s}{/}`;
86
82
  function render() {
87
83
  const maxLines = BH - 4;
88
84
  const visible = log.slice(-maxLines);
89
85
  let out = '';
90
- out += `{bold}{#bb9af7-fg}โšก A3M Router{/} ${D('ยท')} {#9ece6a-fg}${activeModel}{/} ${D('ยท')} ${D(`${reqCount} req`)} ${D('ยท')} ${D(`$${totalCost.toFixed(6)}`)}\n`;
91
- out += `${D('โ”€'.repeat(BW - 6))}\n`;
92
- out += '\n';
93
- for (const line of visible) {
86
+ out += `{bold}{#be185d-fg}โšก A3M Router{/} ${D('ยท')} {#059669-fg}${activeModel}{/} ${D('ยท')} ${D(`${reqCount} req`)} ${D('ยท')} ${D(`$${totalCost.toFixed(6)}`)}\n`;
87
+ out += `${D('โ”€'.repeat(BW - 6))}\n\n`;
88
+ for (const line of visible)
94
89
  out += line + '\n';
95
- }
96
90
  if (visible.length === 0) {
97
91
  out += ` ${D('Type a query โ€” auto-routed to cheapest model.')}\n\n`;
98
92
  out += ` ${D('Commands:')}\n`;
99
- out += ` {#7aa2f7-fg}/route{/} ${D('<query>')} /cost /model nvidia\n`;
100
- out += ` {#7aa2f7-fg}/health{/} /models /clear\n`;
101
- out += ` {#7aa2f7-fg}/exit{/} /help\n\n`;
93
+ out += ` {#2563eb-fg}/route{/} ${D('<query>')} /cost /model nvidia\n`;
94
+ out += ` {#2563eb-fg}/health{/} /models /clear\n`;
95
+ out += ` {#2563eb-fg}/exit{/} /help\n\n`;
102
96
  out += ` ${D('nvidia (free) ยท groq (free) ยท deepseek ($9.46)')}\n`;
103
97
  }
104
98
  box.setContent(out);
@@ -107,7 +101,7 @@ function render() {
107
101
  function cmd(c) {
108
102
  if (!c)
109
103
  return;
110
- log.push(`{bold}{#7dcfff-fg}โ–ธ{/} ${c}`);
104
+ log.push(`{bold}{#0891b2-fg}โ–ธ{/} ${c}`);
111
105
  if (c === '/exit' || c === '/q') {
112
106
  screen.destroy();
113
107
  process.exit(0);
@@ -117,25 +111,25 @@ function cmd(c) {
117
111
  else if (c === '/clear')
118
112
  log.length = 0;
119
113
  else if (c === '/cost') {
120
- log.push(` {#bb9af7-fg}A3M{/} Cost:`);
114
+ log.push(` {#be185d-fg}A3M{/} Cost:`);
121
115
  log.push(` ${D('nvidia $0 | deepseek $0.000009 | groq $0 | cerebras $0')}`);
122
116
  log.push(` ${D(`TOTAL $${totalCost.toFixed(6)} | ${reqCount} req | 99.97% saved`)}`);
123
117
  }
124
118
  else if (c === '/health') {
125
- log.push(` {#bb9af7-fg}A3M{/} Health:`);
126
- log.push(` {#9ece6a-fg}โ—{/} nvidia 85ms {#9ece6a-fg}โ—{/} deepseek 210ms {#9ece6a-fg}โ—{/} groq 150ms {#9ece6a-fg}โ—{/} cerebras 320ms`);
127
- log.push(` {#f7768e-fg}โœ•{/} mistral OFFLINE {#9ece6a-fg}โ—{/} ollama 50ms`);
119
+ log.push(` {#be185d-fg}A3M{/} Health:`);
120
+ log.push(` {#059669-fg}โ—{/} nvidia 85ms {#059669-fg}โ—{/} deepseek 210ms {#059669-fg}โ—{/} groq 150ms {#059669-fg}โ—{/} cerebras 320ms`);
121
+ log.push(` {#dc2626-fg}โœ•{/} mistral OFFLINE {#059669-fg}โ—{/} ollama 50ms`);
128
122
  }
129
123
  else if (c === '/models') {
130
- log.push(` {#bb9af7-fg}A3M{/} 47+ providers:`);
131
- log.push(` {#9ece6a-fg}โ— nvidia{/} (free) {#7dcfff-fg}โ— groq{/} (free) {#e0af68-fg}โ— deepseek{/} (cheap) {#bb9af7-fg}โ— cerebras{/} (free)`);
124
+ log.push(` {#be185d-fg}A3M{/} 47+ providers:`);
125
+ log.push(` {#059669-fg}โ— nvidia{/} (free) {#0891b2-fg}โ— groq{/} (free) {#d97706-fg}โ— deepseek{/} (cheap) {#7c3aed-fg}โ— cerebras{/} (free)`);
132
126
  }
133
127
  else if (c.startsWith('/model ')) {
134
128
  const w = c.replace('/model ', '').trim();
135
- const valid = ['nvidia', 'deepseek', 'groq', 'cerebras', 'mistral', 'openai', 'ollama'];
136
- if (valid.includes(w)) {
129
+ const ok = ['nvidia', 'deepseek', 'groq', 'cerebras', 'mistral', 'openai', 'ollama'];
130
+ if (ok.includes(w)) {
137
131
  activeModel = `${w}/auto`;
138
- log.push(` ${D(`โ†’ {#9ece6a-fg}${activeModel}{/}`)}`);
132
+ log.push(` ${D(`โ†’ {#059669-fg}${activeModel}{/}`)}`);
139
133
  }
140
134
  else
141
135
  log.push(` ${D(`Unknown: ${w}`)}`);
@@ -145,7 +139,7 @@ function cmd(c) {
145
139
  const cost = Math.random() * 0.00005;
146
140
  totalCost += cost;
147
141
  reqCount++;
148
- log.push(` {#bb9af7-fg}A3M{/} {#9ece6a-fg}${activeModel}{/} ${D('ยท')} {#e0af68-fg}${ms}ms{/} ${D('ยท')} {#ff9e64-fg}$${cost.toFixed(6)}{/}`);
142
+ log.push(` {#be185d-fg}A3M{/} {#059669-fg}${activeModel}{/} ${D('ยท')} {#d97706-fg}${ms}ms{/} ${D('ยท')} {#ea580c-fg}$${cost.toFixed(6)}{/}`);
149
143
  log.push(` ${c}`);
150
144
  }
151
145
  while (log.length > 25)
@@ -153,10 +147,8 @@ function cmd(c) {
153
147
  render();
154
148
  prompt.focus();
155
149
  }
156
- // Keys
157
150
  screen.key(['C-c', 'escape'], () => { screen.destroy(); process.exit(0); });
158
151
  prompt.key('enter', () => { const v = prompt.getValue().trim(); prompt.clearValue(); cmd(v); });
159
- // Start
160
152
  screen.append(box);
161
153
  render();
162
154
  prompt.focus();
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/tui/dashboard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/tui/dashboard.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adaptive-memory-multi-model-router",
3
- "version": "2.13.13",
3
+ "version": "2.13.15",
4
4
  "shortName": "A3M Router",
5
5
  "displayName": "A3M Router - Adaptive Memory Multi-Model Router",
6
6
  "description": "๐Ÿ”ฅ Fastest-growing npm LLM router โ€” 0 to 10K downloads in 14 days. Parallel multi-LLM execution with independent benchmark validation (138ms baseline, +96ms proxy overhead), 47+ providers, 99.5% routing accuracy, 62% cost savings. Open-source AI gateway with ensemble voting, semantic cache, budget enforcement. 19.5 KB, zero ML.",
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * A3M Router โ€” Overlay Box (blessed, non-fullscreen)
3
+ * A3M Router โ€” Overlay Box TUI (Sakura Light Theme)
4
4
  */
5
5
 
6
6
  import * as blessed from 'blessed';
7
7
 
8
- // State
8
+ // โ”€โ”€ State โ”€โ”€
9
9
  let activeModel = 'nvidia/llama-3.1-8b';
10
10
  let totalCost = 0.000087;
11
11
  let reqCount = 4;
12
12
  const log: string[] = [];
13
13
 
14
- // Screen โ€” floating overlay, not fullscreen
14
+ // โ”€โ”€ Screen โ”€โ”€
15
15
  const screen = blessed.screen({
16
16
  smartCSR: true,
17
17
  fullUnicode: true,
@@ -19,63 +19,55 @@ const screen = blessed.screen({
19
19
  cursor: { shape: 'line', blink: true },
20
20
  });
21
21
 
22
- // Box settings
23
22
  const BW = 82;
24
23
  const BH = 18;
24
+ function L() { return Math.max(0, Math.floor(((screen.width as number) - BW) / 2)); }
25
+ function T() { return Math.max(0, Math.floor(((screen.height as number) - BH) / 2)); }
26
+
27
+ // โ”€โ”€ SAKURA LIGHT THEME โ”€โ”€
28
+ // bg: #fff5f7 (blush white)
29
+ // srf: #fce7f3 (light pink)
30
+ // dim: #d8a4b8 (muted rose)
31
+ // txt: #831843 (deep maroon)
32
+ // pink:#be185d (hot pink)
33
+ // grn: #059669 (emerald)
34
+ // blu: #2563eb (royal blue)
35
+ // amb: #d97706 (amber)
36
+ // red: #dc2626 (crimson)
37
+ // cyn: #0891b2 (teal)
38
+ // prp: #7c3aed (violet)
25
39
 
26
- function boxLeft() { return Math.max(0, Math.floor(((screen.width as number) - BW) / 2)); }
27
- function boxTop() { return Math.max(0, Math.floor(((screen.height as number) - BH) / 2)); }
28
-
29
- // Overlay box
30
40
  const box = blessed.box({
31
- top: boxTop(),
32
- left: boxLeft(),
33
- width: BW,
34
- height: BH,
35
- border: { type: 'line', fg: 'magenta' },
36
- style: { fg: '#c0caf5', bg: '#1a1b26' },
37
- tags: true,
38
- scrollable: true,
39
- mouse: true,
40
- keys: true,
41
+ top: T(), left: L(), width: BW, height: BH,
42
+ border: { type: 'line', fg: '#f472b6' },
43
+ style: { fg: '#831843', bg: '#fff5f7' },
44
+ tags: true, scrollable: true, mouse: true, keys: true,
41
45
  padding: { left: 1, right: 1, top: 0, bottom: 0 },
42
46
  });
43
47
 
44
- // Prompt
45
48
  const prompt = blessed.textbox({
46
- parent: box,
47
- bottom: 1,
48
- left: 0,
49
- width: BW - 4,
50
- height: 1,
51
- style: { fg: '#c0caf5', bg: '#24283b' },
52
- inputOnFocus: true,
53
- keys: true,
54
- tags: true,
49
+ parent: box, bottom: 1, left: 0, width: BW - 4, height: 1,
50
+ style: { fg: '#831843', bg: '#fce7f3' },
51
+ inputOnFocus: true, keys: true, tags: true,
55
52
  });
56
53
 
57
- // Helpers
58
- const D = (s: string) => `{#565f89-fg}${s}{/}`;
54
+ const D = (s: string) => `{#d8a4b8-fg}${s}{/}`;
59
55
 
60
56
  function render() {
61
57
  const maxLines = BH - 4;
62
58
  const visible = log.slice(-maxLines);
63
-
64
59
  let out = '';
65
- out += `{bold}{#bb9af7-fg}โšก A3M Router{/} ${D('ยท')} {#9ece6a-fg}${activeModel}{/} ${D('ยท')} ${D(`${reqCount} req`)} ${D('ยท')} ${D(`$${totalCost.toFixed(6)}`)}\n`;
66
- out += `${D('โ”€'.repeat(BW - 6))}\n`;
67
- out += '\n';
60
+ out += `{bold}{#be185d-fg}โšก A3M Router{/} ${D('ยท')} {#059669-fg}${activeModel}{/} ${D('ยท')} ${D(`${reqCount} req`)} ${D('ยท')} ${D(`$${totalCost.toFixed(6)}`)}\n`;
61
+ out += `${D('โ”€'.repeat(BW - 6))}\n\n`;
68
62
 
69
- for (const line of visible) {
70
- out += line + '\n';
71
- }
63
+ for (const line of visible) out += line + '\n';
72
64
 
73
65
  if (visible.length === 0) {
74
66
  out += ` ${D('Type a query โ€” auto-routed to cheapest model.')}\n\n`;
75
67
  out += ` ${D('Commands:')}\n`;
76
- out += ` {#7aa2f7-fg}/route{/} ${D('<query>')} /cost /model nvidia\n`;
77
- out += ` {#7aa2f7-fg}/health{/} /models /clear\n`;
78
- out += ` {#7aa2f7-fg}/exit{/} /help\n\n`;
68
+ out += ` {#2563eb-fg}/route{/} ${D('<query>')} /cost /model nvidia\n`;
69
+ out += ` {#2563eb-fg}/health{/} /models /clear\n`;
70
+ out += ` {#2563eb-fg}/exit{/} /help\n\n`;
79
71
  out += ` ${D('nvidia (free) ยท groq (free) ยท deepseek ($9.46)')}\n`;
80
72
  }
81
73
 
@@ -85,32 +77,32 @@ function render() {
85
77
 
86
78
  function cmd(c: string) {
87
79
  if (!c) return;
88
- log.push(`{bold}{#7dcfff-fg}โ–ธ{/} ${c}`);
80
+ log.push(`{bold}{#0891b2-fg}โ–ธ{/} ${c}`);
89
81
 
90
82
  if (c === '/exit' || c === '/q') { screen.destroy(); process.exit(0); }
91
83
  else if (c === '/help') log.push(` ${D('/route /cost /health /models /model <p> /clear /exit')}`);
92
84
  else if (c === '/clear') log.length = 0;
93
85
  else if (c === '/cost') {
94
- log.push(` {#bb9af7-fg}A3M{/} Cost:`);
86
+ log.push(` {#be185d-fg}A3M{/} Cost:`);
95
87
  log.push(` ${D('nvidia $0 | deepseek $0.000009 | groq $0 | cerebras $0')}`);
96
88
  log.push(` ${D(`TOTAL $${totalCost.toFixed(6)} | ${reqCount} req | 99.97% saved`)}`);
97
89
  } else if (c === '/health') {
98
- log.push(` {#bb9af7-fg}A3M{/} Health:`);
99
- log.push(` {#9ece6a-fg}โ—{/} nvidia 85ms {#9ece6a-fg}โ—{/} deepseek 210ms {#9ece6a-fg}โ—{/} groq 150ms {#9ece6a-fg}โ—{/} cerebras 320ms`);
100
- log.push(` {#f7768e-fg}โœ•{/} mistral OFFLINE {#9ece6a-fg}โ—{/} ollama 50ms`);
90
+ log.push(` {#be185d-fg}A3M{/} Health:`);
91
+ log.push(` {#059669-fg}โ—{/} nvidia 85ms {#059669-fg}โ—{/} deepseek 210ms {#059669-fg}โ—{/} groq 150ms {#059669-fg}โ—{/} cerebras 320ms`);
92
+ log.push(` {#dc2626-fg}โœ•{/} mistral OFFLINE {#059669-fg}โ—{/} ollama 50ms`);
101
93
  } else if (c === '/models') {
102
- log.push(` {#bb9af7-fg}A3M{/} 47+ providers:`);
103
- log.push(` {#9ece6a-fg}โ— nvidia{/} (free) {#7dcfff-fg}โ— groq{/} (free) {#e0af68-fg}โ— deepseek{/} (cheap) {#bb9af7-fg}โ— cerebras{/} (free)`);
94
+ log.push(` {#be185d-fg}A3M{/} 47+ providers:`);
95
+ log.push(` {#059669-fg}โ— nvidia{/} (free) {#0891b2-fg}โ— groq{/} (free) {#d97706-fg}โ— deepseek{/} (cheap) {#7c3aed-fg}โ— cerebras{/} (free)`);
104
96
  } else if (c.startsWith('/model ')) {
105
97
  const w = c.replace('/model ', '').trim();
106
- const valid = ['nvidia', 'deepseek', 'groq', 'cerebras', 'mistral', 'openai', 'ollama'];
107
- if (valid.includes(w)) { activeModel = `${w}/auto`; log.push(` ${D(`โ†’ {#9ece6a-fg}${activeModel}{/}`)}`); }
98
+ const ok = ['nvidia','deepseek','groq','cerebras','mistral','openai','ollama'];
99
+ if (ok.includes(w)) { activeModel = `${w}/auto`; log.push(` ${D(`โ†’ {#059669-fg}${activeModel}{/}`)}`); }
108
100
  else log.push(` ${D(`Unknown: ${w}`)}`);
109
101
  } else {
110
102
  const ms = Math.floor(Math.random() * 100) + 30;
111
103
  const cost = Math.random() * 0.00005;
112
104
  totalCost += cost; reqCount++;
113
- log.push(` {#bb9af7-fg}A3M{/} {#9ece6a-fg}${activeModel}{/} ${D('ยท')} {#e0af68-fg}${ms}ms{/} ${D('ยท')} {#ff9e64-fg}$${cost.toFixed(6)}{/}`);
105
+ log.push(` {#be185d-fg}A3M{/} {#059669-fg}${activeModel}{/} ${D('ยท')} {#d97706-fg}${ms}ms{/} ${D('ยท')} {#ea580c-fg}$${cost.toFixed(6)}{/}`);
114
106
  log.push(` ${c}`);
115
107
  }
116
108
 
@@ -119,11 +111,9 @@ function cmd(c: string) {
119
111
  prompt.focus();
120
112
  }
121
113
 
122
- // Keys
123
114
  screen.key(['C-c', 'escape'], () => { screen.destroy(); process.exit(0); });
124
115
  prompt.key('enter', () => { const v = prompt.getValue().trim(); prompt.clearValue(); cmd(v); });
125
116
 
126
- // Start
127
117
  screen.append(box);
128
118
  render();
129
119
  prompt.focus();