@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.
Files changed (330) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +251 -0
  3. package/dist/components/agents/AgentActivityPanel.svelte +565 -0
  4. package/dist/components/agents/AgentActivityPanel.svelte.d.ts +24 -0
  5. package/dist/components/agents/AgentAvatar.svelte +417 -0
  6. package/dist/components/agents/AgentAvatar.svelte.d.ts +23 -0
  7. package/dist/components/agents/AgentCursor.svelte +224 -0
  8. package/dist/components/agents/AgentCursor.svelte.d.ts +35 -0
  9. package/dist/components/agents/AgentPresenceBar.svelte +261 -0
  10. package/dist/components/agents/AgentPresenceBar.svelte.d.ts +20 -0
  11. package/dist/components/agents/index.d.ts +4 -0
  12. package/dist/components/agents/index.js +5 -0
  13. package/dist/components/ai/AIConversationList.svelte +524 -0
  14. package/dist/components/ai/AIConversationList.svelte.d.ts +17 -0
  15. package/dist/components/ai/AIEditPreview.svelte +132 -0
  16. package/dist/components/ai/AIEditPreview.svelte.d.ts +8 -0
  17. package/dist/components/ai/AIInlineEdit.svelte +155 -0
  18. package/dist/components/ai/AIInlineEdit.svelte.d.ts +10 -0
  19. package/dist/components/ai/AIMessage.svelte +239 -0
  20. package/dist/components/ai/AIMessage.svelte.d.ts +13 -0
  21. package/dist/components/ai/AIMessageActions.svelte +176 -0
  22. package/dist/components/ai/AIMessageActions.svelte.d.ts +12 -0
  23. package/dist/components/ai/AIMessageContent.svelte +355 -0
  24. package/dist/components/ai/AIMessageContent.svelte.d.ts +7 -0
  25. package/dist/components/ai/AIPanel.svelte +561 -0
  26. package/dist/components/ai/AIPanel.svelte.d.ts +7 -0
  27. package/dist/components/ai/AISuggestionWidget.svelte +132 -0
  28. package/dist/components/ai/AISuggestionWidget.svelte.d.ts +10 -0
  29. package/dist/components/ai/AIToolCallDisplay.svelte +317 -0
  30. package/dist/components/ai/AIToolCallDisplay.svelte.d.ts +12 -0
  31. package/dist/components/ai/index.d.ts +9 -0
  32. package/dist/components/ai/index.js +10 -0
  33. package/dist/components/core/Avatar.svelte +110 -0
  34. package/dist/components/core/Avatar.svelte.d.ts +12 -0
  35. package/dist/components/core/Badge.svelte +98 -0
  36. package/dist/components/core/Badge.svelte.d.ts +11 -0
  37. package/dist/components/core/Button.svelte +175 -0
  38. package/dist/components/core/Button.svelte.d.ts +18 -0
  39. package/dist/components/core/ConnectionStatus.svelte +294 -0
  40. package/dist/components/core/ConnectionStatus.svelte.d.ts +20 -0
  41. package/dist/components/core/ContextMenu.svelte +176 -0
  42. package/dist/components/core/ContextMenu.svelte.d.ts +19 -0
  43. package/dist/components/core/ErrorBoundary.svelte +277 -0
  44. package/dist/components/core/ErrorBoundary.svelte.d.ts +23 -0
  45. package/dist/components/core/Icon.svelte +107 -0
  46. package/dist/components/core/Icon.svelte.d.ts +8 -0
  47. package/dist/components/core/Input.svelte +138 -0
  48. package/dist/components/core/Input.svelte.d.ts +20 -0
  49. package/dist/components/core/Kbd.svelte +34 -0
  50. package/dist/components/core/Kbd.svelte.d.ts +7 -0
  51. package/dist/components/core/ResizeHandle.svelte +200 -0
  52. package/dist/components/core/ResizeHandle.svelte.d.ts +23 -0
  53. package/dist/components/core/Spinner.svelte +35 -0
  54. package/dist/components/core/Spinner.svelte.d.ts +7 -0
  55. package/dist/components/core/Textarea.svelte +112 -0
  56. package/dist/components/core/Textarea.svelte.d.ts +18 -0
  57. package/dist/components/core/Tooltip.svelte +103 -0
  58. package/dist/components/core/Tooltip.svelte.d.ts +11 -0
  59. package/dist/components/core/index.d.ts +13 -0
  60. package/dist/components/core/index.js +14 -0
  61. package/dist/components/editor/AIFocusLayer.svelte +430 -0
  62. package/dist/components/editor/AIFocusLayer.svelte.d.ts +32 -0
  63. package/dist/components/editor/Breadcrumbs.svelte +435 -0
  64. package/dist/components/editor/Breadcrumbs.svelte.d.ts +33 -0
  65. package/dist/components/editor/BreakpointLayer.svelte +642 -0
  66. package/dist/components/editor/BreakpointLayer.svelte.d.ts +20 -0
  67. package/dist/components/editor/CognitiveLoadMeter.svelte +324 -0
  68. package/dist/components/editor/CognitiveLoadMeter.svelte.d.ts +18 -0
  69. package/dist/components/editor/CollaborativeEditor.svelte +218 -0
  70. package/dist/components/editor/CollaborativeEditor.svelte.d.ts +32 -0
  71. package/dist/components/editor/CommandPalette.svelte +434 -0
  72. package/dist/components/editor/CommandPalette.svelte.d.ts +11 -0
  73. package/dist/components/editor/ComplexityLayer.svelte +293 -0
  74. package/dist/components/editor/ComplexityLayer.svelte.d.ts +23 -0
  75. package/dist/components/editor/ConflictZoneLayer.svelte +441 -0
  76. package/dist/components/editor/ConflictZoneLayer.svelte.d.ts +25 -0
  77. package/dist/components/editor/ContextLens.svelte +262 -0
  78. package/dist/components/editor/ContextLens.svelte.d.ts +27 -0
  79. package/dist/components/editor/CustomEditor.svelte +1242 -0
  80. package/dist/components/editor/CustomEditor.svelte.d.ts +37 -0
  81. package/dist/components/editor/DebugConsole.svelte +646 -0
  82. package/dist/components/editor/DebugConsole.svelte.d.ts +41 -0
  83. package/dist/components/editor/EchoCursorLayer.svelte +363 -0
  84. package/dist/components/editor/EchoCursorLayer.svelte.d.ts +24 -0
  85. package/dist/components/editor/Editor.svelte +61 -0
  86. package/dist/components/editor/Editor.svelte.d.ts +22 -0
  87. package/dist/components/editor/EditorGutter.svelte +119 -0
  88. package/dist/components/editor/EditorGutter.svelte.d.ts +19 -0
  89. package/dist/components/editor/EditorLines.svelte +182 -0
  90. package/dist/components/editor/EditorLines.svelte.d.ts +43 -0
  91. package/dist/components/editor/EditorPane.svelte +134 -0
  92. package/dist/components/editor/EditorPane.svelte.d.ts +9 -0
  93. package/dist/components/editor/EditorSelections.svelte +186 -0
  94. package/dist/components/editor/EditorSelections.svelte.d.ts +25 -0
  95. package/dist/components/editor/EditorTabs.svelte +170 -0
  96. package/dist/components/editor/EditorTabs.svelte.d.ts +12 -0
  97. package/dist/components/editor/FileExplorer.svelte +811 -0
  98. package/dist/components/editor/FileExplorer.svelte.d.ts +67 -0
  99. package/dist/components/editor/FileIcon.svelte +110 -0
  100. package/dist/components/editor/FileIcon.svelte.d.ts +10 -0
  101. package/dist/components/editor/FindReplace.svelte +448 -0
  102. package/dist/components/editor/FindReplace.svelte.d.ts +40 -0
  103. package/dist/components/editor/GhostBracketLayer.svelte +391 -0
  104. package/dist/components/editor/GhostBracketLayer.svelte.d.ts +24 -0
  105. package/dist/components/editor/GitBlameLayer.svelte +436 -0
  106. package/dist/components/editor/GitBlameLayer.svelte.d.ts +18 -0
  107. package/dist/components/editor/InlineDiagnosticsLayer.svelte +540 -0
  108. package/dist/components/editor/InlineDiagnosticsLayer.svelte.d.ts +35 -0
  109. package/dist/components/editor/InlineDiffLayer.svelte +337 -0
  110. package/dist/components/editor/InlineDiffLayer.svelte.d.ts +31 -0
  111. package/dist/components/editor/MinimalEditor.svelte +75 -0
  112. package/dist/components/editor/MinimalEditor.svelte.d.ts +6 -0
  113. package/dist/components/editor/MinimalEditor2.svelte +84 -0
  114. package/dist/components/editor/MinimalEditor2.svelte.d.ts +6 -0
  115. package/dist/components/editor/Minimap.svelte +327 -0
  116. package/dist/components/editor/Minimap.svelte.d.ts +34 -0
  117. package/dist/components/editor/PluginPreviewSandbox.svelte +793 -0
  118. package/dist/components/editor/PluginPreviewSandbox.svelte.d.ts +49 -0
  119. package/dist/components/editor/ProblemsPanel.svelte +628 -0
  120. package/dist/components/editor/ProblemsPanel.svelte.d.ts +25 -0
  121. package/dist/components/editor/QuickActionsMenu.svelte +403 -0
  122. package/dist/components/editor/QuickActionsMenu.svelte.d.ts +18 -0
  123. package/dist/components/editor/SnippetPalette.svelte +530 -0
  124. package/dist/components/editor/SnippetPalette.svelte.d.ts +16 -0
  125. package/dist/components/editor/StructureMap.svelte +431 -0
  126. package/dist/components/editor/StructureMap.svelte.d.ts +37 -0
  127. package/dist/components/editor/SymbolOutline.svelte +722 -0
  128. package/dist/components/editor/SymbolOutline.svelte.d.ts +44 -0
  129. package/dist/components/editor/TimelineScrubber.svelte +470 -0
  130. package/dist/components/editor/TimelineScrubber.svelte.d.ts +40 -0
  131. package/dist/components/editor/TokenRenderer.svelte +69 -0
  132. package/dist/components/editor/TokenRenderer.svelte.d.ts +15 -0
  133. package/dist/components/editor/constants.d.ts +32 -0
  134. package/dist/components/editor/constants.js +36 -0
  135. package/dist/components/editor/core/ai-awareness.d.ts +176 -0
  136. package/dist/components/editor/core/ai-awareness.js +210 -0
  137. package/dist/components/editor/core/bracket-healer.d.ts +189 -0
  138. package/dist/components/editor/core/bracket-healer.js +406 -0
  139. package/dist/components/editor/core/breakpoints.d.ts +203 -0
  140. package/dist/components/editor/core/breakpoints.js +414 -0
  141. package/dist/components/editor/core/commands.d.ts +108 -0
  142. package/dist/components/editor/core/commands.js +246 -0
  143. package/dist/components/editor/core/complexity-analyzer.d.ts +123 -0
  144. package/dist/components/editor/core/complexity-analyzer.js +376 -0
  145. package/dist/components/editor/core/conflict-predictor.d.ts +135 -0
  146. package/dist/components/editor/core/conflict-predictor.js +316 -0
  147. package/dist/components/editor/core/crdt-binding.d.ts +118 -0
  148. package/dist/components/editor/core/crdt-binding.js +286 -0
  149. package/dist/components/editor/core/diagnostics.d.ts +210 -0
  150. package/dist/components/editor/core/diagnostics.js +335 -0
  151. package/dist/components/editor/core/echo-cursor.d.ts +201 -0
  152. package/dist/components/editor/core/echo-cursor.js +267 -0
  153. package/dist/components/editor/core/folding.d.ts +124 -0
  154. package/dist/components/editor/core/folding.js +672 -0
  155. package/dist/components/editor/core/ghost-pair.d.ts +122 -0
  156. package/dist/components/editor/core/ghost-pair.js +221 -0
  157. package/dist/components/editor/core/git-blame.d.ts +170 -0
  158. package/dist/components/editor/core/git-blame.js +324 -0
  159. package/dist/components/editor/core/index.d.ts +26 -0
  160. package/dist/components/editor/core/index.js +24 -0
  161. package/dist/components/editor/core/keybindings.d.ts +79 -0
  162. package/dist/components/editor/core/keybindings.js +357 -0
  163. package/dist/components/editor/core/multi-cursor.d.ts +196 -0
  164. package/dist/components/editor/core/multi-cursor.js +521 -0
  165. package/dist/components/editor/core/navigation.d.ts +107 -0
  166. package/dist/components/editor/core/navigation.js +408 -0
  167. package/dist/components/editor/core/quick-actions.d.ts +189 -0
  168. package/dist/components/editor/core/quick-actions.js +427 -0
  169. package/dist/components/editor/core/search.d.ts +88 -0
  170. package/dist/components/editor/core/search.js +192 -0
  171. package/dist/components/editor/core/semantic-analyzer.d.ts +77 -0
  172. package/dist/components/editor/core/semantic-analyzer.js +424 -0
  173. package/dist/components/editor/core/snippet-manager.d.ts +202 -0
  174. package/dist/components/editor/core/snippet-manager.js +565 -0
  175. package/dist/components/editor/core/state.d.ts +367 -0
  176. package/dist/components/editor/core/state.js +900 -0
  177. package/dist/components/editor/core/timeline.d.ts +204 -0
  178. package/dist/components/editor/core/timeline.js +349 -0
  179. package/dist/components/editor/editor-find.d.ts +56 -0
  180. package/dist/components/editor/editor-find.js +148 -0
  181. package/dist/components/editor/editor-input.d.ts +77 -0
  182. package/dist/components/editor/editor-input.js +445 -0
  183. package/dist/components/editor/editor-multicursor.d.ts +21 -0
  184. package/dist/components/editor/editor-multicursor.js +196 -0
  185. package/dist/components/editor/editor-scroll.d.ts +14 -0
  186. package/dist/components/editor/editor-scroll.js +34 -0
  187. package/dist/components/editor/index.d.ts +15 -0
  188. package/dist/components/editor/index.js +21 -0
  189. package/dist/components/editor/languages.d.ts +62 -0
  190. package/dist/components/editor/languages.js +285 -0
  191. package/dist/components/editor/theme.d.ts +88 -0
  192. package/dist/components/editor/theme.js +139 -0
  193. package/dist/components/editor/tokenizer/base.d.ts +40 -0
  194. package/dist/components/editor/tokenizer/base.js +203 -0
  195. package/dist/components/editor/tokenizer/index.d.ts +56 -0
  196. package/dist/components/editor/tokenizer/index.js +215 -0
  197. package/dist/components/editor/tokenizer/languages/css.d.ts +17 -0
  198. package/dist/components/editor/tokenizer/languages/css.js +194 -0
  199. package/dist/components/editor/tokenizer/languages/go.d.ts +17 -0
  200. package/dist/components/editor/tokenizer/languages/go.js +220 -0
  201. package/dist/components/editor/tokenizer/languages/html.d.ts +24 -0
  202. package/dist/components/editor/tokenizer/languages/html.js +145 -0
  203. package/dist/components/editor/tokenizer/languages/javascript.d.ts +56 -0
  204. package/dist/components/editor/tokenizer/languages/javascript.js +452 -0
  205. package/dist/components/editor/tokenizer/languages/json.d.ts +12 -0
  206. package/dist/components/editor/tokenizer/languages/json.js +91 -0
  207. package/dist/components/editor/tokenizer/languages/markdown.d.ts +16 -0
  208. package/dist/components/editor/tokenizer/languages/markdown.js +156 -0
  209. package/dist/components/editor/tokenizer/languages/python.d.ts +20 -0
  210. package/dist/components/editor/tokenizer/languages/python.js +227 -0
  211. package/dist/components/editor/tokenizer/languages/svelte.d.ts +40 -0
  212. package/dist/components/editor/tokenizer/languages/svelte.js +326 -0
  213. package/dist/components/editor/tokenizer/types.d.ts +86 -0
  214. package/dist/components/editor/tokenizer/types.js +4 -0
  215. package/dist/components/layout/IDELayout.svelte +274 -0
  216. package/dist/components/layout/IDELayout.svelte.d.ts +29 -0
  217. package/dist/components/layout/StatusBar.svelte +511 -0
  218. package/dist/components/layout/StatusBar.svelte.d.ts +47 -0
  219. package/dist/components/layout/index.d.ts +2 -0
  220. package/dist/components/layout/index.js +3 -0
  221. package/dist/components/lsp/AutocompleteWidget.svelte +364 -0
  222. package/dist/components/lsp/AutocompleteWidget.svelte.d.ts +33 -0
  223. package/dist/components/lsp/DiagnosticMarker.svelte +166 -0
  224. package/dist/components/lsp/DiagnosticMarker.svelte.d.ts +19 -0
  225. package/dist/components/lsp/DiagnosticsPanel.svelte +388 -0
  226. package/dist/components/lsp/DiagnosticsPanel.svelte.d.ts +21 -0
  227. package/dist/components/lsp/HoverTooltip.svelte +274 -0
  228. package/dist/components/lsp/HoverTooltip.svelte.d.ts +24 -0
  229. package/dist/components/lsp/LSPEditor.svelte +486 -0
  230. package/dist/components/lsp/LSPEditor.svelte.d.ts +39 -0
  231. package/dist/components/lsp/SignatureHelpWidget.svelte +216 -0
  232. package/dist/components/lsp/SignatureHelpWidget.svelte.d.ts +22 -0
  233. package/dist/components/lsp/index.d.ts +6 -0
  234. package/dist/components/lsp/index.js +7 -0
  235. package/dist/components/plugins/PluginCard.svelte +153 -0
  236. package/dist/components/plugins/PluginCard.svelte.d.ts +19 -0
  237. package/dist/components/plugins/PluginPanel.svelte +280 -0
  238. package/dist/components/plugins/PluginPanel.svelte.d.ts +8 -0
  239. package/dist/components/plugins/PluginProposalForm.svelte +250 -0
  240. package/dist/components/plugins/PluginProposalForm.svelte.d.ts +6 -0
  241. package/dist/components/plugins/PluginStatusBadge.svelte +14 -0
  242. package/dist/components/plugins/PluginStatusBadge.svelte.d.ts +8 -0
  243. package/dist/components/plugins/index.d.ts +4 -0
  244. package/dist/components/plugins/index.js +5 -0
  245. package/dist/components/vfs/LockConflictDialog.svelte +705 -0
  246. package/dist/components/vfs/LockConflictDialog.svelte.d.ts +21 -0
  247. package/dist/components/vfs/LockIndicator.svelte +194 -0
  248. package/dist/components/vfs/LockIndicator.svelte.d.ts +29 -0
  249. package/dist/components/vfs/LockOverlay.svelte +344 -0
  250. package/dist/components/vfs/LockOverlay.svelte.d.ts +17 -0
  251. package/dist/components/vfs/VersionConflictDialog.svelte +549 -0
  252. package/dist/components/vfs/VersionConflictDialog.svelte.d.ts +24 -0
  253. package/dist/components/vfs/index.d.ts +4 -0
  254. package/dist/components/vfs/index.js +5 -0
  255. package/dist/crdt/awareness.d.ts +42 -0
  256. package/dist/crdt/awareness.js +109 -0
  257. package/dist/crdt/document.d.ts +101 -0
  258. package/dist/crdt/document.js +187 -0
  259. package/dist/crdt/index.d.ts +9 -0
  260. package/dist/crdt/index.js +8 -0
  261. package/dist/crdt/provider.d.ts +85 -0
  262. package/dist/crdt/provider.js +150 -0
  263. package/dist/crdt/types.d.ts +61 -0
  264. package/dist/crdt/types.js +4 -0
  265. package/dist/crdt/undo.d.ts +34 -0
  266. package/dist/crdt/undo.js +70 -0
  267. package/dist/index.d.ts +277 -0
  268. package/dist/index.js +280 -0
  269. package/dist/plugins/index.d.ts +103 -0
  270. package/dist/plugins/index.js +153 -0
  271. package/dist/services/error-handling.d.ts +95 -0
  272. package/dist/services/error-handling.js +413 -0
  273. package/dist/services/ide-integration.d.ts +83 -0
  274. package/dist/services/ide-integration.js +367 -0
  275. package/dist/services/lsp-client.d.ts +69 -0
  276. package/dist/services/lsp-client.js +667 -0
  277. package/dist/services/mock-ai.d.ts +37 -0
  278. package/dist/services/mock-ai.js +318 -0
  279. package/dist/services/optimistic.d.ts +141 -0
  280. package/dist/services/optimistic.js +367 -0
  281. package/dist/services/vfs-client.d.ts +81 -0
  282. package/dist/services/vfs-client.js +348 -0
  283. package/dist/stores/agents.svelte.d.ts +85 -0
  284. package/dist/stores/agents.svelte.js +459 -0
  285. package/dist/stores/ai-persistence.svelte.d.ts +76 -0
  286. package/dist/stores/ai-persistence.svelte.js +334 -0
  287. package/dist/stores/ai.svelte.d.ts +140 -0
  288. package/dist/stores/ai.svelte.js +383 -0
  289. package/dist/stores/collaboration.svelte.d.ts +164 -0
  290. package/dist/stores/collaboration.svelte.js +334 -0
  291. package/dist/stores/editor.svelte.d.ts +131 -0
  292. package/dist/stores/editor.svelte.js +250 -0
  293. package/dist/stores/index.d.ts +10 -0
  294. package/dist/stores/index.js +29 -0
  295. package/dist/stores/layout.svelte.d.ts +171 -0
  296. package/dist/stores/layout.svelte.js +351 -0
  297. package/dist/stores/plugin.svelte.d.ts +121 -0
  298. package/dist/stores/plugin.svelte.js +410 -0
  299. package/dist/stores/vfs.svelte.d.ts +123 -0
  300. package/dist/stores/vfs.svelte.js +680 -0
  301. package/dist/styles/theme.css +623 -0
  302. package/dist/types/agents.d.ts +127 -0
  303. package/dist/types/agents.js +5 -0
  304. package/dist/types/ai.d.ts +137 -0
  305. package/dist/types/ai.js +4 -0
  306. package/dist/types/crdt.d.ts +222 -0
  307. package/dist/types/crdt.js +5 -0
  308. package/dist/types/editor.d.ts +52 -0
  309. package/dist/types/editor.js +18 -0
  310. package/dist/types/events.d.ts +133 -0
  311. package/dist/types/events.js +4 -0
  312. package/dist/types/filesystem.d.ts +77 -0
  313. package/dist/types/filesystem.js +4 -0
  314. package/dist/types/index.d.ts +9 -0
  315. package/dist/types/index.js +12 -0
  316. package/dist/types/lsp.d.ts +691 -0
  317. package/dist/types/lsp.js +108 -0
  318. package/dist/types/plugin.d.ts +239 -0
  319. package/dist/types/plugin.js +5 -0
  320. package/dist/types/vfs.d.ts +191 -0
  321. package/dist/types/vfs.js +18 -0
  322. package/dist/utils/format.d.ts +55 -0
  323. package/dist/utils/format.js +152 -0
  324. package/dist/utils/index.d.ts +3 -0
  325. package/dist/utils/index.js +4 -0
  326. package/dist/utils/keybindings.d.ts +33 -0
  327. package/dist/utils/keybindings.js +171 -0
  328. package/dist/utils/language.d.ts +27 -0
  329. package/dist/utils/language.js +222 -0
  330. 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 {};