@myrialabs/clopen 0.0.4 → 0.0.6

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 (453) hide show
  1. package/.env.example +5 -5
  2. package/.github/workflows/{release.yml → ci.yml} +86 -60
  3. package/CONTRIBUTING.md +499 -499
  4. package/LICENSE +21 -21
  5. package/README.md +209 -209
  6. package/backend/index.ts +168 -156
  7. package/backend/lib/chat/helpers.ts +42 -42
  8. package/backend/lib/chat/index.ts +1 -1
  9. package/backend/lib/chat/stream-manager.ts +1126 -1126
  10. package/backend/lib/database/README.md +76 -76
  11. package/backend/lib/database/index.ts +118 -118
  12. package/backend/lib/database/migrations/001_create_projects_table.ts +30 -30
  13. package/backend/lib/database/migrations/002_create_chat_sessions_table.ts +32 -32
  14. package/backend/lib/database/migrations/003_create_messages_table.ts +31 -31
  15. package/backend/lib/database/migrations/004_create_prompt_templates_table.ts +34 -34
  16. package/backend/lib/database/migrations/005_create_settings_table.ts +23 -23
  17. package/backend/lib/database/migrations/006_add_user_to_messages.ts +57 -57
  18. package/backend/lib/database/migrations/007_create_stream_states_table.ts +40 -40
  19. package/backend/lib/database/migrations/008_create_message_snapshots_table.ts +61 -61
  20. package/backend/lib/database/migrations/009_add_delta_snapshot_fields.ts +41 -41
  21. package/backend/lib/database/migrations/010_add_soft_delete_and_branch_support.ts +70 -70
  22. package/backend/lib/database/migrations/011_git_like_commit_graph.ts +156 -156
  23. package/backend/lib/database/migrations/012_add_file_change_statistics.ts +41 -41
  24. package/backend/lib/database/migrations/013_checkpoint_tree_state.ts +118 -118
  25. package/backend/lib/database/migrations/014_add_engine_to_sessions.ts +18 -18
  26. package/backend/lib/database/migrations/015_add_model_to_sessions.ts +18 -18
  27. package/backend/lib/database/migrations/016_create_user_projects_table.ts +34 -34
  28. package/backend/lib/database/migrations/017_add_current_session_to_user_projects.ts +32 -32
  29. package/backend/lib/database/migrations/018_create_claude_accounts_table.ts +24 -24
  30. package/backend/lib/database/migrations/019_add_claude_account_to_sessions.ts +18 -18
  31. package/backend/lib/database/migrations/020_add_snapshot_tree_hash.ts +32 -32
  32. package/backend/lib/database/migrations/021_drop_prompt_templates_table.ts +33 -33
  33. package/backend/lib/database/migrations/index.ts +153 -153
  34. package/backend/lib/database/queries/checkpoint-queries.ts +87 -87
  35. package/backend/lib/database/queries/engine-queries.ts +75 -75
  36. package/backend/lib/database/queries/index.ts +8 -8
  37. package/backend/lib/database/queries/message-queries.ts +471 -471
  38. package/backend/lib/database/queries/project-queries.ts +117 -117
  39. package/backend/lib/database/queries/session-queries.ts +270 -270
  40. package/backend/lib/database/queries/settings-queries.ts +33 -33
  41. package/backend/lib/database/queries/snapshot-queries.ts +325 -325
  42. package/backend/lib/database/queries/utils-queries.ts +58 -58
  43. package/backend/lib/database/seeders/index.ts +12 -12
  44. package/backend/lib/database/seeders/settings_seeder.ts +83 -83
  45. package/backend/lib/database/utils/connection.ts +173 -173
  46. package/backend/lib/database/utils/index.ts +3 -3
  47. package/backend/lib/database/utils/migration-runner.ts +117 -117
  48. package/backend/lib/database/utils/seeder-runner.ts +120 -120
  49. package/backend/lib/engine/adapters/claude/environment.ts +160 -164
  50. package/backend/lib/engine/adapters/claude/error-handler.ts +60 -60
  51. package/backend/lib/engine/adapters/claude/index.ts +1 -1
  52. package/backend/lib/engine/adapters/claude/path-utils.ts +38 -38
  53. package/backend/lib/engine/adapters/claude/stream.ts +177 -177
  54. package/backend/lib/engine/adapters/opencode/index.ts +2 -2
  55. package/backend/lib/engine/adapters/opencode/message-converter.ts +862 -862
  56. package/backend/lib/engine/adapters/opencode/server.ts +104 -104
  57. package/backend/lib/engine/adapters/opencode/stream.ts +755 -755
  58. package/backend/lib/engine/index.ts +196 -196
  59. package/backend/lib/engine/types.ts +58 -58
  60. package/backend/lib/files/file-operations.ts +478 -478
  61. package/backend/lib/files/file-reading.ts +308 -308
  62. package/backend/lib/files/file-watcher.ts +383 -383
  63. package/backend/lib/files/path-browsing.ts +382 -382
  64. package/backend/lib/git/git-executor.ts +89 -88
  65. package/backend/lib/git/git-parser.ts +411 -411
  66. package/backend/lib/git/git-service.ts +505 -505
  67. package/backend/lib/mcp/README.md +1144 -1144
  68. package/backend/lib/mcp/config.ts +317 -316
  69. package/backend/lib/mcp/index.ts +35 -35
  70. package/backend/lib/mcp/project-context.ts +236 -236
  71. package/backend/lib/mcp/servers/browser-automation/actions.ts +156 -156
  72. package/backend/lib/mcp/servers/browser-automation/browser.ts +419 -419
  73. package/backend/lib/mcp/servers/browser-automation/index.ts +791 -791
  74. package/backend/lib/mcp/servers/browser-automation/inspection.ts +501 -501
  75. package/backend/lib/mcp/servers/helper.ts +143 -143
  76. package/backend/lib/mcp/servers/index.ts +44 -44
  77. package/backend/lib/mcp/servers/weather/get-temperature.ts +56 -56
  78. package/backend/lib/mcp/servers/weather/index.ts +31 -31
  79. package/backend/lib/mcp/stdio-server.ts +103 -103
  80. package/backend/lib/mcp/types.ts +65 -65
  81. package/backend/lib/preview/browser/browser-audio-capture.ts +86 -86
  82. package/backend/lib/preview/browser/browser-console-manager.ts +262 -262
  83. package/backend/lib/preview/browser/browser-dialog-handler.ts +222 -222
  84. package/backend/lib/preview/browser/browser-interaction-handler.ts +421 -421
  85. package/backend/lib/preview/browser/browser-mcp-control.ts +415 -415
  86. package/backend/lib/preview/browser/browser-native-ui-handler.ts +512 -512
  87. package/backend/lib/preview/browser/browser-navigation-tracker.ts +103 -103
  88. package/backend/lib/preview/browser/browser-pool.ts +357 -357
  89. package/backend/lib/preview/browser/browser-preview-service.ts +882 -882
  90. package/backend/lib/preview/browser/browser-tab-manager.ts +935 -935
  91. package/backend/lib/preview/browser/browser-video-capture.ts +695 -695
  92. package/backend/lib/preview/browser/scripts/audio-stream.ts +292 -292
  93. package/backend/lib/preview/browser/scripts/cursor-tracking.ts +85 -85
  94. package/backend/lib/preview/browser/scripts/video-stream.ts +438 -438
  95. package/backend/lib/preview/browser/types.ts +359 -359
  96. package/backend/lib/preview/index.ts +23 -23
  97. package/backend/lib/project/index.ts +1 -1
  98. package/backend/lib/project/status-manager.ts +181 -181
  99. package/backend/lib/shared/env.ts +117 -0
  100. package/backend/lib/shared/index.ts +5 -2
  101. package/backend/lib/shared/port-utils.ts +25 -25
  102. package/backend/lib/shared/process-manager.ts +280 -280
  103. package/backend/lib/snapshot/blob-store.ts +227 -227
  104. package/backend/lib/snapshot/gitignore.ts +307 -307
  105. package/backend/lib/snapshot/helpers.ts +397 -397
  106. package/backend/lib/snapshot/snapshot-service.ts +483 -483
  107. package/backend/lib/terminal/helpers.ts +14 -14
  108. package/backend/lib/terminal/index.ts +7 -7
  109. package/backend/lib/terminal/pty-manager.ts +3 -3
  110. package/backend/lib/terminal/pty-session-manager.ts +370 -387
  111. package/backend/lib/terminal/shell-utils.ts +315 -312
  112. package/backend/lib/terminal/stream-manager.ts +292 -292
  113. package/backend/lib/tunnel/global-tunnel-manager.ts +266 -243
  114. package/backend/lib/tunnel/project-tunnel-manager.ts +311 -311
  115. package/backend/lib/user/helpers.ts +87 -87
  116. package/backend/lib/utils/ws.ts +944 -944
  117. package/backend/lib/vite-dev.ts +295 -295
  118. package/backend/middleware/cors.ts +16 -15
  119. package/backend/middleware/error-handler.ts +50 -49
  120. package/backend/middleware/logger.ts +9 -9
  121. package/backend/types/api.ts +24 -24
  122. package/backend/ws/README.md +1505 -1505
  123. package/backend/ws/chat/background.ts +198 -198
  124. package/backend/ws/chat/index.ts +21 -21
  125. package/backend/ws/chat/stream.ts +707 -707
  126. package/backend/ws/engine/claude/accounts.ts +399 -401
  127. package/backend/ws/engine/claude/index.ts +13 -13
  128. package/backend/ws/engine/claude/status.ts +43 -43
  129. package/backend/ws/engine/index.ts +14 -14
  130. package/backend/ws/engine/opencode/index.ts +11 -11
  131. package/backend/ws/engine/opencode/status.ts +30 -30
  132. package/backend/ws/engine/utils.ts +36 -36
  133. package/backend/ws/files/index.ts +30 -30
  134. package/backend/ws/files/read.ts +189 -189
  135. package/backend/ws/files/search.ts +453 -453
  136. package/backend/ws/files/watch.ts +124 -124
  137. package/backend/ws/files/write.ts +143 -143
  138. package/backend/ws/git/branch.ts +106 -106
  139. package/backend/ws/git/commit.ts +39 -39
  140. package/backend/ws/git/conflict.ts +68 -68
  141. package/backend/ws/git/diff.ts +69 -69
  142. package/backend/ws/git/index.ts +24 -24
  143. package/backend/ws/git/log.ts +41 -41
  144. package/backend/ws/git/remote.ts +214 -214
  145. package/backend/ws/git/staging.ts +84 -84
  146. package/backend/ws/git/status.ts +90 -90
  147. package/backend/ws/index.ts +69 -69
  148. package/backend/ws/mcp/index.ts +61 -61
  149. package/backend/ws/messages/crud.ts +74 -74
  150. package/backend/ws/messages/index.ts +14 -14
  151. package/backend/ws/preview/browser/cleanup.ts +129 -129
  152. package/backend/ws/preview/browser/console.ts +114 -114
  153. package/backend/ws/preview/browser/interact.ts +513 -513
  154. package/backend/ws/preview/browser/mcp.ts +129 -129
  155. package/backend/ws/preview/browser/native-ui.ts +235 -235
  156. package/backend/ws/preview/browser/stats.ts +55 -55
  157. package/backend/ws/preview/browser/tab-info.ts +126 -126
  158. package/backend/ws/preview/browser/tab.ts +166 -166
  159. package/backend/ws/preview/browser/webcodecs.ts +293 -293
  160. package/backend/ws/preview/index.ts +146 -146
  161. package/backend/ws/projects/crud.ts +113 -113
  162. package/backend/ws/projects/index.ts +25 -25
  163. package/backend/ws/projects/presence.ts +46 -46
  164. package/backend/ws/projects/status.ts +116 -116
  165. package/backend/ws/sessions/crud.ts +327 -327
  166. package/backend/ws/sessions/index.ts +33 -33
  167. package/backend/ws/settings/crud.ts +112 -112
  168. package/backend/ws/settings/index.ts +14 -14
  169. package/backend/ws/snapshot/index.ts +17 -17
  170. package/backend/ws/snapshot/restore.ts +173 -173
  171. package/backend/ws/snapshot/timeline.ts +141 -141
  172. package/backend/ws/system/index.ts +14 -14
  173. package/backend/ws/system/operations.ts +49 -49
  174. package/backend/ws/terminal/index.ts +40 -40
  175. package/backend/ws/terminal/persistence.ts +153 -153
  176. package/backend/ws/terminal/session.ts +382 -382
  177. package/backend/ws/terminal/stream.ts +79 -79
  178. package/backend/ws/tunnel/index.ts +14 -14
  179. package/backend/ws/tunnel/operations.ts +91 -91
  180. package/backend/ws/types.ts +20 -20
  181. package/backend/ws/user/crud.ts +156 -156
  182. package/backend/ws/user/index.ts +14 -14
  183. package/bin/clopen.ts +307 -307
  184. package/bun.lock +1353 -1352
  185. package/frontend/App.svelte +38 -34
  186. package/frontend/app.css +313 -313
  187. package/frontend/lib/app-environment.ts +10 -10
  188. package/frontend/lib/components/chat/ChatInterface.svelte +406 -406
  189. package/frontend/lib/components/chat/formatters/ErrorMessage.svelte +56 -56
  190. package/frontend/lib/components/chat/formatters/MessageFormatter.svelte +223 -223
  191. package/frontend/lib/components/chat/formatters/TextMessage.svelte +394 -394
  192. package/frontend/lib/components/chat/formatters/Tools.svelte +69 -69
  193. package/frontend/lib/components/chat/formatters/index.ts +2 -2
  194. package/frontend/lib/components/chat/input/ChatInput.svelte +421 -421
  195. package/frontend/lib/components/chat/input/components/ChatInputActions.svelte +78 -78
  196. package/frontend/lib/components/chat/input/components/DragDropOverlay.svelte +30 -30
  197. package/frontend/lib/components/chat/input/components/EditModeIndicator.svelte +33 -33
  198. package/frontend/lib/components/chat/input/components/EngineModelPicker.svelte +619 -619
  199. package/frontend/lib/components/chat/input/components/FileAttachmentPreview.svelte +48 -48
  200. package/frontend/lib/components/chat/input/components/LoadingIndicator.svelte +31 -31
  201. package/frontend/lib/components/chat/input/composables/use-animations.svelte.ts +201 -201
  202. package/frontend/lib/components/chat/input/composables/use-chat-actions.svelte.ts +148 -148
  203. package/frontend/lib/components/chat/input/composables/use-file-handling.svelte.ts +216 -216
  204. package/frontend/lib/components/chat/input/composables/use-input-state.svelte.ts +357 -357
  205. package/frontend/lib/components/chat/input/composables/use-textarea-resize.svelte.ts +57 -57
  206. package/frontend/lib/components/chat/message/ChatMessage.svelte +478 -478
  207. package/frontend/lib/components/chat/message/ChatMessages.svelte +541 -541
  208. package/frontend/lib/components/chat/message/DateSeparator.svelte +86 -86
  209. package/frontend/lib/components/chat/message/MessageBubble.svelte +86 -86
  210. package/frontend/lib/components/chat/message/MessageHeader.svelte +157 -157
  211. package/frontend/lib/components/chat/modal/DebugModal.svelte +59 -59
  212. package/frontend/lib/components/chat/modal/TokenUsageModal.svelte +124 -124
  213. package/frontend/lib/components/chat/shared/index.ts +1 -1
  214. package/frontend/lib/components/chat/shared/utils.ts +115 -115
  215. package/frontend/lib/components/chat/tools/BashOutputTool.svelte +35 -35
  216. package/frontend/lib/components/chat/tools/BashTool.svelte +45 -45
  217. package/frontend/lib/components/chat/tools/CustomMcpTool.svelte +139 -139
  218. package/frontend/lib/components/chat/tools/EditTool.svelte +47 -47
  219. package/frontend/lib/components/chat/tools/ExitPlanModeTool.svelte +31 -31
  220. package/frontend/lib/components/chat/tools/GlobTool.svelte +50 -50
  221. package/frontend/lib/components/chat/tools/GrepTool.svelte +89 -89
  222. package/frontend/lib/components/chat/tools/KillShellTool.svelte +25 -25
  223. package/frontend/lib/components/chat/tools/ListMcpResourcesTool.svelte +30 -30
  224. package/frontend/lib/components/chat/tools/NotebookEditTool.svelte +37 -37
  225. package/frontend/lib/components/chat/tools/ReadMcpResourceTool.svelte +33 -33
  226. package/frontend/lib/components/chat/tools/ReadTool.svelte +40 -40
  227. package/frontend/lib/components/chat/tools/TaskTool.svelte +63 -63
  228. package/frontend/lib/components/chat/tools/TodoWriteTool.svelte +74 -74
  229. package/frontend/lib/components/chat/tools/WebFetchTool.svelte +34 -34
  230. package/frontend/lib/components/chat/tools/WebSearchTool.svelte +83 -83
  231. package/frontend/lib/components/chat/tools/WriteTool.svelte +32 -32
  232. package/frontend/lib/components/chat/tools/components/CodeBlock.svelte +78 -78
  233. package/frontend/lib/components/chat/tools/components/DiffBlock.svelte +407 -407
  234. package/frontend/lib/components/chat/tools/components/FileHeader.svelte +45 -45
  235. package/frontend/lib/components/chat/tools/components/InfoLine.svelte +18 -18
  236. package/frontend/lib/components/chat/tools/components/StatsBadges.svelte +26 -26
  237. package/frontend/lib/components/chat/tools/components/TerminalCommand.svelte +53 -53
  238. package/frontend/lib/components/chat/tools/components/index.ts +7 -7
  239. package/frontend/lib/components/chat/tools/index.ts +25 -25
  240. package/frontend/lib/components/chat/widgets/FloatingTodoList.svelte +248 -248
  241. package/frontend/lib/components/chat/widgets/TokenUsage.svelte +78 -78
  242. package/frontend/lib/components/checkpoint/TimelineModal.svelte +391 -391
  243. package/frontend/lib/components/checkpoint/timeline/TimelineEdge.svelte +26 -26
  244. package/frontend/lib/components/checkpoint/timeline/TimelineGraph.svelte +86 -86
  245. package/frontend/lib/components/checkpoint/timeline/TimelineNode.svelte +108 -108
  246. package/frontend/lib/components/checkpoint/timeline/TimelineVersionGroup.svelte +59 -59
  247. package/frontend/lib/components/checkpoint/timeline/animation.ts +168 -168
  248. package/frontend/lib/components/checkpoint/timeline/config.ts +44 -44
  249. package/frontend/lib/components/checkpoint/timeline/graph-builder.ts +304 -304
  250. package/frontend/lib/components/checkpoint/timeline/types.ts +65 -65
  251. package/frontend/lib/components/checkpoint/timeline/utils.ts +53 -53
  252. package/frontend/lib/components/common/Alert.svelte +138 -138
  253. package/frontend/lib/components/common/AvatarBubble.svelte +55 -55
  254. package/frontend/lib/components/common/Button.svelte +71 -71
  255. package/frontend/lib/components/common/Card.svelte +102 -102
  256. package/frontend/lib/components/common/Checkbox.svelte +48 -48
  257. package/frontend/lib/components/common/Dialog.svelte +248 -248
  258. package/frontend/lib/components/common/FolderBrowser.svelte +842 -842
  259. package/frontend/lib/components/common/Icon.svelte +57 -57
  260. package/frontend/lib/components/common/Input.svelte +72 -72
  261. package/frontend/lib/components/common/Lightbox.svelte +232 -232
  262. package/frontend/lib/components/common/LoadingScreen.svelte +52 -52
  263. package/frontend/lib/components/common/LoadingSpinner.svelte +48 -48
  264. package/frontend/lib/components/common/Modal.svelte +177 -177
  265. package/frontend/lib/components/common/ModalProvider.svelte +27 -27
  266. package/frontend/lib/components/common/ModelSelector.svelte +110 -110
  267. package/frontend/lib/components/common/MonacoEditor.svelte +568 -568
  268. package/frontend/lib/components/common/NotificationToast.svelte +113 -113
  269. package/frontend/lib/components/common/PageTemplate.svelte +75 -75
  270. package/frontend/lib/components/common/ProjectUserAvatars.svelte +79 -79
  271. package/frontend/lib/components/common/Select.svelte +97 -97
  272. package/frontend/lib/components/common/Textarea.svelte +79 -79
  273. package/frontend/lib/components/common/ThemeToggle.svelte +44 -44
  274. package/frontend/lib/components/common/lucide-icons.ts +1642 -1642
  275. package/frontend/lib/components/common/material-icons.ts +1082 -1082
  276. package/frontend/lib/components/common/xterm/XTerm.svelte +809 -795
  277. package/frontend/lib/components/common/xterm/index.ts +15 -15
  278. package/frontend/lib/components/common/xterm/terminal-config.ts +67 -67
  279. package/frontend/lib/components/common/xterm/types.ts +30 -30
  280. package/frontend/lib/components/common/xterm/xterm-service.ts +379 -353
  281. package/frontend/lib/components/files/FileNode.svelte +383 -383
  282. package/frontend/lib/components/files/FileTree.svelte +681 -681
  283. package/frontend/lib/components/files/FileViewer.svelte +728 -728
  284. package/frontend/lib/components/files/SearchResults.svelte +303 -303
  285. package/frontend/lib/components/git/BranchManager.svelte +458 -458
  286. package/frontend/lib/components/git/ChangesSection.svelte +107 -107
  287. package/frontend/lib/components/git/CommitForm.svelte +76 -76
  288. package/frontend/lib/components/git/ConflictResolver.svelte +158 -158
  289. package/frontend/lib/components/git/DiffViewer.svelte +364 -364
  290. package/frontend/lib/components/git/FileChangeItem.svelte +97 -97
  291. package/frontend/lib/components/git/GitButton.svelte +33 -33
  292. package/frontend/lib/components/git/GitLog.svelte +361 -361
  293. package/frontend/lib/components/git/GitModal.svelte +80 -80
  294. package/frontend/lib/components/history/HistoryModal.svelte +563 -563
  295. package/frontend/lib/components/history/HistoryView.svelte +614 -614
  296. package/frontend/lib/components/index.ts +34 -34
  297. package/frontend/lib/components/preview/browser/BrowserPreview.svelte +549 -549
  298. package/frontend/lib/components/preview/browser/components/Canvas.svelte +1058 -1058
  299. package/frontend/lib/components/preview/browser/components/ConsolePanel.svelte +756 -756
  300. package/frontend/lib/components/preview/browser/components/Container.svelte +450 -450
  301. package/frontend/lib/components/preview/browser/components/ContextMenu.svelte +236 -236
  302. package/frontend/lib/components/preview/browser/components/SelectDropdown.svelte +224 -224
  303. package/frontend/lib/components/preview/browser/components/Toolbar.svelte +338 -338
  304. package/frontend/lib/components/preview/browser/components/VirtualCursor.svelte +35 -35
  305. package/frontend/lib/components/preview/browser/core/cleanup.svelte.ts +155 -155
  306. package/frontend/lib/components/preview/browser/core/coordinator.svelte.ts +837 -837
  307. package/frontend/lib/components/preview/browser/core/interactions.svelte.ts +113 -113
  308. package/frontend/lib/components/preview/browser/core/mcp-handlers.svelte.ts +296 -296
  309. package/frontend/lib/components/preview/browser/core/native-ui-handlers.svelte.ts +391 -391
  310. package/frontend/lib/components/preview/browser/core/stream-handler.svelte.ts +231 -231
  311. package/frontend/lib/components/preview/browser/core/tab-manager.svelte.ts +210 -210
  312. package/frontend/lib/components/preview/browser/core/tab-operations.svelte.ts +239 -239
  313. package/frontend/lib/components/preview/index.ts +1 -1
  314. package/frontend/lib/components/settings/SettingsModal.svelte +235 -235
  315. package/frontend/lib/components/settings/SettingsView.svelte +36 -36
  316. package/frontend/lib/components/settings/appearance/AppearanceSettings.svelte +51 -51
  317. package/frontend/lib/components/settings/appearance/LayoutPresetSettings.svelte +160 -160
  318. package/frontend/lib/components/settings/appearance/LayoutPreview.svelte +76 -76
  319. package/frontend/lib/components/settings/engines/AIEnginesSettings.svelte +917 -917
  320. package/frontend/lib/components/settings/general/AdvancedSettings.svelte +187 -187
  321. package/frontend/lib/components/settings/general/DataManagementSettings.svelte +203 -203
  322. package/frontend/lib/components/settings/general/GeneralSettings.svelte +10 -10
  323. package/frontend/lib/components/settings/model/ModelSettings.svelte +357 -357
  324. package/frontend/lib/components/settings/notifications/NotificationSettings.svelte +205 -205
  325. package/frontend/lib/components/settings/user/UserSettings.svelte +197 -197
  326. package/frontend/lib/components/terminal/Terminal.svelte +367 -367
  327. package/frontend/lib/components/terminal/TerminalTabs.svelte +87 -87
  328. package/frontend/lib/components/terminal/TerminalView.svelte +54 -54
  329. package/frontend/lib/components/tunnel/TunnelActive.svelte +157 -142
  330. package/frontend/lib/components/tunnel/TunnelButton.svelte +60 -54
  331. package/frontend/lib/components/tunnel/TunnelInactive.svelte +285 -284
  332. package/frontend/lib/components/tunnel/TunnelModal.svelte +48 -47
  333. package/frontend/lib/components/tunnel/TunnelQRCode.svelte +49 -49
  334. package/frontend/lib/components/workspace/DesktopNavigator.svelte +382 -382
  335. package/frontend/lib/components/workspace/MobileNavigator.svelte +394 -403
  336. package/frontend/lib/components/workspace/PanelContainer.svelte +100 -100
  337. package/frontend/lib/components/workspace/PanelHeader.svelte +505 -505
  338. package/frontend/lib/components/workspace/ViewMenu.svelte +162 -162
  339. package/frontend/lib/components/workspace/WorkspaceLayout.svelte +169 -169
  340. package/frontend/lib/components/workspace/layout/DesktopLayout.svelte +15 -15
  341. package/frontend/lib/components/workspace/layout/MobileLayout.svelte +17 -17
  342. package/frontend/lib/components/workspace/layout/split-pane/Container.svelte +42 -42
  343. package/frontend/lib/components/workspace/layout/split-pane/Handle.svelte +84 -84
  344. package/frontend/lib/components/workspace/layout/split-pane/Layout.svelte +37 -37
  345. package/frontend/lib/components/workspace/panels/ChatPanel.svelte +274 -274
  346. package/frontend/lib/components/workspace/panels/FilesPanel.svelte +1261 -1261
  347. package/frontend/lib/components/workspace/panels/GitPanel.svelte +1560 -1560
  348. package/frontend/lib/components/workspace/panels/PreviewPanel.svelte +150 -150
  349. package/frontend/lib/components/workspace/panels/TerminalPanel.svelte +73 -73
  350. package/frontend/lib/constants/preview.ts +44 -44
  351. package/frontend/lib/services/chat/chat.service.ts +704 -704
  352. package/frontend/lib/services/chat/index.ts +6 -6
  353. package/frontend/lib/services/notification/global-stream-monitor.ts +86 -86
  354. package/frontend/lib/services/notification/index.ts +7 -7
  355. package/frontend/lib/services/notification/push.service.ts +143 -143
  356. package/frontend/lib/services/notification/sound.service.ts +126 -126
  357. package/frontend/lib/services/preview/browser/browser-console.service.ts +61 -61
  358. package/frontend/lib/services/preview/browser/browser-webcodecs.service.ts +1499 -1499
  359. package/frontend/lib/services/preview/browser/mcp-integration.svelte.ts +67 -67
  360. package/frontend/lib/services/preview/index.ts +22 -22
  361. package/frontend/lib/services/project/index.ts +7 -7
  362. package/frontend/lib/services/project/status.service.ts +159 -159
  363. package/frontend/lib/services/snapshot/snapshot.service.ts +47 -47
  364. package/frontend/lib/services/terminal/background/index.ts +129 -129
  365. package/frontend/lib/services/terminal/background/session-restore.ts +273 -273
  366. package/frontend/lib/services/terminal/background/stream-manager.ts +285 -285
  367. package/frontend/lib/services/terminal/index.ts +13 -13
  368. package/frontend/lib/services/terminal/persistence.service.ts +260 -260
  369. package/frontend/lib/services/terminal/project.service.ts +952 -952
  370. package/frontend/lib/services/terminal/session.service.ts +363 -363
  371. package/frontend/lib/services/terminal/terminal.service.ts +369 -369
  372. package/frontend/lib/stores/core/app.svelte.ts +117 -117
  373. package/frontend/lib/stores/core/files.svelte.ts +72 -72
  374. package/frontend/lib/stores/core/presence.svelte.ts +48 -48
  375. package/frontend/lib/stores/core/projects.svelte.ts +317 -317
  376. package/frontend/lib/stores/core/sessions.svelte.ts +383 -383
  377. package/frontend/lib/stores/features/claude-accounts.svelte.ts +58 -58
  378. package/frontend/lib/stores/features/models.svelte.ts +89 -89
  379. package/frontend/lib/stores/features/settings.svelte.ts +87 -87
  380. package/frontend/lib/stores/features/terminal.svelte.ts +700 -700
  381. package/frontend/lib/stores/features/tunnel.svelte.ts +163 -161
  382. package/frontend/lib/stores/features/user.svelte.ts +95 -95
  383. package/frontend/lib/stores/ui/chat-input.svelte.ts +56 -56
  384. package/frontend/lib/stores/ui/chat-model.svelte.ts +61 -61
  385. package/frontend/lib/stores/ui/dialog.svelte.ts +58 -58
  386. package/frontend/lib/stores/ui/edit-mode.svelte.ts +214 -214
  387. package/frontend/lib/stores/ui/notification.svelte.ts +166 -166
  388. package/frontend/lib/stores/ui/settings-modal.svelte.ts +88 -88
  389. package/frontend/lib/stores/ui/theme.svelte.ts +179 -179
  390. package/frontend/lib/stores/ui/workspace.svelte.ts +754 -754
  391. package/frontend/lib/types/native-ui.ts +73 -73
  392. package/frontend/lib/utils/chat/date-separator.ts +38 -38
  393. package/frontend/lib/utils/chat/message-grouper.ts +218 -218
  394. package/frontend/lib/utils/chat/message-processor.ts +134 -134
  395. package/frontend/lib/utils/chat/tool-handler.ts +160 -160
  396. package/frontend/lib/utils/chat/virtual-scroll.svelte.ts +142 -142
  397. package/frontend/lib/utils/click-outside.ts +20 -20
  398. package/frontend/lib/utils/context-manager.ts +256 -256
  399. package/frontend/lib/utils/file-icon-mappings.ts +768 -768
  400. package/frontend/lib/utils/folder-icon-mappings.ts +1029 -1029
  401. package/frontend/lib/utils/git-status.ts +68 -68
  402. package/frontend/lib/utils/platform.ts +112 -112
  403. package/frontend/lib/utils/port-check.ts +64 -64
  404. package/frontend/lib/utils/terminalFormatter.ts +206 -206
  405. package/frontend/lib/utils/theme.ts +6 -6
  406. package/frontend/lib/utils/tree-visualizer.ts +320 -320
  407. package/frontend/lib/utils/ws.ts +44 -44
  408. package/frontend/main.ts +13 -13
  409. package/index.html +70 -70
  410. package/package.json +111 -111
  411. package/scripts/generate-icons.ts +86 -86
  412. package/scripts/pre-publish-check.sh +142 -142
  413. package/scripts/setup-hooks.sh +134 -134
  414. package/scripts/validate-branch-name.sh +47 -47
  415. package/scripts/validate-commit-msg.sh +42 -42
  416. package/shared/constants/engines.ts +134 -134
  417. package/shared/types/database/connection.ts +15 -15
  418. package/shared/types/database/index.ts +5 -5
  419. package/shared/types/database/schema.ts +140 -140
  420. package/shared/types/engine/index.ts +45 -45
  421. package/shared/types/filesystem/index.ts +21 -21
  422. package/shared/types/git.ts +171 -171
  423. package/shared/types/messaging/index.ts +238 -238
  424. package/shared/types/messaging/tool.ts +525 -525
  425. package/shared/types/network/api.ts +17 -17
  426. package/shared/types/network/index.ts +4 -4
  427. package/shared/types/stores/app.ts +22 -22
  428. package/shared/types/stores/dialog.ts +20 -20
  429. package/shared/types/stores/index.ts +2 -2
  430. package/shared/types/stores/settings.ts +15 -15
  431. package/shared/types/terminal/index.ts +43 -43
  432. package/shared/types/ui/components.ts +60 -60
  433. package/shared/types/ui/icons.ts +22 -22
  434. package/shared/types/ui/index.ts +21 -21
  435. package/shared/types/ui/notifications.ts +13 -13
  436. package/shared/types/ui/theme.ts +11 -11
  437. package/shared/types/websocket/index.ts +43 -43
  438. package/shared/types/window.d.ts +12 -12
  439. package/shared/utils/anonymous-user.ts +167 -167
  440. package/shared/utils/async.ts +10 -10
  441. package/shared/utils/diff-calculator.ts +184 -184
  442. package/shared/utils/file-type-detection.ts +165 -165
  443. package/shared/utils/logger.ts +144 -158
  444. package/shared/utils/message-formatter.ts +79 -79
  445. package/shared/utils/path.ts +47 -47
  446. package/shared/utils/ws-client.ts +768 -768
  447. package/shared/utils/ws-server.ts +660 -660
  448. package/static/favicon.svg +7 -7
  449. package/static/fonts/dm-sans.css +96 -96
  450. package/svelte.config.js +20 -20
  451. package/tsconfig.json +41 -41
  452. package/vite.config.ts +33 -33
  453. package/.github/workflows/test.yml +0 -40
