@myrialabs/clopen 0.0.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/.env.example +6 -0
- package/.github/workflows/release.yml +60 -0
- package/.github/workflows/test.yml +40 -0
- package/CONTRIBUTING.md +499 -0
- package/LICENSE +21 -0
- package/README.md +209 -0
- package/backend/index.ts +156 -0
- package/backend/lib/chat/helpers.ts +42 -0
- package/backend/lib/chat/index.ts +2 -0
- package/backend/lib/chat/stream-manager.ts +1126 -0
- package/backend/lib/database/README.md +77 -0
- package/backend/lib/database/index.ts +119 -0
- package/backend/lib/database/migrations/001_create_projects_table.ts +31 -0
- package/backend/lib/database/migrations/002_create_chat_sessions_table.ts +33 -0
- package/backend/lib/database/migrations/003_create_messages_table.ts +32 -0
- package/backend/lib/database/migrations/004_create_prompt_templates_table.ts +34 -0
- package/backend/lib/database/migrations/005_create_settings_table.ts +24 -0
- package/backend/lib/database/migrations/006_add_user_to_messages.ts +58 -0
- package/backend/lib/database/migrations/007_create_stream_states_table.ts +41 -0
- package/backend/lib/database/migrations/008_create_message_snapshots_table.ts +62 -0
- package/backend/lib/database/migrations/009_add_delta_snapshot_fields.ts +41 -0
- package/backend/lib/database/migrations/010_add_soft_delete_and_branch_support.ts +70 -0
- package/backend/lib/database/migrations/011_git_like_commit_graph.ts +156 -0
- package/backend/lib/database/migrations/012_add_file_change_statistics.ts +41 -0
- package/backend/lib/database/migrations/013_checkpoint_tree_state.ts +118 -0
- package/backend/lib/database/migrations/014_add_engine_to_sessions.ts +18 -0
- package/backend/lib/database/migrations/015_add_model_to_sessions.ts +18 -0
- package/backend/lib/database/migrations/016_create_user_projects_table.ts +34 -0
- package/backend/lib/database/migrations/017_add_current_session_to_user_projects.ts +32 -0
- package/backend/lib/database/migrations/018_create_claude_accounts_table.ts +24 -0
- package/backend/lib/database/migrations/019_add_claude_account_to_sessions.ts +18 -0
- package/backend/lib/database/migrations/020_add_snapshot_tree_hash.ts +32 -0
- package/backend/lib/database/migrations/021_drop_prompt_templates_table.ts +33 -0
- package/backend/lib/database/migrations/index.ts +154 -0
- package/backend/lib/database/queries/checkpoint-queries.ts +87 -0
- package/backend/lib/database/queries/engine-queries.ts +75 -0
- package/backend/lib/database/queries/index.ts +9 -0
- package/backend/lib/database/queries/message-queries.ts +472 -0
- package/backend/lib/database/queries/project-queries.ts +117 -0
- package/backend/lib/database/queries/session-queries.ts +271 -0
- package/backend/lib/database/queries/settings-queries.ts +34 -0
- package/backend/lib/database/queries/snapshot-queries.ts +326 -0
- package/backend/lib/database/queries/utils-queries.ts +59 -0
- package/backend/lib/database/seeders/index.ts +13 -0
- package/backend/lib/database/seeders/settings_seeder.ts +84 -0
- package/backend/lib/database/utils/connection.ts +174 -0
- package/backend/lib/database/utils/index.ts +4 -0
- package/backend/lib/database/utils/migration-runner.ts +118 -0
- package/backend/lib/database/utils/seeder-runner.ts +121 -0
- package/backend/lib/engine/adapters/claude/environment.ts +164 -0
- package/backend/lib/engine/adapters/claude/error-handler.ts +60 -0
- package/backend/lib/engine/adapters/claude/index.ts +1 -0
- package/backend/lib/engine/adapters/claude/path-utils.ts +38 -0
- package/backend/lib/engine/adapters/claude/stream.ts +177 -0
- package/backend/lib/engine/adapters/opencode/index.ts +2 -0
- package/backend/lib/engine/adapters/opencode/message-converter.ts +862 -0
- package/backend/lib/engine/adapters/opencode/server.ts +104 -0
- package/backend/lib/engine/adapters/opencode/stream.ts +755 -0
- package/backend/lib/engine/index.ts +196 -0
- package/backend/lib/engine/types.ts +58 -0
- package/backend/lib/files/file-operations.ts +478 -0
- package/backend/lib/files/file-reading.ts +308 -0
- package/backend/lib/files/file-watcher.ts +383 -0
- package/backend/lib/files/path-browsing.ts +382 -0
- package/backend/lib/git/git-executor.ts +88 -0
- package/backend/lib/git/git-parser.ts +411 -0
- package/backend/lib/git/git-service.ts +505 -0
- package/backend/lib/mcp/README.md +1144 -0
- package/backend/lib/mcp/config.ts +316 -0
- package/backend/lib/mcp/index.ts +35 -0
- package/backend/lib/mcp/project-context.ts +236 -0
- package/backend/lib/mcp/servers/browser-automation/actions.ts +156 -0
- package/backend/lib/mcp/servers/browser-automation/browser.ts +419 -0
- package/backend/lib/mcp/servers/browser-automation/index.ts +791 -0
- package/backend/lib/mcp/servers/browser-automation/inspection.ts +501 -0
- package/backend/lib/mcp/servers/helper.ts +143 -0
- package/backend/lib/mcp/servers/index.ts +45 -0
- package/backend/lib/mcp/servers/weather/get-temperature.ts +56 -0
- package/backend/lib/mcp/servers/weather/index.ts +31 -0
- package/backend/lib/mcp/stdio-server.ts +103 -0
- package/backend/lib/mcp/types.ts +65 -0
- package/backend/lib/preview/browser/browser-audio-capture.ts +86 -0
- package/backend/lib/preview/browser/browser-console-manager.ts +263 -0
- package/backend/lib/preview/browser/browser-dialog-handler.ts +222 -0
- package/backend/lib/preview/browser/browser-interaction-handler.ts +421 -0
- package/backend/lib/preview/browser/browser-mcp-control.ts +415 -0
- package/backend/lib/preview/browser/browser-native-ui-handler.ts +512 -0
- package/backend/lib/preview/browser/browser-navigation-tracker.ts +104 -0
- package/backend/lib/preview/browser/browser-pool.ts +357 -0
- package/backend/lib/preview/browser/browser-preview-service.ts +882 -0
- package/backend/lib/preview/browser/browser-tab-manager.ts +935 -0
- package/backend/lib/preview/browser/browser-video-capture.ts +695 -0
- package/backend/lib/preview/browser/scripts/audio-stream.ts +292 -0
- package/backend/lib/preview/browser/scripts/cursor-tracking.ts +85 -0
- package/backend/lib/preview/browser/scripts/video-stream.ts +438 -0
- package/backend/lib/preview/browser/types.ts +359 -0
- package/backend/lib/preview/index.ts +24 -0
- package/backend/lib/project/index.ts +2 -0
- package/backend/lib/project/status-manager.ts +182 -0
- package/backend/lib/shared/index.ts +2 -0
- package/backend/lib/shared/port-utils.ts +25 -0
- package/backend/lib/shared/process-manager.ts +281 -0
- package/backend/lib/snapshot/blob-store.ts +227 -0
- package/backend/lib/snapshot/gitignore.ts +307 -0
- package/backend/lib/snapshot/helpers.ts +397 -0
- package/backend/lib/snapshot/snapshot-service.ts +483 -0
- package/backend/lib/terminal/helpers.ts +14 -0
- package/backend/lib/terminal/index.ts +8 -0
- package/backend/lib/terminal/pty-manager.ts +4 -0
- package/backend/lib/terminal/pty-session-manager.ts +387 -0
- package/backend/lib/terminal/shell-utils.ts +313 -0
- package/backend/lib/terminal/stream-manager.ts +293 -0
- package/backend/lib/tunnel/global-tunnel-manager.ts +243 -0
- package/backend/lib/tunnel/project-tunnel-manager.ts +311 -0
- package/backend/lib/user/helpers.ts +87 -0
- package/backend/lib/utils/ws.ts +944 -0
- package/backend/lib/vite-dev.ts +353 -0
- package/backend/middleware/cors.ts +15 -0
- package/backend/middleware/error-handler.ts +49 -0
- package/backend/middleware/logger.ts +9 -0
- package/backend/types/api.ts +24 -0
- package/backend/ws/README.md +1505 -0
- package/backend/ws/chat/background.ts +198 -0
- package/backend/ws/chat/index.ts +21 -0
- package/backend/ws/chat/stream.ts +707 -0
- package/backend/ws/engine/claude/accounts.ts +401 -0
- package/backend/ws/engine/claude/index.ts +13 -0
- package/backend/ws/engine/claude/status.ts +43 -0
- package/backend/ws/engine/index.ts +14 -0
- package/backend/ws/engine/opencode/index.ts +11 -0
- package/backend/ws/engine/opencode/status.ts +30 -0
- package/backend/ws/engine/utils.ts +36 -0
- package/backend/ws/files/index.ts +30 -0
- package/backend/ws/files/read.ts +189 -0
- package/backend/ws/files/search.ts +453 -0
- package/backend/ws/files/watch.ts +124 -0
- package/backend/ws/files/write.ts +143 -0
- package/backend/ws/git/branch.ts +106 -0
- package/backend/ws/git/commit.ts +39 -0
- package/backend/ws/git/conflict.ts +68 -0
- package/backend/ws/git/diff.ts +69 -0
- package/backend/ws/git/index.ts +24 -0
- package/backend/ws/git/log.ts +41 -0
- package/backend/ws/git/remote.ts +214 -0
- package/backend/ws/git/staging.ts +84 -0
- package/backend/ws/git/status.ts +90 -0
- package/backend/ws/index.ts +69 -0
- package/backend/ws/mcp/index.ts +61 -0
- package/backend/ws/messages/crud.ts +74 -0
- package/backend/ws/messages/index.ts +14 -0
- package/backend/ws/preview/browser/cleanup.ts +129 -0
- package/backend/ws/preview/browser/console.ts +114 -0
- package/backend/ws/preview/browser/interact.ts +513 -0
- package/backend/ws/preview/browser/mcp.ts +129 -0
- package/backend/ws/preview/browser/native-ui.ts +235 -0
- package/backend/ws/preview/browser/stats.ts +55 -0
- package/backend/ws/preview/browser/tab-info.ts +126 -0
- package/backend/ws/preview/browser/tab.ts +166 -0
- package/backend/ws/preview/browser/webcodecs.ts +293 -0
- package/backend/ws/preview/index.ts +146 -0
- package/backend/ws/projects/crud.ts +113 -0
- package/backend/ws/projects/index.ts +25 -0
- package/backend/ws/projects/presence.ts +46 -0
- package/backend/ws/projects/status.ts +116 -0
- package/backend/ws/sessions/crud.ts +327 -0
- package/backend/ws/sessions/index.ts +33 -0
- package/backend/ws/settings/crud.ts +112 -0
- package/backend/ws/settings/index.ts +14 -0
- package/backend/ws/snapshot/index.ts +17 -0
- package/backend/ws/snapshot/restore.ts +173 -0
- package/backend/ws/snapshot/timeline.ts +141 -0
- package/backend/ws/system/index.ts +14 -0
- package/backend/ws/system/operations.ts +49 -0
- package/backend/ws/terminal/index.ts +40 -0
- package/backend/ws/terminal/persistence.ts +153 -0
- package/backend/ws/terminal/session.ts +382 -0
- package/backend/ws/terminal/stream.ts +79 -0
- package/backend/ws/tunnel/index.ts +14 -0
- package/backend/ws/tunnel/operations.ts +91 -0
- package/backend/ws/types.ts +20 -0
- package/backend/ws/user/crud.ts +156 -0
- package/backend/ws/user/index.ts +14 -0
- package/bin/clopen.ts +307 -0
- package/bun.lock +1352 -0
- package/frontend/App.svelte +34 -0
- package/frontend/app.css +313 -0
- package/frontend/lib/app-environment.ts +10 -0
- package/frontend/lib/components/chat/ChatInterface.svelte +407 -0
- package/frontend/lib/components/chat/formatters/ErrorMessage.svelte +57 -0
- package/frontend/lib/components/chat/formatters/MessageFormatter.svelte +224 -0
- package/frontend/lib/components/chat/formatters/TextMessage.svelte +395 -0
- package/frontend/lib/components/chat/formatters/Tools.svelte +70 -0
- package/frontend/lib/components/chat/formatters/index.ts +3 -0
- package/frontend/lib/components/chat/input/ChatInput.svelte +421 -0
- package/frontend/lib/components/chat/input/components/ChatInputActions.svelte +78 -0
- package/frontend/lib/components/chat/input/components/DragDropOverlay.svelte +30 -0
- package/frontend/lib/components/chat/input/components/EditModeIndicator.svelte +33 -0
- package/frontend/lib/components/chat/input/components/EngineModelPicker.svelte +619 -0
- package/frontend/lib/components/chat/input/components/FileAttachmentPreview.svelte +48 -0
- package/frontend/lib/components/chat/input/components/LoadingIndicator.svelte +31 -0
- package/frontend/lib/components/chat/input/composables/use-animations.svelte.ts +201 -0
- package/frontend/lib/components/chat/input/composables/use-chat-actions.svelte.ts +148 -0
- package/frontend/lib/components/chat/input/composables/use-file-handling.svelte.ts +216 -0
- package/frontend/lib/components/chat/input/composables/use-input-state.svelte.ts +357 -0
- package/frontend/lib/components/chat/input/composables/use-textarea-resize.svelte.ts +57 -0
- package/frontend/lib/components/chat/message/ChatMessage.svelte +478 -0
- package/frontend/lib/components/chat/message/ChatMessages.svelte +541 -0
- package/frontend/lib/components/chat/message/DateSeparator.svelte +86 -0
- package/frontend/lib/components/chat/message/MessageBubble.svelte +86 -0
- package/frontend/lib/components/chat/message/MessageHeader.svelte +157 -0
- package/frontend/lib/components/chat/modal/DebugModal.svelte +59 -0
- package/frontend/lib/components/chat/modal/TokenUsageModal.svelte +124 -0
- package/frontend/lib/components/chat/shared/index.ts +2 -0
- package/frontend/lib/components/chat/shared/utils.ts +116 -0
- package/frontend/lib/components/chat/tools/BashOutputTool.svelte +35 -0
- package/frontend/lib/components/chat/tools/BashTool.svelte +46 -0
- package/frontend/lib/components/chat/tools/CustomMcpTool.svelte +139 -0
- package/frontend/lib/components/chat/tools/EditTool.svelte +48 -0
- package/frontend/lib/components/chat/tools/ExitPlanModeTool.svelte +32 -0
- package/frontend/lib/components/chat/tools/GlobTool.svelte +51 -0
- package/frontend/lib/components/chat/tools/GrepTool.svelte +90 -0
- package/frontend/lib/components/chat/tools/KillShellTool.svelte +26 -0
- package/frontend/lib/components/chat/tools/ListMcpResourcesTool.svelte +31 -0
- package/frontend/lib/components/chat/tools/NotebookEditTool.svelte +38 -0
- package/frontend/lib/components/chat/tools/ReadMcpResourceTool.svelte +34 -0
- package/frontend/lib/components/chat/tools/ReadTool.svelte +41 -0
- package/frontend/lib/components/chat/tools/TaskTool.svelte +64 -0
- package/frontend/lib/components/chat/tools/TodoWriteTool.svelte +75 -0
- package/frontend/lib/components/chat/tools/WebFetchTool.svelte +35 -0
- package/frontend/lib/components/chat/tools/WebSearchTool.svelte +84 -0
- package/frontend/lib/components/chat/tools/WriteTool.svelte +33 -0
- package/frontend/lib/components/chat/tools/components/CodeBlock.svelte +79 -0
- package/frontend/lib/components/chat/tools/components/DiffBlock.svelte +408 -0
- package/frontend/lib/components/chat/tools/components/FileHeader.svelte +45 -0
- package/frontend/lib/components/chat/tools/components/InfoLine.svelte +19 -0
- package/frontend/lib/components/chat/tools/components/StatsBadges.svelte +27 -0
- package/frontend/lib/components/chat/tools/components/TerminalCommand.svelte +54 -0
- package/frontend/lib/components/chat/tools/components/index.ts +7 -0
- package/frontend/lib/components/chat/tools/index.ts +26 -0
- package/frontend/lib/components/chat/widgets/FloatingTodoList.svelte +249 -0
- package/frontend/lib/components/chat/widgets/TokenUsage.svelte +78 -0
- package/frontend/lib/components/checkpoint/TimelineModal.svelte +391 -0
- package/frontend/lib/components/checkpoint/timeline/TimelineEdge.svelte +26 -0
- package/frontend/lib/components/checkpoint/timeline/TimelineGraph.svelte +87 -0
- package/frontend/lib/components/checkpoint/timeline/TimelineNode.svelte +108 -0
- package/frontend/lib/components/checkpoint/timeline/TimelineVersionGroup.svelte +59 -0
- package/frontend/lib/components/checkpoint/timeline/animation.ts +168 -0
- package/frontend/lib/components/checkpoint/timeline/config.ts +44 -0
- package/frontend/lib/components/checkpoint/timeline/graph-builder.ts +304 -0
- package/frontend/lib/components/checkpoint/timeline/types.ts +65 -0
- package/frontend/lib/components/checkpoint/timeline/utils.ts +53 -0
- package/frontend/lib/components/common/Alert.svelte +139 -0
- package/frontend/lib/components/common/AvatarBubble.svelte +56 -0
- package/frontend/lib/components/common/Button.svelte +71 -0
- package/frontend/lib/components/common/Card.svelte +102 -0
- package/frontend/lib/components/common/Checkbox.svelte +48 -0
- package/frontend/lib/components/common/Dialog.svelte +249 -0
- package/frontend/lib/components/common/FolderBrowser.svelte +843 -0
- package/frontend/lib/components/common/Icon.svelte +58 -0
- package/frontend/lib/components/common/Input.svelte +72 -0
- package/frontend/lib/components/common/Lightbox.svelte +233 -0
- package/frontend/lib/components/common/LoadingScreen.svelte +52 -0
- package/frontend/lib/components/common/LoadingSpinner.svelte +48 -0
- package/frontend/lib/components/common/Modal.svelte +177 -0
- package/frontend/lib/components/common/ModalProvider.svelte +28 -0
- package/frontend/lib/components/common/ModelSelector.svelte +110 -0
- package/frontend/lib/components/common/MonacoEditor.svelte +569 -0
- package/frontend/lib/components/common/NotificationToast.svelte +113 -0
- package/frontend/lib/components/common/PageTemplate.svelte +76 -0
- package/frontend/lib/components/common/ProjectUserAvatars.svelte +79 -0
- package/frontend/lib/components/common/Select.svelte +98 -0
- package/frontend/lib/components/common/Textarea.svelte +80 -0
- package/frontend/lib/components/common/ThemeToggle.svelte +44 -0
- package/frontend/lib/components/common/lucide-icons.ts +1642 -0
- package/frontend/lib/components/common/material-icons.ts +1082 -0
- package/frontend/lib/components/common/xterm/XTerm.svelte +796 -0
- package/frontend/lib/components/common/xterm/index.ts +16 -0
- package/frontend/lib/components/common/xterm/terminal-config.ts +68 -0
- package/frontend/lib/components/common/xterm/types.ts +31 -0
- package/frontend/lib/components/common/xterm/xterm-service.ts +353 -0
- package/frontend/lib/components/files/FileNode.svelte +384 -0
- package/frontend/lib/components/files/FileTree.svelte +681 -0
- package/frontend/lib/components/files/FileViewer.svelte +728 -0
- package/frontend/lib/components/files/SearchResults.svelte +303 -0
- package/frontend/lib/components/git/BranchManager.svelte +458 -0
- package/frontend/lib/components/git/ChangesSection.svelte +107 -0
- package/frontend/lib/components/git/CommitForm.svelte +76 -0
- package/frontend/lib/components/git/ConflictResolver.svelte +158 -0
- package/frontend/lib/components/git/DiffViewer.svelte +364 -0
- package/frontend/lib/components/git/FileChangeItem.svelte +97 -0
- package/frontend/lib/components/git/GitButton.svelte +33 -0
- package/frontend/lib/components/git/GitLog.svelte +361 -0
- package/frontend/lib/components/git/GitModal.svelte +80 -0
- package/frontend/lib/components/history/HistoryModal.svelte +563 -0
- package/frontend/lib/components/history/HistoryView.svelte +615 -0
- package/frontend/lib/components/index.ts +34 -0
- package/frontend/lib/components/preview/browser/BrowserPreview.svelte +549 -0
- package/frontend/lib/components/preview/browser/components/Canvas.svelte +1058 -0
- package/frontend/lib/components/preview/browser/components/ConsolePanel.svelte +757 -0
- package/frontend/lib/components/preview/browser/components/Container.svelte +450 -0
- package/frontend/lib/components/preview/browser/components/ContextMenu.svelte +236 -0
- package/frontend/lib/components/preview/browser/components/SelectDropdown.svelte +224 -0
- package/frontend/lib/components/preview/browser/components/Toolbar.svelte +339 -0
- package/frontend/lib/components/preview/browser/components/VirtualCursor.svelte +36 -0
- package/frontend/lib/components/preview/browser/core/cleanup.svelte.ts +155 -0
- package/frontend/lib/components/preview/browser/core/coordinator.svelte.ts +837 -0
- package/frontend/lib/components/preview/browser/core/interactions.svelte.ts +113 -0
- package/frontend/lib/components/preview/browser/core/mcp-handlers.svelte.ts +296 -0
- package/frontend/lib/components/preview/browser/core/native-ui-handlers.svelte.ts +391 -0
- package/frontend/lib/components/preview/browser/core/stream-handler.svelte.ts +231 -0
- package/frontend/lib/components/preview/browser/core/tab-manager.svelte.ts +210 -0
- package/frontend/lib/components/preview/browser/core/tab-operations.svelte.ts +239 -0
- package/frontend/lib/components/preview/index.ts +2 -0
- package/frontend/lib/components/settings/SettingsModal.svelte +235 -0
- package/frontend/lib/components/settings/SettingsView.svelte +36 -0
- package/frontend/lib/components/settings/appearance/AppearanceSettings.svelte +51 -0
- package/frontend/lib/components/settings/appearance/LayoutPresetSettings.svelte +160 -0
- package/frontend/lib/components/settings/appearance/LayoutPreview.svelte +76 -0
- package/frontend/lib/components/settings/engines/AIEnginesSettings.svelte +917 -0
- package/frontend/lib/components/settings/general/AdvancedSettings.svelte +187 -0
- package/frontend/lib/components/settings/general/DataManagementSettings.svelte +203 -0
- package/frontend/lib/components/settings/general/GeneralSettings.svelte +10 -0
- package/frontend/lib/components/settings/model/ModelSettings.svelte +357 -0
- package/frontend/lib/components/settings/notifications/NotificationSettings.svelte +205 -0
- package/frontend/lib/components/settings/user/UserSettings.svelte +197 -0
- package/frontend/lib/components/terminal/Terminal.svelte +368 -0
- package/frontend/lib/components/terminal/TerminalTabs.svelte +87 -0
- package/frontend/lib/components/terminal/TerminalView.svelte +55 -0
- package/frontend/lib/components/tunnel/TunnelActive.svelte +142 -0
- package/frontend/lib/components/tunnel/TunnelButton.svelte +54 -0
- package/frontend/lib/components/tunnel/TunnelInactive.svelte +284 -0
- package/frontend/lib/components/tunnel/TunnelModal.svelte +47 -0
- package/frontend/lib/components/tunnel/TunnelQRCode.svelte +49 -0
- package/frontend/lib/components/workspace/DesktopNavigator.svelte +382 -0
- package/frontend/lib/components/workspace/MobileNavigator.svelte +403 -0
- package/frontend/lib/components/workspace/PanelContainer.svelte +100 -0
- package/frontend/lib/components/workspace/PanelHeader.svelte +505 -0
- package/frontend/lib/components/workspace/ViewMenu.svelte +162 -0
- package/frontend/lib/components/workspace/WorkspaceLayout.svelte +169 -0
- package/frontend/lib/components/workspace/layout/DesktopLayout.svelte +15 -0
- package/frontend/lib/components/workspace/layout/MobileLayout.svelte +17 -0
- package/frontend/lib/components/workspace/layout/split-pane/Container.svelte +42 -0
- package/frontend/lib/components/workspace/layout/split-pane/Handle.svelte +85 -0
- package/frontend/lib/components/workspace/layout/split-pane/Layout.svelte +37 -0
- package/frontend/lib/components/workspace/panels/ChatPanel.svelte +274 -0
- package/frontend/lib/components/workspace/panels/FilesPanel.svelte +1261 -0
- package/frontend/lib/components/workspace/panels/GitPanel.svelte +1560 -0
- package/frontend/lib/components/workspace/panels/PreviewPanel.svelte +150 -0
- package/frontend/lib/components/workspace/panels/TerminalPanel.svelte +73 -0
- package/frontend/lib/constants/preview.ts +45 -0
- package/frontend/lib/services/chat/chat.service.ts +704 -0
- package/frontend/lib/services/chat/index.ts +7 -0
- package/frontend/lib/services/notification/global-stream-monitor.ts +86 -0
- package/frontend/lib/services/notification/index.ts +8 -0
- package/frontend/lib/services/notification/push.service.ts +144 -0
- package/frontend/lib/services/notification/sound.service.ts +127 -0
- package/frontend/lib/services/preview/browser/browser-console.service.ts +61 -0
- package/frontend/lib/services/preview/browser/browser-webcodecs.service.ts +1499 -0
- package/frontend/lib/services/preview/browser/mcp-integration.svelte.ts +67 -0
- package/frontend/lib/services/preview/index.ts +23 -0
- package/frontend/lib/services/project/index.ts +8 -0
- package/frontend/lib/services/project/status.service.ts +159 -0
- package/frontend/lib/services/snapshot/snapshot.service.ts +47 -0
- package/frontend/lib/services/terminal/background/index.ts +130 -0
- package/frontend/lib/services/terminal/background/session-restore.ts +274 -0
- package/frontend/lib/services/terminal/background/stream-manager.ts +286 -0
- package/frontend/lib/services/terminal/index.ts +14 -0
- package/frontend/lib/services/terminal/persistence.service.ts +260 -0
- package/frontend/lib/services/terminal/project.service.ts +953 -0
- package/frontend/lib/services/terminal/session.service.ts +364 -0
- package/frontend/lib/services/terminal/terminal.service.ts +369 -0
- package/frontend/lib/stores/core/app.svelte.ts +117 -0
- package/frontend/lib/stores/core/files.svelte.ts +73 -0
- package/frontend/lib/stores/core/presence.svelte.ts +48 -0
- package/frontend/lib/stores/core/projects.svelte.ts +317 -0
- package/frontend/lib/stores/core/sessions.svelte.ts +383 -0
- package/frontend/lib/stores/features/claude-accounts.svelte.ts +58 -0
- package/frontend/lib/stores/features/models.svelte.ts +89 -0
- package/frontend/lib/stores/features/settings.svelte.ts +87 -0
- package/frontend/lib/stores/features/terminal.svelte.ts +701 -0
- package/frontend/lib/stores/features/tunnel.svelte.ts +161 -0
- package/frontend/lib/stores/features/user.svelte.ts +96 -0
- package/frontend/lib/stores/ui/chat-input.svelte.ts +57 -0
- package/frontend/lib/stores/ui/chat-model.svelte.ts +61 -0
- package/frontend/lib/stores/ui/dialog.svelte.ts +59 -0
- package/frontend/lib/stores/ui/edit-mode.svelte.ts +214 -0
- package/frontend/lib/stores/ui/notification.svelte.ts +166 -0
- package/frontend/lib/stores/ui/settings-modal.svelte.ts +88 -0
- package/frontend/lib/stores/ui/theme.svelte.ts +179 -0
- package/frontend/lib/stores/ui/workspace.svelte.ts +754 -0
- package/frontend/lib/types/native-ui.ts +73 -0
- package/frontend/lib/utils/chat/date-separator.ts +39 -0
- package/frontend/lib/utils/chat/message-grouper.ts +219 -0
- package/frontend/lib/utils/chat/message-processor.ts +135 -0
- package/frontend/lib/utils/chat/tool-handler.ts +161 -0
- package/frontend/lib/utils/chat/virtual-scroll.svelte.ts +142 -0
- package/frontend/lib/utils/click-outside.ts +20 -0
- package/frontend/lib/utils/context-manager.ts +257 -0
- package/frontend/lib/utils/file-icon-mappings.ts +769 -0
- package/frontend/lib/utils/folder-icon-mappings.ts +1030 -0
- package/frontend/lib/utils/git-status.ts +68 -0
- package/frontend/lib/utils/platform.ts +113 -0
- package/frontend/lib/utils/port-check.ts +65 -0
- package/frontend/lib/utils/terminalFormatter.ts +207 -0
- package/frontend/lib/utils/theme.ts +6 -0
- package/frontend/lib/utils/tree-visualizer.ts +320 -0
- package/frontend/lib/utils/ws.ts +44 -0
- package/frontend/main.ts +13 -0
- package/index.html +70 -0
- package/package.json +111 -0
- package/scripts/generate-icons.ts +87 -0
- package/scripts/pre-publish-check.sh +142 -0
- package/scripts/setup-hooks.sh +134 -0
- package/scripts/validate-branch-name.sh +47 -0
- package/scripts/validate-commit-msg.sh +42 -0
- package/shared/constants/engines.ts +134 -0
- package/shared/types/database/connection.ts +16 -0
- package/shared/types/database/index.ts +6 -0
- package/shared/types/database/schema.ts +141 -0
- package/shared/types/engine/index.ts +45 -0
- package/shared/types/filesystem/index.ts +22 -0
- package/shared/types/git.ts +171 -0
- package/shared/types/messaging/index.ts +239 -0
- package/shared/types/messaging/tool.ts +526 -0
- package/shared/types/network/api.ts +18 -0
- package/shared/types/network/index.ts +5 -0
- package/shared/types/stores/app.ts +23 -0
- package/shared/types/stores/dialog.ts +21 -0
- package/shared/types/stores/index.ts +3 -0
- package/shared/types/stores/settings.ts +15 -0
- package/shared/types/terminal/index.ts +44 -0
- package/shared/types/ui/components.ts +61 -0
- package/shared/types/ui/icons.ts +23 -0
- package/shared/types/ui/index.ts +22 -0
- package/shared/types/ui/notifications.ts +14 -0
- package/shared/types/ui/theme.ts +12 -0
- package/shared/types/websocket/index.ts +43 -0
- package/shared/types/window.d.ts +13 -0
- package/shared/utils/anonymous-user.ts +168 -0
- package/shared/utils/async.ts +10 -0
- package/shared/utils/diff-calculator.ts +184 -0
- package/shared/utils/file-type-detection.ts +166 -0
- package/shared/utils/logger.ts +158 -0
- package/shared/utils/message-formatter.ts +79 -0
- package/shared/utils/path.ts +47 -0
- package/shared/utils/ws-client.ts +768 -0
- package/shared/utils/ws-server.ts +660 -0
- package/static/audio/notification.ogg +0 -0
- package/static/favicon.svg +8 -0
- package/static/fonts/dm-sans/dm-sans-italic-latin-ext.woff2 +0 -0
- package/static/fonts/dm-sans/dm-sans-italic-latin.woff2 +0 -0
- package/static/fonts/dm-sans/dm-sans-normal-latin-ext.woff2 +0 -0
- package/static/fonts/dm-sans/dm-sans-normal-latin.woff2 +0 -0
- package/static/fonts/dm-sans.css +96 -0
- package/svelte.config.js +20 -0
- package/vite.config.ts +33 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Database System
|
|
2
|
+
|
|
3
|
+
## ➕ Adding New Migration
|
|
4
|
+
|
|
5
|
+
1. Create file: `migrations/006_description.ts`
|
|
6
|
+
```typescript
|
|
7
|
+
export const description = 'Create new table';
|
|
8
|
+
|
|
9
|
+
export function up(db) {
|
|
10
|
+
db.exec('CREATE TABLE ...');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function down(db) {
|
|
14
|
+
db.exec('DROP TABLE ...');
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
2. Add to `migrations/index.ts`:
|
|
19
|
+
```typescript
|
|
20
|
+
import * as migration006 from './006_description';
|
|
21
|
+
|
|
22
|
+
export const migrations = [
|
|
23
|
+
// ... existing migrations
|
|
24
|
+
{
|
|
25
|
+
id: '006',
|
|
26
|
+
description: migration006.description,
|
|
27
|
+
up: migration006.up,
|
|
28
|
+
down: migration006.down
|
|
29
|
+
}
|
|
30
|
+
];
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
3. **Restart app** → Migration runs automatically ✅
|
|
34
|
+
|
|
35
|
+
## ➕ Adding New Seeder
|
|
36
|
+
|
|
37
|
+
1. Create file: `seeders/new_seeder.ts`
|
|
38
|
+
```typescript
|
|
39
|
+
export const description = 'Seed default data';
|
|
40
|
+
|
|
41
|
+
export function seed(db) {
|
|
42
|
+
// Insert default data
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
2. Add to `seeders/index.ts`:
|
|
47
|
+
```typescript
|
|
48
|
+
import * as newSeeder from './new_seeder';
|
|
49
|
+
|
|
50
|
+
export const seeders = [
|
|
51
|
+
// ... existing seeders
|
|
52
|
+
{
|
|
53
|
+
name: 'new_seeder',
|
|
54
|
+
description: newSeeder.description,
|
|
55
|
+
seed: newSeeder.seed
|
|
56
|
+
}
|
|
57
|
+
];
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
3. **Restart app** → Seeder runs automatically ✅
|
|
61
|
+
|
|
62
|
+
## 🔧 Important Info
|
|
63
|
+
|
|
64
|
+
- **Automatic**: Migrations/seeders run on app startup
|
|
65
|
+
- **Safe**: Only new migrations/seeders execute
|
|
66
|
+
- **Tracked**: System remembers what's already done
|
|
67
|
+
- **Order**: Migrations run by ID (001, 002, 003...)
|
|
68
|
+
|
|
69
|
+
## 🛠️ Development Commands
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
// Reset database (dev only)
|
|
73
|
+
await resetDatabase();
|
|
74
|
+
|
|
75
|
+
// Check status
|
|
76
|
+
const pending = migrationRunner.getPendingMigrations();
|
|
77
|
+
```
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { DatabaseConnection } from '$shared/types/database/connection';
|
|
2
|
+
import { DatabaseManager, MigrationRunner, SeederRunner } from './utils';
|
|
3
|
+
import { migrations } from './migrations';
|
|
4
|
+
import { seeders } from './seeders';
|
|
5
|
+
import { debug } from '$shared/utils/logger';
|
|
6
|
+
|
|
7
|
+
// Database manager instance
|
|
8
|
+
let dbManager: DatabaseManager | null = null;
|
|
9
|
+
|
|
10
|
+
export async function initializeDatabase(): Promise<DatabaseConnection> {
|
|
11
|
+
debug.log('database', '🔧 Initializing database system...');
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
// Get database manager instance
|
|
15
|
+
dbManager = DatabaseManager.getInstance();
|
|
16
|
+
|
|
17
|
+
// Connect to database
|
|
18
|
+
const db = await dbManager.connect();
|
|
19
|
+
|
|
20
|
+
// Run migrations
|
|
21
|
+
await runMigrations(db);
|
|
22
|
+
|
|
23
|
+
// Run seeders
|
|
24
|
+
await runSeeders(db);
|
|
25
|
+
|
|
26
|
+
debug.log('database', '✅ Database system initialized successfully');
|
|
27
|
+
return db;
|
|
28
|
+
|
|
29
|
+
} catch (error) {
|
|
30
|
+
debug.error('database', '❌ Failed to initialize database:', error);
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function runMigrations(db: DatabaseConnection): Promise<void> {
|
|
36
|
+
debug.log('database', '📋 Setting up migrations...');
|
|
37
|
+
|
|
38
|
+
const migrationRunner = new MigrationRunner(db);
|
|
39
|
+
|
|
40
|
+
// Add all migrations
|
|
41
|
+
for (const migration of migrations) {
|
|
42
|
+
migrationRunner.addMigration(migration);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Run migrations
|
|
46
|
+
await migrationRunner.runMigrations();
|
|
47
|
+
|
|
48
|
+
debug.log('database', '✅ Migrations completed');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function runSeeders(db: DatabaseConnection): Promise<void> {
|
|
52
|
+
debug.log('database', '🌱 Setting up seeders...');
|
|
53
|
+
|
|
54
|
+
const seederRunner = new SeederRunner(db);
|
|
55
|
+
|
|
56
|
+
// Add all seeders
|
|
57
|
+
for (const seeder of seeders) {
|
|
58
|
+
seederRunner.addSeeder(seeder);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Run seeders (only if not already executed)
|
|
62
|
+
await seederRunner.runSeeders();
|
|
63
|
+
|
|
64
|
+
debug.log('database', '✅ Seeders completed');
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function getDatabase(): DatabaseConnection {
|
|
68
|
+
if (!dbManager || !dbManager.isConnected()) {
|
|
69
|
+
throw new Error('Database not initialized. Call initializeDatabase() first.');
|
|
70
|
+
}
|
|
71
|
+
return dbManager.getConnection();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function closeDatabase(): void {
|
|
75
|
+
if (dbManager) {
|
|
76
|
+
dbManager.close();
|
|
77
|
+
dbManager = null;
|
|
78
|
+
debug.log('database', '✅ Database system shutdown');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export async function resetDatabase(): Promise<void> {
|
|
83
|
+
debug.log('database', '⚠️ Resetting database system...');
|
|
84
|
+
|
|
85
|
+
if (!dbManager) {
|
|
86
|
+
throw new Error('Database not initialized');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Reset database (drop all tables)
|
|
90
|
+
await dbManager.resetDatabase();
|
|
91
|
+
|
|
92
|
+
// Re-run migrations and seeders
|
|
93
|
+
const db = dbManager.getConnection();
|
|
94
|
+
await runMigrations(db);
|
|
95
|
+
await runSeeders(db);
|
|
96
|
+
|
|
97
|
+
debug.log('database', '✅ Database system reset completed');
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export async function getDatabaseInfo(): Promise<object> {
|
|
101
|
+
if (!dbManager) {
|
|
102
|
+
throw new Error('Database not initialized');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return dbManager.getDatabaseInfo();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export async function vacuumDatabase(): Promise<void> {
|
|
109
|
+
if (!dbManager) {
|
|
110
|
+
throw new Error('Database not initialized');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
await dbManager.vacuum();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Export utilities for advanced usage
|
|
117
|
+
export { DatabaseManager, MigrationRunner, SeederRunner } from './utils';
|
|
118
|
+
export { migrations } from './migrations';
|
|
119
|
+
export { seeders } from './seeders';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DatabaseConnection } from '$shared/types/database/connection';
|
|
2
|
+
|
|
3
|
+
import { debug } from '$shared/utils/logger';
|
|
4
|
+
export const description = 'Create projects table for storing project information';
|
|
5
|
+
|
|
6
|
+
export const up = (db: DatabaseConnection): void => {
|
|
7
|
+
debug.log('migration', '📋 Creating projects table...');
|
|
8
|
+
|
|
9
|
+
db.exec(`
|
|
10
|
+
CREATE TABLE projects (
|
|
11
|
+
id TEXT PRIMARY KEY,
|
|
12
|
+
name TEXT NOT NULL,
|
|
13
|
+
path TEXT NOT NULL UNIQUE,
|
|
14
|
+
created_at TEXT NOT NULL,
|
|
15
|
+
last_opened_at TEXT NOT NULL
|
|
16
|
+
)
|
|
17
|
+
`);
|
|
18
|
+
|
|
19
|
+
// Create index for performance
|
|
20
|
+
db.exec(`
|
|
21
|
+
CREATE INDEX idx_projects_last_opened ON projects(last_opened_at)
|
|
22
|
+
`);
|
|
23
|
+
|
|
24
|
+
debug.log('migration', '✅ Projects table created');
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export const down = (db: DatabaseConnection): void => {
|
|
28
|
+
debug.log('migration', '🗑️ Dropping projects table...');
|
|
29
|
+
db.exec('DROP TABLE IF EXISTS projects');
|
|
30
|
+
debug.log('migration', '✅ Projects table dropped');
|
|
31
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { DatabaseConnection } from '$shared/types/database/connection';
|
|
2
|
+
|
|
3
|
+
import { debug } from '$shared/utils/logger';
|
|
4
|
+
export const description = 'Create chat_sessions table for storing chat conversation sessions';
|
|
5
|
+
|
|
6
|
+
export const up = (db: DatabaseConnection): void => {
|
|
7
|
+
debug.log('migration', '📋 Creating chat_sessions table...');
|
|
8
|
+
|
|
9
|
+
db.exec(`
|
|
10
|
+
CREATE TABLE chat_sessions (
|
|
11
|
+
id TEXT PRIMARY KEY,
|
|
12
|
+
project_id TEXT NOT NULL,
|
|
13
|
+
title TEXT,
|
|
14
|
+
latest_sdk_session_id TEXT,
|
|
15
|
+
started_at TEXT NOT NULL,
|
|
16
|
+
ended_at TEXT,
|
|
17
|
+
FOREIGN KEY (project_id) REFERENCES projects(id)
|
|
18
|
+
)
|
|
19
|
+
`);
|
|
20
|
+
|
|
21
|
+
// Create index for performance
|
|
22
|
+
db.exec(`
|
|
23
|
+
CREATE INDEX idx_chat_sessions_project_id ON chat_sessions(project_id)
|
|
24
|
+
`);
|
|
25
|
+
|
|
26
|
+
debug.log('migration', '✅ Chat sessions table created');
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const down = (db: DatabaseConnection): void => {
|
|
30
|
+
debug.log('migration', '🗑️ Dropping chat_sessions table...');
|
|
31
|
+
db.exec('DROP TABLE IF EXISTS chat_sessions');
|
|
32
|
+
debug.log('migration', '✅ Chat sessions table dropped');
|
|
33
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { DatabaseConnection } from '$shared/types/database/connection';
|
|
2
|
+
|
|
3
|
+
import { debug } from '$shared/utils/logger';
|
|
4
|
+
export const description = 'Create messages table for storing SDKMessage data as JSON';
|
|
5
|
+
|
|
6
|
+
export const up = (db: DatabaseConnection): void => {
|
|
7
|
+
debug.log('migration', '📋 Creating messages table...');
|
|
8
|
+
|
|
9
|
+
db.exec(`
|
|
10
|
+
CREATE TABLE messages (
|
|
11
|
+
id TEXT PRIMARY KEY,
|
|
12
|
+
session_id TEXT NOT NULL,
|
|
13
|
+
timestamp TEXT NOT NULL,
|
|
14
|
+
sdk_message TEXT NOT NULL,
|
|
15
|
+
FOREIGN KEY (session_id) REFERENCES chat_sessions(id)
|
|
16
|
+
)
|
|
17
|
+
`);
|
|
18
|
+
|
|
19
|
+
// Create indexes for performance
|
|
20
|
+
db.exec(`
|
|
21
|
+
CREATE INDEX idx_messages_session_id ON messages(session_id);
|
|
22
|
+
CREATE INDEX idx_messages_timestamp ON messages(timestamp)
|
|
23
|
+
`);
|
|
24
|
+
|
|
25
|
+
debug.log('migration', '✅ Messages table created');
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const down = (db: DatabaseConnection): void => {
|
|
29
|
+
debug.log('migration', '🗑️ Dropping messages table...');
|
|
30
|
+
db.exec('DROP TABLE IF EXISTS messages');
|
|
31
|
+
debug.log('migration', '✅ Messages table dropped');
|
|
32
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { DatabaseConnection } from '$shared/types/database/connection';
|
|
2
|
+
|
|
3
|
+
import { debug } from '$shared/utils/logger';
|
|
4
|
+
export const description = 'Create prompt_templates table for storing reusable prompt templates';
|
|
5
|
+
|
|
6
|
+
export const up = (db: DatabaseConnection): void => {
|
|
7
|
+
debug.log('migration', '📋 Creating prompt_templates table...');
|
|
8
|
+
|
|
9
|
+
db.exec(`
|
|
10
|
+
CREATE TABLE IF NOT EXISTS prompt_templates (
|
|
11
|
+
id TEXT PRIMARY KEY,
|
|
12
|
+
name TEXT NOT NULL,
|
|
13
|
+
category TEXT NOT NULL,
|
|
14
|
+
content TEXT NOT NULL,
|
|
15
|
+
description TEXT NOT NULL,
|
|
16
|
+
created_at TEXT NOT NULL,
|
|
17
|
+
tags TEXT,
|
|
18
|
+
usage_count INTEGER DEFAULT 0
|
|
19
|
+
)
|
|
20
|
+
`);
|
|
21
|
+
|
|
22
|
+
// Create index for performance
|
|
23
|
+
db.exec(`
|
|
24
|
+
CREATE INDEX IF NOT EXISTS idx_prompt_templates_category ON prompt_templates(category)
|
|
25
|
+
`);
|
|
26
|
+
|
|
27
|
+
debug.log('migration', '✅ Prompt templates table created');
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const down = (db: DatabaseConnection): void => {
|
|
31
|
+
debug.log('migration', '🗑️ Dropping prompt_templates table...');
|
|
32
|
+
db.exec('DROP TABLE IF EXISTS prompt_templates');
|
|
33
|
+
debug.log('migration', '✅ Prompt templates table dropped');
|
|
34
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { DatabaseConnection } from '$shared/types/database/connection';
|
|
2
|
+
|
|
3
|
+
import { debug } from '$shared/utils/logger';
|
|
4
|
+
export const description = 'Create settings table for storing application configuration';
|
|
5
|
+
|
|
6
|
+
export const up = (db: DatabaseConnection): void => {
|
|
7
|
+
debug.log('migration', '📋 Creating settings table...');
|
|
8
|
+
|
|
9
|
+
db.exec(`
|
|
10
|
+
CREATE TABLE settings (
|
|
11
|
+
key TEXT PRIMARY KEY,
|
|
12
|
+
value TEXT NOT NULL,
|
|
13
|
+
updated_at TEXT NOT NULL
|
|
14
|
+
)
|
|
15
|
+
`);
|
|
16
|
+
|
|
17
|
+
debug.log('migration', '✅ Settings table created');
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const down = (db: DatabaseConnection): void => {
|
|
21
|
+
debug.log('migration', '🗑️ Dropping settings table...');
|
|
22
|
+
db.exec('DROP TABLE IF EXISTS settings');
|
|
23
|
+
debug.log('migration', '✅ Settings table dropped');
|
|
24
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { DatabaseConnection } from '$shared/types/database/connection';
|
|
2
|
+
|
|
3
|
+
import { debug } from '$shared/utils/logger';
|
|
4
|
+
export const description = 'Add user identification fields to messages table for shared chat';
|
|
5
|
+
|
|
6
|
+
export const up = (db: DatabaseConnection): void => {
|
|
7
|
+
debug.log('migration', '📋 Adding user fields to messages table...');
|
|
8
|
+
|
|
9
|
+
// Add sender_id and sender_name columns to messages table
|
|
10
|
+
db.exec(`
|
|
11
|
+
ALTER TABLE messages
|
|
12
|
+
ADD COLUMN sender_id TEXT;
|
|
13
|
+
`);
|
|
14
|
+
|
|
15
|
+
db.exec(`
|
|
16
|
+
ALTER TABLE messages
|
|
17
|
+
ADD COLUMN sender_name TEXT;
|
|
18
|
+
`);
|
|
19
|
+
|
|
20
|
+
// Create index for sender_id for performance
|
|
21
|
+
db.exec(`
|
|
22
|
+
CREATE INDEX idx_messages_sender_id ON messages(sender_id);
|
|
23
|
+
`);
|
|
24
|
+
|
|
25
|
+
debug.log('migration', '✅ User fields added to messages table');
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const down = (db: DatabaseConnection): void => {
|
|
29
|
+
debug.log('migration', '🗑️ Removing user fields from messages table...');
|
|
30
|
+
|
|
31
|
+
// SQLite doesn't support dropping columns directly, need to recreate table
|
|
32
|
+
db.exec(`
|
|
33
|
+
-- Create temporary table without user fields
|
|
34
|
+
CREATE TABLE messages_temp (
|
|
35
|
+
id TEXT PRIMARY KEY,
|
|
36
|
+
session_id TEXT NOT NULL,
|
|
37
|
+
timestamp TEXT NOT NULL,
|
|
38
|
+
sdk_message TEXT NOT NULL,
|
|
39
|
+
FOREIGN KEY (session_id) REFERENCES chat_sessions(id)
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
-- Copy data
|
|
43
|
+
INSERT INTO messages_temp (id, session_id, timestamp, sdk_message)
|
|
44
|
+
SELECT id, session_id, timestamp, sdk_message FROM messages;
|
|
45
|
+
|
|
46
|
+
-- Drop original table
|
|
47
|
+
DROP TABLE messages;
|
|
48
|
+
|
|
49
|
+
-- Rename temp table
|
|
50
|
+
ALTER TABLE messages_temp RENAME TO messages;
|
|
51
|
+
|
|
52
|
+
-- Recreate indexes
|
|
53
|
+
CREATE INDEX idx_messages_session_id ON messages(session_id);
|
|
54
|
+
CREATE INDEX idx_messages_timestamp ON messages(timestamp);
|
|
55
|
+
`);
|
|
56
|
+
|
|
57
|
+
debug.log('migration', '✅ User fields removed from messages table');
|
|
58
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { DatabaseConnection } from '$shared/types/database/connection';
|
|
2
|
+
|
|
3
|
+
import { debug } from '$shared/utils/logger';
|
|
4
|
+
export const description = 'Create stream states table for persistent background streaming';
|
|
5
|
+
|
|
6
|
+
export const up = (db: DatabaseConnection): void => {
|
|
7
|
+
debug.log('migration', '📋 Creating stream_states table...');
|
|
8
|
+
|
|
9
|
+
db.exec(`
|
|
10
|
+
CREATE TABLE IF NOT EXISTS stream_states (
|
|
11
|
+
stream_id TEXT PRIMARY KEY,
|
|
12
|
+
chat_session_id TEXT NOT NULL,
|
|
13
|
+
project_id TEXT,
|
|
14
|
+
process_id TEXT NOT NULL,
|
|
15
|
+
status TEXT NOT NULL CHECK(status IN ('active', 'completed', 'error', 'cancelled')),
|
|
16
|
+
started_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
17
|
+
completed_at DATETIME,
|
|
18
|
+
last_message_index INTEGER NOT NULL DEFAULT 0,
|
|
19
|
+
error TEXT,
|
|
20
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
21
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
22
|
+
FOREIGN KEY (chat_session_id) REFERENCES chat_sessions (id) ON DELETE CASCADE
|
|
23
|
+
)
|
|
24
|
+
`);
|
|
25
|
+
|
|
26
|
+
db.exec(`
|
|
27
|
+
CREATE INDEX idx_stream_states_session ON stream_states(chat_session_id)
|
|
28
|
+
`);
|
|
29
|
+
|
|
30
|
+
db.exec(`
|
|
31
|
+
CREATE INDEX idx_stream_states_status ON stream_states(status)
|
|
32
|
+
`);
|
|
33
|
+
|
|
34
|
+
debug.log('migration', '✅ stream_states table created successfully');
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const down = (db: DatabaseConnection): void => {
|
|
38
|
+
debug.log('migration', '🗑️ Dropping stream_states table...');
|
|
39
|
+
db.exec(`DROP TABLE IF EXISTS stream_states`);
|
|
40
|
+
debug.log('migration', '✅ stream_states table dropped');
|
|
41
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration: Create message snapshots table for time travel feature
|
|
3
|
+
* Purpose: Store file snapshots for each user message to enable restoration
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export const description = 'Create message snapshots table';
|
|
7
|
+
|
|
8
|
+
export function up(db: any): void {
|
|
9
|
+
// Create message_snapshots table for storing project state at each message
|
|
10
|
+
db.prepare(`
|
|
11
|
+
CREATE TABLE IF NOT EXISTS message_snapshots (
|
|
12
|
+
id TEXT PRIMARY KEY,
|
|
13
|
+
message_id TEXT NOT NULL,
|
|
14
|
+
session_id TEXT NOT NULL,
|
|
15
|
+
project_id TEXT NOT NULL,
|
|
16
|
+
files_snapshot TEXT NOT NULL, -- JSON object with file paths and contents
|
|
17
|
+
project_metadata TEXT, -- JSON object with project info (name, path, etc)
|
|
18
|
+
created_at TEXT NOT NULL,
|
|
19
|
+
FOREIGN KEY (message_id) REFERENCES messages (id) ON DELETE CASCADE,
|
|
20
|
+
FOREIGN KEY (session_id) REFERENCES chat_sessions (id) ON DELETE CASCADE,
|
|
21
|
+
FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
|
|
22
|
+
)
|
|
23
|
+
`).run();
|
|
24
|
+
|
|
25
|
+
// Create indexes for efficient queries
|
|
26
|
+
db.prepare('CREATE INDEX IF NOT EXISTS idx_message_snapshots_message_id ON message_snapshots (message_id)').run();
|
|
27
|
+
db.prepare('CREATE INDEX IF NOT EXISTS idx_message_snapshots_session_id ON message_snapshots (session_id)').run();
|
|
28
|
+
db.prepare('CREATE INDEX IF NOT EXISTS idx_message_snapshots_project_id ON message_snapshots (project_id)').run();
|
|
29
|
+
db.prepare('CREATE INDEX IF NOT EXISTS idx_message_snapshots_created_at ON message_snapshots (created_at)').run();
|
|
30
|
+
|
|
31
|
+
// Create session_relationships table for tracking parent-child relationships
|
|
32
|
+
db.prepare(`
|
|
33
|
+
CREATE TABLE IF NOT EXISTS session_relationships (
|
|
34
|
+
id TEXT PRIMARY KEY,
|
|
35
|
+
parent_session_id TEXT NOT NULL,
|
|
36
|
+
child_session_id TEXT NOT NULL,
|
|
37
|
+
branched_from_message_id TEXT,
|
|
38
|
+
created_at TEXT NOT NULL,
|
|
39
|
+
FOREIGN KEY (parent_session_id) REFERENCES chat_sessions (id) ON DELETE CASCADE,
|
|
40
|
+
FOREIGN KEY (child_session_id) REFERENCES chat_sessions (id) ON DELETE CASCADE,
|
|
41
|
+
FOREIGN KEY (branched_from_message_id) REFERENCES messages (id) ON DELETE SET NULL
|
|
42
|
+
)
|
|
43
|
+
`).run();
|
|
44
|
+
|
|
45
|
+
// Create indexes for session relationships
|
|
46
|
+
db.prepare('CREATE INDEX IF NOT EXISTS idx_session_relationships_parent ON session_relationships (parent_session_id)').run();
|
|
47
|
+
db.prepare('CREATE INDEX IF NOT EXISTS idx_session_relationships_child ON session_relationships (child_session_id)').run();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function down(db: any): void {
|
|
51
|
+
// Drop indexes
|
|
52
|
+
db.prepare('DROP INDEX IF EXISTS idx_session_relationships_child').run();
|
|
53
|
+
db.prepare('DROP INDEX IF EXISTS idx_session_relationships_parent').run();
|
|
54
|
+
db.prepare('DROP INDEX IF EXISTS idx_message_snapshots_created_at').run();
|
|
55
|
+
db.prepare('DROP INDEX IF EXISTS idx_message_snapshots_project_id').run();
|
|
56
|
+
db.prepare('DROP INDEX IF EXISTS idx_message_snapshots_session_id').run();
|
|
57
|
+
db.prepare('DROP INDEX IF EXISTS idx_message_snapshots_message_id').run();
|
|
58
|
+
|
|
59
|
+
// Drop tables
|
|
60
|
+
db.prepare('DROP TABLE IF EXISTS session_relationships').run();
|
|
61
|
+
db.prepare('DROP TABLE IF EXISTS message_snapshots').run();
|
|
62
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { DatabaseConnection } from '$shared/types/database/connection';
|
|
2
|
+
|
|
3
|
+
import { debug } from '$shared/utils/logger';
|
|
4
|
+
export const description = 'Add delta snapshot support for efficient storage';
|
|
5
|
+
|
|
6
|
+
export const up = (db: DatabaseConnection): void => {
|
|
7
|
+
debug.log('migration', '📋 Adding delta snapshot fields...');
|
|
8
|
+
|
|
9
|
+
// Add new columns for delta snapshots
|
|
10
|
+
db.exec(`
|
|
11
|
+
ALTER TABLE message_snapshots
|
|
12
|
+
ADD COLUMN snapshot_type TEXT DEFAULT 'full' CHECK(snapshot_type IN ('full', 'delta'))
|
|
13
|
+
`);
|
|
14
|
+
|
|
15
|
+
db.exec(`
|
|
16
|
+
ALTER TABLE message_snapshots
|
|
17
|
+
ADD COLUMN parent_snapshot_id TEXT
|
|
18
|
+
`);
|
|
19
|
+
|
|
20
|
+
db.exec(`
|
|
21
|
+
ALTER TABLE message_snapshots
|
|
22
|
+
ADD COLUMN delta_changes TEXT
|
|
23
|
+
`);
|
|
24
|
+
|
|
25
|
+
// Create index for parent lookup
|
|
26
|
+
db.exec(`
|
|
27
|
+
CREATE INDEX idx_message_snapshots_parent ON message_snapshots(parent_snapshot_id)
|
|
28
|
+
`);
|
|
29
|
+
|
|
30
|
+
debug.log('migration', '✅ Delta snapshot fields added');
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const down = (db: DatabaseConnection): void => {
|
|
34
|
+
debug.log('migration', '🗑️ Removing delta snapshot fields...');
|
|
35
|
+
|
|
36
|
+
// SQLite doesn't support DROP COLUMN easily, so we'd need to recreate table
|
|
37
|
+
// For now, this is a forward-only migration
|
|
38
|
+
debug.warn('migration', '⚠️ Rollback not implemented for delta snapshot fields');
|
|
39
|
+
|
|
40
|
+
debug.log('migration', '✅ Delta snapshot fields rollback skipped');
|
|
41
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration: Add soft delete and branch support for undo/redo feature
|
|
3
|
+
* Purpose: Enable multi-branch redo functionality with soft deletes
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { DatabaseConnection } from '$shared/types/database/connection';
|
|
7
|
+
|
|
8
|
+
import { debug } from '$shared/utils/logger';
|
|
9
|
+
export const description = 'Add soft delete and branch support for multi-branch redo';
|
|
10
|
+
|
|
11
|
+
export const up = (db: DatabaseConnection): void => {
|
|
12
|
+
debug.log('migration', '📋 Adding soft delete and branch support...');
|
|
13
|
+
|
|
14
|
+
// Add columns to messages table
|
|
15
|
+
db.exec(`
|
|
16
|
+
ALTER TABLE messages
|
|
17
|
+
ADD COLUMN is_deleted INTEGER DEFAULT 0 CHECK(is_deleted IN (0, 1))
|
|
18
|
+
`);
|
|
19
|
+
|
|
20
|
+
db.exec(`
|
|
21
|
+
ALTER TABLE messages
|
|
22
|
+
ADD COLUMN branch_id TEXT
|
|
23
|
+
`);
|
|
24
|
+
|
|
25
|
+
// Add columns to message_snapshots table
|
|
26
|
+
db.exec(`
|
|
27
|
+
ALTER TABLE message_snapshots
|
|
28
|
+
ADD COLUMN is_deleted INTEGER DEFAULT 0 CHECK(is_deleted IN (0, 1))
|
|
29
|
+
`);
|
|
30
|
+
|
|
31
|
+
db.exec(`
|
|
32
|
+
ALTER TABLE message_snapshots
|
|
33
|
+
ADD COLUMN branch_id TEXT
|
|
34
|
+
`);
|
|
35
|
+
|
|
36
|
+
// Create indexes for efficient queries
|
|
37
|
+
db.exec(`
|
|
38
|
+
CREATE INDEX idx_messages_is_deleted ON messages(is_deleted)
|
|
39
|
+
`);
|
|
40
|
+
|
|
41
|
+
db.exec(`
|
|
42
|
+
CREATE INDEX idx_messages_branch_id ON messages(branch_id)
|
|
43
|
+
`);
|
|
44
|
+
|
|
45
|
+
db.exec(`
|
|
46
|
+
CREATE INDEX idx_message_snapshots_is_deleted ON message_snapshots(is_deleted)
|
|
47
|
+
`);
|
|
48
|
+
|
|
49
|
+
db.exec(`
|
|
50
|
+
CREATE INDEX idx_message_snapshots_branch_id ON message_snapshots(branch_id)
|
|
51
|
+
`);
|
|
52
|
+
|
|
53
|
+
debug.log('migration', '✅ Soft delete and branch support added');
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export const down = (db: DatabaseConnection): void => {
|
|
57
|
+
debug.log('migration', '🗑️ Removing soft delete and branch support...');
|
|
58
|
+
|
|
59
|
+
// Drop indexes
|
|
60
|
+
db.exec('DROP INDEX IF EXISTS idx_message_snapshots_branch_id');
|
|
61
|
+
db.exec('DROP INDEX IF EXISTS idx_message_snapshots_is_deleted');
|
|
62
|
+
db.exec('DROP INDEX IF EXISTS idx_messages_branch_id');
|
|
63
|
+
db.exec('DROP INDEX IF EXISTS idx_messages_is_deleted');
|
|
64
|
+
|
|
65
|
+
// SQLite doesn't support DROP COLUMN easily without recreating table
|
|
66
|
+
// For rollback, we'd need to recreate tables without these columns
|
|
67
|
+
debug.warn('migration', '⚠️ Full rollback not implemented - columns remain but unused');
|
|
68
|
+
|
|
69
|
+
debug.log('migration', '✅ Soft delete and branch support rollback completed');
|
|
70
|
+
};
|