flock-core 0.5.0b50__py3-none-any.whl → 0.5.0b52__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.
- flock/dashboard/launcher.py +1 -1
- flock/frontend/README.md +678 -0
- flock/frontend/docs/DESIGN_SYSTEM.md +1980 -0
- flock/frontend/index.html +12 -0
- flock/frontend/package-lock.json +4347 -0
- flock/frontend/package.json +48 -0
- flock/frontend/src/App.tsx +79 -0
- flock/frontend/src/__tests__/e2e/critical-scenarios.test.tsx +587 -0
- flock/frontend/src/__tests__/integration/filtering-e2e.test.tsx +387 -0
- flock/frontend/src/__tests__/integration/graph-rendering.test.tsx +640 -0
- flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +699 -0
- flock/frontend/src/components/common/BuildInfo.tsx +39 -0
- flock/frontend/src/components/common/EmptyState.module.css +115 -0
- flock/frontend/src/components/common/EmptyState.tsx +128 -0
- flock/frontend/src/components/common/ErrorBoundary.module.css +169 -0
- flock/frontend/src/components/common/ErrorBoundary.tsx +118 -0
- flock/frontend/src/components/common/KeyboardShortcutsDialog.css +251 -0
- flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +151 -0
- flock/frontend/src/components/common/LoadingSpinner.module.css +97 -0
- flock/frontend/src/components/common/LoadingSpinner.tsx +29 -0
- flock/frontend/src/components/controls/PublishControl.css +547 -0
- flock/frontend/src/components/controls/PublishControl.test.tsx +543 -0
- flock/frontend/src/components/controls/PublishControl.tsx +432 -0
- flock/frontend/src/components/details/DetailWindowContainer.tsx +62 -0
- flock/frontend/src/components/details/LiveOutputTab.test.tsx +792 -0
- flock/frontend/src/components/details/LiveOutputTab.tsx +220 -0
- flock/frontend/src/components/details/MessageHistoryTab.tsx +299 -0
- flock/frontend/src/components/details/NodeDetailWindow.test.tsx +501 -0
- flock/frontend/src/components/details/NodeDetailWindow.tsx +218 -0
- flock/frontend/src/components/details/RunStatusTab.tsx +307 -0
- flock/frontend/src/components/details/tabs.test.tsx +1015 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.module.css +102 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +197 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.tsx +121 -0
- flock/frontend/src/components/filters/FilterBar.module.css +29 -0
- flock/frontend/src/components/filters/FilterBar.test.tsx +133 -0
- flock/frontend/src/components/filters/FilterBar.tsx +33 -0
- flock/frontend/src/components/filters/FilterPills.module.css +79 -0
- flock/frontend/src/components/filters/FilterPills.test.tsx +173 -0
- flock/frontend/src/components/filters/FilterPills.tsx +67 -0
- flock/frontend/src/components/filters/TimeRangeFilter.module.css +91 -0
- flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +154 -0
- flock/frontend/src/components/filters/TimeRangeFilter.tsx +105 -0
- flock/frontend/src/components/graph/AgentNode.test.tsx +75 -0
- flock/frontend/src/components/graph/AgentNode.tsx +322 -0
- flock/frontend/src/components/graph/GraphCanvas.tsx +406 -0
- flock/frontend/src/components/graph/MessageFlowEdge.tsx +128 -0
- flock/frontend/src/components/graph/MessageNode.test.tsx +62 -0
- flock/frontend/src/components/graph/MessageNode.tsx +116 -0
- flock/frontend/src/components/graph/MiniMap.tsx +47 -0
- flock/frontend/src/components/graph/TransformEdge.tsx +123 -0
- flock/frontend/src/components/layout/DashboardLayout.css +407 -0
- flock/frontend/src/components/layout/DashboardLayout.tsx +300 -0
- flock/frontend/src/components/layout/Header.module.css +88 -0
- flock/frontend/src/components/layout/Header.tsx +52 -0
- flock/frontend/src/components/modules/EventLogModule.test.tsx +401 -0
- flock/frontend/src/components/modules/EventLogModule.tsx +396 -0
- flock/frontend/src/components/modules/EventLogModuleWrapper.tsx +17 -0
- flock/frontend/src/components/modules/ModuleRegistry.test.ts +333 -0
- flock/frontend/src/components/modules/ModuleRegistry.ts +85 -0
- flock/frontend/src/components/modules/ModuleWindow.tsx +155 -0
- flock/frontend/src/components/modules/registerModules.ts +20 -0
- flock/frontend/src/components/settings/AdvancedSettings.tsx +175 -0
- flock/frontend/src/components/settings/AppearanceSettings.tsx +185 -0
- flock/frontend/src/components/settings/GraphSettings.tsx +110 -0
- flock/frontend/src/components/settings/SettingsPanel.css +327 -0
- flock/frontend/src/components/settings/SettingsPanel.tsx +131 -0
- flock/frontend/src/components/settings/ThemeSelector.tsx +298 -0
- flock/frontend/src/hooks/useKeyboardShortcuts.ts +148 -0
- flock/frontend/src/hooks/useModulePersistence.test.ts +442 -0
- flock/frontend/src/hooks/useModulePersistence.ts +154 -0
- flock/frontend/src/hooks/useModules.ts +139 -0
- flock/frontend/src/hooks/usePersistence.ts +139 -0
- flock/frontend/src/main.tsx +13 -0
- flock/frontend/src/services/api.ts +213 -0
- flock/frontend/src/services/indexeddb.test.ts +793 -0
- flock/frontend/src/services/indexeddb.ts +794 -0
- flock/frontend/src/services/layout.test.ts +437 -0
- flock/frontend/src/services/layout.ts +146 -0
- flock/frontend/src/services/themeApplicator.ts +140 -0
- flock/frontend/src/services/themeService.ts +77 -0
- flock/frontend/src/services/websocket.test.ts +595 -0
- flock/frontend/src/services/websocket.ts +685 -0
- flock/frontend/src/store/filterStore.test.ts +242 -0
- flock/frontend/src/store/filterStore.ts +103 -0
- flock/frontend/src/store/graphStore.test.ts +186 -0
- flock/frontend/src/store/graphStore.ts +414 -0
- flock/frontend/src/store/moduleStore.test.ts +253 -0
- flock/frontend/src/store/moduleStore.ts +57 -0
- flock/frontend/src/store/settingsStore.ts +188 -0
- flock/frontend/src/store/streamStore.ts +68 -0
- flock/frontend/src/store/uiStore.test.ts +54 -0
- flock/frontend/src/store/uiStore.ts +110 -0
- flock/frontend/src/store/wsStore.ts +34 -0
- flock/frontend/src/styles/index.css +15 -0
- flock/frontend/src/styles/scrollbar.css +47 -0
- flock/frontend/src/styles/variables.css +488 -0
- flock/frontend/src/test/setup.ts +1 -0
- flock/frontend/src/types/filters.ts +14 -0
- flock/frontend/src/types/graph.ts +55 -0
- flock/frontend/src/types/modules.ts +7 -0
- flock/frontend/src/types/theme.ts +55 -0
- flock/frontend/src/utils/mockData.ts +85 -0
- flock/frontend/src/utils/performance.ts +16 -0
- flock/frontend/src/utils/transforms.test.ts +860 -0
- flock/frontend/src/utils/transforms.ts +323 -0
- flock/frontend/src/vite-env.d.ts +17 -0
- flock/frontend/tsconfig.json +27 -0
- flock/frontend/tsconfig.node.json +11 -0
- flock/frontend/vite.config.ts +25 -0
- flock/frontend/vitest.config.ts +11 -0
- flock/helper/cli_helper.py +1 -1
- {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b52.dist-info}/METADATA +1 -1
- {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b52.dist-info}/RECORD +117 -7
- {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b52.dist-info}/WHEEL +0 -0
- {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b52.dist-info}/entry_points.txt +0 -0
- {flock_core-0.5.0b50.dist-info → flock_core-0.5.0b52.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme Applicator
|
|
3
|
+
*
|
|
4
|
+
* Applies terminal themes to dashboard UI by mapping 8-color palette
|
|
5
|
+
* to CSS custom properties.
|
|
6
|
+
*
|
|
7
|
+
* See: docs/specs/004-ui-improvements/THEME_MAPPING.md
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { TerminalTheme } from '../types/theme';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Convert hex color to rgba with alpha channel
|
|
14
|
+
*/
|
|
15
|
+
function hexToRgba(hex: string, alpha: number): string {
|
|
16
|
+
const r = parseInt(hex.slice(1, 3), 16);
|
|
17
|
+
const g = parseInt(hex.slice(3, 5), 16);
|
|
18
|
+
const b = parseInt(hex.slice(5, 7), 16);
|
|
19
|
+
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Apply a theme to the dashboard by updating CSS variables
|
|
24
|
+
*/
|
|
25
|
+
export function applyTheme(theme: TerminalTheme): void {
|
|
26
|
+
const root = document.documentElement;
|
|
27
|
+
const { colors } = theme;
|
|
28
|
+
|
|
29
|
+
// Background Layers
|
|
30
|
+
root.style.setProperty('--color-bg-base', colors.primary.background);
|
|
31
|
+
root.style.setProperty('--color-bg-elevated', colors.selection.background);
|
|
32
|
+
root.style.setProperty('--color-bg-surface', colors.normal.black);
|
|
33
|
+
root.style.setProperty('--color-bg-overlay', colors.bright.black);
|
|
34
|
+
root.style.setProperty('--color-bg-float', hexToRgba(colors.normal.white, 0.1));
|
|
35
|
+
|
|
36
|
+
// Text Colors
|
|
37
|
+
root.style.setProperty('--color-text-primary', colors.primary.foreground);
|
|
38
|
+
root.style.setProperty('--color-text-secondary', colors.bright.white);
|
|
39
|
+
root.style.setProperty('--color-text-tertiary', colors.selection.text);
|
|
40
|
+
root.style.setProperty('--color-text-muted', colors.cursor.text);
|
|
41
|
+
root.style.setProperty('--color-text-on-primary', colors.selection.text);
|
|
42
|
+
|
|
43
|
+
// Brand & Accent Colors
|
|
44
|
+
root.style.setProperty('--color-primary-500', colors.normal.blue);
|
|
45
|
+
root.style.setProperty('--color-primary-400', colors.bright.blue);
|
|
46
|
+
root.style.setProperty('--color-primary-600', colors.normal.blue); // Slightly darker for hover
|
|
47
|
+
root.style.setProperty('--color-secondary-500', colors.normal.magenta);
|
|
48
|
+
root.style.setProperty('--color-secondary-400', colors.bright.magenta);
|
|
49
|
+
root.style.setProperty('--color-tertiary-500', colors.normal.cyan);
|
|
50
|
+
|
|
51
|
+
// Semantic Status Colors
|
|
52
|
+
root.style.setProperty('--color-success', colors.normal.green);
|
|
53
|
+
root.style.setProperty('--color-success-light', colors.bright.green);
|
|
54
|
+
root.style.setProperty('--color-error', colors.normal.red);
|
|
55
|
+
root.style.setProperty('--color-error-light', colors.bright.red);
|
|
56
|
+
root.style.setProperty('--color-warning', colors.normal.yellow);
|
|
57
|
+
root.style.setProperty('--color-warning-light', colors.bright.yellow);
|
|
58
|
+
root.style.setProperty('--color-info', colors.normal.cyan);
|
|
59
|
+
root.style.setProperty('--color-info-light', colors.bright.cyan);
|
|
60
|
+
|
|
61
|
+
// Graph-Specific Colors (can be overridden by user settings)
|
|
62
|
+
// Only set if user hasn't customized them
|
|
63
|
+
const currentIdleColor = root.style.getPropertyValue('--agent-idle-color');
|
|
64
|
+
if (!currentIdleColor || currentIdleColor === '#60a5fa') {
|
|
65
|
+
root.style.setProperty('--agent-idle-color', colors.normal.cyan);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const currentActiveColor = root.style.getPropertyValue('--agent-active-color');
|
|
69
|
+
if (!currentActiveColor || currentActiveColor === '#10b981') {
|
|
70
|
+
root.style.setProperty('--agent-active-color', colors.normal.green);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const currentErrorColor = root.style.getPropertyValue('--agent-error-color');
|
|
74
|
+
if (!currentErrorColor || currentErrorColor === '#ef4444') {
|
|
75
|
+
root.style.setProperty('--agent-error-color', colors.normal.red);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Border & Divider Colors
|
|
79
|
+
root.style.setProperty('--color-border-default', colors.bright.black);
|
|
80
|
+
root.style.setProperty('--color-border-subtle', hexToRgba(colors.normal.white, 0.2));
|
|
81
|
+
root.style.setProperty('--color-border-strong', colors.cursor.cursor);
|
|
82
|
+
root.style.setProperty('--color-border-focus', colors.normal.blue);
|
|
83
|
+
root.style.setProperty('--color-border-error', colors.normal.red);
|
|
84
|
+
|
|
85
|
+
// Special Effect Colors
|
|
86
|
+
root.style.setProperty('--color-glass-bg', hexToRgba(colors.selection.background, 0.8));
|
|
87
|
+
root.style.setProperty('--color-glow-primary', colors.cursor.cursor);
|
|
88
|
+
root.style.setProperty('--shadow-glow-primary', `0 0 0 3px ${hexToRgba(colors.bright.blue, 0.5)}`);
|
|
89
|
+
root.style.setProperty('--shadow-glow-error', `0 0 0 3px ${hexToRgba(colors.bright.red, 0.5)}`);
|
|
90
|
+
|
|
91
|
+
// Edge colors
|
|
92
|
+
root.style.setProperty('--color-edge-default', colors.bright.black);
|
|
93
|
+
root.style.setProperty('--color-edge-message', colors.bright.yellow);
|
|
94
|
+
root.style.setProperty('--color-edge-active', colors.bright.blue);
|
|
95
|
+
|
|
96
|
+
// Node colors
|
|
97
|
+
root.style.setProperty('--color-node-message-border', colors.normal.magenta);
|
|
98
|
+
|
|
99
|
+
console.log(`[Theme] Applied theme: ${theme.name}`);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Reset to default theme (current design system colors)
|
|
104
|
+
*/
|
|
105
|
+
export function resetToDefaultTheme(): void {
|
|
106
|
+
const root = document.documentElement;
|
|
107
|
+
|
|
108
|
+
// Reset to original design system values
|
|
109
|
+
root.style.setProperty('--color-bg-base', '#0a0a0b');
|
|
110
|
+
root.style.setProperty('--color-bg-elevated', '#121214');
|
|
111
|
+
root.style.setProperty('--color-bg-surface', '#1a1a1e');
|
|
112
|
+
root.style.setProperty('--color-bg-overlay', '#232329');
|
|
113
|
+
root.style.setProperty('--color-bg-float', '#2a2a32');
|
|
114
|
+
|
|
115
|
+
root.style.setProperty('--color-text-primary', '#e5e7eb');
|
|
116
|
+
root.style.setProperty('--color-text-secondary', '#9ca3af');
|
|
117
|
+
root.style.setProperty('--color-text-tertiary', '#6b7280');
|
|
118
|
+
|
|
119
|
+
root.style.setProperty('--color-primary-500', '#6366f1');
|
|
120
|
+
root.style.setProperty('--color-primary-400', '#818cf8');
|
|
121
|
+
root.style.setProperty('--color-primary-600', '#4f46e5');
|
|
122
|
+
|
|
123
|
+
console.log('[Theme] Reset to default theme');
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Get a preview swatch array for a theme (8 colors)
|
|
128
|
+
*/
|
|
129
|
+
export function getThemePreview(theme: TerminalTheme): string[] {
|
|
130
|
+
return [
|
|
131
|
+
theme.colors.normal.black,
|
|
132
|
+
theme.colors.normal.red,
|
|
133
|
+
theme.colors.normal.green,
|
|
134
|
+
theme.colors.normal.yellow,
|
|
135
|
+
theme.colors.normal.blue,
|
|
136
|
+
theme.colors.normal.magenta,
|
|
137
|
+
theme.colors.normal.cyan,
|
|
138
|
+
theme.colors.normal.white,
|
|
139
|
+
];
|
|
140
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme Service
|
|
3
|
+
*
|
|
4
|
+
* Fetches terminal themes from the backend API.
|
|
5
|
+
* Themes are loaded from TOML files in src/flock/themes/
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { TerminalTheme, ThemeListResponse, ThemeDataResponse } from '../types/theme';
|
|
9
|
+
|
|
10
|
+
const BASE_URL = import.meta.env.VITE_API_BASE_URL || '/api';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Fetch list of available theme names
|
|
14
|
+
*/
|
|
15
|
+
export async function fetchThemeList(): Promise<string[]> {
|
|
16
|
+
try {
|
|
17
|
+
const response = await fetch(`${BASE_URL}/themes`, {
|
|
18
|
+
method: 'GET',
|
|
19
|
+
headers: {
|
|
20
|
+
'Content-Type': 'application/json',
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
throw new Error(`Failed to fetch themes: ${response.statusText}`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const data: ThemeListResponse = await response.json();
|
|
29
|
+
return data.themes;
|
|
30
|
+
} catch (error) {
|
|
31
|
+
console.error('Error fetching theme list:', error);
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Fetch a specific theme by name
|
|
38
|
+
*/
|
|
39
|
+
export async function fetchTheme(themeName: string): Promise<TerminalTheme> {
|
|
40
|
+
try {
|
|
41
|
+
const response = await fetch(`${BASE_URL}/themes/${themeName}`, {
|
|
42
|
+
method: 'GET',
|
|
43
|
+
headers: {
|
|
44
|
+
'Content-Type': 'application/json',
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
throw new Error(`Failed to fetch theme "${themeName}": ${response.statusText}`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const data: ThemeDataResponse = await response.json();
|
|
53
|
+
return {
|
|
54
|
+
name: data.name,
|
|
55
|
+
colors: data.data.colors,
|
|
56
|
+
};
|
|
57
|
+
} catch (error) {
|
|
58
|
+
console.error(`Error fetching theme "${themeName}":`, error);
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Get popular/recommended themes
|
|
65
|
+
*/
|
|
66
|
+
export const POPULAR_THEMES = [
|
|
67
|
+
'dracula',
|
|
68
|
+
'nord',
|
|
69
|
+
'catppuccin-mocha',
|
|
70
|
+
'tokyonight',
|
|
71
|
+
'gruvboxdark',
|
|
72
|
+
'solarized-dark',
|
|
73
|
+
'github-dark',
|
|
74
|
+
'one-half-dark',
|
|
75
|
+
'monokai',
|
|
76
|
+
'material',
|
|
77
|
+
];
|