@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,459 @@
1
+ /**
2
+ * Agents store using Svelte 5 runes
3
+ * Manages multi-agent coordination and activity tracking
4
+ *
5
+ * Note: Svelte 5 modules cannot directly export $derived values.
6
+ * We use getter functions to expose reactive derived state.
7
+ */
8
+ let state = $state({
9
+ agents: new Map(),
10
+ events: [],
11
+ maxEvents: 200,
12
+ activities: [],
13
+ maxActivities: 500,
14
+ cursors: new Map(),
15
+ selectedAgentId: null,
16
+ filter: 'all',
17
+ connected: false,
18
+ error: null
19
+ });
20
+ // Event handlers
21
+ const eventHandlers = new Map();
22
+ // ============================================================================
23
+ // Getter Functions (Svelte 5 module-safe)
24
+ // ============================================================================
25
+ export function getAgents() {
26
+ return Array.from(state.agents.values());
27
+ }
28
+ export function getAgent(agentId) {
29
+ return state.agents.get(agentId);
30
+ }
31
+ export function getOnlineAgents() {
32
+ return getAgents().filter((a) => a.status === 'online' || a.status === 'busy');
33
+ }
34
+ export function getOfflineAgents() {
35
+ return getAgents().filter((a) => a.status === 'offline');
36
+ }
37
+ export function getBusyAgents() {
38
+ return getAgents().filter((a) => a.status === 'busy');
39
+ }
40
+ export function getStalledAgents() {
41
+ return getAgents().filter((a) => a.status === 'stalled');
42
+ }
43
+ export function getAgentsByType(type) {
44
+ return getAgents().filter((a) => a.type === type);
45
+ }
46
+ export function getAgentsWorkingOnFile(filePath) {
47
+ return getAgents().filter((a) => a.currentTask?.files.includes(filePath));
48
+ }
49
+ export function getEvents() {
50
+ return state.events;
51
+ }
52
+ export function getActivities() {
53
+ return state.activities;
54
+ }
55
+ export function getActivitiesForAgent(agentId) {
56
+ return state.activities.filter((a) => a.agentId === agentId);
57
+ }
58
+ export function getRecentActivities(count) {
59
+ return state.activities.slice(0, count);
60
+ }
61
+ export function getCursors() {
62
+ return Array.from(state.cursors.values());
63
+ }
64
+ export function getCursor(agentId) {
65
+ return state.cursors.get(agentId);
66
+ }
67
+ export function getCursorsForFile(filePath) {
68
+ return getCursors().filter((c) => c.filePath === filePath);
69
+ }
70
+ export function getSelectedAgent() {
71
+ return state.selectedAgentId ? state.agents.get(state.selectedAgentId) : undefined;
72
+ }
73
+ export function getFilter() {
74
+ return state.filter;
75
+ }
76
+ export function getConnected() {
77
+ return state.connected;
78
+ }
79
+ export function getError() {
80
+ return state.error;
81
+ }
82
+ // Derived getters
83
+ export function getFilteredAgents() {
84
+ if (state.filter === 'all')
85
+ return getAgents();
86
+ return getAgents().filter((a) => a.status === state.filter);
87
+ }
88
+ export function getActiveTasksCount() {
89
+ return getAgents().filter((a) => a.currentTask !== undefined).length;
90
+ }
91
+ export function getTotalProgress() {
92
+ const agents = getBusyAgents();
93
+ if (agents.length === 0)
94
+ return 0;
95
+ const total = agents.reduce((sum, a) => {
96
+ return sum + (a.currentTask?.progress.percentage ?? 0);
97
+ }, 0);
98
+ return Math.round(total / agents.length);
99
+ }
100
+ export function getAgentCount() {
101
+ return state.agents.size;
102
+ }
103
+ export function getOnlineCount() {
104
+ return getOnlineAgents().length;
105
+ }
106
+ // Legacy aliases for backward compatibility
107
+ export const agents = { get current() { return getAgents(); } };
108
+ export const onlineAgents = { get current() { return getOnlineAgents(); } };
109
+ export const busyAgents = { get current() { return getBusyAgents(); } };
110
+ export const events = { get current() { return getEvents(); } };
111
+ export const activities = { get current() { return getActivities(); } };
112
+ export const cursors = { get current() { return getCursors(); } };
113
+ export const selectedAgent = { get current() { return getSelectedAgent(); } };
114
+ export const filter = { get current() { return getFilter(); } };
115
+ export const connected = { get current() { return getConnected(); } };
116
+ export const error = { get current() { return getError(); } };
117
+ // ============================================================================
118
+ // Agent Operations
119
+ // ============================================================================
120
+ export function addAgent(agent) {
121
+ state.agents.set(agent.id, agent);
122
+ // Create activity
123
+ addActivity({
124
+ id: crypto.randomUUID(),
125
+ agentId: agent.id,
126
+ agent,
127
+ timestamp: new Date().toISOString(),
128
+ type: 'milestone',
129
+ content: `${agent.name} joined the workspace`,
130
+ metadata: { severity: 'info' }
131
+ });
132
+ }
133
+ export function removeAgent(agentId) {
134
+ const agent = state.agents.get(agentId);
135
+ if (!agent)
136
+ return;
137
+ state.agents.delete(agentId);
138
+ state.cursors.delete(agentId);
139
+ // Create activity
140
+ addActivity({
141
+ id: crypto.randomUUID(),
142
+ agentId,
143
+ agent,
144
+ timestamp: new Date().toISOString(),
145
+ type: 'milestone',
146
+ content: `${agent.name} left the workspace`,
147
+ metadata: { severity: 'info' }
148
+ });
149
+ }
150
+ export function updateAgent(agentId, updates) {
151
+ const agent = state.agents.get(agentId);
152
+ if (!agent)
153
+ return;
154
+ const updated = { ...agent, ...updates, lastActivity: new Date().toISOString() };
155
+ state.agents.set(agentId, updated);
156
+ }
157
+ export function setAgentStatus(agentId, status) {
158
+ updateAgent(agentId, { status });
159
+ }
160
+ export function setAgentTask(agentId, task) {
161
+ updateAgent(agentId, { currentTask: task });
162
+ if (task) {
163
+ const agent = state.agents.get(agentId);
164
+ if (agent) {
165
+ addActivity({
166
+ id: crypto.randomUUID(),
167
+ agentId,
168
+ agent,
169
+ timestamp: new Date().toISOString(),
170
+ type: 'action',
171
+ content: `Started: ${task.description}`,
172
+ metadata: { files: task.files }
173
+ });
174
+ }
175
+ }
176
+ }
177
+ export function updateAgentProgress(agentId, progress) {
178
+ const agent = state.agents.get(agentId);
179
+ if (!agent?.currentTask)
180
+ return;
181
+ const updated = {
182
+ ...agent,
183
+ lastActivity: new Date().toISOString(),
184
+ currentTask: {
185
+ ...agent.currentTask,
186
+ progress: {
187
+ ...agent.currentTask.progress,
188
+ ...progress,
189
+ lastUpdate: new Date().toISOString()
190
+ }
191
+ }
192
+ };
193
+ state.agents.set(agentId, updated);
194
+ }
195
+ export function completeAgentTask(agentId, result, summary) {
196
+ const agent = state.agents.get(agentId);
197
+ if (!agent?.currentTask)
198
+ return;
199
+ // Add completion activity
200
+ addActivity({
201
+ id: crypto.randomUUID(),
202
+ agentId,
203
+ agent,
204
+ timestamp: new Date().toISOString(),
205
+ type: 'milestone',
206
+ content: summary,
207
+ metadata: {
208
+ severity: result === 'success' ? 'success' : result === 'failure' ? 'error' : 'warning',
209
+ files: agent.currentTask.files
210
+ }
211
+ });
212
+ // Clear task and set status
213
+ updateAgent(agentId, {
214
+ currentTask: undefined,
215
+ status: 'online'
216
+ });
217
+ }
218
+ // ============================================================================
219
+ // Cursor Operations
220
+ // ============================================================================
221
+ export function updateCursor(cursor) {
222
+ state.cursors.set(cursor.agentId, cursor);
223
+ }
224
+ export function removeCursor(agentId) {
225
+ state.cursors.delete(agentId);
226
+ }
227
+ export function clearCursorsForFile(filePath) {
228
+ for (const [agentId, cursor] of state.cursors) {
229
+ if (cursor.filePath === filePath) {
230
+ state.cursors.delete(agentId);
231
+ }
232
+ }
233
+ }
234
+ // ============================================================================
235
+ // Event Operations
236
+ // ============================================================================
237
+ export function addEvent(event) {
238
+ state.events = [event, ...state.events].slice(0, state.maxEvents);
239
+ // Notify handlers
240
+ const handlers = eventHandlers.get(event.type);
241
+ if (handlers) {
242
+ handlers.forEach((handler) => handler(event));
243
+ }
244
+ const wildcardHandlers = eventHandlers.get('*');
245
+ if (wildcardHandlers) {
246
+ wildcardHandlers.forEach((handler) => handler(event));
247
+ }
248
+ // Convert to activity
249
+ eventToActivity(event);
250
+ }
251
+ export function onTeamEvent(type, handler) {
252
+ if (!eventHandlers.has(type)) {
253
+ eventHandlers.set(type, new Set());
254
+ }
255
+ eventHandlers.get(type).add(handler);
256
+ return () => {
257
+ eventHandlers.get(type)?.delete(handler);
258
+ };
259
+ }
260
+ // ============================================================================
261
+ // Activity Operations
262
+ // ============================================================================
263
+ export function addActivity(activity) {
264
+ state.activities = [activity, ...state.activities].slice(0, state.maxActivities);
265
+ }
266
+ function eventToActivity(event) {
267
+ let content;
268
+ let type = 'action';
269
+ let metadata = {};
270
+ switch (event.type) {
271
+ case 'work_started':
272
+ content = `Started: ${event.task.description}`;
273
+ type = 'milestone';
274
+ metadata.files = event.task.files;
275
+ break;
276
+ case 'file_modified':
277
+ content = `${event.operation} ${event.path}`;
278
+ metadata.files = [event.path];
279
+ break;
280
+ case 'blocked':
281
+ content = `Blocked: ${event.reason}`;
282
+ type = 'error';
283
+ metadata.severity = 'warning';
284
+ metadata.files = event.blockedFiles;
285
+ break;
286
+ case 'conflict':
287
+ content = `Conflict on ${event.path}`;
288
+ type = 'error';
289
+ metadata.severity = 'error';
290
+ metadata.files = [event.path];
291
+ break;
292
+ case 'task_completed':
293
+ content = `Completed: ${event.task.description} (${event.result})`;
294
+ type = 'milestone';
295
+ metadata.severity = event.result === 'success' ? 'success' : 'warning';
296
+ break;
297
+ case 'agent_joined':
298
+ content = `${event.agent.name} joined`;
299
+ type = 'system';
300
+ break;
301
+ case 'agent_left':
302
+ content = `${event.agent.name} left${event.reason ? `: ${event.reason}` : ''}`;
303
+ type = 'system';
304
+ break;
305
+ case 'progress_update':
306
+ // Don't create activity for progress updates
307
+ return;
308
+ default:
309
+ return;
310
+ }
311
+ addActivity({
312
+ id: crypto.randomUUID(),
313
+ agentId: event.agentId,
314
+ agent: event.agent,
315
+ timestamp: event.timestamp,
316
+ type,
317
+ content,
318
+ metadata
319
+ });
320
+ }
321
+ // ============================================================================
322
+ // UI Operations
323
+ // ============================================================================
324
+ export function selectAgent(agentId) {
325
+ state.selectedAgentId = agentId;
326
+ }
327
+ export function setFilter(filter) {
328
+ state.filter = filter;
329
+ }
330
+ export function clearActivities() {
331
+ state.activities = [];
332
+ }
333
+ export function clearEvents() {
334
+ state.events = [];
335
+ }
336
+ // ============================================================================
337
+ // Integration with VFS Events
338
+ // ============================================================================
339
+ export function handleVFSEvent(event) {
340
+ switch (event.type) {
341
+ case 'iteration_completed': {
342
+ const iterEvent = event;
343
+ const agent = state.agents.get(iterEvent.agentId);
344
+ if (agent) {
345
+ updateAgentProgress(iterEvent.agentId, {
346
+ phase: 'complete',
347
+ percentage: 100,
348
+ filesModified: iterEvent.filesModified.length
349
+ });
350
+ addActivity({
351
+ id: crypto.randomUUID(),
352
+ agentId: iterEvent.agentId,
353
+ agent,
354
+ timestamp: iterEvent.timestamp,
355
+ type: 'milestone',
356
+ content: iterEvent.summary,
357
+ metadata: { files: iterEvent.filesModified, severity: 'success' }
358
+ });
359
+ }
360
+ break;
361
+ }
362
+ case 'gate_progress': {
363
+ const gateEvent = event;
364
+ updateAgentProgress(gateEvent.agentId, {
365
+ phase: gateEvent.gate === 'implementation'
366
+ ? 'implementing'
367
+ : gateEvent.gate === 'review'
368
+ ? 'reviewing'
369
+ : gateEvent.gate,
370
+ percentage: gateEvent.progress
371
+ });
372
+ break;
373
+ }
374
+ }
375
+ }
376
+ // ============================================================================
377
+ // Connection Status
378
+ // ============================================================================
379
+ export function setConnected(connected) {
380
+ state.connected = connected;
381
+ }
382
+ export function setError(error) {
383
+ state.error = error;
384
+ }
385
+ export function clearError() {
386
+ state.error = null;
387
+ }
388
+ // ============================================================================
389
+ // Reset
390
+ // ============================================================================
391
+ export function reset() {
392
+ state.agents.clear();
393
+ state.events = [];
394
+ state.activities = [];
395
+ state.cursors.clear();
396
+ state.selectedAgentId = null;
397
+ state.filter = 'all';
398
+ state.connected = false;
399
+ state.error = null;
400
+ }
401
+ // ============================================================================
402
+ // Mock Data (for development)
403
+ // ============================================================================
404
+ export function addMockAgents() {
405
+ const mockAgents = [
406
+ {
407
+ id: 'agent-1',
408
+ name: 'CodeBot',
409
+ type: 'coder',
410
+ status: 'busy',
411
+ capabilities: ['code_generation', 'refactoring'],
412
+ workspaceId: 'ws-1',
413
+ joinedAt: new Date().toISOString(),
414
+ lastActivity: new Date().toISOString(),
415
+ color: '#F97316',
416
+ currentTask: {
417
+ id: 'task-1',
418
+ description: 'Implementing VFS integration',
419
+ startedAt: new Date().toISOString(),
420
+ progress: {
421
+ phase: 'implementing',
422
+ percentage: 65,
423
+ tokensUsed: 12500,
424
+ stepsCompleted: 8,
425
+ totalSteps: 12,
426
+ toolCalls: 24,
427
+ filesModified: 3,
428
+ lastUpdate: new Date().toISOString()
429
+ },
430
+ files: ['src/lib/stores/vfs.svelte.ts', 'src/lib/types/vfs.ts']
431
+ }
432
+ },
433
+ {
434
+ id: 'agent-2',
435
+ name: 'ReviewBot',
436
+ type: 'reviewer',
437
+ status: 'online',
438
+ capabilities: ['code_review', 'testing'],
439
+ workspaceId: 'ws-1',
440
+ joinedAt: new Date().toISOString(),
441
+ lastActivity: new Date().toISOString(),
442
+ color: '#8B5CF6'
443
+ },
444
+ {
445
+ id: 'agent-3',
446
+ name: 'TestBot',
447
+ type: 'tester',
448
+ status: 'offline',
449
+ capabilities: ['testing', 'debugging'],
450
+ workspaceId: 'ws-1',
451
+ joinedAt: new Date(Date.now() - 3600000).toISOString(),
452
+ lastActivity: new Date(Date.now() - 300000).toISOString(),
453
+ color: '#10B981'
454
+ }
455
+ ];
456
+ for (const agent of mockAgents) {
457
+ state.agents.set(agent.id, agent);
458
+ }
459
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * AI Persistence Store
3
+ *
4
+ * Handles saving and loading AI conversations to IndexedDB/localStorage
5
+ */
6
+ import type { AIConversation } from '../types';
7
+ interface PersistenceConfig {
8
+ dbName: string;
9
+ storeName: string;
10
+ version: number;
11
+ maxConversations: number;
12
+ autoSave: boolean;
13
+ autoSaveDebounceMs: number;
14
+ }
15
+ /**
16
+ * Initialize the persistence layer
17
+ */
18
+ export declare function initPersistence(options?: Partial<PersistenceConfig>): Promise<boolean>;
19
+ /**
20
+ * Save a conversation
21
+ */
22
+ export declare function saveConversation(conversation: AIConversation & {
23
+ starred?: boolean;
24
+ }): Promise<void>;
25
+ /**
26
+ * Auto-save with debounce
27
+ */
28
+ export declare function autoSaveConversation(conversation: AIConversation): void;
29
+ /**
30
+ * Load all conversations
31
+ */
32
+ export declare function loadConversations(): Promise<AIConversation[]>;
33
+ /**
34
+ * Load a single conversation by ID
35
+ */
36
+ export declare function loadConversation(id: string): Promise<AIConversation | null>;
37
+ /**
38
+ * Delete a conversation
39
+ */
40
+ export declare function deleteConversation(id: string): Promise<void>;
41
+ /**
42
+ * Delete all conversations
43
+ */
44
+ export declare function clearAllConversations(): Promise<void>;
45
+ /**
46
+ * Search conversations
47
+ */
48
+ export declare function searchConversations(query: string): Promise<AIConversation[]>;
49
+ /**
50
+ * Get starred conversations
51
+ */
52
+ export declare function getStarredConversations(): Promise<AIConversation[]>;
53
+ /**
54
+ * Star/unstar a conversation
55
+ */
56
+ export declare function toggleStarConversation(id: string, starred: boolean): Promise<void>;
57
+ /**
58
+ * Export conversation to JSON
59
+ */
60
+ export declare function exportConversationJSON(conversation: AIConversation): string;
61
+ /**
62
+ * Export conversation to Markdown
63
+ */
64
+ export declare function exportConversationMarkdown(conversation: AIConversation): string;
65
+ /**
66
+ * Import conversation from JSON
67
+ */
68
+ export declare function importConversationJSON(json: string): Promise<AIConversation | null>;
69
+ /**
70
+ * Prune old conversations to stay under max limit
71
+ */
72
+ export declare function pruneOldConversations(): Promise<number>;
73
+ export declare function isInitialized(): boolean;
74
+ export declare function getError(): string | null;
75
+ export declare function getConfig(): PersistenceConfig;
76
+ export {};