@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,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global Stream Monitor Service
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for chat stream notifications (sound + push).
|
|
5
|
+
*
|
|
6
|
+
* Listens for chat:stream-finished events from the backend and triggers
|
|
7
|
+
* notifications for ALL projects — both active and non-active.
|
|
8
|
+
*
|
|
9
|
+
* The backend uses ws.emit.projectMembers() to send this event to all
|
|
10
|
+
* users who have been associated with the project, even if they switched
|
|
11
|
+
* to a different project.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { soundNotification, pushNotification } from '$frontend/lib/services/notification';
|
|
15
|
+
import { projectState } from '$frontend/lib/stores/core/projects.svelte';
|
|
16
|
+
import { sessionState } from '$frontend/lib/stores/core/sessions.svelte';
|
|
17
|
+
import { debug } from '$shared/utils/logger';
|
|
18
|
+
import ws from '$frontend/lib/utils/ws';
|
|
19
|
+
|
|
20
|
+
class GlobalStreamMonitor {
|
|
21
|
+
private initialized = false;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Initialize the monitor - subscribes to the WS event.
|
|
25
|
+
* Safe to call multiple times (idempotent).
|
|
26
|
+
*
|
|
27
|
+
* Only triggers sound/push when the finished stream belongs to the
|
|
28
|
+
* user's current project AND current chat session.
|
|
29
|
+
*/
|
|
30
|
+
initialize(): void {
|
|
31
|
+
if (this.initialized) return;
|
|
32
|
+
this.initialized = true;
|
|
33
|
+
|
|
34
|
+
debug.log('notification', 'GlobalStreamMonitor: Initializing WS listener');
|
|
35
|
+
|
|
36
|
+
ws.on('chat:stream-finished', async (data) => {
|
|
37
|
+
const { projectId, chatSessionId, status, timestamp } = data;
|
|
38
|
+
const isActiveProject = projectState.currentProject?.id === projectId;
|
|
39
|
+
const isActiveSession = sessionState.currentSession?.id === chatSessionId;
|
|
40
|
+
|
|
41
|
+
debug.log('notification', 'GlobalStreamMonitor: Stream finished', {
|
|
42
|
+
projectId,
|
|
43
|
+
chatSessionId,
|
|
44
|
+
status,
|
|
45
|
+
timestamp,
|
|
46
|
+
isActiveProject,
|
|
47
|
+
isActiveSession
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Only notify if the stream is for the user's current project AND session
|
|
51
|
+
if (!isActiveProject || !isActiveSession) return;
|
|
52
|
+
|
|
53
|
+
// Play sound notification
|
|
54
|
+
try {
|
|
55
|
+
await soundNotification.play();
|
|
56
|
+
} catch (error) {
|
|
57
|
+
debug.error('notification', 'Error playing sound notification:', error);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Send push notification with project context
|
|
61
|
+
try {
|
|
62
|
+
const projectName = projectState.projects.find(p => p.id === projectId)?.name || 'Unknown';
|
|
63
|
+
|
|
64
|
+
if (status === 'completed') {
|
|
65
|
+
await pushNotification.sendChatComplete(`Chat response ready in "${projectName}"`);
|
|
66
|
+
} else if (status === 'error') {
|
|
67
|
+
await pushNotification.sendChatError(`Chat error in "${projectName}"`);
|
|
68
|
+
} else if (status === 'cancelled') {
|
|
69
|
+
await pushNotification.sendChatComplete(`Chat interrupted in "${projectName}"`);
|
|
70
|
+
}
|
|
71
|
+
} catch (error) {
|
|
72
|
+
debug.error('notification', 'Error sending push notification:', error);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Clear state (for cleanup/testing)
|
|
79
|
+
*/
|
|
80
|
+
clear(): void {
|
|
81
|
+
debug.log('notification', 'GlobalStreamMonitor: Clearing state');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Export singleton instance
|
|
86
|
+
export const globalStreamMonitor = new GlobalStreamMonitor();
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native Push Notification Service
|
|
3
|
+
*
|
|
4
|
+
* Handles native browser push notifications for chat responses
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { settings } from '$frontend/lib/stores/features/settings.svelte';
|
|
8
|
+
|
|
9
|
+
import { debug } from '$shared/utils/logger';
|
|
10
|
+
// Check if browser supports notifications
|
|
11
|
+
function isSupported(): boolean {
|
|
12
|
+
return typeof window !== 'undefined' && 'Notification' in window;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Get current permission status
|
|
16
|
+
function getPermissionStatus(): NotificationPermission | null {
|
|
17
|
+
if (!isSupported()) return null;
|
|
18
|
+
return Notification.permission;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Request notification permission
|
|
22
|
+
async function requestPermission(): Promise<NotificationPermission> {
|
|
23
|
+
if (!isSupported()) {
|
|
24
|
+
throw new Error('Notifications not supported');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const permission = await Notification.requestPermission();
|
|
28
|
+
return permission;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Send native push notification
|
|
32
|
+
async function sendNotification(
|
|
33
|
+
title: string,
|
|
34
|
+
options: NotificationOptions = {},
|
|
35
|
+
isTesting: boolean = false
|
|
36
|
+
): Promise<void> {
|
|
37
|
+
// Check if push notifications are enabled in settings
|
|
38
|
+
if (!isTesting && !settings.pushNotifications) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Check browser support
|
|
43
|
+
if (!isSupported()) {
|
|
44
|
+
debug.warn('notification', 'Native notifications not supported');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Check permission
|
|
49
|
+
const permission = getPermissionStatus();
|
|
50
|
+
if (permission !== 'granted') {
|
|
51
|
+
debug.warn('notification', 'Notification permission not granted:', permission);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
try {
|
|
56
|
+
const notification = new Notification(title, {
|
|
57
|
+
icon: '/favicon.ico',
|
|
58
|
+
badge: '/favicon.ico',
|
|
59
|
+
...options
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Auto-close notification after 5 seconds
|
|
63
|
+
setTimeout(() => {
|
|
64
|
+
notification.close();
|
|
65
|
+
}, 5000);
|
|
66
|
+
|
|
67
|
+
} catch (error) {
|
|
68
|
+
debug.warn('notification', 'Failed to send notification:', error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Public API
|
|
73
|
+
export const pushNotification = {
|
|
74
|
+
/**
|
|
75
|
+
* Check if notifications are supported
|
|
76
|
+
*/
|
|
77
|
+
isSupported,
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Get current permission status
|
|
81
|
+
*/
|
|
82
|
+
getPermissionStatus,
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Request notification permission from user
|
|
86
|
+
*/
|
|
87
|
+
requestPermission,
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Send notification for chat response completion
|
|
91
|
+
*/
|
|
92
|
+
async sendChatComplete(message?: string): Promise<void> {
|
|
93
|
+
await sendNotification('Claude Response Complete', {
|
|
94
|
+
body: message || 'Your chat response is ready',
|
|
95
|
+
tag: 'chat-complete'
|
|
96
|
+
});
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Send notification for chat error
|
|
101
|
+
*/
|
|
102
|
+
async sendChatError(error?: string): Promise<void> {
|
|
103
|
+
await sendNotification('Claude Response Error', {
|
|
104
|
+
body: error || 'There was an error with your chat response',
|
|
105
|
+
tag: 'chat-error'
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Test notification (for settings)
|
|
111
|
+
*/
|
|
112
|
+
async testNotification(): Promise<boolean> {
|
|
113
|
+
try {
|
|
114
|
+
await sendNotification('Test Notification', {
|
|
115
|
+
body: 'Push notifications are working correctly',
|
|
116
|
+
tag: 'test'
|
|
117
|
+
}, true);
|
|
118
|
+
return true;
|
|
119
|
+
} catch (error) {
|
|
120
|
+
debug.error('notification', 'Test notification failed:', error);
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Initialize and request permissions if needed
|
|
127
|
+
*/
|
|
128
|
+
async initialize(): Promise<boolean> {
|
|
129
|
+
if (!isSupported()) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const currentPermission = getPermissionStatus();
|
|
134
|
+
|
|
135
|
+
if (currentPermission === 'default') {
|
|
136
|
+
const permission = await requestPermission();
|
|
137
|
+
return permission === 'granted';
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return currentPermission === 'granted';
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
export default pushNotification;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sound Notification Service
|
|
3
|
+
*
|
|
4
|
+
* Handles single audio notification for chat responses using local notification.ogg file
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { settings } from '$frontend/lib/stores/features/settings.svelte';
|
|
8
|
+
|
|
9
|
+
import { debug } from '$shared/utils/logger';
|
|
10
|
+
// Cache for audio element
|
|
11
|
+
let audioElement: HTMLAudioElement | null = null;
|
|
12
|
+
|
|
13
|
+
// Local notification sound file path
|
|
14
|
+
const NOTIFICATION_SOUND_URL = '/audio/notification.ogg';
|
|
15
|
+
|
|
16
|
+
// Initialize audio element
|
|
17
|
+
function initAudioElement(): HTMLAudioElement {
|
|
18
|
+
if (!audioElement) {
|
|
19
|
+
audioElement = new Audio();
|
|
20
|
+
audioElement.preload = 'auto';
|
|
21
|
+
audioElement.volume = 1;
|
|
22
|
+
|
|
23
|
+
// Set the notification sound URL
|
|
24
|
+
audioElement.src = NOTIFICATION_SOUND_URL;
|
|
25
|
+
|
|
26
|
+
// Load the audio to check if it works
|
|
27
|
+
audioElement.load();
|
|
28
|
+
|
|
29
|
+
// Handle loading errors
|
|
30
|
+
audioElement.onerror = (error) => {
|
|
31
|
+
debug.warn('notification', 'Failed to load notification sound from:', NOTIFICATION_SOUND_URL, error);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// Log when audio is ready
|
|
35
|
+
audioElement.oncanplaythrough = () => {
|
|
36
|
+
debug.log('notification', 'Notification sound loaded successfully');
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return audioElement;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Play notification sound
|
|
43
|
+
function playNotificationSound(isTesting: boolean = false): Promise<void> {
|
|
44
|
+
return new Promise((resolve) => {
|
|
45
|
+
try {
|
|
46
|
+
// Check if sound notifications are enabled
|
|
47
|
+
if (!isTesting && !settings.soundNotifications) {
|
|
48
|
+
resolve();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Check if browser supports HTML5 Audio
|
|
53
|
+
if (typeof window === 'undefined' || !window.Audio) {
|
|
54
|
+
resolve(); // Silently fail on unsupported browsers
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const audio = initAudioElement();
|
|
59
|
+
|
|
60
|
+
// Reset audio to beginning
|
|
61
|
+
audio.currentTime = 0;
|
|
62
|
+
|
|
63
|
+
// Play audio
|
|
64
|
+
const playPromise = audio.play();
|
|
65
|
+
|
|
66
|
+
if (playPromise !== undefined) {
|
|
67
|
+
playPromise
|
|
68
|
+
.then(() => {
|
|
69
|
+
// Audio played successfully
|
|
70
|
+
audio.onended = () => resolve();
|
|
71
|
+
})
|
|
72
|
+
.catch((error) => {
|
|
73
|
+
debug.warn('notification', 'Failed to play notification sound:', error);
|
|
74
|
+
resolve(); // Don't reject, just silently fail
|
|
75
|
+
});
|
|
76
|
+
} else {
|
|
77
|
+
// Older browser support
|
|
78
|
+
audio.onended = () => resolve();
|
|
79
|
+
setTimeout(() => resolve(), 1000); // Fallback timeout
|
|
80
|
+
}
|
|
81
|
+
} catch (error) {
|
|
82
|
+
debug.warn('notification', 'Failed to play notification sound:', error);
|
|
83
|
+
resolve(); // Don't reject, just silently fail
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Public API
|
|
89
|
+
export const soundNotification = {
|
|
90
|
+
/**
|
|
91
|
+
* Play notification sound (single sound for all notifications)
|
|
92
|
+
*/
|
|
93
|
+
play(): Promise<void> {
|
|
94
|
+
return playNotificationSound();
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Test sound notification (for settings)
|
|
99
|
+
*/
|
|
100
|
+
async testSound(): Promise<boolean> {
|
|
101
|
+
try {
|
|
102
|
+
await playNotificationSound(true);
|
|
103
|
+
return true;
|
|
104
|
+
} catch (error) {
|
|
105
|
+
debug.error('notification', 'Sound test failed:', error);
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Check if sound notifications are supported
|
|
112
|
+
*/
|
|
113
|
+
isSupported(): boolean {
|
|
114
|
+
return typeof window !== 'undefined' && !!window.Audio;
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Initialize audio element (call on user interaction)
|
|
119
|
+
*/
|
|
120
|
+
initialize(): void {
|
|
121
|
+
if (this.isSupported()) {
|
|
122
|
+
initAudioElement();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
export default soundNotification;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { debug } from '$shared/utils/logger';
|
|
2
|
+
import ws from '$frontend/lib/utils/ws';
|
|
3
|
+
|
|
4
|
+
export interface ConsoleMessage {
|
|
5
|
+
id: string;
|
|
6
|
+
type: 'log' | 'info' | 'warn' | 'error' | 'debug' | 'trace' | 'clear';
|
|
7
|
+
text: string;
|
|
8
|
+
args?: unknown[];
|
|
9
|
+
location?: {
|
|
10
|
+
url: string;
|
|
11
|
+
lineNumber: number;
|
|
12
|
+
columnNumber: number;
|
|
13
|
+
};
|
|
14
|
+
stackTrace?: string;
|
|
15
|
+
timestamp: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export class BrowserConsoleService {
|
|
19
|
+
async getConsoleLogs(sessionId: string): Promise<ConsoleMessage[]> {
|
|
20
|
+
try {
|
|
21
|
+
const result = await ws.http('preview:browser-console-get', {}, 5000);
|
|
22
|
+
return result.logs || [];
|
|
23
|
+
} catch (error) {
|
|
24
|
+
debug.error('preview', 'Error getting console logs:', error);
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async clearConsoleLogs(sessionId: string): Promise<void> {
|
|
30
|
+
try {
|
|
31
|
+
await ws.http('preview:browser-console-clear', {}, 5000);
|
|
32
|
+
} catch (error) {
|
|
33
|
+
debug.error('preview', 'Error clearing console logs:', error);
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async executeConsoleCommand(sessionId: string, command: string): Promise<any> {
|
|
39
|
+
try {
|
|
40
|
+
// Backend uses active tab automatically
|
|
41
|
+
const result = await ws.http('preview:browser-console-execute', { command }, 10000);
|
|
42
|
+
return result.result;
|
|
43
|
+
} catch (error) {
|
|
44
|
+
debug.error('preview', 'Error executing console command:', error);
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async toggleConsoleLogging(sessionId: string, enabled: boolean): Promise<void> {
|
|
50
|
+
try {
|
|
51
|
+
// Backend uses active tab automatically
|
|
52
|
+
await ws.http('preview:browser-console-toggle', { enabled }, 5000);
|
|
53
|
+
} catch (error) {
|
|
54
|
+
debug.error('preview', 'Error toggling console logging:', error);
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Singleton instance
|
|
61
|
+
export const browserConsoleService = new BrowserConsoleService();
|