@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
package/.dockerignore ADDED
@@ -0,0 +1,5 @@
1
+ node_modules
2
+ dist
3
+ logs
4
+ .env
5
+ .git
package/.env.example CHANGED
@@ -1,6 +1,3 @@
1
- # Node Environment (development | production)
2
- NODE_ENV=production
3
-
4
1
  # Server configuration
5
2
  HOST=localhost
6
3
 
@@ -8,5 +5,5 @@ HOST=localhost
8
5
  PORT=9141
9
6
 
10
7
  # Development ports (two ports — Vite proxies to Elysia)
11
- PORT_BACKEND=9151
12
- PORT_FRONTEND=9141
8
+ PORT_FRONTEND=9151
9
+ PORT_BACKEND=9161
package/CONTRIBUTING.md CHANGED
@@ -22,6 +22,10 @@ bun install
22
22
  bun run check
23
23
  ```
24
24
 
25
+ ### Data Directory
26
+
27
+ When running `bun run dev`, Clopen stores data in `~/.clopen-dev` instead of `~/.clopen`. This keeps development data separate from any production instance — especially important since Clopen can be used to develop itself.
28
+
25
29
  ### Keep Updated
26
30
 
27
31
  ```bash
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
 
10
10
  ## Features
11
11
 
12
- - **Multi-Account Claude Code** - Manage multiple accounts (personal, work, team) and switch instantly per session, isolated under `~/.clopen/claude/user/` without touching system-level Claude config
12
+ - **Multi-Account Claude Code** - Manage multiple accounts (personal, work, team) and switch instantly per session, isolated under `~/.clopen/claude/user/` (or `~/.clopen-dev/` in development) without touching system-level Claude config
13
13
  - **Multi-Engine Support** - Switch between Claude Code and OpenCode
14
14
  - **AI Chat Interface** - Streaming responses with tool use visualization
15
15
  - **Background Processing** - Chat, terminal, and other processes continue running even when you close the browser — come back later and pick up where you left off
@@ -92,6 +92,8 @@ bun run dev # Start development server
92
92
  bun run check # Type checking
93
93
  ```
94
94
 
95
+ When running in development mode, Clopen uses `~/.clopen-dev` instead of `~/.clopen`, keeping dev data separate from any production instance.
96
+
95
97
  ---
96
98
 
97
99
  ## Architecture
@@ -123,7 +125,7 @@ Clopen uses an engine-agnostic adapter pattern — both engines normalize output
123
125
  ### Port 9141 Already in Use
124
126
 
125
127
  ```bash
