@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,67 @@
1
+ /**
2
+ * FileExplorer - File tree navigation component
3
+ *
4
+ * Displays a hierarchical file tree with expandable folders,
5
+ * file icons, and selection support. Supports VFS lock,
6
+ * agent presence, and file change status indicators.
7
+ */
8
+ export interface FileNode {
9
+ id: string;
10
+ name: string;
11
+ type: 'file' | 'folder';
12
+ path: string;
13
+ children?: FileNode[];
14
+ expanded?: boolean;
15
+ }
16
+ /** File change status type - for transaction/git operations */
17
+ export type FileChangeStatus = 'created' | 'modified' | 'deleted' | 'renamed' | 'clean';
18
+ /** @deprecated Use FileChangeStatus instead */
19
+ export type GitFileStatus = FileChangeStatus;
20
+ import type { VFSLockStatus, Agent } from '../../types';
21
+ interface Props {
22
+ /** Root file nodes */
23
+ files: FileNode[];
24
+ /** Currently selected file path */
25
+ selectedPath?: string | null;
26
+ /** Current user ID for lock ownership detection */
27
+ userId?: string;
28
+ /** Map of file path to lock status */
29
+ lockStatuses?: Map<string, VFSLockStatus>;
30
+ /** Map of file path to agents currently editing */
31
+ agentsByFile?: Map<string, Agent[]>;
32
+ /** Map of file path to change status (created, modified, deleted, renamed) */
33
+ fileStatuses?: Map<string, FileChangeStatus>;
34
+ /** @deprecated Use fileStatuses instead */
35
+ gitStatuses?: Map<string, FileChangeStatus>;
36
+ /** Show lock indicators */
37
+ showLocks?: boolean;
38
+ /** Show agent indicators */
39
+ showAgents?: boolean;
40
+ /** Show file change status indicators */
41
+ showFileStatus?: boolean;
42
+ /** @deprecated Use showFileStatus instead */
43
+ showGitStatus?: boolean;
44
+ /** Called when a file is selected */
45
+ onSelect?: (node: FileNode) => void;
46
+ /** Called when a file is double-clicked (open) */
47
+ onOpen?: (node: FileNode) => void;
48
+ /** Called when a folder is toggled */
49
+ onToggle?: (node: FileNode) => void;
50
+ /** Called when a new file is requested (with name from inline input) */
51
+ onNewFile?: (parentPath: string, name: string) => void;
52
+ /** Called when a new folder is requested (with name from inline input) */
53
+ onNewFolder?: (parentPath: string, name: string) => void;
54
+ /** Called when rename is requested */
55
+ onRename?: (node: FileNode) => void;
56
+ /** Called when delete is requested */
57
+ onDelete?: (node: FileNode) => void;
58
+ /** Called when lock is requested */
59
+ onLock?: (node: FileNode) => void;
60
+ /** Called when unlock is requested */
61
+ onUnlock?: (node: FileNode) => void;
62
+ /** Additional CSS class */
63
+ class?: string;
64
+ }
65
+ declare const FileExplorer: import("svelte").Component<Props, {}, "">;
66
+ type FileExplorer = ReturnType<typeof FileExplorer>;
67
+ export default FileExplorer;
@@ -0,0 +1,110 @@
1
+ <script lang="ts">
2
+ import { getExtension } from '../../utils/language';
3
+
4
+ interface Props {
5
+ filename: string;
6
+ isDirectory?: boolean;
7
+ expanded?: boolean;
8
+ size?: number;
9
+ class?: string;
10
+ }
11
+
12
+ let {
13
+ filename,
14
+ isDirectory = false,
15
+ expanded = false,
16
+ size = 16,
17
+ class: className = ''
18
+ }: Props = $props();
19
+
20
+ // Color mapping for file types
21
+ const extensionColors: Record<string, string> = {
22
+ // JavaScript/TypeScript
23
+ js: '#f7df1e',
24
+ mjs: '#f7df1e',
25
+ jsx: '#61dafb',
26
+ ts: '#3178c6',
27
+ tsx: '#3178c6',
28
+
29
+ // Web
30
+ html: '#e34c26',
31
+ css: '#1572b6',
32
+ scss: '#cc6699',
33
+ sass: '#cc6699',
34
+ less: '#1d365d',
35
+
36
+ // Data
37
+ json: '#cbcb41',
38
+ yaml: '#cb171e',
39
+ yml: '#cb171e',
40
+ xml: '#0060ac',
41
+ toml: '#9c4121',
42
+
43
+ // Markdown
44
+ md: '#083fa1',
45
+ mdx: '#1b1f24',
46
+
47
+ // Languages
48
+ py: '#3572a5',
49
+ go: '#00add8',
50
+ rs: '#dea584',
51
+ java: '#b07219',
52
+ kt: '#a97bff',
53
+ c: '#555555',
54
+ cpp: '#f34b7d',
55
+ cs: '#178600',
56
+ rb: '#701516',
57
+ php: '#4f5d95',
58
+ swift: '#f05138',
59
+
60
+ // Shell
61
+ sh: '#89e051',
62
+ bash: '#89e051',
63
+ zsh: '#89e051',
64
+
65
+ // Config
66
+ dockerfile: '#0db7ed',
67
+ gitignore: '#f05032',
68
+ env: '#ecd53f',
69
+
70
+ // Svelte/Vue
71
+ svelte: '#ff3e00',
72
+ vue: '#42b883'
73
+ };
74
+
75
+ const ext = $derived(getExtension(filename));
76
+ const color = $derived(extensionColors[ext] ?? 'var(--ide-text-muted)');
77
+
78
+ // Simple file type icon paths
79
+ const icons = {
80
+ folder: 'M2 6a2 2 0 012-2h5l2 2h7a2 2 0 012 2v8a2 2 0 01-2 2H4a2 2 0 01-2-2V6z',
81
+ folderOpen:
82
+ 'M2 6a2 2 0 012-2h5l2 2h7a2 2 0 012 2v1H8a3 3 0 00-3 3v2.5L3.5 18A2 2 0 012 16V6z M6 12a2 2 0 012-2h12l-2 8H8a2 2 0 01-2-2v-4z',
83
+ file: 'M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8l-6-6zm-1 1.5L18.5 9H14a1 1 0 01-1-1V3.5z'
84
+ };
85
+
86
+ const iconPath = $derived(isDirectory ? (expanded ? icons.folderOpen : icons.folder) : icons.file);
87
+ const iconColor = $derived(isDirectory ? 'var(--ide-interactive)' : color);
88
+ </script>
89
+
90
+ <svg
91
+ class="file-icon {className}"
92
+ width={size}
93
+ height={size}
94
+ viewBox="0 0 24 24"
95
+ fill={isDirectory ? iconColor : 'none'}
96
+ stroke={isDirectory ? 'none' : iconColor}
97
+ stroke-width="1.5"
98
+ aria-hidden="true"
99
+ >
100
+ <path d={iconPath}></path>
101
+ {#if !isDirectory && ext}
102
+ <!-- Show extension badge for better recognition -->
103
+ {/if}
104
+ </svg>
105
+
106
+ <style>
107
+ .file-icon {
108
+ flex-shrink: 0;
109
+ }
110
+ </style>
@@ -0,0 +1,10 @@
1
+ interface Props {
2
+ filename: string;
3
+ isDirectory?: boolean;
4
+ expanded?: boolean;
5
+ size?: number;
6
+ class?: string;
7
+ }
8
+ declare const FileIcon: import("svelte").Component<Props, {}, "">;
9
+ type FileIcon = ReturnType<typeof FileIcon>;
10
+ export default FileIcon;
@@ -0,0 +1,448 @@
1
+ <script lang="ts">
2
+ import { onMount, tick } from 'svelte';
3
+
4
+ interface Props {
5
+ /** Current search query */
6
+ query?: string;
7
+ /** Current replace text */
8
+ replaceText?: string;
9
+ /** Whether to show replace controls */
10
+ showReplace?: boolean;
11
+ /** Whether search is case sensitive */
12
+ caseSensitive?: boolean;
13
+ /** Whether to use regex search */
14
+ useRegex?: boolean;
15
+ /** Total number of matches */
16
+ matchCount?: number;
17
+ /** Current match index (1-based) */
18
+ currentMatch?: number;
19
+ /** Called when query changes */
20
+ onQueryChange?: (query: string) => void;
21
+ /** Called when replace text changes */
22
+ onReplaceTextChange?: (text: string) => void;
23
+ /** Called when case sensitivity changes */
24
+ onCaseSensitiveChange?: (value: boolean) => void;
25
+ /** Called when regex mode changes */
26
+ onUseRegexChange?: (value: boolean) => void;
27
+ /** Called to find next match */
28
+ onFindNext?: () => void;
29
+ /** Called to find previous match */
30
+ onFindPrev?: () => void;
31
+ /** Called to replace current match */
32
+ onReplace?: () => void;
33
+ /** Called to replace all matches */
34
+ onReplaceAll?: () => void;
35
+ /** Called to close the find/replace bar */
36
+ onClose?: () => void;
37
+ }
38
+
39
+ let {
40
+ query = '',
41
+ replaceText = '',
42
+ showReplace = false,
43
+ caseSensitive = false,
44
+ useRegex = false,
45
+ matchCount = 0,
46
+ currentMatch = 0,
47
+ onQueryChange,
48
+ onReplaceTextChange,
49
+ onCaseSensitiveChange,
50
+ onUseRegexChange,
51
+ onFindNext,
52
+ onFindPrev,
53
+ onReplace,
54
+ onReplaceAll,
55
+ onClose
56
+ }: Props = $props();
57
+
58
+ let findInput = $state<HTMLInputElement | null>(null);
59
+ let replaceInput = $state<HTMLInputElement | null>(null);
60
+ let showReplaceLocal = $state(false);
61
+
62
+ // Sync with prop
63
+ $effect(() => {
64
+ showReplaceLocal = showReplace;
65
+ });
66
+
67
+ // Focus find input on mount
68
+ onMount(() => {
69
+ findInput?.focus();
70
+ findInput?.select();
71
+ });
72
+
73
+ function handleFindKeyDown(e: KeyboardEvent) {
74
+ if (e.key === 'Enter') {
75
+ e.preventDefault();
76
+ if (e.shiftKey) {
77
+ onFindPrev?.();
78
+ } else {
79
+ onFindNext?.();
80
+ }
81
+ } else if (e.key === 'Escape') {
82
+ e.preventDefault();
83
+ onClose?.();
84
+ } else if (e.key === 'Tab' && showReplaceLocal && !e.shiftKey) {
85
+ e.preventDefault();
86
+ replaceInput?.focus();
87
+ }
88
+ }
89
+
90
+ function handleReplaceKeyDown(e: KeyboardEvent) {
91
+ if (e.key === 'Enter') {
92
+ e.preventDefault();
93
+ if (e.shiftKey) {
94
+ onReplaceAll?.();
95
+ } else {
96
+ onReplace?.();
97
+ }
98
+ } else if (e.key === 'Escape') {
99
+ e.preventDefault();
100
+ onClose?.();
101
+ } else if (e.key === 'Tab' && e.shiftKey) {
102
+ e.preventDefault();
103
+ findInput?.focus();
104
+ }
105
+ }
106
+
107
+ function handleQueryInput(e: Event) {
108
+ const target = e.target as HTMLInputElement;
109
+ onQueryChange?.(target.value);
110
+ }
111
+
112
+ function handleReplaceInput(e: Event) {
113
+ const target = e.target as HTMLInputElement;
114
+ onReplaceTextChange?.(target.value);
115
+ }
116
+
117
+ function toggleReplace() {
118
+ showReplaceLocal = !showReplaceLocal;
119
+ if (showReplaceLocal) {
120
+ tick().then(() => replaceInput?.focus());
121
+ }
122
+ }
123
+
124
+ function toggleCaseSensitive() {
125
+ onCaseSensitiveChange?.(!caseSensitive);
126
+ }
127
+
128
+ function toggleRegex() {
129
+ onUseRegexChange?.(!useRegex);
130
+ }
131
+
132
+ /** Focus the find input and select all text */
133
+ export function focus() {
134
+ findInput?.focus();
135
+ findInput?.select();
136
+ }
137
+
138
+ /** Set the initial query */
139
+ export function setQuery(newQuery: string) {
140
+ onQueryChange?.(newQuery);
141
+ tick().then(() => {
142
+ findInput?.focus();
143
+ findInput?.select();
144
+ });
145
+ }
146
+ </script>
147
+
148
+ <div class="find-replace" role="search" aria-label="Find and replace">
149
+ <!-- Find row -->
150
+ <div class="find-replace__row">
151
+ <button
152
+ class="find-replace__toggle"
153
+ onclick={toggleReplace}
154
+ aria-label={showReplaceLocal ? 'Hide replace' : 'Show replace'}
155
+ aria-expanded={showReplaceLocal}
156
+ title={showReplaceLocal ? 'Hide replace (Ctrl+H)' : 'Show replace (Ctrl+H)'}
157
+ >
158
+ <svg width="12" height="12" viewBox="0 0 12 12" fill="currentColor">
159
+ {#if showReplaceLocal}
160
+ <path d="M6 8L2 4h8L6 8z" />
161
+ {:else}
162
+ <path d="M4 6l4-4v8L4 6z" />
163
+ {/if}
164
+ </svg>
165
+ </button>
166
+
167
+ <div class="find-replace__input-wrapper">
168
+ <input
169
+ bind:this={findInput}
170
+ type="text"
171
+ class="find-replace__input"
172
+ placeholder="Find"
173
+ value={query}
174
+ oninput={handleQueryInput}
175
+ onkeydown={handleFindKeyDown}
176
+ aria-label="Search query"
177
+ />
178
+ {#if query}
179
+ <span class="find-replace__count" aria-live="polite">
180
+ {#if matchCount > 0}
181
+ {currentMatch} of {matchCount}
182
+ {:else}
183
+ No results
184
+ {/if}
185
+ </span>
186
+ {/if}
187
+ </div>
188
+
189
+ <div class="find-replace__options">
190
+ <button
191
+ class="find-replace__option"
192
+ class:find-replace__option--active={caseSensitive}
193
+ onclick={toggleCaseSensitive}
194
+ aria-pressed={caseSensitive}
195
+ title="Match case (Alt+C)"
196
+ >
197
+ Aa
198
+ </button>
199
+ <button
200
+ class="find-replace__option"
201
+ class:find-replace__option--active={useRegex}
202
+ onclick={toggleRegex}
203
+ aria-pressed={useRegex}
204
+ title="Use regular expression (Alt+R)"
205
+ >
206
+ .*
207
+ </button>
208
+ </div>
209
+
210
+ <div class="find-replace__actions">
211
+ <button
212
+ class="find-replace__action"
213
+ onclick={() => onFindPrev?.()}
214
+ disabled={matchCount === 0}
215
+ aria-label="Previous match"
216
+ title="Previous match (Shift+Enter)"
217
+ >
218
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor">
219
+ <path d="M7 3L2 8h10L7 3z" />
220
+ </svg>
221
+ </button>
222
+ <button
223
+ class="find-replace__action"
224
+ onclick={() => onFindNext?.()}
225
+ disabled={matchCount === 0}
226
+ aria-label="Next match"
227
+ title="Next match (Enter)"
228
+ >
229
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor">
230
+ <path d="M7 11L2 6h10L7 11z" />
231
+ </svg>
232
+ </button>
233
+ <button
234
+ class="find-replace__action find-replace__action--close"
235
+ onclick={() => onClose?.()}
236
+ aria-label="Close"
237
+ title="Close (Escape)"
238
+ >
239
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor">
240
+ <path d="M3 3l8 8M11 3l-8 8" stroke="currentColor" stroke-width="1.5" fill="none" />
241
+ </svg>
242
+ </button>
243
+ </div>
244
+ </div>
245
+
246
+ <!-- Replace row -->
247
+ {#if showReplaceLocal}
248
+ <div class="find-replace__row find-replace__row--replace">
249
+ <div class="find-replace__spacer"></div>
250
+
251
+ <div class="find-replace__input-wrapper">
252
+ <input
253
+ bind:this={replaceInput}
254
+ type="text"
255
+ class="find-replace__input"
256
+ placeholder="Replace"
257
+ value={replaceText}
258
+ oninput={handleReplaceInput}
259
+ onkeydown={handleReplaceKeyDown}
260
+ aria-label="Replace text"
261
+ />
262
+ </div>
263
+
264
+ <div class="find-replace__actions find-replace__actions--replace">
265
+ <button
266
+ class="find-replace__action"
267
+ onclick={() => onReplace?.()}
268
+ disabled={matchCount === 0}
269
+ aria-label="Replace"
270
+ title="Replace (Enter)"
271
+ >
272
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor">
273
+ <path d="M2 7h8M7 4l3 3-3 3" stroke="currentColor" stroke-width="1.5" fill="none" />
274
+ </svg>
275
+ </button>
276
+ <button
277
+ class="find-replace__action"
278
+ onclick={() => onReplaceAll?.()}
279
+ disabled={matchCount === 0}
280
+ aria-label="Replace all"
281
+ title="Replace all (Shift+Enter)"
282
+ >
283
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor">
284
+ <path d="M1 4h6M1 7h8M1 10h6M10 4l2 2-2 2M10 8l2 2-2 2" stroke="currentColor" stroke-width="1.2" fill="none" />
285
+ </svg>
286
+ </button>
287
+ </div>
288
+ </div>
289
+ {/if}
290
+ </div>
291
+
292
+ <style>
293
+ .find-replace {
294
+ display: flex;
295
+ flex-direction: column;
296
+ gap: 4px;
297
+ padding: 6px 8px;
298
+ background: var(--ide-bg-secondary);
299
+ border-bottom: 1px solid var(--ide-border);
300
+ font-family: var(--ide-font-sans);
301
+ font-size: 13px;
302
+ }
303
+
304
+ .find-replace__row {
305
+ display: flex;
306
+ align-items: center;
307
+ gap: 6px;
308
+ }
309
+
310
+ .find-replace__toggle {
311
+ display: flex;
312
+ align-items: center;
313
+ justify-content: center;
314
+ width: 20px;
315
+ height: 20px;
316
+ padding: 0;
317
+ background: transparent;
318
+ border: none;
319
+ border-radius: 3px;
320
+ color: var(--ide-text-secondary);
321
+ cursor: pointer;
322
+ transition: background 0.1s, color 0.1s;
323
+ }
324
+
325
+ .find-replace__toggle:hover {
326
+ background: var(--ide-bg-hover);
327
+ color: var(--ide-text-primary);
328
+ }
329
+
330
+ .find-replace__spacer {
331
+ width: 20px;
332
+ flex-shrink: 0;
333
+ }
334
+
335
+ .find-replace__input-wrapper {
336
+ position: relative;
337
+ flex: 1;
338
+ max-width: 300px;
339
+ }
340
+
341
+ .find-replace__input {
342
+ width: 100%;
343
+ padding: 4px 8px;
344
+ padding-right: 70px;
345
+ background: var(--ide-bg-primary);
346
+ border: 1px solid var(--ide-border);
347
+ border-radius: 4px;
348
+ color: var(--ide-text-primary);
349
+ font-family: var(--ide-font-mono);
350
+ font-size: 12px;
351
+ outline: none;
352
+ transition: border-color 0.1s;
353
+ }
354
+
355
+ .find-replace__input:focus {
356
+ border-color: var(--ide-interactive);
357
+ }
358
+
359
+ .find-replace__input::placeholder {
360
+ color: var(--ide-text-muted);
361
+ }
362
+
363
+ .find-replace__count {
364
+ position: absolute;
365
+ right: 8px;
366
+ top: 50%;
367
+ transform: translateY(-50%);
368
+ color: var(--ide-text-muted);
369
+ font-size: 11px;
370
+ pointer-events: none;
371
+ }
372
+
373
+ .find-replace__options {
374
+ display: flex;
375
+ gap: 2px;
376
+ }
377
+
378
+ .find-replace__option {
379
+ display: flex;
380
+ align-items: center;
381
+ justify-content: center;
382
+ min-width: 24px;
383
+ height: 22px;
384
+ padding: 0 4px;
385
+ background: transparent;
386
+ border: 1px solid transparent;
387
+ border-radius: 3px;
388
+ color: var(--ide-text-secondary);
389
+ font-family: var(--ide-font-mono);
390
+ font-size: 11px;
391
+ cursor: pointer;
392
+ transition: background 0.1s, border-color 0.1s, color 0.1s;
393
+ }
394
+
395
+ .find-replace__option:hover {
396
+ background: var(--ide-bg-hover);
397
+ color: var(--ide-text-primary);
398
+ }
399
+
400
+ .find-replace__option--active {
401
+ background: var(--ide-interactive);
402
+ border-color: var(--ide-interactive);
403
+ color: var(--ide-text-primary);
404
+ }
405
+
406
+ .find-replace__option--active:hover {
407
+ background: var(--ide-interactive-hover);
408
+ }
409
+
410
+ .find-replace__actions {
411
+ display: flex;
412
+ gap: 2px;
413
+ }
414
+
415
+ .find-replace__actions--replace {
416
+ margin-left: auto;
417
+ }
418
+
419
+ .find-replace__action {
420
+ display: flex;
421
+ align-items: center;
422
+ justify-content: center;
423
+ width: 24px;
424
+ height: 22px;
425
+ padding: 0;
426
+ background: transparent;
427
+ border: none;
428
+ border-radius: 3px;
429
+ color: var(--ide-text-secondary);
430
+ cursor: pointer;
431
+ transition: background 0.1s, color 0.1s;
432
+ }
433
+
434
+ .find-replace__action:hover:not(:disabled) {
435
+ background: var(--ide-bg-hover);
436
+ color: var(--ide-text-primary);
437
+ }
438
+
439
+ .find-replace__action:disabled {
440
+ opacity: 0.4;
441
+ cursor: not-allowed;
442
+ }
443
+
444
+ .find-replace__action--close:hover {
445
+ background: var(--ide-error);
446
+ color: white;
447
+ }
448
+ </style>
@@ -0,0 +1,40 @@
1
+ interface Props {
2
+ /** Current search query */
3
+ query?: string;
4
+ /** Current replace text */
5
+ replaceText?: string;
6
+ /** Whether to show replace controls */
7
+ showReplace?: boolean;
8
+ /** Whether search is case sensitive */
9
+ caseSensitive?: boolean;
10
+ /** Whether to use regex search */
11
+ useRegex?: boolean;
12
+ /** Total number of matches */
13
+ matchCount?: number;
14
+ /** Current match index (1-based) */
15
+ currentMatch?: number;
16
+ /** Called when query changes */
17
+ onQueryChange?: (query: string) => void;
18
+ /** Called when replace text changes */
19
+ onReplaceTextChange?: (text: string) => void;
20
+ /** Called when case sensitivity changes */
21
+ onCaseSensitiveChange?: (value: boolean) => void;
22
+ /** Called when regex mode changes */
23
+ onUseRegexChange?: (value: boolean) => void;
24
+ /** Called to find next match */
25
+ onFindNext?: () => void;
26
+ /** Called to find previous match */
27
+ onFindPrev?: () => void;
28
+ /** Called to replace current match */
29
+ onReplace?: () => void;
30
+ /** Called to replace all matches */
31
+ onReplaceAll?: () => void;
32
+ /** Called to close the find/replace bar */
33
+ onClose?: () => void;
34
+ }
35
+ declare const FindReplace: import("svelte").Component<Props, {
36
+ focus: () => void;
37
+ setQuery: (newQuery: string) => void;
38
+ }, "">;
39
+ type FindReplace = ReturnType<typeof FindReplace>;
40
+ export default FindReplace;