@myrialabs/clopen 0.2.1 → 0.2.3

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.
Files changed (422) hide show
  1. package/.dockerignore +5 -0
  2. package/.env.example +2 -5
  3. package/CONTRIBUTING.md +4 -0
  4. package/README.md +4 -2
  5. package/backend/{lib/auth → auth}/auth-service.ts +2 -2
  6. package/backend/{lib/chat → chat}/stream-manager.ts +1 -1
  7. package/backend/{lib/database → database}/queries/message-queries.ts +42 -0
  8. package/backend/{lib/database → database}/utils/connection.ts +5 -5
  9. package/backend/{lib/engine → engine}/adapters/claude/environment.ts +3 -4
  10. package/backend/{lib/engine → engine}/adapters/opencode/message-converter.ts +1 -1
  11. package/backend/{lib/engine → engine}/adapters/opencode/server.ts +7 -1
  12. package/backend/{lib/files → files}/file-watcher.ts +1 -1
  13. package/backend/{lib/git → git}/git-executor.ts +3 -2
  14. package/backend/index.ts +16 -16
  15. package/backend/{lib/mcp → mcp}/README.md +68 -79
  16. package/backend/{lib/mcp → mcp}/config.ts +1 -1
  17. package/backend/{lib/mcp → mcp}/servers/browser-automation/actions.ts +4 -4
  18. package/backend/{lib/mcp → mcp}/servers/browser-automation/browser.ts +3 -3
  19. package/backend/{lib/mcp → mcp}/servers/browser-automation/inspection.ts +3 -3
  20. package/backend/middleware/cors.ts +1 -1
  21. package/backend/middleware/error-handler.ts +1 -1
  22. package/backend/{lib/preview → preview}/browser/browser-preview-service.ts +1 -1
  23. package/backend/{lib/preview → preview}/browser/browser-tab-manager.ts +1 -1
  24. package/backend/{lib/preview → preview}/browser/types.ts +1 -1
  25. package/backend/{lib/project → project}/status-manager.ts +223 -223
  26. package/backend/{lib/snapshot → snapshot}/blob-store.ts +2 -2
  27. package/backend/{lib/terminal → terminal}/shell-utils.ts +1 -1
  28. package/backend/{lib/shared → utils}/env.ts +13 -15
  29. package/backend/{lib/shared → utils}/index.ts +4 -1
  30. package/backend/utils/paths.ts +11 -0
  31. package/backend/{lib/shared → utils}/port-utils.ts +19 -6
  32. package/backend/{lib/utils → utils}/ws.ts +2 -2
  33. package/backend/ws/README.md +9 -9
  34. package/backend/ws/auth/invites.ts +2 -2
  35. package/backend/ws/auth/login.ts +9 -9
  36. package/backend/ws/auth/status.ts +2 -2
  37. package/backend/ws/auth/users.ts +1 -1
  38. package/backend/ws/chat/background.ts +2 -2
  39. package/backend/ws/chat/stream.ts +3 -3
  40. package/backend/ws/engine/claude/accounts.ts +4 -4
  41. package/backend/ws/engine/claude/status.ts +1 -1
  42. package/backend/ws/files/read.ts +2 -2
  43. package/backend/ws/files/watch.ts +2 -2
  44. package/backend/ws/files/write.ts +1 -1
  45. package/backend/ws/git/branch.ts +2 -2
  46. package/backend/ws/git/commit.ts +2 -2
  47. package/backend/ws/git/conflict.ts +2 -2
  48. package/backend/ws/git/diff.ts +2 -2
  49. package/backend/ws/git/log.ts +2 -2
  50. package/backend/ws/git/remote.ts +2 -2
  51. package/backend/ws/git/staging.ts +2 -2
  52. package/backend/ws/git/status.ts +3 -3
  53. package/backend/ws/messages/crud.ts +53 -1
  54. package/backend/ws/preview/browser/cleanup.ts +2 -2
  55. package/backend/ws/preview/browser/console.ts +2 -2
  56. package/backend/ws/preview/browser/interact.ts +2 -2
  57. package/backend/ws/preview/browser/mcp.ts +1 -1
  58. package/backend/ws/preview/browser/native-ui.ts +2 -2
  59. package/backend/ws/preview/browser/stats.ts +2 -2
  60. package/backend/ws/preview/browser/tab-info.ts +2 -2
  61. package/backend/ws/preview/browser/tab.ts +2 -2
  62. package/backend/ws/preview/browser/webcodecs.ts +2 -2
  63. package/backend/ws/projects/crud.ts +3 -3
  64. package/backend/ws/projects/presence.ts +3 -3
  65. package/backend/ws/projects/status.ts +3 -3
  66. package/backend/ws/sessions/crud.ts +2 -2
  67. package/backend/ws/settings/crud.ts +2 -2
  68. package/backend/ws/snapshot/restore.ts +5 -5
  69. package/backend/ws/snapshot/timeline.ts +3 -3
  70. package/backend/ws/system/operations.ts +1 -1
  71. package/backend/ws/terminal/persistence.ts +3 -3
  72. package/backend/ws/terminal/session.ts +6 -6
  73. package/backend/ws/terminal/stream.ts +2 -2
  74. package/backend/ws/tunnel/operations.ts +1 -1
  75. package/backend/ws/user/crud.ts +4 -4
  76. package/bin/clopen.ts +15 -15
  77. package/docker-compose.yml +31 -0
  78. package/frontend/App.svelte +13 -13
  79. package/frontend/{lib/components → components}/auth/InvitePage.svelte +2 -2
  80. package/frontend/{lib/components → components}/auth/LoginPage.svelte +1 -1
  81. package/frontend/{lib/components → components}/auth/SetupPage.svelte +49 -17
  82. package/frontend/{lib/components → components}/chat/ChatInterface.svelte +14 -14
  83. package/frontend/{lib/components → components}/chat/formatters/ErrorMessage.svelte +1 -1
  84. package/frontend/{lib/components → components}/chat/formatters/MessageFormatter.svelte +4 -4
  85. package/frontend/{lib/components → components}/chat/formatters/TextMessage.svelte +1 -1
  86. package/frontend/{lib/components → components}/chat/formatters/Tools.svelte +1 -1
  87. package/frontend/{lib/components → components}/chat/input/ChatInput.svelte +12 -12
  88. package/frontend/{lib/components → components}/chat/input/components/ChatInputActions.svelte +1 -1
  89. package/frontend/{lib/components → components}/chat/input/components/EditModeIndicator.svelte +2 -2
  90. package/frontend/{lib/components → components}/chat/input/components/EngineModelPicker.svelte +9 -9
  91. package/frontend/{lib/components → components}/chat/input/components/FileAttachmentPreview.svelte +1 -1
  92. package/frontend/{lib/components → components}/chat/input/components/LoadingIndicator.svelte +2 -2
  93. package/frontend/{lib/components → components}/chat/input/composables/use-chat-actions.svelte.ts +8 -8
  94. package/frontend/{lib/components → components}/chat/input/composables/use-file-handling.svelte.ts +1 -1
  95. package/frontend/{lib/components → components}/chat/input/composables/use-input-state.svelte.ts +6 -6
  96. package/frontend/{lib/components → components}/chat/message/ChatMessage.svelte +8 -8
  97. package/frontend/{lib/components → components}/chat/message/ChatMessages.svelte +7 -7
  98. package/frontend/{lib/components → components}/chat/message/MessageBubble.svelte +1 -1
  99. package/frontend/{lib/components → components}/chat/message/MessageHeader.svelte +2 -2
  100. package/frontend/{lib/components → components}/chat/modal/DebugModal.svelte +2 -2
  101. package/frontend/{lib/components → components}/chat/modal/TokenUsageModal.svelte +2 -2
  102. package/frontend/{lib/components → components}/chat/tools/AskUserQuestionTool.svelte +4 -4
  103. package/frontend/{lib/components → components}/chat/tools/CustomMcpTool.svelte +1 -1
  104. package/frontend/{lib/components → components}/chat/tools/EditTool.svelte +1 -1
  105. package/frontend/{lib/components → components}/chat/tools/TodoWriteTool.svelte +1 -1
  106. package/frontend/{lib/components → components}/chat/tools/components/CodeBlock.svelte +2 -2
  107. package/frontend/{lib/components → components}/chat/tools/components/DiffBlock.svelte +1 -1
  108. package/frontend/{lib/components → components}/chat/tools/components/FileHeader.svelte +2 -2
  109. package/frontend/{lib/components → components}/chat/tools/components/InfoLine.svelte +1 -1
  110. package/frontend/{lib/components → components}/chat/widgets/FloatingTodoList.svelte +127 -13
  111. package/frontend/{lib/components → components}/chat/widgets/TokenUsage.svelte +4 -4
  112. package/frontend/{lib/components → components}/checkpoint/TimelineModal.svelte +10 -10
  113. package/frontend/{lib/components → components}/checkpoint/timeline/TimelineNode.svelte +1 -1
  114. package/frontend/{lib/components/common → components/common/display}/Icon.svelte +2 -2
  115. package/frontend/{lib/components/common → components/common/display}/PageTemplate.svelte +1 -1
  116. package/frontend/{lib/components/common → components/common/display}/ProjectUserAvatars.svelte +1 -1
  117. package/frontend/{lib/components/common → components/common/display}/ThemeToggle.svelte +1 -1
  118. package/frontend/{lib/components/common → components/common/editor}/MonacoEditor.svelte +2 -2
  119. package/frontend/{lib/components/common → components/common/feedback}/Alert.svelte +1 -1
  120. package/frontend/{lib/components/common → components/common/feedback}/ConnectionBanner.svelte +3 -3
  121. package/frontend/{lib/components/common → components/common/feedback}/LoadingScreen.svelte +1 -1
  122. package/frontend/{lib/components/common → components/common/feedback}/NotificationToast.svelte +2 -2
  123. package/frontend/{lib/components/common → components/common/feedback}/UpdateBanner.svelte +5 -5
  124. package/frontend/{lib/components/common → components/common/form}/Checkbox.svelte +1 -1
  125. package/frontend/{lib/components/common → components/common/form}/FolderBrowser.svelte +6 -6
  126. package/frontend/{lib/components/common → components/common/form}/Input.svelte +1 -1
  127. package/frontend/{lib/components/common → components/common/form}/ModelSelector.svelte +3 -3
  128. package/frontend/{lib/components/common → components/common/form}/Select.svelte +1 -1
  129. package/frontend/{lib/components/common → components/common/form}/Textarea.svelte +1 -1
  130. package/frontend/{lib/components/common → components/common/overlay}/Dialog.svelte +1 -1
  131. package/frontend/{lib/components/common → components/common/overlay}/Lightbox.svelte +3 -3
  132. package/frontend/{lib/components/common → components/common/overlay}/ModalProvider.svelte +2 -2
  133. package/frontend/{lib/components → components}/common/xterm/XTerm.svelte +5 -5
  134. package/frontend/{lib/components → components}/common/xterm/xterm-service.ts +2 -2
  135. package/frontend/{lib/components → components}/files/FileNode.svelte +3 -3
  136. package/frontend/{lib/components → components}/files/FileTree.svelte +5 -5
  137. package/frontend/{lib/components → components}/files/FileViewer.svelte +7 -7
  138. package/frontend/{lib/components → components}/files/SearchResults.svelte +3 -3
  139. package/frontend/{lib/components → components}/git/BranchManager.svelte +6 -6
  140. package/frontend/{lib/components → components}/git/ChangesSection.svelte +1 -1
  141. package/frontend/{lib/components → components}/git/CommitForm.svelte +1 -1
  142. package/frontend/{lib/components → components}/git/ConflictResolver.svelte +1 -1
  143. package/frontend/{lib/components → components}/git/DiffViewer.svelte +7 -7
  144. package/frontend/{lib/components → components}/git/FileChangeItem.svelte +3 -3
  145. package/frontend/{lib/components → components}/git/GitButton.svelte +1 -1
  146. package/frontend/{lib/components → components}/git/GitLog.svelte +2 -2
  147. package/frontend/{lib/components → components}/git/GitModal.svelte +3 -3
  148. package/frontend/{lib/components → components}/history/HistoryModal.svelte +41 -89
  149. package/frontend/{lib/components → components}/history/HistoryView.svelte +57 -104
  150. package/frontend/{lib/components → components}/index.ts +9 -9
  151. package/frontend/{lib/components → components}/preview/browser/BrowserPreview.svelte +3 -3
  152. package/frontend/{lib/components → components}/preview/browser/components/Canvas.svelte +2 -2
  153. package/frontend/{lib/components → components}/preview/browser/components/ConsolePanel.svelte +1 -1
  154. package/frontend/{lib/components → components}/preview/browser/components/Container.svelte +2 -2
  155. package/frontend/{lib/components → components}/preview/browser/components/ContextMenu.svelte +1 -1
  156. package/frontend/{lib/components → components}/preview/browser/components/SelectDropdown.svelte +1 -1
  157. package/frontend/{lib/components → components}/preview/browser/components/Toolbar.svelte +2 -2
  158. package/frontend/{lib/components → components}/preview/browser/core/cleanup.svelte.ts +1 -1
  159. package/frontend/{lib/components → components}/preview/browser/core/coordinator.svelte.ts +4 -4
  160. package/frontend/{lib/components → components}/preview/browser/core/interactions.svelte.ts +3 -3
  161. package/frontend/{lib/components → components}/preview/browser/core/mcp-handlers.svelte.ts +2 -2
  162. package/frontend/{lib/components → components}/preview/browser/core/native-ui-handlers.svelte.ts +2 -2
  163. package/frontend/{lib/components → components}/preview/browser/core/tab-manager.svelte.ts +1 -1
  164. package/frontend/{lib/components → components}/preview/browser/core/tab-operations.svelte.ts +3 -3
  165. package/frontend/{lib/components → components}/settings/SettingsModal.svelte +4 -4
  166. package/frontend/{lib/components → components}/settings/SettingsView.svelte +2 -2
  167. package/frontend/{lib/components → components}/settings/admin/InviteManagement.svelte +5 -5
  168. package/frontend/{lib/components → components}/settings/admin/UserManagement.svelte +5 -5
  169. package/frontend/{lib/components → components}/settings/appearance/AppearanceSettings.svelte +5 -5
  170. package/frontend/{lib/components → components}/settings/appearance/LayoutPresetSettings.svelte +3 -3
  171. package/frontend/{lib/components → components}/settings/appearance/LayoutPreview.svelte +1 -1
  172. package/frontend/{lib/components → components}/settings/engines/AIEnginesSettings.svelte +6 -6
  173. package/frontend/{lib/components → components}/settings/general/AdvancedSettings.svelte +5 -5
  174. package/frontend/{lib/components → components}/settings/general/AuthModeSettings.svelte +5 -5
  175. package/frontend/{lib/components → components}/settings/general/DataManagementSettings.svelte +9 -9
  176. package/frontend/{lib/components → components}/settings/general/UpdateSettings.svelte +3 -3
  177. package/frontend/{lib/components → components}/settings/model/ModelSettings.svelte +2 -2
  178. package/frontend/{lib/components → components}/settings/notifications/NotificationSettings.svelte +4 -4
  179. package/frontend/{lib/components → components}/settings/user/UserSettings.svelte +5 -5
  180. package/frontend/{lib/components → components}/terminal/Terminal.svelte +9 -9
  181. package/frontend/{lib/components → components}/terminal/TerminalTabs.svelte +1 -1
  182. package/frontend/{lib/components → components}/terminal/TerminalView.svelte +5 -5
  183. package/frontend/{lib/components → components}/tunnel/TunnelActive.svelte +3 -3
  184. package/frontend/{lib/components → components}/tunnel/TunnelButton.svelte +2 -2
  185. package/frontend/{lib/components → components}/tunnel/TunnelInactive.svelte +4 -4
  186. package/frontend/{lib/components → components}/tunnel/TunnelModal.svelte +2 -2
  187. package/frontend/{lib/components → components}/workspace/DesktopNavigator.svelte +372 -372
  188. package/frontend/{lib/components → components}/workspace/MobileNavigator.svelte +380 -380
  189. package/frontend/{lib/components → components}/workspace/PanelContainer.svelte +3 -3
  190. package/frontend/{lib/components → components}/workspace/PanelHeader.svelte +10 -10
  191. package/frontend/{lib/components → components}/workspace/ViewMenu.svelte +4 -4
  192. package/frontend/{lib/components → components}/workspace/WorkspaceLayout.svelte +17 -17
  193. package/frontend/{lib/components → components}/workspace/layout/DesktopLayout.svelte +1 -1
  194. package/frontend/{lib/components → components}/workspace/layout/MobileLayout.svelte +1 -1
  195. package/frontend/{lib/components → components}/workspace/layout/split-pane/Container.svelte +1 -1
  196. package/frontend/{lib/components → components}/workspace/layout/split-pane/Handle.svelte +2 -2
  197. package/frontend/{lib/components → components}/workspace/layout/split-pane/Layout.svelte +2 -2
  198. package/frontend/{lib/components → components}/workspace/panels/ChatPanel.svelte +14 -14
  199. package/frontend/{lib/components → components}/workspace/panels/FilesPanel.svelte +51 -13
  200. package/frontend/{lib/components → components}/workspace/panels/GitPanel.svelte +55 -17
  201. package/frontend/{lib/components → components}/workspace/panels/PreviewPanel.svelte +5 -5
  202. package/frontend/{lib/components → components}/workspace/panels/TerminalPanel.svelte +6 -6
  203. package/frontend/{lib/services → services}/chat/chat.service.ts +8 -8
  204. package/frontend/{lib/services → services}/notification/global-stream-monitor.ts +117 -117
  205. package/frontend/{lib/services → services}/notification/push.service.ts +1 -1
  206. package/frontend/{lib/services → services}/notification/sound.service.ts +1 -1
  207. package/frontend/{lib/services → services}/preview/browser/browser-console.service.ts +1 -1
  208. package/frontend/{lib/services → services}/preview/browser/browser-webcodecs.service.ts +1 -1
  209. package/frontend/{lib/services → services}/preview/browser/mcp-integration.svelte.ts +2 -2
  210. package/frontend/{lib/services → services}/project/status.service.ts +160 -160
  211. package/frontend/{lib/services → services}/snapshot/snapshot.service.ts +2 -2
  212. package/frontend/{lib/services → services}/terminal/background/index.ts +1 -1
  213. package/frontend/{lib/services → services}/terminal/background/session-restore.ts +1 -1
  214. package/frontend/{lib/services → services}/terminal/background/stream-manager.ts +1 -1
  215. package/frontend/{lib/services → services}/terminal/project.service.ts +2 -2
  216. package/frontend/{lib/services → services}/terminal/terminal.service.ts +2 -2
  217. package/frontend/{lib/stores → stores}/core/app.svelte.ts +1 -1
  218. package/frontend/{lib/stores → stores}/core/presence.svelte.ts +4 -4
  219. package/frontend/{lib/stores → stores}/core/projects.svelte.ts +5 -5
  220. package/frontend/{lib/stores → stores}/core/sessions.svelte.ts +3 -3
  221. package/frontend/{lib/stores → stores}/features/auth.svelte.ts +30 -2
  222. package/frontend/{lib/stores → stores}/features/claude-accounts.svelte.ts +1 -1
  223. package/frontend/{lib/stores → stores}/features/models.svelte.ts +1 -1
  224. package/frontend/{lib/stores → stores}/features/settings.svelte.ts +2 -2
  225. package/frontend/{lib/stores → stores}/features/terminal.svelte.ts +4 -4
  226. package/frontend/{lib/stores → stores}/features/tunnel.svelte.ts +1 -1
  227. package/frontend/{lib/stores → stores}/features/user.svelte.ts +1 -1
  228. package/frontend/{lib/stores → stores}/ui/edit-mode.svelte.ts +3 -3
  229. package/frontend/{lib/stores → stores}/ui/update.svelte.ts +8 -2
  230. package/frontend/{lib/utils → utils}/theme.ts +1 -1
  231. package/frontend/{lib/utils → utils}/ws.ts +1 -1
  232. package/package.json +2 -2
  233. package/scripts/dev.ts +4 -3
  234. package/scripts/generate-icons.ts +2 -2
  235. package/scripts/start.ts +24 -0
  236. package/shared/types/ui/icons.ts +4 -4
  237. package/shared/utils/anonymous-user.ts +1 -1
  238. package/shared/utils/ws-server.ts +3 -3
  239. package/vite.config.ts +2 -2
  240. /package/backend/{lib/auth → auth}/index.ts +0 -0
  241. /package/backend/{lib/auth → auth}/permissions.ts +0 -0
  242. /package/backend/{lib/auth → auth}/rate-limiter.ts +0 -0
  243. /package/backend/{lib/auth → auth}/tokens.ts +0 -0
  244. /package/backend/{lib/chat → chat}/helpers.ts +0 -0
  245. /package/backend/{lib/chat → chat}/index.ts +0 -0
  246. /package/backend/{lib/database → database}/README.md +0 -0
  247. /package/backend/{lib/database → database}/index.ts +0 -0
  248. /package/backend/{lib/database → database}/migrations/001_create_projects_table.ts +0 -0
  249. /package/backend/{lib/database → database}/migrations/002_create_chat_sessions_table.ts +0 -0
  250. /package/backend/{lib/database → database}/migrations/003_create_messages_table.ts +0 -0
  251. /package/backend/{lib/database → database}/migrations/004_create_prompt_templates_table.ts +0 -0
  252. /package/backend/{lib/database → database}/migrations/005_create_settings_table.ts +0 -0
  253. /package/backend/{lib/database → database}/migrations/006_add_user_to_messages.ts +0 -0
  254. /package/backend/{lib/database → database}/migrations/007_create_stream_states_table.ts +0 -0
  255. /package/backend/{lib/database → database}/migrations/008_create_message_snapshots_table.ts +0 -0
  256. /package/backend/{lib/database → database}/migrations/009_add_delta_snapshot_fields.ts +0 -0
  257. /package/backend/{lib/database → database}/migrations/010_add_soft_delete_and_branch_support.ts +0 -0
  258. /package/backend/{lib/database → database}/migrations/011_git_like_commit_graph.ts +0 -0
  259. /package/backend/{lib/database → database}/migrations/012_add_file_change_statistics.ts +0 -0
  260. /package/backend/{lib/database → database}/migrations/013_checkpoint_tree_state.ts +0 -0
  261. /package/backend/{lib/database → database}/migrations/014_add_engine_to_sessions.ts +0 -0
  262. /package/backend/{lib/database → database}/migrations/015_add_model_to_sessions.ts +0 -0
  263. /package/backend/{lib/database → database}/migrations/016_create_user_projects_table.ts +0 -0
  264. /package/backend/{lib/database → database}/migrations/017_add_current_session_to_user_projects.ts +0 -0
  265. /package/backend/{lib/database → database}/migrations/018_create_claude_accounts_table.ts +0 -0
  266. /package/backend/{lib/database → database}/migrations/019_add_claude_account_to_sessions.ts +0 -0
  267. /package/backend/{lib/database → database}/migrations/020_add_snapshot_tree_hash.ts +0 -0
  268. /package/backend/{lib/database → database}/migrations/021_drop_prompt_templates_table.ts +0 -0
  269. /package/backend/{lib/database → database}/migrations/022_add_snapshot_changes_column.ts +0 -0
  270. /package/backend/{lib/database → database}/migrations/023_create_user_unread_sessions_table.ts +0 -0
  271. /package/backend/{lib/database → database}/migrations/024_create_users_table.ts +0 -0
  272. /package/backend/{lib/database → database}/migrations/025_create_auth_sessions_table.ts +0 -0
  273. /package/backend/{lib/database → database}/migrations/026_create_invite_tokens_table.ts +0 -0
  274. /package/backend/{lib/database → database}/migrations/index.ts +0 -0
  275. /package/backend/{lib/database → database}/queries/auth-queries.ts +0 -0
  276. /package/backend/{lib/database → database}/queries/checkpoint-queries.ts +0 -0
  277. /package/backend/{lib/database → database}/queries/engine-queries.ts +0 -0
  278. /package/backend/{lib/database → database}/queries/index.ts +0 -0
  279. /package/backend/{lib/database → database}/queries/project-queries.ts +0 -0
  280. /package/backend/{lib/database → database}/queries/session-queries.ts +0 -0
  281. /package/backend/{lib/database → database}/queries/settings-queries.ts +0 -0
  282. /package/backend/{lib/database → database}/queries/snapshot-queries.ts +0 -0
  283. /package/backend/{lib/database → database}/queries/utils-queries.ts +0 -0
  284. /package/backend/{lib/database → database}/seeders/index.ts +0 -0
  285. /package/backend/{lib/database → database}/seeders/settings_seeder.ts +0 -0
  286. /package/backend/{lib/database → database}/utils/index.ts +0 -0
  287. /package/backend/{lib/database → database}/utils/migration-runner.ts +0 -0
  288. /package/backend/{lib/database → database}/utils/seeder-runner.ts +0 -0
  289. /package/backend/{lib/engine → engine}/adapters/claude/error-handler.ts +0 -0
  290. /package/backend/{lib/engine → engine}/adapters/claude/index.ts +0 -0
  291. /package/backend/{lib/engine → engine}/adapters/claude/path-utils.ts +0 -0
  292. /package/backend/{lib/engine → engine}/adapters/claude/stream.ts +0 -0
  293. /package/backend/{lib/engine → engine}/adapters/opencode/index.ts +0 -0
  294. /package/backend/{lib/engine → engine}/adapters/opencode/stream.ts +0 -0
  295. /package/backend/{lib/engine → engine}/index.ts +0 -0
  296. /package/backend/{lib/engine → engine}/types.ts +0 -0
  297. /package/backend/{lib/files → files}/file-operations.ts +0 -0
  298. /package/backend/{lib/files → files}/file-reading.ts +0 -0
  299. /package/backend/{lib/files → files}/path-browsing.ts +0 -0
  300. /package/backend/{lib/git → git}/git-parser.ts +0 -0
  301. /package/backend/{lib/git → git}/git-service.ts +0 -0
  302. /package/backend/{lib/mcp → mcp}/index.ts +0 -0
  303. /package/backend/{lib/mcp → mcp}/project-context.ts +0 -0
  304. /package/backend/{lib/mcp → mcp}/remote-server.ts +0 -0
  305. /package/backend/{lib/mcp → mcp}/servers/browser-automation/index.ts +0 -0
  306. /package/backend/{lib/mcp → mcp}/servers/helper.ts +0 -0
  307. /package/backend/{lib/mcp → mcp}/servers/index.ts +0 -0
  308. /package/backend/{lib/mcp → mcp}/servers/weather/get-temperature.ts +0 -0
  309. /package/backend/{lib/mcp → mcp}/servers/weather/index.ts +0 -0
  310. /package/backend/{lib/mcp → mcp}/types.ts +0 -0
  311. /package/backend/{lib/preview → preview}/browser/browser-audio-capture.ts +0 -0
  312. /package/backend/{lib/preview → preview}/browser/browser-console-manager.ts +0 -0
  313. /package/backend/{lib/preview → preview}/browser/browser-dialog-handler.ts +0 -0
  314. /package/backend/{lib/preview → preview}/browser/browser-interaction-handler.ts +0 -0
  315. /package/backend/{lib/preview → preview}/browser/browser-mcp-control.ts +0 -0
  316. /package/backend/{lib/preview → preview}/browser/browser-native-ui-handler.ts +0 -0
  317. /package/backend/{lib/preview → preview}/browser/browser-navigation-tracker.ts +0 -0
  318. /package/backend/{lib/preview → preview}/browser/browser-pool.ts +0 -0
  319. /package/backend/{lib/preview → preview}/browser/browser-video-capture.ts +0 -0
  320. /package/backend/{lib/preview → preview}/browser/scripts/audio-stream.ts +0 -0
  321. /package/backend/{lib/preview → preview}/browser/scripts/cursor-tracking.ts +0 -0
  322. /package/backend/{lib/preview → preview}/browser/scripts/video-stream.ts +0 -0
  323. /package/backend/{lib/preview → preview}/index.ts +0 -0
  324. /package/backend/{lib/project → project}/index.ts +0 -0
  325. /package/backend/{lib/snapshot → snapshot}/gitignore.ts +0 -0
  326. /package/backend/{lib/snapshot → snapshot}/helpers.ts +0 -0
  327. /package/backend/{lib/snapshot → snapshot}/snapshot-service.ts +0 -0
  328. /package/backend/{lib/terminal → terminal}/helpers.ts +0 -0
  329. /package/backend/{lib/terminal → terminal}/index.ts +0 -0
  330. /package/backend/{lib/terminal → terminal}/pty-manager.ts +0 -0
  331. /package/backend/{lib/terminal → terminal}/pty-session-manager.ts +0 -0
  332. /package/backend/{lib/terminal → terminal}/stream-manager.ts +0 -0
  333. /package/backend/{lib/tunnel → tunnel}/global-tunnel-manager.ts +0 -0
  334. /package/backend/{lib/tunnel → tunnel}/project-tunnel-manager.ts +0 -0
  335. /package/backend/{lib/shared → utils}/process-manager.ts +0 -0
  336. /package/backend/{lib/user/helpers.ts → utils/user-helpers.ts} +0 -0
  337. /package/frontend/{lib/app-environment.ts → app-environment.ts} +0 -0
  338. /package/frontend/{lib/components → components}/chat/formatters/index.ts +0 -0
  339. /package/frontend/{lib/components → components}/chat/input/components/DragDropOverlay.svelte +0 -0
  340. /package/frontend/{lib/components → components}/chat/input/composables/use-animations.svelte.ts +0 -0
  341. /package/frontend/{lib/components → components}/chat/input/composables/use-textarea-resize.svelte.ts +0 -0
  342. /package/frontend/{lib/components → components}/chat/message/DateSeparator.svelte +0 -0
  343. /package/frontend/{lib/components → components}/chat/shared/index.ts +0 -0
  344. /package/frontend/{lib/components → components}/chat/shared/utils.ts +0 -0
  345. /package/frontend/{lib/components → components}/chat/tools/AgentTool.svelte +0 -0
  346. /package/frontend/{lib/components → components}/chat/tools/BashOutputTool.svelte +0 -0
  347. /package/frontend/{lib/components → components}/chat/tools/BashTool.svelte +0 -0
  348. /package/frontend/{lib/components → components}/chat/tools/EnterPlanModeTool.svelte +0 -0
  349. /package/frontend/{lib/components → components}/chat/tools/ExitPlanModeTool.svelte +0 -0
  350. /package/frontend/{lib/components → components}/chat/tools/GlobTool.svelte +0 -0
  351. /package/frontend/{lib/components → components}/chat/tools/GrepTool.svelte +0 -0
  352. /package/frontend/{lib/components → components}/chat/tools/ListMcpResourcesTool.svelte +0 -0
  353. /package/frontend/{lib/components → components}/chat/tools/NotebookEditTool.svelte +0 -0
  354. /package/frontend/{lib/components → components}/chat/tools/ReadMcpResourceTool.svelte +0 -0
  355. /package/frontend/{lib/components → components}/chat/tools/ReadTool.svelte +0 -0
  356. /package/frontend/{lib/components → components}/chat/tools/TaskStopTool.svelte +0 -0
  357. /package/frontend/{lib/components → components}/chat/tools/TaskTool.svelte +0 -0
  358. /package/frontend/{lib/components → components}/chat/tools/WebFetchTool.svelte +0 -0
  359. /package/frontend/{lib/components → components}/chat/tools/WebSearchTool.svelte +0 -0
  360. /package/frontend/{lib/components → components}/chat/tools/WriteTool.svelte +0 -0
  361. /package/frontend/{lib/components → components}/chat/tools/components/StatsBadges.svelte +0 -0
  362. /package/frontend/{lib/components → components}/chat/tools/components/TerminalCommand.svelte +0 -0
  363. /package/frontend/{lib/components → components}/chat/tools/components/index.ts +0 -0
  364. /package/frontend/{lib/components → components}/chat/tools/index.ts +0 -0
  365. /package/frontend/{lib/components → components}/checkpoint/timeline/TimelineEdge.svelte +0 -0
  366. /package/frontend/{lib/components → components}/checkpoint/timeline/TimelineGraph.svelte +0 -0
  367. /package/frontend/{lib/components → components}/checkpoint/timeline/TimelineVersionGroup.svelte +0 -0
  368. /package/frontend/{lib/components → components}/checkpoint/timeline/animation.ts +0 -0
  369. /package/frontend/{lib/components → components}/checkpoint/timeline/config.ts +0 -0
  370. /package/frontend/{lib/components → components}/checkpoint/timeline/graph-builder.ts +0 -0
  371. /package/frontend/{lib/components → components}/checkpoint/timeline/types.ts +0 -0
  372. /package/frontend/{lib/components → components}/checkpoint/timeline/utils.ts +0 -0
  373. /package/frontend/{lib/components/common → components/common/display}/AvatarBubble.svelte +0 -0
  374. /package/frontend/{lib/components/common → components/common/display}/Button.svelte +0 -0
  375. /package/frontend/{lib/components/common → components/common/display}/Card.svelte +0 -0
  376. /package/frontend/{lib/components/common → components/common/feedback}/LoadingSpinner.svelte +0 -0
  377. /package/frontend/{lib/components → components}/common/lucide-icons.ts +0 -0
  378. /package/frontend/{lib/components → components}/common/material-icons.ts +0 -0
  379. /package/frontend/{lib/components/common → components/common/overlay}/Modal.svelte +0 -0
  380. /package/frontend/{lib/components → components}/common/xterm/index.ts +0 -0
  381. /package/frontend/{lib/components → components}/common/xterm/terminal-config.ts +0 -0
  382. /package/frontend/{lib/components → components}/common/xterm/types.ts +0 -0
  383. /package/frontend/{lib/components → components}/preview/browser/components/VirtualCursor.svelte +0 -0
  384. /package/frontend/{lib/components → components}/preview/browser/core/stream-handler.svelte.ts +0 -0
  385. /package/frontend/{lib/components → components}/preview/index.ts +0 -0
  386. /package/frontend/{lib/components → components}/settings/account/AccountSettings.svelte +0 -0
  387. /package/frontend/{lib/components → components}/settings/general/GeneralSettings.svelte +0 -0
  388. /package/frontend/{lib/components → components}/settings/security/SecuritySettings.svelte +0 -0
  389. /package/frontend/{lib/components → components}/settings/system/SystemSettings.svelte +0 -0
  390. /package/frontend/{lib/components → components}/tunnel/TunnelQRCode.svelte +0 -0
  391. /package/frontend/{lib/services → services}/chat/index.ts +0 -0
  392. /package/frontend/{lib/services → services}/notification/index.ts +0 -0
  393. /package/frontend/{lib/services → services}/preview/index.ts +0 -0
  394. /package/frontend/{lib/services → services}/project/index.ts +0 -0
  395. /package/frontend/{lib/services → services}/terminal/index.ts +0 -0
  396. /package/frontend/{lib/services → services}/terminal/persistence.service.ts +0 -0
  397. /package/frontend/{lib/services → services}/terminal/session.service.ts +0 -0
  398. /package/frontend/{lib/stores → stores}/core/files.svelte.ts +0 -0
  399. /package/frontend/{lib/stores → stores}/ui/chat-input.svelte.ts +0 -0
  400. /package/frontend/{lib/stores → stores}/ui/chat-model.svelte.ts +0 -0
  401. /package/frontend/{lib/stores → stores}/ui/connection.svelte.ts +0 -0
  402. /package/frontend/{lib/stores → stores}/ui/dialog.svelte.ts +0 -0
  403. /package/frontend/{lib/stores → stores}/ui/notification.svelte.ts +0 -0
  404. /package/frontend/{lib/stores → stores}/ui/settings-modal.svelte.ts +0 -0
  405. /package/frontend/{lib/stores → stores}/ui/theme.svelte.ts +0 -0
  406. /package/frontend/{lib/stores → stores}/ui/workspace.svelte.ts +0 -0
  407. /package/frontend/{lib/utils → utils}/chat/date-separator.ts +0 -0
  408. /package/frontend/{lib/utils → utils}/chat/message-grouper.ts +0 -0
  409. /package/frontend/{lib/utils → utils}/chat/message-processor.ts +0 -0
  410. /package/frontend/{lib/utils → utils}/chat/tool-handler.ts +0 -0
  411. /package/frontend/{lib/utils → utils}/chat/virtual-scroll.svelte.ts +0 -0
  412. /package/frontend/{lib/utils → utils}/click-outside.ts +0 -0
  413. /package/frontend/{lib/utils → utils}/context-manager.ts +0 -0
  414. /package/frontend/{lib/utils → utils}/file-icon-mappings.ts +0 -0
  415. /package/frontend/{lib/utils → utils}/folder-icon-mappings.ts +0 -0
  416. /package/frontend/{lib/utils → utils}/git-status.ts +0 -0
  417. /package/frontend/{lib/types → utils}/native-ui.ts +0 -0
  418. /package/frontend/{lib/utils → utils}/platform.ts +0 -0
  419. /package/frontend/{lib/utils → utils}/port-check.ts +0 -0
  420. /package/frontend/{lib/constants/preview.ts → utils/preview-constants.ts} +0 -0
  421. /package/frontend/{lib/utils/terminalFormatter.ts → utils/terminal-formatter.ts} +0 -0
  422. /package/frontend/{lib/utils → utils}/tree-visualizer.ts +0 -0
