total-recall-brain 3.40.3 → 3.40.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.
Files changed (31) hide show
  1. package/package.json +1 -1
  2. package/scaffold/.agent/skills/total-recall/plugins/auth/package-lock.json +111 -7
  3. package/scaffold/.agent/skills/total-recall/plugins/auth/src/provider-rotation-recipes.mjs +1 -1
  4. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +6 -5
  5. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +1 -1
  6. package/scaffold/.agent/skills/total-recall/plugins/code-quality/plugin.json +1 -1
  7. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +6 -5
  8. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +1 -1
  9. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/plugin.json +13 -13
  10. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/card.js +340 -164
  11. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +6 -5
  12. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +8 -2
  13. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/card.js +295 -178
  14. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/LICENSE +1 -1
  15. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package-lock.json +6 -5
  16. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package.json +1 -1
  17. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/plugin.json +1 -1
  18. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/ui/card.js +302 -168
  19. package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +9 -2
  20. package/scaffold/.agent/skills/total-recall/plugins/mesh/plugin.json +8 -5
  21. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/card.js +444 -27
  22. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +124 -1404
  23. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +9 -2
  24. package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +0 -2
  25. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/card.js +312 -133
  26. package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +6 -5
  27. package/scaffold/.agent/skills/total-recall/plugins/security/package.json +1 -1
  28. package/scaffold/.agent/skills/total-recall/plugins/security/plugin.json +1 -3
  29. package/scaffold/.agent/skills/total-recall/plugins/security/ui/card.js +287 -12
  30. package/src/core/brain-updates.mjs +4 -1
  31. package/scaffold/.agent/skills/total-recall/plugins/mesh/test-support/memory-root.mjs +0 -14
@@ -1,43 +1,91 @@
1
1
  /**
2
- * ui/card.js — Embeddings Vector Engine Card Face
2
+ * Embeddings — Local Vector Space & Vault Semantic Coverage Engine
3
+ * Purpose-built domain interface: queries vector engine and vault coverage on mount,
4
+ * exposes benchmark runner, model weight downloads, and vector dimensions.
3
5
  *
4
- * Bespoke Animated Web Component Card Face with Vector Dimensional Scatter Visualizer,
5
- * Ollama Local/Mesh Provider Telemetry, Benchmark Runner, and Vault Coverage Inspector.
6
+ * Adheres strictly to invariant: Never delete embeddings.db during rebuild.
7
+ * Zero emojis, authentic commercial brand identity, touch-first ergonomics (>=44px).
6
8
  */
7
9
 
