@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,414 @@
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
+ /**
12
+ * Breakpoint Manager
13
+ */
14
+ export class BreakpointManager {
15
+ _config = {
16
+ enabled: true,
17
+ showGutter: true,
18
+ allowConditional: true,
19
+ allowLogpoints: true,
20
+ maxPerFile: 50
21
+ };
22
+ _breakpoints = new Map();
23
+ _listeners = new Set();
24
+ _idCounter = 0;
25
+ /**
26
+ * Add a breakpoint
27
+ */
28
+ addBreakpoint(filePath, line, options) {
29
+ const id = `bp-${++this._idCounter}`;
30
+ const breakpoint = {
31
+ id,
32
+ filePath,
33
+ line,
34
+ type: options?.type || 'line',
35
+ state: options?.state || 'enabled',
36
+ condition: options?.condition,
37
+ logMessage: options?.logMessage,
38
+ hitCondition: options?.hitCondition,
39
+ hitCount: 0,
40
+ verified: false,
41
+ column: options?.column,
42
+ functionName: options?.functionName,
43
+ exceptionTypes: options?.exceptionTypes,
44
+ createdAt: new Date()
45
+ };
46
+ this._breakpoints.set(id, breakpoint);
47
+ this.notify();
48
+ return breakpoint;
49
+ }
50
+ /**
51
+ * Remove a breakpoint
52
+ */
53
+ removeBreakpoint(id) {
54
+ const result = this._breakpoints.delete(id);
55
+ if (result) {
56
+ this.notify();
57
+ }
58
+ return result;
59
+ }
60
+ /**
61
+ * Toggle breakpoint at line (add if not exists, remove if exists)
62
+ */
63
+ toggleBreakpoint(filePath, line) {
64
+ const existing = this.getBreakpointAtLine(filePath, line);
65
+ if (existing) {
66
+ this.removeBreakpoint(existing.id);
67
+ return null;
68
+ }
69
+ else {
70
+ return this.addBreakpoint(filePath, line);
71
+ }
72
+ }
73
+ /**
74
+ * Update a breakpoint
75
+ */
76
+ updateBreakpoint(id, updates) {
77
+ const breakpoint = this._breakpoints.get(id);
78
+ if (!breakpoint)
79
+ return null;
80
+ const updated = { ...breakpoint, ...updates };
81
+ this._breakpoints.set(id, updated);
82
+ this.notify();
83
+ return updated;
84
+ }
85
+ /**
86
+ * Enable a breakpoint
87
+ */
88
+ enableBreakpoint(id) {
89
+ const bp = this._breakpoints.get(id);
90
+ if (bp && bp.state === 'disabled') {
91
+ bp.state = 'enabled';
92
+ this.notify();
93
+ return true;
94
+ }
95
+ return false;
96
+ }
97
+ /**
98
+ * Disable a breakpoint
99
+ */
100
+ disableBreakpoint(id) {
101
+ const bp = this._breakpoints.get(id);
102
+ if (bp && bp.state === 'enabled') {
103
+ bp.state = 'disabled';
104
+ this.notify();
105
+ return true;
106
+ }
107
+ return false;
108
+ }
109
+ /**
110
+ * Toggle breakpoint enabled state
111
+ */
112
+ toggleBreakpointEnabled(id) {
113
+ const bp = this._breakpoints.get(id);
114
+ if (bp) {
115
+ bp.state = bp.state === 'enabled' ? 'disabled' : 'enabled';
116
+ this.notify();
117
+ return true;
118
+ }
119
+ return false;
120
+ }
121
+ /**
122
+ * Get breakpoint by ID
123
+ */
124
+ getBreakpoint(id) {
125
+ return this._breakpoints.get(id);
126
+ }
127
+ /**
128
+ * Get breakpoint at specific line
129
+ */
130
+ getBreakpointAtLine(filePath, line) {
131
+ for (const bp of this._breakpoints.values()) {
132
+ if (bp.filePath === filePath && bp.line === line) {
133
+ return bp;
134
+ }
135
+ }
136
+ return undefined;
137
+ }
138
+ /**
139
+ * Get all breakpoints for a file
140
+ */
141
+ getBreakpointsForFile(filePath) {
142
+ const breakpoints = [];
143
+ for (const bp of this._breakpoints.values()) {
144
+ if (bp.filePath === filePath) {
145
+ breakpoints.push(bp);
146
+ }
147
+ }
148
+ return breakpoints.sort((a, b) => a.line - b.line);
149
+ }
150
+ /**
151
+ * Get all breakpoints
152
+ */
153
+ getAllBreakpoints() {
154
+ return [...this._breakpoints.values()].sort((a, b) => {
155
+ const pathCompare = a.filePath.localeCompare(b.filePath);
156
+ if (pathCompare !== 0)
157
+ return pathCompare;
158
+ return a.line - b.line;
159
+ });
160
+ }
161
+ /**
162
+ * Get breakpoints grouped by file
163
+ */
164
+ getBreakpointsByFile() {
165
+ const byFile = new Map();
166
+ for (const bp of this._breakpoints.values()) {
167
+ if (!byFile.has(bp.filePath)) {
168
+ byFile.set(bp.filePath, []);
169
+ }
170
+ byFile.get(bp.filePath).push(bp);
171
+ }
172
+ // Sort each file's breakpoints by line
173
+ for (const [path, bps] of byFile) {
174
+ byFile.set(path, bps.sort((a, b) => a.line - b.line));
175
+ }
176
+ return byFile;
177
+ }
178
+ /**
179
+ * Clear all breakpoints for a file
180
+ */
181
+ clearFileBreakpoints(filePath) {
182
+ let count = 0;
183
+ for (const bp of [...this._breakpoints.values()]) {
184
+ if (bp.filePath === filePath) {
185
+ this._breakpoints.delete(bp.id);
186
+ count++;
187
+ }
188
+ }
189
+ if (count > 0) {
190
+ this.notify();
191
+ }
192
+ return count;
193
+ }
194
+ /**
195
+ * Clear all breakpoints
196
+ */
197
+ clearAllBreakpoints() {
198
+ const count = this._breakpoints.size;
199
+ this._breakpoints.clear();
200
+ if (count > 0) {
201
+ this.notify();
202
+ }
203
+ return count;
204
+ }
205
+ /**
206
+ * Enable all breakpoints
207
+ */
208
+ enableAllBreakpoints() {
209
+ for (const bp of this._breakpoints.values()) {
210
+ if (bp.state === 'disabled') {
211
+ bp.state = 'enabled';
212
+ }
213
+ }
214
+ this.notify();
215
+ }
216
+ /**
217
+ * Disable all breakpoints
218
+ */
219
+ disableAllBreakpoints() {
220
+ for (const bp of this._breakpoints.values()) {
221
+ if (bp.state === 'enabled') {
222
+ bp.state = 'disabled';
223
+ }
224
+ }
225
+ this.notify();
226
+ }
227
+ /**
228
+ * Mark breakpoint as verified by debugger
229
+ */
230
+ verifyBreakpoint(id, verified, errorMessage) {
231
+ const bp = this._breakpoints.get(id);
232
+ if (bp) {
233
+ bp.verified = verified;
234
+ bp.state = verified ? 'enabled' : 'invalid';
235
+ bp.errorMessage = errorMessage;
236
+ this.notify();
237
+ }
238
+ }
239
+ /**
240
+ * Increment hit count for breakpoint
241
+ */
242
+ incrementHitCount(id) {
243
+ const bp = this._breakpoints.get(id);
244
+ if (bp) {
245
+ bp.hitCount++;
246
+ this.notify();
247
+ return bp.hitCount;
248
+ }
249
+ return 0;
250
+ }
251
+ /**
252
+ * Reset hit counts for all breakpoints
253
+ */
254
+ resetHitCounts() {
255
+ for (const bp of this._breakpoints.values()) {
256
+ bp.hitCount = 0;
257
+ }
258
+ this.notify();
259
+ }
260
+ /**
261
+ * Check if breakpoint should trigger based on conditions
262
+ */
263
+ shouldBreakpointTrigger(id) {
264
+ const bp = this._breakpoints.get(id);
265
+ if (!bp || bp.state !== 'enabled')
266
+ return false;
267
+ // Check hit condition
268
+ if (bp.hitCondition) {
269
+ const count = bp.hitCount;
270
+ try {
271
+ // Simple hit condition evaluation
272
+ if (bp.hitCondition.startsWith('>=')) {
273
+ const value = parseInt(bp.hitCondition.slice(2).trim());
274
+ if (count < value)
275
+ return false;
276
+ }
277
+ else if (bp.hitCondition.startsWith('==')) {
278
+ const value = parseInt(bp.hitCondition.slice(2).trim());
279
+ if (count !== value)
280
+ return false;
281
+ }
282
+ else if (bp.hitCondition.startsWith('%')) {
283
+ const match = bp.hitCondition.match(/%\s*(\d+)\s*==\s*(\d+)/);
284
+ if (match) {
285
+ const divisor = parseInt(match[1]);
286
+ const remainder = parseInt(match[2]);
287
+ if (count % divisor !== remainder)
288
+ return false;
289
+ }
290
+ }
291
+ }
292
+ catch {
293
+ // Invalid hit condition, trigger anyway
294
+ }
295
+ }
296
+ return true;
297
+ }
298
+ /**
299
+ * Get count
300
+ */
301
+ getCount(filePath) {
302
+ if (filePath) {
303
+ return this.getBreakpointsForFile(filePath).length;
304
+ }
305
+ return this._breakpoints.size;
306
+ }
307
+ /**
308
+ * Get config
309
+ */
310
+ get config() {
311
+ return { ...this._config };
312
+ }
313
+ /**
314
+ * Update config
315
+ */
316
+ setConfig(config) {
317
+ this._config = { ...this._config, ...config };
318
+ this.notify();
319
+ }
320
+ /**
321
+ * Enable/disable globally
322
+ */
323
+ setEnabled(enabled) {
324
+ this._config.enabled = enabled;
325
+ this.notify();
326
+ }
327
+ /**
328
+ * Check if enabled
329
+ */
330
+ isEnabled() {
331
+ return this._config.enabled;
332
+ }
333
+ /**
334
+ * Subscribe to changes
335
+ */
336
+ subscribe(listener) {
337
+ this._listeners.add(listener);
338
+ return () => this._listeners.delete(listener);
339
+ }
340
+ /**
341
+ * Notify listeners
342
+ */
343
+ notify() {
344
+ for (const listener of this._listeners) {
345
+ listener();
346
+ }
347
+ }
348
+ /**
349
+ * Export breakpoints (for persistence)
350
+ */
351
+ exportBreakpoints() {
352
+ return JSON.stringify([...this._breakpoints.values()]);
353
+ }
354
+ /**
355
+ * Import breakpoints (from persistence)
356
+ */
357
+ importBreakpoints(json) {
358
+ try {
359
+ const breakpoints = JSON.parse(json);
360
+ this._breakpoints.clear();
361
+ for (const bp of breakpoints) {
362
+ bp.createdAt = new Date(bp.createdAt);
363
+ this._breakpoints.set(bp.id, bp);
364
+ }
365
+ this.notify();
366
+ }
367
+ catch (e) {
368
+ console.error('Failed to import breakpoints:', e);
369
+ }
370
+ }
371
+ /**
372
+ * Clean up
373
+ */
374
+ destroy() {
375
+ this._listeners.clear();
376
+ this._breakpoints.clear();
377
+ }
378
+ }
379
+ /**
380
+ * Create a new BreakpointManager instance
381
+ */
382
+ export function createBreakpointManager() {
383
+ return new BreakpointManager();
384
+ }
385
+ /**
386
+ * Get icon for breakpoint type
387
+ */
388
+ export function getBreakpointIcon(breakpoint) {
389
+ if (breakpoint.type === 'logpoint')
390
+ return '◆';
391
+ if (breakpoint.type === 'conditional')
392
+ return '◉';
393
+ if (breakpoint.type === 'function')
394
+ return 'ƒ';
395
+ if (breakpoint.type === 'exception')
396
+ return '⚡';
397
+ return '●';
398
+ }
399
+ /**
400
+ * Get color for breakpoint state
401
+ */
402
+ export function getBreakpointColor(breakpoint) {
403
+ if (breakpoint.state === 'disabled')
404
+ return '#6c6c6c';
405
+ if (breakpoint.state === 'invalid')
406
+ return '#888888';
407
+ if (breakpoint.state === 'pending')
408
+ return '#ff8c00';
409
+ if (breakpoint.type === 'logpoint')
410
+ return '#f9e64f';
411
+ if (breakpoint.type === 'conditional')
412
+ return '#f44747';
413
+ return '#f44747';
414
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Command System
3
+ *
4
+ * Provides a centralized command registry for the editor.
5
+ * Commands can be executed via keyboard shortcuts or the command palette.
6
+ */
7
+ import type { EditorState } from './state';
8
+ import { type FoldPreset } from './semantic-analyzer';
9
+ /**
10
+ * Command definition
11
+ */
12
+ export interface Command {
13
+ /** Unique command identifier */
14
+ id: string;
15
+ /** Display label */
16
+ label: string;
17
+ /** Category for grouping */
18
+ category: string;
19
+ /** Description */
20
+ description?: string;
21
+ /** Keyboard shortcut (display only) */
22
+ shortcut?: string;
23
+ /** Icon (unicode or emoji) */
24
+ icon?: string;
25
+ /** Execute the command */
26
+ execute: () => void | Promise<void>;
27
+ /** Check if command is enabled */
28
+ isEnabled?: () => boolean;
29
+ }
30
+ /**
31
+ * Command category
32
+ */
33
+ export interface CommandCategory {
34
+ id: string;
35
+ label: string;
36
+ icon?: string;
37
+ }
38
+ /**
39
+ * Command registry
40
+ */
41
+ declare class CommandRegistry {
42
+ private commands;
43
+ private categories;
44
+ /**
45
+ * Register a command
46
+ */
47
+ register(command: Command): () => void;
48
+ /**
49
+ * Register multiple commands
50
+ */
51
+ registerMany(commands: Command[]): () => void;
52
+ /**
53
+ * Register a category
54
+ */
55
+ registerCategory(category: CommandCategory): void;
56
+ /**
57
+ * Get a command by ID
58
+ */
59
+ get(id: string): Command | undefined;
60
+ /**
61
+ * Execute a command by ID
62
+ */
63
+ execute(id: string): Promise<boolean>;
64
+ /**
65
+ * Get all commands
66
+ */
67
+ getAll(): Command[];
68
+ /**
69
+ * Get commands by category
70
+ */
71
+ getByCategory(categoryId: string): Command[];
72
+ /**
73
+ * Search commands
74
+ */
75
+ search(query: string): Command[];
76
+ /**
77
+ * Get all categories
78
+ */
79
+ getCategories(): CommandCategory[];
80
+ /**
81
+ * Clear all commands
82
+ */
83
+ clear(): void;
84
+ }
85
+ /**
86
+ * Get the global command registry
87
+ */
88
+ export declare function getCommandRegistry(): CommandRegistry;
89
+ /**
90
+ * Semantic fold action types
91
+ */
92
+ export type SemanticFoldAction = 'fold' | 'unfold' | 'toggle' | 'focus';
93
+ /**
94
+ * Create semantic fold commands for the editor
95
+ */
96
+ export declare function createSemanticFoldCommands(editorState: EditorState, options: {
97
+ onFoldLines?: (startLine: number, endLine: number) => void;
98
+ onUnfoldLines?: (startLine: number, endLine: number) => void;
99
+ onFoldAll?: () => void;
100
+ onUnfoldAll?: () => void;
101
+ onApplyPreset?: (preset: FoldPreset) => void;
102
+ getLanguage?: () => string;
103
+ }): Command[];
104
+ /**
105
+ * Register semantic fold commands with the global registry
106
+ */
107
+ export declare function registerSemanticFoldCommands(editorState: EditorState, options: Parameters<typeof createSemanticFoldCommands>[1]): () => void;
108
+ export {};