@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.
- package/LICENSE +21 -0
- package/README.md +251 -0
- package/dist/components/agents/AgentActivityPanel.svelte +565 -0
- package/dist/components/agents/AgentActivityPanel.svelte.d.ts +24 -0
- package/dist/components/agents/AgentAvatar.svelte +417 -0
- package/dist/components/agents/AgentAvatar.svelte.d.ts +23 -0
- package/dist/components/agents/AgentCursor.svelte +224 -0
- package/dist/components/agents/AgentCursor.svelte.d.ts +35 -0
- package/dist/components/agents/AgentPresenceBar.svelte +261 -0
- package/dist/components/agents/AgentPresenceBar.svelte.d.ts +20 -0
- package/dist/components/agents/index.d.ts +4 -0
- package/dist/components/agents/index.js +5 -0
- package/dist/components/ai/AIConversationList.svelte +524 -0
- package/dist/components/ai/AIConversationList.svelte.d.ts +17 -0
- package/dist/components/ai/AIEditPreview.svelte +132 -0
- package/dist/components/ai/AIEditPreview.svelte.d.ts +8 -0
- package/dist/components/ai/AIInlineEdit.svelte +155 -0
- package/dist/components/ai/AIInlineEdit.svelte.d.ts +10 -0
- package/dist/components/ai/AIMessage.svelte +239 -0
- package/dist/components/ai/AIMessage.svelte.d.ts +13 -0
- package/dist/components/ai/AIMessageActions.svelte +176 -0
- package/dist/components/ai/AIMessageActions.svelte.d.ts +12 -0
- package/dist/components/ai/AIMessageContent.svelte +355 -0
- package/dist/components/ai/AIMessageContent.svelte.d.ts +7 -0
- package/dist/components/ai/AIPanel.svelte +561 -0
- package/dist/components/ai/AIPanel.svelte.d.ts +7 -0
- package/dist/components/ai/AISuggestionWidget.svelte +132 -0
- package/dist/components/ai/AISuggestionWidget.svelte.d.ts +10 -0
- package/dist/components/ai/AIToolCallDisplay.svelte +317 -0
- package/dist/components/ai/AIToolCallDisplay.svelte.d.ts +12 -0
- package/dist/components/ai/index.d.ts +9 -0
- package/dist/components/ai/index.js +10 -0
- package/dist/components/core/Avatar.svelte +110 -0
- package/dist/components/core/Avatar.svelte.d.ts +12 -0
- package/dist/components/core/Badge.svelte +98 -0
- package/dist/components/core/Badge.svelte.d.ts +11 -0
- package/dist/components/core/Button.svelte +175 -0
- package/dist/components/core/Button.svelte.d.ts +18 -0
- package/dist/components/core/ConnectionStatus.svelte +294 -0
- package/dist/components/core/ConnectionStatus.svelte.d.ts +20 -0
- package/dist/components/core/ContextMenu.svelte +176 -0
- package/dist/components/core/ContextMenu.svelte.d.ts +19 -0
- package/dist/components/core/ErrorBoundary.svelte +277 -0
- package/dist/components/core/ErrorBoundary.svelte.d.ts +23 -0
- package/dist/components/core/Icon.svelte +107 -0
- package/dist/components/core/Icon.svelte.d.ts +8 -0
- package/dist/components/core/Input.svelte +138 -0
- package/dist/components/core/Input.svelte.d.ts +20 -0
- package/dist/components/core/Kbd.svelte +34 -0
- package/dist/components/core/Kbd.svelte.d.ts +7 -0
- package/dist/components/core/ResizeHandle.svelte +200 -0
- package/dist/components/core/ResizeHandle.svelte.d.ts +23 -0
- package/dist/components/core/Spinner.svelte +35 -0
- package/dist/components/core/Spinner.svelte.d.ts +7 -0
- package/dist/components/core/Textarea.svelte +112 -0
- package/dist/components/core/Textarea.svelte.d.ts +18 -0
- package/dist/components/core/Tooltip.svelte +103 -0
- package/dist/components/core/Tooltip.svelte.d.ts +11 -0
- package/dist/components/core/index.d.ts +13 -0
- package/dist/components/core/index.js +14 -0
- package/dist/components/editor/AIFocusLayer.svelte +430 -0
- package/dist/components/editor/AIFocusLayer.svelte.d.ts +32 -0
- package/dist/components/editor/Breadcrumbs.svelte +435 -0
- package/dist/components/editor/Breadcrumbs.svelte.d.ts +33 -0
- package/dist/components/editor/BreakpointLayer.svelte +642 -0
- package/dist/components/editor/BreakpointLayer.svelte.d.ts +20 -0
- package/dist/components/editor/CognitiveLoadMeter.svelte +324 -0
- package/dist/components/editor/CognitiveLoadMeter.svelte.d.ts +18 -0
- package/dist/components/editor/CollaborativeEditor.svelte +218 -0
- package/dist/components/editor/CollaborativeEditor.svelte.d.ts +32 -0
- package/dist/components/editor/CommandPalette.svelte +434 -0
- package/dist/components/editor/CommandPalette.svelte.d.ts +11 -0
- package/dist/components/editor/ComplexityLayer.svelte +293 -0
- package/dist/components/editor/ComplexityLayer.svelte.d.ts +23 -0
- package/dist/components/editor/ConflictZoneLayer.svelte +441 -0
- package/dist/components/editor/ConflictZoneLayer.svelte.d.ts +25 -0
- package/dist/components/editor/ContextLens.svelte +262 -0
- package/dist/components/editor/ContextLens.svelte.d.ts +27 -0
- package/dist/components/editor/CustomEditor.svelte +1242 -0
- package/dist/components/editor/CustomEditor.svelte.d.ts +37 -0
- package/dist/components/editor/DebugConsole.svelte +646 -0
- package/dist/components/editor/DebugConsole.svelte.d.ts +41 -0
- package/dist/components/editor/EchoCursorLayer.svelte +363 -0
- package/dist/components/editor/EchoCursorLayer.svelte.d.ts +24 -0
- package/dist/components/editor/Editor.svelte +61 -0
- package/dist/components/editor/Editor.svelte.d.ts +22 -0
- package/dist/components/editor/EditorGutter.svelte +119 -0
- package/dist/components/editor/EditorGutter.svelte.d.ts +19 -0
- package/dist/components/editor/EditorLines.svelte +182 -0
- package/dist/components/editor/EditorLines.svelte.d.ts +43 -0
- package/dist/components/editor/EditorPane.svelte +134 -0
- package/dist/components/editor/EditorPane.svelte.d.ts +9 -0
- package/dist/components/editor/EditorSelections.svelte +186 -0
- package/dist/components/editor/EditorSelections.svelte.d.ts +25 -0
- package/dist/components/editor/EditorTabs.svelte +170 -0
- package/dist/components/editor/EditorTabs.svelte.d.ts +12 -0
- package/dist/components/editor/FileExplorer.svelte +811 -0
- package/dist/components/editor/FileExplorer.svelte.d.ts +67 -0
- package/dist/components/editor/FileIcon.svelte +110 -0
- package/dist/components/editor/FileIcon.svelte.d.ts +10 -0
- package/dist/components/editor/FindReplace.svelte +448 -0
- package/dist/components/editor/FindReplace.svelte.d.ts +40 -0
- package/dist/components/editor/GhostBracketLayer.svelte +391 -0
- package/dist/components/editor/GhostBracketLayer.svelte.d.ts +24 -0
- package/dist/components/editor/GitBlameLayer.svelte +436 -0
- package/dist/components/editor/GitBlameLayer.svelte.d.ts +18 -0
- package/dist/components/editor/InlineDiagnosticsLayer.svelte +540 -0
- package/dist/components/editor/InlineDiagnosticsLayer.svelte.d.ts +35 -0
- package/dist/components/editor/InlineDiffLayer.svelte +337 -0
- package/dist/components/editor/InlineDiffLayer.svelte.d.ts +31 -0
- package/dist/components/editor/MinimalEditor.svelte +75 -0
- package/dist/components/editor/MinimalEditor.svelte.d.ts +6 -0
- package/dist/components/editor/MinimalEditor2.svelte +84 -0
- package/dist/components/editor/MinimalEditor2.svelte.d.ts +6 -0
- package/dist/components/editor/Minimap.svelte +327 -0
- package/dist/components/editor/Minimap.svelte.d.ts +34 -0
- package/dist/components/editor/PluginPreviewSandbox.svelte +793 -0
- package/dist/components/editor/PluginPreviewSandbox.svelte.d.ts +49 -0
- package/dist/components/editor/ProblemsPanel.svelte +628 -0
- package/dist/components/editor/ProblemsPanel.svelte.d.ts +25 -0
- package/dist/components/editor/QuickActionsMenu.svelte +403 -0
- package/dist/components/editor/QuickActionsMenu.svelte.d.ts +18 -0
- package/dist/components/editor/SnippetPalette.svelte +530 -0
- package/dist/components/editor/SnippetPalette.svelte.d.ts +16 -0
- package/dist/components/editor/StructureMap.svelte +431 -0
- package/dist/components/editor/StructureMap.svelte.d.ts +37 -0
- package/dist/components/editor/SymbolOutline.svelte +722 -0
- package/dist/components/editor/SymbolOutline.svelte.d.ts +44 -0
- package/dist/components/editor/TimelineScrubber.svelte +470 -0
- package/dist/components/editor/TimelineScrubber.svelte.d.ts +40 -0
- package/dist/components/editor/TokenRenderer.svelte +69 -0
- package/dist/components/editor/TokenRenderer.svelte.d.ts +15 -0
- package/dist/components/editor/constants.d.ts +32 -0
- package/dist/components/editor/constants.js +36 -0
- package/dist/components/editor/core/ai-awareness.d.ts +176 -0
- package/dist/components/editor/core/ai-awareness.js +210 -0
- package/dist/components/editor/core/bracket-healer.d.ts +189 -0
- package/dist/components/editor/core/bracket-healer.js +406 -0
- package/dist/components/editor/core/breakpoints.d.ts +203 -0
- package/dist/components/editor/core/breakpoints.js +414 -0
- package/dist/components/editor/core/commands.d.ts +108 -0
- package/dist/components/editor/core/commands.js +246 -0
- package/dist/components/editor/core/complexity-analyzer.d.ts +123 -0
- package/dist/components/editor/core/complexity-analyzer.js +376 -0
- package/dist/components/editor/core/conflict-predictor.d.ts +135 -0
- package/dist/components/editor/core/conflict-predictor.js +316 -0
- package/dist/components/editor/core/crdt-binding.d.ts +118 -0
- package/dist/components/editor/core/crdt-binding.js +286 -0
- package/dist/components/editor/core/diagnostics.d.ts +210 -0
- package/dist/components/editor/core/diagnostics.js +335 -0
- package/dist/components/editor/core/echo-cursor.d.ts +201 -0
- package/dist/components/editor/core/echo-cursor.js +267 -0
- package/dist/components/editor/core/folding.d.ts +124 -0
- package/dist/components/editor/core/folding.js +672 -0
- package/dist/components/editor/core/ghost-pair.d.ts +122 -0
- package/dist/components/editor/core/ghost-pair.js +221 -0
- package/dist/components/editor/core/git-blame.d.ts +170 -0
- package/dist/components/editor/core/git-blame.js +324 -0
- package/dist/components/editor/core/index.d.ts +26 -0
- package/dist/components/editor/core/index.js +24 -0
- package/dist/components/editor/core/keybindings.d.ts +79 -0
- package/dist/components/editor/core/keybindings.js +357 -0
- package/dist/components/editor/core/multi-cursor.d.ts +196 -0
- package/dist/components/editor/core/multi-cursor.js +521 -0
- package/dist/components/editor/core/navigation.d.ts +107 -0
- package/dist/components/editor/core/navigation.js +408 -0
- package/dist/components/editor/core/quick-actions.d.ts +189 -0
- package/dist/components/editor/core/quick-actions.js +427 -0
- package/dist/components/editor/core/search.d.ts +88 -0
- package/dist/components/editor/core/search.js +192 -0
- package/dist/components/editor/core/semantic-analyzer.d.ts +77 -0
- package/dist/components/editor/core/semantic-analyzer.js +424 -0
- package/dist/components/editor/core/snippet-manager.d.ts +202 -0
- package/dist/components/editor/core/snippet-manager.js +565 -0
- package/dist/components/editor/core/state.d.ts +367 -0
- package/dist/components/editor/core/state.js +900 -0
- package/dist/components/editor/core/timeline.d.ts +204 -0
- package/dist/components/editor/core/timeline.js +349 -0
- package/dist/components/editor/editor-find.d.ts +56 -0
- package/dist/components/editor/editor-find.js +148 -0
- package/dist/components/editor/editor-input.d.ts +77 -0
- package/dist/components/editor/editor-input.js +445 -0
- package/dist/components/editor/editor-multicursor.d.ts +21 -0
- package/dist/components/editor/editor-multicursor.js +196 -0
- package/dist/components/editor/editor-scroll.d.ts +14 -0
- package/dist/components/editor/editor-scroll.js +34 -0
- package/dist/components/editor/index.d.ts +15 -0
- package/dist/components/editor/index.js +21 -0
- package/dist/components/editor/languages.d.ts +62 -0
- package/dist/components/editor/languages.js +285 -0
- package/dist/components/editor/theme.d.ts +88 -0
- package/dist/components/editor/theme.js +139 -0
- package/dist/components/editor/tokenizer/base.d.ts +40 -0
- package/dist/components/editor/tokenizer/base.js +203 -0
- package/dist/components/editor/tokenizer/index.d.ts +56 -0
- package/dist/components/editor/tokenizer/index.js +215 -0
- package/dist/components/editor/tokenizer/languages/css.d.ts +17 -0
- package/dist/components/editor/tokenizer/languages/css.js +194 -0
- package/dist/components/editor/tokenizer/languages/go.d.ts +17 -0
- package/dist/components/editor/tokenizer/languages/go.js +220 -0
- package/dist/components/editor/tokenizer/languages/html.d.ts +24 -0
- package/dist/components/editor/tokenizer/languages/html.js +145 -0
- package/dist/components/editor/tokenizer/languages/javascript.d.ts +56 -0
- package/dist/components/editor/tokenizer/languages/javascript.js +452 -0
- package/dist/components/editor/tokenizer/languages/json.d.ts +12 -0
- package/dist/components/editor/tokenizer/languages/json.js +91 -0
- package/dist/components/editor/tokenizer/languages/markdown.d.ts +16 -0
- package/dist/components/editor/tokenizer/languages/markdown.js +156 -0
- package/dist/components/editor/tokenizer/languages/python.d.ts +20 -0
- package/dist/components/editor/tokenizer/languages/python.js +227 -0
- package/dist/components/editor/tokenizer/languages/svelte.d.ts +40 -0
- package/dist/components/editor/tokenizer/languages/svelte.js +326 -0
- package/dist/components/editor/tokenizer/types.d.ts +86 -0
- package/dist/components/editor/tokenizer/types.js +4 -0
- package/dist/components/layout/IDELayout.svelte +274 -0
- package/dist/components/layout/IDELayout.svelte.d.ts +29 -0
- package/dist/components/layout/StatusBar.svelte +511 -0
- package/dist/components/layout/StatusBar.svelte.d.ts +47 -0
- package/dist/components/layout/index.d.ts +2 -0
- package/dist/components/layout/index.js +3 -0
- package/dist/components/lsp/AutocompleteWidget.svelte +364 -0
- package/dist/components/lsp/AutocompleteWidget.svelte.d.ts +33 -0
- package/dist/components/lsp/DiagnosticMarker.svelte +166 -0
- package/dist/components/lsp/DiagnosticMarker.svelte.d.ts +19 -0
- package/dist/components/lsp/DiagnosticsPanel.svelte +388 -0
- package/dist/components/lsp/DiagnosticsPanel.svelte.d.ts +21 -0
- package/dist/components/lsp/HoverTooltip.svelte +274 -0
- package/dist/components/lsp/HoverTooltip.svelte.d.ts +24 -0
- package/dist/components/lsp/LSPEditor.svelte +486 -0
- package/dist/components/lsp/LSPEditor.svelte.d.ts +39 -0
- package/dist/components/lsp/SignatureHelpWidget.svelte +216 -0
- package/dist/components/lsp/SignatureHelpWidget.svelte.d.ts +22 -0
- package/dist/components/lsp/index.d.ts +6 -0
- package/dist/components/lsp/index.js +7 -0
- package/dist/components/plugins/PluginCard.svelte +153 -0
- package/dist/components/plugins/PluginCard.svelte.d.ts +19 -0
- package/dist/components/plugins/PluginPanel.svelte +280 -0
- package/dist/components/plugins/PluginPanel.svelte.d.ts +8 -0
- package/dist/components/plugins/PluginProposalForm.svelte +250 -0
- package/dist/components/plugins/PluginProposalForm.svelte.d.ts +6 -0
- package/dist/components/plugins/PluginStatusBadge.svelte +14 -0
- package/dist/components/plugins/PluginStatusBadge.svelte.d.ts +8 -0
- package/dist/components/plugins/index.d.ts +4 -0
- package/dist/components/plugins/index.js +5 -0
- package/dist/components/vfs/LockConflictDialog.svelte +705 -0
- package/dist/components/vfs/LockConflictDialog.svelte.d.ts +21 -0
- package/dist/components/vfs/LockIndicator.svelte +194 -0
- package/dist/components/vfs/LockIndicator.svelte.d.ts +29 -0
- package/dist/components/vfs/LockOverlay.svelte +344 -0
- package/dist/components/vfs/LockOverlay.svelte.d.ts +17 -0
- package/dist/components/vfs/VersionConflictDialog.svelte +549 -0
- package/dist/components/vfs/VersionConflictDialog.svelte.d.ts +24 -0
- package/dist/components/vfs/index.d.ts +4 -0
- package/dist/components/vfs/index.js +5 -0
- package/dist/crdt/awareness.d.ts +42 -0
- package/dist/crdt/awareness.js +109 -0
- package/dist/crdt/document.d.ts +101 -0
- package/dist/crdt/document.js +187 -0
- package/dist/crdt/index.d.ts +9 -0
- package/dist/crdt/index.js +8 -0
- package/dist/crdt/provider.d.ts +85 -0
- package/dist/crdt/provider.js +150 -0
- package/dist/crdt/types.d.ts +61 -0
- package/dist/crdt/types.js +4 -0
- package/dist/crdt/undo.d.ts +34 -0
- package/dist/crdt/undo.js +70 -0
- package/dist/index.d.ts +277 -0
- package/dist/index.js +280 -0
- package/dist/plugins/index.d.ts +103 -0
- package/dist/plugins/index.js +153 -0
- package/dist/services/error-handling.d.ts +95 -0
- package/dist/services/error-handling.js +413 -0
- package/dist/services/ide-integration.d.ts +83 -0
- package/dist/services/ide-integration.js +367 -0
- package/dist/services/lsp-client.d.ts +69 -0
- package/dist/services/lsp-client.js +667 -0
- package/dist/services/mock-ai.d.ts +37 -0
- package/dist/services/mock-ai.js +318 -0
- package/dist/services/optimistic.d.ts +141 -0
- package/dist/services/optimistic.js +367 -0
- package/dist/services/vfs-client.d.ts +81 -0
- package/dist/services/vfs-client.js +348 -0
- package/dist/stores/agents.svelte.d.ts +85 -0
- package/dist/stores/agents.svelte.js +459 -0
- package/dist/stores/ai-persistence.svelte.d.ts +76 -0
- package/dist/stores/ai-persistence.svelte.js +334 -0
- package/dist/stores/ai.svelte.d.ts +140 -0
- package/dist/stores/ai.svelte.js +383 -0
- package/dist/stores/collaboration.svelte.d.ts +164 -0
- package/dist/stores/collaboration.svelte.js +334 -0
- package/dist/stores/editor.svelte.d.ts +131 -0
- package/dist/stores/editor.svelte.js +250 -0
- package/dist/stores/index.d.ts +10 -0
- package/dist/stores/index.js +29 -0
- package/dist/stores/layout.svelte.d.ts +171 -0
- package/dist/stores/layout.svelte.js +351 -0
- package/dist/stores/plugin.svelte.d.ts +121 -0
- package/dist/stores/plugin.svelte.js +410 -0
- package/dist/stores/vfs.svelte.d.ts +123 -0
- package/dist/stores/vfs.svelte.js +680 -0
- package/dist/styles/theme.css +623 -0
- package/dist/types/agents.d.ts +127 -0
- package/dist/types/agents.js +5 -0
- package/dist/types/ai.d.ts +137 -0
- package/dist/types/ai.js +4 -0
- package/dist/types/crdt.d.ts +222 -0
- package/dist/types/crdt.js +5 -0
- package/dist/types/editor.d.ts +52 -0
- package/dist/types/editor.js +18 -0
- package/dist/types/events.d.ts +133 -0
- package/dist/types/events.js +4 -0
- package/dist/types/filesystem.d.ts +77 -0
- package/dist/types/filesystem.js +4 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.js +12 -0
- package/dist/types/lsp.d.ts +691 -0
- package/dist/types/lsp.js +108 -0
- package/dist/types/plugin.d.ts +239 -0
- package/dist/types/plugin.js +5 -0
- package/dist/types/vfs.d.ts +191 -0
- package/dist/types/vfs.js +18 -0
- package/dist/utils/format.d.ts +55 -0
- package/dist/utils/format.js +152 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/keybindings.d.ts +33 -0
- package/dist/utils/keybindings.js +171 -0
- package/dist/utils/language.d.ts +27 -0
- package/dist/utils/language.js +222 -0
- 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;
|