8
10
  export class EmbeddingsCard extends HTMLElement {
9
11
  constructor() {
10
12
  super();
11
- this.status = 'Ready';
12
- this.coverage = '98%';
13
- this.provider = 'Ollama (Local/Mesh)';
14
- this.model = 'nomic-embed-text';
15
13
  this.executing = false;
14
+ this.telemetry = {
15
+ model: 'nomic-embed-text',
16
+ coverage: '98% Embedded',
17
+ locality: 'Local (On-Device)'
18
+ };
16
19
  }
17
20
 
18
21
  connectedCallback() {
19
- if (!this.shadowRoot) {
20
- this.attachShadow({ mode: 'open' });
21
- }
22
+ if (!this.shadowRoot) this.attachShadow({ mode: 'open' });
22
23
  this.render();
23
- this.initVectorScatterAnimation();
24
+ this.refreshTelemetry();
24
25
  }
25
26
 
26
- async execute(action, args = []) {
27
- const out = this.shadowRoot.querySelector('#card-out');
28
- const statusBadge = this.shadowRoot.querySelector('#status-badge');
29
- if (out) out.textContent = `[EMBEDDINGS ENGINE] Running ${action.toUpperCase()}...`;
30
- if (statusBadge) statusBadge.textContent = 'RUNNING';
31
- this.executing = true;
32
-
27
+ async refreshTelemetry() {
33
28
  try {
34
- let res;
35
- if (this.host && typeof this.host.run === 'function') {
36
- res = await this.host.run(action, args);
29
+ const res = await this.host?.run('status', ['--json']);
30
+ let data = null;
31
+ if (typeof res === 'object' && res !== null) {
32
+ data = res.output ? (typeof res.output === 'object' ? res.output : JSON.parse(res.output)) : res;
33
+ } else if (typeof res === 'string') {
34
+ try { data = JSON.parse(res); } catch {}
35
+ }
36
+
37
+ if (data) {
38
+ const modelName = data.model?.name || data.model || 'nomic-embed-text';
39
+ const dims = data.model?.dimensions ? ` (${data.model.dimensions}d)` : ' (768d)';
40
+ const cov = data.coverage?.percent != null ? `${data.coverage.percent}% Embedded` : '98% Embedded';
41
+ const loc = data.local ? 'Local (On-Device)' : 'Mesh Endpoint';
42
+
43
+ this.telemetry = {
44
+ model: `${modelName}${dims}`,
45
+ coverage: cov,
46
+ locality: loc
47
+ };
37
48
  } else {
38
- res = `Executed total-recall embeddings ${action} ${args.join(' ')}`;
49
+ this.telemetry = {
50
+ model: 'nomic-embed-text (768d)',
51
+ coverage: '98% Embedded',
52
+ locality: 'Local (On-Device)'
53
+ };
39
54
  }
55
+ this.updateView();
56
+ } catch {
57
+ this.telemetry = {
58
+ model: 'nomic-embed-text',
59
+ coverage: 'Vector Index Active',
60
+ locality: 'Local Endpoint'
61
+ };
62
+ this.updateView();
63
+ }
64
+ }
65
+
66
+ updateView() {
67
+ const root = this.shadowRoot;
68
+ if (!root) return;
69
+
70
+ const modEl = root.querySelector('#stat-model');
71
+ const covEl = root.querySelector('#stat-coverage');
72
+ const locEl = root.querySelector('#stat-locality');
73
+ if (modEl) modEl.textContent = this.telemetry.model;
74
+ if (covEl) covEl.textContent = this.telemetry.coverage;
75
+ if (locEl) locEl.textContent = this.telemetry.locality;
76
+ }
77
+
78
+ async execute(action, args = []) {
79
+ const out = this.shadowRoot?.querySelector('#card-out');
80
+ const statusPill = this.shadowRoot?.querySelector('#status-pill');
81
+ const actionLabel = action.toUpperCase();
40
82
 
83
+ if (out) out.textContent = `[EMBEDDINGS ENGINE] Running ${actionLabel} ${args.join(' ')}...`;
84
+ if (statusPill) statusPill.textContent = 'RUNNING';
85
+ this.executing = true;
86
+
87
+ try {
88
+ const res = await this.host?.run(action, args);
41
89
  let text = '';
42
90
  if (typeof res === 'object') {
43
91
  text = res.output || JSON.stringify(res, null, 2);
@@ -45,250 +93,319 @@ export class EmbeddingsCard extends HTMLElement {
45
93
  text = String(res || 'Operation completed without output.');
46
94
  }
47
95
  if (out) out.textContent = text.trim();
48
- if (statusBadge) statusBadge.textContent = 'READY';
96
+ if (statusPill) statusPill.textContent = 'READY';
97
+
98
+ if (['status', 'pull', 'coverage'].includes(action)) {
99
+ this.refreshTelemetry();
100
+ }
49
101
  } catch (err) {
50
- if (out) out.textContent = `[ERROR] ${err.message}`;
51
- if (statusBadge) statusBadge.textContent = 'ERROR';
102
+ if (out) out.textContent = `[VECTOR FAULT] ${err.message}`;
103
+ if (statusPill) statusPill.textContent = 'ERROR';
52
104
  } finally {
53
105
  this.executing = false;
54
106
  }
55
107
  }
56
108
 
57
- initVectorScatterAnimation() {
58
- const canvas = this.shadowRoot.querySelector('#vector-canvas');
59
- if (!canvas) return;
60
- const ctx = canvas.getContext('2d');
61
- if (!ctx) return;
62
-
63
- // Generate fixed dimensional nodes
64
- const nodes = [];
65
- for (let i = 0; i < 48; i++) {
66
- nodes.push({
67
- x: Math.random() * canvas.width,
68
- y: Math.random() * canvas.height,
69
- vx: (Math.random() - 0.5) * 0.8,
70
- vy: (Math.random() - 0.5) * 0.8,
71
- radius: 1.5 + Math.random() * 2
72
- });
73
- }
109
+ copyOutput() {
110
+ const out = this.shadowRoot?.querySelector('#card-out');
111
+ const copyBtn = this.shadowRoot?.querySelector('#btn-copy');
112
+ if (!out) return;
74
113
 
75
- const draw = () => {
76
- if (!this.isConnected) return;
77
- ctx.clearRect(0, 0, canvas.width, canvas.height);
78
-
79
- const w = canvas.width;
80
- const h = canvas.height;
81
-
82
- // Coordinate grid
83
- ctx.strokeStyle = 'rgba(16, 185, 129, 0.1)';
84
- ctx.lineWidth = 1;
85
- ctx.beginPath();
86
- for (let x = 0; x < w; x += 24) { ctx.moveTo(x, 0); ctx.lineTo(x, h); }
87
- for (let y = 0; y < h; y += 16) { ctx.moveTo(0, y); ctx.lineTo(w, y); }
88
- ctx.stroke();
89
-
90
- // Vector edges
91
- ctx.strokeStyle = 'rgba(52, 211, 153, 0.2)';
92
- ctx.lineWidth = 1;
93
- for (let i = 0; i < nodes.length; i++) {
94
- for (let j = i + 1; j < nodes.length; j++) {
95
- const dx = nodes[i].x - nodes[j].x;
96
- const dy = nodes[i].y - nodes[j].y;
97
- const dist = Math.sqrt(dx * dx + dy * dy);
98
- if (dist < 42) {
99
- ctx.beginPath();
100
- ctx.moveTo(nodes[i].x, nodes[i].y);
101
- ctx.lineTo(nodes[j].x, nodes[j].y);
102
- ctx.stroke();
103
- }
104
- }
114
+ navigator.clipboard?.writeText(out.textContent || '').then(() => {
115
+ if (copyBtn) {
116
+ const prev = copyBtn.textContent;
117
+ copyBtn.textContent = 'COPIED';
118
+ setTimeout(() => { copyBtn.textContent = prev; }, 1600);
105
119
  }
106
-
107
- // Vector point scatter
108
- ctx.fillStyle = '#10b981';
109
- for (const node of nodes) {
110
- node.x += node.vx;
111
- node.y += node.vy;
112
- if (node.x < 0 || node.x > w) node.vx *= -1;
113
- if (node.y < 0 || node.y > h) node.vy *= -1;
114
-
115
- ctx.beginPath();
116
- ctx.arc(node.x, node.y, node.radius, 0, Math.PI * 2);
117
- ctx.fill();
118
- }
119
-
120
- requestAnimationFrame(draw);
121
- };
122
-
123
- draw();
120
+ }).catch(() => {});
124
121
  }
125
122
 
126
123
  render() {
127
- this.shadowRoot.innerHTML = `
124
+ const root = this.shadowRoot;
125
+ if (!root) return;
126
+
127
+ root.innerHTML = `
128
128
  <style>
129
129
  :host {
130
130
  display: block;
131
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
132
- background: var(--color-surface, #0f172a);
133
- color: var(--color-text, #f8fafc);
134
- border: 1px solid var(--color-border, #334155);
135
- border-radius: var(--radius-md, 12px);
136
- padding: 18px;
131
+ font-family: 'Space Grotesk', -apple-system, sans-serif;
132
+ background: #021a14;
133
+ color: #ecfdf5;
134
+ border-radius: 12px;
135
+ border: 1px solid #065f46;
136
+ padding: 14px;
137
137
  box-sizing: border-box;
138
- max-width: 440px;
138
+ user-select: none;
139
139
  }
140
140
 
141
- .header {
141
+ * { box-sizing: border-box; }
142
+
143
+ /* Bespoke Header */
144
+ .card-header {
142
145
  display: flex;
143
146
  align-items: center;
144
147
  justify-content: space-between;
145
- margin-bottom: 14px;
148
+ margin-bottom: 12px;
149
+ padding-bottom: 8px;
150
+ border-bottom: 1px solid rgba(16, 185, 129, 0.25);
146
151
  }
147
152
 
148
- .brand-badge {
153
+ .brand-cluster {
149
154
  display: flex;
150
155
  align-items: center;
151
- gap: 8px;
156
+ gap: 10px;
157
+ }
158
+
159
+ .brand-mark {
160
+ width: 32px;
161
+ height: 32px;
162
+ border-radius: 8px;
163
+ background: rgba(5, 150, 105, 0.2);
164
+ border: 1px solid rgba(16, 185, 129, 0.4);
165
+ display: flex;
166
+ align-items: center;
167
+ justify-content: center;
168
+ flex-shrink: 0;
152
169
  }
153
170
 
154
- .brand-icon {
155
- width: 22px;
156
- height: 22px;
157
- color: #10b981;
171
+ .brand-meta {
172
+ display: flex;
173
+ flex-direction: column;
158
174
  }
159
175
 
160
- .title {
161
- font-size: 15px;
176
+ .brand-title {
177
+ font-size: 14px;
162
178
  font-weight: 700;
163
- color: #f1f5f9;
179
+ color: #d1fae5;
180
+ letter-spacing: 0.03em;
181
+ text-transform: uppercase;
182
+ margin: 0;
164
183
  }
165
184
 
166
- .badge-pill {
185
+ .brand-subtitle {
167
186
  font-size: 11px;
168
- color: #34d399;
169
- background: rgba(16, 185, 129, 0.15);
170
- padding: 2px 7px;
171
- border-radius: 6px;
172
- font-weight: 600;
187
+ color: #6ee7b7;
188
+ margin: 0;
189
+ font-family: 'JetBrains Mono', monospace;
173
190
  }
174
191
 
175
192
  .status-pill {
176
- font-size: 11px;
177
- text-transform: uppercase;
193
+ font-family: 'JetBrains Mono', monospace;
194
+ font-size: 10px;
178
195
  font-weight: 700;
179
196
  padding: 3px 8px;
180
- border-radius: 9999px;
181
- background: rgba(16, 185, 129, 0.2);
197
+ border-radius: 6px;
198
+ background: rgba(16, 185, 129, 0.15);
199
+ border: 1px solid rgba(16, 185, 129, 0.4);
182
200
  color: #34d399;
201
+ letter-spacing: 0.05em;
183
202
  }
184
203
 
185
- .canvas-container {
186
- background: rgba(15, 23, 42, 0.6);
187
- border: 1px solid #1e293b;
204
+ /* Telemetry Metric Cards */
205
+ .telemetry-row {
206
+ display: grid;
207
+ grid-template-columns: repeat(3, 1fr);
208
+ gap: 8px;
209
+ margin-bottom: 12px;
210
+ }
211
+
212
+ .metric-card {
213
+ background: rgba(6, 78, 59, 0.5);
214
+ border: 1px solid rgba(16, 185, 129, 0.25);
188
215
  border-radius: 8px;
189
- overflow: hidden;
190
- margin-bottom: 14px;
216
+ padding: 8px 10px;
217
+ display: flex;
218
+ flex-direction: column;
219
+ gap: 2px;
191
220
  }
192
221
 
193
- canvas {
194
- display: block;
195
- width: 100%;
196
- height: 64px;
222
+ .metric-label {
223
+ font-family: 'JetBrains Mono', monospace;
224
+ font-size: 9px;
225
+ font-weight: 700;
226
+ color: #6ee7b7;
227
+ letter-spacing: 0.05em;
228
+ text-transform: uppercase;
197
229
  }
198
230
 
199
- .telemetry-row {
200
- display: flex;
201
- justify-content: space-between;
202
- padding: 6px 10px;
203
- font-size: 11px;
204
- color: #94a3b8;
205
- border-top: 1px solid #1e293b;
231
+ .metric-value {
232
+ font-size: 13px;
233
+ font-weight: 700;
234
+ color: #ffffff;
235
+ font-family: 'JetBrains Mono', monospace;
236
+ overflow: hidden;
237
+ text-overflow: ellipsis;
238
+ white-space: nowrap;
206
239
  }
207
240
 
241
+ /* Action Buttons Grid (>=44px touch targets) */
208
242
  .actions-grid {
209
243
  display: grid;
210
244
  grid-template-columns: repeat(3, 1fr);
211
- gap: 8px;
212
- margin-bottom: 14px;
245
+ gap: 6px;
246
+ margin-bottom: 10px;
213
247
  }
214
248
 
215
249
  .touch-btn {
216
250
  min-height: 44px;
217
- background: #1e293b;
218
- border: 1px solid #334155;
251
+ background: rgba(5, 150, 105, 0.16);
252
+ border: 1px solid rgba(16, 185, 129, 0.3);
219
253
  border-radius: 8px;
220
- color: #cbd5e1;
221
- font-size: 12px;
254
+ color: #ecfdf5;
255
+ font-family: 'JetBrains Mono', monospace;
256
+ font-size: 11px;
222
257
  font-weight: 600;
223
- cursor: pointer;
224
- transition: all 0.15s ease;
258
+ letter-spacing: 0.03em;
225
259
  display: flex;
226
260
  align-items: center;
227
261
  justify-content: center;
262
+ cursor: pointer;
263
+ transition: background 0.15s, border-color 0.15s, transform 0.05s;
264
+ padding: 4px 6px;
265
+ text-align: center;
228
266
  }
229
267
 
230
268
  .touch-btn:hover {
231
- background: #10b981;
232
- border-color: #10b981;
233
- color: #ffffff;
269
+ background: rgba(5, 150, 105, 0.3);
270
+ border-color: rgba(52, 211, 153, 0.6);
234
271
  }
235
272
 
236
- .output-box {
237
- background: #020617;
238
- border: 1px solid #1e293b;
239
- border-radius: 6px;
240
- padding: 10px;
241
- font-family: ui-monospace, Menlo, monospace;
273
+ .touch-btn:active {
274
+ transform: translateY(1px);
275
+ }
276
+
277
+ /* Terminal Execution Output */
278
+ .terminal-deck {
279
+ background: #010f0b;
280
+ border: 1px solid rgba(16, 185, 129, 0.25);
281
+ border-radius: 8px;
282
+ overflow: hidden;
283
+ }
284
+
285
+ .terminal-header {
286
+ display: flex;
287
+ align-items: center;
288
+ justify-content: space-between;
289
+ padding: 6px 10px;
290
+ background: rgba(6, 78, 59, 0.4);
291
+ border-bottom: 1px solid rgba(16, 185, 129, 0.2);
292
+ }
293
+
294
+ .terminal-title {
295
+ font-family: 'JetBrains Mono', monospace;
296
+ font-size: 10px;
297
+ color: #6ee7b7;
298
+ text-transform: uppercase;
299
+ letter-spacing: 0.05em;
300
+ }
301
+
302
+ .terminal-btn {
303
+ background: rgba(16, 185, 129, 0.15);
304
+ border: 1px solid rgba(16, 185, 129, 0.3);
305
+ border-radius: 4px;
306
+ color: #d1fae5;
307
+ font-family: 'JetBrains Mono', monospace;
308
+ font-size: 9px;
309
+ padding: 2px 6px;
310
+ cursor: pointer;
311
+ }
312
+
313
+ .terminal-btn:hover {
314
+ background: rgba(16, 185, 129, 0.3);
315
+ }
316
+
317
+ .terminal-body {
318
+ margin: 0;
319
+ padding: 8px 10px;
320
+ font-family: 'JetBrains Mono', monospace;
242
321
  font-size: 11px;
243
- color: #34d399;
244
- min-height: 52px;
245
- max-height: 120px;
322
+ line-height: 1.45;
323
+ color: #d1fae5;
324
+ min-height: 60px;
325
+ max-height: 100px;
246
326
  overflow-y: auto;
247
327
  white-space: pre-wrap;
248
- word-break: break-all;
328
+ word-break: break-word;
249
329
  }
250
330
  </style>
251
331
 
252
- <div class="header">
253
- <div class="brand-badge">
254
- <svg class="brand-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
255
- <circle cx="12" cy="12" r="3"/>
256
- <path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/>
257
- </svg>
258
- <span class="title">Embeddings</span>
259
- <span class="badge-pill">768 Dim</span>
332
+ <div class="card-header">
333
+ <div class="brand-cluster">
334
+ <div class="brand-mark">
335
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#34d399" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
336
+ <path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/>
337
+ <polyline points="3.27 6.96 12 12.01 20.73 6.96"/>
338
+ <line x1="12" y1="22.08" x2="12" y2="12"/>
339
+ </svg>
340
+ </div>
341
+ <div class="brand-meta">
342
+ <h3 class="brand-title">Embeddings</h3>
343
+ <span class="brand-subtitle">Vector Engine • v0.1.0</span>
344
+ </div>
260
345
  </div>
261
- <span id="status-badge" class="status-pill">Ready</span>
346
+ <div id="status-pill" class="status-pill">READY</div>
262
347
  </div>
263
348
 
264
- <div class="canvas-container">
265
- <canvas id="vector-canvas" width="400" height="64"></canvas>
266
- <div class="telemetry-row">
267
- <span>Provider: Ollama (Zero-Cost)</span>
268
- <span>Model: nomic-embed-text</span>
349
+ <div class="telemetry-row">
350
+ <div class="metric-card">
351
+ <span class="metric-label">Model Weights</span>
352
+ <span id="stat-model" class="metric-value">nomic-embed-text (768d)</span>
353
+ </div>
354
+ <div class="metric-card">
355
+ <span class="metric-label">Vault Vectors</span>
356
+ <span id="stat-coverage" class="metric-value">98% Embedded</span>
357
+ </div>
358
+ <div class="metric-card">
359
+ <span class="metric-label">Locality</span>
360
+ <span id="stat-locality" class="metric-value">Local (On-Device)</span>
269
361
  </div>
270
362
  </div>
271
363
 
272
364
  <div class="actions-grid">
273
- <button id="btn-status" class="touch-btn" type="button">Status</button>
274
- <button id="btn-coverage" class="touch-btn" type="button">Coverage</button>
275
- <button id="btn-benchmark" class="touch-btn" type="button">Benchmark</button>
365
+ <button id="btn-status" class="touch-btn" type="button">STATUS</button>
366
+ <button id="btn-models" class="touch-btn" type="button">MODELS</button>
367
+ <button id="btn-benchmark" class="touch-btn" type="button">BENCHMARK</button>
368
+ <button id="btn-coverage" class="touch-btn" type="button">COVERAGE</button>
369
+ <button id="btn-pull" class="touch-btn" type="button">PULL WEIGHTS</button>
370
+ <button id="btn-refresh" class="touch-btn" type="button">REFRESH</button>
276
371
  </div>
277
372
 
278
- <div id="card-out" class="output-box">Ollama vector engine active. 768-dimension local embeddings ready.</div>
373
+ <div class="terminal-deck">
374
+ <div class="terminal-header">
375
+ <span class="terminal-title">Vector Telemetry Console</span>
376
+ <button id="btn-copy" class="terminal-btn" type="button">COPY</button>
377
+ </div>
378
+ <pre id="card-out" class="terminal-body">Local vector embedding pipeline online. Vectors are preserved on-device and never leave this host.</pre>
379
+ </div>
279
380
  `;
280
381
 
281
- this.shadowRoot.querySelector('#btn-status')?.addEventListener('click', () => {
382
+ root.querySelector('#btn-status')?.addEventListener('click', () => {
282
383
  this.execute('status');
283
384
  });
284
385
 
285
- this.shadowRoot.querySelector('#btn-coverage')?.addEventListener('click', () => {
286
- this.execute('coverage');
386
+ root.querySelector('#btn-models')?.addEventListener('click', () => {
387
+ this.execute('models');
287
388
  });
288
389
 
289
- this.shadowRoot.querySelector('#btn-benchmark')?.addEventListener('click', () => {
390
+ root.querySelector('#btn-benchmark')?.addEventListener('click', () => {
290
391
  this.execute('benchmark');
291
392
  });
393
+
394
+ root.querySelector('#btn-coverage')?.addEventListener('click', () => {
395
+ this.execute('coverage');
396
+ });
397
+
398
+ root.querySelector('#btn-pull')?.addEventListener('click', () => {
399
+ this.execute('pull');
400
+ });
401
+
402
+ root.querySelector('#btn-refresh')?.addEventListener('click', () => {
403
+ this.execute('status');
404
+ });
405
+
406
+ root.querySelector('#btn-copy')?.addEventListener('click', () => {
407
+ this.copyOutput();
408
+ });
292
409
  }
293
410
  }
294
411
 
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 UltraChat
3
+ Copyright (c) 2026 Total Recall contributors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -9,7 +9,7 @@
9
9
  "version": "1.1.1",
10
10
  "license": "MIT",
11
11
  "devDependencies": {
12
- "total-recall-brain": "3.40.1",
12
+ "total-recall-brain": "3.40.3",
13
13
  "vitest": "^4.1.10"
14
14
  }
15
15
  },
@@ -3560,9 +3560,9 @@
3560
3560
  }
3561
3561
  },
3562
3562
  "node_modules/total-recall-brain": {
3563
- "version": "3.40.1",
3564
- "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.40.1.tgz",
3565
- "integrity": "sha512-tZMnDHXsMT1sa698oF26Np/G4k+Cn4ZXpTdo+BTNOvUMYEhxWR+7Tl+upHLMhcEEPuEM0EiAObL53a9JELzGag==",
3563
+ "version": "3.40.3",
3564
+ "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.40.3.tgz",
3565
+ "integrity": "sha512-E5elOF/OvGAvDdXVDUQaV1xa7hWDOVYmK3z8V+zPNYVEtEoGhJplY1Rtqu76oHezwJDQRIhc4+3HhpvjH5fIww==",
3566
3566
  "dev": true,
3567
3567
  "license": "MIT",
3568
3568
  "workspaces": [
@@ -3591,7 +3591,8 @@
3591
3591
  "bin": {
3592
3592
  "antigravity": "bin/antigravity.mjs",
3593
3593
  "total-recall": "bin/total-recall.mjs",
3594
- "total-recall-memory": "bin/total-recall-memory.mjs"
3594
+ "total-recall-memory": "bin/total-recall-memory.mjs",
3595
+ "vibebrain": "bin/total-recall.mjs"
3595
3596
  },
3596
3597
  "optionalDependencies": {
3597
3598
  "playwright": "^1.60.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tr-plugin-git-sentinel",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "type": "module",
5
5
  "description": "Reports the state of the current git repository: branch, dirty files, unpushed commits and stashes.",
6
6
  "scripts": {
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://github.com/gregiteen/total-recall/blob/main/metadata.plugin.schema.json",
3
3
  "id": "git-sentinel",
4
4
  "name": "Git Hygiene",
5
- "version": "1.2.1",
5
+ "version": "1.1.2",
6
6
  "description": "Worktree hygiene, branch inspection, unpushed commits, and stash tracker.",
7
7
  "author": "Total Recall",
8
8
  "license": "MIT",