@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,383 @@
1
+ /**
2
+ * AI store using Svelte 5 runes
3
+ * Manages AI conversations, messages, and tools
4
+ *
5
+ * Note: Svelte 5 modules cannot directly export $derived values.
6
+ * We use getter functions to expose reactive derived state.
7
+ */
8
+ // Default configuration
9
+ const defaultConfig = {
10
+ endpoint: '/api/chat',
11
+ model: 'claude-3-5-sonnet',
12
+ systemPrompt: 'You are a helpful coding assistant integrated into an IDE.',
13
+ tools: [],
14
+ maxTokens: 4096,
15
+ temperature: 0.7,
16
+ streaming: true
17
+ };
18
+ // Reactive state
19
+ let state = $state({
20
+ conversations: [],
21
+ activeConversationId: null,
22
+ tools: new Map(),
23
+ config: { ...defaultConfig },
24
+ editSessions: [],
25
+ suggestions: [],
26
+ isStreaming: false,
27
+ isPanelOpen: false,
28
+ error: null
29
+ });
30
+ // Getter functions for derived values (Svelte 5 module-safe)
31
+ export function getConversations() {
32
+ return state.conversations;
33
+ }
34
+ export function getActiveConversationId() {
35
+ return state.activeConversationId;
36
+ }
37
+ export function getActiveConversation() {
38
+ return state.conversations.find((c) => c.id === state.activeConversationId) ?? null;
39
+ }
40
+ export function getMessages() {
41
+ const active = getActiveConversation();
42
+ return active?.messages ?? [];
43
+ }
44
+ export function getTools() {
45
+ return Array.from(state.tools.values());
46
+ }
47
+ export function getConfig() {
48
+ return state.config;
49
+ }
50
+ export function getEditSessions() {
51
+ return state.editSessions;
52
+ }
53
+ export function getActiveEditSessions() {
54
+ return state.editSessions.filter((s) => s.status === 'editing');
55
+ }
56
+ export function getSuggestions() {
57
+ return state.suggestions;
58
+ }
59
+ export function getIsStreaming() {
60
+ return state.isStreaming;
61
+ }
62
+ export function getIsPanelOpen() {
63
+ return state.isPanelOpen;
64
+ }
65
+ export function getError() {
66
+ return state.error;
67
+ }
68
+ // Legacy aliases for backward compatibility
69
+ export const conversations = { get current() { return getConversations(); } };
70
+ export const activeConversationId = { get current() { return getActiveConversationId(); } };
71
+ export const activeConversation = { get current() { return getActiveConversation(); } };
72
+ export const messages = { get current() { return getMessages(); } };
73
+ export const tools = { get current() { return getTools(); } };
74
+ export const config = { get current() { return getConfig(); } };
75
+ export const editSessions = { get current() { return getEditSessions(); } };
76
+ export const activeEditSessions = { get current() { return getActiveEditSessions(); } };
77
+ export const suggestions = { get current() { return getSuggestions(); } };
78
+ export const isStreaming = { get current() { return getIsStreaming(); } };
79
+ export const isPanelOpen = { get current() { return getIsPanelOpen(); } };
80
+ export const error = { get current() { return getError(); } };
81
+ /**
82
+ * Create a new conversation
83
+ */
84
+ export function createConversation(title, context) {
85
+ const id = crypto.randomUUID();
86
+ const conversation = {
87
+ id,
88
+ title: title ?? 'New conversation',
89
+ messages: [],
90
+ createdAt: new Date(),
91
+ updatedAt: new Date(),
92
+ context
93
+ };
94
+ state.conversations = [...state.conversations, conversation];
95
+ state.activeConversationId = id;
96
+ return id;
97
+ }
98
+ /**
99
+ * Set active conversation
100
+ */
101
+ export function setActiveConversation(conversationId) {
102
+ if (conversationId === null || state.conversations.some((c) => c.id === conversationId)) {
103
+ state.activeConversationId = conversationId;
104
+ }
105
+ }
106
+ /**
107
+ * Delete a conversation
108
+ */
109
+ export function deleteConversation(conversationId) {
110
+ state.conversations = state.conversations.filter((c) => c.id !== conversationId);
111
+ if (state.activeConversationId === conversationId) {
112
+ state.activeConversationId = state.conversations[0]?.id ?? null;
113
+ }
114
+ }
115
+ /**
116
+ * Add a message to the active conversation
117
+ */
118
+ export function addMessage(message) {
119
+ if (!state.activeConversationId) {
120
+ createConversation();
121
+ }
122
+ const id = crypto.randomUUID();
123
+ const newMessage = {
124
+ ...message,
125
+ id,
126
+ timestamp: new Date()
127
+ };
128
+ state.conversations = state.conversations.map((c) => c.id === state.activeConversationId
129
+ ? { ...c, messages: [...c.messages, newMessage], updatedAt: new Date() }
130
+ : c);
131
+ return id;
132
+ }
133
+ /**
134
+ * Update a message (for streaming)
135
+ */
136
+ export function updateMessage(messageId, updates) {
137
+ state.conversations = state.conversations.map((c) => c.id === state.activeConversationId
138
+ ? {
139
+ ...c,
140
+ messages: c.messages.map((m) => (m.id === messageId ? { ...m, ...updates } : m)),
141
+ updatedAt: new Date()
142
+ }
143
+ : c);
144
+ }
145
+ /**
146
+ * Send a user message and get AI response
147
+ */
148
+ export async function sendMessage(content, context) {
149
+ if (!content.trim())
150
+ return;
151
+ // Add user message
152
+ addMessage({ role: 'user', content });
153
+ // Create placeholder for assistant response
154
+ const assistantId = addMessage({
155
+ role: 'assistant',
156
+ content: '',
157
+ isStreaming: true
158
+ });
159
+ state.isStreaming = true;
160
+ state.error = null;
161
+ try {
162
+ const activeConv = getActiveConversation();
163
+ const response = await fetch(state.config.endpoint ?? '/api/chat', {
164
+ method: 'POST',
165
+ headers: {
166
+ 'Content-Type': 'application/json',
167
+ ...state.config.headers
168
+ },
169
+ body: JSON.stringify({
170
+ messages: activeConv?.messages.slice(0, -1) ?? [],
171
+ model: state.config.model,
172
+ systemPrompt: state.config.systemPrompt,
173
+ tools: Array.from(state.tools.values()).map((t) => ({
174
+ name: t.name,
175
+ description: t.description,
176
+ parameters: t.parameters
177
+ })),
178
+ maxTokens: state.config.maxTokens,
179
+ temperature: state.config.temperature,
180
+ context: context ?? activeConv?.context
181
+ })
182
+ });
183
+ if (!response.ok) {
184
+ throw new Error(`API error: ${response.status}`);
185
+ }
186
+ if (state.config.streaming && response.body) {
187
+ const reader = response.body.getReader();
188
+ const decoder = new TextDecoder();
189
+ let fullContent = '';
190
+ while (true) {
191
+ const { done, value } = await reader.read();
192
+ if (done)
193
+ break;
194
+ const chunk = decoder.decode(value);
195
+ fullContent += chunk;
196
+ updateMessage(assistantId, {
197
+ content: fullContent,
198
+ isStreaming: true
199
+ });
200
+ }
201
+ updateMessage(assistantId, {
202
+ content: fullContent,
203
+ isStreaming: false
204
+ });
205
+ }
206
+ else {
207
+ const data = await response.json();
208
+ updateMessage(assistantId, {
209
+ content: data.content,
210
+ toolCalls: data.toolCalls,
211
+ isStreaming: false,
212
+ metadata: data.metadata
213
+ });
214
+ // Handle tool calls
215
+ if (data.toolCalls?.length) {
216
+ for (const toolCall of data.toolCalls) {
217
+ await executeToolCall(toolCall.name, toolCall.arguments, toolCall.id);
218
+ }
219
+ }
220
+ }
221
+ }
222
+ catch (err) {
223
+ const errorMessage = err instanceof Error ? err.message : 'Unknown error';
224
+ state.error = errorMessage;
225
+ updateMessage(assistantId, {
226
+ content: '',
227
+ error: errorMessage,
228
+ isStreaming: false
229
+ });
230
+ }
231
+ finally {
232
+ state.isStreaming = false;
233
+ }
234
+ }
235
+ /**
236
+ * Execute a tool call
237
+ */
238
+ async function executeToolCall(toolName, args, toolCallId) {
239
+ const tool = state.tools.get(toolName);
240
+ if (!tool) {
241
+ addMessage({
242
+ role: 'tool',
243
+ content: '',
244
+ toolResult: {
245
+ toolCallId,
246
+ result: null,
247
+ error: `Tool not found: ${toolName}`
248
+ }
249
+ });
250
+ return;
251
+ }
252
+ try {
253
+ const activeConv = getActiveConversation();
254
+ const result = await tool.handler(args, activeConv?.context ?? {});
255
+ addMessage({
256
+ role: 'tool',
257
+ content: '',
258
+ toolResult: {
259
+ toolCallId,
260
+ result
261
+ }
262
+ });
263
+ }
264
+ catch (err) {
265
+ addMessage({
266
+ role: 'tool',
267
+ content: '',
268
+ toolResult: {
269
+ toolCallId,
270
+ result: null,
271
+ error: err instanceof Error ? err.message : 'Tool execution failed'
272
+ }
273
+ });
274
+ }
275
+ }
276
+ /**
277
+ * Register a tool
278
+ */
279
+ export function registerTool(tool) {
280
+ state.tools.set(tool.name, tool);
281
+ }
282
+ /**
283
+ * Unregister a tool
284
+ */
285
+ export function unregisterTool(toolName) {
286
+ state.tools.delete(toolName);
287
+ }
288
+ /**
289
+ * Update AI configuration
290
+ */
291
+ export function updateConfig(updates) {
292
+ state.config = { ...state.config, ...updates };
293
+ }
294
+ /**
295
+ * Toggle AI panel visibility
296
+ */
297
+ export function togglePanel() {
298
+ state.isPanelOpen = !state.isPanelOpen;
299
+ }
300
+ /**
301
+ * Open AI panel
302
+ */
303
+ export function openPanel() {
304
+ state.isPanelOpen = true;
305
+ }
306
+ /**
307
+ * Close AI panel
308
+ */
309
+ export function closePanel() {
310
+ state.isPanelOpen = false;
311
+ }
312
+ /**
313
+ * Start an AI edit session
314
+ */
315
+ export function startEditSession(conversationId, filePath, originalContent) {
316
+ const id = crypto.randomUUID();
317
+ const session = {
318
+ id,
319
+ conversationId,
320
+ filePath,
321
+ status: 'pending',
322
+ originalContent,
323
+ startedAt: new Date()
324
+ };
325
+ state.editSessions = [...state.editSessions, session];
326
+ return id;
327
+ }
328
+ /**
329
+ * Update edit session status
330
+ */
331
+ export function updateEditSession(sessionId, updates) {
332
+ state.editSessions = state.editSessions.map((s) => s.id === sessionId ? { ...s, ...updates } : s);
333
+ }
334
+ /**
335
+ * Complete an edit session
336
+ */
337
+ export function completeEditSession(sessionId, proposedContent, diff) {
338
+ state.editSessions = state.editSessions.map((s) => s.id === sessionId
339
+ ? { ...s, status: 'reviewing', proposedContent, diff, completedAt: new Date() }
340
+ : s);
341
+ }
342
+ /**
343
+ * Apply or reject an edit session
344
+ */
345
+ export function resolveEditSession(sessionId, apply) {
346
+ state.editSessions = state.editSessions.map((s) => s.id === sessionId ? { ...s, status: apply ? 'applied' : 'rejected' } : s);
347
+ }
348
+ /**
349
+ * Add a suggestion
350
+ */
351
+ export function addSuggestion(suggestion) {
352
+ const id = crypto.randomUUID();
353
+ state.suggestions = [...state.suggestions, { ...suggestion, id }];
354
+ return id;
355
+ }
356
+ /**
357
+ * Remove a suggestion
358
+ */
359
+ export function removeSuggestion(suggestionId) {
360
+ state.suggestions = state.suggestions.filter((s) => s.id !== suggestionId);
361
+ }
362
+ /**
363
+ * Clear all suggestions
364
+ */
365
+ export function clearSuggestions() {
366
+ state.suggestions = [];
367
+ }
368
+ /**
369
+ * Update conversation context
370
+ */
371
+ export function updateContext(context) {
372
+ if (!state.activeConversationId)
373
+ return;
374
+ state.conversations = state.conversations.map((c) => c.id === state.activeConversationId
375
+ ? { ...c, context: { ...c.context, ...context }, updatedAt: new Date() }
376
+ : c);
377
+ }
378
+ /**
379
+ * Clear error state
380
+ */
381
+ export function clearError() {
382
+ state.error = null;
383
+ }
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Collaboration store using Svelte 5 runes
3
+ * Manages CRDT-based real-time collaboration
4
+ *
5
+ * Note: Svelte 5 modules cannot directly export $derived values.
6
+ * We use getter functions to expose reactive derived state.
7
+ */
8
+ import type { CollaborationConfig, CollaborationState, CollaborationUser, CollaboratorCursor, CollaboratorAwareness, AICollaborationSession, AIProposedChange, DocumentSnapshot, CollaborationEventHandler } from '../types';
9
+ export declare function getConfig(): CollaborationConfig | null;
10
+ export declare function getStatus(): CollaborationState['status'];
11
+ export declare function getError(): string | null;
12
+ export declare function getSynced(): boolean;
13
+ export declare function getUsers(): CollaborationUser[];
14
+ export declare function getCursors(): CollaboratorCursor[];
15
+ export declare function getAwareness(): CollaboratorAwareness[];
16
+ export declare function getAISessions(): AICollaborationSession[];
17
+ export declare function getActiveAISessions(): AICollaborationSession[];
18
+ export declare function getPendingChanges(): AIProposedChange[];
19
+ export declare function getSnapshots(): DocumentSnapshot[];
20
+ export declare function getLocalUser(): CollaborationUser | null;
21
+ export declare function getIsConnected(): boolean;
22
+ export declare function getOtherUsers(): CollaborationUser[];
23
+ export declare const config: {
24
+ readonly current: CollaborationConfig | null;
25
+ };
26
+ export declare const status: {
27
+ readonly current: "error" | "connected" | "disconnected" | "connecting";
28
+ };
29
+ export declare const error: {
30
+ readonly current: string | null;
31
+ };
32
+ export declare const synced: {
33
+ readonly current: boolean;
34
+ };
35
+ export declare const users: {
36
+ readonly current: CollaborationUser[];
37
+ };
38
+ export declare const cursors: {
39
+ readonly current: CollaboratorCursor[];
40
+ };
41
+ export declare const awareness: {
42
+ readonly current: CollaboratorAwareness[];
43
+ };
44
+ export declare const aiSessions: {
45
+ readonly current: AICollaborationSession[];
46
+ };
47
+ export declare const activeAISessions: {
48
+ readonly current: AICollaborationSession[];
49
+ };
50
+ export declare const pendingChanges: {
51
+ readonly current: AIProposedChange[];
52
+ };
53
+ export declare const snapshots: {
54
+ readonly current: DocumentSnapshot[];
55
+ };
56
+ export declare const localUser: {
57
+ readonly current: CollaborationUser | null;
58
+ };
59
+ export declare const isConnected: {
60
+ readonly current: boolean;
61
+ };
62
+ export declare const otherUsers: {
63
+ readonly current: CollaborationUser[];
64
+ };
65
+ /**
66
+ * Initialize collaboration with config
67
+ */
68
+ export declare function initialize(collabConfig: CollaborationConfig): void;
69
+ /**
70
+ * Set connection status
71
+ */
72
+ export declare function setStatus(newStatus: CollaborationState['status'], errorMsg?: string): void;
73
+ /**
74
+ * Set synced state
75
+ */
76
+ export declare function setSynced(syncedState: boolean): void;
77
+ /**
78
+ * Add a user to the session
79
+ */
80
+ export declare function addUser(user: CollaborationUser): void;
81
+ /**
82
+ * Remove a user from the session
83
+ */
84
+ export declare function removeUser(userId: string): void;
85
+ /**
86
+ * Update cursor position for a user
87
+ */
88
+ export declare function updateCursor(cursor: CollaboratorCursor): void;
89
+ /**
90
+ * Update awareness for a user
91
+ */
92
+ export declare function updateAwareness(awarenessData: CollaboratorAwareness): void;
93
+ /**
94
+ * Update local user's cursor
95
+ */
96
+ export declare function setLocalCursor(position: {
97
+ line: number;
98
+ column: number;
99
+ }, selection?: {
100
+ anchor: {
101
+ line: number;
102
+ column: number;
103
+ };
104
+ head: {
105
+ line: number;
106
+ column: number;
107
+ };
108
+ }): void;
109
+ /**
110
+ * Update local user's awareness
111
+ */
112
+ export declare function setLocalAwareness(updates: Partial<Omit<CollaboratorAwareness, 'userId' | 'user'>>): void;
113
+ /**
114
+ * Start an AI collaboration session
115
+ */
116
+ export declare function startAISession(documentId: string, aiUser: CollaborationUser): string;
117
+ /**
118
+ * Update AI session status
119
+ */
120
+ export declare function updateAISession(sessionId: string, updates: Partial<AICollaborationSession>): void;
121
+ /**
122
+ * Set current task for AI session
123
+ */
124
+ export declare function setAITask(sessionId: string, task: string): void;
125
+ /**
126
+ * Propose a change from AI
127
+ */
128
+ export declare function proposeAIChange(sessionId: string, change: Omit<AIProposedChange, 'id' | 'sessionId' | 'status'>): string;
129
+ /**
130
+ * Review an AI proposed change
131
+ */
132
+ export declare function reviewAIChange(changeId: string, approved: boolean, reviewerId: string): void;
133
+ /**
134
+ * Complete an AI session
135
+ */
136
+ export declare function completeAISession(sessionId: string): void;
137
+ /**
138
+ * Cancel an AI session
139
+ */
140
+ export declare function cancelAISession(sessionId: string): void;
141
+ /**
142
+ * Create a document snapshot
143
+ */
144
+ export declare function createSnapshot(documentId: string, content: string, reason?: DocumentSnapshot['reason']): string;
145
+ /**
146
+ * Get snapshots for a document
147
+ */
148
+ export declare function getDocumentSnapshots(documentId: string): DocumentSnapshot[];
149
+ /**
150
+ * Subscribe to collaboration events
151
+ */
152
+ export declare function onEvent(handler: CollaborationEventHandler): () => void;
153
+ /**
154
+ * Disconnect and cleanup
155
+ */
156
+ export declare function disconnect(): void;
157
+ /**
158
+ * Reset collaboration state
159
+ */
160
+ export declare function reset(): void;
161
+ /**
162
+ * Get user color by index
163
+ */
164
+ export declare function getUserColor(index: number): string;