126
- clopen --port 9150
128
+ clopen --port 9145
127
129
  ```
128
130
 
129
131
  Or kill the existing process:
@@ -4,9 +4,9 @@
4
4
  * Core authentication logic: user creation, session management, invite handling.
5
5
  */
6
6
 
7
- import { authQueries, settingsQueries } from '$backend/lib/database/queries';
7
+ import { authQueries, settingsQueries } from '$backend/database/queries';
8
8
  import { generateSessionToken, generatePAT, generateInviteToken, hashToken, getTokenType } from './tokens';
9
- import { generateColorFromString, getInitials } from '$backend/lib/user/helpers';
9
+ import { generateColorFromString, getInitials } from '$backend/utils/user-helpers';
10
10
  import { debug } from '$shared/utils/logger';
11
11
 
12
12
  /** Default session lifetime in days */
@@ -1097,7 +1097,7 @@ class StreamManager extends EventEmitter {
1097
1097
  // Update checkpoint_tree_state when saving a new checkpoint (real user message)
1098
1098
  if (message.type === 'user') {
1099
1099
  try {
1100
- const { isCheckpointMessage, buildCheckpointTree, getCheckpointPathToRoot } = await import('../../lib/snapshot/helpers');
1100
+ const { isCheckpointMessage, buildCheckpointTree, getCheckpointPathToRoot } = await import('../snapshot/helpers');
1101
1101
  const { checkpointQueries } = await import('../database/queries');
1102
1102
 
1103
1103
  // Check if this new message is a checkpoint
@@ -42,6 +42,48 @@ export const messageQueries = {
42
42
  });
43
43
  },
44
44
 
45
+ /**
46
+ * Get minimal preview data for a session: first user msg, last assistant msg, and counts.
47
+ * Used by the Sessions/History modal to avoid loading all messages.
48
+ */
49
+ getSessionPreview(sessionId: string): {
50
+ firstUserMessage: DatabaseMessage | null;
51
+ lastAssistantMessage: DatabaseMessage | null;
52
+ userCount: number;
53
+ assistantCount: number;
54
+ } {
55
+ const db = getDatabase();
56
+
57
+ const firstUserMessage = db.prepare(`
58
+ SELECT * FROM messages
59
+ WHERE session_id = ? AND json_extract(sdk_message, '$.type') = 'user'
60
+ ORDER BY timestamp ASC
61
+ LIMIT 1
62
+ `).get(sessionId) as DatabaseMessage | null;
63
+
64
+ const lastAssistantMessage = db.prepare(`
65
+ SELECT * FROM messages
66
+ WHERE session_id = ? AND json_extract(sdk_message, '$.type') = 'assistant'
67
+ ORDER BY timestamp DESC
68
+ LIMIT 1
69
+ `).get(sessionId) as DatabaseMessage | null;
70
+
71
+ const counts = db.prepare(`
72
+ SELECT
73
+ SUM(CASE WHEN json_extract(sdk_message, '$.type') = 'user' THEN 1 ELSE 0 END) AS user_count,
74
+ SUM(CASE WHEN json_extract(sdk_message, '$.type') = 'assistant' THEN 1 ELSE 0 END) AS assistant_count
75
+ FROM messages
76
+ WHERE session_id = ?
77
+ `).get(sessionId) as { user_count: number; assistant_count: number } | null;
78
+
79
+ return {
80
+ firstUserMessage,
81
+ lastAssistantMessage,
82
+ userCount: counts?.user_count ?? 0,
83
+ assistantCount: counts?.assistant_count ?? 0
84
+ };
85
+ },
86
+
45
87
  /**
46
88
  * Get all messages for a session including deleted ones (for timeline view)
47
89
  */
@@ -1,17 +1,17 @@
1
1
  import { join } from 'path';
2
- import { homedir } from 'os';
3
2
  import { Database } from 'bun:sqlite';
4
3
  import type { DatabaseConnection } from '$shared/types/database/connection';
5
4
 
6
5
  import { debug } from '$shared/utils/logger';
6
+ import { getClopenDir } from '../../utils/index.js';
7
+
7
8
  export class DatabaseManager {
8
9
  private static instance: DatabaseManager | null = null;
9
10
  private db: DatabaseConnection | null = null;
10
11
  private readonly dbPath: string;
11
12
 
12
13
  private constructor() {
13
- const clopenDir = join(homedir(), '.clopen');
14
- this.dbPath = join(clopenDir, 'app.db');
14
+ this.dbPath = join(getClopenDir(), 'app.db');
15
15
  }
16
16
 
17
17
  static getInstance(): DatabaseManager {
@@ -29,8 +29,8 @@ export class DatabaseManager {
29
29
  debug.log('database', '🔗 Connecting to database...');
30
30
 
31
31
  try {
32
- // Create ~/.clopen directory if it doesn't exist
33
- const clopenDir = join(homedir(), '.clopen');
32
+ // Create clopen directory if it doesn't exist
33
+ const clopenDir = getClopenDir();
34
34
  const dirFile = Bun.file(clopenDir);
35
35
 
36
36
  // Check if directory exists, if not create it
@@ -7,22 +7,21 @@
7
7
  * stream concurrently.
8
8
  */
9
9
 
10
- import { homedir } from 'os';
11
10
  import { join } from 'path';
12
11
  import { isWindows, findGitBash } from '../../../terminal/shell-utils.js';
13
12
  import { engineQueries } from '../../../database/queries';
14
13
  import { debug } from '$shared/utils/logger';
15
- import { getCleanSpawnEnv } from '../../../shared/env';
14
+ import { getCleanSpawnEnv, getClopenDir } from '../../../utils/index.js';
16
15
 
17
16
  let _ready = false;
18
17
  let _initPromise: Promise<void> | null = null;
19
18
  let _envOverrides: Record<string, string> = {};
20
19
 
21
20
  /**
22
- * Returns the isolated Claude config directory under ~/.clopen/claude/user/
21
+ * Returns the isolated Claude config directory under {clopenDir}/claude/user/
23
22
  */
24
23
  export function getClaudeUserConfigDir(): string {
25
- return join(homedir(), '.clopen', 'claude', 'user');
24
+ return join(getClopenDir(), 'claude', 'user');
26
25
  }
27
26
 
28
27
  /**
@@ -141,7 +141,7 @@ const TOOL_NAME_MAP: Record<string, string> = {
141
141
 
142
142
  /** Map Open Code tool name to Claude Code tool name for UI rendering */
143
143
  export function mapToolName(openCodeToolName: string): string {
144
- // Check if this is a custom MCP tool (resolves via single source in backend/lib/mcp)
144
+ // Check if this is a custom MCP tool (resolves via single source in backend/mcp)
145
145
  const mcpName = resolveOpenCodeToolName(openCodeToolName);
146
146
  if (mcpName) return mcpName;
147
147
 
@@ -11,6 +11,7 @@
11
11
  import type { OpencodeClient } from '@opencode-ai/sdk';
12
12
  import { getOpenCodeMcpConfig } from '../../../mcp';
13
13
  import { debug } from '$shared/utils/logger';
14
+ import { findAvailablePort } from '../../../utils/port-utils';
14
15
 
15
16
  const OPENCODE_PORT = 4096;
16
17
  const OPENCODE_HOST = '127.0.0.1';
@@ -58,9 +59,14 @@ async function init(): Promise<void> {
58
59
  }
59
60
  }
60
61
 
62
+ const actualPort = await findAvailablePort(OPENCODE_PORT);
63
+ if (actualPort !== OPENCODE_PORT) {
64
+ debug.log('engine', `Open Code port ${OPENCODE_PORT} in use, using ${actualPort} instead`);
65
+ }
66
+
61
67
  const result = await createOpencode({
62
68
  hostname: OPENCODE_HOST,
63
- port: OPENCODE_PORT,
69
+ port: actualPort,
64
70
  ...(Object.keys(mcpConfig).length > 0 && {
65
71
  config: { mcp: mcpConfig },
66
72
  }),
@@ -12,7 +12,7 @@
12
12
  import { watch, type FSWatcher, existsSync } from 'node:fs';
13
13
  import { stat } from 'node:fs/promises';
14
14
  import { join, relative, normalize, sep } from 'node:path';
15
- import { ws } from '$backend/lib/utils/ws';
15
+ import { ws } from '$backend/utils/ws';
16
16
  import { debug } from '$shared/utils/logger';
17
17
  import type { FileChange } from '$shared/types/filesystem';
18
18
 
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { debug } from '$shared/utils/logger';
7
- import { getCleanSpawnEnv } from '../shared/env';
7
+ import { getCleanSpawnEnv } from '../utils/env';
8
8
 
9
9
  export interface GitExecResult {
10
10
  stdout: string;
@@ -22,7 +22,8 @@ export async function execGit(
22
22
  ): Promise<GitExecResult> {
23
23
  debug.log('git', `Executing: git ${args.join(' ')} in ${cwd}`);
24
24
 
25
- const proc = Bun.spawn(['git', ...args], {
25
+ const safeCwd = cwd.replace(/\\/g, '/');
26
+ const proc = Bun.spawn(['git', '-c', `safe.directory=${safeCwd}`, ...args], {
26
27
  cwd,
27
28
  stdout: 'pipe',
28
29
  stderr: 'pipe',
package/backend/index.ts CHANGED
@@ -9,7 +9,7 @@ if (typeof globalThis.Bun === 'undefined') {
9
9
  }
10
10
 
11
11
  // MUST be first import — cleans process.env before any other module reads it
12
- import { SERVER_ENV } from './lib/shared/env';
12
+ import { SERVER_ENV } from './utils/env';
13
13
 
14
14
  import { Elysia } from 'elysia';
15
15
  import { corsMiddleware } from './middleware/cors';
@@ -17,10 +17,9 @@ import { errorHandlerMiddleware } from './middleware/error-handler';
17
17
  import { loggerMiddleware } from './middleware/logger';
18
18
 
19
19
  // Database initialization
20
- import { initializeDatabase, closeDatabase } from './lib/database';
21
- import { disposeAllEngines } from './lib/engine';
20
+ import { initializeDatabase, closeDatabase } from './database';
21
+ import { disposeAllEngines } from './engine';
22
22
  import { debug } from '$shared/utils/logger';
23
- import { findAvailablePort } from './lib/shared/port-utils';
24
23
  import { networkInterfaces } from 'os';
25
24
  import { resolve } from 'node:path';
26
25
  import { statSync } from 'node:fs';
@@ -29,11 +28,11 @@ import { statSync } from 'node:fs';
29
28
  import { wsRouter } from './ws';
30
29
 
31
30
  // MCP remote server for Open Code custom tools
32
- import { handleMcpRequest, closeMcpServer } from './lib/mcp/remote-server';
31
+ import { handleMcpRequest, closeMcpServer } from './mcp/remote-server';
33
32
 
34
33
  // Auth middleware
35
- import { checkRouteAccess } from './lib/auth/permissions';
36
- import { ws as wsServer } from './lib/utils/ws';
34
+ import { checkRouteAccess } from './auth/permissions';
35
+ import { ws as wsServer } from './utils/ws';
37
36
 
38
37
  // Register auth gate on WebSocket router — blocks unauthenticated/unauthorized access
39
38
  wsRouter.setAuthMiddleware(async (conn, action) => {
@@ -45,7 +44,7 @@ wsRouter.setAuthMiddleware(async (conn, action) => {
45
44
  /**
46
45
  * Clopen - Elysia Backend Server
47
46
  *
48
- * Development: Elysia runs on port 9151, Vite dev server proxies /api and /ws from port 9141
47
+ * Development: Elysia runs on port 9161, Vite dev server proxies /api and /ws from port 9151
49
48
  * Production: Elysia runs on port 9141, serves static files from dist/ + API + WebSocket
50
49
  */
51
50
 
@@ -117,11 +116,12 @@ if (!isDevelopment) {
117
116
 
118
117
  // Start server with proper initialization sequence
119
118
  async function startServer() {
120
- // Find available port auto-increment if desired port is in use
121
- const actualPort = await findAvailablePort(PORT);
122
- if (actualPort !== PORT) {
123
- debug.log('server', `⚠️ Port ${PORT} in use, using ${actualPort} instead`);
124
- }
119
+ // Port resolution is handled by the caller:
120
+ // - Development: scripts/dev.ts resolves ports and passes via PORT_BACKEND env
121
+ // - Production: scripts/start.ts resolves port and passes via PORT env
122
+ // - CLI: bin/clopen.ts resolves port and passes via PORT env
123
+ // This avoids double port-check race conditions (e.g. zombie processes on
124
+ // Windows causing silent desync between Vite proxy and backend).
125
125
 
126
126
  // Initialize database first before accepting connections
127
127
  try {
@@ -133,18 +133,18 @@ async function startServer() {
133
133
 
134
134
  // Start listening after database is ready
135
135
  app.listen({
136
- port: actualPort,
136
+ port: PORT,
137
137
  hostname: HOST
138
138
  }, () => {
139
139
  if (isDevelopment) {
140
140
  console.log('🚀 Backend ready — waiting for frontend...');
141
141
  } else {
142
- console.log(`🚀 Clopen running at http://localhost:${actualPort}`);
142
+ console.log(`🚀 Clopen running at http://localhost:${PORT}`);
143
143
  }
144
144
  if (HOST === '0.0.0.0') {
145
145
  const ips = getLocalIps();
146
146
  for (const ip of ips) {
147
- console.log(`🌐 Network access: http://${ip}:${actualPort}`);
147
+ console.log(`🌐 Network access: http://${ip}:${PORT}`);
148
148
  }
149
149
  }
150
150
  });