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,327 @@
1
+ /* ========================================
2
+ Settings Panel Styles
3
+ Using Flock Flow Design System
4
+ ======================================== */
5
+
6
+ .settings-panel {
7
+ position: fixed;
8
+ top: 0;
9
+ right: 0;
10
+ bottom: 0;
11
+ width: 400px;
12
+ z-index: 1000;
13
+
14
+ /* Glassmorphism */
15
+ background: var(--color-glass-bg);
16
+ backdrop-filter: blur(var(--blur-lg));
17
+ border-left: var(--border-default);
18
+ box-shadow: var(--shadow-xl);
19
+
20
+ /* Animation */
21
+ animation: slideInRight var(--duration-slow) var(--ease-smooth);
22
+ }
23
+
24
+ .settings-panel-inner {
25
+ display: flex;
26
+ flex-direction: column;
27
+ height: 100%;
28
+ overflow: hidden;
29
+ }
30
+
31
+ /* ========================================
32
+ Header
33
+ ======================================== */
34
+
35
+ .settings-header {
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: space-between;
39
+ padding: var(--space-layout-sm);
40
+ border-bottom: var(--border-subtle);
41
+ flex-shrink: 0;
42
+ }
43
+
44
+ .settings-title {
45
+ font-size: var(--font-size-h3);
46
+ font-weight: var(--font-weight-semibold);
47
+ color: var(--color-text-primary);
48
+ margin: 0;
49
+ }
50
+
51
+ .settings-close-button {
52
+ display: flex;
53
+ align-items: center;
54
+ justify-content: center;
55
+ width: 32px;
56
+ height: 32px;
57
+ padding: 0;
58
+ background: transparent;
59
+ border: none;
60
+ border-radius: var(--radius-md);
61
+ color: var(--color-text-secondary);
62
+ cursor: pointer;
63
+ transition: var(--transition-all);
64
+ }
65
+
66
+ .settings-close-button:hover {
67
+ background: var(--color-bg-overlay);
68
+ color: var(--color-text-primary);
69
+ }
70
+
71
+ .settings-close-button:active {
72
+ background: var(--color-bg-surface);
73
+ transform: scale(0.95);
74
+ }
75
+
76
+ /* ========================================
77
+ Tabs
78
+ ======================================== */
79
+
80
+ .settings-tabs {
81
+ display: flex;
82
+ gap: var(--gap-xs);
83
+ padding: var(--space-component-md);
84
+ border-bottom: var(--border-subtle);
85
+ flex-shrink: 0;
86
+ }
87
+
88
+ .settings-tab {
89
+ display: flex;
90
+ align-items: center;
91
+ gap: var(--gap-xs);
92
+ padding: var(--space-component-sm) var(--space-component-md);
93
+ background: transparent;
94
+ border: none;
95
+ border-radius: var(--radius-md);
96
+ color: var(--color-text-secondary);
97
+ font-size: var(--font-size-body-sm);
98
+ font-weight: var(--font-weight-medium);
99
+ cursor: pointer;
100
+ transition: var(--transition-all);
101
+ position: relative;
102
+ }
103
+
104
+ .settings-tab svg {
105
+ width: 16px;
106
+ height: 16px;
107
+ }
108
+
109
+ .settings-tab:hover {
110
+ background: var(--color-bg-overlay);
111
+ color: var(--color-text-primary);
112
+ }
113
+
114
+ .settings-tab.active {
115
+ background: var(--color-bg-surface);
116
+ color: var(--color-primary-500);
117
+ box-shadow: var(--shadow-sm);
118
+ }
119
+
120
+ .settings-tab.active::after {
121
+ content: '';
122
+ position: absolute;
123
+ bottom: 0;
124
+ left: 50%;
125
+ transform: translateX(-50%);
126
+ width: 40%;
127
+ height: 2px;
128
+ background: var(--color-primary-500);
129
+ border-radius: var(--radius-full);
130
+ }
131
+
132
+ /* ========================================
133
+ Content Area
134
+ ======================================== */
135
+
136
+ .settings-content {
137
+ flex: 1;
138
+ overflow-y: auto;
139
+ padding: var(--space-layout-sm);
140
+ }
141
+
142
+ /* Custom scrollbar */
143
+ .settings-content::-webkit-scrollbar {
144
+ width: 8px;
145
+ }
146
+
147
+ .settings-content::-webkit-scrollbar-track {
148
+ background: var(--color-bg-base);
149
+ }
150
+
151
+ .settings-content::-webkit-scrollbar-thumb {
152
+ background: var(--color-bg-overlay);
153
+ border-radius: var(--radius-full);
154
+ }
155
+
156
+ .settings-content::-webkit-scrollbar-thumb:hover {
157
+ background: var(--color-border-default);
158
+ }
159
+
160
+ /* ========================================
161
+ Footer
162
+ ======================================== */
163
+
164
+ .settings-footer {
165
+ display: flex;
166
+ align-items: center;
167
+ justify-content: space-between;
168
+ padding: var(--space-component-md);
169
+ border-top: var(--border-subtle);
170
+ flex-shrink: 0;
171
+ }
172
+
173
+ .settings-footer-left {
174
+ display: flex;
175
+ align-items: center;
176
+ }
177
+
178
+ .settings-reset-button {
179
+ padding: var(--space-component-sm) var(--space-component-md);
180
+ background: transparent;
181
+ border: var(--border-default);
182
+ border-radius: var(--radius-md);
183
+ color: var(--color-text-secondary);
184
+ font-size: var(--font-size-body-sm);
185
+ font-weight: var(--font-weight-medium);
186
+ cursor: pointer;
187
+ transition: var(--transition-all);
188
+ }
189
+
190
+ .settings-reset-button:hover {
191
+ background: var(--color-bg-overlay);
192
+ border-color: var(--color-border-strong);
193
+ color: var(--color-text-primary);
194
+ }
195
+
196
+ .settings-reset-button:active {
197
+ background: var(--color-bg-surface);
198
+ transform: scale(0.98);
199
+ }
200
+
201
+ /* ========================================
202
+ Form Elements (Shared by all tabs)
203
+ ======================================== */
204
+
205
+ .settings-section {
206
+ margin-bottom: var(--space-layout-md);
207
+ }
208
+
209
+ .settings-section:last-child {
210
+ margin-bottom: 0;
211
+ }
212
+
213
+ .settings-section-title {
214
+ font-size: var(--font-size-body-md);
215
+ font-weight: var(--font-weight-semibold);
216
+ color: var(--color-text-primary);
217
+ margin: 0 0 var(--space-component-md) 0;
218
+ padding-bottom: var(--space-component-sm);
219
+ border-bottom: var(--border-subtle);
220
+ }
221
+
222
+ .settings-field {
223
+ display: flex;
224
+ flex-direction: column;
225
+ gap: var(--gap-xs);
226
+ margin-bottom: var(--space-component-lg);
227
+ }
228
+
229
+ .settings-label {
230
+ font-size: var(--font-size-body-sm);
231
+ font-weight: var(--font-weight-medium);
232
+ color: var(--color-text-secondary);
233
+ }
234
+
235
+ .settings-description {
236
+ font-size: var(--font-size-caption);
237
+ color: var(--color-text-tertiary);
238
+ margin: 0;
239
+ }
240
+
241
+ .settings-select,
242
+ .settings-input {
243
+ width: 100%;
244
+ padding: var(--space-component-sm) var(--space-component-md);
245
+ background: var(--color-bg-elevated);
246
+ border: var(--border-default);
247
+ border-radius: var(--radius-md);
248
+ color: var(--color-text-primary);
249
+ font-size: var(--font-size-body-sm);
250
+ font-family: var(--font-family-sans);
251
+ transition: var(--transition-all);
252
+ }
253
+
254
+ .settings-select:hover,
255
+ .settings-input:hover {
256
+ border-color: var(--color-border-strong);
257
+ }
258
+
259
+ .settings-select:focus,
260
+ .settings-input:focus {
261
+ outline: none;
262
+ border-color: var(--color-border-focus);
263
+ box-shadow: var(--shadow-glow-primary);
264
+ }
265
+
266
+ .settings-checkbox-wrapper {
267
+ display: flex;
268
+ align-items: center;
269
+ gap: var(--gap-sm);
270
+ padding: var(--space-component-sm) 0;
271
+ }
272
+
273
+ .settings-checkbox {
274
+ width: 18px;
275
+ height: 18px;
276
+ accent-color: var(--color-primary-500);
277
+ cursor: pointer;
278
+ }
279
+
280
+ .settings-checkbox-label {
281
+ font-size: var(--font-size-body-sm);
282
+ color: var(--color-text-secondary);
283
+ cursor: pointer;
284
+ user-select: none;
285
+ }
286
+
287
+ /* ========================================
288
+ Animations
289
+ ======================================== */
290
+
291
+ @keyframes slideInRight {
292
+ from {
293
+ transform: translateX(100%);
294
+ opacity: 0;
295
+ }
296
+ to {
297
+ transform: translateX(0);
298
+ opacity: 1;
299
+ }
300
+ }
301
+
302
+ /* ========================================
303
+ Accessibility - Reduced Motion
304
+ ======================================== */
305
+
306
+ @media (prefers-reduced-motion: reduce) {
307
+ .settings-panel {
308
+ animation-duration: 0.01ms !important;
309
+ }
310
+
311
+ .settings-tab,
312
+ .settings-close-button,
313
+ .settings-reset-button {
314
+ transition-duration: 0.01ms !important;
315
+ }
316
+ }
317
+
318
+ /* ========================================
319
+ Responsive Design
320
+ ======================================== */
321
+
322
+ @media (max-width: 768px) {
323
+ .settings-panel {
324
+ width: 100%;
325
+ left: 0;
326
+ }
327
+ }
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Settings Panel
3
+ *
4
+ * Main settings container with tabbed interface for:
5
+ * - Graph Settings (edge customization)
6
+ * - Appearance Settings (theme, colors)
7
+ * - Advanced Settings (debug, performance)
8
+ */
9
+
10
+ import React, { useState } from 'react';
11
+ import { useSettingsStore } from '../../store/settingsStore';
12
+ import GraphSettings from './GraphSettings';
13
+ import AppearanceSettings from './AppearanceSettings';
14
+ import AdvancedSettings from './AdvancedSettings';
15
+ import BuildInfo from '../common/BuildInfo';
16
+ import './SettingsPanel.css';
17
+
18
+ type TabName = 'graph' | 'appearance' | 'advanced';
19
+
20
+ const SettingsPanel: React.FC = () => {
21
+ const [activeTab, setActiveTab] = useState<TabName>('graph');
22
+ const setShowSettings = useSettingsStore((state) => state.setShowSettings);
23
+ const resetToDefaults = useSettingsStore((state) => state.resetToDefaults);
24
+
25
+ const handleClose = () => {
26
+ setShowSettings(false);
27
+ };
28
+
29
+ const handleReset = () => {
30
+ if (confirm('Reset all settings to defaults? This cannot be undone.')) {
31
+ resetToDefaults();
32
+ }
33
+ };
34
+
35
+ return (
36
+ <div className="settings-panel">
37
+ <div className="settings-panel-inner">
38
+ {/* Header */}
39
+ <div className="settings-header">
40
+ <h2 className="settings-title">Settings</h2>
41
+ <button
42
+ onClick={handleClose}
43
+ className="settings-close-button"
44
+ aria-label="Close settings"
45
+ title="Close settings (Esc)"
46
+ >
47
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none">
48
+ <path
49
+ d="M15 5L5 15M5 5l10 10"
50
+ stroke="currentColor"
51
+ strokeWidth="2"
52
+ strokeLinecap="round"
53
+ strokeLinejoin="round"
54
+ />
55
+ </svg>
56
+ </button>
57
+ </div>
58
+
59
+ {/* Tabs */}
60
+ <div className="settings-tabs">
61
+ <button
62
+ onClick={() => setActiveTab('graph')}
63
+ className={`settings-tab ${activeTab === 'graph' ? 'active' : ''}`}
64
+ >
65
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
66
+ <circle cx="4" cy="8" r="2" stroke="currentColor" strokeWidth="1.5" />
67
+ <circle cx="12" cy="4" r="2" stroke="currentColor" strokeWidth="1.5" />
68
+ <circle cx="12" cy="12" r="2" stroke="currentColor" strokeWidth="1.5" />
69
+ <path d="M6 8h4M10 5l2 6" stroke="currentColor" strokeWidth="1.5" />
70
+ </svg>
71
+ Graph
72
+ </button>
73
+
74
+ <button
75
+ onClick={() => setActiveTab('appearance')}
76
+ className={`settings-tab ${activeTab === 'appearance' ? 'active' : ''}`}
77
+ >
78
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
79
+ <path
80
+ d="M8 2v12M2 8h12M4.343 4.343l7.314 7.314M11.657 4.343L4.343 11.657"
81
+ stroke="currentColor"
82
+ strokeWidth="1.5"
83
+ strokeLinecap="round"
84
+ />
85
+ </svg>
86
+ Appearance
87
+ </button>
88
+
89
+ <button
90
+ onClick={() => setActiveTab('advanced')}
91
+ className={`settings-tab ${activeTab === 'advanced' ? 'active' : ''}`}
92
+ >
93
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
94
+ <path
95
+ d="M8 10.667a2.667 2.667 0 100-5.334 2.667 2.667 0 000 5.334z"
96
+ stroke="currentColor"
97
+ strokeWidth="1.5"
98
+ />
99
+ <path
100
+ d="M13 8a5 5 0 01-5 5m0-10a5 5 0 015 5"
101
+ stroke="currentColor"
102
+ strokeWidth="1.5"
103
+ strokeLinecap="round"
104
+ />
105
+ </svg>
106
+ Advanced
107
+ </button>
108
+ </div>
109
+
110
+ {/* Tab Content */}
111
+ <div className="settings-content">
112
+ {activeTab === 'graph' && <GraphSettings />}
113
+ {activeTab === 'appearance' && <AppearanceSettings />}
114
+ {activeTab === 'advanced' && <AdvancedSettings />}
115
+ </div>
116
+
117
+ {/* Footer Actions */}
118
+ <div className="settings-footer">
119
+ <div className="settings-footer-left">
120
+ <BuildInfo />
121
+ </div>
122
+ <button onClick={handleReset} className="settings-reset-button">
123
+ Reset to Defaults
124
+ </button>
125
+ </div>
126
+ </div>
127
+ </div>
128
+ );
129
+ };
130
+
131
+ export default SettingsPanel;