total-recall-brain 3.40.2 → 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 (33) 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/cli-agents/ui/card.js +406 -11
  5. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +6 -5
  6. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +1 -1
  7. package/scaffold/.agent/skills/total-recall/plugins/code-quality/plugin.json +1 -1
  8. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/card.js +276 -180
  9. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +6 -5
  10. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +1 -1
  11. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/plugin.json +13 -13
  12. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/card.js +340 -164
  13. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +6 -5
  14. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +8 -2
  15. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/card.js +295 -178
  16. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/LICENSE +1 -1
  17. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package-lock.json +6 -5
  18. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package.json +1 -1
  19. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/plugin.json +1 -1
  20. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/ui/card.js +302 -168
  21. package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +9 -2
  22. package/scaffold/.agent/skills/total-recall/plugins/mesh/plugin.json +8 -5
  23. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/card.js +444 -27
  24. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +124 -1404
  25. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +9 -2
  26. package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +0 -2
  27. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/card.js +312 -133
  28. package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +6 -5
  29. package/scaffold/.agent/skills/total-recall/plugins/security/package.json +1 -1
  30. package/scaffold/.agent/skills/total-recall/plugins/security/plugin.json +1 -3
  31. package/scaffold/.agent/skills/total-recall/plugins/security/ui/card.js +287 -12
  32. package/src/core/brain-updates.mjs +4 -1
  33. package/scaffold/.agent/skills/total-recall/plugins/mesh/test-support/memory-root.mjs +0 -14
@@ -1,6 +1,9 @@
1
1
  /**
2
- * Pipeline Composer — Dynamic Command Orchestration Engine
3
- * Bespoke Animated Web Component Card Face with Live Flow Pipeline Visualizer.
2
+ * CmdSmith — Dynamic Agent Command Composition Engine
3
+ * Bespoke Purpose-Built Web Component Card Face.
4
+ *
5
+ * Exposes live composed command inventory, dynamic execution inspection,
6
+ * version history, and interactive pipeline actions with zero decorative gimmicks.
4
7
  *
5
8
  * Zero emojis, authentic commercial brand identity, touch-first ergonomics (>=44px).
6
9
  */
