flock-core 0.5.0b50__py3-none-any.whl → 0.5.0b51__py3-none-any.whl

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.

Potentially problematic release.


This version of flock-core might be problematic. Click here for more details.

Files changed (116) hide show
  1. flock/dashboard/launcher.py +1 -1
  2. flock/frontend/README.md +678 -0
  3. flock/frontend/docs/DESIGN_SYSTEM.md +1980 -0
  4. flock/frontend/index.html +12 -0
  5. flock/frontend/package-lock.json +4347 -0
  6. flock/frontend/package.json +48 -0
  7. flock/frontend/src/App.tsx +79 -0
  8. flock/frontend/src/__tests__/e2e/critical-scenarios.test.tsx +587 -0
  9. flock/frontend/src/__tests__/integration/filtering-e2e.test.tsx +387 -0
  10. flock/frontend/src/__tests__/integration/graph-rendering.test.tsx +640 -0
  11. flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +699 -0
  12. flock/frontend/src/components/common/BuildInfo.tsx +39 -0
  13. flock/frontend/src/components/common/EmptyState.module.css +115 -0
  14. flock/frontend/src/components/common/EmptyState.tsx +128 -0
  15. flock/frontend/src/components/common/ErrorBoundary.module.css +169 -0
  16. flock/frontend/src/components/common/ErrorBoundary.tsx +118 -0
  17. flock/frontend/src/components/common/KeyboardShortcutsDialog.css +251 -0
  18. flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +151 -0
  19. flock/frontend/src/components/common/LoadingSpinner.module.css +97 -0
  20. flock/frontend/src/components/common/LoadingSpinner.tsx +29 -0
  21. flock/frontend/src/components/controls/PublishControl.css +547 -0
  22. flock/frontend/src/components/controls/PublishControl.test.tsx +543 -0
  23. flock/frontend/src/components/controls/PublishControl.tsx +432 -0
  24. flock/frontend/src/components/details/DetailWindowContainer.tsx +62 -0
  25. flock/frontend/src/components/details/LiveOutputTab.test.tsx +792 -0
  26. flock/frontend/src/components/details/LiveOutputTab.tsx +220 -0
  27. flock/frontend/src/components/details/MessageHistoryTab.tsx +299 -0
  28. flock/frontend/src/components/details/NodeDetailWindow.test.tsx +501 -0
  29. flock/frontend/src/components/details/NodeDetailWindow.tsx +218 -0
  30. flock/frontend/src/components/details/RunStatusTab.tsx +307 -0
  31. flock/frontend/src/components/details/tabs.test.tsx +1015 -0
  32. flock/frontend/src/components/filters/CorrelationIDFilter.module.css +102 -0
  33. flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +197 -0
  34. flock/frontend/src/components/filters/CorrelationIDFilter.tsx +121 -0
  35. flock/frontend/src/components/filters/FilterBar.module.css +29 -0
  36. flock/frontend/src/components/filters/FilterBar.test.tsx +133 -0
  37. flock/frontend/src/components/filters/FilterBar.tsx +33 -0
  38. flock/frontend/src/components/filters/FilterPills.module.css +79 -0
  39. flock/frontend/src/components/filters/FilterPills.test.tsx +173 -0
  40. flock/frontend/src/components/filters/FilterPills.tsx +67 -0
  41. flock/frontend/src/components/filters/TimeRangeFilter.module.css +91 -0
  42. flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +154 -0
  43. flock/frontend/src/components/filters/TimeRangeFilter.tsx +105 -0
  44. flock/frontend/src/components/graph/AgentNode.test.tsx +75 -0
  45. flock/frontend/src/components/graph/AgentNode.tsx +322 -0
  46. flock/frontend/src/components/graph/GraphCanvas.tsx +406 -0
  47. flock/frontend/src/components/graph/MessageFlowEdge.tsx +128 -0
  48. flock/frontend/src/components/graph/MessageNode.test.tsx +62 -0
  49. flock/frontend/src/components/graph/MessageNode.tsx +116 -0
  50. flock/frontend/src/components/graph/MiniMap.tsx +47 -0
  51. flock/frontend/src/components/graph/TransformEdge.tsx +123 -0
  52. flock/frontend/src/components/layout/DashboardLayout.css +407 -0
  53. flock/frontend/src/components/layout/DashboardLayout.tsx +300 -0
  54. flock/frontend/src/components/layout/Header.module.css +88 -0
  55. flock/frontend/src/components/layout/Header.tsx +52 -0
  56. flock/frontend/src/components/modules/EventLogModule.test.tsx +401 -0
  57. flock/frontend/src/components/modules/EventLogModule.tsx +396 -0
  58. flock/frontend/src/components/modules/EventLogModuleWrapper.tsx +17 -0
  59. flock/frontend/src/components/modules/ModuleRegistry.test.ts +333 -0
  60. flock/frontend/src/components/modules/ModuleRegistry.ts +85 -0
  61. flock/frontend/src/components/modules/ModuleWindow.tsx +155 -0
  62. flock/frontend/src/components/modules/registerModules.ts +20 -0
  63. flock/frontend/src/components/settings/AdvancedSettings.tsx +175 -0
  64. flock/frontend/src/components/settings/AppearanceSettings.tsx +185 -0
  65. flock/frontend/src/components/settings/GraphSettings.tsx +110 -0
  66. flock/frontend/src/components/settings/SettingsPanel.css +327 -0
  67. flock/frontend/src/components/settings/SettingsPanel.tsx +131 -0
  68. flock/frontend/src/components/settings/ThemeSelector.tsx +298 -0
  69. flock/frontend/src/hooks/useKeyboardShortcuts.ts +148 -0
  70. flock/frontend/src/hooks/useModulePersistence.test.ts +442 -0
  71. flock/frontend/src/hooks/useModulePersistence.ts +154 -0
  72. flock/frontend/src/hooks/useModules.ts +139 -0
  73. flock/frontend/src/hooks/usePersistence.ts +139 -0
  74. flock/frontend/src/main.tsx +13 -0
  75. flock/frontend/src/services/api.ts +213 -0
  76. flock/frontend/src/services/indexeddb.test.ts +793 -0
  77. flock/frontend/src/services/indexeddb.ts +794 -0
  78. flock/frontend/src/services/layout.test.ts +437 -0
  79. flock/frontend/src/services/layout.ts +146 -0
  80. flock/frontend/src/services/themeApplicator.ts +140 -0
  81. flock/frontend/src/services/themeService.ts +77 -0
  82. flock/frontend/src/services/websocket.test.ts +595 -0
  83. flock/frontend/src/services/websocket.ts +685 -0
  84. flock/frontend/src/store/filterStore.test.ts +242 -0
  85. flock/frontend/src/store/filterStore.ts +103 -0
  86. flock/frontend/src/store/graphStore.test.ts +186 -0
  87. flock/frontend/src/store/graphStore.ts +414 -0
  88. flock/frontend/src/store/moduleStore.test.ts +253 -0
  89. flock/frontend/src/store/moduleStore.ts +57 -0
  90. flock/frontend/src/store/settingsStore.ts +188 -0
  91. flock/frontend/src/store/streamStore.ts +68 -0
  92. flock/frontend/src/store/uiStore.test.ts +54 -0
  93. flock/frontend/src/store/uiStore.ts +110 -0
  94. flock/frontend/src/store/wsStore.ts +34 -0
  95. flock/frontend/src/styles/index.css +15 -0
  96. flock/frontend/src/styles/scrollbar.css +47 -0
  97. flock/frontend/src/styles/variables.css +488 -0
  98. flock/frontend/src/test/setup.ts +1 -0
  99. flock/frontend/src/types/filters.ts +14 -0
  100. flock/frontend/src/types/graph.ts +55 -0
  101. flock/frontend/src/types/modules.ts +7 -0
  102. flock/frontend/src/types/theme.ts +55 -0
  103. flock/frontend/src/utils/mockData.ts +85 -0
  104. flock/frontend/src/utils/performance.ts +16 -0
  105. flock/frontend/src/utils/transforms.test.ts +860 -0
  106. flock/frontend/src/utils/transforms.ts +323 -0
  107. flock/frontend/src/vite-env.d.ts +17 -0
  108. flock/frontend/tsconfig.json +27 -0
  109. flock/frontend/tsconfig.node.json +11 -0
  110. flock/frontend/vite.config.ts +25 -0
  111. flock/frontend/vitest.config.ts +11 -0
  112. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b51.dist-info}/METADATA +1 -1
  113. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b51.dist-info}/RECORD +116 -6
  114. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b51.dist-info}/WHEEL +0 -0
  115. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b51.dist-info}/entry_points.txt +0 -0
  116. {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b51.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,488 @@
1
+ /**
2
+ * Flock Flow Dashboard Design System
3
+ * Generated from frontend/docs/DESIGN_SYSTEM.md
4
+ * Version: 1.0.0
5
+ */
6
+
7
+ :root {
8
+ /* ========================================
9
+ COLORS - Foundation
10
+ ======================================== */
11
+
12
+ /* Background Layers */
13
+ --color-bg-base: #0a0a0b;
14
+ --color-bg-elevated: #121214;
15
+ --color-bg-surface: #1a1a1e;
16
+ --color-bg-overlay: #232329;
17
+ --color-bg-float: #2a2a32;
18
+
19
+ /* Primary Brand Colors */
20
+ --color-primary-50: #eef2ff;
21
+ --color-primary-100: #e0e7ff;
22
+ --color-primary-200: #c7d2fe;
23
+ --color-primary-300: #a5b4fc;
24
+ --color-primary-400: #818cf8;
25
+ --color-primary-500: #6366f1;
26
+ --color-primary-600: #4f46e5;
27
+ --color-primary-700: #4338ca;
28
+ --color-primary-800: #3730a3;
29
+ --color-primary-900: #312e81;
30
+
31
+ /* Secondary/Accent Colors */
32
+ --color-secondary-50: #fdf4ff;
33
+ --color-secondary-100: #fae8ff;
34
+ --color-secondary-200: #f5d0fe;
35
+ --color-secondary-300: #f0abfc;
36
+ --color-secondary-400: #e879f9;
37
+ --color-secondary-500: #d946ef;
38
+ --color-secondary-600: #c026d3;
39
+ --color-secondary-700: #a21caf;
40
+ --color-secondary-800: #86198f;
41
+ --color-secondary-900: #701a75;
42
+
43
+ /* Tertiary/Utility Colors */
44
+ --color-tertiary-50: #ecfeff;
45
+ --color-tertiary-100: #cffafe;
46
+ --color-tertiary-200: #a5f3fc;
47
+ --color-tertiary-300: #67e8f9;
48
+ --color-tertiary-400: #22d3ee;
49
+ --color-tertiary-500: #06b6d4;
50
+ --color-tertiary-600: #0891b2;
51
+ --color-tertiary-700: #0e7490;
52
+ --color-tertiary-800: #155e75;
53
+ --color-tertiary-900: #164e63;
54
+
55
+ /* ========================================
56
+ COLORS - Semantic
57
+ ======================================== */
58
+
59
+ /* Success */
60
+ --color-success-light: #6ee7b7;
61
+ --color-success: #10b981;
62
+ --color-success-dark: #047857;
63
+ --color-success-bg: rgba(16, 185, 129, 0.1);
64
+ --color-success-border: rgba(16, 185, 129, 0.3);
65
+
66
+ /* Warning */
67
+ --color-warning-light: #fbbf24;
68
+ --color-warning: #f59e0b;
69
+ --color-warning-dark: #d97706;
70
+ --color-warning-bg: rgba(245, 158, 11, 0.1);
71
+ --color-warning-border: rgba(245, 158, 11, 0.3);
72
+
73
+ /* Error */
74
+ --color-error-light: #f87171;
75
+ --color-error: #ef4444;
76
+ --color-error-dark: #dc2626;
77
+ --color-error-bg: rgba(239, 68, 68, 0.1);
78
+ --color-error-border: rgba(239, 68, 68, 0.3);
79
+
80
+ /* Info */
81
+ --color-info-light: #60a5fa;
82
+ --color-info: #3b82f6;
83
+ --color-info-dark: #2563eb;
84
+ --color-info-bg: rgba(59, 130, 246, 0.1);
85
+ --color-info-border: rgba(59, 130, 246, 0.3);
86
+
87
+ /* Running/Active */
88
+ --color-active-light: #818cf8;
89
+ --color-active: #6366f1;
90
+ --color-active-dark: #4f46e5;
91
+ --color-active-bg: rgba(99, 102, 241, 0.1);
92
+ --color-active-border: rgba(99, 102, 241, 0.3);
93
+
94
+ /* Idle/Neutral */
95
+ --color-idle-light: #94a3b8;
96
+ --color-idle: #64748b;
97
+ --color-idle-dark: #475569;
98
+ --color-idle-bg: rgba(100, 116, 139, 0.1);
99
+ --color-idle-border: rgba(100, 116, 139, 0.3);
100
+
101
+ /* ========================================
102
+ COLORS - Text
103
+ ======================================== */
104
+
105
+ --color-text-primary: #f8fafc;
106
+ --color-text-secondary: #cbd5e1;
107
+ --color-text-tertiary: #94a3b8;
108
+ --color-text-muted: #64748b;
109
+ --color-text-disabled: #475569;
110
+ --color-text-on-primary: #ffffff;
111
+ --color-text-on-dark: #0f172a;
112
+
113
+ /* ========================================
114
+ COLORS - Borders & Dividers
115
+ ======================================== */
116
+
117
+ --color-border-subtle: #1e293b;
118
+ --color-border-default: #334155;
119
+ --color-border-strong: #475569;
120
+ --color-border-focus: #6366f1;
121
+ --color-border-error: #ef4444;
122
+ --color-divider: rgba(148, 163, 184, 0.1);
123
+
124
+ /* ========================================
125
+ COLORS - Graph Specific
126
+ ======================================== */
127
+
128
+ /* Agent Nodes */
129
+ --color-node-agent-bg: #1e293b;
130
+ --color-node-agent-border: #3b82f6;
131
+ --color-node-agent-border-selected: #6366f1;
132
+ --color-node-agent-text: #f8fafc;
133
+ --color-node-agent-badge: #334155;
134
+ --color-node-agent-badge-text: #94a3b8;
135
+
136
+ /* Message Nodes */
137
+ --color-node-message-bg: #422006;
138
+ --color-node-message-border: #f59e0b;
139
+ --color-node-message-border-selected: #d946ef;
140
+ --color-node-message-text: #fef3c7;
141
+ --color-node-message-metadata: #a16207;
142
+
143
+ /* Edges */
144
+ --color-edge-default: #475569;
145
+ --color-edge-active: #6366f1;
146
+ --color-edge-message: #f59e0b;
147
+ --color-edge-error: #ef4444;
148
+ --color-edge-label-bg: rgba(26, 26, 30, 0.95);
149
+ --color-edge-label-text: #cbd5e1;
150
+
151
+ /* ========================================
152
+ COLORS - Overlay & Glassmorphism
153
+ ======================================== */
154
+
155
+ --color-glass-bg: rgba(26, 26, 30, 0.8);
156
+ --color-glass-border: rgba(148, 163, 184, 0.1);
157
+ --color-overlay-backdrop: rgba(10, 10, 11, 0.7);
158
+ --color-modal-backdrop: rgba(10, 10, 11, 0.85);
159
+
160
+ /* ========================================
161
+ TYPOGRAPHY
162
+ ======================================== */
163
+
164
+ /* Font Families */
165
+ --font-family-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
166
+ --font-family-mono: 'JetBrains Mono', 'Fira Code', 'Consolas', 'Monaco', 'Courier New', monospace;
167
+ --font-family-display: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
168
+
169
+ /* Font Sizes - Display */
170
+ --font-size-display-2xl: 72px;
171
+ --font-size-display-xl: 60px;
172
+ --font-size-display-lg: 48px;
173
+ --font-size-display-md: 36px;
174
+
175
+ /* Font Sizes - Headings */
176
+ --font-size-h1: 32px;
177
+ --font-size-h2: 24px;
178
+ --font-size-h3: 20px;
179
+ --font-size-h4: 18px;
180
+ --font-size-h5: 16px;
181
+ --font-size-h6: 14px;
182
+
183
+ /* Font Sizes - Body */
184
+ --font-size-body-xl: 20px;
185
+ --font-size-body-lg: 18px;
186
+ --font-size-body: 16px;
187
+ --font-size-body-sm: 14px;
188
+ --font-size-body-xs: 12px;
189
+
190
+ /* Font Sizes - Utility */
191
+ --font-size-caption: 12px;
192
+ --font-size-overline: 10px;
193
+ --font-size-tiny: 10px;
194
+
195
+ /* Font Weights */
196
+ --font-weight-light: 300;
197
+ --font-weight-regular: 400;
198
+ --font-weight-medium: 500;
199
+ --font-weight-semibold: 600;
200
+ --font-weight-bold: 700;
201
+
202
+ /* Line Heights */
203
+ --line-height-tight: 1.1;
204
+ --line-height-snug: 1.375;
205
+ --line-height-normal: 1.5;
206
+ --line-height-relaxed: 1.625;
207
+ --line-height-loose: 2;
208
+
209
+ /* Letter Spacing */
210
+ --letter-spacing-tight: -0.02em;
211
+ --letter-spacing-normal: 0;
212
+ --letter-spacing-wide: 0.025em;
213
+ --letter-spacing-wider: 0.05em;
214
+ --letter-spacing-widest: 0.1em;
215
+
216
+ /* ========================================
217
+ SPACING SYSTEM
218
+ ======================================== */
219
+
220
+ /* Base Scale (8px grid) */
221
+ --spacing-0: 0;
222
+ --spacing-0-5: 2px;
223
+ --spacing-1: 4px;
224
+ --spacing-1-5: 6px;
225
+ --spacing-2: 8px;
226
+ --spacing-3: 12px;
227
+ --spacing-4: 16px;
228
+ --spacing-5: 20px;
229
+ --spacing-6: 24px;
230
+ --spacing-8: 32px;
231
+ --spacing-10: 40px;
232
+ --spacing-12: 48px;
233
+ --spacing-16: 64px;
234
+ --spacing-20: 80px;
235
+ --spacing-24: 96px;
236
+ --spacing-32: 128px;
237
+ --spacing-40: 160px;
238
+ --spacing-48: 192px;
239
+ --spacing-56: 224px;
240
+ --spacing-64: 256px;
241
+
242
+ /* Semantic Spacing Tokens */
243
+ --space-component-xs: var(--spacing-2);
244
+ --space-component-sm: var(--spacing-3);
245
+ --space-component-md: var(--spacing-4);
246
+ --space-component-lg: var(--spacing-6);
247
+ --space-component-xl: var(--spacing-8);
248
+
249
+ --space-layout-xs: var(--spacing-4);
250
+ --space-layout-sm: var(--spacing-6);
251
+ --space-layout-md: var(--spacing-8);
252
+ --space-layout-lg: var(--spacing-12);
253
+ --space-layout-xl: var(--spacing-16);
254
+ --space-layout-2xl: var(--spacing-24);
255
+
256
+ --gap-xs: var(--spacing-1);
257
+ --gap-sm: var(--spacing-2);
258
+ --gap-md: var(--spacing-3);
259
+ --gap-lg: var(--spacing-4);
260
+ --gap-xl: var(--spacing-6);
261
+
262
+ /* ========================================
263
+ SHADOWS & ELEVATION
264
+ ======================================== */
265
+
266
+ /* Shadow Scale */
267
+ --shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.4);
268
+ --shadow-sm: 0 2px 4px -1px rgba(0, 0, 0, 0.5), 0 1px 2px -1px rgba(0, 0, 0, 0.3);
269
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.6), 0 2px 4px -1px rgba(0, 0, 0, 0.4);
270
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.7), 0 4px 6px -2px rgba(0, 0, 0, 0.5);
271
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.8), 0 10px 10px -5px rgba(0, 0, 0, 0.6);
272
+ --shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.9);
273
+
274
+ /* Glow Effects */
275
+ --shadow-glow-primary: 0 0 0 3px rgba(99, 102, 241, 0.3);
276
+ --shadow-glow-secondary: 0 0 0 3px rgba(217, 70, 239, 0.3);
277
+ --shadow-glow-success: 0 0 0 3px rgba(16, 185, 129, 0.3);
278
+ --shadow-glow-error: 0 0 0 3px rgba(239, 68, 68, 0.3);
279
+ --shadow-glow-warning: 0 0 0 3px rgba(245, 158, 11, 0.3);
280
+
281
+ /* Inner Shadows */
282
+ --shadow-inner: inset 0 2px 4px 0 rgba(0, 0, 0, 0.5);
283
+ --shadow-inner-lg: inset 0 4px 8px 0 rgba(0, 0, 0, 0.6);
284
+
285
+ /* ========================================
286
+ BORDERS & RADIUS
287
+ ======================================== */
288
+
289
+ /* Border Widths */
290
+ --border-width-0: 0;
291
+ --border-width-1: 1px;
292
+ --border-width-2: 2px;
293
+ --border-width-3: 3px;
294
+ --border-width-4: 4px;
295
+
296
+ /* Border Radius */
297
+ --radius-none: 0;
298
+ --radius-sm: 4px;
299
+ --radius-md: 6px;
300
+ --radius-lg: 8px;
301
+ --radius-xl: 12px;
302
+ --radius-2xl: 16px;
303
+ --radius-3xl: 24px;
304
+ --radius-full: 9999px;
305
+ --radius-circle: 50%;
306
+
307
+ /* Common Border Combinations */
308
+ --border-subtle: var(--border-width-1) solid var(--color-border-subtle);
309
+ --border-default: var(--border-width-1) solid var(--color-border-default);
310
+ --border-strong: var(--border-width-2) solid var(--color-border-strong);
311
+ --border-focus: var(--border-width-2) solid var(--color-border-focus);
312
+ --border-error: var(--border-width-2) solid var(--color-border-error);
313
+
314
+ /* ========================================
315
+ MOTION & TRANSITIONS
316
+ ======================================== */
317
+
318
+ /* Duration */
319
+ --duration-instant: 0ms;
320
+ --duration-fast: 100ms;
321
+ --duration-normal: 200ms;
322
+ --duration-slow: 300ms;
323
+ --duration-slower: 400ms;
324
+ --duration-slowest: 500ms;
325
+
326
+ /* Easing Functions */
327
+ --ease-linear: linear;
328
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
329
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
330
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
331
+ --ease-smooth: cubic-bezier(0.4, 0, 0.6, 1);
332
+ --ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
333
+ --ease-elastic: cubic-bezier(0.175, 0.885, 0.32, 1.275);
334
+ --ease-sharp: cubic-bezier(0.4, 0, 0.6, 1);
335
+
336
+ /* Common Transitions */
337
+ --transition-colors: color var(--duration-fast) var(--ease-smooth), background-color var(--duration-fast) var(--ease-smooth), border-color var(--duration-fast) var(--ease-smooth);
338
+ --transition-opacity: opacity var(--duration-normal) var(--ease-out);
339
+ --transition-transform: transform var(--duration-normal) var(--ease-smooth);
340
+ --transition-shadow: box-shadow var(--duration-normal) var(--ease-out);
341
+ --transition-all: all var(--duration-normal) var(--ease-smooth);
342
+ --transition-base: var(--duration-normal) var(--ease-smooth);
343
+
344
+ /* ========================================
345
+ GLASSMORPHISM EFFECTS
346
+ ======================================== */
347
+
348
+ --blur-sm: 4px;
349
+ --blur-md: 8px;
350
+ --blur-lg: 12px;
351
+ --blur-xl: 16px;
352
+ --blur-2xl: 24px;
353
+ }
354
+
355
+ /* ========================================
356
+ GLOBAL RESETS & BASE STYLES
357
+ ======================================== */
358
+
359
+ * {
360
+ margin: 0;
361
+ padding: 0;
362
+ box-sizing: border-box;
363
+ }
364
+
365
+ html {
366
+ font-size: 16px;
367
+ }
368
+
369
+ body {
370
+ font-family: var(--font-family-sans);
371
+ font-size: var(--font-size-body);
372
+ font-weight: var(--font-weight-regular);
373
+ line-height: var(--line-height-normal);
374
+ color: var(--color-text-primary);
375
+ background: var(--color-bg-base);
376
+ -webkit-font-smoothing: antialiased;
377
+ -moz-osx-font-smoothing: grayscale;
378
+ }
379
+
380
+ h1, h2, h3, h4, h5, h6 {
381
+ margin: 0;
382
+ font-weight: var(--font-weight-semibold);
383
+ color: var(--color-text-primary);
384
+ }
385
+
386
+ h1 {
387
+ font-size: var(--font-size-h1);
388
+ font-weight: var(--font-weight-bold);
389
+ line-height: var(--line-height-tight);
390
+ letter-spacing: var(--letter-spacing-tight);
391
+ }
392
+
393
+ h2 {
394
+ font-size: var(--font-size-h2);
395
+ line-height: var(--line-height-tight);
396
+ letter-spacing: var(--letter-spacing-tight);
397
+ }
398
+
399
+ h3 {
400
+ font-size: var(--font-size-h3);
401
+ line-height: var(--line-height-snug);
402
+ }
403
+
404
+ h4 {
405
+ font-size: var(--font-size-h4);
406
+ font-weight: var(--font-weight-medium);
407
+ line-height: var(--line-height-snug);
408
+ }
409
+
410
+ h5, h6 {
411
+ font-size: var(--font-size-h5);
412
+ font-weight: var(--font-weight-medium);
413
+ line-height: var(--line-height-normal);
414
+ color: var(--color-text-secondary);
415
+ }
416
+
417
+ code, pre {
418
+ font-family: var(--font-family-mono);
419
+ font-size: 0.9em;
420
+ line-height: var(--line-height-relaxed);
421
+ }
422
+
423
+ button {
424
+ font-family: inherit;
425
+ cursor: pointer;
426
+ }
427
+
428
+ #root {
429
+ width: 100vw;
430
+ height: 100vh;
431
+ overflow: hidden;
432
+ }
433
+
434
+ /* ========================================
435
+ KEYFRAME ANIMATIONS
436
+ ======================================== */
437
+
438
+ @keyframes pulse {
439
+ 0%, 100% {
440
+ opacity: 1;
441
+ }
442
+ 50% {
443
+ opacity: 0.6;
444
+ }
445
+ }
446
+
447
+ /* ========================================
448
+ REACT FLOW CONTROLS STYLING
449
+ ======================================== */
450
+
451
+ /* Make ReactFlow controls more visible with better contrast */
452
+ .react-flow__controls {
453
+ background: var(--color-bg-surface) !important;
454
+ border: 1px solid var(--color-border-default) !important;
455
+ }
456
+
457
+ .react-flow__controls-button {
458
+ background: var(--color-bg-overlay) !important;
459
+ border: none !important;
460
+ border-bottom: 1px solid var(--color-border-subtle) !important;
461
+ color: var(--color-text-primary) !important;
462
+ transition: var(--transition-all) !important;
463
+ width: 32px !important;
464
+ height: 32px !important;
465
+ }
466
+
467
+ .react-flow__controls-button:hover {
468
+ background: var(--color-primary-500) !important;
469
+ color: white !important;
470
+ }
471
+
472
+ .react-flow__controls-button svg {
473
+ fill: currentColor !important;
474
+ width: 18px !important;
475
+ height: 18px !important;
476
+ }
477
+
478
+ /* ========================================
479
+ ACCESSIBILITY - REDUCED MOTION
480
+ ======================================== */
481
+
482
+ @media (prefers-reduced-motion: reduce) {
483
+ * {
484
+ animation-duration: 0.01ms !important;
485
+ animation-iteration-count: 1 !important;
486
+ transition-duration: 0.01ms !important;
487
+ }
488
+ }
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom';
@@ -0,0 +1,14 @@
1
+ export type TimeRangePreset = 'last5min' | 'last10min' | 'last1hour' | 'custom';
2
+
3
+ export interface TimeRange {
4
+ preset: TimeRangePreset;
5
+ start?: number;
6
+ end?: number;
7
+ }
8
+
9
+ export interface CorrelationIdMetadata {
10
+ correlation_id: string;
11
+ first_seen: number;
12
+ artifact_count: number;
13
+ run_count: number;
14
+ }
@@ -0,0 +1,55 @@
1
+ import { Node, Edge } from '@xyflow/react';
2
+
3
+ export interface Agent {
4
+ id: string;
5
+ name: string;
6
+ status: 'idle' | 'running' | 'error';
7
+ subscriptions: string[];
8
+ lastActive: number;
9
+ sentCount: number;
10
+ recvCount: number;
11
+ position?: { x: number; y: number };
12
+ outputTypes?: string[]; // Artifact types this agent produces
13
+ receivedByType?: Record<string, number>; // Count of messages received per type
14
+ sentByType?: Record<string, number>; // Count of messages sent per type
15
+ streamingTokens?: string[]; // Last 6 streaming tokens for news ticker effect
16
+ }
17
+
18
+ export interface Message {
19
+ id: string;
20
+ type: string;
21
+ payload: any;
22
+ timestamp: number;
23
+ correlationId: string;
24
+ producedBy: string;
25
+ isStreaming?: boolean; // True while streaming, false when complete
26
+ streamingText?: string; // Accumulated streaming text (raw)
27
+ }
28
+
29
+ export interface AgentNodeData extends Record<string, unknown> {
30
+ name: string;
31
+ status: 'idle' | 'running' | 'error';
32
+ subscriptions: string[];
33
+ outputTypes?: string[];
34
+ sentCount: number;
35
+ recvCount: number;
36
+ receivedByType?: Record<string, number>;
37
+ sentByType?: Record<string, number>;
38
+ streamingTokens?: string[]; // Last 6 streaming tokens for news ticker effect
39
+ }
40
+
41
+ export interface MessageNodeData extends Record<string, unknown> {
42
+ artifactType: string;
43
+ payloadPreview: string;
44
+ payload: any; // Full payload for display
45
+ producedBy: string;
46
+ consumedBy: string[];
47
+ timestamp: number;
48
+ isStreaming?: boolean; // True while streaming tokens
49
+ streamingText?: string; // Raw streaming text
50
+ }
51
+
52
+ export type AgentViewNode = Node<AgentNodeData, 'agent'>;
53
+ export type MessageViewNode = Node<MessageNodeData, 'message'>;
54
+ export type GraphNode = AgentViewNode | MessageViewNode;
55
+ export type GraphEdge = Edge;
@@ -0,0 +1,7 @@
1
+ export interface ModuleInstance {
2
+ id: string; // unique instance ID
3
+ type: string; // module definition ID
4
+ position: { x: number; y: number };
5
+ size: { width: number; height: number };
6
+ visible: boolean;
7
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Theme Type Definitions
3
+ *
4
+ * Terminal theme format matching TOML structure from src/flock/themes/
5
+ */
6
+
7
+ export interface TerminalColors {
8
+ black: string;
9
+ red: string;
10
+ green: string;
11
+ yellow: string;
12
+ blue: string;
13
+ magenta: string;
14
+ cyan: string;
15
+ white: string;
16
+ }
17
+
18
+ export interface PrimaryColors {
19
+ background: string;
20
+ foreground: string;
21
+ }
22
+
23
+ export interface SelectionColors {
24
+ background: string;
25
+ text: string;
26
+ }
27
+
28
+ export interface CursorColors {
29
+ cursor: string;
30
+ text: string;
31
+ }
32
+
33
+ export interface ThemeColors {
34
+ primary: PrimaryColors;
35
+ normal: TerminalColors;
36
+ bright: TerminalColors;
37
+ selection: SelectionColors;
38
+ cursor: CursorColors;
39
+ }
40
+
41
+ export interface TerminalTheme {
42
+ name: string;
43
+ colors: ThemeColors;
44
+ }
45
+
46
+ export interface ThemeListResponse {
47
+ themes: string[];
48
+ }
49
+
50
+ export interface ThemeDataResponse {
51
+ name: string;
52
+ data: {
53
+ colors: ThemeColors;
54
+ };
55
+ }
@@ -0,0 +1,85 @@
1
+ import { Agent, Message } from '../types/graph';
2
+
3
+ export const mockAgents: Agent[] = [
4
+ {
5
+ id: 'movie',
6
+ name: 'movie',
7
+ status: 'idle',
8
+ subscriptions: [],
9
+ lastActive: Date.now() - 5000,
10
+ sentCount: 3,
11
+ recvCount: 0,
12
+ position: { x: 100, y: 100 },
13
+ },
14
+ {
15
+ id: 'tagline',
16
+ name: 'tagline',
17
+ status: 'running',
18
+ subscriptions: ['Movie'],
19
+ lastActive: Date.now() - 2000,
20
+ sentCount: 2,
21
+ recvCount: 3,
22
+ position: { x: 400, y: 100 },
23
+ },
24
+ {
25
+ id: 'reviewer',
26
+ name: 'reviewer',
27
+ status: 'idle',
28
+ subscriptions: ['Tagline'],
29
+ lastActive: Date.now() - 1000,
30
+ sentCount: 0,
31
+ recvCount: 2,
32
+ position: { x: 700, y: 100 },
33
+ },
34
+ ];
35
+
36
+ export const mockMessages: Message[] = [
37
+ {
38
+ id: 'msg-1',
39
+ type: 'Movie',
40
+ payload: { title: 'The Matrix', year: 1999, genre: 'Sci-Fi' },
41
+ timestamp: Date.now() - 10000,
42
+ correlationId: 'corr-123',
43
+ producedBy: 'movie',
44
+ },
45
+ {
46
+ id: 'msg-2',
47
+ type: 'Movie',
48
+ payload: { title: 'Inception', year: 2010, genre: 'Sci-Fi' },
49
+ timestamp: Date.now() - 8000,
50
+ correlationId: 'corr-123',
51
+ producedBy: 'movie',
52
+ },
53
+ {
54
+ id: 'msg-3',
55
+ type: 'Movie',
56
+ payload: { title: 'Interstellar', year: 2014, genre: 'Sci-Fi' },
57
+ timestamp: Date.now() - 6000,
58
+ correlationId: 'corr-123',
59
+ producedBy: 'movie',
60
+ },
61
+ {
62
+ id: 'msg-4',
63
+ type: 'Tagline',
64
+ payload: { movie: 'The Matrix', tagline: 'Reality is not what it seems' },
65
+ timestamp: Date.now() - 5000,
66
+ correlationId: 'corr-123',
67
+ producedBy: 'tagline',
68
+ },
69
+ {
70
+ id: 'msg-5',
71
+ type: 'Tagline',
72
+ payload: { movie: 'Inception', tagline: 'Your mind is the scene of the crime' },
73
+ timestamp: Date.now() - 3000,
74
+ correlationId: 'corr-123',
75
+ producedBy: 'tagline',
76
+ },
77
+ ];
78
+
79
+ export function initializeMockData() {
80
+ // This will be called from main.tsx to populate stores
81
+ return {
82
+ agents: mockAgents,
83
+ messages: mockMessages,
84
+ };
85
+ }