total-recall-brain 3.41.4 → 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 (147) hide show
  1. package/bin/total-recall.mjs +10 -6
  2. package/docs/reference/cli-reference.md +18 -0
  3. package/frontend/dist/assets/index-4tGQfTa2.js +5605 -0
  4. package/frontend/dist/assets/index-DtwsDyFM.css +1 -0
  5. package/frontend/dist/index.html +2 -2
  6. package/frontend/package.json +11 -0
  7. package/frontend/src/App.tsx +47 -122
  8. package/frontend/src/components/plugins/plugin-frame.ts +1 -0
  9. package/frontend/src/index.css +152 -86
  10. package/frontend/src/pages/HelpPage.tsx +13 -10
  11. package/frontend/src/pages/MemoryPage.tsx +28 -30
  12. package/frontend/src/pages/NetworkPage.tsx +3 -3
  13. package/frontend/src/pages/PluginsPage.tsx +6 -5
  14. package/frontend/src/pages/RulesPage.tsx +16 -12
  15. package/package.json +4 -3
  16. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +3114 -36
  17. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +4 -1
  18. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +3114 -36
  19. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +4 -1
  20. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +3121 -33
  21. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +4 -1
  22. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package-lock.json +3122 -34
  23. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package.json +4 -1
  24. package/scaffold/.agent/skills/total-recall/plugins/mesh/package-lock.json +3127 -49
  25. package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +5 -2
  26. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh.mjs +1 -1
  27. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/capability/index.mjs +136 -7
  28. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/cli.mjs +135 -26
  29. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package-lock.json +3121 -33
  30. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package.json +5 -2
  31. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/plugin.json +228 -9
  32. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/skills/meta-harness/SKILL.md +24 -30
  33. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/alerts.mjs +29 -16
  34. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/cascade.mjs +73 -0
  35. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/coordinator.mjs +182 -365
  36. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/dispatch.mjs +33 -0
  37. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/documentation.mjs +40 -14
  38. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/executor.mjs +4 -4
  39. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/agy.mjs +187 -0
  40. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/claude.mjs +275 -0
  41. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/cline.mjs +132 -0
  42. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/codex.mjs +187 -0
  43. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/cursor.mjs +158 -0
  44. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/devin.mjs +157 -0
  45. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/dsh.mjs +183 -0
  46. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/grok.mjs +132 -0
  47. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/hermes.mjs +173 -0
  48. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/index.mjs +87 -0
  49. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/openclaw.mjs +173 -0
  50. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/pi.mjs +129 -0
  51. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate.mjs +12 -0
  52. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/json-reply.mjs +22 -0
  53. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/learner.mjs +72 -70
  54. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/model-catalog.mjs +195 -0
  55. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/paths.mjs +11 -0
  56. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/pool.mjs +36 -0
  57. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/review.mjs +169 -0
  58. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/router.mjs +136 -346
  59. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/runtime.mjs +1 -1
  60. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/ssss-store.mjs +20 -0
  61. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/telemetry.mjs +43 -0
  62. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/threads.mjs +156 -0
  63. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/worker.mjs +117 -35
  64. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/worktree.mjs +51 -0
  65. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/card.js +398 -57
  66. package/scaffold/.agent/skills/total-recall/plugins/openwiki/cli.mjs +304 -46
  67. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +367 -41
  68. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +5 -2
  69. package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +33 -0
  70. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/config.mjs +2 -2
  71. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/generate.mjs +159 -0
  72. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/graph.mjs +197 -0
  73. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/lint.mjs +153 -0
  74. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/mesh-vaults.mjs +261 -0
  75. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/refresh.mjs +151 -4
  76. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/search.mjs +114 -0
  77. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/token.mjs +96 -0
  78. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/card.js +899 -662
  79. package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/openwiki.mjs +8987 -0
  80. package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/skills/mermaid-diagrams/SKILL.md +44 -0
  81. package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/skills/write-connector/SKILL.md +56 -0
  82. package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +3097 -81
  83. package/scaffold/.agent/skills/total-recall/plugins/security/package.json +4 -1
  84. package/src/cli/agent.mjs +12 -1
  85. package/src/cli/compact.mjs +108 -0
  86. package/src/cli/connect.mjs +56 -1
  87. package/src/cli/context.mjs +55 -23
  88. package/src/cli/doctor.mjs +5 -2
  89. package/src/cli/forget.mjs +2 -0
  90. package/src/cli/harness.mjs +62 -50
  91. package/src/cli/memory-entry.mjs +2 -2
  92. package/src/cli/preflight.mjs +152 -16
  93. package/src/cli/release.mjs +386 -0
  94. package/src/cli/remember.mjs +19 -1
  95. package/src/cli/rules.mjs +54 -12
  96. package/src/cli/startup.mjs +1 -1
  97. package/src/cli/status.mjs +12 -2
  98. package/src/core/claude-hooks.mjs +41 -3
  99. package/src/core/cli-commands.mjs +2 -0
  100. package/src/core/cli-semantic-index.mjs +3 -2
  101. package/src/core/conflict-detector.mjs +23 -12
  102. package/src/core/context-compactor.mjs +145 -0
  103. package/src/core/context-policy.mjs +20 -0
  104. package/src/core/duplicate-guard.mjs +350 -0
  105. package/src/core/meta-harness.mjs +31 -11
  106. package/src/core/preflight-gate.mjs +2 -2
  107. package/src/core/preflight-receipt.mjs +29 -1
  108. package/src/core/scaffold-plugins.mjs +7 -0
  109. package/src/core/stdio-flush.mjs +23 -0
  110. package/src/core/surface.mjs +33 -10
  111. package/src/server/invoke-durability.mjs +39 -0
  112. package/src/server/invoke-write-child.mjs +25 -0
  113. package/src/server/routes/invoke.mjs +7 -0
  114. package/src/server/routes/plugins.mjs +2 -2
  115. package/frontend/dist/assets/index-BIQmqDKP.css +0 -1
  116. package/frontend/dist/assets/index-CRzjQLu7.js +0 -5631
  117. package/frontend/src/components/DaemonLogsTab.tsx +0 -54
  118. package/frontend/src/components/ResearchAgendaTab.tsx +0 -712
  119. package/frontend/src/components/TaskQueueTab.tsx +0 -193
  120. package/frontend/src/components/VoiceInput.tsx +0 -112
  121. package/frontend/src/pages/ChatPage.tsx +0 -1059
  122. package/frontend/src/pages/CollabPage.tsx +0 -470
  123. package/frontend/src/pages/DesignDocsPage.tsx +0 -621
  124. package/frontend/src/pages/FilesPage.tsx +0 -393
  125. package/frontend/src/pages/HealthPage.tsx +0 -359
  126. package/frontend/src/pages/InboxPage.tsx +0 -83
  127. package/frontend/src/pages/InstructionsPage.tsx +0 -583
  128. package/frontend/src/pages/IntegrationsPage.tsx +0 -761
  129. package/frontend/src/pages/MeshPage.css +0 -58
  130. package/frontend/src/pages/MeshPage.tsx +0 -1219
  131. package/frontend/src/pages/OkfPage.tsx +0 -535
  132. package/frontend/src/pages/SandboxPage.tsx +0 -113
  133. package/frontend/src/pages/SkillsPage.tsx +0 -1994
  134. package/frontend/src/pages/TasksPage.tsx +0 -427
  135. package/frontend/src/pages/UsagePage.tsx +0 -702
  136. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/README.md +0 -65
  137. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/cli.mjs +0 -76
  138. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/package.json +0 -19
  139. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/plugin.json +0 -266
  140. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/adapters/dsh.mjs +0 -446
  141. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/documentation.mjs +0 -152
  142. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/executor.mjs +0 -71
  143. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/runtime.mjs +0 -36
  144. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/setup.mjs +0 -35
  145. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/worker.mjs +0 -175
  146. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/ui/DESIGN.md +0 -32
  147. 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
- }