@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,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Virtual Scroll for Chat Messages
|
|
3
|
+
*
|
|
4
|
+
* Manages a sliding window over the full message list,
|
|
5
|
+
* only rendering a subset to the DOM for performance.
|
|
6
|
+
* No placeholder divs — uses scroll position preservation instead.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { debug } from '$shared/utils/logger';
|
|
10
|
+
|
|
11
|
+
export const VS_CONFIG = {
|
|
12
|
+
/** Max messages rendered at once */
|
|
13
|
+
WINDOW_SIZE: 50,
|
|
14
|
+
/** Messages to load when hitting a sentinel */
|
|
15
|
+
BUFFER_SIZE: 20,
|
|
16
|
+
/** Trim when window exceeds this count */
|
|
17
|
+
TRIM_THRESHOLD: 80,
|
|
18
|
+
} as const;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Creates a virtual scroll state manager for chat messages.
|
|
22
|
+
* Only manages window bounds — the component handles DOM/observers.
|
|
23
|
+
*/
|
|
24
|
+
export function createVirtualScroll() {
|
|
25
|
+
const { WINDOW_SIZE, BUFFER_SIZE, TRIM_THRESHOLD } = VS_CONFIG;
|
|
26
|
+
|
|
27
|
+
let windowStart = $state(0);
|
|
28
|
+
let windowEnd = $state(0);
|
|
29
|
+
let totalCount = $state(0);
|
|
30
|
+
let isActive = $state(false);
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Initialize/reset window for a given count, anchored to bottom.
|
|
34
|
+
*/
|
|
35
|
+
function reset(count: number) {
|
|
36
|
+
totalCount = count;
|
|
37
|
+
if (count <= WINDOW_SIZE) {
|
|
38
|
+
windowStart = 0;
|
|
39
|
+
windowEnd = count;
|
|
40
|
+
isActive = false;
|
|
41
|
+
} else {
|
|
42
|
+
windowStart = count - WINDOW_SIZE;
|
|
43
|
+
windowEnd = count;
|
|
44
|
+
isActive = true;
|
|
45
|
+
}
|
|
46
|
+
debug.log('chat', `[VirtualScroll] Reset: ${windowStart}..${windowEnd} of ${count}, active=${isActive}`);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Sync with new total (messages added during streaming).
|
|
51
|
+
* Keeps window anchored to bottom when appropriate.
|
|
52
|
+
*/
|
|
53
|
+
function sync(newTotal: number, isAtBottom: boolean, isStreaming: boolean) {
|
|
54
|
+
totalCount = newTotal;
|
|
55
|
+
|
|
56
|
+
if (newTotal <= WINDOW_SIZE) {
|
|
57
|
+
windowStart = 0;
|
|
58
|
+
windowEnd = newTotal;
|
|
59
|
+
isActive = false;
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
isActive = true;
|
|
64
|
+
|
|
65
|
+
// Extend window end to include new messages when at bottom or streaming
|
|
66
|
+
if (isAtBottom || isStreaming) {
|
|
67
|
+
windowEnd = newTotal;
|
|
68
|
+
// Auto-trim top if window grew too large and user is at bottom
|
|
69
|
+
if (windowEnd - windowStart > TRIM_THRESHOLD && isAtBottom) {
|
|
70
|
+
windowStart = windowEnd - WINDOW_SIZE;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Expand window upward (older messages). Returns count added.
|
|
77
|
+
*/
|
|
78
|
+
function expandUp(): number {
|
|
79
|
+
if (windowStart <= 0) return 0;
|
|
80
|
+
const count = Math.min(BUFFER_SIZE, windowStart);
|
|
81
|
+
windowStart -= count;
|
|
82
|
+
debug.log('chat', `[VirtualScroll] Expand up +${count}: ${windowStart}..${windowEnd}`);
|
|
83
|
+
return count;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Expand window downward (newer messages). Returns count added.
|
|
88
|
+
*/
|
|
89
|
+
function expandDown(): number {
|
|
90
|
+
if (windowEnd >= totalCount) return 0;
|
|
91
|
+
const count = Math.min(BUFFER_SIZE, totalCount - windowEnd);
|
|
92
|
+
windowEnd += count;
|
|
93
|
+
debug.log('chat', `[VirtualScroll] Expand down +${count}: ${windowStart}..${windowEnd}`);
|
|
94
|
+
return count;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Trim excess messages from top of window. */
|
|
98
|
+
function trimTop() {
|
|
99
|
+
if (windowEnd - windowStart <= WINDOW_SIZE) return;
|
|
100
|
+
windowStart = windowEnd - WINDOW_SIZE;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Trim excess messages from bottom of window. */
|
|
104
|
+
function trimBottom() {
|
|
105
|
+
if (windowEnd - windowStart <= WINDOW_SIZE) return;
|
|
106
|
+
windowEnd = windowStart + WINDOW_SIZE;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Ensure a specific index is visible in the window.
|
|
111
|
+
* Used for edit mode / scroll-to-message.
|
|
112
|
+
*/
|
|
113
|
+
function ensureVisible(index: number) {
|
|
114
|
+
if (index >= windowStart && index < windowEnd) return;
|
|
115
|
+
|
|
116
|
+
if (index < windowStart) {
|
|
117
|
+
windowStart = Math.max(0, index - 5);
|
|
118
|
+
windowEnd = Math.min(totalCount, windowStart + WINDOW_SIZE);
|
|
119
|
+
} else {
|
|
120
|
+
windowEnd = Math.min(totalCount, index + 6);
|
|
121
|
+
windowStart = Math.max(0, windowEnd - WINDOW_SIZE);
|
|
122
|
+
}
|
|
123
|
+
isActive = totalCount > WINDOW_SIZE;
|
|
124
|
+
debug.log('chat', `[VirtualScroll] Ensure visible ${index}: ${windowStart}..${windowEnd}`);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
get windowStart() { return windowStart; },
|
|
129
|
+
get windowEnd() { return windowEnd; },
|
|
130
|
+
get totalCount() { return totalCount; },
|
|
131
|
+
get isActive() { return isActive; },
|
|
132
|
+
get hasMoreAbove() { return windowStart > 0; },
|
|
133
|
+
get hasMoreBelow() { return windowEnd < totalCount; },
|
|
134
|
+
reset,
|
|
135
|
+
sync,
|
|
136
|
+
expandUp,
|
|
137
|
+
expandDown,
|
|
138
|
+
trimTop,
|
|
139
|
+
trimBottom,
|
|
140
|
+
ensureVisible,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Click Outside Action
|
|
3
|
+
* Svelte action for detecting clicks outside an element
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export function clickOutside(node: HTMLElement, callback: () => void) {
|
|
7
|
+
const handleClick = (event: MouseEvent) => {
|
|
8
|
+
if (!node.contains(event.target as Node)) {
|
|
9
|
+
callback();
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
document.addEventListener('click', handleClick, true);
|
|
14
|
+
|
|
15
|
+
return {
|
|
16
|
+
destroy() {
|
|
17
|
+
document.removeEventListener('click', handleClick, true);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Window Management (Simplified)
|
|
3
|
+
*
|
|
4
|
+
* NOTE: Claude SDK now handles context management internally with efficient resume.
|
|
5
|
+
* This module is simplified to provide token counting utilities only.
|
|
6
|
+
* The SDK's native context management with compact boundaries is more efficient.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { SDKMessage } from '$shared/types/messaging';
|
|
10
|
+
|
|
11
|
+
// Configuration (for display purposes only - SDK handles actual limits)
|
|
12
|
+
const DISPLAY_MAX_TOKENS = 200000; // Display token limit
|
|
13
|
+
const WARNING_THRESHOLD = 0.8; // Warn when reaching 80% of max tokens
|
|
14
|
+
const TOKEN_ESTIMATE_RATIO = 3.5; // Estimate: 1 token ≈ 3.5 characters
|
|
15
|
+
|
|
16
|
+
export interface ManagedContext {
|
|
17
|
+
messages: SDKMessage[];
|
|
18
|
+
summary?: string;
|
|
19
|
+
totalTokens: number;
|
|
20
|
+
isCompressed: boolean;
|
|
21
|
+
tokenUsage: {
|
|
22
|
+
current: number;
|
|
23
|
+
max: number;
|
|
24
|
+
percentage: number;
|
|
25
|
+
nearLimit: boolean;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Estimate token count for a text string
|
|
31
|
+
* Uses a more sophisticated estimation that accounts for different text patterns
|
|
32
|
+
*/
|
|
33
|
+
export function estimateTokens(text: string): number {
|
|
34
|
+
if (!text || text.length === 0) return 0;
|
|
35
|
+
|
|
36
|
+
// More accurate estimation accounting for:
|
|
37
|
+
// - Whitespace and punctuation
|
|
38
|
+
// - Code blocks (different tokenization)
|
|
39
|
+
// - Common patterns
|
|
40
|
+
|
|
41
|
+
let adjustedLength = text.length;
|
|
42
|
+
|
|
43
|
+
// Code blocks tend to have more tokens per character
|
|
44
|
+
const codeBlockMatches = text.match(/```[\s\S]*?```/g);
|
|
45
|
+
if (codeBlockMatches) {
|
|
46
|
+
const codeLength = codeBlockMatches.reduce((sum, block) => sum + block.length, 0);
|
|
47
|
+
// Code has ~1 token per 2.5 characters
|
|
48
|
+
adjustedLength = adjustedLength - codeLength + (codeLength / 2.5);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Account for whitespace - multiple spaces/newlines count as fewer tokens
|
|
52
|
+
const whitespaceReduced = text.replace(/\s+/g, ' ').length;
|
|
53
|
+
adjustedLength = Math.min(adjustedLength, whitespaceReduced * 1.2);
|
|
54
|
+
|
|
55
|
+
// Apply base ratio with minimum of 1 token for non-empty text
|
|
56
|
+
return Math.max(1, Math.ceil(adjustedLength / TOKEN_ESTIMATE_RATIO));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Token calculation cache to prevent recalculation
|
|
60
|
+
const tokenCache = new Map<string, number>();
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Calculate total tokens for a set of messages using only actual token usage data
|
|
64
|
+
* Returns 0 if no actual usage data is available (no estimates)
|
|
65
|
+
*/
|
|
66
|
+
export function calculateMessageTokens(messages: SDKMessage[]): number {
|
|
67
|
+
if (!messages || messages.length === 0) return 0;
|
|
68
|
+
|
|
69
|
+
// Only use actual token usage data from API responses
|
|
70
|
+
const messagesWithUsage = messages.filter(msg => {
|
|
71
|
+
if (msg.type === 'assistant' && 'message' in msg && msg.message.usage) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
if (messagesWithUsage.length === 0) {
|
|
78
|
+
// No actual usage data available - return 0 instead of estimates
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Calculate actual total tokens from API responses
|
|
83
|
+
return messagesWithUsage.reduce((total, msg) => {
|
|
84
|
+
if (msg.type === 'assistant' && 'message' in msg && msg.message.usage) {
|
|
85
|
+
const usage = msg.message.usage;
|
|
86
|
+
return total + (usage.input_tokens || 0) + (usage.output_tokens || 0);
|
|
87
|
+
}
|
|
88
|
+
return total;
|
|
89
|
+
}, 0);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Create a summary of older messages
|
|
94
|
+
*/
|
|
95
|
+
export function summarizeMessages(messages: SDKMessage[]): string {
|
|
96
|
+
if (messages.length === 0) return '';
|
|
97
|
+
|
|
98
|
+
// Group messages by role for better summarization
|
|
99
|
+
const userMessages: string[] = [];
|
|
100
|
+
const assistantMessages: string[] = [];
|
|
101
|
+
|
|
102
|
+
messages.forEach(msg => {
|
|
103
|
+
if (msg.type === 'user' && 'message' in msg) {
|
|
104
|
+
// Extract key points from user messages
|
|
105
|
+
const content = typeof msg.message.content === 'string' ? msg.message.content : JSON.stringify(msg.message.content);
|
|
106
|
+
const keyPoints = extractKeyPoints(content);
|
|
107
|
+
if (keyPoints) userMessages.push(keyPoints);
|
|
108
|
+
} else if (msg.type === 'assistant' && 'message' in msg) {
|
|
109
|
+
// Extract key actions/responses from assistant
|
|
110
|
+
const content = Array.isArray(msg.message.content)
|
|
111
|
+
? msg.message.content.map(c => c.type === 'text' ? c.text : JSON.stringify(c)).join(' ')
|
|
112
|
+
: JSON.stringify(msg.message.content);
|
|
113
|
+
const keyActions = extractKeyActions(content);
|
|
114
|
+
if (keyActions) assistantMessages.push(keyActions);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// Build summary
|
|
119
|
+
const summaryParts: string[] = [];
|
|
120
|
+
|
|
121
|
+
if (userMessages.length > 0) {
|
|
122
|
+
summaryParts.push(`Previous user requests: ${userMessages.join('; ')}`);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (assistantMessages.length > 0) {
|
|
126
|
+
summaryParts.push(`Previous assistant actions: ${assistantMessages.join('; ')}`);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return summaryParts.join('\n');
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Extract key points from user messages
|
|
134
|
+
*/
|
|
135
|
+
function extractKeyPoints(content: string): string {
|
|
136
|
+
// Handle both string and ContentBlock array formats
|
|
137
|
+
const textContent = content;
|
|
138
|
+
|
|
139
|
+
// Look for questions, commands, or important keywords
|
|
140
|
+
const lines = textContent.split('\n').filter(line => line.trim());
|
|
141
|
+
|
|
142
|
+
// Prioritize lines with questions or commands
|
|
143
|
+
const importantLines = lines.filter(line =>
|
|
144
|
+
line.includes('?') ||
|
|
145
|
+
line.includes('please') ||
|
|
146
|
+
line.includes('help') ||
|
|
147
|
+
line.includes('create') ||
|
|
148
|
+
line.includes('update') ||
|
|
149
|
+
line.includes('fix') ||
|
|
150
|
+
line.includes('implement') ||
|
|
151
|
+
line.includes('add') ||
|
|
152
|
+
line.includes('remove') ||
|
|
153
|
+
line.includes('show') ||
|
|
154
|
+
line.includes('explain')
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
if (importantLines.length > 0) {
|
|
158
|
+
// Take first important line as summary
|
|
159
|
+
return importantLines[0].substring(0, 100);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Fallback to first line
|
|
163
|
+
return lines[0]?.substring(0, 100) || '';
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Extract key actions from assistant messages
|
|
168
|
+
*/
|
|
169
|
+
function extractKeyActions(content: string): string {
|
|
170
|
+
// Look for action indicators
|
|
171
|
+
const actionPatterns = [
|
|
172
|
+
/created (.+)/i,
|
|
173
|
+
/updated (.+)/i,
|
|
174
|
+
/implemented (.+)/i,
|
|
175
|
+
/fixed (.+)/i,
|
|
176
|
+
/added (.+)/i,
|
|
177
|
+
/removed (.+)/i,
|
|
178
|
+
/modified (.+)/i,
|
|
179
|
+
/explained (.+)/i,
|
|
180
|
+
/I will (.+)/i,
|
|
181
|
+
/I have (.+)/i,
|
|
182
|
+
/I've (.+)/i
|
|
183
|
+
];
|
|
184
|
+
|
|
185
|
+
for (const pattern of actionPatterns) {
|
|
186
|
+
const match = content.match(pattern);
|
|
187
|
+
if (match) {
|
|
188
|
+
return match[0].substring(0, 100);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Look for code blocks as actions
|
|
193
|
+
if (content.includes('```')) {
|
|
194
|
+
return 'provided code implementation';
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Fallback to first line
|
|
198
|
+
const firstLine = content.split('\n')[0];
|
|
199
|
+
return firstLine?.substring(0, 100) || '';
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Calculate token usage statistics with smoothing
|
|
204
|
+
*/
|
|
205
|
+
function calculateTokenUsage(currentTokens: number): ManagedContext['tokenUsage'] {
|
|
206
|
+
// Ensure non-negative values
|
|
207
|
+
const safeTokens = Math.max(0, currentTokens);
|
|
208
|
+
const percentage = Math.min(100, (safeTokens / DISPLAY_MAX_TOKENS) * 100);
|
|
209
|
+
|
|
210
|
+
return {
|
|
211
|
+
current: safeTokens,
|
|
212
|
+
max: DISPLAY_MAX_TOKENS,
|
|
213
|
+
percentage: Math.round(percentage * 10) / 10, // Round to 1 decimal place for smoother transitions
|
|
214
|
+
nearLimit: safeTokens >= (DISPLAY_MAX_TOKENS * WARNING_THRESHOLD)
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Get conversation context info (SDK handles actual context management)
|
|
220
|
+
* @deprecated Use SDK's native context management with resume feature
|
|
221
|
+
*/
|
|
222
|
+
export function manageConversationContext(messages: SDKMessage[]): ManagedContext {
|
|
223
|
+
if (messages.length === 0) {
|
|
224
|
+
return {
|
|
225
|
+
messages: [],
|
|
226
|
+
totalTokens: 0,
|
|
227
|
+
isCompressed: false,
|
|
228
|
+
tokenUsage: calculateTokenUsage(0)
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Calculate total tokens for display purposes
|
|
233
|
+
const totalTokens = calculateMessageTokens(messages);
|
|
234
|
+
|
|
235
|
+
// SDK handles context internally, we just return info for UI
|
|
236
|
+
return {
|
|
237
|
+
messages,
|
|
238
|
+
summary: undefined,
|
|
239
|
+
totalTokens,
|
|
240
|
+
isCompressed: false,
|
|
241
|
+
tokenUsage: calculateTokenUsage(totalTokens)
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Build conversation prompt
|
|
247
|
+
* @deprecated SDK handles prompt building internally with resume feature
|
|
248
|
+
*/
|
|
249
|
+
export function buildConversationPrompt(
|
|
250
|
+
messages: SDKMessage[],
|
|
251
|
+
currentPrompt: string,
|
|
252
|
+
summary?: string
|
|
253
|
+
): string {
|
|
254
|
+
// SDK handles this internally now, just return the prompt
|
|
255
|
+
// This function is kept for backward compatibility
|
|
256
|
+
return currentPrompt;
|
|
257
|
+
}
|