@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,267 @@
1
+ /**
2
+ * Echo Cursor Manager
3
+ *
4
+ * Implements "Echo Mode" where your cursor leaves a trail that replays
5
+ * keystrokes with a configurable delay. Type in one place, and edits
6
+ * propagate to echo locations with visible animation.
7
+ */
8
+ const DEFAULT_CONFIG = {
9
+ defaultDelay: 150,
10
+ maxEchoCursors: 10,
11
+ maxKeystrokeBuffer: 1000,
12
+ colors: [
13
+ '#22c55e', // green
14
+ '#f59e0b', // amber
15
+ '#ec4899', // pink
16
+ '#06b6d4', // cyan
17
+ '#8b5cf6', // violet
18
+ '#ef4444', // red
19
+ '#14b8a6', // teal
20
+ '#f97316', // orange
21
+ '#6366f1', // indigo
22
+ '#84cc16' // lime
23
+ ]
24
+ };
25
+ /**
26
+ * Echo Cursor Manager
27
+ */
28
+ export class EchoCursorManager {
29
+ config;
30
+ echoCursors = new Map();
31
+ keystrokeBuffer = [];
32
+ replayTimers = new Map();
33
+ listeners = new Set();
34
+ enabled = false;
35
+ colorIndex = 0;
36
+ constructor(config = {}) {
37
+ this.config = { ...DEFAULT_CONFIG, ...config };
38
+ }
39
+ /**
40
+ * Enable echo mode
41
+ */
42
+ enable() {
43
+ this.enabled = true;
44
+ this.emit({ type: 'mode-changed', enabled: true });
45
+ }
46
+ /**
47
+ * Disable echo mode
48
+ */
49
+ disable() {
50
+ this.enabled = false;
51
+ this.clearAllEchoes();
52
+ this.emit({ type: 'mode-changed', enabled: false });
53
+ }
54
+ /**
55
+ * Toggle echo mode
56
+ */
57
+ toggle() {
58
+ if (this.enabled) {
59
+ this.disable();
60
+ }
61
+ else {
62
+ this.enable();
63
+ }
64
+ return this.enabled;
65
+ }
66
+ /**
67
+ * Check if echo mode is enabled
68
+ */
69
+ isEnabled() {
70
+ return this.enabled;
71
+ }
72
+ /**
73
+ * Add an echo cursor at a position
74
+ */
75
+ addEchoPoint(position, options) {
76
+ if (!this.enabled)
77
+ return null;
78
+ if (this.echoCursors.size >= this.config.maxEchoCursors)
79
+ return null;
80
+ const id = `echo-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
81
+ const color = this.config.colors[this.colorIndex % this.config.colors.length];
82
+ this.colorIndex++;
83
+ const cursor = {
84
+ id,
85
+ position: { ...position },
86
+ delayMs: options?.delay ?? this.config.defaultDelay,
87
+ color,
88
+ active: true,
89
+ replayIndex: this.keystrokeBuffer.length, // Start from current position
90
+ isReplaying: false,
91
+ label: options?.label
92
+ };
93
+ this.echoCursors.set(id, cursor);
94
+ this.replayTimers.set(id, []);
95
+ this.emit({ type: 'echo-added', cursor });
96
+ return cursor;
97
+ }
98
+ /**
99
+ * Remove an echo cursor
100
+ */
101
+ removeEcho(id) {
102
+ const cursor = this.echoCursors.get(id);
103
+ if (!cursor)
104
+ return false;
105
+ // Clear pending replay timers
106
+ const timers = this.replayTimers.get(id) || [];
107
+ for (const timer of timers) {
108
+ clearTimeout(timer);
109
+ }
110
+ this.replayTimers.delete(id);
111
+ this.echoCursors.delete(id);
112
+ this.emit({ type: 'echo-removed', cursorId: id });
113
+ return true;
114
+ }
115
+ /**
116
+ * Clear all echo cursors
117
+ */
118
+ clearAllEchoes() {
119
+ for (const id of this.echoCursors.keys()) {
120
+ this.removeEcho(id);
121
+ }
122
+ this.keystrokeBuffer = [];
123
+ }
124
+ /**
125
+ * Record a keystroke from the primary cursor
126
+ */
127
+ recordKeystroke(event) {
128
+ const keystroke = {
129
+ ...event,
130
+ id: `ks-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
131
+ timestamp: Date.now()
132
+ };
133
+ this.keystrokeBuffer.push(keystroke);
134
+ // Prune old keystrokes
135
+ if (this.keystrokeBuffer.length > this.config.maxKeystrokeBuffer) {
136
+ this.keystrokeBuffer = this.keystrokeBuffer.slice(-this.config.maxKeystrokeBuffer);
137
+ }
138
+ this.emit({ type: 'keystroke-recorded', event: keystroke });
139
+ // Schedule replay for all echo cursors
140
+ if (this.enabled) {
141
+ for (const cursor of this.echoCursors.values()) {
142
+ this.scheduleReplay(cursor, keystroke);
143
+ }
144
+ }
145
+ return keystroke;
146
+ }
147
+ /**
148
+ * Record text insertion
149
+ */
150
+ recordInsert(text) {
151
+ return this.recordKeystroke({
152
+ type: 'insert',
153
+ data: { text }
154
+ });
155
+ }
156
+ /**
157
+ * Record text deletion
158
+ */
159
+ recordDelete(direction, count = 1) {
160
+ return this.recordKeystroke({
161
+ type: 'delete',
162
+ data: { direction, count }
163
+ });
164
+ }
165
+ /**
166
+ * Record newline insertion
167
+ */
168
+ recordNewline() {
169
+ return this.recordKeystroke({
170
+ type: 'newline',
171
+ data: {}
172
+ });
173
+ }
174
+ /**
175
+ * Record tab insertion
176
+ */
177
+ recordTab() {
178
+ return this.recordKeystroke({
179
+ type: 'tab',
180
+ data: {}
181
+ });
182
+ }
183
+ /**
184
+ * Get all echo cursors
185
+ */
186
+ getEchoCursors() {
187
+ return Array.from(this.echoCursors.values());
188
+ }
189
+ /**
190
+ * Get echo cursor by ID
191
+ */
192
+ getEchoCursor(id) {
193
+ return this.echoCursors.get(id);
194
+ }
195
+ /**
196
+ * Get keystroke buffer
197
+ */
198
+ getKeystrokeBuffer() {
199
+ return this.keystrokeBuffer;
200
+ }
201
+ /**
202
+ * Update echo cursor position after replay
203
+ */
204
+ updateEchoPosition(id, position) {
205
+ const cursor = this.echoCursors.get(id);
206
+ if (cursor) {
207
+ cursor.position = { ...position };
208
+ }
209
+ }
210
+ /**
211
+ * Subscribe to echo cursor events
212
+ */
213
+ subscribe(listener) {
214
+ this.listeners.add(listener);
215
+ return () => this.listeners.delete(listener);
216
+ }
217
+ /**
218
+ * Schedule keystroke replay for an echo cursor
219
+ */
220
+ scheduleReplay(cursor, keystroke) {
221
+ if (!cursor.active)
222
+ return;
223
+ const timer = setTimeout(() => {
224
+ cursor.isReplaying = true;
225
+ this.emit({ type: 'replay-started', cursorId: cursor.id, keystroke });
226
+ // Simulate replay completion after a short animation time
227
+ setTimeout(() => {
228
+ cursor.isReplaying = false;
229
+ cursor.replayIndex++;
230
+ this.emit({ type: 'replay-completed', cursorId: cursor.id, keystroke });
231
+ }, 50);
232
+ }, cursor.delayMs);
233
+ const timers = this.replayTimers.get(cursor.id) || [];
234
+ timers.push(timer);
235
+ this.replayTimers.set(cursor.id, timers);
236
+ }
237
+ /**
238
+ * Emit event to listeners
239
+ */
240
+ emit(event) {
241
+ for (const listener of this.listeners) {
242
+ try {
243
+ listener(event);
244
+ }
245
+ catch (e) {
246
+ console.error('[EchoCursorManager] Listener error:', e);
247
+ }
248
+ }
249
+ }
250
+ }
251
+ /**
252
+ * Create an echo cursor manager
253
+ */
254
+ export function createEchoCursorManager(config) {
255
+ return new EchoCursorManager(config);
256
+ }
257
+ // Singleton instance
258
+ let globalEchoCursorManager = null;
259
+ /**
260
+ * Get the global echo cursor manager
261
+ */
262
+ export function getEchoCursorManager() {
263
+ if (!globalEchoCursorManager) {
264
+ globalEchoCursorManager = createEchoCursorManager();
265
+ }
266
+ return globalEchoCursorManager;
267
+ }
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Code folding detection and management
3
+ *
4
+ * Supports multiple folding strategies:
5
+ * - Indentation-based (Python, YAML)
6
+ * - Bracket-based (JavaScript, TypeScript, JSON, etc.)
7
+ * - Region markers (#region / #endregion)
8
+ */
9
+ import type { Line } from './state';
10
+ /**
11
+ * A foldable region in the document
12
+ */
13
+ export interface FoldRegion {
14
+ /** Start line (0-based) - the line with the fold indicator */
15
+ startLine: number;
16
+ /** End line (0-based) - the last line included in the fold */
17
+ endLine: number;
18
+ /** Indentation level (for nested folds) */
19
+ level: number;
20
+ /** Type of fold region */
21
+ type: 'bracket' | 'indentation' | 'region' | 'comment';
22
+ /** Whether this region is currently collapsed */
23
+ collapsed: boolean;
24
+ }
25
+ /**
26
+ * Folding strategy configuration
27
+ */
28
+ export interface FoldingConfig {
29
+ /** Enable bracket-based folding */
30
+ brackets: boolean;
31
+ /** Enable indentation-based folding */
32
+ indentation: boolean;
33
+ /** Enable region marker folding */
34
+ regions: boolean;
35
+ /** Enable multi-line comment folding */
36
+ comments: boolean;
37
+ /** Minimum lines for a foldable region */
38
+ minLines: number;
39
+ }
40
+ /**
41
+ * Detect all fold regions in a document
42
+ */
43
+ export declare function detectFoldRegions(lines: readonly Line[], language?: string, config?: Partial<FoldingConfig>): FoldRegion[];
44
+ /**
45
+ * Fold state manager
46
+ */
47
+ export declare class FoldManager {
48
+ private regions;
49
+ private collapsedLines;
50
+ private listeners;
51
+ /**
52
+ * Update fold regions based on document content
53
+ */
54
+ updateRegions(lines: readonly Line[], language: string, config?: Partial<FoldingConfig>): void;
55
+ /**
56
+ * Get all fold regions
57
+ */
58
+ getRegions(): readonly FoldRegion[];
59
+ /**
60
+ * Get fold region at a specific line (if it starts there)
61
+ */
62
+ getRegionAtLine(line: number): FoldRegion | undefined;
63
+ /**
64
+ * Check if a line is hidden (inside a collapsed fold)
65
+ */
66
+ isLineHidden(line: number): boolean;
67
+ /**
68
+ * Check if a line has a fold indicator
69
+ */
70
+ hasFoldIndicator(line: number): boolean;
71
+ /**
72
+ * Check if the fold at this line is collapsed
73
+ */
74
+ isFoldCollapsed(line: number): boolean;
75
+ /**
76
+ * Toggle fold at a line
77
+ */
78
+ toggleFold(line: number): boolean;
79
+ /**
80
+ * Collapse fold at a line
81
+ */
82
+ collapse(line: number): boolean;
83
+ /**
84
+ * Expand fold at a line
85
+ */
86
+ expand(line: number): boolean;
87
+ /**
88
+ * Collapse all folds
89
+ */
90
+ collapseAll(): void;
91
+ /**
92
+ * Expand all folds
93
+ */
94
+ expandAll(): void;
95
+ /**
96
+ * Collapse folds at a specific nesting level
97
+ */
98
+ collapseLevel(level: number): void;
99
+ /**
100
+ * Get visible lines (line numbers that should be rendered)
101
+ */
102
+ getVisibleLines(totalLines: number): number[];
103
+ /**
104
+ * Get the number of hidden lines after a fold start
105
+ */
106
+ getHiddenLineCount(startLine: number): number;
107
+ /**
108
+ * Update the set of collapsed (hidden) lines
109
+ */
110
+ private updateCollapsedLines;
111
+ /** Maximum listeners to prevent memory leaks */
112
+ private static readonly MAX_LISTENERS;
113
+ /**
114
+ * Subscribe to fold changes
115
+ * In development mode, throws an error to catch memory leaks early.
116
+ * In production, warns and evicts the oldest listener.
117
+ */
118
+ onChange(callback: () => void): () => void;
119
+ private emit;
120
+ }
121
+ /**
122
+ * Create a new fold manager
123
+ */
124
+ export declare function createFoldManager(): FoldManager;