@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,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IDE Integration Service
|
|
3
|
+
*
|
|
4
|
+
* Coordinates VFS, Agents, and Collaboration stores into a unified system.
|
|
5
|
+
* Handles cross-store communication and event routing.
|
|
6
|
+
*/
|
|
7
|
+
import * as vfsStore from '../stores/vfs.svelte';
|
|
8
|
+
import * as agentsStore from '../stores/agents.svelte';
|
|
9
|
+
import * as collabStore from '../stores/collaboration.svelte';
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// State
|
|
12
|
+
// ============================================================================
|
|
13
|
+
let config = null;
|
|
14
|
+
let subscriptions = [];
|
|
15
|
+
let initialized = false;
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Initialization
|
|
18
|
+
// ============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Initialize the IDE integration layer
|
|
21
|
+
* Connects all stores and sets up event routing
|
|
22
|
+
*/
|
|
23
|
+
export function initialize(integrationConfig) {
|
|
24
|
+
if (initialized) {
|
|
25
|
+
cleanup();
|
|
26
|
+
}
|
|
27
|
+
config = integrationConfig;
|
|
28
|
+
// Initialize VFS store
|
|
29
|
+
vfsStore.initialize(config.userId, config.workspaceId);
|
|
30
|
+
// Initialize collaboration if enabled
|
|
31
|
+
if (config.enableCollaboration !== false) {
|
|
32
|
+
const collabUser = {
|
|
33
|
+
id: config.userId,
|
|
34
|
+
name: config.userName,
|
|
35
|
+
isAI: false,
|
|
36
|
+
color: 'var(--ide-collab-cursor-1)'
|
|
37
|
+
};
|
|
38
|
+
collabStore.initialize({
|
|
39
|
+
user: collabUser,
|
|
40
|
+
roomId: config.workspaceId,
|
|
41
|
+
serverUrl: config.vfsEndpoint ?? '/api/collab'
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// Set up event routing
|
|
45
|
+
setupEventRouting();
|
|
46
|
+
initialized = true;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Set up cross-store event routing
|
|
50
|
+
*/
|
|
51
|
+
function setupEventRouting() {
|
|
52
|
+
// Route VFS events to agents store
|
|
53
|
+
const vfsUnsub = vfsStore.onEvent('*', (event) => {
|
|
54
|
+
handleVFSEvent(event);
|
|
55
|
+
});
|
|
56
|
+
subscriptions.push(vfsUnsub);
|
|
57
|
+
// Route team events to collaboration
|
|
58
|
+
const teamUnsub = agentsStore.onTeamEvent('*', (event) => {
|
|
59
|
+
handleTeamEvent(event);
|
|
60
|
+
});
|
|
61
|
+
subscriptions.push(teamUnsub);
|
|
62
|
+
// Route collaboration events to agents
|
|
63
|
+
const collabUnsub = collabStore.onEvent((event) => {
|
|
64
|
+
handleCollabEvent(event);
|
|
65
|
+
});
|
|
66
|
+
subscriptions.push(collabUnsub);
|
|
67
|
+
}
|
|
68
|
+
// ============================================================================
|
|
69
|
+
// Event Handlers
|
|
70
|
+
// ============================================================================
|
|
71
|
+
/**
|
|
72
|
+
* Handle VFS events and route to appropriate stores
|
|
73
|
+
*/
|
|
74
|
+
function handleVFSEvent(event) {
|
|
75
|
+
// Forward agent-related events to agents store
|
|
76
|
+
agentsStore.handleVFSEvent(event);
|
|
77
|
+
switch (event.type) {
|
|
78
|
+
case 'update': {
|
|
79
|
+
const updateEvent = event;
|
|
80
|
+
// If update is from an agent, create team event
|
|
81
|
+
if (updateEvent.actorType === 'agent') {
|
|
82
|
+
const agent = agentsStore.getAgent(updateEvent.actor);
|
|
83
|
+
if (agent) {
|
|
84
|
+
const operation = updateEvent.operation;
|
|
85
|
+
const operationPath = operation.type === 'rename' ? operation.newPath : operation.path;
|
|
86
|
+
agentsStore.addEvent({
|
|
87
|
+
id: crypto.randomUUID(),
|
|
88
|
+
timestamp: updateEvent.timestamp,
|
|
89
|
+
workspaceId: event.workspaceId,
|
|
90
|
+
agentId: updateEvent.actor,
|
|
91
|
+
agent,
|
|
92
|
+
type: 'file_modified',
|
|
93
|
+
path: operationPath,
|
|
94
|
+
operation: operation.type,
|
|
95
|
+
lockAcquired: vfsStore.isLockedByMe(operationPath)
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
case 'lock_acquired': {
|
|
102
|
+
const lockEvent = event;
|
|
103
|
+
// If lock acquired by agent, update agent status
|
|
104
|
+
if (lockEvent.lock.holderType === 'agent') {
|
|
105
|
+
agentsStore.setAgentStatus(lockEvent.lock.holder, 'busy');
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
case 'lock_released': {
|
|
110
|
+
const releaseEvent = event;
|
|
111
|
+
// Check if agent should return to online status
|
|
112
|
+
const agent = agentsStore.getAgent(releaseEvent.holder);
|
|
113
|
+
if (agent && agent.status === 'busy' && !agent.currentTask) {
|
|
114
|
+
agentsStore.setAgentStatus(releaseEvent.holder, 'online');
|
|
115
|
+
}
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Handle team events and route to collaboration
|
|
122
|
+
*/
|
|
123
|
+
function handleTeamEvent(event) {
|
|
124
|
+
if (!config?.enableCollaboration)
|
|
125
|
+
return;
|
|
126
|
+
switch (event.type) {
|
|
127
|
+
case 'agent_joined': {
|
|
128
|
+
// Add agent as collaboration user
|
|
129
|
+
const collabUser = {
|
|
130
|
+
id: event.agent.id,
|
|
131
|
+
name: event.agent.name,
|
|
132
|
+
isAI: true,
|
|
133
|
+
color: event.agent.color ?? 'var(--ide-collab-ai)'
|
|
134
|
+
};
|
|
135
|
+
collabStore.addUser(collabUser);
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
case 'agent_left': {
|
|
139
|
+
collabStore.removeUser(event.agentId);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
case 'work_started': {
|
|
143
|
+
// Start AI collaboration session
|
|
144
|
+
const aiUser = {
|
|
145
|
+
id: event.agent.id,
|
|
146
|
+
name: event.agent.name,
|
|
147
|
+
isAI: true,
|
|
148
|
+
color: event.agent.color ?? 'var(--ide-collab-ai)'
|
|
149
|
+
};
|
|
150
|
+
const sessionId = collabStore.startAISession(config.workspaceId, aiUser);
|
|
151
|
+
collabStore.setAITask(sessionId, event.task.description);
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
case 'task_completed': {
|
|
155
|
+
// Find and complete the AI session
|
|
156
|
+
const sessions = collabStore.getAISessions();
|
|
157
|
+
const session = sessions.find((s) => s.aiUser.id === event.agentId && s.status === 'active');
|
|
158
|
+
if (session) {
|
|
159
|
+
collabStore.completeAISession(session.id);
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Handle collaboration events
|
|
167
|
+
*/
|
|
168
|
+
function handleCollabEvent(event) {
|
|
169
|
+
// Map collaboration events back to agent store if needed
|
|
170
|
+
switch (event.type) {
|
|
171
|
+
case 'user_joined': {
|
|
172
|
+
const user = event.user;
|
|
173
|
+
if (user.isAI) {
|
|
174
|
+
// An AI joined via collaboration - register as agent
|
|
175
|
+
const existingAgent = agentsStore.getAgent(user.id);
|
|
176
|
+
if (!existingAgent) {
|
|
177
|
+
agentsStore.addAgent({
|
|
178
|
+
id: user.id,
|
|
179
|
+
name: user.name,
|
|
180
|
+
type: 'coder',
|
|
181
|
+
status: 'online',
|
|
182
|
+
capabilities: ['code_generation'],
|
|
183
|
+
workspaceId: config?.workspaceId ?? '',
|
|
184
|
+
joinedAt: new Date().toISOString(),
|
|
185
|
+
lastActivity: new Date().toISOString(),
|
|
186
|
+
color: user.color
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
case 'user_left': {
|
|
193
|
+
const userId = event.userId;
|
|
194
|
+
const agent = agentsStore.getAgent(userId);
|
|
195
|
+
if (agent) {
|
|
196
|
+
agentsStore.removeAgent(userId);
|
|
197
|
+
}
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
case 'cursor_moved': {
|
|
201
|
+
// Convert collaboration cursor to agent cursor if from AI
|
|
202
|
+
const cursor = event.cursor;
|
|
203
|
+
const user = collabStore.getUsers().find((u) => u.id === cursor.userId);
|
|
204
|
+
if (user?.isAI) {
|
|
205
|
+
const agent = agentsStore.getAgent(cursor.userId);
|
|
206
|
+
if (agent) {
|
|
207
|
+
agentsStore.updateCursor({
|
|
208
|
+
agentId: cursor.userId,
|
|
209
|
+
agent,
|
|
210
|
+
filePath: config?.workspaceId ?? '', // Would need actual file path
|
|
211
|
+
position: cursor.position,
|
|
212
|
+
lastUpdate: new Date().toISOString()
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// ============================================================================
|
|
221
|
+
// Agent Cursor Sync
|
|
222
|
+
// ============================================================================
|
|
223
|
+
/**
|
|
224
|
+
* Update agent cursor position (called from editor)
|
|
225
|
+
*/
|
|
226
|
+
export function updateAgentCursorPosition(agentId, filePath, position, selection) {
|
|
227
|
+
const agent = agentsStore.getAgent(agentId);
|
|
228
|
+
if (!agent)
|
|
229
|
+
return;
|
|
230
|
+
const cursor = {
|
|
231
|
+
agentId,
|
|
232
|
+
agent,
|
|
233
|
+
filePath,
|
|
234
|
+
position,
|
|
235
|
+
selection,
|
|
236
|
+
lastUpdate: new Date().toISOString()
|
|
237
|
+
};
|
|
238
|
+
agentsStore.updateCursor(cursor);
|
|
239
|
+
// Also update collaboration cursors
|
|
240
|
+
if (config?.enableCollaboration) {
|
|
241
|
+
collabStore.updateCursor({
|
|
242
|
+
userId: agentId,
|
|
243
|
+
user: {
|
|
244
|
+
id: agent.id,
|
|
245
|
+
name: agent.name,
|
|
246
|
+
isAI: true,
|
|
247
|
+
color: agent.color ?? 'var(--ide-collab-ai)'
|
|
248
|
+
},
|
|
249
|
+
position,
|
|
250
|
+
selection: selection
|
|
251
|
+
? {
|
|
252
|
+
anchor: selection.start,
|
|
253
|
+
head: selection.end
|
|
254
|
+
}
|
|
255
|
+
: undefined,
|
|
256
|
+
lastActivity: new Date()
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// ============================================================================
|
|
261
|
+
// Lock Coordination
|
|
262
|
+
// ============================================================================
|
|
263
|
+
/**
|
|
264
|
+
* Acquire lock with agent awareness
|
|
265
|
+
*/
|
|
266
|
+
export async function acquireLockWithContext(filePath, purpose) {
|
|
267
|
+
const lock = await vfsStore.acquireLock(filePath, purpose);
|
|
268
|
+
if (lock) {
|
|
269
|
+
// Notify collaboration that we're editing this file
|
|
270
|
+
if (config?.enableCollaboration) {
|
|
271
|
+
collabStore.setLocalAwareness({
|
|
272
|
+
editingFile: filePath,
|
|
273
|
+
state: 'active'
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return lock;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Release lock with cleanup
|
|
281
|
+
*/
|
|
282
|
+
export async function releaseLockWithContext(filePath) {
|
|
283
|
+
await vfsStore.releaseLock(filePath);
|
|
284
|
+
// Update awareness
|
|
285
|
+
if (config?.enableCollaboration) {
|
|
286
|
+
collabStore.setLocalAwareness({
|
|
287
|
+
editingFile: undefined,
|
|
288
|
+
state: 'idle'
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Check if file can be edited (not locked by others)
|
|
294
|
+
*/
|
|
295
|
+
export function canEditFile(filePath) {
|
|
296
|
+
const lockStatus = vfsStore.getLockStatus(filePath);
|
|
297
|
+
if (lockStatus.status === 'unlocked')
|
|
298
|
+
return true;
|
|
299
|
+
if (lockStatus.status === 'locked') {
|
|
300
|
+
return lockStatus.lock.holder === config?.userId;
|
|
301
|
+
}
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get agents currently editing a file
|
|
306
|
+
*/
|
|
307
|
+
export function getFileEditors(filePath) {
|
|
308
|
+
return agentsStore.getAgentsWorkingOnFile(filePath);
|
|
309
|
+
}
|
|
310
|
+
// ============================================================================
|
|
311
|
+
// Context Getters
|
|
312
|
+
// ============================================================================
|
|
313
|
+
/**
|
|
314
|
+
* Get current IDE context
|
|
315
|
+
*/
|
|
316
|
+
export function getContext() {
|
|
317
|
+
if (!config)
|
|
318
|
+
return null;
|
|
319
|
+
return {
|
|
320
|
+
workspaceId: config.workspaceId,
|
|
321
|
+
userId: config.userId,
|
|
322
|
+
userName: config.userName,
|
|
323
|
+
connected: vfsStore.getConnected() && collabStore.getIsConnected(),
|
|
324
|
+
synced: collabStore.getSynced()
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Get all online agents
|
|
329
|
+
*/
|
|
330
|
+
export function getOnlineAgents() {
|
|
331
|
+
return agentsStore.getOnlineAgents();
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Get all locks
|
|
335
|
+
*/
|
|
336
|
+
export function getAllLocks() {
|
|
337
|
+
return vfsStore.getLocks();
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Get lock for specific file
|
|
341
|
+
*/
|
|
342
|
+
export function getFileLock(filePath) {
|
|
343
|
+
return vfsStore.getLock(filePath);
|
|
344
|
+
}
|
|
345
|
+
// ============================================================================
|
|
346
|
+
// Cleanup
|
|
347
|
+
// ============================================================================
|
|
348
|
+
/**
|
|
349
|
+
* Cleanup all subscriptions and reset state
|
|
350
|
+
*/
|
|
351
|
+
export function cleanup() {
|
|
352
|
+
// Unsubscribe all
|
|
353
|
+
subscriptions.forEach((unsub) => unsub());
|
|
354
|
+
subscriptions = [];
|
|
355
|
+
// Reset stores
|
|
356
|
+
vfsStore.reset();
|
|
357
|
+
agentsStore.reset();
|
|
358
|
+
collabStore.reset();
|
|
359
|
+
config = null;
|
|
360
|
+
initialized = false;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Check if integration is initialized
|
|
364
|
+
*/
|
|
365
|
+
export function isInitialized() {
|
|
366
|
+
return initialized;
|
|
367
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP WebSocket Client
|
|
3
|
+
* Communicates with a language server via WebSocket + JSON-RPC
|
|
4
|
+
*/
|
|
5
|
+
import type { LSPClientConfig, LSPConnectionState, LSPClientEvents, ServerCapabilities, Position, Range, TextDocumentContentChangeEvent, CompletionItem, CompletionTriggerKind, Hover, SignatureHelp, Location, CodeAction, WorkspaceEdit, FormattingOptions, TextEdit, Diagnostic } from '../types/lsp';
|
|
6
|
+
export declare class LSPClient {
|
|
7
|
+
private config;
|
|
8
|
+
private ws;
|
|
9
|
+
private requestId;
|
|
10
|
+
private pendingRequests;
|
|
11
|
+
private notificationHandlers;
|
|
12
|
+
private _state;
|
|
13
|
+
private _capabilities;
|
|
14
|
+
private reconnectAttempts;
|
|
15
|
+
private reconnectTimeout;
|
|
16
|
+
private openDocuments;
|
|
17
|
+
private diagnosticsCache;
|
|
18
|
+
private eventHandlers;
|
|
19
|
+
constructor(config: LSPClientConfig);
|
|
20
|
+
get state(): LSPConnectionState;
|
|
21
|
+
get capabilities(): ServerCapabilities | null;
|
|
22
|
+
get isReady(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Dispatch an event to every subscriber registered via on(). Iterates a copy
|
|
25
|
+
* so a handler that unsubscribes during dispatch cannot corrupt iteration,
|
|
26
|
+
* and isolates handler errors so one failure does not block the others.
|
|
27
|
+
*/
|
|
28
|
+
private emitEvent;
|
|
29
|
+
private setState;
|
|
30
|
+
connect(): Promise<void>;
|
|
31
|
+
private handleDisconnect;
|
|
32
|
+
disconnect(): Promise<void>;
|
|
33
|
+
private initialize;
|
|
34
|
+
private handleMessage;
|
|
35
|
+
private sendRequest;
|
|
36
|
+
private sendNotification;
|
|
37
|
+
onNotification(method: string, handler: (params: unknown) => void): () => void;
|
|
38
|
+
on<K extends keyof LSPClientEvents>(event: K, handler: LSPClientEvents[K]): () => void;
|
|
39
|
+
didOpen(uri: string, languageId: string, version: number, text: string): void;
|
|
40
|
+
didChange(uri: string, version: number, changes: TextDocumentContentChangeEvent[]): void;
|
|
41
|
+
didSave(uri: string, text?: string): void;
|
|
42
|
+
didClose(uri: string): void;
|
|
43
|
+
completion(uri: string, position: Position, triggerKind?: CompletionTriggerKind, triggerCharacter?: string): Promise<CompletionItem[]>;
|
|
44
|
+
completionResolve(item: CompletionItem): Promise<CompletionItem>;
|
|
45
|
+
hover(uri: string, position: Position): Promise<Hover | null>;
|
|
46
|
+
signatureHelp(uri: string, position: Position, triggerCharacter?: string): Promise<SignatureHelp | null>;
|
|
47
|
+
definition(uri: string, position: Position): Promise<Location[]>;
|
|
48
|
+
typeDefinition(uri: string, position: Position): Promise<Location[]>;
|
|
49
|
+
references(uri: string, position: Position, includeDeclaration?: boolean): Promise<Location[]>;
|
|
50
|
+
codeAction(uri: string, range: Range, diagnostics?: Diagnostic[]): Promise<CodeAction[]>;
|
|
51
|
+
prepareRename(uri: string, position: Position): Promise<Range | {
|
|
52
|
+
range: Range;
|
|
53
|
+
placeholder: string;
|
|
54
|
+
} | null>;
|
|
55
|
+
rename(uri: string, position: Position, newName: string): Promise<WorkspaceEdit | null>;
|
|
56
|
+
formatting(uri: string, options?: Partial<FormattingOptions>): Promise<TextEdit[]>;
|
|
57
|
+
getDiagnostics(uri: string): Diagnostic[];
|
|
58
|
+
getAllDiagnostics(): Map<string, Diagnostic[]>;
|
|
59
|
+
getCompletionTriggerCharacters(): string[];
|
|
60
|
+
getSignatureHelpTriggerCharacters(): string[];
|
|
61
|
+
supportsFeature(feature: keyof ServerCapabilities): boolean;
|
|
62
|
+
}
|
|
63
|
+
export declare function createLSPClient(config: LSPClientConfig): LSPClient;
|
|
64
|
+
export declare function positionToOffset(content: string, position: Position): number;
|
|
65
|
+
export declare function offsetToPosition(content: string, offset: number): Position;
|
|
66
|
+
export declare function rangeToOffsets(content: string, range: Range): {
|
|
67
|
+
start: number;
|
|
68
|
+
end: number;
|
|
69
|
+
};
|