@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,187 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { settings, updateSettings } from '$frontend/lib/stores/features/settings.svelte';
|
|
3
|
+
import Icon from '../../common/Icon.svelte';
|
|
4
|
+
import Dialog from '../../common/Dialog.svelte';
|
|
5
|
+
import { detectPlatform } from '$frontend/lib/utils/platform';
|
|
6
|
+
|
|
7
|
+
let showAddPathDialog = $state(false);
|
|
8
|
+
let newPathValue = $state('');
|
|
9
|
+
|
|
10
|
+
// Detect backend OS: prioritize existing path entries, fallback to browser platform.
|
|
11
|
+
// Checking existing paths is most reliable (works correctly in WSL too).
|
|
12
|
+
const isWindowsBackend = $derived(
|
|
13
|
+
settings.allowedBasePaths.some(p => /^[A-Za-z]:/.test(p)) ||
|
|
14
|
+
(!settings.allowedBasePaths.some(p => p.startsWith('/')) && detectPlatform() === 'windows')
|
|
15
|
+
);
|
|
16
|
+
const pathInputPlaceholder = $derived(
|
|
17
|
+
isWindowsBackend ? 'e.g. C:\\Users\\projects' : 'e.g. /home/user/projects'
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
// Track which path index is being edited, and its current edit value
|
|
21
|
+
let editingIndex = $state<number | null>(null);
|
|
22
|
+
let editingValue = $state('');
|
|
23
|
+
|
|
24
|
+
function openAddPathDialog() {
|
|
25
|
+
newPathValue = '';
|
|
26
|
+
showAddPathDialog = true;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function addPath() {
|
|
30
|
+
const path = newPathValue.trim();
|
|
31
|
+
if (path && !settings.allowedBasePaths.includes(path)) {
|
|
32
|
+
updateSettings({ allowedBasePaths: [...settings.allowedBasePaths, path] });
|
|
33
|
+
}
|
|
34
|
+
newPathValue = '';
|
|
35
|
+
showAddPathDialog = false;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function removePath(index: number) {
|
|
39
|
+
const newPaths = [...settings.allowedBasePaths];
|
|
40
|
+
newPaths.splice(index, 1);
|
|
41
|
+
updateSettings({ allowedBasePaths: newPaths });
|
|
42
|
+
if (editingIndex === index) {
|
|
43
|
+
editingIndex = null;
|
|
44
|
+
editingValue = '';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function startEdit(index: number) {
|
|
49
|
+
editingIndex = index;
|
|
50
|
+
editingValue = settings.allowedBasePaths[index];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function saveEdit() {
|
|
54
|
+
if (editingIndex === null) return;
|
|
55
|
+
const path = editingValue.trim();
|
|
56
|
+
if (path) {
|
|
57
|
+
const newPaths = [...settings.allowedBasePaths];
|
|
58
|
+
newPaths[editingIndex] = path;
|
|
59
|
+
updateSettings({ allowedBasePaths: newPaths });
|
|
60
|
+
}
|
|
61
|
+
editingIndex = null;
|
|
62
|
+
editingValue = '';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function cancelEdit() {
|
|
66
|
+
editingIndex = null;
|
|
67
|
+
editingValue = '';
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function handleEditKeydown(e: KeyboardEvent) {
|
|
71
|
+
if (e.key === 'Enter') saveEdit();
|
|
72
|
+
else if (e.key === 'Escape') cancelEdit();
|
|
73
|
+
}
|
|
74
|
+
</script>
|
|
75
|
+
|
|
76
|
+
<div class="py-1">
|
|
77
|
+
<h3 class="text-base font-bold text-slate-900 dark:text-slate-100 mb-1.5">Advanced</h3>
|
|
78
|
+
<p class="text-sm text-slate-600 dark:text-slate-500 mb-5">Security and access control settings</p>
|
|
79
|
+
|
|
80
|
+
<div class="flex flex-col gap-3.5">
|
|
81
|
+
<!-- Folder Access Restriction -->
|
|
82
|
+
<div class="p-4 bg-slate-100/80 dark:bg-slate-800/80 border border-slate-200 dark:border-slate-800 rounded-xl">
|
|
83
|
+
<div class="flex items-start gap-3.5 mb-4">
|
|
84
|
+
<div class="flex items-center justify-center w-10 h-10 rounded-lg shrink-0 bg-amber-400/15 text-amber-500">
|
|
85
|
+
<Icon name="lucide:folder-lock" class="w-5 h-5" />
|
|
86
|
+
</div>
|
|
87
|
+
<div class="flex flex-col gap-0.5 min-w-0 flex-1">
|
|
88
|
+
<div class="text-sm font-semibold text-slate-900 dark:text-slate-100">
|
|
89
|
+
Folder Access Restriction
|
|
90
|
+
</div>
|
|
91
|
+
<div class="text-xs text-slate-600 dark:text-slate-500">
|
|
92
|
+
Restrict the <span class="font-medium text-slate-700 dark:text-slate-400">Select Project Folder</span> browser to only show specific base directories.
|
|
93
|
+
This does not restrict file access in other parts of the app. Leave empty to allow browsing all directories.
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<!-- Allowed paths list -->
|
|
99
|
+
<div class="flex flex-col gap-2">
|
|
100
|
+
{#if settings.allowedBasePaths.length === 0}
|
|
101
|
+
<div class="flex items-center gap-2 px-3 py-2.5 bg-green-500/10 border border-green-500/20 rounded-lg">
|
|
102
|
+
<Icon name="lucide:circle-check" class="w-4 h-4 text-green-600 dark:text-green-400 shrink-0" />
|
|
103
|
+
<span class="text-xs text-green-700 dark:text-green-400">
|
|
104
|
+
No restrictions — all directories can be selected as project folder
|
|
105
|
+
</span>
|
|
106
|
+
</div>
|
|
107
|
+
{:else}
|
|
108
|
+
{#each settings.allowedBasePaths as basePath, index (basePath + index)}
|
|
109
|
+
<div class="flex items-center gap-2 px-3 py-2 bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-700 rounded-lg group">
|
|
110
|
+
<Icon name="lucide:folder-check" class="w-4 h-4 text-violet-500 shrink-0" />
|
|
111
|
+
|
|
112
|
+
{#if editingIndex === index}
|
|
113
|
+
<!-- Edit mode -->
|
|
114
|
+
<input
|
|
115
|
+
type="text"
|
|
116
|
+
bind:value={editingValue}
|
|
117
|
+
onkeydown={handleEditKeydown}
|
|
118
|
+
class="flex-1 font-mono text-xs bg-slate-50 dark:bg-slate-800 border border-violet-400 dark:border-violet-500 rounded px-2 py-1 text-slate-700 dark:text-slate-300 focus:outline-none focus:ring-1 focus:ring-violet-500/30"
|
|
119
|
+
/>
|
|
120
|
+
<button
|
|
121
|
+
type="button"
|
|
122
|
+
onclick={saveEdit}
|
|
123
|
+
disabled={!editingValue.trim()}
|
|
124
|
+
class="flex items-center justify-center w-6 h-6 rounded-md bg-violet-500/10 hover:bg-violet-500/20 text-violet-600 dark:text-violet-400 transition-all disabled:opacity-40 disabled:cursor-not-allowed"
|
|
125
|
+
title="Save"
|
|
126
|
+
>
|
|
127
|
+
<Icon name="lucide:check" class="w-3.5 h-3.5" />
|
|
128
|
+
</button>
|
|
129
|
+
<button
|
|
130
|
+
type="button"
|
|
131
|
+
onclick={cancelEdit}
|
|
132
|
+
class="flex items-center justify-center w-6 h-6 rounded-md hover:bg-slate-100 dark:hover:bg-slate-700 text-slate-400 transition-all"
|
|
133
|
+
title="Cancel"
|
|
134
|
+
>
|
|
135
|
+
<Icon name="lucide:x" class="w-3.5 h-3.5" />
|
|
136
|
+
</button>
|
|
137
|
+
{:else}
|
|
138
|
+
<!-- Display mode -->
|
|
139
|
+
<span class="flex-1 font-mono text-xs text-slate-700 dark:text-slate-300 truncate">{basePath}</span>
|
|
140
|
+
<button
|
|
141
|
+
type="button"
|
|
142
|
+
onclick={() => startEdit(index)}
|
|
143
|
+
class="flex items-center justify-center w-6 h-6 rounded-md opacity-0 group-hover:opacity-100 hover:bg-violet-100 dark:hover:bg-violet-900/30 text-slate-400 hover:text-violet-600 dark:hover:text-violet-400 transition-all"
|
|
144
|
+
title="Edit path"
|
|
145
|
+
>
|
|
146
|
+
<Icon name="lucide:pencil" class="w-3.5 h-3.5" />
|
|
147
|
+
</button>
|
|
148
|
+
<button
|
|
149
|
+
type="button"
|
|
150
|
+
onclick={() => removePath(index)}
|
|
151
|
+
class="flex items-center justify-center w-6 h-6 rounded-md opacity-0 group-hover:opacity-100 hover:bg-red-100 dark:hover:bg-red-900/30 text-slate-400 hover:text-red-500 dark:hover:text-red-400 transition-all"
|
|
152
|
+
title="Remove path"
|
|
153
|
+
>
|
|
154
|
+
<Icon name="lucide:trash-2" class="w-3.5 h-3.5" />
|
|
155
|
+
</button>
|
|
156
|
+
{/if}
|
|
157
|
+
</div>
|
|
158
|
+
{/each}
|
|
159
|
+
{/if}
|
|
160
|
+
|
|
161
|
+
<button
|
|
162
|
+
type="button"
|
|
163
|
+
onclick={openAddPathDialog}
|
|
164
|
+
class="inline-flex items-center gap-1.5 py-2 px-3.5 mt-1 bg-violet-500/10 dark:bg-violet-500/10 border border-violet-500/20 dark:border-violet-500/25 rounded-lg text-violet-600 dark:text-violet-400 text-xs font-semibold cursor-pointer transition-all duration-150 hover:bg-violet-500/20 hover:border-violet-600/40 self-start"
|
|
165
|
+
>
|
|
166
|
+
<Icon name="lucide:folder-plus" class="w-3.5 h-3.5" />
|
|
167
|
+
Add Allowed Path
|
|
168
|
+
</button>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
|
|
174
|
+
<Dialog
|
|
175
|
+
bind:isOpen={showAddPathDialog}
|
|
176
|
+
onClose={() => { showAddPathDialog = false; newPathValue = ''; }}
|
|
177
|
+
title="Add Allowed Path"
|
|
178
|
+
type="info"
|
|
179
|
+
message="Enter the full path to allow as a project folder. All subdirectories will also be selectable."
|
|
180
|
+
bind:inputValue={newPathValue}
|
|
181
|
+
inputPlaceholder={pathInputPlaceholder}
|
|
182
|
+
confirmText="Add"
|
|
183
|
+
cancelText="Cancel"
|
|
184
|
+
showCancel={true}
|
|
185
|
+
confirmDisabled={!newPathValue.trim()}
|
|
186
|
+
onConfirm={addPath}
|
|
187
|
+
/>
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { initializeProjects, projectState } from '$frontend/lib/stores/core/projects.svelte';
|
|
3
|
+
import { initializeStore } from '$frontend/lib/stores/core/app.svelte';
|
|
4
|
+
import { sessionState } from '$frontend/lib/stores/core/sessions.svelte';
|
|
5
|
+
import { addNotification } from '$frontend/lib/stores/ui/notification.svelte';
|
|
6
|
+
import { settings, resetToDefaults } from '$frontend/lib/stores/features/settings.svelte';
|
|
7
|
+
import { showConfirm } from '$frontend/lib/stores/ui/dialog.svelte';
|
|
8
|
+
import { terminalStore } from '$frontend/lib/stores/features/terminal.svelte';
|
|
9
|
+
import Icon from '../../common/Icon.svelte';
|
|
10
|
+
import { debug } from '$shared/utils/logger';
|
|
11
|
+
import ws from '$frontend/lib/utils/ws';
|
|
12
|
+
|
|
13
|
+
let isExporting = $state(false);
|
|
14
|
+
let isClearing = $state(false);
|
|
15
|
+
|
|
16
|
+
async function clearData() {
|
|
17
|
+
const confirmed = await showConfirm({
|
|
18
|
+
title: 'Clear All Data',
|
|
19
|
+
message:
|
|
20
|
+
'Are you sure you want to clear all data? This will delete all projects, sessions, and settings. This action cannot be undone.',
|
|
21
|
+
type: 'error',
|
|
22
|
+
confirmText: 'Clear All Data',
|
|
23
|
+
cancelText: 'Cancel'
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
if (confirmed) {
|
|
27
|
+
isClearing = true;
|
|
28
|
+
try {
|
|
29
|
+
localStorage.clear();
|
|
30
|
+
sessionStorage.clear();
|
|
31
|
+
|
|
32
|
+
const response = await ws.http('system:clear-data', {});
|
|
33
|
+
|
|
34
|
+
if (response.cleared) {
|
|
35
|
+
terminalStore.clearAllSessions();
|
|
36
|
+
projectState.currentProject = null;
|
|
37
|
+
await initializeProjects();
|
|
38
|
+
await initializeStore();
|
|
39
|
+
resetToDefaults();
|
|
40
|
+
|
|
41
|
+
addNotification({
|
|
42
|
+
type: 'success',
|
|
43
|
+
title: 'Data Cleared',
|
|
44
|
+
message: 'All data has been cleared successfully'
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
} catch (error) {
|
|
48
|
+
debug.error('settings', 'Error clearing data:', error);
|
|
49
|
+
addNotification({
|
|
50
|
+
type: 'error',
|
|
51
|
+
title: 'Clear Data Error',
|
|
52
|
+
message: 'Failed to clear all data',
|
|
53
|
+
duration: 4000
|
|
54
|
+
});
|
|
55
|
+
} finally {
|
|
56
|
+
isClearing = false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function exportData() {
|
|
62
|
+
isExporting = true;
|
|
63
|
+
try {
|
|
64
|
+
const [projects, sessions, messages] = await Promise.all([
|
|
65
|
+
ws.http('projects:list', {}),
|
|
66
|
+
ws.http('sessions:list', {}),
|
|
67
|
+
ws.http('messages:list', { session_id: '', include_all: true })
|
|
68
|
+
]);
|
|
69
|
+
|
|
70
|
+
const data = {
|
|
71
|
+
projects: projects || projectState.projects,
|
|
72
|
+
sessions: sessions || sessionState.sessions,
|
|
73
|
+
messages: messages || sessionState.messages,
|
|
74
|
+
settings: settings,
|
|
75
|
+
exportedAt: new Date().toISOString(),
|
|
76
|
+
version: '1.0'
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });
|
|
80
|
+
const url = URL.createObjectURL(blob);
|
|
81
|
+
const a = document.createElement('a');
|
|
82
|
+
a.href = url;
|
|
83
|
+
a.download = `clopen-data-${new Date().toISOString().split('T')[0]}.json`;
|
|
84
|
+
a.click();
|
|
85
|
+
URL.revokeObjectURL(url);
|
|
86
|
+
|
|
87
|
+
addNotification({
|
|
88
|
+
type: 'success',
|
|
89
|
+
title: 'Export Complete',
|
|
90
|
+
message: 'Your data has been exported successfully'
|
|
91
|
+
});
|
|
92
|
+
} catch (error) {
|
|
93
|
+
debug.error('settings', 'Export error:', error);
|
|
94
|
+
addNotification({
|
|
95
|
+
type: 'error',
|
|
96
|
+
title: 'Export Error',
|
|
97
|
+
message: 'Failed to export data',
|
|
98
|
+
duration: 4000
|
|
99
|
+
});
|
|
100
|
+
} finally {
|
|
101
|
+
isExporting = false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function resetSettings() {
|
|
106
|
+
const confirmed = await showConfirm({
|
|
107
|
+
title: 'Reset Settings',
|
|
108
|
+
message:
|
|
109
|
+
'Are you sure you want to reset all settings to defaults? This will not delete your projects or conversations.',
|
|
110
|
+
type: 'warning',
|
|
111
|
+
confirmText: 'Reset Settings',
|
|
112
|
+
cancelText: 'Cancel'
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
if (confirmed) {
|
|
116
|
+
resetToDefaults();
|
|
117
|
+
addNotification({
|
|
118
|
+
type: 'success',
|
|
119
|
+
title: 'Settings Reset',
|
|
120
|
+
message: 'All settings have been restored to defaults'
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
</script>
|
|
125
|
+
|
|
126
|
+
<div class="py-1">
|
|
127
|
+
<h3 class="text-base font-bold text-slate-900 dark:text-slate-100 mb-1.5">Data Management</h3>
|
|
128
|
+
<p class="text-sm text-slate-600 dark:text-slate-500 mb-5">
|
|
129
|
+
Export, import, or clear your application data
|
|
130
|
+
</p>
|
|
131
|
+
|
|
132
|
+
<div class="flex flex-col gap-4">
|
|
133
|
+
<!-- Storage Info -->
|
|
134
|
+
<div
|
|
135
|
+
class="flex items-center gap-3.5 p-4 bg-slate-100/50 dark:bg-slate-800/50 border border-slate-200 dark:border-slate-700/50 rounded-lg"
|
|
136
|
+
>
|
|
137
|
+
<Icon name="lucide:hard-drive" class="w-5 h-5 text-slate-500 dark:text-slate-400" />
|
|
138
|
+
<div class="flex-1">
|
|
139
|
+
<div class="text-sm font-medium text-slate-900 dark:text-slate-100">Local Storage</div>
|
|
140
|
+
<div class="text-xs text-slate-600 dark:text-slate-400">Data is stored locally in your browser</div>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
|
|
144
|
+
<!-- Action Cards -->
|
|
145
|
+
<div class="flex flex-col gap-3">
|
|
146
|
+
<!-- Reset Settings -->
|
|
147
|
+
<div
|
|
148
|
+
class="flex items-center justify-between gap-4 py-3 px-4 bg-slate-100/50 dark:bg-slate-800/50 border border-slate-200 dark:border-slate-700/50 rounded-lg"
|
|
149
|
+
>
|
|
150
|
+
<div class="flex items-center gap-3">
|
|
151
|
+
<Icon name="lucide:refresh-cw" class="w-4.5 h-4.5 text-slate-600 dark:text-slate-400" />
|
|
152
|
+
<div class="text-left">
|
|
153
|
+
<div class="text-sm font-medium text-slate-900 dark:text-slate-100">Reset Settings</div>
|
|
154
|
+
<div class="text-xs text-slate-600 dark:text-slate-400">Restore default settings</div>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
<button
|
|
158
|
+
type="button"
|
|
159
|
+
class="px-4 py-2 bg-slate-200 dark:bg-slate-700 border border-slate-300 dark:border-slate-600 text-slate-700 dark:text-slate-300 rounded-lg text-sm font-medium cursor-pointer transition-all duration-150 hover:bg-slate-300 dark:hover:bg-slate-600 hover:border-slate-400 dark:hover:border-slate-500 disabled:opacity-60 disabled:cursor-not-allowed whitespace-nowrap"
|
|
160
|
+
onclick={resetSettings}
|
|
161
|
+
>
|
|
162
|
+
Reset
|
|
163
|
+
</button>
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
<!-- Danger Zone -->
|
|
168
|
+
<div class="mt-2">
|
|
169
|
+
<div class="flex items-center gap-2 mb-3 text-xs font-medium text-red-600 dark:text-red-400">
|
|
170
|
+
<Icon name="lucide:triangle-alert" class="w-3.5 h-3.5" />
|
|
171
|
+
<span>Danger Zone</span>
|
|
172
|
+
</div>
|
|
173
|
+
<div
|
|
174
|
+
class="flex items-center justify-between gap-4 p-4 bg-red-500/5 dark:bg-red-500/5 border border-red-500/20 dark:border-red-500/20 rounded-lg max-sm:flex-col max-sm:items-stretch"
|
|
175
|
+
>
|
|
176
|
+
<div class="flex-1">
|
|
177
|
+
<div class="text-sm font-medium text-slate-900 dark:text-slate-100 mb-1">
|
|
178
|
+
Clear All Data
|
|
179
|
+
</div>
|
|
180
|
+
<div class="text-xs text-slate-600 dark:text-slate-400 leading-relaxed">
|
|
181
|
+
Permanently delete all projects, conversations, and settings. This cannot be undone.
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
<button
|
|
185
|
+
type="button"
|
|
186
|
+
class="flex items-center justify-center gap-2 py-2 px-4 bg-red-500/10 border border-red-500/25 rounded-lg text-red-600 dark:text-red-400 text-sm font-medium cursor-pointer transition-all duration-150 whitespace-nowrap hover:bg-red-500/15 hover:border-red-500/35 disabled:opacity-60 disabled:cursor-not-allowed"
|
|
187
|
+
onclick={clearData}
|
|
188
|
+
disabled={isClearing}
|
|
189
|
+
>
|
|
190
|
+
{#if isClearing}
|
|
191
|
+
<div
|
|
192
|
+
class="w-3.5 h-3.5 border-2 border-red-600/30 dark:border-red-400/30 border-t-red-600 dark:border-t-red-400 rounded-full animate-spin"
|
|
193
|
+
></div>
|
|
194
|
+
<span>Clearing...</span>
|
|
195
|
+
{:else}
|
|
196
|
+
<Icon name="lucide:trash-2" class="w-4 h-4" />
|
|
197
|
+
<span>Clear All Data</span>
|
|
198
|
+
{/if}
|
|
199
|
+
</button>
|
|
200
|
+
</div>
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|