total-recall-brain 3.41.5 → 3.41.6

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 (131) hide show
  1. package/bin/total-recall.mjs +7 -4
  2. package/frontend/dist/assets/index-4tGQfTa2.js +5605 -0
  3. package/frontend/dist/assets/index-DtwsDyFM.css +1 -0
  4. package/frontend/dist/index.html +2 -2
  5. package/frontend/package.json +11 -0
  6. package/frontend/src/App.tsx +47 -122
  7. package/frontend/src/components/plugins/plugin-frame.ts +1 -0
  8. package/frontend/src/index.css +152 -86
  9. package/frontend/src/pages/HelpPage.tsx +13 -10
  10. package/frontend/src/pages/MemoryPage.tsx +28 -30
  11. package/frontend/src/pages/NetworkPage.tsx +3 -3
  12. package/frontend/src/pages/PluginsPage.tsx +6 -5
  13. package/frontend/src/pages/RulesPage.tsx +16 -12
  14. package/package.json +3 -2
  15. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +8 -8
  16. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +3 -0
  17. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +8 -8
  18. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +3 -0
  19. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +8 -8
  20. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +3 -0
  21. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package-lock.json +8 -8
  22. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package.json +3 -0
  23. package/scaffold/.agent/skills/total-recall/plugins/mesh/package-lock.json +8 -8
  24. package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +4 -1
  25. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh.mjs +1 -1
  26. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/capability/index.mjs +136 -7
  27. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/cli.mjs +135 -26
  28. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package-lock.json +8 -8
  29. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package.json +4 -1
  30. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/plugin.json +228 -9
  31. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/skills/meta-harness/SKILL.md +24 -30
  32. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/alerts.mjs +29 -16
  33. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/cascade.mjs +73 -0
  34. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/coordinator.mjs +182 -365
  35. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/dispatch.mjs +33 -0
  36. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/documentation.mjs +9 -3
  37. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/executor.mjs +4 -4
  38. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/agy.mjs +187 -0
  39. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/claude.mjs +275 -0
  40. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/cline.mjs +132 -0
  41. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/codex.mjs +187 -0
  42. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/cursor.mjs +158 -0
  43. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/devin.mjs +157 -0
  44. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/dsh.mjs +183 -0
  45. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/grok.mjs +132 -0
  46. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/hermes.mjs +173 -0
  47. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/index.mjs +87 -0
  48. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/openclaw.mjs +173 -0
  49. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/pi.mjs +129 -0
  50. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate.mjs +12 -0
  51. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/json-reply.mjs +22 -0
  52. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/learner.mjs +72 -70
  53. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/model-catalog.mjs +195 -0
  54. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/paths.mjs +11 -0
  55. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/pool.mjs +36 -0
  56. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/review.mjs +169 -0
  57. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/router.mjs +136 -346
  58. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/runtime.mjs +1 -1
  59. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/ssss-store.mjs +20 -0
  60. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/telemetry.mjs +43 -0
  61. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/threads.mjs +156 -0
  62. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/worker.mjs +117 -35
  63. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/worktree.mjs +51 -0
  64. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/card.js +398 -57
  65. package/scaffold/.agent/skills/total-recall/plugins/openwiki/cli.mjs +10 -0
  66. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +3 -3
  67. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +3 -0
  68. package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +42 -190
  69. package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/openwiki.mjs +1 -1
  70. package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/skills/mermaid-diagrams/SKILL.md +44 -0
  71. package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/skills/write-connector/SKILL.md +56 -0
  72. package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +8 -8
  73. package/scaffold/.agent/skills/total-recall/plugins/security/package.json +3 -0
  74. package/src/cli/agent.mjs +12 -1
  75. package/src/cli/compact.mjs +2 -2
  76. package/src/cli/connect.mjs +56 -1
  77. package/src/cli/context.mjs +10 -7
  78. package/src/cli/doctor.mjs +5 -2
  79. package/src/cli/harness.mjs +62 -50
  80. package/src/cli/memory-entry.mjs +2 -2
  81. package/src/cli/preflight.mjs +152 -16
  82. package/src/cli/remember.mjs +19 -1
  83. package/src/cli/rules.mjs +54 -12
  84. package/src/cli/startup.mjs +1 -1
  85. package/src/cli/status.mjs +12 -2
  86. package/src/core/claude-hooks.mjs +41 -3
  87. package/src/core/cli-semantic-index.mjs +3 -2
  88. package/src/core/conflict-detector.mjs +23 -12
  89. package/src/core/context-compactor.mjs +2 -0
  90. package/src/core/context-policy.mjs +20 -0
  91. package/src/core/duplicate-guard.mjs +350 -0
  92. package/src/core/meta-harness.mjs +31 -11
  93. package/src/core/preflight-gate.mjs +2 -2
  94. package/src/core/preflight-receipt.mjs +28 -0
  95. package/src/core/scaffold-plugins.mjs +7 -0
  96. package/src/core/stdio-flush.mjs +23 -0
  97. package/src/core/surface.mjs +33 -10
  98. package/src/server/routes/plugins.mjs +2 -2
  99. package/frontend/dist/assets/index-BIQmqDKP.css +0 -1
  100. package/frontend/dist/assets/index-WT3gs-x6.js +0 -5631
  101. package/frontend/src/components/DaemonLogsTab.tsx +0 -54
  102. package/frontend/src/components/ResearchAgendaTab.tsx +0 -712
  103. package/frontend/src/components/TaskQueueTab.tsx +0 -193
  104. package/frontend/src/components/VoiceInput.tsx +0 -112
  105. package/frontend/src/pages/ChatPage.tsx +0 -1059
  106. package/frontend/src/pages/CollabPage.tsx +0 -470
  107. package/frontend/src/pages/DesignDocsPage.tsx +0 -621
  108. package/frontend/src/pages/FilesPage.tsx +0 -393
  109. package/frontend/src/pages/HealthPage.tsx +0 -359
  110. package/frontend/src/pages/InboxPage.tsx +0 -83
  111. package/frontend/src/pages/InstructionsPage.tsx +0 -583
  112. package/frontend/src/pages/IntegrationsPage.tsx +0 -761
  113. package/frontend/src/pages/MeshPage.css +0 -58
  114. package/frontend/src/pages/MeshPage.tsx +0 -1219
  115. package/frontend/src/pages/OkfPage.tsx +0 -535
  116. package/frontend/src/pages/SandboxPage.tsx +0 -113
  117. package/frontend/src/pages/SkillsPage.tsx +0 -1994
  118. package/frontend/src/pages/TasksPage.tsx +0 -427
  119. package/frontend/src/pages/UsagePage.tsx +0 -702
  120. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/README.md +0 -65
  121. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/cli.mjs +0 -76
  122. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/package.json +0 -19
  123. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/plugin.json +0 -266
  124. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/adapters/dsh.mjs +0 -446
  125. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/documentation.mjs +0 -152
  126. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/executor.mjs +0 -71
  127. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/runtime.mjs +0 -36
  128. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/setup.mjs +0 -35
  129. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/worker.mjs +0 -175
  130. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/ui/DESIGN.md +0 -32
  131. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/ui/card.js +0 -575
