@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,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI store using Svelte 5 runes
|
|
3
|
+
* Manages AI conversations, messages, and tools
|
|
4
|
+
*
|
|
5
|
+
* Note: Svelte 5 modules cannot directly export $derived values.
|
|
6
|
+
* We use getter functions to expose reactive derived state.
|
|
7
|
+
*/
|
|
8
|
+
// Default configuration
|
|
9
|
+
const defaultConfig = {
|
|
10
|
+
endpoint: '/api/chat',
|
|
11
|
+
model: 'claude-3-5-sonnet',
|
|
12
|
+
systemPrompt: 'You are a helpful coding assistant integrated into an IDE.',
|
|
13
|
+
tools: [],
|
|
14
|
+
maxTokens: 4096,
|
|
15
|
+
temperature: 0.7,
|
|
16
|
+
streaming: true
|
|
17
|
+
};
|
|
18
|
+
// Reactive state
|
|
19
|
+
let state = $state({
|
|
20
|
+
conversations: [],
|
|
21
|
+
activeConversationId: null,
|
|
22
|
+
tools: new Map(),
|
|
23
|
+
config: { ...defaultConfig },
|
|
24
|
+
editSessions: [],
|
|
25
|
+
suggestions: [],
|
|
26
|
+
isStreaming: false,
|
|
27
|
+
isPanelOpen: false,
|
|
28
|
+
error: null
|
|
29
|
+
});
|
|
30
|
+
// Getter functions for derived values (Svelte 5 module-safe)
|
|
31
|
+
export function getConversations() {
|
|
32
|
+
return state.conversations;
|
|
33
|
+
}
|
|
34
|
+
export function getActiveConversationId() {
|
|
35
|
+
return state.activeConversationId;
|
|
36
|
+
}
|
|
37
|
+
export function getActiveConversation() {
|
|
38
|
+
return state.conversations.find((c) => c.id === state.activeConversationId) ?? null;
|
|
39
|
+
}
|
|
40
|
+
export function getMessages() {
|
|
41
|
+
const active = getActiveConversation();
|
|
42
|
+
return active?.messages ?? [];
|
|
43
|
+
}
|
|
44
|
+
export function getTools() {
|
|
45
|
+
return Array.from(state.tools.values());
|
|
46
|
+
}
|
|
47
|
+
export function getConfig() {
|
|
48
|
+
return state.config;
|
|
49
|
+
}
|
|
50
|
+
export function getEditSessions() {
|
|
51
|
+
return state.editSessions;
|
|
52
|
+
}
|
|
53
|
+
export function getActiveEditSessions() {
|
|
54
|
+
return state.editSessions.filter((s) => s.status === 'editing');
|
|
55
|
+
}
|
|
56
|
+
export function getSuggestions() {
|
|
57
|
+
return state.suggestions;
|
|
58
|
+
}
|
|
59
|
+
export function getIsStreaming() {
|
|
60
|
+
return state.isStreaming;
|
|
61
|
+
}
|
|
62
|
+
export function getIsPanelOpen() {
|
|
63
|
+
return state.isPanelOpen;
|
|
64
|
+
}
|
|
65
|
+
export function getError() {
|
|
66
|
+
return state.error;
|
|
67
|
+
}
|
|
68
|
+
// Legacy aliases for backward compatibility
|
|
69
|
+
export const conversations = { get current() { return getConversations(); } };
|
|
70
|
+
export const activeConversationId = { get current() { return getActiveConversationId(); } };
|
|
71
|
+
export const activeConversation = { get current() { return getActiveConversation(); } };
|
|
72
|
+
export const messages = { get current() { return getMessages(); } };
|
|
73
|
+
export const tools = { get current() { return getTools(); } };
|
|
74
|
+
export const config = { get current() { return getConfig(); } };
|
|
75
|
+
export const editSessions = { get current() { return getEditSessions(); } };
|
|
76
|
+
export const activeEditSessions = { get current() { return getActiveEditSessions(); } };
|
|
77
|
+
export const suggestions = { get current() { return getSuggestions(); } };
|
|
78
|
+
export const isStreaming = { get current() { return getIsStreaming(); } };
|
|
79
|
+
export const isPanelOpen = { get current() { return getIsPanelOpen(); } };
|
|
80
|
+
export const error = { get current() { return getError(); } };
|
|
81
|
+
/**
|
|
82
|
+
* Create a new conversation
|
|
83
|
+
*/
|
|
84
|
+
export function createConversation(title, context) {
|
|
85
|
+
const id = crypto.randomUUID();
|
|
86
|
+
const conversation = {
|
|
87
|
+
id,
|
|
88
|
+
title: title ?? 'New conversation',
|
|
89
|
+
messages: [],
|
|
90
|
+
createdAt: new Date(),
|
|
91
|
+
updatedAt: new Date(),
|
|
92
|
+
context
|
|
93
|
+
};
|
|
94
|
+
state.conversations = [...state.conversations, conversation];
|
|
95
|
+
state.activeConversationId = id;
|
|
96
|
+
return id;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Set active conversation
|
|
100
|
+
*/
|
|
101
|
+
export function setActiveConversation(conversationId) {
|
|
102
|
+
if (conversationId === null || state.conversations.some((c) => c.id === conversationId)) {
|
|
103
|
+
state.activeConversationId = conversationId;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Delete a conversation
|
|
108
|
+
*/
|
|
109
|
+
export function deleteConversation(conversationId) {
|
|
110
|
+
state.conversations = state.conversations.filter((c) => c.id !== conversationId);
|
|
111
|
+
if (state.activeConversationId === conversationId) {
|
|
112
|
+
state.activeConversationId = state.conversations[0]?.id ?? null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Add a message to the active conversation
|
|
117
|
+
*/
|
|
118
|
+
export function addMessage(message) {
|
|
119
|
+
if (!state.activeConversationId) {
|
|
120
|
+
createConversation();
|
|
121
|
+
}
|
|
122
|
+
const id = crypto.randomUUID();
|
|
123
|
+
const newMessage = {
|
|
124
|
+
...message,
|
|
125
|
+
id,
|
|
126
|
+
timestamp: new Date()
|
|
127
|
+
};
|
|
128
|
+
state.conversations = state.conversations.map((c) => c.id === state.activeConversationId
|
|
129
|
+
? { ...c, messages: [...c.messages, newMessage], updatedAt: new Date() }
|
|
130
|
+
: c);
|
|
131
|
+
return id;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Update a message (for streaming)
|
|
135
|
+
*/
|
|
136
|
+
export function updateMessage(messageId, updates) {
|
|
137
|
+
state.conversations = state.conversations.map((c) => c.id === state.activeConversationId
|
|
138
|
+
? {
|
|
139
|
+
...c,
|
|
140
|
+
messages: c.messages.map((m) => (m.id === messageId ? { ...m, ...updates } : m)),
|
|
141
|
+
updatedAt: new Date()
|
|
142
|
+
}
|
|
143
|
+
: c);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Send a user message and get AI response
|
|
147
|
+
*/
|
|
148
|
+
export async function sendMessage(content, context) {
|
|
149
|
+
if (!content.trim())
|
|
150
|
+
return;
|
|
151
|
+
// Add user message
|
|
152
|
+
addMessage({ role: 'user', content });
|
|
153
|
+
// Create placeholder for assistant response
|
|
154
|
+
const assistantId = addMessage({
|
|
155
|
+
role: 'assistant',
|
|
156
|
+
content: '',
|
|
157
|
+
isStreaming: true
|
|
158
|
+
});
|
|
159
|
+
state.isStreaming = true;
|
|
160
|
+
state.error = null;
|
|
161
|
+
try {
|
|
162
|
+
const activeConv = getActiveConversation();
|
|
163
|
+
const response = await fetch(state.config.endpoint ?? '/api/chat', {
|
|
164
|
+
method: 'POST',
|
|
165
|
+
headers: {
|
|
166
|
+
'Content-Type': 'application/json',
|
|
167
|
+
...state.config.headers
|
|
168
|
+
},
|
|
169
|
+
body: JSON.stringify({
|
|
170
|
+
messages: activeConv?.messages.slice(0, -1) ?? [],
|
|
171
|
+
model: state.config.model,
|
|
172
|
+
systemPrompt: state.config.systemPrompt,
|
|
173
|
+
tools: Array.from(state.tools.values()).map((t) => ({
|
|
174
|
+
name: t.name,
|
|
175
|
+
description: t.description,
|
|
176
|
+
parameters: t.parameters
|
|
177
|
+
})),
|
|
178
|
+
maxTokens: state.config.maxTokens,
|
|
179
|
+
temperature: state.config.temperature,
|
|
180
|
+
context: context ?? activeConv?.context
|
|
181
|
+
})
|
|
182
|
+
});
|
|
183
|
+
if (!response.ok) {
|
|
184
|
+
throw new Error(`API error: ${response.status}`);
|
|
185
|
+
}
|
|
186
|
+
if (state.config.streaming && response.body) {
|
|
187
|
+
const reader = response.body.getReader();
|
|
188
|
+
const decoder = new TextDecoder();
|
|
189
|
+
let fullContent = '';
|
|
190
|
+
while (true) {
|
|
191
|
+
const { done, value } = await reader.read();
|
|
192
|
+
if (done)
|
|
193
|
+
break;
|
|
194
|
+
const chunk = decoder.decode(value);
|
|
195
|
+
fullContent += chunk;
|
|
196
|
+
updateMessage(assistantId, {
|
|
197
|
+
content: fullContent,
|
|
198
|
+
isStreaming: true
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
updateMessage(assistantId, {
|
|
202
|
+
content: fullContent,
|
|
203
|
+
isStreaming: false
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
const data = await response.json();
|
|
208
|
+
updateMessage(assistantId, {
|
|
209
|
+
content: data.content,
|
|
210
|
+
toolCalls: data.toolCalls,
|
|
211
|
+
isStreaming: false,
|
|
212
|
+
metadata: data.metadata
|
|
213
|
+
});
|
|
214
|
+
// Handle tool calls
|
|
215
|
+
if (data.toolCalls?.length) {
|
|
216
|
+
for (const toolCall of data.toolCalls) {
|
|
217
|
+
await executeToolCall(toolCall.name, toolCall.arguments, toolCall.id);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
const errorMessage = err instanceof Error ? err.message : 'Unknown error';
|
|
224
|
+
state.error = errorMessage;
|
|
225
|
+
updateMessage(assistantId, {
|
|
226
|
+
content: '',
|
|
227
|
+
error: errorMessage,
|
|
228
|
+
isStreaming: false
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
state.isStreaming = false;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Execute a tool call
|
|
237
|
+
*/
|
|
238
|
+
async function executeToolCall(toolName, args, toolCallId) {
|
|
239
|
+
const tool = state.tools.get(toolName);
|
|
240
|
+
if (!tool) {
|
|
241
|
+
addMessage({
|
|
242
|
+
role: 'tool',
|
|
243
|
+
content: '',
|
|
244
|
+
toolResult: {
|
|
245
|
+
toolCallId,
|
|
246
|
+
result: null,
|
|
247
|
+
error: `Tool not found: ${toolName}`
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
try {
|
|
253
|
+
const activeConv = getActiveConversation();
|
|
254
|
+
const result = await tool.handler(args, activeConv?.context ?? {});
|
|
255
|
+
addMessage({
|
|
256
|
+
role: 'tool',
|
|
257
|
+
content: '',
|
|
258
|
+
toolResult: {
|
|
259
|
+
toolCallId,
|
|
260
|
+
result
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
addMessage({
|
|
266
|
+
role: 'tool',
|
|
267
|
+
content: '',
|
|
268
|
+
toolResult: {
|
|
269
|
+
toolCallId,
|
|
270
|
+
result: null,
|
|
271
|
+
error: err instanceof Error ? err.message : 'Tool execution failed'
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Register a tool
|
|
278
|
+
*/
|
|
279
|
+
export function registerTool(tool) {
|
|
280
|
+
state.tools.set(tool.name, tool);
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Unregister a tool
|
|
284
|
+
*/
|
|
285
|
+
export function unregisterTool(toolName) {
|
|
286
|
+
state.tools.delete(toolName);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Update AI configuration
|
|
290
|
+
*/
|
|
291
|
+
export function updateConfig(updates) {
|
|
292
|
+
state.config = { ...state.config, ...updates };
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Toggle AI panel visibility
|
|
296
|
+
*/
|
|
297
|
+
export function togglePanel() {
|
|
298
|
+
state.isPanelOpen = !state.isPanelOpen;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Open AI panel
|
|
302
|
+
*/
|
|
303
|
+
export function openPanel() {
|
|
304
|
+
state.isPanelOpen = true;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Close AI panel
|
|
308
|
+
*/
|
|
309
|
+
export function closePanel() {
|
|
310
|
+
state.isPanelOpen = false;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Start an AI edit session
|
|
314
|
+
*/
|
|
315
|
+
export function startEditSession(conversationId, filePath, originalContent) {
|
|
316
|
+
const id = crypto.randomUUID();
|
|
317
|
+
const session = {
|
|
318
|
+
id,
|
|
319
|
+
conversationId,
|
|
320
|
+
filePath,
|
|
321
|
+
status: 'pending',
|
|
322
|
+
originalContent,
|
|
323
|
+
startedAt: new Date()
|
|
324
|
+
};
|
|
325
|
+
state.editSessions = [...state.editSessions, session];
|
|
326
|
+
return id;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Update edit session status
|
|
330
|
+
*/
|
|
331
|
+
export function updateEditSession(sessionId, updates) {
|
|
332
|
+
state.editSessions = state.editSessions.map((s) => s.id === sessionId ? { ...s, ...updates } : s);
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Complete an edit session
|
|
336
|
+
*/
|
|
337
|
+
export function completeEditSession(sessionId, proposedContent, diff) {
|
|
338
|
+
state.editSessions = state.editSessions.map((s) => s.id === sessionId
|
|
339
|
+
? { ...s, status: 'reviewing', proposedContent, diff, completedAt: new Date() }
|
|
340
|
+
: s);
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Apply or reject an edit session
|
|
344
|
+
*/
|
|
345
|
+
export function resolveEditSession(sessionId, apply) {
|
|
346
|
+
state.editSessions = state.editSessions.map((s) => s.id === sessionId ? { ...s, status: apply ? 'applied' : 'rejected' } : s);
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Add a suggestion
|
|
350
|
+
*/
|
|
351
|
+
export function addSuggestion(suggestion) {
|
|
352
|
+
const id = crypto.randomUUID();
|
|
353
|
+
state.suggestions = [...state.suggestions, { ...suggestion, id }];
|
|
354
|
+
return id;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Remove a suggestion
|
|
358
|
+
*/
|
|
359
|
+
export function removeSuggestion(suggestionId) {
|
|
360
|
+
state.suggestions = state.suggestions.filter((s) => s.id !== suggestionId);
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Clear all suggestions
|
|
364
|
+
*/
|
|
365
|
+
export function clearSuggestions() {
|
|
366
|
+
state.suggestions = [];
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Update conversation context
|
|
370
|
+
*/
|
|
371
|
+
export function updateContext(context) {
|
|
372
|
+
if (!state.activeConversationId)
|
|
373
|
+
return;
|
|
374
|
+
state.conversations = state.conversations.map((c) => c.id === state.activeConversationId
|
|
375
|
+
? { ...c, context: { ...c.context, ...context }, updatedAt: new Date() }
|
|
376
|
+
: c);
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Clear error state
|
|
380
|
+
*/
|
|
381
|
+
export function clearError() {
|
|
382
|
+
state.error = null;
|
|
383
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collaboration store using Svelte 5 runes
|
|
3
|
+
* Manages CRDT-based real-time collaboration
|
|
4
|
+
*
|
|
5
|
+
* Note: Svelte 5 modules cannot directly export $derived values.
|
|
6
|
+
* We use getter functions to expose reactive derived state.
|
|
7
|
+
*/
|
|
8
|
+
import type { CollaborationConfig, CollaborationState, CollaborationUser, CollaboratorCursor, CollaboratorAwareness, AICollaborationSession, AIProposedChange, DocumentSnapshot, CollaborationEventHandler } from '../types';
|
|
9
|
+
export declare function getConfig(): CollaborationConfig | null;
|
|
10
|
+
export declare function getStatus(): CollaborationState['status'];
|
|
11
|
+
export declare function getError(): string | null;
|
|
12
|
+
export declare function getSynced(): boolean;
|
|
13
|
+
export declare function getUsers(): CollaborationUser[];
|
|
14
|
+
export declare function getCursors(): CollaboratorCursor[];
|
|
15
|
+
export declare function getAwareness(): CollaboratorAwareness[];
|
|
16
|
+
export declare function getAISessions(): AICollaborationSession[];
|
|
17
|
+
export declare function getActiveAISessions(): AICollaborationSession[];
|
|
18
|
+
export declare function getPendingChanges(): AIProposedChange[];
|
|
19
|
+
export declare function getSnapshots(): DocumentSnapshot[];
|
|
20
|
+
export declare function getLocalUser(): CollaborationUser | null;
|
|
21
|
+
export declare function getIsConnected(): boolean;
|
|
22
|
+
export declare function getOtherUsers(): CollaborationUser[];
|
|
23
|
+
export declare const config: {
|
|
24
|
+
readonly current: CollaborationConfig | null;
|
|
25
|
+
};
|
|
26
|
+
export declare const status: {
|
|
27
|
+
readonly current: "error" | "connected" | "disconnected" | "connecting";
|
|
28
|
+
};
|
|
29
|
+
export declare const error: {
|
|
30
|
+
readonly current: string | null;
|
|
31
|
+
};
|
|
32
|
+
export declare const synced: {
|
|
33
|
+
readonly current: boolean;
|
|
34
|
+
};
|
|
35
|
+
export declare const users: {
|
|
36
|
+
readonly current: CollaborationUser[];
|
|
37
|
+
};
|
|
38
|
+
export declare const cursors: {
|
|
39
|
+
readonly current: CollaboratorCursor[];
|
|
40
|
+
};
|
|
41
|
+
export declare const awareness: {
|
|
42
|
+
readonly current: CollaboratorAwareness[];
|
|
43
|
+
};
|
|
44
|
+
export declare const aiSessions: {
|
|
45
|
+
readonly current: AICollaborationSession[];
|
|
46
|
+
};
|
|
47
|
+
export declare const activeAISessions: {
|
|
48
|
+
readonly current: AICollaborationSession[];
|
|
49
|
+
};
|
|
50
|
+
export declare const pendingChanges: {
|
|
51
|
+
readonly current: AIProposedChange[];
|
|
52
|
+
};
|
|
53
|
+
export declare const snapshots: {
|
|
54
|
+
readonly current: DocumentSnapshot[];
|
|
55
|
+
};
|
|
56
|
+
export declare const localUser: {
|
|
57
|
+
readonly current: CollaborationUser | null;
|
|
58
|
+
};
|
|
59
|
+
export declare const isConnected: {
|
|
60
|
+
readonly current: boolean;
|
|
61
|
+
};
|
|
62
|
+
export declare const otherUsers: {
|
|
63
|
+
readonly current: CollaborationUser[];
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Initialize collaboration with config
|
|
67
|
+
*/
|
|
68
|
+
export declare function initialize(collabConfig: CollaborationConfig): void;
|
|
69
|
+
/**
|
|
70
|
+
* Set connection status
|
|
71
|
+
*/
|
|
72
|
+
export declare function setStatus(newStatus: CollaborationState['status'], errorMsg?: string): void;
|
|
73
|
+
/**
|
|
74
|
+
* Set synced state
|
|
75
|
+
*/
|
|
76
|
+
export declare function setSynced(syncedState: boolean): void;
|
|
77
|
+
/**
|
|
78
|
+
* Add a user to the session
|
|
79
|
+
*/
|
|
80
|
+
export declare function addUser(user: CollaborationUser): void;
|
|
81
|
+
/**
|
|
82
|
+
* Remove a user from the session
|
|
83
|
+
*/
|
|
84
|
+
export declare function removeUser(userId: string): void;
|
|
85
|
+
/**
|
|
86
|
+
* Update cursor position for a user
|
|
87
|
+
*/
|
|
88
|
+
export declare function updateCursor(cursor: CollaboratorCursor): void;
|
|
89
|
+
/**
|
|
90
|
+
* Update awareness for a user
|
|
91
|
+
*/
|
|
92
|
+
export declare function updateAwareness(awarenessData: CollaboratorAwareness): void;
|
|
93
|
+
/**
|
|
94
|
+
* Update local user's cursor
|
|
95
|
+
*/
|
|
96
|
+
export declare function setLocalCursor(position: {
|
|
97
|
+
line: number;
|
|
98
|
+
column: number;
|
|
99
|
+
}, selection?: {
|
|
100
|
+
anchor: {
|
|
101
|
+
line: number;
|
|
102
|
+
column: number;
|
|
103
|
+
};
|
|
104
|
+
head: {
|
|
105
|
+
line: number;
|
|
106
|
+
column: number;
|
|
107
|
+
};
|
|
108
|
+
}): void;
|
|
109
|
+
/**
|
|
110
|
+
* Update local user's awareness
|
|
111
|
+
*/
|
|
112
|
+
export declare function setLocalAwareness(updates: Partial<Omit<CollaboratorAwareness, 'userId' | 'user'>>): void;
|
|
113
|
+
/**
|
|
114
|
+
* Start an AI collaboration session
|
|
115
|
+
*/
|
|
116
|
+
export declare function startAISession(documentId: string, aiUser: CollaborationUser): string;
|
|
117
|
+
/**
|
|
118
|
+
* Update AI session status
|
|
119
|
+
*/
|
|
120
|
+
export declare function updateAISession(sessionId: string, updates: Partial<AICollaborationSession>): void;
|
|
121
|
+
/**
|
|
122
|
+
* Set current task for AI session
|
|
123
|
+
*/
|
|
124
|
+
export declare function setAITask(sessionId: string, task: string): void;
|
|
125
|
+
/**
|
|
126
|
+
* Propose a change from AI
|
|
127
|
+
*/
|
|
128
|
+
export declare function proposeAIChange(sessionId: string, change: Omit<AIProposedChange, 'id' | 'sessionId' | 'status'>): string;
|
|
129
|
+
/**
|
|
130
|
+
* Review an AI proposed change
|
|
131
|
+
*/
|
|
132
|
+
export declare function reviewAIChange(changeId: string, approved: boolean, reviewerId: string): void;
|
|
133
|
+
/**
|
|
134
|
+
* Complete an AI session
|
|
135
|
+
*/
|
|
136
|
+
export declare function completeAISession(sessionId: string): void;
|
|
137
|
+
/**
|
|
138
|
+
* Cancel an AI session
|
|
139
|
+
*/
|
|
140
|
+
export declare function cancelAISession(sessionId: string): void;
|
|
141
|
+
/**
|
|
142
|
+
* Create a document snapshot
|
|
143
|
+
*/
|
|
144
|
+
export declare function createSnapshot(documentId: string, content: string, reason?: DocumentSnapshot['reason']): string;
|
|
145
|
+
/**
|
|
146
|
+
* Get snapshots for a document
|
|
147
|
+
*/
|
|
148
|
+
export declare function getDocumentSnapshots(documentId: string): DocumentSnapshot[];
|
|
149
|
+
/**
|
|
150
|
+
* Subscribe to collaboration events
|
|
151
|
+
*/
|
|
152
|
+
export declare function onEvent(handler: CollaborationEventHandler): () => void;
|
|
153
|
+
/**
|
|
154
|
+
* Disconnect and cleanup
|
|
155
|
+
*/
|
|
156
|
+
export declare function disconnect(): void;
|
|
157
|
+
/**
|
|
158
|
+
* Reset collaboration state
|
|
159
|
+
*/
|
|
160
|
+
export declare function reset(): void;
|
|
161
|
+
/**
|
|
162
|
+
* Get user color by index
|
|
163
|
+
*/
|
|
164
|
+
export declare function getUserColor(index: number): string;
|