uilint-react 0.2.47 → 0.2.49
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.
- package/dist/DevTool.d.ts +1 -2
- package/dist/DevTool.d.ts.map +1 -1
- package/dist/components/ui-lint/index.d.ts +3 -10
- package/dist/components/ui-lint/index.d.ts.map +1 -1
- package/dist/consistency/highlights.d.ts.map +1 -1
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/plugin-system/index.d.ts +7 -0
- package/dist/core/plugin-system/index.d.ts.map +1 -0
- package/dist/core/plugin-system/loader.d.ts +38 -0
- package/dist/core/plugin-system/loader.d.ts.map +1 -0
- package/dist/core/plugin-system/registry.d.ts +130 -0
- package/dist/core/plugin-system/registry.d.ts.map +1 -0
- package/dist/core/plugin-system/types.d.ts +353 -0
- package/dist/core/plugin-system/types.d.ts.map +1 -0
- package/dist/core/services/dom-observer.d.ts +171 -0
- package/dist/core/services/dom-observer.d.ts.map +1 -0
- package/dist/core/services/index.d.ts +6 -0
- package/dist/core/services/index.d.ts.map +1 -0
- package/dist/core/services/websocket.d.ts +112 -0
- package/dist/core/services/websocket.d.ts.map +1 -0
- package/dist/core/store/composed-store.d.ts +212 -0
- package/dist/core/store/composed-store.d.ts.map +1 -0
- package/dist/core/store/core-slice.d.ts +126 -0
- package/dist/core/store/core-slice.d.ts.map +1 -0
- package/dist/core/store/index.d.ts +6 -0
- package/dist/core/store/index.d.ts.map +1 -0
- package/dist/devtools.js +117 -136
- package/dist/devtools.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1675 -12464
- package/dist/index.js.map +1 -1
- package/dist/plugins/eslint/commands.d.ts +6 -0
- package/dist/plugins/eslint/commands.d.ts.map +1 -0
- package/dist/plugins/eslint/index.d.ts +10 -0
- package/dist/plugins/eslint/index.d.ts.map +1 -0
- package/dist/plugins/eslint/slice.d.ts +66 -0
- package/dist/plugins/eslint/slice.d.ts.map +1 -0
- package/dist/plugins/eslint/types.d.ts +128 -0
- package/dist/plugins/eslint/types.d.ts.map +1 -0
- package/dist/plugins/semantic/commands.d.ts +6 -0
- package/dist/plugins/semantic/commands.d.ts.map +1 -0
- package/dist/plugins/semantic/index.d.ts +15 -0
- package/dist/plugins/semantic/index.d.ts.map +1 -0
- package/dist/plugins/semantic/slice.d.ts +52 -0
- package/dist/plugins/semantic/slice.d.ts.map +1 -0
- package/dist/plugins/semantic/types.d.ts +121 -0
- package/dist/plugins/semantic/types.d.ts.map +1 -0
- package/dist/plugins/vision/commands.d.ts +6 -0
- package/dist/plugins/vision/commands.d.ts.map +1 -0
- package/dist/plugins/vision/index.d.ts +12 -0
- package/dist/plugins/vision/index.d.ts.map +1 -0
- package/dist/plugins/vision/slice.d.ts +104 -0
- package/dist/plugins/vision/slice.d.ts.map +1 -0
- package/dist/plugins/vision/types.d.ts +169 -0
- package/dist/plugins/vision/types.d.ts.map +1 -0
- package/dist/scanner/vision-capture.d.ts.map +1 -1
- package/dist/ui/UILint.d.ts +11 -0
- package/dist/ui/UILint.d.ts.map +1 -0
- package/dist/ui/components/CommandPalette/CommandPalette.d.ts +3 -0
- package/dist/ui/components/CommandPalette/CommandPalette.d.ts.map +1 -0
- package/dist/ui/components/CommandPalette/ResultItem.d.ts +9 -0
- package/dist/ui/components/CommandPalette/ResultItem.d.ts.map +1 -0
- package/dist/ui/components/CommandPalette/SearchInput.d.ts +8 -0
- package/dist/ui/components/CommandPalette/SearchInput.d.ts.map +1 -0
- package/dist/ui/components/CommandPalette/index.d.ts +2 -0
- package/dist/ui/components/CommandPalette/index.d.ts.map +1 -0
- package/dist/ui/components/FloatingIcon.d.ts +3 -0
- package/dist/ui/components/FloatingIcon.d.ts.map +1 -0
- package/dist/ui/components/HeatmapOverlay.d.ts.map +1 -0
- package/dist/ui/components/Inspector/ElementDetail.d.ts +8 -0
- package/dist/ui/components/Inspector/ElementDetail.d.ts.map +1 -0
- package/dist/ui/components/Inspector/InspectorSidebar.d.ts +3 -0
- package/dist/ui/components/Inspector/InspectorSidebar.d.ts.map +1 -0
- package/dist/ui/components/Inspector/IssueDetail.d.ts +7 -0
- package/dist/ui/components/Inspector/IssueDetail.d.ts.map +1 -0
- package/dist/ui/components/Inspector/index.d.ts +2 -0
- package/dist/ui/components/Inspector/index.d.ts.map +1 -0
- package/dist/ui/hooks/index.d.ts +4 -0
- package/dist/ui/hooks/index.d.ts.map +1 -0
- package/dist/ui/hooks/useElementRects.d.ts +12 -0
- package/dist/ui/hooks/useElementRects.d.ts.map +1 -0
- package/dist/ui/hooks/useIssues.d.ts +17 -0
- package/dist/ui/hooks/useIssues.d.ts.map +1 -0
- package/dist/ui/hooks/useKeyboardShortcuts.d.ts +8 -0
- package/dist/ui/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/ui/icons.d.ts +20 -0
- package/dist/ui/icons.d.ts.map +1 -0
- package/dist/ui/index.d.ts +16 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/types.d.ts +69 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/package.json +3 -3
- package/dist/components/ui-lint/FloatingIcon.d.ts +0 -3
- package/dist/components/ui-lint/FloatingIcon.d.ts.map +0 -1
- package/dist/components/ui-lint/HeatmapOverlay.d.ts.map +0 -1
- package/dist/components/ui-lint/IndexingIndicator.d.ts +0 -3
- package/dist/components/ui-lint/IndexingIndicator.d.ts.map +0 -1
- package/dist/components/ui-lint/RegionSelector.d.ts +0 -18
- package/dist/components/ui-lint/RegionSelector.d.ts.map +0 -1
- package/dist/components/ui-lint/ScreenshotViewer.d.ts +0 -11
- package/dist/components/ui-lint/ScreenshotViewer.d.ts.map +0 -1
- package/dist/components/ui-lint/UILintUI.d.ts +0 -5
- package/dist/components/ui-lint/UILintUI.d.ts.map +0 -1
- package/dist/components/ui-lint/VisionIssuesPanel.d.ts +0 -12
- package/dist/components/ui-lint/VisionIssuesPanel.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/CategorySidebar.d.ts +0 -29
- package/dist/components/ui-lint/command-palette/CategorySidebar.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/CommandPalette.d.ts +0 -7
- package/dist/components/ui-lint/command-palette/CommandPalette.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/CommandPaletteInput.d.ts +0 -18
- package/dist/components/ui-lint/command-palette/CommandPaletteInput.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/CommandPaletteItem.d.ts +0 -26
- package/dist/components/ui-lint/command-palette/CommandPaletteItem.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/CommandPaletteResults.d.ts +0 -46
- package/dist/components/ui-lint/command-palette/CommandPaletteResults.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/FilterChips.d.ts +0 -11
- package/dist/components/ui-lint/command-palette/FilterChips.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/RuleDetailItem.d.ts +0 -15
- package/dist/components/ui-lint/command-palette/RuleDetailItem.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/RuleEditor.d.ts +0 -22
- package/dist/components/ui-lint/command-palette/RuleEditor.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/RuleToggleItem.d.ts +0 -20
- package/dist/components/ui-lint/command-palette/RuleToggleItem.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/SourceCodePreview.d.ts +0 -17
- package/dist/components/ui-lint/command-palette/SourceCodePreview.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/icons.d.ts +0 -39
- package/dist/components/ui-lint/command-palette/icons.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/index.d.ts +0 -13
- package/dist/components/ui-lint/command-palette/index.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/types.d.ts +0 -160
- package/dist/components/ui-lint/command-palette/types.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/use-fuzzy-search.d.ts +0 -19
- package/dist/components/ui-lint/command-palette/use-fuzzy-search.d.ts.map +0 -1
- package/dist/components/ui-lint/command-palette/use-keyboard-navigation.d.ts +0 -10
- package/dist/components/ui-lint/command-palette/use-keyboard-navigation.d.ts.map +0 -1
- package/dist/components/ui-lint/hooks/index.d.ts +0 -4
- package/dist/components/ui-lint/hooks/index.d.ts.map +0 -1
- package/dist/components/ui-lint/hooks/useAutoScans.d.ts +0 -5
- package/dist/components/ui-lint/hooks/useAutoScans.d.ts.map +0 -1
- package/dist/components/ui-lint/hooks/useDevToolEventHandlers.d.ts +0 -5
- package/dist/components/ui-lint/hooks/useDevToolEventHandlers.d.ts.map +0 -1
- package/dist/components/ui-lint/hooks/useNavigationDetection.d.ts +0 -6
- package/dist/components/ui-lint/hooks/useNavigationDetection.d.ts.map +0 -1
- package/dist/components/ui-lint/inspector/ElementInspector.d.ts +0 -9
- package/dist/components/ui-lint/inspector/ElementInspector.d.ts.map +0 -1
- package/dist/components/ui-lint/inspector/FixesInspector.d.ts +0 -6
- package/dist/components/ui-lint/inspector/FixesInspector.d.ts.map +0 -1
- package/dist/components/ui-lint/inspector/FullFileViewer.d.ts +0 -17
- package/dist/components/ui-lint/inspector/FullFileViewer.d.ts.map +0 -1
- package/dist/components/ui-lint/inspector/InspectorSidebar.d.ts +0 -12
- package/dist/components/ui-lint/inspector/InspectorSidebar.d.ts.map +0 -1
- package/dist/components/ui-lint/inspector/IssueInspector.d.ts +0 -12
- package/dist/components/ui-lint/inspector/IssueInspector.d.ts.map +0 -1
- package/dist/components/ui-lint/inspector/MarkdownRenderer.d.ts +0 -11
- package/dist/components/ui-lint/inspector/MarkdownRenderer.d.ts.map +0 -1
- package/dist/components/ui-lint/inspector/ResizeHandle.d.ts +0 -19
- package/dist/components/ui-lint/inspector/ResizeHandle.d.ts.map +0 -1
- package/dist/components/ui-lint/inspector/RuleInspector.d.ts +0 -10
- package/dist/components/ui-lint/inspector/RuleInspector.d.ts.map +0 -1
- package/dist/components/ui-lint/inspector/index.d.ts +0 -8
- package/dist/components/ui-lint/inspector/index.d.ts.map +0 -1
- package/dist/components/ui-lint/portal-host.d.ts +0 -3
- package/dist/components/ui-lint/portal-host.d.ts.map +0 -1
- package/dist/components/ui-lint/store.d.ts +0 -431
- package/dist/components/ui-lint/store.d.ts.map +0 -1
- package/dist/components/ui-lint/useDOMObserver.d.ts +0 -11
- package/dist/components/ui-lint/useDOMObserver.d.ts.map +0 -1
- package/dist/index-L3Zm-CoX.js +0 -513
- package/dist/index-L3Zm-CoX.js.map +0 -1
- package/dist/vision-capture-8mhdjw77.js +0 -235
- package/dist/vision-capture-8mhdjw77.js.map +0 -1
- /package/dist/{components/ui-lint → ui/components}/HeatmapOverlay.d.ts +0 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM Observer Service
|
|
3
|
+
*
|
|
4
|
+
* A shared service that watches for elements with data-loc attributes.
|
|
5
|
+
* Used to track DOM elements for source visualization and scanning.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - MutationObserver-based tracking of data-loc elements
|
|
9
|
+
* - Debounced reconciliation for handling streaming/suspense
|
|
10
|
+
* - Subscribe/unsubscribe pattern for add/remove notifications
|
|
11
|
+
* - Filtering for node_modules and UILint's own UI
|
|
12
|
+
* - Dependency injection for testability
|
|
13
|
+
*/
|
|
14
|
+
/** The attribute used to identify source-mapped elements */
|
|
15
|
+
export declare const DATA_LOC_ATTR = "data-loc";
|
|
16
|
+
/** Debounce delay for reconciliation to handle rapid DOM changes */
|
|
17
|
+
export declare const RECONCILE_DEBOUNCE_MS = 100;
|
|
18
|
+
/**
|
|
19
|
+
* Generate a unique element ID from data-loc and occurrence number
|
|
20
|
+
* @param dataLoc - The parsed data-loc value (path:line:column)
|
|
21
|
+
* @param occurrence - The occurrence number (1-based) for elements with same dataLoc
|
|
22
|
+
* @returns Unique ID in format "loc:path:line:column#occurrence"
|
|
23
|
+
*/
|
|
24
|
+
export declare function generateElementId(dataLoc: string, occurrence: number): string;
|
|
25
|
+
/**
|
|
26
|
+
* Parse a raw data-loc attribute value, normalizing runtime ID format if present
|
|
27
|
+
* @param rawDataLoc - The raw data-loc attribute value
|
|
28
|
+
* @returns The normalized data-loc value (path:line:column) or null if invalid
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseDataLoc(rawDataLoc: string): string | null;
|
|
31
|
+
/**
|
|
32
|
+
* Check if a path should be filtered based on node_modules presence
|
|
33
|
+
* @param path - The file path to check
|
|
34
|
+
* @param hideNodeModules - Whether to filter node_modules paths
|
|
35
|
+
* @returns True if the path should be filtered out
|
|
36
|
+
*/
|
|
37
|
+
export declare function shouldFilterPath(path: string, hideNodeModules: boolean): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Options for creating a DOMObserverService instance
|
|
40
|
+
* Enables dependency injection for testing
|
|
41
|
+
*/
|
|
42
|
+
export interface DOMObserverOptions {
|
|
43
|
+
/** Root element to observe (defaults to document.body) */
|
|
44
|
+
root?: Element;
|
|
45
|
+
/** MutationObserver implementation (defaults to window.MutationObserver) */
|
|
46
|
+
MutationObserverImpl?: typeof MutationObserver;
|
|
47
|
+
/** Custom querySelectorAll function (defaults to document.querySelectorAll) */
|
|
48
|
+
querySelectorAll?: (selector: string) => NodeListOf<Element>;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Information about a scanned DOM element with data-loc attribute
|
|
52
|
+
*/
|
|
53
|
+
export interface ScannedElementInfo {
|
|
54
|
+
/**
|
|
55
|
+
* Unique per-instance ID derived from data-loc.
|
|
56
|
+
* Format: "loc:path:line:column#occurrence"
|
|
57
|
+
*/
|
|
58
|
+
id: string;
|
|
59
|
+
/** The raw data-loc attribute value (path:line:column) */
|
|
60
|
+
dataLoc: string;
|
|
61
|
+
/** Reference to the DOM element */
|
|
62
|
+
element: Element;
|
|
63
|
+
/** Lowercase tag name of the element */
|
|
64
|
+
tagName: string;
|
|
65
|
+
/** Current bounding client rect */
|
|
66
|
+
rect: DOMRect;
|
|
67
|
+
}
|
|
68
|
+
/** Handler called when new elements with data-loc are detected */
|
|
69
|
+
export type ElementAddedHandler = (elements: ScannedElementInfo[]) => void;
|
|
70
|
+
/** Handler called when elements with data-loc are removed */
|
|
71
|
+
export type ElementRemovedHandler = (elementIds: string[]) => void;
|
|
72
|
+
/**
|
|
73
|
+
* Interface for the DOM Observer Service
|
|
74
|
+
*/
|
|
75
|
+
export interface DOMObserverService {
|
|
76
|
+
/** Configure whether to filter out node_modules paths */
|
|
77
|
+
setHideNodeModules(hide: boolean): void;
|
|
78
|
+
/** Start observing the DOM */
|
|
79
|
+
start(): void;
|
|
80
|
+
/** Stop observing and clear state */
|
|
81
|
+
stop(): void;
|
|
82
|
+
/** Subscribe to element addition events, returns unsubscribe function */
|
|
83
|
+
onElementsAdded(handler: ElementAddedHandler): () => void;
|
|
84
|
+
/** Subscribe to element removal events, returns unsubscribe function */
|
|
85
|
+
onElementsRemoved(handler: ElementRemovedHandler): () => void;
|
|
86
|
+
/** Get all currently tracked elements */
|
|
87
|
+
getElements(): ScannedElementInfo[];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* DOM Observer Service Implementation
|
|
91
|
+
*
|
|
92
|
+
* Service that tracks data-loc elements in the DOM.
|
|
93
|
+
* Supports dependency injection for testability.
|
|
94
|
+
*/
|
|
95
|
+
export declare class DOMObserverServiceImpl implements DOMObserverService {
|
|
96
|
+
private observer;
|
|
97
|
+
private reconcileTimeout;
|
|
98
|
+
private knownElements;
|
|
99
|
+
private addedHandlers;
|
|
100
|
+
private removedHandlers;
|
|
101
|
+
private isRunning;
|
|
102
|
+
private hideNodeModules;
|
|
103
|
+
private readonly options;
|
|
104
|
+
/**
|
|
105
|
+
* Create a new DOMObserverService instance
|
|
106
|
+
* @param options - Optional configuration for dependency injection
|
|
107
|
+
*/
|
|
108
|
+
constructor(options?: DOMObserverOptions);
|
|
109
|
+
/**
|
|
110
|
+
* Configure whether to filter out elements from node_modules
|
|
111
|
+
*/
|
|
112
|
+
setHideNodeModules(hide: boolean): void;
|
|
113
|
+
/**
|
|
114
|
+
* Start observing the DOM for data-loc elements
|
|
115
|
+
*/
|
|
116
|
+
start(): void;
|
|
117
|
+
/**
|
|
118
|
+
* Stop observing and clear all state
|
|
119
|
+
*/
|
|
120
|
+
stop(): void;
|
|
121
|
+
/**
|
|
122
|
+
* Subscribe to element addition events
|
|
123
|
+
* @returns Unsubscribe function
|
|
124
|
+
*/
|
|
125
|
+
onElementsAdded(handler: ElementAddedHandler): () => void;
|
|
126
|
+
/**
|
|
127
|
+
* Subscribe to element removal events
|
|
128
|
+
* @returns Unsubscribe function
|
|
129
|
+
*/
|
|
130
|
+
onElementsRemoved(handler: ElementRemovedHandler): () => void;
|
|
131
|
+
/**
|
|
132
|
+
* Get all currently tracked elements
|
|
133
|
+
*/
|
|
134
|
+
getElements(): ScannedElementInfo[];
|
|
135
|
+
/**
|
|
136
|
+
* Handle MutationObserver callbacks
|
|
137
|
+
*/
|
|
138
|
+
private handleMutations;
|
|
139
|
+
/**
|
|
140
|
+
* Check if a node or its descendants have data-loc attributes
|
|
141
|
+
*/
|
|
142
|
+
private hasDataLocElements;
|
|
143
|
+
/**
|
|
144
|
+
* Debounced reconciliation to handle rapid DOM updates
|
|
145
|
+
*/
|
|
146
|
+
private debouncedReconcile;
|
|
147
|
+
/**
|
|
148
|
+
* Full reconciliation: scan DOM, diff with known elements, emit events
|
|
149
|
+
*/
|
|
150
|
+
private reconcile;
|
|
151
|
+
/**
|
|
152
|
+
* Scan the DOM for all elements with data-loc attributes
|
|
153
|
+
*/
|
|
154
|
+
private scanElements;
|
|
155
|
+
/**
|
|
156
|
+
* Check if an element is inside UILint's own UI
|
|
157
|
+
*/
|
|
158
|
+
private isInsideUILintUI;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Create a new DOMObserverService instance with optional dependency injection
|
|
162
|
+
* @param options - Optional configuration for dependency injection (useful for testing)
|
|
163
|
+
* @returns A new DOMObserverService instance
|
|
164
|
+
*/
|
|
165
|
+
export declare function createDOMObserverService(options?: DOMObserverOptions): DOMObserverService;
|
|
166
|
+
/**
|
|
167
|
+
* Shared DOM observer service instance
|
|
168
|
+
* @deprecated Use createDOMObserverService() for new code that needs testability
|
|
169
|
+
*/
|
|
170
|
+
export declare const domObserver: DOMObserverService;
|
|
171
|
+
//# sourceMappingURL=dom-observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-observer.d.ts","sourceRoot":"","sources":["../../../src/core/services/dom-observer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Services - Shared services for all plugins
|
|
3
|
+
*/
|
|
4
|
+
export { websocket, WebSocketServiceImpl, createWebSocketService, DEFAULT_WS_URL, MAX_RECONNECT_ATTEMPTS, RECONNECT_BASE_DELAY, type WebSocketService, type WebSocketServiceOptions, type MessageHandler, type ConnectionHandler, } from './websocket';
|
|
5
|
+
export { domObserver, createDOMObserverService, DOMObserverServiceImpl, generateElementId, parseDataLoc, shouldFilterPath, DATA_LOC_ATTR, RECONCILE_DEBOUNCE_MS, type DOMObserverOptions, type DOMObserverService, type ScannedElementInfo, type ElementAddedHandler, type ElementRemovedHandler, } from './dom-observer';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,sBAAsB,EACtB,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAEL,WAAW,EAEX,wBAAwB,EAExB,sBAAsB,EAEtB,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAEhB,aAAa,EACb,qBAAqB,EAErB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Service - Singleton shared by all plugins
|
|
3
|
+
*
|
|
4
|
+
* Provides connection management, message routing, and automatic reconnection
|
|
5
|
+
* with exponential backoff.
|
|
6
|
+
*/
|
|
7
|
+
export declare const DEFAULT_WS_URL = "ws://localhost:9234";
|
|
8
|
+
export declare const MAX_RECONNECT_ATTEMPTS = 5;
|
|
9
|
+
export declare const RECONNECT_BASE_DELAY = 1000;
|
|
10
|
+
export type MessageHandler<T = unknown> = (data: T) => void;
|
|
11
|
+
export type ConnectionHandler = (connected: boolean) => void;
|
|
12
|
+
/**
|
|
13
|
+
* Options for dependency injection in WebSocketService
|
|
14
|
+
* Allows injecting mock implementations for testing
|
|
15
|
+
*/
|
|
16
|
+
export interface WebSocketServiceOptions {
|
|
17
|
+
/** Factory function to create WebSocket instances */
|
|
18
|
+
createWebSocket?: (url: string) => WebSocket;
|
|
19
|
+
/** Custom setTimeout implementation */
|
|
20
|
+
setTimeout?: typeof globalThis.setTimeout;
|
|
21
|
+
/** Custom clearTimeout implementation */
|
|
22
|
+
clearTimeout?: typeof globalThis.clearTimeout;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* WebSocket service interface
|
|
26
|
+
*/
|
|
27
|
+
export interface WebSocketService {
|
|
28
|
+
readonly isConnected: boolean;
|
|
29
|
+
readonly url: string;
|
|
30
|
+
connect(url?: string): void;
|
|
31
|
+
disconnect(): void;
|
|
32
|
+
send(message: unknown): void;
|
|
33
|
+
on<T>(type: string, handler: MessageHandler<T>): () => void;
|
|
34
|
+
onConnectionChange(handler: ConnectionHandler): () => void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* WebSocket service implementation
|
|
38
|
+
*/
|
|
39
|
+
export declare class WebSocketServiceImpl implements WebSocketService {
|
|
40
|
+
private options;
|
|
41
|
+
private ws;
|
|
42
|
+
private handlers;
|
|
43
|
+
private connectionHandlers;
|
|
44
|
+
private reconnectAttempts;
|
|
45
|
+
private reconnectTimeout;
|
|
46
|
+
private intentionalDisconnect;
|
|
47
|
+
private readonly createWebSocket;
|
|
48
|
+
private readonly _setTimeout;
|
|
49
|
+
private readonly _clearTimeout;
|
|
50
|
+
isConnected: boolean;
|
|
51
|
+
url: string;
|
|
52
|
+
/**
|
|
53
|
+
* Create a new WebSocket service instance
|
|
54
|
+
* @param options - Optional dependency injection options for testing
|
|
55
|
+
*/
|
|
56
|
+
constructor(options?: WebSocketServiceOptions);
|
|
57
|
+
/**
|
|
58
|
+
* Connect to the WebSocket server
|
|
59
|
+
* @param url - Optional URL to connect to (defaults to DEFAULT_WS_URL)
|
|
60
|
+
*/
|
|
61
|
+
connect(url?: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* Disconnect from the WebSocket server
|
|
64
|
+
* Prevents automatic reconnection
|
|
65
|
+
*/
|
|
66
|
+
disconnect(): void;
|
|
67
|
+
/**
|
|
68
|
+
* Send a message to the WebSocket server
|
|
69
|
+
* @param message - The message to send (will be JSON stringified)
|
|
70
|
+
*/
|
|
71
|
+
send(message: unknown): void;
|
|
72
|
+
/**
|
|
73
|
+
* Subscribe to messages of a specific type
|
|
74
|
+
* @param type - Message type to subscribe to, or "*" for all messages
|
|
75
|
+
* @param handler - Handler function to call when message is received
|
|
76
|
+
* @returns Unsubscribe function
|
|
77
|
+
*/
|
|
78
|
+
on<T>(type: string, handler: MessageHandler<T>): () => void;
|
|
79
|
+
/**
|
|
80
|
+
* Subscribe to connection status changes
|
|
81
|
+
* @param handler - Handler function to call when connection status changes
|
|
82
|
+
* @returns Unsubscribe function
|
|
83
|
+
*/
|
|
84
|
+
onConnectionChange(handler: ConnectionHandler): () => void;
|
|
85
|
+
/**
|
|
86
|
+
* Set up WebSocket event handlers
|
|
87
|
+
*/
|
|
88
|
+
private setupEventHandlers;
|
|
89
|
+
/**
|
|
90
|
+
* Dispatch a message to registered handlers
|
|
91
|
+
* @param type - Message type
|
|
92
|
+
* @param data - Message data
|
|
93
|
+
*/
|
|
94
|
+
private dispatch;
|
|
95
|
+
/**
|
|
96
|
+
* Notify all connection handlers of a status change
|
|
97
|
+
* @param connected - Current connection status
|
|
98
|
+
*/
|
|
99
|
+
private notifyConnectionChange;
|
|
100
|
+
/**
|
|
101
|
+
* Schedule a reconnection attempt with exponential backoff
|
|
102
|
+
*/
|
|
103
|
+
private scheduleReconnect;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Factory function to create a WebSocket service instance
|
|
107
|
+
* @param options - Optional dependency injection options for testing
|
|
108
|
+
* @returns A new WebSocket service instance
|
|
109
|
+
*/
|
|
110
|
+
export declare function createWebSocketService(options?: WebSocketServiceOptions): WebSocketService;
|
|
111
|
+
export declare const websocket: WebSocketServiceImpl;
|
|
112
|
+
//# sourceMappingURL=websocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../../src/core/services/websocket.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,eAAO,MAAM,cAAc,wBAAwB,CAAC;AACpD,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAGzC,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAC5D,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,qDAAqD;IACrD,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;IAC7C,uCAAuC;IACvC,UAAU,CAAC,EAAE,OAAO,UAAU,CAAC,UAAU,CAAC;IAC1C,yCAAyC;IACzC,YAAY,CAAC,EAAE,OAAO,UAAU,CAAC,YAAY,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,IAAI,IAAI,CAAC;IACnB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IAC5D,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAAC;CAC5D;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,gBAAgB;IAoB/C,OAAO,CAAC,OAAO;IAnB3B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,kBAAkB,CAAqC;IAC/D,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,gBAAgB,CAA8C;IACtE,OAAO,CAAC,qBAAqB,CAAkB;IAG/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAC7D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+B;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiC;IAExD,WAAW,EAAE,OAAO,CAAS;IAC7B,GAAG,EAAE,MAAM,CAAkB;IAEpC;;;OAGG;gBACiB,OAAO,GAAE,uBAA4B;IAOzD;;;OAGG;IACH,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IA8B3B;;;OAGG;IACH,UAAU,IAAI,IAAI;IAkBlB;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAa5B;;;;;OAKG;IACH,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAiB3D;;;;OAIG;IACH,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAY1D;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuC1B;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IA4BhB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CA8B1B;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,CAAC,EAAE,uBAAuB,GAChC,gBAAgB,CAElB;AAGD,eAAO,MAAM,SAAS,sBAA6B,CAAC"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { StoreApi, UseBoundStore } from 'zustand';
|
|
2
|
+
import { CoreSlice } from './core-slice';
|
|
3
|
+
import { PluginRegistry } from '../plugin-system/registry';
|
|
4
|
+
import { PluginServices, WebSocketService, DOMObserverService } from '../plugin-system/types';
|
|
5
|
+
import { ESLintPluginSlice } from '../../plugins/eslint/slice';
|
|
6
|
+
import { VisionSlice } from '../../plugins/vision/slice';
|
|
7
|
+
import { SemanticPluginSlice } from '../../plugins/semantic/slice';
|
|
8
|
+
/**
|
|
9
|
+
* Options for creating a composed store instance.
|
|
10
|
+
* Allows dependency injection for testing and customization.
|
|
11
|
+
*/
|
|
12
|
+
export interface ComposedStoreOptions {
|
|
13
|
+
/** Custom WebSocket service implementation */
|
|
14
|
+
websocket?: WebSocketService;
|
|
15
|
+
/** Custom DOM observer service implementation */
|
|
16
|
+
domObserver?: DOMObserverService;
|
|
17
|
+
/** Custom plugin registry instance */
|
|
18
|
+
registry?: PluginRegistry;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Map of plugin IDs to their slice types.
|
|
22
|
+
* Extend this interface when adding new plugins.
|
|
23
|
+
*/
|
|
24
|
+
export interface PluginSliceMap {
|
|
25
|
+
eslint: ESLintPluginSlice;
|
|
26
|
+
vision: VisionSlice;
|
|
27
|
+
semantic: SemanticPluginSlice;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Type for all possible plugin slices (union of all plugin slice types).
|
|
31
|
+
*/
|
|
32
|
+
export type AnyPluginSlice = PluginSliceMap[keyof PluginSliceMap];
|
|
33
|
+
/**
|
|
34
|
+
* Namespace-prefixed plugin slices.
|
|
35
|
+
* Each plugin's state is accessible via `plugins.{pluginId}`.
|
|
36
|
+
*/
|
|
37
|
+
export interface PluginSlices {
|
|
38
|
+
plugins: {
|
|
39
|
+
[K in keyof PluginSliceMap]?: PluginSliceMap[K];
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The composed store state combines:
|
|
44
|
+
* 1. CoreSlice - Core UI state (floating icon, command palette, inspector, etc.)
|
|
45
|
+
* 2. PluginSlices - Namespaced plugin state accessible via `plugins.{pluginId}`
|
|
46
|
+
*/
|
|
47
|
+
export type ComposedState = CoreSlice & PluginSlices;
|
|
48
|
+
/**
|
|
49
|
+
* Actions for managing the composed store
|
|
50
|
+
*/
|
|
51
|
+
export interface ComposedStoreActions {
|
|
52
|
+
/**
|
|
53
|
+
* Register a plugin's slice into the store.
|
|
54
|
+
* Called when a plugin is initialized with its createSlice method.
|
|
55
|
+
*
|
|
56
|
+
* @param pluginId - The unique plugin identifier
|
|
57
|
+
* @param slice - The plugin's state slice
|
|
58
|
+
*/
|
|
59
|
+
registerPluginSlice: <K extends keyof PluginSliceMap>(pluginId: K, slice: PluginSliceMap[K]) => void;
|
|
60
|
+
/**
|
|
61
|
+
* Unregister a plugin's slice from the store.
|
|
62
|
+
* Called when a plugin is disposed.
|
|
63
|
+
*
|
|
64
|
+
* @param pluginId - The unique plugin identifier
|
|
65
|
+
*/
|
|
66
|
+
unregisterPluginSlice: (pluginId: keyof PluginSliceMap) => void;
|
|
67
|
+
/**
|
|
68
|
+
* Get a specific plugin's slice.
|
|
69
|
+
* Returns undefined if the plugin is not registered.
|
|
70
|
+
*
|
|
71
|
+
* @param pluginId - The unique plugin identifier
|
|
72
|
+
* @returns The plugin's slice or undefined
|
|
73
|
+
*/
|
|
74
|
+
getPluginSlice: <K extends keyof PluginSliceMap>(pluginId: K) => PluginSliceMap[K] | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* Update a specific plugin's slice.
|
|
77
|
+
* Merges the partial update with the existing slice.
|
|
78
|
+
*
|
|
79
|
+
* @param pluginId - The unique plugin identifier
|
|
80
|
+
* @param partial - Partial update to merge into the slice
|
|
81
|
+
*/
|
|
82
|
+
setPluginSlice: <K extends keyof PluginSliceMap>(pluginId: K, partial: Partial<PluginSliceMap[K]>) => void;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Full composed store type including state and actions
|
|
86
|
+
*/
|
|
87
|
+
export type ComposedStore = ComposedState & ComposedStoreActions;
|
|
88
|
+
/**
|
|
89
|
+
* Factory function for creating isolated store instances.
|
|
90
|
+
* Use this in tests to get fresh stores with injected dependencies.
|
|
91
|
+
*
|
|
92
|
+
* Unlike createComposedStore(), this does NOT use a singleton pattern.
|
|
93
|
+
* Each call creates a completely new, isolated store instance.
|
|
94
|
+
*
|
|
95
|
+
* @param options - Dependencies and configuration for the store
|
|
96
|
+
* @returns A new store instance (not a singleton)
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* // In tests
|
|
101
|
+
* const mockWebSocket = createMockWebSocketService();
|
|
102
|
+
* const mockDomObserver = createMockDOMObserverService();
|
|
103
|
+
* const testRegistry = createPluginRegistry();
|
|
104
|
+
*
|
|
105
|
+
* const store = createComposedStoreFactory({
|
|
106
|
+
* websocket: mockWebSocket,
|
|
107
|
+
* domObserver: mockDomObserver,
|
|
108
|
+
* registry: testRegistry,
|
|
109
|
+
* });
|
|
110
|
+
*
|
|
111
|
+
* // Each test gets its own isolated store
|
|
112
|
+
* expect(store.getState().commandPalette.open).toBe(false);
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export declare function createComposedStoreFactory(options?: ComposedStoreOptions): UseBoundStore<StoreApi<ComposedStore>>;
|
|
116
|
+
/**
|
|
117
|
+
* Create the composed store with core slice and plugin support.
|
|
118
|
+
* Uses a singleton pattern - returns the same instance if already created.
|
|
119
|
+
*
|
|
120
|
+
* For testing, use createComposedStoreFactory() instead which creates
|
|
121
|
+
* isolated instances.
|
|
122
|
+
*
|
|
123
|
+
* @param options - Optional configuration for the store
|
|
124
|
+
* @returns The singleton store instance
|
|
125
|
+
*/
|
|
126
|
+
export declare function createComposedStore(options?: ComposedStoreOptions): UseBoundStore<StoreApi<ComposedStore>>;
|
|
127
|
+
/**
|
|
128
|
+
* Hook to access the composed store.
|
|
129
|
+
* This is the primary way components should access the store.
|
|
130
|
+
*
|
|
131
|
+
* If the store hasn't been created yet, it will be created with default options.
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```tsx
|
|
135
|
+
* function MyComponent() {
|
|
136
|
+
* // Access core state
|
|
137
|
+
* const isOpen = useComposedStore((state) => state.commandPalette.open);
|
|
138
|
+
*
|
|
139
|
+
* // Access plugin state
|
|
140
|
+
* const eslintSlice = useComposedStore((state) => state.plugins.eslint);
|
|
141
|
+
*
|
|
142
|
+
* return <div>...</div>;
|
|
143
|
+
* }
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
export declare function useComposedStore(): ComposedStore;
|
|
147
|
+
export declare function useComposedStore<T>(selector: (state: ComposedStore) => T): T;
|
|
148
|
+
/**
|
|
149
|
+
* Initialize all registered plugins and merge their slices into the store.
|
|
150
|
+
* This should be called after the store is created and before rendering.
|
|
151
|
+
*
|
|
152
|
+
* @param options - Optional configuration for services and registry
|
|
153
|
+
* @returns Promise that resolves when all plugins are initialized
|
|
154
|
+
*/
|
|
155
|
+
export declare function initializePlugins(options?: ComposedStoreOptions): Promise<void>;
|
|
156
|
+
/**
|
|
157
|
+
* Get the raw store API for advanced use cases.
|
|
158
|
+
* Prefer using useComposedStore hook in React components.
|
|
159
|
+
*
|
|
160
|
+
* @returns The store API or null if not created
|
|
161
|
+
*/
|
|
162
|
+
export declare function getStoreApi(): StoreApi<ComposedStore> | null;
|
|
163
|
+
/**
|
|
164
|
+
* Get the plugin services instance.
|
|
165
|
+
* Useful for plugins that need to access services outside of React.
|
|
166
|
+
*
|
|
167
|
+
* @returns The plugin services or null if not created
|
|
168
|
+
*/
|
|
169
|
+
export declare function getPluginServices(): PluginServices | null;
|
|
170
|
+
/**
|
|
171
|
+
* Reset the store instance.
|
|
172
|
+
* Primarily useful for testing.
|
|
173
|
+
*
|
|
174
|
+
* @param options - Optional configuration to immediately create a new store with
|
|
175
|
+
* @returns The new store instance if options were provided, undefined otherwise
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* ```typescript
|
|
179
|
+
* // Simple reset
|
|
180
|
+
* resetStore();
|
|
181
|
+
*
|
|
182
|
+
* // Reset and immediately create new store with mocks
|
|
183
|
+
* const store = resetStore({
|
|
184
|
+
* websocket: mockWebSocket,
|
|
185
|
+
* domObserver: mockDomObserver,
|
|
186
|
+
* });
|
|
187
|
+
* ```
|
|
188
|
+
*/
|
|
189
|
+
export declare function resetStore(options?: ComposedStoreOptions): UseBoundStore<StoreApi<ComposedStore>> | void;
|
|
190
|
+
/**
|
|
191
|
+
* Check if a plugin slice is registered in the store.
|
|
192
|
+
*
|
|
193
|
+
* @param pluginId - The plugin ID to check
|
|
194
|
+
* @returns true if the plugin slice is registered
|
|
195
|
+
*/
|
|
196
|
+
export declare function hasPluginSlice(pluginId: string): boolean;
|
|
197
|
+
/**
|
|
198
|
+
* Get typed plugin slice with proper type inference.
|
|
199
|
+
*
|
|
200
|
+
* @param pluginId - The plugin ID
|
|
201
|
+
* @returns The plugin slice or undefined
|
|
202
|
+
*/
|
|
203
|
+
export declare function getPluginSlice<K extends keyof PluginSliceMap>(pluginId: K): PluginSliceMap[K] | undefined;
|
|
204
|
+
/**
|
|
205
|
+
* Create typed plugin services for a specific plugin.
|
|
206
|
+
* This provides getState/setState scoped to the plugin's slice.
|
|
207
|
+
*
|
|
208
|
+
* @param pluginId - The plugin ID
|
|
209
|
+
* @returns Scoped plugin services
|
|
210
|
+
*/
|
|
211
|
+
export declare function createScopedPluginServices<K extends keyof PluginSliceMap>(pluginId: K): PluginServices | null;
|
|
212
|
+
//# sourceMappingURL=composed-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composed-store.d.ts","sourceRoot":"","sources":["../../../src/core/store/composed-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { StateCreator } from 'zustand';
|
|
2
|
+
import { PluginServices } from '../plugin-system/types';
|
|
3
|
+
/**
|
|
4
|
+
* Position of the floating icon in pixel coordinates.
|
|
5
|
+
*/
|
|
6
|
+
export interface FloatingIconPosition {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Filter chip for the command palette search.
|
|
12
|
+
* Allows filtering by rule, issue, loc (source location), file, capture, or plugin.
|
|
13
|
+
*/
|
|
14
|
+
export interface CommandPaletteFilter {
|
|
15
|
+
type: "rule" | "issue" | "loc" | "file" | "capture" | "plugin";
|
|
16
|
+
value: string;
|
|
17
|
+
label: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Command palette state.
|
|
21
|
+
*/
|
|
22
|
+
export interface CommandPaletteState {
|
|
23
|
+
/** Whether the command palette is open */
|
|
24
|
+
open: boolean;
|
|
25
|
+
/** Current search query */
|
|
26
|
+
query: string;
|
|
27
|
+
/** Currently selected index for keyboard navigation */
|
|
28
|
+
selectedIndex: number;
|
|
29
|
+
/** Active filters (shown as chips) */
|
|
30
|
+
filters: CommandPaletteFilter[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Inspector sidebar state.
|
|
34
|
+
*/
|
|
35
|
+
export interface InspectorState {
|
|
36
|
+
/** Whether the inspector is open */
|
|
37
|
+
open: boolean;
|
|
38
|
+
/** Which plugin panel is currently shown (null if none) */
|
|
39
|
+
panelId: string | null;
|
|
40
|
+
/** Data passed to the panel */
|
|
41
|
+
data: Record<string, unknown> | null;
|
|
42
|
+
/** Whether inspector is docked (participates in layout) or floating */
|
|
43
|
+
docked: boolean;
|
|
44
|
+
/** Width when docked (resizable) */
|
|
45
|
+
width: number;
|
|
46
|
+
/** Position when floating */
|
|
47
|
+
floatingPosition: {
|
|
48
|
+
x: number;
|
|
49
|
+
y: number;
|
|
50
|
+
} | null;
|
|
51
|
+
/** Size when floating */
|
|
52
|
+
floatingSize: {
|
|
53
|
+
width: number;
|
|
54
|
+
height: number;
|
|
55
|
+
} | null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Core UI state slice interface.
|
|
59
|
+
* Contains state and actions for core UI functionality.
|
|
60
|
+
*/
|
|
61
|
+
export interface CoreSlice {
|
|
62
|
+
/** Floating icon position (null = default top-center) */
|
|
63
|
+
floatingIconPosition: FloatingIconPosition | null;
|
|
64
|
+
/** Set floating icon position and persist to localStorage */
|
|
65
|
+
setFloatingIconPosition: (position: FloatingIconPosition) => void;
|
|
66
|
+
/** Whether the Alt key is currently held */
|
|
67
|
+
altKeyHeld: boolean;
|
|
68
|
+
/** Set Alt key held state */
|
|
69
|
+
setAltKeyHeld: (held: boolean) => void;
|
|
70
|
+
/** Currently selected element ID */
|
|
71
|
+
selectedElementId: string | null;
|
|
72
|
+
/** Currently hovered element ID (for overlay highlighting) */
|
|
73
|
+
hoveredElementId: string | null;
|
|
74
|
+
/** Set selected element ID */
|
|
75
|
+
setSelectedElementId: (id: string | null) => void;
|
|
76
|
+
/** Set hovered element ID */
|
|
77
|
+
setHoveredElementId: (id: string | null) => void;
|
|
78
|
+
/** Command palette state */
|
|
79
|
+
commandPalette: CommandPaletteState;
|
|
80
|
+
/** Open the command palette */
|
|
81
|
+
openCommandPalette: () => void;
|
|
82
|
+
/** Close the command palette */
|
|
83
|
+
closeCommandPalette: () => void;
|
|
84
|
+
/** Set the command palette search query */
|
|
85
|
+
setCommandPaletteQuery: (query: string) => void;
|
|
86
|
+
/** Set the selected index for keyboard navigation */
|
|
87
|
+
setCommandPaletteSelectedIndex: (index: number) => void;
|
|
88
|
+
/** Add a filter to the command palette */
|
|
89
|
+
addFilter: (filter: CommandPaletteFilter) => void;
|
|
90
|
+
/** Remove a filter at the specified index */
|
|
91
|
+
removeFilter: (index: number) => void;
|
|
92
|
+
/** Clear all command palette filters */
|
|
93
|
+
clearFilters: () => void;
|
|
94
|
+
/** Inspector sidebar state */
|
|
95
|
+
inspector: InspectorState;
|
|
96
|
+
/** Open the inspector with a specific panel */
|
|
97
|
+
openInspector: (panelId: string, data?: Record<string, unknown>) => void;
|
|
98
|
+
/** Close the inspector */
|
|
99
|
+
closeInspector: () => void;
|
|
100
|
+
/** Toggle between docked and floating mode */
|
|
101
|
+
toggleInspectorDocked: () => void;
|
|
102
|
+
/** Set inspector width (docked mode) */
|
|
103
|
+
setInspectorWidth: (width: number) => void;
|
|
104
|
+
/** Set inspector position (floating mode) */
|
|
105
|
+
setInspectorFloatingPosition: (position: {
|
|
106
|
+
x: number;
|
|
107
|
+
y: number;
|
|
108
|
+
}) => void;
|
|
109
|
+
/** Set inspector size (floating mode) */
|
|
110
|
+
setInspectorFloatingSize: (size: {
|
|
111
|
+
width: number;
|
|
112
|
+
height: number;
|
|
113
|
+
}) => void;
|
|
114
|
+
/** Whether connected to the WebSocket server */
|
|
115
|
+
wsConnected: boolean;
|
|
116
|
+
/** WebSocket server URL */
|
|
117
|
+
wsUrl: string;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create the core UI state slice.
|
|
121
|
+
*
|
|
122
|
+
* @param services - Plugin services for accessing WebSocket and storage
|
|
123
|
+
* @returns StateCreator for the core slice
|
|
124
|
+
*/
|
|
125
|
+
export declare const createCoreSlice: (services: PluginServices) => StateCreator<CoreSlice>;
|
|
126
|
+
//# sourceMappingURL=core-slice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-slice.d.ts","sourceRoot":"","sources":["../../../src/core/store/core-slice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Store - UI state management
|
|
3
|
+
*/
|
|
4
|
+
export { createCoreSlice, type CoreSlice, type FloatingIconPosition, type CommandPaletteState, type CommandPaletteFilter, type InspectorState, } from './core-slice';
|
|
5
|
+
export { createComposedStore, createComposedStoreFactory, useComposedStore, initializePlugins, getStoreApi, getPluginServices, resetStore, hasPluginSlice, getPluginSlice, createScopedPluginServices, type ComposedStoreOptions, type PluginSliceMap, type AnyPluginSlice, type PluginSlices, type ComposedState, type ComposedStoreActions, type ComposedStore, } from './composed-store';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/store/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,eAAe,EACf,KAAK,SAAS,EACd,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,mBAAmB,EACnB,0BAA0B,EAC1B,gBAAgB,EAChB,iBAAiB,EAEjB,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,cAAc,EACd,0BAA0B,EAE1B,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,aAAa,GACnB,MAAM,kBAAkB,CAAC"}
|