@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,367 @@
1
+ /**
2
+ * IDE Integration Service
3
+ *
4
+ * Coordinates VFS, Agents, and Collaboration stores into a unified system.
5
+ * Handles cross-store communication and event routing.
6
+ */
7
+ import * as vfsStore from '../stores/vfs.svelte';
8
+ import * as agentsStore from '../stores/agents.svelte';
9
+ import * as collabStore from '../stores/collaboration.svelte';
10
+ // ============================================================================
11
+ // State
12
+ // ============================================================================
13
+ let config = null;
14
+ let subscriptions = [];
15
+ let initialized = false;
16
+ // ============================================================================
17
+ // Initialization
18
+ // ============================================================================
19
+ /**
20
+ * Initialize the IDE integration layer
21
+ * Connects all stores and sets up event routing
22
+ */
23
+ export function initialize(integrationConfig) {
24
+ if (initialized) {
25
+ cleanup();
26
+ }
27
+ config = integrationConfig;
28
+ // Initialize VFS store
29
+ vfsStore.initialize(config.userId, config.workspaceId);
30
+ // Initialize collaboration if enabled
31
+ if (config.enableCollaboration !== false) {
32
+ const collabUser = {
33
+ id: config.userId,
34
+ name: config.userName,
35
+ isAI: false,
36
+ color: 'var(--ide-collab-cursor-1)'
37
+ };
38
+ collabStore.initialize({
39
+ user: collabUser,
40
+ roomId: config.workspaceId,
41
+ serverUrl: config.vfsEndpoint ?? '/api/collab'
42
+ });
43
+ }
44
+ // Set up event routing
45
+ setupEventRouting();
46
+ initialized = true;
47
+ }
48
+ /**
49
+ * Set up cross-store event routing
50
+ */
51
+ function setupEventRouting() {
52
+ // Route VFS events to agents store
53
+ const vfsUnsub = vfsStore.onEvent('*', (event) => {
54
+ handleVFSEvent(event);
55
+ });
56
+ subscriptions.push(vfsUnsub);
57
+ // Route team events to collaboration
58
+ const teamUnsub = agentsStore.onTeamEvent('*', (event) => {
59
+ handleTeamEvent(event);
60
+ });
61
+ subscriptions.push(teamUnsub);
62
+ // Route collaboration events to agents
63
+ const collabUnsub = collabStore.onEvent((event) => {
64
+ handleCollabEvent(event);
65
+ });
66
+ subscriptions.push(collabUnsub);
67
+ }
68
+ // ============================================================================
69
+ // Event Handlers
70
+ // ============================================================================
71
+ /**
72
+ * Handle VFS events and route to appropriate stores
73
+ */
74
+ function handleVFSEvent(event) {
75
+ // Forward agent-related events to agents store
76
+ agentsStore.handleVFSEvent(event);
77
+ switch (event.type) {
78
+ case 'update': {
79
+ const updateEvent = event;
80
+ // If update is from an agent, create team event
81
+ if (updateEvent.actorType === 'agent') {
82
+ const agent = agentsStore.getAgent(updateEvent.actor);
83
+ if (agent) {
84
+ const operation = updateEvent.operation;
85
+ const operationPath = operation.type === 'rename' ? operation.newPath : operation.path;
86
+ agentsStore.addEvent({
87
+ id: crypto.randomUUID(),
88
+ timestamp: updateEvent.timestamp,
89
+ workspaceId: event.workspaceId,
90
+ agentId: updateEvent.actor,
91
+ agent,
92
+ type: 'file_modified',
93
+ path: operationPath,
94
+ operation: operation.type,
95
+ lockAcquired: vfsStore.isLockedByMe(operationPath)
96
+ });
97
+ }
98
+ }
99
+ break;
100
+ }
101
+ case 'lock_acquired': {
102
+ const lockEvent = event;
103
+ // If lock acquired by agent, update agent status
104
+ if (lockEvent.lock.holderType === 'agent') {
105
+ agentsStore.setAgentStatus(lockEvent.lock.holder, 'busy');
106
+ }
107
+ break;
108
+ }
109
+ case 'lock_released': {
110
+ const releaseEvent = event;
111
+ // Check if agent should return to online status
112
+ const agent = agentsStore.getAgent(releaseEvent.holder);
113
+ if (agent && agent.status === 'busy' && !agent.currentTask) {
114
+ agentsStore.setAgentStatus(releaseEvent.holder, 'online');
115
+ }
116
+ break;
117
+ }
118
+ }
119
+ }
120
+ /**
121
+ * Handle team events and route to collaboration
122
+ */
123
+ function handleTeamEvent(event) {
124
+ if (!config?.enableCollaboration)
125
+ return;
126
+ switch (event.type) {
127
+ case 'agent_joined': {
128
+ // Add agent as collaboration user
129
+ const collabUser = {
130
+ id: event.agent.id,
131
+ name: event.agent.name,
132
+ isAI: true,
133
+ color: event.agent.color ?? 'var(--ide-collab-ai)'
134
+ };
135
+ collabStore.addUser(collabUser);
136
+ break;
137
+ }
138
+ case 'agent_left': {
139
+ collabStore.removeUser(event.agentId);
140
+ break;
141
+ }
142
+ case 'work_started': {
143
+ // Start AI collaboration session
144
+ const aiUser = {
145
+ id: event.agent.id,
146
+ name: event.agent.name,
147
+ isAI: true,
148
+ color: event.agent.color ?? 'var(--ide-collab-ai)'
149
+ };
150
+ const sessionId = collabStore.startAISession(config.workspaceId, aiUser);
151
+ collabStore.setAITask(sessionId, event.task.description);
152
+ break;
153
+ }
154
+ case 'task_completed': {
155
+ // Find and complete the AI session
156
+ const sessions = collabStore.getAISessions();
157
+ const session = sessions.find((s) => s.aiUser.id === event.agentId && s.status === 'active');
158
+ if (session) {
159
+ collabStore.completeAISession(session.id);
160
+ }
161
+ break;
162
+ }
163
+ }
164
+ }
165
+ /**
166
+ * Handle collaboration events
167
+ */
168
+ function handleCollabEvent(event) {
169
+ // Map collaboration events back to agent store if needed
170
+ switch (event.type) {
171
+ case 'user_joined': {
172
+ const user = event.user;
173
+ if (user.isAI) {
174
+ // An AI joined via collaboration - register as agent
175
+ const existingAgent = agentsStore.getAgent(user.id);
176
+ if (!existingAgent) {
177
+ agentsStore.addAgent({
178
+ id: user.id,
179
+ name: user.name,
180
+ type: 'coder',
181
+ status: 'online',
182
+ capabilities: ['code_generation'],
183
+ workspaceId: config?.workspaceId ?? '',
184
+ joinedAt: new Date().toISOString(),
185
+ lastActivity: new Date().toISOString(),
186
+ color: user.color
187
+ });
188
+ }
189
+ }
190
+ break;
191
+ }
192
+ case 'user_left': {
193
+ const userId = event.userId;
194
+ const agent = agentsStore.getAgent(userId);
195
+ if (agent) {
196
+ agentsStore.removeAgent(userId);
197
+ }
198
+ break;
199
+ }
200
+ case 'cursor_moved': {
201
+ // Convert collaboration cursor to agent cursor if from AI
202
+ const cursor = event.cursor;
203
+ const user = collabStore.getUsers().find((u) => u.id === cursor.userId);
204
+ if (user?.isAI) {
205
+ const agent = agentsStore.getAgent(cursor.userId);
206
+ if (agent) {
207
+ agentsStore.updateCursor({
208
+ agentId: cursor.userId,
209
+ agent,
210
+ filePath: config?.workspaceId ?? '', // Would need actual file path
211
+ position: cursor.position,
212
+ lastUpdate: new Date().toISOString()
213
+ });
214
+ }
215
+ }
216
+ break;
217
+ }
218
+ }
219
+ }
220
+ // ============================================================================
221
+ // Agent Cursor Sync
222
+ // ============================================================================
223
+ /**
224
+ * Update agent cursor position (called from editor)
225
+ */
226
+ export function updateAgentCursorPosition(agentId, filePath, position, selection) {
227
+ const agent = agentsStore.getAgent(agentId);
228
+ if (!agent)
229
+ return;
230
+ const cursor = {
231
+ agentId,
232
+ agent,
233
+ filePath,
234
+ position,
235
+ selection,
236
+ lastUpdate: new Date().toISOString()
237
+ };
238
+ agentsStore.updateCursor(cursor);
239
+ // Also update collaboration cursors
240
+ if (config?.enableCollaboration) {
241
+ collabStore.updateCursor({
242
+ userId: agentId,
243
+ user: {
244
+ id: agent.id,
245
+ name: agent.name,
246
+ isAI: true,
247
+ color: agent.color ?? 'var(--ide-collab-ai)'
248
+ },
249
+ position,
250
+ selection: selection
251
+ ? {
252
+ anchor: selection.start,
253
+ head: selection.end
254
+ }
255
+ : undefined,
256
+ lastActivity: new Date()
257
+ });
258
+ }
259
+ }
260
+ // ============================================================================
261
+ // Lock Coordination
262
+ // ============================================================================
263
+ /**
264
+ * Acquire lock with agent awareness
265
+ */
266
+ export async function acquireLockWithContext(filePath, purpose) {
267
+ const lock = await vfsStore.acquireLock(filePath, purpose);
268
+ if (lock) {
269
+ // Notify collaboration that we're editing this file
270
+ if (config?.enableCollaboration) {
271
+ collabStore.setLocalAwareness({
272
+ editingFile: filePath,
273
+ state: 'active'
274
+ });
275
+ }
276
+ }
277
+ return lock;
278
+ }
279
+ /**
280
+ * Release lock with cleanup
281
+ */
282
+ export async function releaseLockWithContext(filePath) {
283
+ await vfsStore.releaseLock(filePath);
284
+ // Update awareness
285
+ if (config?.enableCollaboration) {
286
+ collabStore.setLocalAwareness({
287
+ editingFile: undefined,
288
+ state: 'idle'
289
+ });
290
+ }
291
+ }
292
+ /**
293
+ * Check if file can be edited (not locked by others)
294
+ */
295
+ export function canEditFile(filePath) {
296
+ const lockStatus = vfsStore.getLockStatus(filePath);
297
+ if (lockStatus.status === 'unlocked')
298
+ return true;
299
+ if (lockStatus.status === 'locked') {
300
+ return lockStatus.lock.holder === config?.userId;
301
+ }
302
+ return false;
303
+ }
304
+ /**
305
+ * Get agents currently editing a file
306
+ */
307
+ export function getFileEditors(filePath) {
308
+ return agentsStore.getAgentsWorkingOnFile(filePath);
309
+ }
310
+ // ============================================================================
311
+ // Context Getters
312
+ // ============================================================================
313
+ /**
314
+ * Get current IDE context
315
+ */
316
+ export function getContext() {
317
+ if (!config)
318
+ return null;
319
+ return {
320
+ workspaceId: config.workspaceId,
321
+ userId: config.userId,
322
+ userName: config.userName,
323
+ connected: vfsStore.getConnected() && collabStore.getIsConnected(),
324
+ synced: collabStore.getSynced()
325
+ };
326
+ }
327
+ /**
328
+ * Get all online agents
329
+ */
330
+ export function getOnlineAgents() {
331
+ return agentsStore.getOnlineAgents();
332
+ }
333
+ /**
334
+ * Get all locks
335
+ */
336
+ export function getAllLocks() {
337
+ return vfsStore.getLocks();
338
+ }
339
+ /**
340
+ * Get lock for specific file
341
+ */
342
+ export function getFileLock(filePath) {
343
+ return vfsStore.getLock(filePath);
344
+ }
345
+ // ============================================================================
346
+ // Cleanup
347
+ // ============================================================================
348
+ /**
349
+ * Cleanup all subscriptions and reset state
350
+ */
351
+ export function cleanup() {
352
+ // Unsubscribe all
353
+ subscriptions.forEach((unsub) => unsub());
354
+ subscriptions = [];
355
+ // Reset stores
356
+ vfsStore.reset();
357
+ agentsStore.reset();
358
+ collabStore.reset();
359
+ config = null;
360
+ initialized = false;
361
+ }
362
+ /**
363
+ * Check if integration is initialized
364
+ */
365
+ export function isInitialized() {
366
+ return initialized;
367
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * LSP WebSocket Client
3
+ * Communicates with a language server via WebSocket + JSON-RPC
4
+ */
5
+ import type { LSPClientConfig, LSPConnectionState, LSPClientEvents, ServerCapabilities, Position, Range, TextDocumentContentChangeEvent, CompletionItem, CompletionTriggerKind, Hover, SignatureHelp, Location, CodeAction, WorkspaceEdit, FormattingOptions, TextEdit, Diagnostic } from '../types/lsp';
6
+ export declare class LSPClient {
7
+ private config;
8
+ private ws;
9
+ private requestId;
10
+ private pendingRequests;
11
+ private notificationHandlers;
12
+ private _state;
13
+ private _capabilities;
14
+ private reconnectAttempts;
15
+ private reconnectTimeout;
16
+ private openDocuments;
17
+ private diagnosticsCache;
18
+ private eventHandlers;
19
+ constructor(config: LSPClientConfig);
20
+ get state(): LSPConnectionState;
21
+ get capabilities(): ServerCapabilities | null;
22
+ get isReady(): boolean;
23
+ /**
24
+ * Dispatch an event to every subscriber registered via on(). Iterates a copy
25
+ * so a handler that unsubscribes during dispatch cannot corrupt iteration,
26
+ * and isolates handler errors so one failure does not block the others.
27
+ */
28
+ private emitEvent;
29
+ private setState;
30
+ connect(): Promise<void>;
31
+ private handleDisconnect;
32
+ disconnect(): Promise<void>;
33
+ private initialize;
34
+ private handleMessage;
35
+ private sendRequest;
36
+ private sendNotification;
37
+ onNotification(method: string, handler: (params: unknown) => void): () => void;
38
+ on<K extends keyof LSPClientEvents>(event: K, handler: LSPClientEvents[K]): () => void;
39
+ didOpen(uri: string, languageId: string, version: number, text: string): void;
40
+ didChange(uri: string, version: number, changes: TextDocumentContentChangeEvent[]): void;
41
+ didSave(uri: string, text?: string): void;
42
+ didClose(uri: string): void;
43
+ completion(uri: string, position: Position, triggerKind?: CompletionTriggerKind, triggerCharacter?: string): Promise<CompletionItem[]>;
44
+ completionResolve(item: CompletionItem): Promise<CompletionItem>;
45
+ hover(uri: string, position: Position): Promise<Hover | null>;
46
+ signatureHelp(uri: string, position: Position, triggerCharacter?: string): Promise<SignatureHelp | null>;
47
+ definition(uri: string, position: Position): Promise<Location[]>;
48
+ typeDefinition(uri: string, position: Position): Promise<Location[]>;
49
+ references(uri: string, position: Position, includeDeclaration?: boolean): Promise<Location[]>;
50
+ codeAction(uri: string, range: Range, diagnostics?: Diagnostic[]): Promise<CodeAction[]>;
51
+ prepareRename(uri: string, position: Position): Promise<Range | {
52
+ range: Range;
53
+ placeholder: string;
54
+ } | null>;
55
+ rename(uri: string, position: Position, newName: string): Promise<WorkspaceEdit | null>;
56
+ formatting(uri: string, options?: Partial<FormattingOptions>): Promise<TextEdit[]>;
57
+ getDiagnostics(uri: string): Diagnostic[];
58
+ getAllDiagnostics(): Map<string, Diagnostic[]>;
59
+ getCompletionTriggerCharacters(): string[];
60
+ getSignatureHelpTriggerCharacters(): string[];
61
+ supportsFeature(feature: keyof ServerCapabilities): boolean;
62
+ }
63
+ export declare function createLSPClient(config: LSPClientConfig): LSPClient;
64
+ export declare function positionToOffset(content: string, position: Position): number;
65
+ export declare function offsetToPosition(content: string, offset: number): Position;
66
+ export declare function rangeToOffsets(content: string, range: Range): {
67
+ start: number;
68
+ end: number;
69
+ };