@nocturnium/svelte-ide 1.0.0-rc.1
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/LICENSE +21 -0
- package/README.md +251 -0
- package/dist/components/agents/AgentActivityPanel.svelte +565 -0
- package/dist/components/agents/AgentActivityPanel.svelte.d.ts +24 -0
- package/dist/components/agents/AgentAvatar.svelte +417 -0
- package/dist/components/agents/AgentAvatar.svelte.d.ts +23 -0
- package/dist/components/agents/AgentCursor.svelte +224 -0
- package/dist/components/agents/AgentCursor.svelte.d.ts +35 -0
- package/dist/components/agents/AgentPresenceBar.svelte +261 -0
- package/dist/components/agents/AgentPresenceBar.svelte.d.ts +20 -0
- package/dist/components/agents/index.d.ts +4 -0
- package/dist/components/agents/index.js +5 -0
- package/dist/components/ai/AIConversationList.svelte +524 -0
- package/dist/components/ai/AIConversationList.svelte.d.ts +17 -0
- package/dist/components/ai/AIEditPreview.svelte +132 -0
- package/dist/components/ai/AIEditPreview.svelte.d.ts +8 -0
- package/dist/components/ai/AIInlineEdit.svelte +155 -0
- package/dist/components/ai/AIInlineEdit.svelte.d.ts +10 -0
- package/dist/components/ai/AIMessage.svelte +239 -0
- package/dist/components/ai/AIMessage.svelte.d.ts +13 -0
- package/dist/components/ai/AIMessageActions.svelte +176 -0
- package/dist/components/ai/AIMessageActions.svelte.d.ts +12 -0
- package/dist/components/ai/AIMessageContent.svelte +355 -0
- package/dist/components/ai/AIMessageContent.svelte.d.ts +7 -0
- package/dist/components/ai/AIPanel.svelte +561 -0
- package/dist/components/ai/AIPanel.svelte.d.ts +7 -0
- package/dist/components/ai/AISuggestionWidget.svelte +132 -0
- package/dist/components/ai/AISuggestionWidget.svelte.d.ts +10 -0
- package/dist/components/ai/AIToolCallDisplay.svelte +317 -0
- package/dist/components/ai/AIToolCallDisplay.svelte.d.ts +12 -0
- package/dist/components/ai/index.d.ts +9 -0
- package/dist/components/ai/index.js +10 -0
- package/dist/components/core/Avatar.svelte +110 -0
- package/dist/components/core/Avatar.svelte.d.ts +12 -0
- package/dist/components/core/Badge.svelte +98 -0
- package/dist/components/core/Badge.svelte.d.ts +11 -0
- package/dist/components/core/Button.svelte +175 -0
- package/dist/components/core/Button.svelte.d.ts +18 -0
- package/dist/components/core/ConnectionStatus.svelte +294 -0
- package/dist/components/core/ConnectionStatus.svelte.d.ts +20 -0
- package/dist/components/core/ContextMenu.svelte +176 -0
- package/dist/components/core/ContextMenu.svelte.d.ts +19 -0
- package/dist/components/core/ErrorBoundary.svelte +277 -0
- package/dist/components/core/ErrorBoundary.svelte.d.ts +23 -0
- package/dist/components/core/Icon.svelte +107 -0
- package/dist/components/core/Icon.svelte.d.ts +8 -0
- package/dist/components/core/Input.svelte +138 -0
- package/dist/components/core/Input.svelte.d.ts +20 -0
- package/dist/components/core/Kbd.svelte +34 -0
- package/dist/components/core/Kbd.svelte.d.ts +7 -0
- package/dist/components/core/ResizeHandle.svelte +200 -0
- package/dist/components/core/ResizeHandle.svelte.d.ts +23 -0
- package/dist/components/core/Spinner.svelte +35 -0
- package/dist/components/core/Spinner.svelte.d.ts +7 -0
- package/dist/components/core/Textarea.svelte +112 -0
- package/dist/components/core/Textarea.svelte.d.ts +18 -0
- package/dist/components/core/Tooltip.svelte +103 -0
- package/dist/components/core/Tooltip.svelte.d.ts +11 -0
- package/dist/components/core/index.d.ts +13 -0
- package/dist/components/core/index.js +14 -0
- package/dist/components/editor/AIFocusLayer.svelte +430 -0
- package/dist/components/editor/AIFocusLayer.svelte.d.ts +32 -0
- package/dist/components/editor/Breadcrumbs.svelte +435 -0
- package/dist/components/editor/Breadcrumbs.svelte.d.ts +33 -0
- package/dist/components/editor/BreakpointLayer.svelte +642 -0
- package/dist/components/editor/BreakpointLayer.svelte.d.ts +20 -0
- package/dist/components/editor/CognitiveLoadMeter.svelte +324 -0
- package/dist/components/editor/CognitiveLoadMeter.svelte.d.ts +18 -0
- package/dist/components/editor/CollaborativeEditor.svelte +218 -0
- package/dist/components/editor/CollaborativeEditor.svelte.d.ts +32 -0
- package/dist/components/editor/CommandPalette.svelte +434 -0
- package/dist/components/editor/CommandPalette.svelte.d.ts +11 -0
- package/dist/components/editor/ComplexityLayer.svelte +293 -0
- package/dist/components/editor/ComplexityLayer.svelte.d.ts +23 -0
- package/dist/components/editor/ConflictZoneLayer.svelte +441 -0
- package/dist/components/editor/ConflictZoneLayer.svelte.d.ts +25 -0
- package/dist/components/editor/ContextLens.svelte +262 -0
- package/dist/components/editor/ContextLens.svelte.d.ts +27 -0
- package/dist/components/editor/CustomEditor.svelte +1242 -0
- package/dist/components/editor/CustomEditor.svelte.d.ts +37 -0
- package/dist/components/editor/DebugConsole.svelte +646 -0
- package/dist/components/editor/DebugConsole.svelte.d.ts +41 -0
- package/dist/components/editor/EchoCursorLayer.svelte +363 -0
- package/dist/components/editor/EchoCursorLayer.svelte.d.ts +24 -0
- package/dist/components/editor/Editor.svelte +61 -0
- package/dist/components/editor/Editor.svelte.d.ts +22 -0
- package/dist/components/editor/EditorGutter.svelte +119 -0
- package/dist/components/editor/EditorGutter.svelte.d.ts +19 -0
- package/dist/components/editor/EditorLines.svelte +182 -0
- package/dist/components/editor/EditorLines.svelte.d.ts +43 -0
- package/dist/components/editor/EditorPane.svelte +134 -0
- package/dist/components/editor/EditorPane.svelte.d.ts +9 -0
- package/dist/components/editor/EditorSelections.svelte +186 -0
- package/dist/components/editor/EditorSelections.svelte.d.ts +25 -0
- package/dist/components/editor/EditorTabs.svelte +170 -0
- package/dist/components/editor/EditorTabs.svelte.d.ts +12 -0
- package/dist/components/editor/FileExplorer.svelte +811 -0
- package/dist/components/editor/FileExplorer.svelte.d.ts +67 -0
- package/dist/components/editor/FileIcon.svelte +110 -0
- package/dist/components/editor/FileIcon.svelte.d.ts +10 -0
- package/dist/components/editor/FindReplace.svelte +448 -0
- package/dist/components/editor/FindReplace.svelte.d.ts +40 -0
- package/dist/components/editor/GhostBracketLayer.svelte +391 -0
- package/dist/components/editor/GhostBracketLayer.svelte.d.ts +24 -0
- package/dist/components/editor/GitBlameLayer.svelte +436 -0
- package/dist/components/editor/GitBlameLayer.svelte.d.ts +18 -0
- package/dist/components/editor/InlineDiagnosticsLayer.svelte +540 -0
- package/dist/components/editor/InlineDiagnosticsLayer.svelte.d.ts +35 -0
- package/dist/components/editor/InlineDiffLayer.svelte +337 -0
- package/dist/components/editor/InlineDiffLayer.svelte.d.ts +31 -0
- package/dist/components/editor/MinimalEditor.svelte +75 -0
- package/dist/components/editor/MinimalEditor.svelte.d.ts +6 -0
- package/dist/components/editor/MinimalEditor2.svelte +84 -0
- package/dist/components/editor/MinimalEditor2.svelte.d.ts +6 -0
- package/dist/components/editor/Minimap.svelte +327 -0
- package/dist/components/editor/Minimap.svelte.d.ts +34 -0
- package/dist/components/editor/PluginPreviewSandbox.svelte +793 -0
- package/dist/components/editor/PluginPreviewSandbox.svelte.d.ts +49 -0
- package/dist/components/editor/ProblemsPanel.svelte +628 -0
- package/dist/components/editor/ProblemsPanel.svelte.d.ts +25 -0
- package/dist/components/editor/QuickActionsMenu.svelte +403 -0
- package/dist/components/editor/QuickActionsMenu.svelte.d.ts +18 -0
- package/dist/components/editor/SnippetPalette.svelte +530 -0
- package/dist/components/editor/SnippetPalette.svelte.d.ts +16 -0
- package/dist/components/editor/StructureMap.svelte +431 -0
- package/dist/components/editor/StructureMap.svelte.d.ts +37 -0
- package/dist/components/editor/SymbolOutline.svelte +722 -0
- package/dist/components/editor/SymbolOutline.svelte.d.ts +44 -0
- package/dist/components/editor/TimelineScrubber.svelte +470 -0
- package/dist/components/editor/TimelineScrubber.svelte.d.ts +40 -0
- package/dist/components/editor/TokenRenderer.svelte +69 -0
- package/dist/components/editor/TokenRenderer.svelte.d.ts +15 -0
- package/dist/components/editor/constants.d.ts +32 -0
- package/dist/components/editor/constants.js +36 -0
- package/dist/components/editor/core/ai-awareness.d.ts +176 -0
- package/dist/components/editor/core/ai-awareness.js +210 -0
- package/dist/components/editor/core/bracket-healer.d.ts +189 -0
- package/dist/components/editor/core/bracket-healer.js +406 -0
- package/dist/components/editor/core/breakpoints.d.ts +203 -0
- package/dist/components/editor/core/breakpoints.js +414 -0
- package/dist/components/editor/core/commands.d.ts +108 -0
- package/dist/components/editor/core/commands.js +246 -0
- package/dist/components/editor/core/complexity-analyzer.d.ts +123 -0
- package/dist/components/editor/core/complexity-analyzer.js +376 -0
- package/dist/components/editor/core/conflict-predictor.d.ts +135 -0
- package/dist/components/editor/core/conflict-predictor.js +316 -0
- package/dist/components/editor/core/crdt-binding.d.ts +118 -0
- package/dist/components/editor/core/crdt-binding.js +286 -0
- package/dist/components/editor/core/diagnostics.d.ts +210 -0
- package/dist/components/editor/core/diagnostics.js +335 -0
- package/dist/components/editor/core/echo-cursor.d.ts +201 -0
- package/dist/components/editor/core/echo-cursor.js +267 -0
- package/dist/components/editor/core/folding.d.ts +124 -0
- package/dist/components/editor/core/folding.js +672 -0
- package/dist/components/editor/core/ghost-pair.d.ts +122 -0
- package/dist/components/editor/core/ghost-pair.js +221 -0
- package/dist/components/editor/core/git-blame.d.ts +170 -0
- package/dist/components/editor/core/git-blame.js +324 -0
- package/dist/components/editor/core/index.d.ts +26 -0
- package/dist/components/editor/core/index.js +24 -0
- package/dist/components/editor/core/keybindings.d.ts +79 -0
- package/dist/components/editor/core/keybindings.js +357 -0
- package/dist/components/editor/core/multi-cursor.d.ts +196 -0
- package/dist/components/editor/core/multi-cursor.js +521 -0
- package/dist/components/editor/core/navigation.d.ts +107 -0
- package/dist/components/editor/core/navigation.js +408 -0
- package/dist/components/editor/core/quick-actions.d.ts +189 -0
- package/dist/components/editor/core/quick-actions.js +427 -0
- package/dist/components/editor/core/search.d.ts +88 -0
- package/dist/components/editor/core/search.js +192 -0
- package/dist/components/editor/core/semantic-analyzer.d.ts +77 -0
- package/dist/components/editor/core/semantic-analyzer.js +424 -0
- package/dist/components/editor/core/snippet-manager.d.ts +202 -0
- package/dist/components/editor/core/snippet-manager.js +565 -0
- package/dist/components/editor/core/state.d.ts +367 -0
- package/dist/components/editor/core/state.js +900 -0
- package/dist/components/editor/core/timeline.d.ts +204 -0
- package/dist/components/editor/core/timeline.js +349 -0
- package/dist/components/editor/editor-find.d.ts +56 -0
- package/dist/components/editor/editor-find.js +148 -0
- package/dist/components/editor/editor-input.d.ts +77 -0
- package/dist/components/editor/editor-input.js +445 -0
- package/dist/components/editor/editor-multicursor.d.ts +21 -0
- package/dist/components/editor/editor-multicursor.js +196 -0
- package/dist/components/editor/editor-scroll.d.ts +14 -0
- package/dist/components/editor/editor-scroll.js +34 -0
- package/dist/components/editor/index.d.ts +15 -0
- package/dist/components/editor/index.js +21 -0
- package/dist/components/editor/languages.d.ts +62 -0
- package/dist/components/editor/languages.js +285 -0
- package/dist/components/editor/theme.d.ts +88 -0
- package/dist/components/editor/theme.js +139 -0
- package/dist/components/editor/tokenizer/base.d.ts +40 -0
- package/dist/components/editor/tokenizer/base.js +203 -0
- package/dist/components/editor/tokenizer/index.d.ts +56 -0
- package/dist/components/editor/tokenizer/index.js +215 -0
- package/dist/components/editor/tokenizer/languages/css.d.ts +17 -0
- package/dist/components/editor/tokenizer/languages/css.js +194 -0
- package/dist/components/editor/tokenizer/languages/go.d.ts +17 -0
- package/dist/components/editor/tokenizer/languages/go.js +220 -0
- package/dist/components/editor/tokenizer/languages/html.d.ts +24 -0
- package/dist/components/editor/tokenizer/languages/html.js +145 -0
- package/dist/components/editor/tokenizer/languages/javascript.d.ts +56 -0
- package/dist/components/editor/tokenizer/languages/javascript.js +452 -0
- package/dist/components/editor/tokenizer/languages/json.d.ts +12 -0
- package/dist/components/editor/tokenizer/languages/json.js +91 -0
- package/dist/components/editor/tokenizer/languages/markdown.d.ts +16 -0
- package/dist/components/editor/tokenizer/languages/markdown.js +156 -0
- package/dist/components/editor/tokenizer/languages/python.d.ts +20 -0
- package/dist/components/editor/tokenizer/languages/python.js +227 -0
- package/dist/components/editor/tokenizer/languages/svelte.d.ts +40 -0
- package/dist/components/editor/tokenizer/languages/svelte.js +326 -0
- package/dist/components/editor/tokenizer/types.d.ts +86 -0
- package/dist/components/editor/tokenizer/types.js +4 -0
- package/dist/components/layout/IDELayout.svelte +274 -0
- package/dist/components/layout/IDELayout.svelte.d.ts +29 -0
- package/dist/components/layout/StatusBar.svelte +511 -0
- package/dist/components/layout/StatusBar.svelte.d.ts +47 -0
- package/dist/components/layout/index.d.ts +2 -0
- package/dist/components/layout/index.js +3 -0
- package/dist/components/lsp/AutocompleteWidget.svelte +364 -0
- package/dist/components/lsp/AutocompleteWidget.svelte.d.ts +33 -0
- package/dist/components/lsp/DiagnosticMarker.svelte +166 -0
- package/dist/components/lsp/DiagnosticMarker.svelte.d.ts +19 -0
- package/dist/components/lsp/DiagnosticsPanel.svelte +388 -0
- package/dist/components/lsp/DiagnosticsPanel.svelte.d.ts +21 -0
- package/dist/components/lsp/HoverTooltip.svelte +274 -0
- package/dist/components/lsp/HoverTooltip.svelte.d.ts +24 -0
- package/dist/components/lsp/LSPEditor.svelte +486 -0
- package/dist/components/lsp/LSPEditor.svelte.d.ts +39 -0
- package/dist/components/lsp/SignatureHelpWidget.svelte +216 -0
- package/dist/components/lsp/SignatureHelpWidget.svelte.d.ts +22 -0
- package/dist/components/lsp/index.d.ts +6 -0
- package/dist/components/lsp/index.js +7 -0
- package/dist/components/plugins/PluginCard.svelte +153 -0
- package/dist/components/plugins/PluginCard.svelte.d.ts +19 -0
- package/dist/components/plugins/PluginPanel.svelte +280 -0
- package/dist/components/plugins/PluginPanel.svelte.d.ts +8 -0
- package/dist/components/plugins/PluginProposalForm.svelte +250 -0
- package/dist/components/plugins/PluginProposalForm.svelte.d.ts +6 -0
- package/dist/components/plugins/PluginStatusBadge.svelte +14 -0
- package/dist/components/plugins/PluginStatusBadge.svelte.d.ts +8 -0
- package/dist/components/plugins/index.d.ts +4 -0
- package/dist/components/plugins/index.js +5 -0
- package/dist/components/vfs/LockConflictDialog.svelte +705 -0
- package/dist/components/vfs/LockConflictDialog.svelte.d.ts +21 -0
- package/dist/components/vfs/LockIndicator.svelte +194 -0
- package/dist/components/vfs/LockIndicator.svelte.d.ts +29 -0
- package/dist/components/vfs/LockOverlay.svelte +344 -0
- package/dist/components/vfs/LockOverlay.svelte.d.ts +17 -0
- package/dist/components/vfs/VersionConflictDialog.svelte +549 -0
- package/dist/components/vfs/VersionConflictDialog.svelte.d.ts +24 -0
- package/dist/components/vfs/index.d.ts +4 -0
- package/dist/components/vfs/index.js +5 -0
- package/dist/crdt/awareness.d.ts +42 -0
- package/dist/crdt/awareness.js +109 -0
- package/dist/crdt/document.d.ts +101 -0
- package/dist/crdt/document.js +187 -0
- package/dist/crdt/index.d.ts +9 -0
- package/dist/crdt/index.js +8 -0
- package/dist/crdt/provider.d.ts +85 -0
- package/dist/crdt/provider.js +150 -0
- package/dist/crdt/types.d.ts +61 -0
- package/dist/crdt/types.js +4 -0
- package/dist/crdt/undo.d.ts +34 -0
- package/dist/crdt/undo.js +70 -0
- package/dist/index.d.ts +277 -0
- package/dist/index.js +280 -0
- package/dist/plugins/index.d.ts +103 -0
- package/dist/plugins/index.js +153 -0
- package/dist/services/error-handling.d.ts +95 -0
- package/dist/services/error-handling.js +413 -0
- package/dist/services/ide-integration.d.ts +83 -0
- package/dist/services/ide-integration.js +367 -0
- package/dist/services/lsp-client.d.ts +69 -0
- package/dist/services/lsp-client.js +667 -0
- package/dist/services/mock-ai.d.ts +37 -0
- package/dist/services/mock-ai.js +318 -0
- package/dist/services/optimistic.d.ts +141 -0
- package/dist/services/optimistic.js +367 -0
- package/dist/services/vfs-client.d.ts +81 -0
- package/dist/services/vfs-client.js +348 -0
- package/dist/stores/agents.svelte.d.ts +85 -0
- package/dist/stores/agents.svelte.js +459 -0
- package/dist/stores/ai-persistence.svelte.d.ts +76 -0
- package/dist/stores/ai-persistence.svelte.js +334 -0
- package/dist/stores/ai.svelte.d.ts +140 -0
- package/dist/stores/ai.svelte.js +383 -0
- package/dist/stores/collaboration.svelte.d.ts +164 -0
- package/dist/stores/collaboration.svelte.js +334 -0
- package/dist/stores/editor.svelte.d.ts +131 -0
- package/dist/stores/editor.svelte.js +250 -0
- package/dist/stores/index.d.ts +10 -0
- package/dist/stores/index.js +29 -0
- package/dist/stores/layout.svelte.d.ts +171 -0
- package/dist/stores/layout.svelte.js +351 -0
- package/dist/stores/plugin.svelte.d.ts +121 -0
- package/dist/stores/plugin.svelte.js +410 -0
- package/dist/stores/vfs.svelte.d.ts +123 -0
- package/dist/stores/vfs.svelte.js +680 -0
- package/dist/styles/theme.css +623 -0
- package/dist/types/agents.d.ts +127 -0
- package/dist/types/agents.js +5 -0
- package/dist/types/ai.d.ts +137 -0
- package/dist/types/ai.js +4 -0
- package/dist/types/crdt.d.ts +222 -0
- package/dist/types/crdt.js +5 -0
- package/dist/types/editor.d.ts +52 -0
- package/dist/types/editor.js +18 -0
- package/dist/types/events.d.ts +133 -0
- package/dist/types/events.js +4 -0
- package/dist/types/filesystem.d.ts +77 -0
- package/dist/types/filesystem.js +4 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.js +12 -0
- package/dist/types/lsp.d.ts +691 -0
- package/dist/types/lsp.js +108 -0
- package/dist/types/plugin.d.ts +239 -0
- package/dist/types/plugin.js +5 -0
- package/dist/types/vfs.d.ts +191 -0
- package/dist/types/vfs.js +18 -0
- package/dist/utils/format.d.ts +55 -0
- package/dist/utils/format.js +152 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/keybindings.d.ts +33 -0
- package/dist/utils/keybindings.js +171 -0
- package/dist/utils/language.d.ts +27 -0
- package/dist/utils/language.js +222 -0
- package/package.json +178 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bracket Healer
|
|
3
|
+
*
|
|
4
|
+
* Intelligent bracket completion and morphing system.
|
|
5
|
+
* Detects mismatched brackets and suggests "ghost brackets"
|
|
6
|
+
* to heal document structure.
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_PAIRS = [
|
|
9
|
+
{ open: '(', close: ')' },
|
|
10
|
+
{ open: '[', close: ']' },
|
|
11
|
+
{ open: '{', close: '}' },
|
|
12
|
+
{ open: '<', close: '>', language: ['html', 'xml', 'jsx', 'tsx', 'svelte', 'vue'] }
|
|
13
|
+
];
|
|
14
|
+
const DEFAULT_CONFIG = {
|
|
15
|
+
pairs: DEFAULT_PAIRS,
|
|
16
|
+
minConfidence: 0.5,
|
|
17
|
+
maxGhosts: 5,
|
|
18
|
+
debounceMs: 150
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Bracket Healer Manager
|
|
22
|
+
*/
|
|
23
|
+
export class BracketHealer {
|
|
24
|
+
config;
|
|
25
|
+
state;
|
|
26
|
+
language = 'javascript';
|
|
27
|
+
debounceTimer = null;
|
|
28
|
+
listeners = new Set();
|
|
29
|
+
constructor(config = {}) {
|
|
30
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
31
|
+
this.state = {
|
|
32
|
+
matches: [],
|
|
33
|
+
ghosts: [],
|
|
34
|
+
mismatches: [],
|
|
35
|
+
enabled: true
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Set current language
|
|
40
|
+
*/
|
|
41
|
+
setLanguage(language) {
|
|
42
|
+
this.language = language;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Enable/disable healing
|
|
46
|
+
*/
|
|
47
|
+
setEnabled(enabled) {
|
|
48
|
+
this.state.enabled = enabled;
|
|
49
|
+
if (!enabled) {
|
|
50
|
+
this.state = { ...this.state, matches: [], ghosts: [], mismatches: [] };
|
|
51
|
+
}
|
|
52
|
+
this.notify();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Analyze document content
|
|
56
|
+
*/
|
|
57
|
+
analyze(content) {
|
|
58
|
+
if (!this.state.enabled)
|
|
59
|
+
return;
|
|
60
|
+
if (this.debounceTimer) {
|
|
61
|
+
clearTimeout(this.debounceTimer);
|
|
62
|
+
}
|
|
63
|
+
this.debounceTimer = setTimeout(() => {
|
|
64
|
+
this.performAnalysis(content);
|
|
65
|
+
}, this.config.debounceMs);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Analyze immediately (no debounce)
|
|
69
|
+
*/
|
|
70
|
+
analyzeImmediate(content) {
|
|
71
|
+
if (!this.state.enabled)
|
|
72
|
+
return;
|
|
73
|
+
this.performAnalysis(content);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Perform bracket analysis
|
|
77
|
+
*/
|
|
78
|
+
performAnalysis(content) {
|
|
79
|
+
const lines = content.split('\n');
|
|
80
|
+
const tokens = this.extractBrackets(lines);
|
|
81
|
+
const { matches, mismatches } = this.matchBrackets(tokens);
|
|
82
|
+
const ghosts = this.generateGhosts(matches, mismatches, lines);
|
|
83
|
+
this.state = {
|
|
84
|
+
...this.state,
|
|
85
|
+
matches,
|
|
86
|
+
mismatches,
|
|
87
|
+
ghosts: ghosts.slice(0, this.config.maxGhosts)
|
|
88
|
+
};
|
|
89
|
+
this.notify();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Extract all brackets from content
|
|
93
|
+
*/
|
|
94
|
+
extractBrackets(lines) {
|
|
95
|
+
const tokens = [];
|
|
96
|
+
const activePairs = this.getActivePairs();
|
|
97
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
98
|
+
const line = lines[lineNum];
|
|
99
|
+
let inString = false;
|
|
100
|
+
let stringChar = '';
|
|
101
|
+
let inComment = false;
|
|
102
|
+
for (let col = 0; col < line.length; col++) {
|
|
103
|
+
const char = line[col];
|
|
104
|
+
const prevChar = col > 0 ? line[col - 1] : '';
|
|
105
|
+
// Skip escaped characters
|
|
106
|
+
if (prevChar === '\\')
|
|
107
|
+
continue;
|
|
108
|
+
// Track string state
|
|
109
|
+
if (!inComment && (char === '"' || char === "'" || char === '`')) {
|
|
110
|
+
if (!inString) {
|
|
111
|
+
inString = true;
|
|
112
|
+
stringChar = char;
|
|
113
|
+
}
|
|
114
|
+
else if (char === stringChar) {
|
|
115
|
+
inString = false;
|
|
116
|
+
}
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
// Track comments (basic detection)
|
|
120
|
+
if (!inString && char === '/' && line[col + 1] === '/') {
|
|
121
|
+
break; // Rest of line is comment
|
|
122
|
+
}
|
|
123
|
+
if (inString || inComment)
|
|
124
|
+
continue;
|
|
125
|
+
// Check for bracket
|
|
126
|
+
for (const pair of activePairs) {
|
|
127
|
+
if (char === pair.open) {
|
|
128
|
+
tokens.push({
|
|
129
|
+
char,
|
|
130
|
+
position: { line: lineNum, column: col },
|
|
131
|
+
isOpen: true,
|
|
132
|
+
pair
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
else if (char === pair.close) {
|
|
136
|
+
tokens.push({
|
|
137
|
+
char,
|
|
138
|
+
position: { line: lineNum, column: col },
|
|
139
|
+
isOpen: false,
|
|
140
|
+
pair
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return tokens;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get bracket pairs active for current language
|
|
150
|
+
*/
|
|
151
|
+
getActivePairs() {
|
|
152
|
+
return this.config.pairs.filter((pair) => {
|
|
153
|
+
if (!pair.language)
|
|
154
|
+
return true;
|
|
155
|
+
return pair.language.includes(this.language);
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Match brackets and find mismatches
|
|
160
|
+
*/
|
|
161
|
+
matchBrackets(tokens) {
|
|
162
|
+
const matches = [];
|
|
163
|
+
const mismatches = [];
|
|
164
|
+
const stack = [];
|
|
165
|
+
let depth = 0;
|
|
166
|
+
for (const token of tokens) {
|
|
167
|
+
if (token.isOpen) {
|
|
168
|
+
stack.push({ token, depth });
|
|
169
|
+
depth++;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
// Look for matching open bracket
|
|
173
|
+
let matched = false;
|
|
174
|
+
for (let i = stack.length - 1; i >= 0; i--) {
|
|
175
|
+
const openEntry = stack[i];
|
|
176
|
+
if (openEntry.token.pair.close === token.char) {
|
|
177
|
+
// Found match
|
|
178
|
+
matches.push({
|
|
179
|
+
openPos: openEntry.token.position,
|
|
180
|
+
closePos: token.position,
|
|
181
|
+
type: openEntry.token.pair,
|
|
182
|
+
isComplete: true,
|
|
183
|
+
depth: openEntry.depth
|
|
184
|
+
});
|
|
185
|
+
stack.splice(i, 1);
|
|
186
|
+
matched = true;
|
|
187
|
+
depth = Math.max(0, depth - 1);
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (!matched) {
|
|
192
|
+
// Unexpected closing bracket
|
|
193
|
+
if (stack.length > 0) {
|
|
194
|
+
const lastOpen = stack[stack.length - 1].token;
|
|
195
|
+
mismatches.push({
|
|
196
|
+
position: token.position,
|
|
197
|
+
character: token.char,
|
|
198
|
+
expected: lastOpen.pair.close,
|
|
199
|
+
issue: 'mismatched',
|
|
200
|
+
severity: 'error'
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
mismatches.push({
|
|
205
|
+
position: token.position,
|
|
206
|
+
character: token.char,
|
|
207
|
+
issue: 'unexpected',
|
|
208
|
+
severity: 'error'
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Remaining stack items are unclosed
|
|
215
|
+
for (const entry of stack) {
|
|
216
|
+
matches.push({
|
|
217
|
+
openPos: entry.token.position,
|
|
218
|
+
closePos: null,
|
|
219
|
+
type: entry.token.pair,
|
|
220
|
+
isComplete: false,
|
|
221
|
+
depth: entry.depth
|
|
222
|
+
});
|
|
223
|
+
mismatches.push({
|
|
224
|
+
position: entry.token.position,
|
|
225
|
+
character: entry.token.char,
|
|
226
|
+
issue: 'unclosed',
|
|
227
|
+
severity: 'warning'
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
return { matches, mismatches };
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Generate ghost bracket suggestions
|
|
234
|
+
*/
|
|
235
|
+
generateGhosts(matches, mismatches, lines) {
|
|
236
|
+
const ghosts = [];
|
|
237
|
+
const dismissedIds = new Set(this.state.ghosts.filter((g) => g.dismissed).map((g) => g.id));
|
|
238
|
+
for (const match of matches) {
|
|
239
|
+
if (!match.isComplete) {
|
|
240
|
+
// Suggest closing bracket
|
|
241
|
+
const ghost = this.suggestClosingBracket(match, lines);
|
|
242
|
+
if (ghost && ghost.confidence >= this.config.minConfidence) {
|
|
243
|
+
ghost.dismissed = dismissedIds.has(ghost.id);
|
|
244
|
+
ghosts.push(ghost);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Sort by confidence
|
|
249
|
+
ghosts.sort((a, b) => b.confidence - a.confidence);
|
|
250
|
+
return ghosts;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Suggest where to place a closing bracket
|
|
254
|
+
*/
|
|
255
|
+
suggestClosingBracket(match, lines) {
|
|
256
|
+
const openLine = lines[match.openPos.line];
|
|
257
|
+
let suggestedLine = match.openPos.line;
|
|
258
|
+
let suggestedCol = openLine.length;
|
|
259
|
+
let confidence = 0.6;
|
|
260
|
+
let reason = 'End of line containing opening bracket';
|
|
261
|
+
// Heuristics for better placement
|
|
262
|
+
// 1. If it's a function/block, find matching indentation
|
|
263
|
+
const openIndent = this.getIndentation(openLine);
|
|
264
|
+
for (let i = match.openPos.line + 1; i < lines.length; i++) {
|
|
265
|
+
const line = lines[i];
|
|
266
|
+
const trimmed = line.trim();
|
|
267
|
+
if (trimmed === '')
|
|
268
|
+
continue;
|
|
269
|
+
const indent = this.getIndentation(line);
|
|
270
|
+
// Found a line with same or less indentation
|
|
271
|
+
if (indent <= openIndent && trimmed.length > 0) {
|
|
272
|
+
// Place before this line
|
|
273
|
+
suggestedLine = i - 1;
|
|
274
|
+
suggestedCol = lines[suggestedLine].length;
|
|
275
|
+
confidence = 0.8;
|
|
276
|
+
reason = 'Before dedented line';
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
// Found potential end marker (return, }, etc.)
|
|
280
|
+
if (indent === openIndent && /^(return|break|continue|\})/.test(trimmed)) {
|
|
281
|
+
suggestedLine = i - 1;
|
|
282
|
+
suggestedCol = lines[suggestedLine].length;
|
|
283
|
+
confidence = 0.85;
|
|
284
|
+
reason = 'Before control flow statement';
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// 2. For simple brackets on same line, suggest end of line
|
|
289
|
+
if (match.openPos.line === suggestedLine) {
|
|
290
|
+
confidence = 0.9;
|
|
291
|
+
reason = 'Same line completion';
|
|
292
|
+
}
|
|
293
|
+
const id = `ghost-${match.openPos.line}-${match.openPos.column}-${match.type.close}`;
|
|
294
|
+
return {
|
|
295
|
+
id,
|
|
296
|
+
position: { line: suggestedLine, column: suggestedCol },
|
|
297
|
+
character: match.type.close,
|
|
298
|
+
type: 'close',
|
|
299
|
+
matchPosition: match.openPos,
|
|
300
|
+
confidence,
|
|
301
|
+
reason,
|
|
302
|
+
dismissed: false
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Get line indentation level
|
|
307
|
+
*/
|
|
308
|
+
getIndentation(line) {
|
|
309
|
+
const match = line.match(/^(\s*)/);
|
|
310
|
+
return match ? match[1].length : 0;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Accept a ghost bracket suggestion
|
|
314
|
+
*/
|
|
315
|
+
acceptGhost(id) {
|
|
316
|
+
const ghost = this.state.ghosts.find((g) => g.id === id);
|
|
317
|
+
if (ghost) {
|
|
318
|
+
// Remove from suggestions
|
|
319
|
+
this.state.ghosts = this.state.ghosts.filter((g) => g.id !== id);
|
|
320
|
+
this.notify();
|
|
321
|
+
}
|
|
322
|
+
return ghost ?? null;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Dismiss a ghost bracket suggestion
|
|
326
|
+
*/
|
|
327
|
+
dismissGhost(id) {
|
|
328
|
+
const ghost = this.state.ghosts.find((g) => g.id === id);
|
|
329
|
+
if (ghost) {
|
|
330
|
+
ghost.dismissed = true;
|
|
331
|
+
this.notify();
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Get current state
|
|
336
|
+
*/
|
|
337
|
+
getState() {
|
|
338
|
+
return { ...this.state };
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Get ghost brackets (non-dismissed only)
|
|
342
|
+
*/
|
|
343
|
+
getActiveGhosts() {
|
|
344
|
+
return this.state.ghosts.filter((g) => !g.dismissed);
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Get mismatches
|
|
348
|
+
*/
|
|
349
|
+
getMismatches() {
|
|
350
|
+
return [...this.state.mismatches];
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Find matching bracket for position
|
|
354
|
+
*/
|
|
355
|
+
findMatchingBracket(position) {
|
|
356
|
+
for (const match of this.state.matches) {
|
|
357
|
+
if (match.openPos.line === position.line &&
|
|
358
|
+
match.openPos.column === position.column &&
|
|
359
|
+
match.closePos) {
|
|
360
|
+
return match.closePos;
|
|
361
|
+
}
|
|
362
|
+
if (match.closePos &&
|
|
363
|
+
match.closePos.line === position.line &&
|
|
364
|
+
match.closePos.column === position.column) {
|
|
365
|
+
return match.openPos;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return null;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Subscribe to state changes
|
|
372
|
+
*/
|
|
373
|
+
subscribe(listener) {
|
|
374
|
+
this.listeners.add(listener);
|
|
375
|
+
return () => this.listeners.delete(listener);
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Notify listeners
|
|
379
|
+
*/
|
|
380
|
+
notify() {
|
|
381
|
+
const state = this.getState();
|
|
382
|
+
for (const listener of this.listeners) {
|
|
383
|
+
try {
|
|
384
|
+
listener(state);
|
|
385
|
+
}
|
|
386
|
+
catch (e) {
|
|
387
|
+
console.error('[BracketHealer] Listener error:', e);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Destroy and cleanup
|
|
393
|
+
*/
|
|
394
|
+
destroy() {
|
|
395
|
+
if (this.debounceTimer) {
|
|
396
|
+
clearTimeout(this.debounceTimer);
|
|
397
|
+
}
|
|
398
|
+
this.listeners.clear();
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Create a bracket healer instance
|
|
403
|
+
*/
|
|
404
|
+
export function createBracketHealer(config) {
|
|
405
|
+
return new BracketHealer(config);
|
|
406
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Breakpoint Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages debugging breakpoints including:
|
|
5
|
+
* - Line breakpoints
|
|
6
|
+
* - Conditional breakpoints
|
|
7
|
+
* - Logpoints
|
|
8
|
+
* - Hit counts
|
|
9
|
+
* - Exception breakpoints
|
|
10
|
+
*/
|
|
11
|
+
export interface Position {
|
|
12
|
+
line: number;
|
|
13
|
+
column?: number;
|
|
14
|
+
}
|
|
15
|
+
export type BreakpointType = 'line' | 'conditional' | 'logpoint' | 'function' | 'exception';
|
|
16
|
+
export type BreakpointState = 'enabled' | 'disabled' | 'pending' | 'invalid';
|
|
17
|
+
export interface Breakpoint {
|
|
18
|
+
/** Unique identifier */
|
|
19
|
+
id: string;
|
|
20
|
+
/** File path */
|
|
21
|
+
filePath: string;
|
|
22
|
+
/** Line number (0-based) */
|
|
23
|
+
line: number;
|
|
24
|
+
/** Column (optional, for inline breakpoints) */
|
|
25
|
+
column?: number;
|
|
26
|
+
/** Breakpoint type */
|
|
27
|
+
type: BreakpointType;
|
|
28
|
+
/** Current state */
|
|
29
|
+
state: BreakpointState;
|
|
30
|
+
/** Condition expression (for conditional breakpoints) */
|
|
31
|
+
condition?: string;
|
|
32
|
+
/** Log message (for logpoints) */
|
|
33
|
+
logMessage?: string;
|
|
34
|
+
/** Hit count condition (e.g., ">= 5", "% 3 == 0") */
|
|
35
|
+
hitCondition?: string;
|
|
36
|
+
/** Current hit count */
|
|
37
|
+
hitCount: number;
|
|
38
|
+
/** Whether breakpoint is verified by debugger */
|
|
39
|
+
verified: boolean;
|
|
40
|
+
/** Error message if invalid */
|
|
41
|
+
errorMessage?: string;
|
|
42
|
+
/** Function name (for function breakpoints) */
|
|
43
|
+
functionName?: string;
|
|
44
|
+
/** Exception types (for exception breakpoints) */
|
|
45
|
+
exceptionTypes?: string[];
|
|
46
|
+
/** Timestamp when created */
|
|
47
|
+
createdAt: Date;
|
|
48
|
+
}
|
|
49
|
+
export interface BreakpointsConfig {
|
|
50
|
+
/** Whether breakpoints are enabled globally */
|
|
51
|
+
enabled: boolean;
|
|
52
|
+
/** Show breakpoint gutter */
|
|
53
|
+
showGutter: boolean;
|
|
54
|
+
/** Allow conditional breakpoints */
|
|
55
|
+
allowConditional: boolean;
|
|
56
|
+
/** Allow logpoints */
|
|
57
|
+
allowLogpoints: boolean;
|
|
58
|
+
/** Maximum breakpoints per file */
|
|
59
|
+
maxPerFile: number;
|
|
60
|
+
}
|
|
61
|
+
type Listener = () => void;
|
|
62
|
+
/**
|
|
63
|
+
* Breakpoint Manager
|
|
64
|
+
*/
|
|
65
|
+
export declare class BreakpointManager {
|
|
66
|
+
private _config;
|
|
67
|
+
private _breakpoints;
|
|
68
|
+
private _listeners;
|
|
69
|
+
private _idCounter;
|
|
70
|
+
/**
|
|
71
|
+
* Add a breakpoint
|
|
72
|
+
*/
|
|
73
|
+
addBreakpoint(filePath: string, line: number, options?: Partial<Omit<Breakpoint, 'id' | 'filePath' | 'line' | 'hitCount' | 'verified' | 'createdAt'>>): Breakpoint;
|
|
74
|
+
/**
|
|
75
|
+
* Remove a breakpoint
|
|
76
|
+
*/
|
|
77
|
+
removeBreakpoint(id: string): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Toggle breakpoint at line (add if not exists, remove if exists)
|
|
80
|
+
*/
|
|
81
|
+
toggleBreakpoint(filePath: string, line: number): Breakpoint | null;
|
|
82
|
+
/**
|
|
83
|
+
* Update a breakpoint
|
|
84
|
+
*/
|
|
85
|
+
updateBreakpoint(id: string, updates: Partial<Omit<Breakpoint, 'id' | 'createdAt'>>): Breakpoint | null;
|
|
86
|
+
/**
|
|
87
|
+
* Enable a breakpoint
|
|
88
|
+
*/
|
|
89
|
+
enableBreakpoint(id: string): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Disable a breakpoint
|
|
92
|
+
*/
|
|
93
|
+
disableBreakpoint(id: string): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Toggle breakpoint enabled state
|
|
96
|
+
*/
|
|
97
|
+
toggleBreakpointEnabled(id: string): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Get breakpoint by ID
|
|
100
|
+
*/
|
|
101
|
+
getBreakpoint(id: string): Breakpoint | undefined;
|
|
102
|
+
/**
|
|
103
|
+
* Get breakpoint at specific line
|
|
104
|
+
*/
|
|
105
|
+
getBreakpointAtLine(filePath: string, line: number): Breakpoint | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* Get all breakpoints for a file
|
|
108
|
+
*/
|
|
109
|
+
getBreakpointsForFile(filePath: string): Breakpoint[];
|
|
110
|
+
/**
|
|
111
|
+
* Get all breakpoints
|
|
112
|
+
*/
|
|
113
|
+
getAllBreakpoints(): Breakpoint[];
|
|
114
|
+
/**
|
|
115
|
+
* Get breakpoints grouped by file
|
|
116
|
+
*/
|
|
117
|
+
getBreakpointsByFile(): Map<string, Breakpoint[]>;
|
|
118
|
+
/**
|
|
119
|
+
* Clear all breakpoints for a file
|
|
120
|
+
*/
|
|
121
|
+
clearFileBreakpoints(filePath: string): number;
|
|
122
|
+
/**
|
|
123
|
+
* Clear all breakpoints
|
|
124
|
+
*/
|
|
125
|
+
clearAllBreakpoints(): number;
|
|
126
|
+
/**
|
|
127
|
+
* Enable all breakpoints
|
|
128
|
+
*/
|
|
129
|
+
enableAllBreakpoints(): void;
|
|
130
|
+
/**
|
|
131
|
+
* Disable all breakpoints
|
|
132
|
+
*/
|
|
133
|
+
disableAllBreakpoints(): void;
|
|
134
|
+
/**
|
|
135
|
+
* Mark breakpoint as verified by debugger
|
|
136
|
+
*/
|
|
137
|
+
verifyBreakpoint(id: string, verified: boolean, errorMessage?: string): void;
|
|
138
|
+
/**
|
|
139
|
+
* Increment hit count for breakpoint
|
|
140
|
+
*/
|
|
141
|
+
incrementHitCount(id: string): number;
|
|
142
|
+
/**
|
|
143
|
+
* Reset hit counts for all breakpoints
|
|
144
|
+
*/
|
|
145
|
+
resetHitCounts(): void;
|
|
146
|
+
/**
|
|
147
|
+
* Check if breakpoint should trigger based on conditions
|
|
148
|
+
*/
|
|
149
|
+
shouldBreakpointTrigger(id: string): boolean;
|
|
150
|
+
/**
|
|
151
|
+
* Get count
|
|
152
|
+
*/
|
|
153
|
+
getCount(filePath?: string): number;
|
|
154
|
+
/**
|
|
155
|
+
* Get config
|
|
156
|
+
*/
|
|
157
|
+
get config(): BreakpointsConfig;
|
|
158
|
+
/**
|
|
159
|
+
* Update config
|
|
160
|
+
*/
|
|
161
|
+
setConfig(config: Partial<BreakpointsConfig>): void;
|
|
162
|
+
/**
|
|
163
|
+
* Enable/disable globally
|
|
164
|
+
*/
|
|
165
|
+
setEnabled(enabled: boolean): void;
|
|
166
|
+
/**
|
|
167
|
+
* Check if enabled
|
|
168
|
+
*/
|
|
169
|
+
isEnabled(): boolean;
|
|
170
|
+
/**
|
|
171
|
+
* Subscribe to changes
|
|
172
|
+
*/
|
|
173
|
+
subscribe(listener: Listener): () => void;
|
|
174
|
+
/**
|
|
175
|
+
* Notify listeners
|
|
176
|
+
*/
|
|
177
|
+
private notify;
|
|
178
|
+
/**
|
|
179
|
+
* Export breakpoints (for persistence)
|
|
180
|
+
*/
|
|
181
|
+
exportBreakpoints(): string;
|
|
182
|
+
/**
|
|
183
|
+
* Import breakpoints (from persistence)
|
|
184
|
+
*/
|
|
185
|
+
importBreakpoints(json: string): void;
|
|
186
|
+
/**
|
|
187
|
+
* Clean up
|
|
188
|
+
*/
|
|
189
|
+
destroy(): void;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Create a new BreakpointManager instance
|
|
193
|
+
*/
|
|
194
|
+
export declare function createBreakpointManager(): BreakpointManager;
|
|
195
|
+
/**
|
|
196
|
+
* Get icon for breakpoint type
|
|
197
|
+
*/
|
|
198
|
+
export declare function getBreakpointIcon(breakpoint: Breakpoint): string;
|
|
199
|
+
/**
|
|
200
|
+
* Get color for breakpoint state
|
|
201
|
+
*/
|
|
202
|
+
export declare function getBreakpointColor(breakpoint: Breakpoint): string;
|
|
203
|
+
export {};
|