@@ -8,21 +11,68 @@
8
11
  export class PipelineComposerCard extends HTMLElement {
9
12
  constructor() {
10
13
  super();
11
- this.status = 'Ready';
12
14
  this.executing = false;
15
+ this.telemetry = {
16
+ commandsCount: '7 Active',
17
+ scope: 'Global / Project',
18
+ status: 'Engine Ready'
19
+ };
13
20
  }
14
21
 
15
22
  connectedCallback() {
16
- this.attachShadow({ mode: 'open' });
23
+ if (!this.shadowRoot) this.attachShadow({ mode: 'open' });
17
24
  this.render();
18
- this.initPipelineAnimation();
25
+ this.refreshTelemetry();
26
+ }
27
+
28
+ async refreshTelemetry() {
29
+ try {
30
+ const res = await this.host?.run('list', []);
31
+ let text = '';
32
+ if (typeof res === 'object') {
33
+ text = res.output || JSON.stringify(res, null, 2);
34
+ } else {
35
+ text = String(res || '');
36
+ }
37
+
38
+ const lines = text.split('\n').filter(l => l.trim().startsWith('-'));
39
+ const count = lines.length;
40
+
41
+ this.telemetry = {
42
+ commandsCount: count > 0 ? `${count} Commands` : '0 Commands',
43
+ scope: text.includes('global') ? 'Global & Project' : 'Project Scope',
44
+ status: 'Engine Ready'
45
+ };
46
+ this.updateView();
47
+ } catch {
48
+ this.telemetry = {
49
+ commandsCount: 'Registry Active',
50
+ scope: 'Local Scope',
51
+ status: 'Online'
52
+ };
53
+ this.updateView();
54
+ }
55
+ }
56
+
57
+ updateView() {
58
+ const root = this.shadowRoot;
59
+ if (!root) return;
60
+
61
+ const countEl = root.querySelector('#stat-count');
62
+ const scopeEl = root.querySelector('#stat-scope');
63
+ const statusEl = root.querySelector('#stat-status');
64
+ if (countEl) countEl.textContent = this.telemetry.commandsCount;
65
+ if (scopeEl) scopeEl.textContent = this.telemetry.scope;
66
+ if (statusEl) statusEl.textContent = this.telemetry.status;
19
67
  }
20
68
 
21
69
  async execute(action, args = []) {
22
- const out = this.shadowRoot.querySelector('#card-out');
23
- const badge = this.shadowRoot.querySelector('#status-badge');
24
- if (out) out.textContent = `[PIPELINE ROUTER] Invoking ${action.toUpperCase()}...`;
25
- if (badge) badge.textContent = 'ROUTING';
70
+ const out = this.shadowRoot?.querySelector('#card-out');
71
+ const statusBadge = this.shadowRoot?.querySelector('#status-pill');
72
+ const actionLabel = action.toUpperCase();
73
+
74
+ if (out) out.textContent = `[CMDSMITH ROUTER] Invoking ${actionLabel} ${args.join(' ')}...`;
75
+ if (statusBadge) statusBadge.textContent = 'ROUTING';
26
76
  this.executing = true;
27
77
 
28
78
  try {
@@ -31,239 +81,365 @@ export class PipelineComposerCard extends HTMLElement {
31
81
  if (typeof res === 'object') {
32
82
  text = res.output || JSON.stringify(res, null, 2);
33
83
  } else {
34
- text = String(res || 'Execution completed without output.');
84
+ text = String(res || 'Execution completed with no return payload.');
35
85
  }
36
86
  if (out) out.textContent = text.trim();
37
- if (badge) badge.textContent = 'ONLINE';
87
+ if (statusBadge) statusBadge.textContent = 'READY';
88
+
89
+ if (['create', 'update', 'remove', 'rollback', 'promote'].includes(action)) {
90
+ this.refreshTelemetry();
91
+ }
38
92
  } catch (err) {
39
- if (out) out.textContent = `[PIPELINE FAULT] ${err.message}`;
40
- if (badge) badge.textContent = 'ERROR';
93
+ if (out) out.textContent = `[CMDSMITH FAULT] ${err.message}`;
94
+ if (statusBadge) statusBadge.textContent = 'ERROR';
41
95
  } finally {
42
96
  this.executing = false;
43
97
  }
44
98
  }
45
99
 
46
- initPipelineAnimation() {
47
- const canvas = this.shadowRoot.querySelector('#flow-canvas');
48
- if (!canvas) return;
49
- const ctx = canvas.getContext('2d');
50
- if (!ctx) return;
51
-
52
- let progress = 0;
53
- const nodes = [
54
- { x: 30, y: 32, label: 'INPUT' },
55
- { x: 110, y: 32, label: 'TRANSFORM' },
56
- { x: 210, y: 32, label: 'FILTER' },
57
- { x: 300, y: 32, label: 'SINK' }
58
- ];
59
-
60
- const draw = () => {
61
- if (!this.isConnected) return;
62
- ctx.clearRect(0, 0, canvas.width, canvas.height);
63
-
64
- // Draw connection lines
65
- ctx.strokeStyle = 'rgba(99, 102, 241, 0.25)';
66
- ctx.lineWidth = 2;
67
- ctx.beginPath();
68
- ctx.moveTo(nodes[0].x, nodes[0].y);
69
- for (let i = 1; i < nodes.length; i++) {
70
- ctx.lineTo(nodes[i].x, nodes[i].y);
71
- }
72
- ctx.stroke();
73
-
74
- // Draw packet pulse
75
- const totalLen = nodes[nodes.length - 1].x - nodes[0].x;
76
- const packetX = nodes[0].x + (progress % 1) * totalLen;
77
- ctx.fillStyle = this.executing ? '#38bdf8' : '#818cf8';
78
- ctx.shadowColor = ctx.fillStyle;
79
- ctx.shadowBlur = 8;
80
- ctx.beginPath();
81
- ctx.arc(packetX, 32, 4, 0, Math.PI * 2);
82
- ctx.fill();
83
- ctx.shadowBlur = 0;
84
-
85
- // Draw stage nodes
86
- for (const node of nodes) {
87
- ctx.fillStyle = '#0f172a';
88
- ctx.strokeStyle = '#6366f1';
89
- ctx.lineWidth = 1.5;
90
- ctx.beginPath();
91
- ctx.arc(node.x, node.y, 8, 0, Math.PI * 2);
92
- ctx.fill();
93
- ctx.stroke();
94
-
95
- ctx.fillStyle = '#c7d2fe';
96
- ctx.font = '8px monospace';
97
- ctx.textAlign = 'center';
98
- ctx.fillText(node.label, node.x, node.y + 18);
99
- }
100
+ copyOutput() {
101
+ const out = this.shadowRoot?.querySelector('#card-out');
102
+ const copyBtn = this.shadowRoot?.querySelector('#btn-copy');
103
+ if (!out) return;
100
104
 
101
- progress += this.executing ? 0.03 : 0.008;
102
- requestAnimationFrame(draw);
103
- };
104
-
105
- requestAnimationFrame(draw);
105
+ navigator.clipboard?.writeText(out.textContent || '').then(() => {
106
+ if (copyBtn) {
107
+ const prev = copyBtn.textContent;
108
+ copyBtn.textContent = 'COPIED';
109
+ setTimeout(() => { copyBtn.textContent = prev; }, 1600);
110
+ }
111
+ }).catch(() => {});
106
112
  }
107
113
 
108
114
  render() {
109
- this.shadowRoot.innerHTML = `
115
+ const root = this.shadowRoot;
116
+ if (!root) return;
117
+
118
+ root.innerHTML = `
110
119
  <style>
111
120
  :host {
112
121
  display: block;
113
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
114
- background: #0b0f19;
115
- color: #e0e7ff;
116
- border-radius: 8px;
117
- border: 1px solid rgba(99, 102, 241, 0.35);
118
- box-shadow: 0 10px 28px rgba(0, 0, 0, 0.45);
119
- padding: 18px;
122
+ font-family: 'Space Grotesk', -apple-system, sans-serif;
123
+ background: #03151e;
124
+ color: #ecfeff;
125
+ border-radius: 12px;
126
+ border: 1px solid #0e4a5e;
127
+ padding: 14px;
120
128
  box-sizing: border-box;
121
- overflow: hidden;
129
+ user-select: none;
122
130
  }
123
- .header {
131
+
132
+ * { box-sizing: border-box; }
133
+
134
+ /* Bespoke Header */
135
+ .card-header {
124
136
  display: flex;
137
+ align-items: center;
125
138
  justify-content: space-between;
126
- align-items: flex-start;
127
- margin-bottom: 14px;
139
+ margin-bottom: 12px;
140
+ padding-bottom: 8px;
141
+ border-bottom: 1px solid rgba(6, 182, 212, 0.2);
128
142
  }
143
+
144
+ .brand-cluster {
145
+ display: flex;
146
+ align-items: center;
147
+ gap: 10px;
148
+ }
149
+
150
+ .brand-mark {
151
+ width: 32px;
152
+ height: 32px;
153
+ border-radius: 8px;
154
+ background: rgba(8, 145, 178, 0.2);
155
+ border: 1px solid rgba(6, 182, 212, 0.4);
156
+ display: flex;
157
+ align-items: center;
158
+ justify-content: center;
159
+ flex-shrink: 0;
160
+ }
161
+
129
162
  .brand-meta {
130
163
  display: flex;
131
164
  flex-direction: column;
132
- gap: 2px;
133
165
  }
134
- .title {
135
- font-size: 16px;
166
+
167
+ .brand-title {
168
+ font-size: 14px;
136
169
  font-weight: 700;
137
- letter-spacing: 0.04em;
170
+ color: #cffafe;
171
+ letter-spacing: 0.03em;
138
172
  text-transform: uppercase;
139
- color: #c7d2fe;
140
173
  margin: 0;
141
174
  }
142
- .subtitle {
175
+
176
+ .brand-subtitle {
143
177
  font-size: 11px;
144
- color: #94a3b8;
145
- letter-spacing: 0.02em;
178
+ color: #67e8f9;
146
179
  margin: 0;
180
+ font-family: 'JetBrains Mono', monospace;
147
181
  }
148
- .badge {
149
- display: inline-flex;
150
- align-items: center;
151
- justify-content: center;
182
+
183
+ .status-pill {
184
+ font-family: 'JetBrains Mono', monospace;
152
185
  font-size: 10px;
153
186
  font-weight: 700;
154
- letter-spacing: 0.08em;
187
+ padding: 3px 8px;
188
+ border-radius: 6px;
189
+ background: rgba(6, 182, 212, 0.15);
190
+ border: 1px solid rgba(6, 182, 212, 0.4);
191
+ color: #22d3ee;
192
+ letter-spacing: 0.05em;
193
+ }
194
+
195
+ /* Telemetry Metric Cards */
196
+ .telemetry-row {
197
+ display: grid;
198
+ grid-template-columns: repeat(3, 1fr);
199
+ gap: 8px;
200
+ margin-bottom: 12px;
201
+ }
202
+
203
+ .metric-card {
204
+ background: rgba(8, 47, 61, 0.6);
205
+ border: 1px solid rgba(6, 182, 212, 0.25);
206
+ border-radius: 8px;
207
+ padding: 8px 10px;
208
+ display: flex;
209
+ flex-direction: column;
210
+ gap: 2px;
211
+ }
212
+
213
+ .metric-label {
214
+ font-family: 'JetBrains Mono', monospace;
215
+ font-size: 9px;
216
+ font-weight: 700;
217
+ color: #67e8f9;
218
+ letter-spacing: 0.05em;
155
219
  text-transform: uppercase;
156
- color: #818cf8;
157
- background: rgba(99, 102, 241, 0.12);
158
- border: 1px solid rgba(99, 102, 241, 0.3);
159
- border-radius: 4px;
160
- padding: 4px 8px;
161
220
  }
162
- .visual-display {
163
- position: relative;
164
- background: #030712;
165
- border: 1px solid rgba(99, 102, 241, 0.2);
166
- border-radius: 6px;
167
- margin-bottom: 14px;
221
+
222
+ .metric-value {
223
+ font-size: 13px;
224
+ font-weight: 700;
225
+ color: #ffffff;
226
+ font-family: 'JetBrains Mono', monospace;
168
227
  overflow: hidden;
228
+ text-overflow: ellipsis;
229
+ white-space: nowrap;
169
230
  }
170
- canvas {
171
- display: block;
172
- width: 100%;
173
- height: 64px;
174
- }
175
- .telemetry-row {
231
+
232
+ /* Target Command Input Selector */
233
+ .target-box {
176
234
  display: flex;
177
- justify-content: space-between;
178
- padding: 6px 10px;
179
- background: rgba(255, 255, 255, 0.03);
180
- border-top: 1px solid rgba(99, 102, 241, 0.15);
181
- font-family: monospace;
182
- font-size: 11px;
183
- color: #cbd5e1;
235
+ align-items: center;
236
+ gap: 8px;
237
+ margin-bottom: 10px;
238
+ background: rgba(0, 0, 0, 0.35);
239
+ border: 1px solid rgba(6, 182, 212, 0.2);
240
+ border-radius: 8px;
241
+ padding: 4px 8px;
184
242
  }
243
+
244
+ .target-label {
245
+ font-family: 'JetBrains Mono', monospace;
246
+ font-size: 10px;
247
+ color: #67e8f9;
248
+ text-transform: uppercase;
249
+ white-space: nowrap;
250
+ }
251
+
252
+ .target-input {
253
+ flex: 1;
254
+ background: transparent;
255
+ border: none;
256
+ color: #ecfeff;
257
+ font-family: 'JetBrains Mono', monospace;
258
+ font-size: 12px;
259
+ outline: none;
260
+ }
261
+
262
+ .target-input::placeholder {
263
+ color: rgba(103, 232, 249, 0.4);
264
+ }
265
+
266
+ /* Action Buttons Grid (>=44px touch targets) */
185
267
  .actions-grid {
186
268
  display: grid;
187
269
  grid-template-columns: repeat(3, 1fr);
188
- gap: 8px;
189
- margin-bottom: 12px;
270
+ gap: 6px;
271
+ margin-bottom: 10px;
190
272
  }
273
+
191
274
  .touch-btn {
192
275
  min-height: 44px;
193
- min-width: 44px;
194
- display: inline-flex;
195
- align-items: center;
196
- justify-content: center;
197
- background: rgba(99, 102, 241, 0.08);
198
- border: 1px solid rgba(99, 102, 241, 0.25);
199
- color: #c7d2fe;
276
+ background: rgba(8, 145, 178, 0.16);
277
+ border: 1px solid rgba(6, 182, 212, 0.3);
278
+ border-radius: 8px;
279
+ color: #ecfeff;
280
+ font-family: 'JetBrains Mono', monospace;
200
281
  font-size: 11px;
201
282
  font-weight: 600;
202
- letter-spacing: 0.04em;
203
- text-transform: uppercase;
204
- border-radius: 6px;
283
+ letter-spacing: 0.03em;
284
+ display: flex;
285
+ align-items: center;
286
+ justify-content: center;
205
287
  cursor: pointer;
206
- transition: background 0.15s ease, border-color 0.15s ease;
207
- padding: 6px 8px;
288
+ transition: background 0.15s, border-color 0.15s, transform 0.05s;
289
+ padding: 4px 6px;
208
290
  text-align: center;
209
291
  }
292
+
210
293
  .touch-btn:hover {
211
- background: rgba(99, 102, 241, 0.18);
212
- border-color: rgba(99, 102, 241, 0.5);
294
+ background: rgba(8, 145, 178, 0.3);
295
+ border-color: rgba(6, 182, 212, 0.6);
213
296
  }
297
+
214
298
  .touch-btn:active {
215
299
  transform: translateY(1px);
216
300
  }
217
- .output-box {
218
- background: #020617;
219
- border: 1px solid rgba(99, 102, 241, 0.2);
220
- border-radius: 6px;
301
+
302
+ /* Terminal Execution Output */
303
+ .terminal-deck {
304
+ background: #010c12;
305
+ border: 1px solid rgba(6, 182, 212, 0.25);
306
+ border-radius: 8px;
307
+ overflow: hidden;
308
+ }
309
+
310
+ .terminal-header {
311
+ display: flex;
312
+ align-items: center;
313
+ justify-content: space-between;
314
+ padding: 6px 10px;
315
+ background: rgba(8, 47, 61, 0.4);
316
+ border-bottom: 1px solid rgba(6, 182, 212, 0.2);
317
+ }
318
+
319
+ .terminal-title {
320
+ font-family: 'JetBrains Mono', monospace;
321
+ font-size: 10px;
322
+ color: #67e8f9;
323
+ text-transform: uppercase;
324
+ letter-spacing: 0.05em;
325
+ }
326
+
327
+ .terminal-btn {
328
+ background: rgba(6, 182, 212, 0.15);
329
+ border: 1px solid rgba(6, 182, 212, 0.3);
330
+ border-radius: 4px;
331
+ color: #cffafe;
332
+ font-family: 'JetBrains Mono', monospace;
333
+ font-size: 9px;
334
+ padding: 2px 6px;
335
+ cursor: pointer;
336
+ }
337
+
338
+ .terminal-btn:hover {
339
+ background: rgba(6, 182, 212, 0.3);
340
+ }
341
+
342
+ .terminal-body {
343
+ margin: 0;
221
344
  padding: 8px 10px;
222
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
345
+ font-family: 'JetBrains Mono', monospace;
223
346
  font-size: 11px;
224
347
  line-height: 1.45;
225
- color: #94a3b8;
226
- min-height: 48px;
227
- max-height: 85px;
348
+ color: #cffafe;
349
+ min-height: 60px;
350
+ max-height: 100px;
228
351
  overflow-y: auto;
229
352
  white-space: pre-wrap;
230
353
  word-break: break-word;
231
354
  }
232
355
  </style>
233
356
 
234
- <div class="header">
235
- <div class="brand-meta">
236
- <h2 class="title">Pipeline Composer</h2>
237
- <p class="subtitle">Dynamic Command Orchestration Engine</p>
357
+ <div class="card-header">
358
+ <div class="brand-cluster">
359
+ <div class="brand-mark">
360
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#22d3ee" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
361
+ <path d="M4 17l6-6-6-6"/>
362
+ <path d="M12 19h8"/>
363
+ <circle cx="16" cy="8" r="2"/>
364
+ </svg>
365
+ </div>
366
+ <div class="brand-meta">
367
+ <h3 class="brand-title">CmdSmith</h3>
368
+ <span class="brand-subtitle">Pipeline Forge • v0.2.1</span>
369
+ </div>
238
370
  </div>
239
- <div id="status-badge" class="badge">READY</div>
371
+ <div id="status-pill" class="status-pill">READY</div>
240
372
  </div>
241
373
 
242
- <div class="visual-display">
243
- <canvas id="flow-canvas" width="340" height="64"></canvas>
244
- <div class="telemetry-row">
245
- <span>Execution: Direct</span>
246
- <span>Risk Gate: Fail-Closed</span>
374
+ <div class="telemetry-row">
375
+ <div class="metric-card">
376
+ <span class="metric-label">Commands</span>
377
+ <span id="stat-count" class="metric-value">7 Active</span>
378
+ </div>
379
+ <div class="metric-card">
380
+ <span class="metric-label">Scope</span>
381
+ <span id="stat-scope" class="metric-value">Global / Project</span>
382
+ </div>
383
+ <div class="metric-card">
384
+ <span class="metric-label">Engine</span>
385
+ <span id="stat-status" class="metric-value">Engine Ready</span>
247
386
  </div>
248
387
  </div>
249
388
 
389
+ <div class="target-box">
390
+ <span class="target-label">Target Command:</span>
391
+ <input id="cmd-input" class="target-input" type="text" value="tr-first" placeholder="e.g. tr-first, brand-lint" />
392
+ </div>
393
+
250
394
  <div class="actions-grid">
251
- <button id="btn-list" class="touch-btn" type="button">Catalog</button>
252
- <button id="btn-inspect" class="touch-btn" type="button">Inspect</button>
253
- <button id="btn-history" class="touch-btn" type="button">History</button>
395
+ <button id="btn-library" class="touch-btn" type="button">LIBRARY</button>
396
+ <button id="btn-list" class="touch-btn" type="button">LIST</button>
397
+ <button id="btn-show" class="touch-btn" type="button">SHOW</button>
398
+ <button id="btn-history" class="touch-btn" type="button">HISTORY</button>
399
+ <button id="btn-test" class="touch-btn" type="button">TEST</button>
400
+ <button id="btn-status" class="touch-btn" type="button">STATUS</button>
254
401
  </div>
255
402
 
256
- <div id="card-out" class="output-box">Dynamic command registry operational. Ready for pipeline invocation.</div>
403
+ <div class="terminal-deck">
404
+ <div class="terminal-header">
405
+ <span class="terminal-title">Console Output</span>
406
+ <button id="btn-copy" class="terminal-btn" type="button">COPY</button>
407
+ </div>
408
+ <pre id="card-out" class="terminal-body">Dynamic agent command composition engine ready. Click any action above to inspect pipeline state.</pre>
409
+ </div>
257
410
  `;
258
411
 
259
- this.shadowRoot.querySelector('#btn-list')?.addEventListener('click', () => {
412
+ const getTarget = () => {
413
+ const input = root.querySelector('#cmd-input');
414
+ return (input?.value || 'tr-first').trim();
415
+ };
416
+
417
+ root.querySelector('#btn-library')?.addEventListener('click', () => {
418
+ this.execute('library');
419
+ });
420
+
421
+ root.querySelector('#btn-list')?.addEventListener('click', () => {
260
422
  this.execute('list');
261
423
  });
262
- this.shadowRoot.querySelector('#btn-inspect')?.addEventListener('click', () => {
263
- this.execute('read', ['startup-check']);
424
+
425
+ root.querySelector('#btn-show')?.addEventListener('click', () => {
426
+ this.execute('show', [getTarget()]);
264
427
  });
265
- this.shadowRoot.querySelector('#btn-history')?.addEventListener('click', () => {
266
- this.execute('history');
428
+
429
+ root.querySelector('#btn-history')?.addEventListener('click', () => {
430
+ this.execute('history', [getTarget()]);
431
+ });
432
+
433
+ root.querySelector('#btn-test')?.addEventListener('click', () => {
434
+ this.execute('test', [getTarget()]);
435
+ });
436
+
437
+ root.querySelector('#btn-status')?.addEventListener('click', () => {
438
+ this.execute('status');
439
+ });
440
+
441
+ root.querySelector('#btn-copy')?.addEventListener('click', () => {
442
+ this.copyOutput();
267
443
  });
268
444
  }
269
445
  }
@@ -9,7 +9,7 @@
9
9
  "version": "0.1.0",
10
10
  "license": "MIT",
11
11
  "devDependencies": {
12
- "total-recall-brain": "3.40.1"
12
+ "total-recall-brain": "3.40.3"
13
13
  }
14
14
  },
15
15
  "node_modules/@hexagon/base64": {
@@ -2566,9 +2566,9 @@
2566
2566
  }
2567
2567
  },
2568
2568
  "node_modules/total-recall-brain": {
2569
- "version": "3.40.1",
2570
- "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.40.1.tgz",
2571
- "integrity": "sha512-tZMnDHXsMT1sa698oF26Np/G4k+Cn4ZXpTdo+BTNOvUMYEhxWR+7Tl+upHLMhcEEPuEM0EiAObL53a9JELzGag==",
2569
+ "version": "3.40.3",
2570
+ "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.40.3.tgz",
2571
+ "integrity": "sha512-E5elOF/OvGAvDdXVDUQaV1xa7hWDOVYmK3z8V+zPNYVEtEoGhJplY1Rtqu76oHezwJDQRIhc4+3HhpvjH5fIww==",
2572
2572
  "dev": true,
2573
2573
  "license": "MIT",
2574
2574
  "workspaces": [
@@ -2597,7 +2597,8 @@
2597
2597
  "bin": {
2598
2598
  "antigravity": "bin/antigravity.mjs",
2599
2599
  "total-recall": "bin/total-recall.mjs",
2600
- "total-recall-memory": "bin/total-recall-memory.mjs"
2600
+ "total-recall-memory": "bin/total-recall-memory.mjs",
2601
+ "vibebrain": "bin/total-recall.mjs"
2601
2602
  },
2602
2603
  "optionalDependencies": {
2603
2604
  "playwright": "^1.60.0"
@@ -1,11 +1,17 @@
1
1
  {
2
2
  "name": "tr-plugin-embeddings",
3
3
  "version": "0.1.0",
4
- "private": true,
5
4
  "type": "module",
6
5
  "description": "Local embedding model management: provider/model status, benchmark, index build and coverage",
7
6
  "scripts": {
8
7
  "test": "node --test test/*.test.mjs"
9
8
  },
10
- "license": "MIT"
9
+ "license": "MIT",
10
+ "files": [
11
+ "cli.mjs",
12
+ "plugin.json",
13
+ "README.md",
14
+ "LICENSE",
15
+ "ui/"
16
+ ]
11
17
  }