vektor-slipstream 1.1.3 → 1.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.
- package/package.json +1 -1
- package/vektor-banner-loader.js +1 -1
- package/vektor-tui.js +45 -45
package/package.json
CHANGED
package/vektor-banner-loader.js
CHANGED
|
@@ -13,7 +13,7 @@ console.log(' \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d\u2588\u2588\u25
|
|
|
13
13
|
console.log(' \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2557 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2551 \u2588\u2588\u2551 ');
|
|
14
14
|
console.log(' \u255a\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u255d\u255a\u2550\u255d \u255a\u2550\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u255d \u255a\u2550\u255d ');
|
|
15
15
|
console.log('');
|
|
16
|
-
console.log(' SLIPSTREAM
|
|
16
|
+
console.log(' SLIPSTREAM v' + require('./package.json').version + ' \u00b7 Sovereign Agent Memory');
|
|
17
17
|
console.log(' \u2514\u2500 Loading... (first run downloads ~25MB model \u2014 one time only)');
|
|
18
18
|
console.log('');
|
|
19
19
|
|
package/vektor-tui.js
CHANGED
|
@@ -14,20 +14,20 @@ try { PKG = require('./package.json'); } catch(_) { PKG = { version: '1.1.1' };
|
|
|
14
14
|
|
|
15
15
|
// ── PALETTE (SBB-inspired warm dark) ─────────────────────────────────────────
|
|
16
16
|
const P = {
|
|
17
|
-
bg: '
|
|
18
|
-
bg2: '
|
|
19
|
-
card: '
|
|
17
|
+
bg: 'black',
|
|
18
|
+
bg2: 'black',
|
|
19
|
+
card: 'black',
|
|
20
20
|
border: '#2a2a20',
|
|
21
|
-
orange: '
|
|
22
|
-
amber: '
|
|
23
|
-
cream: '
|
|
24
|
-
dim: '
|
|
21
|
+
orange: 'yellow',
|
|
22
|
+
amber: 'yellow',
|
|
23
|
+
cream: 'white',
|
|
24
|
+
dim: 'grey',
|
|
25
25
|
white: '#e8e0d0',
|
|
26
|
-
green: '
|
|
27
|
-
red: '
|
|
28
|
-
cyan: '
|
|
29
|
-
sel: '
|
|
30
|
-
selbrd: '
|
|
26
|
+
green: 'green',
|
|
27
|
+
red: 'red',
|
|
28
|
+
cyan: 'cyan',
|
|
29
|
+
sel: 'black',
|
|
30
|
+
selbrd: 'yellow',
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
// ── SCREEN ────────────────────────────────────────────────────────────────────
|
|
@@ -36,7 +36,7 @@ const screen = blessed.screen({ smartCSR: true, fullUnicode: true, title: 'VEKTO
|
|
|
36
36
|
// ── TOP SEARCH BAR ────────────────────────────────────────────────────────────
|
|
37
37
|
const searchBar = blessed.box({
|
|
38
38
|
top: 0, left: 0, width: '100%', height: 3,
|
|
39
|
-
style: { bg:
|
|
39
|
+
style: { bg: 'black', fg: 'white' },
|
|
40
40
|
content: '',
|
|
41
41
|
});
|
|
42
42
|
|
|
@@ -44,7 +44,7 @@ const searchLeft = blessed.textbox({
|
|
|
44
44
|
parent: searchBar,
|
|
45
45
|
top: 0, left: 0, width: '45%', height: 3,
|
|
46
46
|
border: { type: 'line' },
|
|
47
|
-
style: { fg:
|
|
47
|
+
style: { fg: 'white', bg: 'black', border: { fg: 'grey' }, focus: { border: { fg: 'yellow' } } },
|
|
48
48
|
inputOnFocus: true,
|
|
49
49
|
value: 'search memories...',
|
|
50
50
|
});
|
|
@@ -53,7 +53,7 @@ const searchRight = blessed.textbox({
|
|
|
53
53
|
parent: searchBar,
|
|
54
54
|
top: 0, left: '45%', width: '35%', height: 3,
|
|
55
55
|
border: { type: 'line' },
|
|
56
|
-
style: { fg:
|
|
56
|
+
style: { fg: 'white', bg: 'black', border: { fg: 'grey' }, focus: { border: { fg: 'yellow' } } },
|
|
57
57
|
inputOnFocus: true,
|
|
58
58
|
value: 'type: all',
|
|
59
59
|
});
|
|
@@ -63,7 +63,7 @@ const searchBtn = blessed.box({
|
|
|
63
63
|
top: 0, right: 0, width: '20%', height: 3,
|
|
64
64
|
border: { type: 'line' },
|
|
65
65
|
tags: true,
|
|
66
|
-
style: { fg:
|
|
66
|
+
style: { fg: 'white', bg: 'black', border: { fg: 'grey' } },
|
|
67
67
|
content: ` {bold}{#e8742a-fg}▶{/#e8742a-fg}{/bold} VEKTOR SLIPSTREAM v${PKG.version}`,
|
|
68
68
|
});
|
|
69
69
|
|
|
@@ -73,14 +73,14 @@ screen.append(searchBar);
|
|
|
73
73
|
const mainLeft = blessed.box({
|
|
74
74
|
top: 3, left: 0, width: '48%', height: '100%-6',
|
|
75
75
|
scrollable: true, alwaysScroll: true, keys: true, mouse: true,
|
|
76
|
-
style: { bg:
|
|
76
|
+
style: { bg: 'black' },
|
|
77
77
|
tags: true,
|
|
78
78
|
});
|
|
79
79
|
|
|
80
80
|
const mainRight = blessed.box({
|
|
81
81
|
top: 3, left: '48%', width: '52%', height: '100%-6',
|
|
82
82
|
border: { type: 'line' },
|
|
83
|
-
style: { bg:
|
|
83
|
+
style: { bg: 'black', border: { fg: 'grey' } },
|
|
84
84
|
tags: true, scrollable: true, keys: true, mouse: true,
|
|
85
85
|
});
|
|
86
86
|
|
|
@@ -92,7 +92,7 @@ const statusBar = blessed.box({
|
|
|
92
92
|
bottom: 0, left: 0, width: '100%', height: 3,
|
|
93
93
|
border: { type: 'line' },
|
|
94
94
|
tags: true,
|
|
95
|
-
style: { bg:
|
|
95
|
+
style: { bg: 'black', border: { fg: 'grey' } },
|
|
96
96
|
content: '',
|
|
97
97
|
});
|
|
98
98
|
screen.append(statusBar);
|
|
@@ -123,7 +123,7 @@ let memory = null, memories = [], selected = 0, filterType = 'all';
|
|
|
123
123
|
|
|
124
124
|
// ── CARD RENDERER ─────────────────────────────────────────────────────────────
|
|
125
125
|
function typeColor(type) {
|
|
126
|
-
return { semantic:
|
|
126
|
+
return { semantic: 'cyan', causal: 'yellow', temporal: 'green', entity: 'red' }[type] || 'grey';
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
function typeBg(type) {
|
|
@@ -155,36 +155,36 @@ function renderCards() {
|
|
|
155
155
|
const color = typeColor(m.type);
|
|
156
156
|
const age = m.created_at ? Math.round((Date.now() - m.created_at) / 3600000) + 'h ago' : '—';
|
|
157
157
|
const typeTag = (m.type || 'mem').slice(0, 3).toUpperCase();
|
|
158
|
-
const bColor = isSelected ?
|
|
158
|
+
const bColor = isSelected ? 'yellow' : 'grey';
|
|
159
159
|
const preview = m.content.slice(0, W - 4);
|
|
160
160
|
|
|
161
161
|
content += isSelected
|
|
162
|
-
? `{${
|
|
163
|
-
: `{${
|
|
162
|
+
? `{${'yellow'}-fg}┌${'─'.repeat(W - 2)}┐{/${'yellow'}-fg}\n`
|
|
163
|
+
: `{${'grey'}-fg}┌${'─'.repeat(W - 2)}┐{/${'grey'}-fg}\n`;
|
|
164
164
|
|
|
165
165
|
// Title row
|
|
166
|
-
content += isSelected ? `{${
|
|
166
|
+
content += isSelected ? `{${'yellow'}-fg}│{/${'yellow'}-fg}` : `{${'grey'}-fg}│{/${'grey'}-fg}`;
|
|
167
167
|
content += ` {bold}{${color}-fg}${typeTag}{/${color}-fg}{/bold}`;
|
|
168
|
-
content += ` {${isSelected ?
|
|
168
|
+
content += ` {${isSelected ? 'white' : 'white'}-fg}${preview}{/${isSelected ? 'white' : 'white'}-fg}`;
|
|
169
169
|
content += ' '.repeat(Math.max(0, W - 6 - typeTag.length - preview.length));
|
|
170
|
-
content += isSelected ? `{${
|
|
170
|
+
content += isSelected ? `{${'yellow'}-fg}│{/${'yellow'}-fg}\n` : `{${'grey'}-fg}│{/${'grey'}-fg}\n`;
|
|
171
171
|
|
|
172
172
|
// Timeline row
|
|
173
|
-
content += isSelected ? `{${
|
|
173
|
+
content += isSelected ? `{${'yellow'}-fg}│{/${'yellow'}-fg}` : `{${'grey'}-fg}│{/${'grey'}-fg}`;
|
|
174
174
|
content += ` ${renderTimeline(m.importance)}`;
|
|
175
|
-
content += ` {${
|
|
175
|
+
content += ` {${'grey'}-fg}${age}{/${'grey'}-fg}`;
|
|
176
176
|
content += ' '.repeat(Math.max(0, W - 4 - (m.importance || 1) * 4 - age.length - 2));
|
|
177
|
-
content += isSelected ? `{${
|
|
177
|
+
content += isSelected ? `{${'yellow'}-fg}│{/${'yellow'}-fg}\n` : `{${'grey'}-fg}│{/${'grey'}-fg}\n`;
|
|
178
178
|
|
|
179
179
|
content += isSelected
|
|
180
|
-
? `{${
|
|
181
|
-
: `{${
|
|
180
|
+
? `{${'yellow'}-fg}└${'─'.repeat(W - 2)}┘{/${'yellow'}-fg}\n`
|
|
181
|
+
: `{${'grey'}-fg}└${'─'.repeat(W - 2)}┘{/${'grey'}-fg}\n`;
|
|
182
182
|
content += '\n';
|
|
183
183
|
});
|
|
184
184
|
|
|
185
185
|
if (memories.length === 0) {
|
|
186
|
-
content += `\n {${
|
|
187
|
-
content += ` {${
|
|
186
|
+
content += `\n {${'grey'}-fg}No memories found.{/${'grey'}-fg}\n\n`;
|
|
187
|
+
content += ` {${'yellow'}-fg}Press A to add your first memory.{/${'yellow'}-fg}\n`;
|
|
188
188
|
}
|
|
189
189
|
|
|
190
190
|
mainLeft.setContent(content);
|
|
@@ -201,7 +201,7 @@ function renderCards() {
|
|
|
201
201
|
function renderDetail() {
|
|
202
202
|
const m = memories[selected];
|
|
203
203
|
if (!m) {
|
|
204
|
-
mainRight.setContent(`\n\n {${
|
|
204
|
+
mainRight.setContent(`\n\n {${'grey'}-fg}Select a memory to inspect{/${'grey'}-fg}`);
|
|
205
205
|
screen.render();
|
|
206
206
|
return;
|
|
207
207
|
}
|
|
@@ -211,19 +211,19 @@ function renderDetail() {
|
|
|
211
211
|
const typeTag = (m.type || 'memory').toUpperCase();
|
|
212
212
|
|
|
213
213
|
let content = '\n';
|
|
214
|
-
content += ` {bold}{${color}-fg}${typeTag}{/${color}-fg}{/bold} {${
|
|
215
|
-
content += ` {bold}{${
|
|
216
|
-
content += ` {${
|
|
217
|
-
content += ` {${
|
|
218
|
-
content += ` {${
|
|
219
|
-
content += ` {${
|
|
220
|
-
content += ` {${
|
|
214
|
+
content += ` {bold}{${color}-fg}${typeTag}{/${color}-fg}{/bold} {${'grey'}-fg}#${m.id}{/${'grey'}-fg}\n\n`;
|
|
215
|
+
content += ` {bold}{${'white'}-fg}${m.content}{/${'white'}-fg}{/bold}\n\n`;
|
|
216
|
+
content += ` {${'grey'}-fg}${'─'.repeat(40)}{/${'grey'}-fg}\n\n`;
|
|
217
|
+
content += ` {${'grey'}-fg}IMPORTANCE {/${'grey'}-fg} ${renderTimeline(m.importance)}\n\n`;
|
|
218
|
+
content += ` {${'grey'}-fg}CREATED {/${'grey'}-fg} {${'white'}-fg}${age}{/${'white'}-fg}\n\n`;
|
|
219
|
+
content += ` {${'grey'}-fg}${'─'.repeat(40)}{/${'grey'}-fg}\n\n`;
|
|
220
|
+
content += ` {${'grey'}-fg}[D]{/${'grey'}-fg} delete {${'grey'}-fg}[E]{/${'grey'}-fg} edit importance\n\n`;
|
|
221
221
|
|
|
222
222
|
// Show connected memories count if available
|
|
223
223
|
const total = memories.length;
|
|
224
224
|
const sameType = memories.filter(x => x.type === m.type).length;
|
|
225
|
-
content += ` {${
|
|
226
|
-
content += ` {${
|
|
225
|
+
content += ` {${'grey'}-fg}${'─'.repeat(40)}{/${'grey'}-fg}\n\n`;
|
|
226
|
+
content += ` {${'grey'}-fg}TYPE POOL {/${'grey'}-fg} {${color}-fg}${sameType}{/${color}-fg} {${'grey'}-fg}of ${total} memories{/${'grey'}-fg}\n`;
|
|
227
227
|
|
|
228
228
|
mainRight.setContent(content);
|
|
229
229
|
screen.render();
|
|
@@ -234,14 +234,14 @@ const inputOverlay = blessed.box({
|
|
|
234
234
|
top: 'center', left: 'center', width: '60%', height: 5,
|
|
235
235
|
hidden: true,
|
|
236
236
|
border: { type: 'line' },
|
|
237
|
-
style: { bg:
|
|
237
|
+
style: { bg: 'black', border: { fg: 'yellow' } },
|
|
238
238
|
tags: true,
|
|
239
239
|
});
|
|
240
240
|
|
|
241
241
|
const inputField = blessed.textbox({
|
|
242
242
|
parent: inputOverlay,
|
|
243
243
|
top: 1, left: 2, width: '100%-6', height: 1,
|
|
244
|
-
style: { fg:
|
|
244
|
+
style: { fg: 'yellow', bg: 'black' },
|
|
245
245
|
inputOnFocus: true,
|
|
246
246
|
});
|
|
247
247
|
|