@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,459 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agents store using Svelte 5 runes
|
|
3
|
+
* Manages multi-agent coordination and activity tracking
|
|
4
|
+
*
|
|
5
|
+
* Note: Svelte 5 modules cannot directly export $derived values.
|
|
6
|
+
* We use getter functions to expose reactive derived state.
|
|
7
|
+
*/
|
|
8
|
+
let state = $state({
|
|
9
|
+
agents: new Map(),
|
|
10
|
+
events: [],
|
|
11
|
+
maxEvents: 200,
|
|
12
|
+
activities: [],
|
|
13
|
+
maxActivities: 500,
|
|
14
|
+
cursors: new Map(),
|
|
15
|
+
selectedAgentId: null,
|
|
16
|
+
filter: 'all',
|
|
17
|
+
connected: false,
|
|
18
|
+
error: null
|
|
19
|
+
});
|
|
20
|
+
// Event handlers
|
|
21
|
+
const eventHandlers = new Map();
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Getter Functions (Svelte 5 module-safe)
|
|
24
|
+
// ============================================================================
|
|
25
|
+
export function getAgents() {
|
|
26
|
+
return Array.from(state.agents.values());
|
|
27
|
+
}
|
|
28
|
+
export function getAgent(agentId) {
|
|
29
|
+
return state.agents.get(agentId);
|
|
30
|
+
}
|
|
31
|
+
export function getOnlineAgents() {
|
|
32
|
+
return getAgents().filter((a) => a.status === 'online' || a.status === 'busy');
|
|
33
|
+
}
|
|
34
|
+
export function getOfflineAgents() {
|
|
35
|
+
return getAgents().filter((a) => a.status === 'offline');
|
|
36
|
+
}
|
|
37
|
+
export function getBusyAgents() {
|
|
38
|
+
return getAgents().filter((a) => a.status === 'busy');
|
|
39
|
+
}
|
|
40
|
+
export function getStalledAgents() {
|
|
41
|
+
return getAgents().filter((a) => a.status === 'stalled');
|
|
42
|
+
}
|
|
43
|
+
export function getAgentsByType(type) {
|
|
44
|
+
return getAgents().filter((a) => a.type === type);
|
|
45
|
+
}
|
|
46
|
+
export function getAgentsWorkingOnFile(filePath) {
|
|
47
|
+
return getAgents().filter((a) => a.currentTask?.files.includes(filePath));
|
|
48
|
+
}
|
|
49
|
+
export function getEvents() {
|
|
50
|
+
return state.events;
|
|
51
|
+
}
|
|
52
|
+
export function getActivities() {
|
|
53
|
+
return state.activities;
|
|
54
|
+
}
|
|
55
|
+
export function getActivitiesForAgent(agentId) {
|
|
56
|
+
return state.activities.filter((a) => a.agentId === agentId);
|
|
57
|
+
}
|
|
58
|
+
export function getRecentActivities(count) {
|
|
59
|
+
return state.activities.slice(0, count);
|
|
60
|
+
}
|
|
61
|
+
export function getCursors() {
|
|
62
|
+
return Array.from(state.cursors.values());
|
|
63
|
+
}
|
|
64
|
+
export function getCursor(agentId) {
|
|
65
|
+
return state.cursors.get(agentId);
|
|
66
|
+
}
|
|
67
|
+
export function getCursorsForFile(filePath) {
|
|
68
|
+
return getCursors().filter((c) => c.filePath === filePath);
|
|
69
|
+
}
|
|
70
|
+
export function getSelectedAgent() {
|
|
71
|
+
return state.selectedAgentId ? state.agents.get(state.selectedAgentId) : undefined;
|
|
72
|
+
}
|
|
73
|
+
export function getFilter() {
|
|
74
|
+
return state.filter;
|
|
75
|
+
}
|
|
76
|
+
export function getConnected() {
|
|
77
|
+
return state.connected;
|
|
78
|
+
}
|
|
79
|
+
export function getError() {
|
|
80
|
+
return state.error;
|
|
81
|
+
}
|
|
82
|
+
// Derived getters
|
|
83
|
+
export function getFilteredAgents() {
|
|
84
|
+
if (state.filter === 'all')
|
|
85
|
+
return getAgents();
|
|
86
|
+
return getAgents().filter((a) => a.status === state.filter);
|
|
87
|
+
}
|
|
88
|
+
export function getActiveTasksCount() {
|
|
89
|
+
return getAgents().filter((a) => a.currentTask !== undefined).length;
|
|
90
|
+
}
|
|
91
|
+
export function getTotalProgress() {
|
|
92
|
+
const agents = getBusyAgents();
|
|
93
|
+
if (agents.length === 0)
|
|
94
|
+
return 0;
|
|
95
|
+
const total = agents.reduce((sum, a) => {
|
|
96
|
+
return sum + (a.currentTask?.progress.percentage ?? 0);
|
|
97
|
+
}, 0);
|
|
98
|
+
return Math.round(total / agents.length);
|
|
99
|
+
}
|
|
100
|
+
export function getAgentCount() {
|
|
101
|
+
return state.agents.size;
|
|
102
|
+
}
|
|
103
|
+
export function getOnlineCount() {
|
|
104
|
+
return getOnlineAgents().length;
|
|
105
|
+
}
|
|
106
|
+
// Legacy aliases for backward compatibility
|
|
107
|
+
export const agents = { get current() { return getAgents(); } };
|
|
108
|
+
export const onlineAgents = { get current() { return getOnlineAgents(); } };
|
|
109
|
+
export const busyAgents = { get current() { return getBusyAgents(); } };
|
|
110
|
+
export const events = { get current() { return getEvents(); } };
|
|
111
|
+
export const activities = { get current() { return getActivities(); } };
|
|
112
|
+
export const cursors = { get current() { return getCursors(); } };
|
|
113
|
+
export const selectedAgent = { get current() { return getSelectedAgent(); } };
|
|
114
|
+
export const filter = { get current() { return getFilter(); } };
|
|
115
|
+
export const connected = { get current() { return getConnected(); } };
|
|
116
|
+
export const error = { get current() { return getError(); } };
|
|
117
|
+
// ============================================================================
|
|
118
|
+
// Agent Operations
|
|
119
|
+
// ============================================================================
|
|
120
|
+
export function addAgent(agent) {
|
|
121
|
+
state.agents.set(agent.id, agent);
|
|
122
|
+
// Create activity
|
|
123
|
+
addActivity({
|
|
124
|
+
id: crypto.randomUUID(),
|
|
125
|
+
agentId: agent.id,
|
|
126
|
+
agent,
|
|
127
|
+
timestamp: new Date().toISOString(),
|
|
128
|
+
type: 'milestone',
|
|
129
|
+
content: `${agent.name} joined the workspace`,
|
|
130
|
+
metadata: { severity: 'info' }
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
export function removeAgent(agentId) {
|
|
134
|
+
const agent = state.agents.get(agentId);
|
|
135
|
+
if (!agent)
|
|
136
|
+
return;
|
|
137
|
+
state.agents.delete(agentId);
|
|
138
|
+
state.cursors.delete(agentId);
|
|
139
|
+
// Create activity
|
|
140
|
+
addActivity({
|
|
141
|
+
id: crypto.randomUUID(),
|
|
142
|
+
agentId,
|
|
143
|
+
agent,
|
|
144
|
+
timestamp: new Date().toISOString(),
|
|
145
|
+
type: 'milestone',
|
|
146
|
+
content: `${agent.name} left the workspace`,
|
|
147
|
+
metadata: { severity: 'info' }
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
export function updateAgent(agentId, updates) {
|
|
151
|
+
const agent = state.agents.get(agentId);
|
|
152
|
+
if (!agent)
|
|
153
|
+
return;
|
|
154
|
+
const updated = { ...agent, ...updates, lastActivity: new Date().toISOString() };
|
|
155
|
+
state.agents.set(agentId, updated);
|
|
156
|
+
}
|
|
157
|
+
export function setAgentStatus(agentId, status) {
|
|
158
|
+
updateAgent(agentId, { status });
|
|
159
|
+
}
|
|
160
|
+
export function setAgentTask(agentId, task) {
|
|
161
|
+
updateAgent(agentId, { currentTask: task });
|
|
162
|
+
if (task) {
|
|
163
|
+
const agent = state.agents.get(agentId);
|
|
164
|
+
if (agent) {
|
|
165
|
+
addActivity({
|
|
166
|
+
id: crypto.randomUUID(),
|
|
167
|
+
agentId,
|
|
168
|
+
agent,
|
|
169
|
+
timestamp: new Date().toISOString(),
|
|
170
|
+
type: 'action',
|
|
171
|
+
content: `Started: ${task.description}`,
|
|
172
|
+
metadata: { files: task.files }
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
export function updateAgentProgress(agentId, progress) {
|
|
178
|
+
const agent = state.agents.get(agentId);
|
|
179
|
+
if (!agent?.currentTask)
|
|
180
|
+
return;
|
|
181
|
+
const updated = {
|
|
182
|
+
...agent,
|
|
183
|
+
lastActivity: new Date().toISOString(),
|
|
184
|
+
currentTask: {
|
|
185
|
+
...agent.currentTask,
|
|
186
|
+
progress: {
|
|
187
|
+
...agent.currentTask.progress,
|
|
188
|
+
...progress,
|
|
189
|
+
lastUpdate: new Date().toISOString()
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
state.agents.set(agentId, updated);
|
|
194
|
+
}
|
|
195
|
+
export function completeAgentTask(agentId, result, summary) {
|
|
196
|
+
const agent = state.agents.get(agentId);
|
|
197
|
+
if (!agent?.currentTask)
|
|
198
|
+
return;
|
|
199
|
+
// Add completion activity
|
|
200
|
+
addActivity({
|
|
201
|
+
id: crypto.randomUUID(),
|
|
202
|
+
agentId,
|
|
203
|
+
agent,
|
|
204
|
+
timestamp: new Date().toISOString(),
|
|
205
|
+
type: 'milestone',
|
|
206
|
+
content: summary,
|
|
207
|
+
metadata: {
|
|
208
|
+
severity: result === 'success' ? 'success' : result === 'failure' ? 'error' : 'warning',
|
|
209
|
+
files: agent.currentTask.files
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
// Clear task and set status
|
|
213
|
+
updateAgent(agentId, {
|
|
214
|
+
currentTask: undefined,
|
|
215
|
+
status: 'online'
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
// ============================================================================
|
|
219
|
+
// Cursor Operations
|
|
220
|
+
// ============================================================================
|
|
221
|
+
export function updateCursor(cursor) {
|
|
222
|
+
state.cursors.set(cursor.agentId, cursor);
|
|
223
|
+
}
|
|
224
|
+
export function removeCursor(agentId) {
|
|
225
|
+
state.cursors.delete(agentId);
|
|
226
|
+
}
|
|
227
|
+
export function clearCursorsForFile(filePath) {
|
|
228
|
+
for (const [agentId, cursor] of state.cursors) {
|
|
229
|
+
if (cursor.filePath === filePath) {
|
|
230
|
+
state.cursors.delete(agentId);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// ============================================================================
|
|
235
|
+
// Event Operations
|
|
236
|
+
// ============================================================================
|
|
237
|
+
export function addEvent(event) {
|
|
238
|
+
state.events = [event, ...state.events].slice(0, state.maxEvents);
|
|
239
|
+
// Notify handlers
|
|
240
|
+
const handlers = eventHandlers.get(event.type);
|
|
241
|
+
if (handlers) {
|
|
242
|
+
handlers.forEach((handler) => handler(event));
|
|
243
|
+
}
|
|
244
|
+
const wildcardHandlers = eventHandlers.get('*');
|
|
245
|
+
if (wildcardHandlers) {
|
|
246
|
+
wildcardHandlers.forEach((handler) => handler(event));
|
|
247
|
+
}
|
|
248
|
+
// Convert to activity
|
|
249
|
+
eventToActivity(event);
|
|
250
|
+
}
|
|
251
|
+
export function onTeamEvent(type, handler) {
|
|
252
|
+
if (!eventHandlers.has(type)) {
|
|
253
|
+
eventHandlers.set(type, new Set());
|
|
254
|
+
}
|
|
255
|
+
eventHandlers.get(type).add(handler);
|
|
256
|
+
return () => {
|
|
257
|
+
eventHandlers.get(type)?.delete(handler);
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
// ============================================================================
|
|
261
|
+
// Activity Operations
|
|
262
|
+
// ============================================================================
|
|
263
|
+
export function addActivity(activity) {
|
|
264
|
+
state.activities = [activity, ...state.activities].slice(0, state.maxActivities);
|
|
265
|
+
}
|
|
266
|
+
function eventToActivity(event) {
|
|
267
|
+
let content;
|
|
268
|
+
let type = 'action';
|
|
269
|
+
let metadata = {};
|
|
270
|
+
switch (event.type) {
|
|
271
|
+
case 'work_started':
|
|
272
|
+
content = `Started: ${event.task.description}`;
|
|
273
|
+
type = 'milestone';
|
|
274
|
+
metadata.files = event.task.files;
|
|
275
|
+
break;
|
|
276
|
+
case 'file_modified':
|
|
277
|
+
content = `${event.operation} ${event.path}`;
|
|
278
|
+
metadata.files = [event.path];
|
|
279
|
+
break;
|
|
280
|
+
case 'blocked':
|
|
281
|
+
content = `Blocked: ${event.reason}`;
|
|
282
|
+
type = 'error';
|
|
283
|
+
metadata.severity = 'warning';
|
|
284
|
+
metadata.files = event.blockedFiles;
|
|
285
|
+
break;
|
|
286
|
+
case 'conflict':
|
|
287
|
+
content = `Conflict on ${event.path}`;
|
|
288
|
+
type = 'error';
|
|
289
|
+
metadata.severity = 'error';
|
|
290
|
+
metadata.files = [event.path];
|
|
291
|
+
break;
|
|
292
|
+
case 'task_completed':
|
|
293
|
+
content = `Completed: ${event.task.description} (${event.result})`;
|
|
294
|
+
type = 'milestone';
|
|
295
|
+
metadata.severity = event.result === 'success' ? 'success' : 'warning';
|
|
296
|
+
break;
|
|
297
|
+
case 'agent_joined':
|
|
298
|
+
content = `${event.agent.name} joined`;
|
|
299
|
+
type = 'system';
|
|
300
|
+
break;
|
|
301
|
+
case 'agent_left':
|
|
302
|
+
content = `${event.agent.name} left${event.reason ? `: ${event.reason}` : ''}`;
|
|
303
|
+
type = 'system';
|
|
304
|
+
break;
|
|
305
|
+
case 'progress_update':
|
|
306
|
+
// Don't create activity for progress updates
|
|
307
|
+
return;
|
|
308
|
+
default:
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
addActivity({
|
|
312
|
+
id: crypto.randomUUID(),
|
|
313
|
+
agentId: event.agentId,
|
|
314
|
+
agent: event.agent,
|
|
315
|
+
timestamp: event.timestamp,
|
|
316
|
+
type,
|
|
317
|
+
content,
|
|
318
|
+
metadata
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
// ============================================================================
|
|
322
|
+
// UI Operations
|
|
323
|
+
// ============================================================================
|
|
324
|
+
export function selectAgent(agentId) {
|
|
325
|
+
state.selectedAgentId = agentId;
|
|
326
|
+
}
|
|
327
|
+
export function setFilter(filter) {
|
|
328
|
+
state.filter = filter;
|
|
329
|
+
}
|
|
330
|
+
export function clearActivities() {
|
|
331
|
+
state.activities = [];
|
|
332
|
+
}
|
|
333
|
+
export function clearEvents() {
|
|
334
|
+
state.events = [];
|
|
335
|
+
}
|
|
336
|
+
// ============================================================================
|
|
337
|
+
// Integration with VFS Events
|
|
338
|
+
// ============================================================================
|
|
339
|
+
export function handleVFSEvent(event) {
|
|
340
|
+
switch (event.type) {
|
|
341
|
+
case 'iteration_completed': {
|
|
342
|
+
const iterEvent = event;
|
|
343
|
+
const agent = state.agents.get(iterEvent.agentId);
|
|
344
|
+
if (agent) {
|
|
345
|
+
updateAgentProgress(iterEvent.agentId, {
|
|
346
|
+
phase: 'complete',
|
|
347
|
+
percentage: 100,
|
|
348
|
+
filesModified: iterEvent.filesModified.length
|
|
349
|
+
});
|
|
350
|
+
addActivity({
|
|
351
|
+
id: crypto.randomUUID(),
|
|
352
|
+
agentId: iterEvent.agentId,
|
|
353
|
+
agent,
|
|
354
|
+
timestamp: iterEvent.timestamp,
|
|
355
|
+
type: 'milestone',
|
|
356
|
+
content: iterEvent.summary,
|
|
357
|
+
metadata: { files: iterEvent.filesModified, severity: 'success' }
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
case 'gate_progress': {
|
|
363
|
+
const gateEvent = event;
|
|
364
|
+
updateAgentProgress(gateEvent.agentId, {
|
|
365
|
+
phase: gateEvent.gate === 'implementation'
|
|
366
|
+
? 'implementing'
|
|
367
|
+
: gateEvent.gate === 'review'
|
|
368
|
+
? 'reviewing'
|
|
369
|
+
: gateEvent.gate,
|
|
370
|
+
percentage: gateEvent.progress
|
|
371
|
+
});
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
// ============================================================================
|
|
377
|
+
// Connection Status
|
|
378
|
+
// ============================================================================
|
|
379
|
+
export function setConnected(connected) {
|
|
380
|
+
state.connected = connected;
|
|
381
|
+
}
|
|
382
|
+
export function setError(error) {
|
|
383
|
+
state.error = error;
|
|
384
|
+
}
|
|
385
|
+
export function clearError() {
|
|
386
|
+
state.error = null;
|
|
387
|
+
}
|
|
388
|
+
// ============================================================================
|
|
389
|
+
// Reset
|
|
390
|
+
// ============================================================================
|
|
391
|
+
export function reset() {
|
|
392
|
+
state.agents.clear();
|
|
393
|
+
state.events = [];
|
|
394
|
+
state.activities = [];
|
|
395
|
+
state.cursors.clear();
|
|
396
|
+
state.selectedAgentId = null;
|
|
397
|
+
state.filter = 'all';
|
|
398
|
+
state.connected = false;
|
|
399
|
+
state.error = null;
|
|
400
|
+
}
|
|
401
|
+
// ============================================================================
|
|
402
|
+
// Mock Data (for development)
|
|
403
|
+
// ============================================================================
|
|
404
|
+
export function addMockAgents() {
|
|
405
|
+
const mockAgents = [
|
|
406
|
+
{
|
|
407
|
+
id: 'agent-1',
|
|
408
|
+
name: 'CodeBot',
|
|
409
|
+
type: 'coder',
|
|
410
|
+
status: 'busy',
|
|
411
|
+
capabilities: ['code_generation', 'refactoring'],
|
|
412
|
+
workspaceId: 'ws-1',
|
|
413
|
+
joinedAt: new Date().toISOString(),
|
|
414
|
+
lastActivity: new Date().toISOString(),
|
|
415
|
+
color: '#F97316',
|
|
416
|
+
currentTask: {
|
|
417
|
+
id: 'task-1',
|
|
418
|
+
description: 'Implementing VFS integration',
|
|
419
|
+
startedAt: new Date().toISOString(),
|
|
420
|
+
progress: {
|
|
421
|
+
phase: 'implementing',
|
|
422
|
+
percentage: 65,
|
|
423
|
+
tokensUsed: 12500,
|
|
424
|
+
stepsCompleted: 8,
|
|
425
|
+
totalSteps: 12,
|
|
426
|
+
toolCalls: 24,
|
|
427
|
+
filesModified: 3,
|
|
428
|
+
lastUpdate: new Date().toISOString()
|
|
429
|
+
},
|
|
430
|
+
files: ['src/lib/stores/vfs.svelte.ts', 'src/lib/types/vfs.ts']
|
|
431
|
+
}
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
id: 'agent-2',
|
|
435
|
+
name: 'ReviewBot',
|
|
436
|
+
type: 'reviewer',
|
|
437
|
+
status: 'online',
|
|
438
|
+
capabilities: ['code_review', 'testing'],
|
|
439
|
+
workspaceId: 'ws-1',
|
|
440
|
+
joinedAt: new Date().toISOString(),
|
|
441
|
+
lastActivity: new Date().toISOString(),
|
|
442
|
+
color: '#8B5CF6'
|
|
443
|
+
},
|
|
444
|
+
{
|
|
445
|
+
id: 'agent-3',
|
|
446
|
+
name: 'TestBot',
|
|
447
|
+
type: 'tester',
|
|
448
|
+
status: 'offline',
|
|
449
|
+
capabilities: ['testing', 'debugging'],
|
|
450
|
+
workspaceId: 'ws-1',
|
|
451
|
+
joinedAt: new Date(Date.now() - 3600000).toISOString(),
|
|
452
|
+
lastActivity: new Date(Date.now() - 300000).toISOString(),
|
|
453
|
+
color: '#10B981'
|
|
454
|
+
}
|
|
455
|
+
];
|
|
456
|
+
for (const agent of mockAgents) {
|
|
457
|
+
state.agents.set(agent.id, agent);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Persistence Store
|
|
3
|
+
*
|
|
4
|
+
* Handles saving and loading AI conversations to IndexedDB/localStorage
|
|
5
|
+
*/
|
|
6
|
+
import type { AIConversation } from '../types';
|
|
7
|
+
interface PersistenceConfig {
|
|
8
|
+
dbName: string;
|
|
9
|
+
storeName: string;
|
|
10
|
+
version: number;
|
|
11
|
+
maxConversations: number;
|
|
12
|
+
autoSave: boolean;
|
|
13
|
+
autoSaveDebounceMs: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Initialize the persistence layer
|
|
17
|
+
*/
|
|
18
|
+
export declare function initPersistence(options?: Partial<PersistenceConfig>): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Save a conversation
|
|
21
|
+
*/
|
|
22
|
+
export declare function saveConversation(conversation: AIConversation & {
|
|
23
|
+
starred?: boolean;
|
|
24
|
+
}): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Auto-save with debounce
|
|
27
|
+
*/
|
|
28
|
+
export declare function autoSaveConversation(conversation: AIConversation): void;
|
|
29
|
+
/**
|
|
30
|
+
* Load all conversations
|
|
31
|
+
*/
|
|
32
|
+
export declare function loadConversations(): Promise<AIConversation[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Load a single conversation by ID
|
|
35
|
+
*/
|
|
36
|
+
export declare function loadConversation(id: string): Promise<AIConversation | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Delete a conversation
|
|
39
|
+
*/
|
|
40
|
+
export declare function deleteConversation(id: string): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Delete all conversations
|
|
43
|
+
*/
|
|
44
|
+
export declare function clearAllConversations(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Search conversations
|
|
47
|
+
*/
|
|
48
|
+
export declare function searchConversations(query: string): Promise<AIConversation[]>;
|
|
49
|
+
/**
|
|
50
|
+
* Get starred conversations
|
|
51
|
+
*/
|
|
52
|
+
export declare function getStarredConversations(): Promise<AIConversation[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Star/unstar a conversation
|
|
55
|
+
*/
|
|
56
|
+
export declare function toggleStarConversation(id: string, starred: boolean): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Export conversation to JSON
|
|
59
|
+
*/
|
|
60
|
+
export declare function exportConversationJSON(conversation: AIConversation): string;
|
|
61
|
+
/**
|
|
62
|
+
* Export conversation to Markdown
|
|
63
|
+
*/
|
|
64
|
+
export declare function exportConversationMarkdown(conversation: AIConversation): string;
|
|
65
|
+
/**
|
|
66
|
+
* Import conversation from JSON
|
|
67
|
+
*/
|
|
68
|
+
export declare function importConversationJSON(json: string): Promise<AIConversation | null>;
|
|
69
|
+
/**
|
|
70
|
+
* Prune old conversations to stay under max limit
|
|
71
|
+
*/
|
|
72
|
+
export declare function pruneOldConversations(): Promise<number>;
|
|
73
|
+
export declare function isInitialized(): boolean;
|
|
74
|
+
export declare function getError(): string | null;
|
|
75
|
+
export declare function getConfig(): PersistenceConfig;
|
|
76
|
+
export {};
|