@@ -1,9 +1,9 @@
1
1
  <script lang="ts">
2
2
  import { fade, scale } from 'svelte/transition';
3
3
  import { cubicOut } from 'svelte/easing';
4
- import Icon from '$frontend/lib/components/common/Icon.svelte';
5
- import { getFileIcon } from '$frontend/lib/utils/file-icon-mappings';
6
- import { formatFileSize } from '$frontend/lib/components/chat/shared/utils';
4
+ import Icon from '$frontend/components/common/display/Icon.svelte';
5
+ import { getFileIcon } from '$frontend/utils/file-icon-mappings';
6
+ import { formatFileSize } from '$frontend/components/chat/shared/utils';
7
7
  import { debug } from '$shared/utils/logger';
8
8
 
9
9
  interface Props {
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
- import Alert from './Alert.svelte';
2
+ import Alert from '../feedback/Alert.svelte';
3
3
  import Dialog from './Dialog.svelte';
4
- import { dialogStore, closeAlert, closeConfirm } from '$frontend/lib/stores/ui/dialog.svelte';
4
+ import { dialogStore, closeAlert, closeConfirm } from '$frontend/stores/ui/dialog.svelte';
5
5
 
6
6
  const alertState = $derived(dialogStore.alert);
7
7
  const confirmState = $derived(dialogStore.confirm);
@@ -4,14 +4,14 @@
4
4
  -->
5
5
  <script lang="ts">
6
6
  import { onMount, onDestroy } from 'svelte';
7
- import { browser } from '$frontend/lib/app-environment';
7
+ import { browser } from '$frontend/app-environment';
8
8
  import type { TerminalSession } from '$shared/types/terminal';
9
9
  import { XTermService } from './xterm-service';
10
10
  import type { XTermProps, XTermMethods } from './types';
11
- import { terminalStore } from '$frontend/lib/stores/features/terminal.svelte';
12
- import { backgroundTerminalService } from '$frontend/lib/services/terminal/background';
13
- import { terminalService } from '$frontend/lib/services/terminal';
14
- import { settings } from '$frontend/lib/stores/features/settings.svelte';
11
+ import { terminalStore } from '$frontend/stores/features/terminal.svelte';
12
+ import { backgroundTerminalService } from '$frontend/services/terminal/background';
13
+ import { terminalService } from '$frontend/services/terminal';
14
+ import { settings } from '$frontend/stores/features/settings.svelte';
15
15
 
16
16
  // Import CSS directly - Vite will handle it properly
17
17
  import '@xterm/xterm/css/xterm.css';
@@ -5,7 +5,7 @@
5
5
  * No command parsing, no prompt handling - everything handled by shell
6
6
  */
7
7
 
8
- import { browser } from '$frontend/lib/app-environment';
8
+ import { browser } from '$frontend/app-environment';
9
9
  import type { Terminal } from '@xterm/xterm';
10
10
  import type { FitAddon } from '@xterm/addon-fit';
11
11
  import type { WebLinksAddon } from '@xterm/addon-web-links';
@@ -15,7 +15,7 @@ import type { LigaturesAddon } from '@xterm/addon-ligatures';
15
15
  import type { TerminalLine } from '$shared/types/terminal';
16
16
  import { terminalConfig } from './terminal-config';
17
17
  import { debug } from '$shared/utils/logger';
18
- import ws from '$frontend/lib/utils/ws';
18
+ import ws from '$frontend/utils/ws';
19
19
 
20
20
  export class XTermService {
21
21
  public terminal: Terminal | null = null;
@@ -1,10 +1,10 @@
1
1
  <script lang="ts">
2
2
  import type { FileNode as FileNodeType } from '$shared/types/filesystem';
3
3
  import FileNode from './FileNode.svelte';
4
- import Icon from '$frontend/lib/components/common/Icon.svelte';
4
+ import Icon from '$frontend/components/common/display/Icon.svelte';
5
5
  import type { IconName } from '$shared/types/ui/icons';
6
- import { getFileIcon } from '$frontend/lib/utils/file-icon-mappings';
7
- import { getFolderIcon } from '$frontend/lib/utils/folder-icon-mappings';
6
+ import { getFileIcon } from '$frontend/utils/file-icon-mappings';
7
+ import { getFolderIcon } from '$frontend/utils/folder-icon-mappings';
8
8
  import { onMount } from 'svelte';
9
9
 
10
10
  const {
@@ -4,14 +4,14 @@
4
4
  </script>
5
5
 
6
6
  <script lang="ts">
7
- import { projectState } from '$frontend/lib/stores/core/projects.svelte';
7
+ import { projectState } from '$frontend/stores/core/projects.svelte';
8
8
  import type { FileNode as FileNodeType } from '$shared/types/filesystem';
9
9
  import FileNode from './FileNode.svelte';
10
10
  import SearchResults from './SearchResults.svelte';
11
- import Icon from '$frontend/lib/components/common/Icon.svelte';
12
- import ws from '$frontend/lib/utils/ws';
13
- import { addNotification } from '$frontend/lib/stores/ui/notification.svelte';
14
- import { showConfirm } from '$frontend/lib/stores/ui/dialog.svelte';
11
+ import Icon from '$frontend/components/common/display/Icon.svelte';
12
+ import ws from '$frontend/utils/ws';
13
+ import { addNotification } from '$frontend/stores/ui/notification.svelte';
14
+ import { showConfirm } from '$frontend/stores/ui/dialog.svelte';
15
15
  import { normalizePath } from '$shared/utils/path';
16
16
  import { onDestroy } from 'svelte';
17
17
 
@@ -1,16 +1,16 @@
1
1
  <script lang="ts">
2
2
  import type { FileNode } from '$shared/types/filesystem';
3
- import LoadingSpinner from '../common/LoadingSpinner.svelte';
4
- import MonacoEditor from '../common/MonacoEditor.svelte';
5
- import { themeStore } from '$frontend/lib/stores/ui/theme.svelte';
6
- import Icon from '$frontend/lib/components/common/Icon.svelte';
7
- import { getFileIcon } from '$frontend/lib/utils/file-icon-mappings';
8
- import { getFolderIcon } from '$frontend/lib/utils/folder-icon-mappings';
3
+ import LoadingSpinner from '../common/feedback/LoadingSpinner.svelte';
4
+ import MonacoEditor from '../common/editor/MonacoEditor.svelte';
5
+ import { themeStore } from '$frontend/stores/ui/theme.svelte';
6
+ import Icon from '$frontend/components/common/display/Icon.svelte';
7
+ import { getFileIcon } from '$frontend/utils/file-icon-mappings';
8
+ import { getFolderIcon } from '$frontend/utils/folder-icon-mappings';
9
9
  import { onMount, onDestroy } from 'svelte';
10
10
  import type { IconName } from '$shared/types/ui/icons';
11
11
  import type { editor } from 'monaco-editor';
12
12
  import { debug } from '$shared/utils/logger';
13
- import ws from '$frontend/lib/utils/ws';
13
+ import ws from '$frontend/utils/ws';
14
14
 
15
15
  // Interface untuk MonacoEditor component
16
16
  interface MonacoEditorComponent {
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
- import Icon from '$frontend/lib/components/common/Icon.svelte';
3
- import { getFileIcon } from '$frontend/lib/utils/file-icon-mappings';
4
- import { getFolderIcon } from '$frontend/lib/utils/folder-icon-mappings';
2
+ import Icon from '$frontend/components/common/display/Icon.svelte';
3
+ import { getFileIcon } from '$frontend/utils/file-icon-mappings';
4
+ import { getFolderIcon } from '$frontend/utils/folder-icon-mappings';
5
5
  import { normalizePath } from '$shared/utils/path';
6
6
  import type { IconName } from '$shared/types/ui/icons';
7
7
 
@@ -1,12 +1,12 @@
1
1
  <script lang="ts">
2
- import Icon from '$frontend/lib/components/common/Icon.svelte';
3
- import Modal from '$frontend/lib/components/common/Modal.svelte';
4
- import Dialog from '$frontend/lib/components/common/Dialog.svelte';
2
+ import Icon from '$frontend/components/common/display/Icon.svelte';
3
+ import Modal from '$frontend/components/common/overlay/Modal.svelte';
4
+ import Dialog from '$frontend/components/common/overlay/Dialog.svelte';
5
5
  import type { GitBranchInfo, GitRemote } from '$shared/types/git';
6
- import { projectState } from '$frontend/lib/stores/core/projects.svelte';
7
- import { showError, showInfo } from '$frontend/lib/stores/ui/notification.svelte';
6
+ import { projectState } from '$frontend/stores/core/projects.svelte';
7
+ import { showError, showInfo } from '$frontend/stores/ui/notification.svelte';
8
8
  import { debug } from '$shared/utils/logger';
9
- import ws from '$frontend/lib/utils/ws';
9
+ import ws from '$frontend/utils/ws';
10
10
 
11
11
  interface Props {
12
12
  isOpen: boolean;
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import Icon from '$frontend/lib/components/common/Icon.svelte';
2
+ import Icon from '$frontend/components/common/display/Icon.svelte';
3
3
  import FileChangeItem from './FileChangeItem.svelte';
4
4
  import type { GitFileChange } from '$shared/types/git';
5
5
  import type { IconName } from '$shared/types/ui/icons';
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import Icon from '$frontend/lib/components/common/Icon.svelte';
2
+ import Icon from '$frontend/components/common/display/Icon.svelte';
3
3
 
4
4
  interface Props {
5
5
  stagedCount: number;
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import Icon from '$frontend/lib/components/common/Icon.svelte';
2
+ import Icon from '$frontend/components/common/display/Icon.svelte';
3
3
  import type { GitConflictFile } from '$shared/types/git';
4
4
 
5
5
  interface Props {
@@ -1,17 +1,17 @@
1
1
  <script lang="ts">
2
2
  import { onMount, onDestroy, untrack } from 'svelte';
3
- import Icon from '$frontend/lib/components/common/Icon.svelte';
4
- import { getFileIcon } from '$frontend/lib/utils/file-icon-mappings';
5
- import { getGitStatusBadgeLabel, getGitStatusBadgeColor } from '$frontend/lib/utils/git-status';
6
- import { themeStore } from '$frontend/lib/stores/ui/theme.svelte';
7
- import { projectState } from '$frontend/lib/stores/core/projects.svelte';
8
- import { settings } from '$frontend/lib/stores/features/settings.svelte';
3
+ import Icon from '$frontend/components/common/display/Icon.svelte';
4
+ import { getFileIcon } from '$frontend/utils/file-icon-mappings';
5
+ import { getGitStatusBadgeLabel, getGitStatusBadgeColor } from '$frontend/utils/git-status';
6
+ import { themeStore } from '$frontend/stores/ui/theme.svelte';
7
+ import { projectState } from '$frontend/stores/core/projects.svelte';
8
+ import { settings } from '$frontend/stores/features/settings.svelte';
9
9
  import loader from '@monaco-editor/loader';
10
10
  import type { editor } from 'monaco-editor';
11
11
  import type { GitFileDiff } from '$shared/types/git';
12
12
  import type { IconName } from '$shared/types/ui/icons';
13
13
  import { debug } from '$shared/utils/logger';
14
- import ws from '$frontend/lib/utils/ws';
14
+ import ws from '$frontend/utils/ws';
15
15
 
16
16
  interface Props {
17
17
  diff: GitFileDiff | null;
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
- import Icon from '$frontend/lib/components/common/Icon.svelte';
3
- import { getFileIcon } from '$frontend/lib/utils/file-icon-mappings';
4
- import { getGitStatusLabel, getGitStatusColor } from '$frontend/lib/utils/git-status';
2
+ import Icon from '$frontend/components/common/display/Icon.svelte';
3
+ import { getFileIcon } from '$frontend/utils/file-icon-mappings';
4
+ import { getGitStatusLabel, getGitStatusColor } from '$frontend/utils/git-status';
5
5
  import type { GitFileChange } from '$shared/types/git';
6
6
  import type { IconName } from '$shared/types/ui/icons';
7
7
 
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import Icon from '$frontend/lib/components/common/Icon.svelte';
2
+ import Icon from '$frontend/components/common/display/Icon.svelte';
3
3
 
4
4
  interface Props {
5
5
  collapsed?: boolean;
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
- import Icon from '$frontend/lib/components/common/Icon.svelte';
3
- import { addNotification } from '$frontend/lib/stores/ui/notification.svelte';
2
+ import Icon from '$frontend/components/common/display/Icon.svelte';
3
+ import { addNotification } from '$frontend/stores/ui/notification.svelte';
4
4
  import type { GitCommit } from '$shared/types/git';
5
5
 
6
6
  interface Props {
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
- import Modal from '$frontend/lib/components/common/Modal.svelte';
3
- import Icon from '$frontend/lib/components/common/Icon.svelte';
4
- import GitPanel from '$frontend/lib/components/workspace/panels/GitPanel.svelte';
2
+ import Modal from '$frontend/components/common/overlay/Modal.svelte';
3
+ import Icon from '$frontend/components/common/display/Icon.svelte';
4
+ import GitPanel from '$frontend/components/workspace/panels/GitPanel.svelte';
5
5
 
6
6
  interface Props {
7
7
  isOpen: boolean;
@@ -1,18 +1,17 @@
1
1
  <script lang="ts">
2
2
  import { untrack } from 'svelte';
3
- import { sessionState, setCurrentSession, removeSession, reloadSessionsForProject } from '$frontend/lib/stores/core/sessions.svelte';
4
- import { projectState } from '$frontend/lib/stores/core/projects.svelte';
5
- import { addNotification } from '$frontend/lib/stores/ui/notification.svelte';
6
- import ws from '$frontend/lib/utils/ws';
3
+ import { sessionState, setCurrentSession, removeSession, reloadSessionsForProject } from '$frontend/stores/core/sessions.svelte';
4
+ import { projectState } from '$frontend/stores/core/projects.svelte';
5
+ import { addNotification } from '$frontend/stores/ui/notification.svelte';
6
+ import ws from '$frontend/utils/ws';
7
7
  import type { ChatSession } from '$shared/types/database/schema';
8
- import type { SDKMessage } from '$shared/types/messaging';
9
- import Icon from '$frontend/lib/components/common/Icon.svelte';
10
- import AvatarBubble from '$frontend/lib/components/common/AvatarBubble.svelte';
11
- import Modal from '$frontend/lib/components/common/Modal.svelte';
12
- import Dialog from '$frontend/lib/components/common/Dialog.svelte';
13
- import { presenceState, isSessionWaitingInput } from '$frontend/lib/stores/core/presence.svelte';
14
- import { isSessionUnread } from '$frontend/lib/stores/core/app.svelte';
15
- import { userStore } from '$frontend/lib/stores/features/user.svelte';
8
+ import Icon from '$frontend/components/common/display/Icon.svelte';
9
+ import AvatarBubble from '$frontend/components/common/display/AvatarBubble.svelte';
10
+ import Modal from '$frontend/components/common/overlay/Modal.svelte';
11
+ import Dialog from '$frontend/components/common/overlay/Dialog.svelte';
12
+ import { presenceState, isSessionWaitingInput } from '$frontend/stores/core/presence.svelte';
13
+ import { isSessionUnread } from '$frontend/stores/core/app.svelte';
14
+ import { userStore } from '$frontend/stores/features/user.svelte';
16
15
  import { debug } from '$shared/utils/logger';
17
16
 
18
17
  interface Props {
@@ -55,7 +54,6 @@
55
54
 
56
55
  // Cache for session data to avoid multiple API calls
57
56
  let sessionDataCache = $state<Record<string, {
58
- messages: SDKMessage[];
59
57
  title: string;
60
58
  summary: string;
61
59
  count: number;
@@ -64,87 +62,30 @@
64
62
  }>>({});
65
63
  let loadingSessionData = $state(false);
66
64
 
67
- // Helper to get session data from cache or API
65
+ // Helper to get session data from cache or API (single session fallback)
68
66
  async function getSessionData(sessionId: string) {
69
67
  if (sessionDataCache[sessionId]) {
70
68
  return sessionDataCache[sessionId];
71
69
  }
72
70
 
73
71
  try {
74
- const messages = await ws.http('messages:list', { session_id: sessionId, include_all: true });
75
-
76
- const firstUserMessage = messages.find((m: SDKMessage) => m.type === 'user');
77
- let title = 'New Conversation';
78
- if (firstUserMessage) {
79
- let textContent = '';
80
- if (typeof firstUserMessage.message.content === 'string') {
81
- textContent = firstUserMessage.message.content;
82
- } else if (Array.isArray(firstUserMessage.message.content)) {
83
- const textBlocks = firstUserMessage.message.content.filter((c: any) => c.type === 'text');
84
- textContent = textBlocks.map((b: any) => 'text' in b ? b.text : '').join(' ');
85
- }
86
-
87
- if (textContent) {
88
- title = textContent.slice(0, 60) + (textContent.length > 60 ? '...' : '');
89
- }
72
+ const previews = await ws.http('sessions:preview', { session_ids: [sessionId] });
73
+ const preview = previews[0];
74
+ if (preview) {
75
+ sessionDataCache[sessionId] = {
76
+ title: preview.title,
77
+ summary: preview.summary,
78
+ count: preview.count,
79
+ userCount: preview.userCount,
80
+ assistantCount: preview.assistantCount
81
+ };
82
+ return sessionDataCache[sessionId];
90
83
  }
91
-
92
- const assistantMessages = messages.filter((m: SDKMessage) => m.type === 'assistant');
93
- let summary = 'No messages yet';
94
- if (assistantMessages.length > 0) {
95
- const lastMessage = assistantMessages[assistantMessages.length - 1];
96
- const textBlocks = lastMessage.message.content.filter((c: any) => c.type === 'text');
97
- if (textBlocks.length > 0) {
98
- const fullText = textBlocks.map((b: any) => 'text' in b ? b.text : '').join(' ');
99
- const cleanText = fullText.replace(/```[\s\S]*?```/g, '').trim();
100
- summary = cleanText.slice(0, 100) + (cleanText.length > 100 ? '...' : '');
101
- }
102
- }
103
-
104
- const userMessages = messages.filter((m: SDKMessage) => {
105
- if (m.type !== 'user') return false;
106
- let textContent = '';
107
- if (typeof m.message.content === 'string') {
108
- textContent = m.message.content;
109
- } else if (Array.isArray(m.message.content)) {
110
- const textBlocks = m.message.content.filter(c => c.type === 'text');
111
- textContent = textBlocks.map(b => 'text' in b ? b.text : '').join(' ');
112
- }
113
- return textContent.trim().length > 0;
114
- });
115
-
116
- const totalBubbles = userMessages.length + assistantMessages.length;
117
-
118
- const data = {
119
- messages,
120
- title,
121
- summary,
122
- count: totalBubbles,
123
- userCount: userMessages.length,
124
- assistantCount: assistantMessages.length
125
- };
126
-
127
- sessionDataCache[sessionId] = data;
128
- debug.log('session', `Loaded session ${sessionId}:`, {
129
- title,
130
- totalMessages: messages.length,
131
- userCount: userMessages.length,
132
- assistantCount: assistantMessages.length,
133
- totalBubbles: totalBubbles,
134
- summary: summary.substring(0, 50)
135
- });
136
- return data;
137
84
  } catch (error) {
138
85
  debug.error('session', 'Error fetching session data:', error);
139
- return {
140
- messages: [],
141
- title: 'New Conversation',
142
- summary: 'No messages yet',
143
- count: 0,
144
- userCount: 0,
145
- assistantCount: 0
146
- };
147
86
  }
87
+
88
+ return { title: 'New Conversation', summary: 'No messages yet', count: 0, userCount: 0, assistantCount: 0 };
148
89
  }
149
90
 
150
91
  function getMessageCount(sessionId: string): number {
@@ -167,12 +108,23 @@
167
108
  loadingSessionData = true;
168
109
  try {
169
110
  // Sort newest first and load top 20 so new sessions are always included
170
- const sortedSessions = [...sessions]
111
+ const sessionIds = [...sessions]
171
112
  .sort((a, b) => new Date(b.started_at).getTime() - new Date(a.started_at).getTime())
172
- .slice(0, 20);
173
- await Promise.all(
174
- sortedSessions.map(session => getSessionData(session.id))
175
- );
113
+ .slice(0, 20)
114
+ .map(s => s.id);
115
+
116
+ if (sessionIds.length === 0) return;
117
+
118
+ const previews = await ws.http('sessions:preview', { session_ids: sessionIds });
119
+ for (const preview of previews) {
120
+ sessionDataCache[preview.session_id] = {
121
+ title: preview.title,
122
+ summary: preview.summary,
123
+ count: preview.count,
124
+ userCount: preview.userCount,
125
+ assistantCount: preview.assistantCount
126
+ };
127
+ }
176
128
  } catch (error) {
177
129
  debug.error('session', 'Error preloading session data:', error);
178
130
  } finally {
@@ -1,19 +1,18 @@
1
1
  <script lang="ts">
2
2
  import { onMount } from 'svelte';
3
- import { sessionState, removeSession, setCurrentSession } from '$frontend/lib/stores/core/sessions.svelte';
4
- import { projectState, setCurrentProject } from '$frontend/lib/stores/core/projects.svelte';
5
- import { addNotification } from '$frontend/lib/stores/ui/notification.svelte';
6
- import { setCurrentView } from '$frontend/lib/stores/core/app.svelte';
7
- import ws from '$frontend/lib/utils/ws';
3
+ import { sessionState, removeSession, setCurrentSession } from '$frontend/stores/core/sessions.svelte';
4
+ import { projectState, setCurrentProject } from '$frontend/stores/core/projects.svelte';
5
+ import { addNotification } from '$frontend/stores/ui/notification.svelte';
6
+ import { setCurrentView } from '$frontend/stores/core/app.svelte';
7
+ import ws from '$frontend/utils/ws';
8
8
  import type { ChatSession, Project } from '$shared/types/database/schema';
9
- import type { SDKMessage } from '$shared/types/messaging';
10
- import Input from '../common/Input.svelte';
11
- import Select from '../common/Select.svelte';
12
- import Icon from '$frontend/lib/components/common/Icon.svelte';
13
- import PageTemplate from '../common/PageTemplate.svelte';
14
- import Button from '../common/Button.svelte';
15
- import { showConfirm } from '$frontend/lib/stores/ui/dialog.svelte';
16
- import Modal from '$frontend/lib/components/common/Modal.svelte';
9
+ import Input from '../common/form/Input.svelte';
10
+ import Select from '../common/form/Select.svelte';
11
+ import Icon from '$frontend/components/common/display/Icon.svelte';
12
+ import PageTemplate from '../common/display/PageTemplate.svelte';
13
+ import Button from '../common/display/Button.svelte';
14
+ import { showConfirm } from '$frontend/stores/ui/dialog.svelte';
15
+ import Modal from '$frontend/components/common/overlay/Modal.svelte';
17
16
  import TimelineModal from '../checkpoint/TimelineModal.svelte';
18
17
  import { debug } from '$shared/utils/logger';
19
18
 
@@ -62,7 +61,6 @@
62
61
 
63
62
  // Cache for session data to avoid multiple API calls
64
63
  const sessionDataCache = $state<Record<string, {
65
- messages: SDKMessage[];
66
64
  title: string;
67
65
  summary: string;
68
66
  count: number;
@@ -71,95 +69,30 @@
71
69
  }>>({});
72
70
  let loadingSessionData = $state(true);
73
71
 
74
- // Helper to get session data from cache or API
72
+ // Helper to get session data from cache or API (single session fallback)
75
73
  async function getSessionData(sessionId: string) {
76
74
  if (sessionDataCache[sessionId]) {
77
75
  return sessionDataCache[sessionId];
78
76
  }
79
77
 
80
78
  try {
81
- // Get messages from current HEAD checkpoint (active branch only)
82
- const messages = await ws.http('messages:list', { session_id: sessionId, include_all: true });
83
-
84
- // Get title from first user message in current HEAD
85
- const firstUserMessage = messages.find((m: SDKMessage) => m.type === 'user');
86
- let title = 'New Conversation';
87
- if (firstUserMessage) {
88
- // Handle content properly - it can be string or array of content blocks
89
- let textContent = '';
90
- if (typeof firstUserMessage.message.content === 'string') {
91
- textContent = firstUserMessage.message.content;
92
- } else if (Array.isArray(firstUserMessage.message.content)) {
93
- // Extract text from content blocks
94
- const textBlocks = firstUserMessage.message.content.filter((c: any) => c.type === 'text');
95
- textContent = textBlocks.map((b: any) => 'text' in b ? b.text : '').join(' ');
96
- }
97
-
98
- if (textContent) {
99
- title = textContent.slice(0, 60) + (textContent.length > 60 ? '...' : '');
100
- }
101
- }
102
-
103
- // Get summary from last assistant message in current HEAD checkpoint
104
- const assistantMessages = messages.filter((m: SDKMessage) => m.type === 'assistant');
105
- let summary = 'No messages yet';
106
- if (assistantMessages.length > 0) {
107
- const lastMessage = assistantMessages[assistantMessages.length - 1];
108
- const textBlocks = lastMessage.message.content.filter((c: any) => c.type === 'text');
109
- if (textBlocks.length > 0) {
110
- const fullText = textBlocks.map((b: any) => 'text' in b ? b.text : '').join(' ');
111
- const cleanText = fullText.replace(/```[\s\S]*?```/g, '').trim();
112
- summary = cleanText.slice(0, 150) + (cleanText.length > 150 ? '...' : '');
113
- }
79
+ const previews = await ws.http('sessions:preview', { session_ids: [sessionId] });
80
+ const preview = previews[0];
81
+ if (preview) {
82
+ sessionDataCache[sessionId] = {
83
+ title: preview.title,
84
+ summary: preview.summary,
85
+ count: preview.count,
86
+ userCount: preview.userCount,
87
+ assistantCount: preview.assistantCount
88
+ };
89
+ return sessionDataCache[sessionId];
114
90
  }
115
-
116
- // Count user and assistant messages in current HEAD checkpoint
117
- // Filter out empty user messages (same as ChatInterface.svelte timeline logic)
118
- const userMessages = messages.filter((m: SDKMessage) => {
119
- if (m.type !== 'user') return false;
120
- // Extract text content
121
- let textContent = '';
122
- if (typeof m.message.content === 'string') {
123
- textContent = m.message.content;
124
- } else if (Array.isArray(m.message.content)) {
125
- const textBlocks = m.message.content.filter(c => c.type === 'text');
126
- textContent = textBlocks.map(b => 'text' in b ? b.text : '').join(' ');
127
- }
128
- return textContent.trim().length > 0;
129
- });
130
-
131
- const totalBubbles = userMessages.length + assistantMessages.length; // Total message bubbles in chat
132
-
133
- const data = {
134
- messages,
135
- title,
136
- summary,
137
- count: totalBubbles, // Total bubbles (user + assistant with non-empty content)
138
- userCount: userMessages.length, // Number of chat sessions/exchanges (non-empty user messages)
139
- assistantCount: assistantMessages.length
140
- };
141
-
142
- sessionDataCache[sessionId] = data;
143
- debug.log('session', `Loaded session ${sessionId}:`, {
144
- title,
145
- totalMessages: messages.length,
146
- userCount: userMessages.length,
147
- assistantCount: assistantMessages.length,
148
- totalBubbles: totalBubbles,
149
- summary: summary.substring(0, 50)
150
- });
151
- return data;
152
91
  } catch (error) {
153
92
  debug.error('session', 'Error fetching session data:', error);
154
- return {
155
- messages: [],
156
- title: 'New Conversation',
157
- summary: 'No messages yet',
158
- count: 0,
159
- userCount: 0,
160
- assistantCount: 0
161
- };
162
93
  }
94
+
95
+ return { title: 'New Conversation', summary: 'No messages yet', count: 0, userCount: 0, assistantCount: 0 };
163
96
  }
164
97
 
165
98
  // Helper functions that use cached data
@@ -179,14 +112,23 @@
179
112
  return sessionDataCache[sessionId]?.summary || 'No messages yet';
180
113
  }
181
114
 
182
- // Preload session data for visible sessions
115
+ // Preload session data for visible sessions using a single bulk request
183
116
  async function preloadSessionData() {
184
117
  loadingSessionData = true;
185
118
  try {
186
- // Load all sessions in parallel for better performance
187
- await Promise.all(
188
- sessions.slice(0, 20).map(session => getSessionData(session.id))
189
- );
119
+ const sessionIds = sessions.slice(0, 20).map(s => s.id);
120
+ if (sessionIds.length === 0) return;
121
+
122
+ const previews = await ws.http('sessions:preview', { session_ids: sessionIds });
123
+ for (const preview of previews) {
124
+ sessionDataCache[preview.session_id] = {
125
+ title: preview.title,
126
+ summary: preview.summary,
127
+ count: preview.count,
128
+ userCount: preview.userCount,
129
+ assistantCount: preview.assistantCount
130
+ };
131
+ }
190
132
  } catch (error) {
191
133
  debug.error('session', 'Error preloading session data:', error);
192
134
  } finally {
@@ -199,14 +141,25 @@
199
141
  preloadSessionData();
200
142
  });
201
143
 
202
- // Reload session data when sessions change
144
+ // Reload session data when new sessions arrive
203
145
  $effect(() => {
204
146
  if (sessions.length > 0 && !loadingSessionData) {
205
- // Check if there are sessions without cached data
206
- const uncachedSessions = sessions.filter(s => !sessionDataCache[s.id]);
207
- if (uncachedSessions.length > 0) {
208
- debug.log('session', `Found ${uncachedSessions.length} uncached sessions, loading...`);
209
- preloadSessionData();
147
+ const uncachedIds = sessions.filter(s => !sessionDataCache[s.id]).map(s => s.id);
148
+ if (uncachedIds.length > 0) {
149
+ debug.log('session', `Found ${uncachedIds.length} uncached sessions, loading...`);
150
+ ws.http('sessions:preview', { session_ids: uncachedIds }).then((previews: any[]) => {
151
+ for (const preview of previews) {
152
+ sessionDataCache[preview.session_id] = {
153
+ title: preview.title,
154
+ summary: preview.summary,
155
+ count: preview.count,
156
+ userCount: preview.userCount,
157
+ assistantCount: preview.assistantCount
158
+ };
159
+ }
160
+ }).catch((err: unknown) => {
161
+ debug.error('session', 'Error loading uncached sessions:', err);
162
+ });
210
163
  }
211
164
  }
212
165
  });