@@ -1,156 +1,156 @@
1
- /**
2
- * Migration: Git-Like Commit Graph System
3
- * Purpose: Implement parent-child relationships for messages (like git commits)
4
- *
5
- * Changes:
6
- * - Add parent_message_id to messages (commit parent pointer)
7
- * - Add current_head_message_id to chat_sessions (branch HEAD pointer)
8
- * - Build parent links from existing messages
9
- * - Clear old branch data (reset is_deleted, branch_id)
10
- * - Add branches table for tracking named branches
11
- */
12
-
13
- import type { DatabaseConnection } from '$shared/types/database/connection';
14
-
15
- import { debug } from '$shared/utils/logger';
16
- export const description = 'Implement git-like commit graph with parent relationships';
17
-
18
- export const up = (db: DatabaseConnection): void => {
19
- debug.log('migration', '📋 Implementing git-like commit graph system...');
20
-
21
- // 1. Add parent_message_id to messages table
22
- db.exec(`
23
- ALTER TABLE messages
24
- ADD COLUMN parent_message_id TEXT
25
- `);
26
-
27
- // 2. Add current_head_message_id to chat_sessions table
28
- db.exec(`
29
- ALTER TABLE chat_sessions
30
- ADD COLUMN current_head_message_id TEXT
31
- `);
32
-
33
- // 3. Create branches table for tracking named branches
34
- db.exec(`
35
- CREATE TABLE IF NOT EXISTS branches (
36
- id TEXT PRIMARY KEY,
37
- session_id TEXT NOT NULL,
38
- branch_name TEXT NOT NULL,
39
- head_message_id TEXT NOT NULL,
40
- created_at TEXT NOT NULL,
41
- FOREIGN KEY (session_id) REFERENCES chat_sessions(id) ON DELETE CASCADE,
42
- FOREIGN KEY (head_message_id) REFERENCES messages(id) ON DELETE CASCADE
43
- )
44
- `);
45
-
46
- // 4. Build parent links for existing messages (by timestamp order per session)
47
- debug.log('migration', '🔗 Building parent links from existing messages...');
48
-
49
- const sessions = db.prepare('SELECT DISTINCT session_id FROM messages').all() as { session_id: string }[];
50
-
51
- for (const { session_id } of sessions) {
52
- // Get all active messages for this session, ordered by timestamp
53
- const messages = db.prepare(`
54
- SELECT id, timestamp
55
- FROM messages
56
- WHERE session_id = ? AND (is_deleted IS NULL OR is_deleted = 0)
57
- ORDER BY timestamp ASC
58
- `).all(session_id) as { id: string; timestamp: string }[];
59
-
60
- // Build parent links (each message points to previous message)
61
- for (let i = 1; i < messages.length; i++) {
62
- db.prepare(`
63
- UPDATE messages
64
- SET parent_message_id = ?
65
- WHERE id = ?
66
- `).run(messages[i - 1].id, messages[i].id);
67
- }
68
-
69
- // Set session HEAD to last message
70
- if (messages.length > 0) {
71
- const lastMessage = messages[messages.length - 1];
72
- db.prepare(`
73
- UPDATE chat_sessions
74
- SET current_head_message_id = ?
75
- WHERE id = ?
76
- `).run(lastMessage.id, session_id);
77
- }
78
-
79
- debug.log('migration', ` ✓ Built ${messages.length - 1} parent links for session ${session_id}`);
80
- }
81
-
82
- // 5. Clear old branch data (fresh start)
83
- debug.log('migration', '🧹 Clearing old branch data...');
84
-
85
- // Reset all is_deleted to 0 (all messages visible again)
86
- db.exec(`
87
- UPDATE messages
88
- SET is_deleted = 0
89
- WHERE is_deleted = 1
90
- `);
91
-
92
- // Clear all branch_id (will be reassigned on undo)
93
- db.exec(`
94
- UPDATE messages
95
- SET branch_id = NULL
96
- WHERE branch_id IS NOT NULL
97
- `);
98
-
99
- // Clear snapshot soft deletes
100
- db.exec(`
101
- UPDATE message_snapshots
102
- SET is_deleted = 0
103
- WHERE is_deleted = 1
104
- `);
105
-
106
- db.exec(`
107
- UPDATE message_snapshots
108
- SET branch_id = NULL
109
- WHERE branch_id IS NOT NULL
110
- `);
111
-
112
- // 6. Create indexes for fast graph traversal
113
- db.exec(`
114
- CREATE INDEX idx_messages_parent_id ON messages(parent_message_id)
115
- `);
116
-
117
- db.exec(`
118
- CREATE INDEX idx_messages_session_parent ON messages(session_id, parent_message_id)
119
- `);
120
-
121
- db.exec(`
122
- CREATE INDEX idx_branches_session ON branches(session_id)
123
- `);
124
-
125
- db.exec(`
126
- CREATE INDEX idx_branches_head ON branches(head_message_id)
127
- `);
128
-
129
- db.exec(`
130
- CREATE INDEX idx_chat_sessions_head ON chat_sessions(current_head_message_id)
131
- `);
132
-
133
- debug.log('migration', '✅ Git-like commit graph system implemented successfully!');
134
- debug.log('migration', ' 📊 All existing messages preserved with parent links');
135
- debug.log('migration', ' 🔄 Old branch data cleared (fresh start)');
136
- };
137
-
138
- export const down = (db: DatabaseConnection): void => {
139
- debug.log('migration', '🗑️ Removing git-like commit graph system...');
140
-
141
- // Drop indexes
142
- db.exec('DROP INDEX IF EXISTS idx_chat_sessions_head');
143
- db.exec('DROP INDEX IF EXISTS idx_branches_head');
144
- db.exec('DROP INDEX IF EXISTS idx_branches_session');
145
- db.exec('DROP INDEX IF EXISTS idx_messages_session_parent');
146
- db.exec('DROP INDEX IF EXISTS idx_messages_parent_id');
147
-
148
- // Drop branches table
149
- db.exec('DROP TABLE IF EXISTS branches');
150
-
151
- // Note: SQLite doesn't support DROP COLUMN easily
152
- // Columns parent_message_id and current_head_message_id remain but unused
153
- debug.warn('migration', '⚠️ Columns parent_message_id and current_head_message_id remain but unused');
154
-
155
- debug.log('migration', '✅ Git-like commit graph system rollback completed');
156
- };
1
+ /**
2
+ * Migration: Git-Like Commit Graph System
3
+ * Purpose: Implement parent-child relationships for messages (like git commits)
4
+ *
5
+ * Changes:
6
+ * - Add parent_message_id to messages (commit parent pointer)
7
+ * - Add current_head_message_id to chat_sessions (branch HEAD pointer)
8
+ * - Build parent links from existing messages
9
+ * - Clear old branch data (reset is_deleted, branch_id)
10
+ * - Add branches table for tracking named branches
11
+ */
12
+
13
+ import type { DatabaseConnection } from '$shared/types/database/connection';
14
+
15
+ import { debug } from '$shared/utils/logger';
16
+ export const description = 'Implement git-like commit graph with parent relationships';
17
+
18
+ export const up = (db: DatabaseConnection): void => {
19
+ debug.log('migration', '📋 Implementing git-like commit graph system...');
20
+
21
+ // 1. Add parent_message_id to messages table
22
+ db.exec(`
23
+ ALTER TABLE messages
24
+ ADD COLUMN parent_message_id TEXT
25
+ `);
26
+
27
+ // 2. Add current_head_message_id to chat_sessions table
28
+ db.exec(`
29
+ ALTER TABLE chat_sessions
30
+ ADD COLUMN current_head_message_id TEXT
31
+ `);
32
+
33
+ // 3. Create branches table for tracking named branches
34
+ db.exec(`
35
+ CREATE TABLE IF NOT EXISTS branches (
36
+ id TEXT PRIMARY KEY,
37
+ session_id TEXT NOT NULL,
38
+ branch_name TEXT NOT NULL,
39
+ head_message_id TEXT NOT NULL,
40
+ created_at TEXT NOT NULL,
41
+ FOREIGN KEY (session_id) REFERENCES chat_sessions(id) ON DELETE CASCADE,
42
+ FOREIGN KEY (head_message_id) REFERENCES messages(id) ON DELETE CASCADE
43
+ )
44
+ `);
45
+
46
+ // 4. Build parent links for existing messages (by timestamp order per session)
47
+ debug.log('migration', '🔗 Building parent links from existing messages...');
48
+
49
+ const sessions = db.prepare('SELECT DISTINCT session_id FROM messages').all() as { session_id: string }[];
50
+
51
+ for (const { session_id } of sessions) {
52
+ // Get all active messages for this session, ordered by timestamp
53
+ const messages = db.prepare(`
54
+ SELECT id, timestamp
55
+ FROM messages
56
+ WHERE session_id = ? AND (is_deleted IS NULL OR is_deleted = 0)
57
+ ORDER BY timestamp ASC
58
+ `).all(session_id) as { id: string; timestamp: string }[];
59
+
60
+ // Build parent links (each message points to previous message)
61
+ for (let i = 1; i < messages.length; i++) {
62
+ db.prepare(`
63
+ UPDATE messages
64
+ SET parent_message_id = ?
65
+ WHERE id = ?
66
+ `).run(messages[i - 1].id, messages[i].id);
67
+ }
68
+
69
+ // Set session HEAD to last message
70
+ if (messages.length > 0) {
71
+ const lastMessage = messages[messages.length - 1];
72
+ db.prepare(`
73
+ UPDATE chat_sessions
74
+ SET current_head_message_id = ?
75
+ WHERE id = ?
76
+ `).run(lastMessage.id, session_id);
77
+ }
78
+
79
+ debug.log('migration', ` ✓ Built ${messages.length - 1} parent links for session ${session_id}`);
80
+ }
81
+
82
+ // 5. Clear old branch data (fresh start)
83
+ debug.log('migration', '🧹 Clearing old branch data...');
84
+
85
+ // Reset all is_deleted to 0 (all messages visible again)
86
+ db.exec(`
87
+ UPDATE messages
88
+ SET is_deleted = 0
89
+ WHERE is_deleted = 1
90
+ `);
91
+
92
+ // Clear all branch_id (will be reassigned on undo)
93
+ db.exec(`
94
+ UPDATE messages
95
+ SET branch_id = NULL
96
+ WHERE branch_id IS NOT NULL
97
+ `);
98
+
99
+ // Clear snapshot soft deletes
100
+ db.exec(`
101
+ UPDATE message_snapshots
102
+ SET is_deleted = 0
103
+ WHERE is_deleted = 1
104
+ `);
105
+
106
+ db.exec(`
107
+ UPDATE message_snapshots
108
+ SET branch_id = NULL
109
+ WHERE branch_id IS NOT NULL
110
+ `);
111
+
112
+ // 6. Create indexes for fast graph traversal
113
+ db.exec(`
114
+ CREATE INDEX idx_messages_parent_id ON messages(parent_message_id)
115
+ `);
116
+
117
+ db.exec(`
118
+ CREATE INDEX idx_messages_session_parent ON messages(session_id, parent_message_id)
119
+ `);
120
+
121
+ db.exec(`
122
+ CREATE INDEX idx_branches_session ON branches(session_id)
123
+ `);
124
+
125
+ db.exec(`
126
+ CREATE INDEX idx_branches_head ON branches(head_message_id)
127
+ `);
128
+
129
+ db.exec(`
130
+ CREATE INDEX idx_chat_sessions_head ON chat_sessions(current_head_message_id)
131
+ `);
132
+
133
+ debug.log('migration', '✅ Git-like commit graph system implemented successfully!');
134
+ debug.log('migration', ' 📊 All existing messages preserved with parent links');
135
+ debug.log('migration', ' 🔄 Old branch data cleared (fresh start)');
136
+ };
137
+
138
+ export const down = (db: DatabaseConnection): void => {
139
+ debug.log('migration', '🗑️ Removing git-like commit graph system...');
140
+
141
+ // Drop indexes
142
+ db.exec('DROP INDEX IF EXISTS idx_chat_sessions_head');
143
+ db.exec('DROP INDEX IF EXISTS idx_branches_head');
144
+ db.exec('DROP INDEX IF EXISTS idx_branches_session');
145
+ db.exec('DROP INDEX IF EXISTS idx_messages_session_parent');
146
+ db.exec('DROP INDEX IF EXISTS idx_messages_parent_id');
147
+
148
+ // Drop branches table
149
+ db.exec('DROP TABLE IF EXISTS branches');
150
+
151
+ // Note: SQLite doesn't support DROP COLUMN easily
152
+ // Columns parent_message_id and current_head_message_id remain but unused
153
+ debug.warn('migration', '⚠️ Columns parent_message_id and current_head_message_id remain but unused');
154
+
155
+ debug.log('migration', '✅ Git-like commit graph system rollback completed');
156
+ };
@@ -1,41 +1,41 @@
1
- /**
2
- * Migration: Add file change statistics to message snapshots
3
- * Purpose: Store git-like file change stats (files changed, insertions, deletions)
4
- */
5
-
6
- import type { DatabaseConnection } from '$shared/types/database/connection';
7
- import { debug } from '$shared/utils/logger';
8
-
9
- export const description = 'Add file change statistics to message snapshots';
10
-
11
- export const up = (db: DatabaseConnection): void => {
12
- debug.log('migration', '📊 Adding file change statistics fields...');
13
-
14
- // Add columns for file change statistics
15
- db.exec(`
16
- ALTER TABLE message_snapshots
17
- ADD COLUMN files_changed INTEGER DEFAULT 0
18
- `);
19
-
20
- db.exec(`
21
- ALTER TABLE message_snapshots
22
- ADD COLUMN insertions INTEGER DEFAULT 0
23
- `);
24
-
25
- db.exec(`
26
- ALTER TABLE message_snapshots
27
- ADD COLUMN deletions INTEGER DEFAULT 0
28
- `);
29
-
30
- debug.log('migration', '✅ File change statistics fields added');
31
- };
32
-
33
- export const down = (db: DatabaseConnection): void => {
34
- debug.log('migration', '🗑️ Removing file change statistics fields...');
35
-
36
- // SQLite doesn't support DROP COLUMN easily, so we'd need to recreate table
37
- // For now, this is a forward-only migration
38
- debug.warn('migration', '⚠️ Rollback not implemented for file change statistics');
39
-
40
- debug.log('migration', '✅ File change statistics rollback skipped');
41
- };
1
+ /**
2
+ * Migration: Add file change statistics to message snapshots
3
+ * Purpose: Store git-like file change stats (files changed, insertions, deletions)
4
+ */
5
+
6
+ import type { DatabaseConnection } from '$shared/types/database/connection';
7
+ import { debug } from '$shared/utils/logger';
8
+
9
+ export const description = 'Add file change statistics to message snapshots';
10
+
11
+ export const up = (db: DatabaseConnection): void => {
12
+ debug.log('migration', '📊 Adding file change statistics fields...');
13
+
14
+ // Add columns for file change statistics
15
+ db.exec(`
16
+ ALTER TABLE message_snapshots
17
+ ADD COLUMN files_changed INTEGER DEFAULT 0
18
+ `);
19
+
20
+ db.exec(`
21
+ ALTER TABLE message_snapshots
22
+ ADD COLUMN insertions INTEGER DEFAULT 0
23
+ `);
24
+
25
+ db.exec(`
26
+ ALTER TABLE message_snapshots
27
+ ADD COLUMN deletions INTEGER DEFAULT 0
28
+ `);
29
+
30
+ debug.log('migration', '✅ File change statistics fields added');
31
+ };
32
+
33
+ export const down = (db: DatabaseConnection): void => {
34
+ debug.log('migration', '🗑️ Removing file change statistics fields...');
35
+
36
+ // SQLite doesn't support DROP COLUMN easily, so we'd need to recreate table
37
+ // For now, this is a forward-only migration
38
+ debug.warn('migration', '⚠️ Rollback not implemented for file change statistics');
39
+
40
+ debug.log('migration', '✅ File change statistics rollback skipped');
41
+ };
@@ -1,118 +1,118 @@
1
- /**
2
- * Migration: Checkpoint Tree State
3
- * Purpose: Track active child per checkpoint for tree display ordering.
4
- * This replaces the fragile branch_id-based approach with a clean
5
- * parent-child tracking mechanism.
6
- */
7
-
8
- import type { DatabaseConnection } from '$shared/types/database/connection';
9
- import { debug } from '$shared/utils/logger';
10
-
11
- export const description = 'Add checkpoint tree state for display ordering';
12
-
13
- export const up = (db: DatabaseConnection): void => {
14
- debug.log('migration', '📋 Creating checkpoint_tree_state table...');
15
-
16
- // Track which child checkpoint continues the "main line" (straight)
17
- // at each branch point. This is used for tree display ordering.
18
- db.exec(`
19
- CREATE TABLE IF NOT EXISTS checkpoint_tree_state (
20
- session_id TEXT NOT NULL,
21
- parent_checkpoint_id TEXT NOT NULL,
22
- active_child_id TEXT NOT NULL,
23
- PRIMARY KEY (session_id, parent_checkpoint_id)
24
- )
25
- `);
26
-
27
- db.exec(`
28
- CREATE INDEX IF NOT EXISTS idx_checkpoint_tree_session
29
- ON checkpoint_tree_state(session_id)
30
- `);
31
-
32
- // Initialize checkpoint_tree_state for existing sessions
33
- // by analyzing HEAD path relationships
34
- debug.log('migration', '🔗 Initializing tree state from existing sessions...');
35
-
36
- const sessions = db.prepare(`
37
- SELECT id, current_head_message_id FROM chat_sessions
38
- WHERE current_head_message_id IS NOT NULL
39
- `).all() as { id: string; current_head_message_id: string }[];
40
-
41
- for (const session of sessions) {
42
- try {
43
- // Walk HEAD path from head to root
44
- const path: string[] = [];
45
- let currentId: string | null = session.current_head_message_id;
46
-
47
- while (currentId) {
48
- path.unshift(currentId);
49
- const msg = db.prepare(`
50
- SELECT parent_message_id FROM messages WHERE id = ?
51
- `).get(currentId) as { parent_message_id: string | null } | null;
52
- if (!msg) break;
53
- currentId = msg.parent_message_id || null;
54
- }
55
-
56
- // Find checkpoint messages (user messages with text, not tool confirmations)
57
- const checkpointsOnPath: string[] = [];
58
- for (const msgId of path) {
59
- const msg = db.prepare(`
60
- SELECT sdk_message FROM messages WHERE id = ?
61
- `).get(msgId) as { sdk_message: string } | null;
62
- if (!msg) continue;
63
-
64
- try {
65
- const sdk = JSON.parse(msg.sdk_message);
66
- if (sdk.type !== 'user') continue;
67
-
68
- // Check if it's a tool confirmation (not a real user message)
69
- const content = sdk.message?.content;
70
- if (Array.isArray(content) && content.some((b: any) => b.type === 'tool_result')) {
71
- continue;
72
- }
73
-
74
- // Check if it has text
75
- let hasText = false;
76
- if (typeof content === 'string' && content.trim()) {
77
- hasText = true;
78
- } else if (Array.isArray(content)) {
79
- hasText = content.some((b: any) => typeof b === 'object' && 'text' in b && b.text?.trim());
80
- }
81
-
82
- if (hasText) {
83
- checkpointsOnPath.push(msgId);
84
- }
85
- } catch {
86
- // Skip unparseable messages
87
- }
88
- }
89
-
90
- // Set active child for consecutive checkpoints on the path
91
- for (let i = 0; i < checkpointsOnPath.length - 1; i++) {
92
- const parentCp = checkpointsOnPath[i];
93
- const childCp = checkpointsOnPath[i + 1];
94
-
95
- db.prepare(`
96
- INSERT OR REPLACE INTO checkpoint_tree_state
97
- (session_id, parent_checkpoint_id, active_child_id)
98
- VALUES (?, ?, ?)
99
- `).run(session.id, parentCp, childCp);
100
- }
101
-
102
- if (checkpointsOnPath.length > 1) {
103
- debug.log('migration', ` ✓ Session ${session.id}: ${checkpointsOnPath.length - 1} active child links`);
104
- }
105
- } catch (err) {
106
- debug.warn('migration', ` ⚠ Could not process session ${session.id}: ${err}`);
107
- }
108
- }
109
-
110
- debug.log('migration', '✅ Checkpoint tree state created');
111
- };
112
-
113
- export const down = (db: DatabaseConnection): void => {
114
- debug.log('migration', '🗑️ Removing checkpoint tree state...');
115
- db.exec('DROP INDEX IF EXISTS idx_checkpoint_tree_session');
116
- db.exec('DROP TABLE IF EXISTS checkpoint_tree_state');
117
- debug.log('migration', '✅ Checkpoint tree state removed');
118
- };
1
+ /**
2
+ * Migration: Checkpoint Tree State
3
+ * Purpose: Track active child per checkpoint for tree display ordering.
4
+ * This replaces the fragile branch_id-based approach with a clean
5
+ * parent-child tracking mechanism.
6
+ */
7
+
8
+ import type { DatabaseConnection } from '$shared/types/database/connection';
9
+ import { debug } from '$shared/utils/logger';
10
+
11
+ export const description = 'Add checkpoint tree state for display ordering';
12
+
13
+ export const up = (db: DatabaseConnection): void => {
14
+ debug.log('migration', '📋 Creating checkpoint_tree_state table...');
15
+
16
+ // Track which child checkpoint continues the "main line" (straight)
17
+ // at each branch point. This is used for tree display ordering.
18
+ db.exec(`
19
+ CREATE TABLE IF NOT EXISTS checkpoint_tree_state (
20
+ session_id TEXT NOT NULL,
21
+ parent_checkpoint_id TEXT NOT NULL,
22
+ active_child_id TEXT NOT NULL,
23
+ PRIMARY KEY (session_id, parent_checkpoint_id)
24
+ )
25
+ `);
26
+
27
+ db.exec(`
28
+ CREATE INDEX IF NOT EXISTS idx_checkpoint_tree_session
29
+ ON checkpoint_tree_state(session_id)
30
+ `);
31
+
32
+ // Initialize checkpoint_tree_state for existing sessions
33
+ // by analyzing HEAD path relationships
34
+ debug.log('migration', '🔗 Initializing tree state from existing sessions...');
35
+
36
+ const sessions = db.prepare(`
37
+ SELECT id, current_head_message_id FROM chat_sessions
38
+ WHERE current_head_message_id IS NOT NULL
39
+ `).all() as { id: string; current_head_message_id: string }[];
40
+
41
+ for (const session of sessions) {
42
+ try {
43
+ // Walk HEAD path from head to root
44
+ const path: string[] = [];
45
+ let currentId: string | null = session.current_head_message_id;
46
+
47
+ while (currentId) {
48
+ path.unshift(currentId);
49
+ const msg = db.prepare(`
50
+ SELECT parent_message_id FROM messages WHERE id = ?
51
+ `).get(currentId) as { parent_message_id: string | null } | null;
52
+ if (!msg) break;
53
+ currentId = msg.parent_message_id || null;
54
+ }
55
+
56
+ // Find checkpoint messages (user messages with text, not tool confirmations)
57
+ const checkpointsOnPath: string[] = [];
58
+ for (const msgId of path) {
59
+ const msg = db.prepare(`
60
+ SELECT sdk_message FROM messages WHERE id = ?
61
+ `).get(msgId) as { sdk_message: string } | null;
62
+ if (!msg) continue;
63
+
64
+ try {
65
+ const sdk = JSON.parse(msg.sdk_message);
66
+ if (sdk.type !== 'user') continue;
67
+
68
+ // Check if it's a tool confirmation (not a real user message)
69
+ const content = sdk.message?.content;
70
+ if (Array.isArray(content) && content.some((b: any) => b.type === 'tool_result')) {
71
+ continue;
72
+ }
73
+
74
+ // Check if it has text
75
+ let hasText = false;
76
+ if (typeof content === 'string' && content.trim()) {
77
+ hasText = true;
78
+ } else if (Array.isArray(content)) {
79
+ hasText = content.some((b: any) => typeof b === 'object' && 'text' in b && b.text?.trim());
80
+ }
81
+
82
+ if (hasText) {
83
+ checkpointsOnPath.push(msgId);
84
+ }
85
+ } catch {
86
+ // Skip unparseable messages
87
+ }
88
+ }
89
+
90
+ // Set active child for consecutive checkpoints on the path
91
+ for (let i = 0; i < checkpointsOnPath.length - 1; i++) {
92
+ const parentCp = checkpointsOnPath[i];
93
+ const childCp = checkpointsOnPath[i + 1];
94
+
95
+ db.prepare(`
96
+ INSERT OR REPLACE INTO checkpoint_tree_state
97
+ (session_id, parent_checkpoint_id, active_child_id)
98
+ VALUES (?, ?, ?)
99
+ `).run(session.id, parentCp, childCp);
100
+ }
101
+
102
+ if (checkpointsOnPath.length > 1) {
103
+ debug.log('migration', ` ✓ Session ${session.id}: ${checkpointsOnPath.length - 1} active child links`);
104
+ }
105
+ } catch (err) {
106
+ debug.warn('migration', ` ⚠ Could not process session ${session.id}: ${err}`);
107
+ }
108
+ }
109
+
110
+ debug.log('migration', '✅ Checkpoint tree state created');
111
+ };
112
+
113
+ export const down = (db: DatabaseConnection): void => {
114
+ debug.log('migration', '🗑️ Removing checkpoint tree state...');
115
+ db.exec('DROP INDEX IF EXISTS idx_checkpoint_tree_session');
116
+ db.exec('DROP TABLE IF EXISTS checkpoint_tree_state');
117
+ debug.log('migration', '✅ Checkpoint tree state removed');
118
+ };
@@ -1,18 +1,18 @@
1
- import type { DatabaseConnection } from '$shared/types/database/connection';
2
-
3
- import { debug } from '$shared/utils/logger';
4
- export const description = 'Add engine column to chat_sessions table for multi-engine support';
5
-
6
- export const up = (db: DatabaseConnection): void => {
7
- debug.log('migration', '🔧 Adding engine column to chat_sessions...');
8
-
9
- db.exec(`
10
- ALTER TABLE chat_sessions ADD COLUMN engine TEXT DEFAULT 'claude-code'
11
- `);
12
-
13
- debug.log('migration', '✅ Engine column added to chat_sessions');
14
- };
15
-
16
- export const down = (db: DatabaseConnection): void => {
17
- debug.log('migration', '🗑️ SQLite does not support DROP COLUMN directly, skipping...');
18
- };
1
+ import type { DatabaseConnection } from '$shared/types/database/connection';
2
+
3
+ import { debug } from '$shared/utils/logger';
4
+ export const description = 'Add engine column to chat_sessions table for multi-engine support';
5
+
6
+ export const up = (db: DatabaseConnection): void => {
7
+ debug.log('migration', '🔧 Adding engine column to chat_sessions...');
8
+
9
+ db.exec(`
10
+ ALTER TABLE chat_sessions ADD COLUMN engine TEXT DEFAULT 'claude-code'
11
+ `);
12
+
13
+ debug.log('migration', '✅ Engine column added to chat_sessions');
14
+ };
15
+
16
+ export const down = (db: DatabaseConnection): void => {
17
+ debug.log('migration', '🗑️ SQLite does not support DROP COLUMN directly, skipping...');
18
+ };