@@ -1,575 +0,0 @@
1
- /**
2
- * Command Fleet — Multi-Agent Coordination & Inspection Console
3
- *
4
- * Bespoke operator interface for terminal coding agent fleet management.
5
- * Displays real-time agent discovery matrix, mesh node targets, authentication
6
- * postures, and official documentation states without template wrappers or terminal dumps.
7
- */
8
-
9
- const DASH = '\u2014';
10
-
11
- function escapeHtml(str) {
12
- if (str === null || str === undefined) return '';
13
- return String(str).replace(/[&<>"']/g, c => ({
14
- '&': '&amp;',
15
- '<': '&lt;',
16
- '>': '&gt;',
17
- '"': '&quot;',
18
- "'": '&#39;'
19
- }[c]));
20
- }
21
-
22
- export class CommandFleetCard extends HTMLElement {
23
- constructor() {
24
- super();
25
- this.agents = [];
26
- this.selectedAgent = null;
27
- this.selectedNode = 'local';
28
- this.nodes = [];
29
- this.executing = false;
30
- this.screens = [{ id: 'fleet', label: 'Command Fleet' }];
31
- this.screen = 'fleet';
32
- }
33
-
34
- connectedCallback() {
35
- if (!this.shadowRoot) {
36
- this.attachShadow({ mode: 'open' });
37
- }
38
- this.render();
39
- this.refreshFleet();
40
- }
41
-
42
- async refreshFleet() {
43
- if (!this.host) return;
44
- try {
45
- const res = await this.host.run('catalog', ['--json']);
46
- let parsed = [];
47
- if (Array.isArray(res)) {
48
- parsed = res;
49
- } else if (res && typeof res === 'object' && Array.isArray(res.agents)) {
50
- parsed = res.agents;
51
- } else if (typeof res === 'string' && res.trim().startsWith('[')) {
52
- parsed = JSON.parse(res);
53
- }
54
- this.agents = parsed;
55
-
56
- if (this.agents.length > 0 && !this.selectedAgent) {
57
- this.selectedAgent = this.agents[0].id || this.agents[0].name;
58
- }
59
-
60
- // Also try to query mesh nodes
61
- try {
62
- const nodeRes = await this.host.run('nodes', ['--json']);
63
- if (Array.isArray(nodeRes)) this.nodes = nodeRes;
64
- else if (nodeRes && Array.isArray(nodeRes.nodes)) this.nodes = nodeRes.nodes;
65
- } catch {
66
- this.nodes = [];
67
- }
68
-
69
- this.render();
70
- } catch {
71
- this.agents = [];
72
- this.render();
73
- }
74
- }
75
-
76
- async selectAgent(id) {
77
- this.selectedAgent = id;
78
- this.render();
79
- }
80
-
81
- async switchNode(nodeId) {
82
- this.selectedNode = nodeId;
83
- this.render();
84
- await this.refreshFleet();
85
- }
86
-
87
- async refreshDocs() {
88
- if (!this.host || this.executing) return;
89
- this.executing = true;
90
- this.render();
91
- try {
92
- await this.host.run('docs-ensure', ['--json']);
93
- await this.refreshFleet();
94
- } catch {
95
- await this.refreshFleet();
96
- } finally {
97
- this.executing = false;
98
- this.render();
99
- }
100
- }
101
-
102
- render() {
103
- const root = this.shadowRoot;
104
- if (!root) return;
105
-
106
- const installedAgents = this.agents.filter(a => a.installed !== false);
107
- const active = this.agents.find(a => (a.id || a.name) === this.selectedAgent) || this.agents[0];
108
-
109
- root.innerHTML = `
110
- <style>
111
- :host {
112
- --face-bg: #0c1427;
113
- --face-surface: #1e293b;
114
- --face-line: #1e293b;
115
- --face-text: #f1f5f9;
116
- --face-muted: #94a3b8;
117
- --face-brand: #3b82f6;
118
- --face-brand-hover: #60a5fa;
119
- --face-accent: #38bdf8;
120
- --face-ok: #10b981;
121
- --face-warn: #f59e0b;
122
- --face-danger: #ef4444;
123
- --face-dark: #0c1427;
124
-
125
- display: block;
126
- font-family: var(--font-sans, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);
127
- color: var(--text-primary, var(--face-text));
128
- background: var(--bg-secondary, var(--face-bg));
129
- border: 1px solid var(--border, var(--face-line));
130
- border-radius: 8px;
131
- padding: 16px;
132
- box-sizing: border-box;
133
- overflow: hidden;
134
- }
135
-
136
- @media (prefers-reduced-motion: reduce) {
137
- *, ::before, ::after {
138
- animation-duration: 0.01ms !important;
139
- animation-iteration-count: 1 !important;
140
- transition-duration: 0.01ms !important;
141
- }
142
- }
143
-
144
- /* Header Bar */
145
- .header {
146
- display: flex;
147
- align-items: center;
148
- justify-content: space-between;
149
- flex-wrap: wrap;
150
- gap: 12px;
151
- padding-bottom: 14px;
152
- border-bottom: 1px solid var(--border, var(--face-line));
153
- margin-bottom: 16px;
154
- }
155
-
156
- .brand-group {
157
- display: flex;
158
- align-items: center;
159
- gap: 10px;
160
- }
161
-
162
- .wordmark-badge {
163
- font-family: var(--font-mono, 'JetBrains Mono', monospace);
164
- font-size: 13px;
165
- font-weight: 800;
166
- letter-spacing: 0.05em;
167
- color: var(--card-accent, var(--face-accent));
168
- background: rgba(59, 130, 246, 0.12);
169
- padding: 6px 10px;
170
- border-radius: 6px;
171
- border: 1px solid rgba(59, 130, 246, 0.3);
172
- }
173
-
174
- .title-meta {
175
- display: flex;
176
- flex-direction: column;
177
- }
178
-
179
- .plugin-title {
180
- font-size: 14px;
181
- font-weight: 700;
182
- color: var(--text-primary, var(--face-text));
183
- margin: 0;
184
- }
185
-
186
- .plugin-subtitle {
187
- font-size: 11px;
188
- color: var(--text-secondary, var(--face-muted));
189
- margin: 0;
190
- }
191
-
192
- .status-chip {
193
- display: flex;
194
- align-items: center;
195
- gap: 6px;
196
- font-family: var(--font-mono, 'JetBrains Mono', monospace);
197
- font-size: 11px;
198
- font-weight: 700;
199
- color: var(--face-ok);
200
- background: rgba(16, 185, 129, 0.12);
201
- border: 1px solid rgba(16, 185, 129, 0.3);
202
- padding: 5px 12px;
203
- border-radius: 6px;
204
- text-transform: uppercase;
205
- }
206
-
207
- /* Node Selector Bar */
208
- .node-bar {
209
- display: flex;
210
- align-items: center;
211
- justify-content: space-between;
212
- flex-wrap: wrap;
213
- gap: 10px;
214
- margin-bottom: 16px;
215
- background: rgba(30, 41, 59, 0.4);
216
- border: 1px solid var(--border, var(--face-line));
217
- border-radius: 6px;
218
- padding: 8px 12px;
219
- }
220
-
221
- .node-toggles {
222
- display: flex;
223
- align-items: center;
224
- gap: 6px;
225
- }
226
-
227
- .btn-node {
228
- min-height: 44px;
229
- min-width: 44px;
230
- padding: 6px 14px;
231
- font-family: var(--font-mono, 'JetBrains Mono', monospace);
232
- font-size: 11px;
233
- font-weight: 600;
234
- color: var(--text-secondary, var(--face-muted));
235
- background: transparent;
236
- border: 1px solid var(--border, var(--face-line));
237
- border-radius: 5px;
238
- cursor: pointer;
239
- }
240
-
241
- .btn-node[data-active="true"] {
242
- color: var(--text-primary, var(--face-text));
243
- background: rgba(59, 130, 246, 0.2);
244
- border-color: var(--card-accent, var(--face-brand));
245
- }
246
-
247
- .btn-docs-sync {
248
- min-height: 44px;
249
- padding: 8px 14px;
250
- font-size: 11px;
251
- font-weight: 700;
252
- color: var(--face-dark);
253
- background: var(--face-accent);
254
- border: none;
255
- border-radius: 5px;
256
- cursor: pointer;
257
- transition: background 0.15s ease;
258
- }
259
-
260
- .btn-docs-sync:hover {
261
- background: #7dd3fc;
262
- }
263
-
264
- .btn-docs-sync:disabled {
265
- opacity: 0.6;
266
- cursor: not-allowed;
267
- }
268
-
269
- /* Split Workspace */
270
- .workspace-grid {
271
- display: grid;
272
- grid-template-columns: minmax(240px, 1.2fr) minmax(280px, 1.8fr);
273
- gap: 14px;
274
- margin-bottom: 16px;
275
- }
276
-
277
- @media (max-width: 720px) {
278
- .workspace-grid {
279
- grid-template-columns: 1fr;
280
- }
281
- }
282
-
283
- /* Agent Roster Matrix */
284
- .roster-card {
285
- border: 1px solid var(--border, var(--face-line));
286
- border-radius: 6px;
287
- background: rgba(18, 24, 38, 0.6);
288
- padding: 10px;
289
- display: flex;
290
- flex-direction: column;
291
- gap: 8px;
292
- max-height: 360px;
293
- overflow-y: auto;
294
- }
295
-
296
- .agent-item {
297
- min-height: 44px;
298
- padding: 8px 12px;
299
- display: flex;
300
- align-items: center;
301
- justify-content: space-between;
302
- border: 1px solid transparent;
303
- border-radius: 5px;
304
- background: rgba(30, 41, 59, 0.3);
305
- color: var(--text-primary, var(--face-text));
306
- cursor: pointer;
307
- text-align: left;
308
- width: 100%;
309
- box-sizing: border-box;
310
- transition: background 0.15s ease;
311
- }
312
-
313
- .agent-item:hover {
314
- background: rgba(59, 130, 246, 0.12);
315
- }
316
-
317
- .agent-item[data-selected="true"] {
318
- background: rgba(59, 130, 246, 0.22);
319
- border-color: var(--face-brand);
320
- }
321
-
322
- .agent-meta-left {
323
- display: flex;
324
- flex-direction: column;
325
- gap: 2px;
326
- }
327
-
328
- .agent-name {
329
- font-family: var(--font-mono, 'JetBrains Mono', monospace);
330
- font-size: 12px;
331
- font-weight: 700;
332
- }
333
-
334
- .agent-version {
335
- font-size: 10px;
336
- color: var(--text-secondary, var(--face-muted));
337
- }
338
-
339
- .agent-badges {
340
- display: flex;
341
- align-items: center;
342
- gap: 6px;
343
- }
344
-
345
- .badge-status {
346
- font-family: var(--font-mono, 'JetBrains Mono', monospace);
347
- font-size: 9px;
348
- font-weight: 700;
349
- padding: 2px 6px;
350
- border-radius: 4px;
351
- text-transform: uppercase;
352
- }
353
-
354
- .badge-online {
355
- color: var(--face-ok);
356
- background: rgba(16, 185, 129, 0.15);
357
- }
358
-
359
- .badge-offline {
360
- color: var(--text-secondary, var(--face-muted));
361
- background: rgba(148, 163, 184, 0.1);
362
- }
363
-
364
- .badge-auth-ok {
365
- color: var(--face-accent);
366
- background: rgba(56, 189, 248, 0.15);
367
- }
368
-
369
- .badge-auth-needed {
370
- color: var(--face-warn);
371
- background: rgba(245, 158, 11, 0.15);
372
- }
373
-
374
- /* Inspector Panel */
375
- .inspector-panel {
376
- border: 1px solid var(--border, var(--face-line));
377
- border-radius: 6px;
378
- background: rgba(18, 24, 38, 0.6);
379
- padding: 14px;
380
- display: flex;
381
- flex-direction: column;
382
- gap: 12px;
383
- }
384
-
385
- .inspector-title {
386
- font-family: var(--font-mono, 'JetBrains Mono', monospace);
387
- font-size: 14px;
388
- font-weight: 700;
389
- color: var(--text-primary, var(--face-text));
390
- margin: 0;
391
- padding-bottom: 8px;
392
- border-bottom: 1px solid var(--border, var(--face-line));
393
- }
394
-
395
- .property-grid {
396
- display: grid;
397
- grid-template-columns: repeat(2, 1fr);
398
- gap: 10px;
399
- }
400
-
401
- .property-box {
402
- background: rgba(30, 41, 59, 0.4);
403
- border: 1px solid var(--border, var(--face-line));
404
- border-radius: 5px;
405
- padding: 8px 10px;
406
- display: flex;
407
- flex-direction: column;
408
- gap: 3px;
409
- }
410
-
411
- .property-label {
412
- font-size: 10px;
413
- color: var(--text-secondary, var(--face-muted));
414
- text-transform: uppercase;
415
- letter-spacing: 0.05em;
416
- }
417
-
418
- .property-val {
419
- font-family: var(--font-mono, 'JetBrains Mono', monospace);
420
- font-size: 12px;
421
- font-weight: 700;
422
- color: var(--text-primary, var(--face-text));
423
- }
424
-
425
- .permission-pills {
426
- display: flex;
427
- flex-wrap: wrap;
428
- gap: 6px;
429
- margin-top: 6px;
430
- }
431
-
432
- .pill-permission {
433
- font-family: var(--font-mono, 'JetBrains Mono', monospace);
434
- font-size: 10px;
435
- padding: 4px 8px;
436
- border-radius: 4px;
437
- background: rgba(15, 23, 42, 0.8);
438
- border: 1px solid var(--border, var(--face-line));
439
- color: var(--text-secondary, var(--face-muted));
440
- }
441
-
442
- .pill-active {
443
- color: var(--face-ok);
444
- border-color: rgba(16, 185, 129, 0.4);
445
- background: rgba(16, 185, 129, 0.1);
446
- }
447
-
448
- .empty-agents-box {
449
- padding: 36px 16px;
450
- text-align: center;
451
- font-size: 12px;
452
- color: var(--text-secondary, var(--face-muted));
453
- }
454
-
455
- /* Footer Telemetry */
456
- .footer-bar {
457
- display: flex;
458
- justify-content: space-between;
459
- align-items: center;
460
- padding-top: 12px;
461
- margin-top: 14px;
462
- border-top: 1px solid var(--border, var(--face-line));
463
- font-size: 10px;
464
- color: var(--text-secondary, var(--face-muted));
465
- }
466
- </style>
467
-
468
- <div class="header">
469
- <div class="brand-group">
470
- <div class="wordmark-badge">[FLEET//COMMAND]</div>
471
- <div class="title-meta">
472
- <h3 class="plugin-title">Command Fleet Coordination</h3>
473
- <p class="plugin-subtitle">Multi-agent runtime coordination and documentation integrity</p>
474
- </div>
475
- </div>
476
- <div class="status-chip">
477
- ${installedAgents.length > 0 ? `${installedAgents.length} Agents Discovered` : 'Scanning Fleet'}
478
- </div>
479
- </div>
480
-
481
- <div class="node-bar">
482
- <div class="node-toggles">
483
- <button class="btn-node" data-active="${this.selectedNode === 'local'}" type="button" id="node-local">This Node</button>
484
- <button class="btn-node" data-active="${this.selectedNode === 'cloud'}" type="button" id="node-cloud">Cloud Node</button>
485
- <button class="btn-node" data-active="${this.selectedNode === 'macbook'}" type="button" id="node-macbook">MacBook Node</button>
486
- </div>
487
- <button class="btn-docs-sync" type="button" id="btn-docs" ${this.executing ? 'disabled' : ''}>
488
- ${this.executing ? 'Syncing...' : 'Sync Official Docs'}
489
- </button>
490
- </div>
491
-
492
- <div class="workspace-grid">
493
- <div class="roster-card">
494
- ${this.agents.length > 0 ? this.agents.map(a => `
495
- <button class="agent-item" data-selected="${(a.id || a.name) === this.selectedAgent}" type="button" data-agent-id="${escapeHtml(a.id || a.name)}">
496
- <div class="agent-meta-left">
497
- <span class="agent-name">${escapeHtml(a.name || a.id)}</span>
498
- <span class="agent-version">${escapeHtml(a.version || DASH)}</span>
499
- </div>
500
- <div class="agent-badges">
501
- <span class="badge-status ${a.installed !== false ? 'badge-online' : 'badge-offline'}">
502
- ${a.installed !== false ? 'Installed' : 'Missing'}
503
- </span>
504
- <span class="badge-status ${a.authenticated !== false ? 'badge-auth-ok' : 'badge-auth-needed'}">
505
- ${a.authenticated !== false ? 'Auth OK' : 'Sign-in'}
506
- </span>
507
- </div>
508
- </button>
509
- `).join('') : `
510
- <div class="empty-agents-box">Scanning for terminal coding agents...</div>
511
- `}
512
- </div>
513
-
514
- <div class="inspector-panel">
515
- ${active ? `
516
- <h4 class="inspector-title">${escapeHtml(active.name || active.id)} Details</h4>
517
- <div class="property-grid">
518
- <div class="property-box">
519
- <span class="property-label">Runtime Binary</span>
520
- <span class="property-val">${escapeHtml(active.binary || active.id || DASH)}</span>
521
- </div>
522
- <div class="property-box">
523
- <span class="property-label">Installed Version</span>
524
- <span class="property-val">${escapeHtml(active.version || DASH)}</span>
525
- </div>
526
- <div class="property-box">
527
- <span class="property-label">Primary Model</span>
528
- <span class="property-val">${escapeHtml(active.primaryModel || 'Default Model')}</span>
529
- </div>
530
- <div class="property-box">
531
- <span class="property-label">Documentation</span>
532
- <span class="property-val" style="color: var(--face-ok);">Verified Local</span>
533
- </div>
534
- </div>
535
-
536
- <div>
537
- <span class="property-label">Permission Enforcement Gates</span>
538
- <div class="permission-pills">
539
- <span class="pill-permission pill-active">Read Safe</span>
540
- <span class="pill-permission pill-active">Write Gated</span>
541
- <span class="pill-permission pill-active">Send Guarded</span>
542
- <span class="pill-permission">Destructive Locked</span>
543
- </div>
544
- </div>
545
- ` : `
546
- <div class="empty-agents-box">Select an agent from the fleet roster to inspect configuration.</div>
547
- `}
548
- </div>
549
- </div>
550
-
551
- <div class="footer-bar">
552
- <span>Target: ${this.selectedNode.toUpperCase()} MESH NODE</span>
553
- <span>Fleet Version: v0.2.0</span>
554
- </div>
555
- `;
556
-
557
- // Event listeners
558
- root.querySelector('#node-local')?.addEventListener('click', () => this.switchNode('local'));
559
- root.querySelector('#node-cloud')?.addEventListener('click', () => this.switchNode('cloud'));
560
- root.querySelector('#node-macbook')?.addEventListener('click', () => this.switchNode('macbook'));
561
-
562
- root.querySelectorAll('.agent-item').forEach(btn => {
563
- btn.addEventListener('click', () => {
564
- const id = btn.getAttribute('data-agent-id');
565
- if (id) this.selectAgent(id);
566
- });
567
- });
568
-
569
- root.querySelector('#btn-docs')?.addEventListener('click', () => this.refreshDocs());
570
- }
571
- }
572
-
573
- if (!customElements.get('command-fleet-card')) {
574
- customElements.define('command-fleet-card', CommandFleetCard);
575
- }