wind-agent-cli 1.37.2 → 1.37.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 (374) hide show
  1. package/LICENSE +718 -718
  2. package/README.md +1 -1
  3. package/dist/api-docs.html +901 -901
  4. package/dist/assets/{CodeEditor-B2Wf7Fg0.js → CodeEditor-BqmxpZ_D.js} +1 -1
  5. package/dist/assets/{FileTree-N2IkkHlv.js → FileTree-DLE7Ioai.js} +1 -1
  6. package/dist/assets/{GitPanel-DZCeuFZ2.js → GitPanel-f8RMRa8D.js} +1 -1
  7. package/dist/assets/{MarkdownPreview-C0tqYnVu.js → MarkdownPreview-93h_1tJa.js} +1 -1
  8. package/dist/assets/{PluginTabContent-Bnuf-fb8.js → PluginTabContent-DU1jjkXP.js} +1 -1
  9. package/dist/assets/{Shell-BfFnMZ-f.js → Shell-CN_2MRIM.js} +1 -1
  10. package/dist/assets/{StandaloneShell-QmyYwNAl.js → StandaloneShell-D0avS8UE.js} +1 -1
  11. package/dist/assets/{TaskMasterPanel-fMsmvN9L.js → TaskMasterPanel-Cpf1Q5Ph.js} +3 -3
  12. package/dist/assets/{abnfDiagram-N423BO3Z-DjPU7HLs.js → abnfDiagram-N423BO3Z-p3aJIm4T.js} +1 -1
  13. package/dist/assets/{arc-Pdq6Tvr3.js → arc-CTeud6Fl.js} +1 -1
  14. package/dist/assets/{architectureDiagram-T3A2C74G-D0JnT0Vh.js → architectureDiagram-T3A2C74G-CG7kRCJU.js} +1 -1
  15. package/dist/assets/{blockDiagram-VBNYF7ZC-DpaEf3mv.js → blockDiagram-VBNYF7ZC-oSjQ1SgE.js} +1 -1
  16. package/dist/assets/{c4Diagram-5PPSVZJV-MpqlPGFi.js → c4Diagram-5PPSVZJV-RkzF0DJV.js} +1 -1
  17. package/dist/assets/channel-BfQbarn9.js +1 -0
  18. package/dist/assets/{chunk-2GRJ4B5K-DoSdNo8u.js → chunk-2GRJ4B5K-B07uZ07O.js} +1 -1
  19. package/dist/assets/{chunk-2Q5K7J3B-CE7I3uMn.js → chunk-2Q5K7J3B-DNSfO7xS.js} +1 -1
  20. package/dist/assets/{chunk-5RXB4S5H-B4UQ8snD.js → chunk-5RXB4S5H-BTeYcgyb.js} +1 -1
  21. package/dist/assets/{chunk-5VM5RSS4-B55XgqHZ.js → chunk-5VM5RSS4-B7vZV0zC.js} +1 -1
  22. package/dist/assets/{chunk-6Q2QTUOP-BS1KpefW.js → chunk-6Q2QTUOP-DuS_xUGG.js} +1 -1
  23. package/dist/assets/{chunk-GF5L2VYU-DkEPedJP.js → chunk-GF5L2VYU-CKLZ3iVD.js} +1 -1
  24. package/dist/assets/{chunk-JWPE2WC7-DOtkNhMm.js → chunk-JWPE2WC7-DD2hcXvs.js} +1 -1
  25. package/dist/assets/{chunk-KBJHAD2P-BXLjviqM.js → chunk-KBJHAD2P-Cz-l38qp.js} +1 -1
  26. package/dist/assets/{chunk-RYQCIY6F-C50fjNNz.js → chunk-RYQCIY6F-DGFIU1YM.js} +1 -1
  27. package/dist/assets/{chunk-XXDRQBXY-QBYqCkb7.js → chunk-XXDRQBXY-CmfzoYFl.js} +1 -1
  28. package/dist/assets/classDiagram-JCYQIIEL-Bpfe3kq7.js +1 -0
  29. package/dist/assets/classDiagram-v2-OCEON4UE-Bpfe3kq7.js +1 -0
  30. package/dist/assets/{code-xml-VK1YfShP.js → code-xml-CLpHzEOP.js} +1 -1
  31. package/dist/assets/{cose-bilkent-JH36ORCC-DrVTo1Nh.js → cose-bilkent-JH36ORCC-DlFcLXCB.js} +1 -1
  32. package/dist/assets/{cynefin-VYW2F7L2-DnJa_OlQ.js → cynefin-VYW2F7L2-P1HecReO.js} +1 -1
  33. package/dist/assets/{cynefinDiagram-MW4NZA55-CCxBjw9E.js → cynefinDiagram-MW4NZA55-COgduz5P.js} +1 -1
  34. package/dist/assets/{dagre-VZM6K2ZE-C_GvE4lu.js → dagre-VZM6K2ZE-Bbb-siGp.js} +1 -1
  35. package/dist/assets/{diagram-7IWD3JNH-pFzs9HEu.js → diagram-7IWD3JNH-9CWGFMYR.js} +1 -1
  36. package/dist/assets/{diagram-B4RE2ZJO-CcehQC7x.js → diagram-B4RE2ZJO-TWK59T6V.js} +1 -1
  37. package/dist/assets/{diagram-LBJQPF4R-hfKcrrxe.js → diagram-LBJQPF4R-ErMC9yaa.js} +1 -1
  38. package/dist/assets/{diagram-Q27KOJAE-C1semJfK.js → diagram-Q27KOJAE-Dt_-C7hV.js} +1 -1
  39. package/dist/assets/{diagram-UB23O5K3-57hvXQXO.js → diagram-UB23O5K3-BJ1DnRAF.js} +1 -1
  40. package/dist/assets/{ebnfDiagram-BXEA7PRR-9KIAlAVw.js → ebnfDiagram-BXEA7PRR-CE1YaQ9s.js} +1 -1
  41. package/dist/assets/{erDiagram-JOGREHBK-B7OzJ767.js → erDiagram-JOGREHBK-Bqk7N9aY.js} +1 -1
  42. package/dist/assets/{flowDiagram-UKHOOZJN-CJV8fQPR.js → flowDiagram-UKHOOZJN-DEr2II5V.js} +1 -1
  43. package/dist/assets/{ganttDiagram-PKOTCBZU-CbMNWWQu.js → ganttDiagram-PKOTCBZU-CWYAUeYN.js} +1 -1
  44. package/dist/assets/{gitGraphDiagram-DS77QQ5N-I_vZ5waO.js → gitGraphDiagram-DS77QQ5N-tdEcEIM6.js} +1 -1
  45. package/dist/assets/{index-ZHwIojzi.js → index-B-sTfSZq.js} +1 -1
  46. package/dist/assets/{index-GFhXZyl2.js → index-BSe3UiFA.js} +1 -1
  47. package/dist/assets/{index-DFnVoqpx.js → index-B_FDMWar.js} +5 -5
  48. package/dist/assets/{index-DlSeAkw_.js → index-CWJtg2pR.js} +1 -1
  49. package/dist/assets/{infoDiagram-6WML65LV-Dh20Tsbq.js → infoDiagram-6WML65LV-A3IqRUnO.js} +1 -1
  50. package/dist/assets/{ishikawaDiagram-WSZJBQD7-DH2Sm3ko.js → ishikawaDiagram-WSZJBQD7-B2uL6bkK.js} +1 -1
  51. package/dist/assets/{journeyDiagram-NVQOT4AX-BNFQqlVu.js → journeyDiagram-NVQOT4AX-D9JB-hRW.js} +1 -1
  52. package/dist/assets/{kanban-definition-27J2QSJJ-B3iL0ztJ.js → kanban-definition-27J2QSJJ-DmlgiV7K.js} +1 -1
  53. package/dist/assets/{linear-Cwe9dEKA.js → linear-Ct_eoJQk.js} +1 -1
  54. package/dist/assets/{mermaid.core-BYRQSshi.js → mermaid.core-CQ698HNn.js} +5 -5
  55. package/dist/assets/{mindmap-definition-FAOFIHXS-BgfBYMzr.js → mindmap-definition-FAOFIHXS-DGtMgQhf.js} +1 -1
  56. package/dist/assets/{pegDiagram-VL7TDLO6-CNYpECr8.js → pegDiagram-VL7TDLO6-CO6vP4n9.js} +1 -1
  57. package/dist/assets/{pieDiagram-7S7Q4E2Y-DeSrxc4I.js → pieDiagram-7S7Q4E2Y-DMkt_Zfr.js} +1 -1
  58. package/dist/assets/{quadrantDiagram-CIZ2JOQS-BXVVQsa6.js → quadrantDiagram-CIZ2JOQS-DgNxRz6t.js} +1 -1
  59. package/dist/assets/{railroadDiagram-AXF67PYL-JTroIW8F.js → railroadDiagram-AXF67PYL-DKz9UqA9.js} +1 -1
  60. package/dist/assets/{requirementDiagram-LRYGKXZP-C1Z_inLz.js → requirementDiagram-LRYGKXZP-L84XyGgV.js} +1 -1
  61. package/dist/assets/{sankeyDiagram-W5VNT64P-DCJgKFUk.js → sankeyDiagram-W5VNT64P-CQqWbJ3j.js} +1 -1
  62. package/dist/assets/{sequenceDiagram-SI44F4Z6-D8Wrx5Vc.js → sequenceDiagram-SI44F4Z6--tnzS2tb.js} +1 -1
  63. package/dist/assets/{sizeCapture-X5ZJPWSS-CXqD68vD.js → sizeCapture-X5ZJPWSS-DujwEOtm.js} +1 -1
  64. package/dist/assets/{stateDiagram-OKZ733FA-CF0Ekqjo.js → stateDiagram-OKZ733FA-BK3TcZY2.js} +1 -1
  65. package/dist/assets/stateDiagram-v2-UEYNNEHI-_medyomK.js +1 -0
  66. package/dist/assets/{swimlanes-SLNWSIFB-DVIax_k4.js → swimlanes-SLNWSIFB-naX-Uv1B.js} +2 -2
  67. package/dist/assets/swimlanesDiagram-ULZ7WXOC-DstIv3TC.js +8 -0
  68. package/dist/assets/{timeline-definition-Z64GVDOM-DSqk3ApG.js → timeline-definition-Z64GVDOM-C-vP_ddU.js} +1 -1
  69. package/dist/assets/{vennDiagram-T6HMQDX7-DNbTqyG5.js → vennDiagram-T6HMQDX7-DN-I7o-7.js} +1 -1
  70. package/dist/assets/{wardleyDiagram-T6FBY63Y-BNCpsFZV.js → wardleyDiagram-T6FBY63Y-Db9dsaXv.js} +1 -1
  71. package/dist/assets/{xychartDiagram-ELKLHX3M-XsVZphHr.js → xychartDiagram-ELKLHX3M-DE6OxW_p.js} +1 -1
  72. package/dist/clear-cache.html +85 -85
  73. package/dist/convert-icons.md +52 -52
  74. package/dist/favicon.svg +8 -8
  75. package/dist/generate-icons.js +48 -48
  76. package/dist/icons/codex-white.svg +3 -3
  77. package/dist/icons/codex.svg +3 -3
  78. package/dist/icons/cursor-white.svg +11 -11
  79. package/dist/icons/icon-128x128.svg +11 -11
  80. package/dist/icons/icon-144x144.svg +11 -11
  81. package/dist/icons/icon-152x152.svg +11 -11
  82. package/dist/icons/icon-192x192.svg +11 -11
  83. package/dist/icons/icon-384x384.svg +11 -11
  84. package/dist/icons/icon-512x512.svg +11 -11
  85. package/dist/icons/icon-72x72.svg +11 -11
  86. package/dist/icons/icon-96x96.svg +11 -11
  87. package/dist/icons/icon-template.svg +11 -11
  88. package/dist/index.html +56 -56
  89. package/dist/logo.svg +17 -17
  90. package/dist/manifest.json +60 -60
  91. package/dist/sw.js +124 -124
  92. package/dist-server/server/modules/cli/cli.service.js +36 -36
  93. package/dist-server/server/modules/cli/sandbox.service.js +38 -38
  94. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +74 -74
  95. package/dist-server/server/modules/commands/commands.routes.js +24 -24
  96. package/dist-server/server/modules/database/migrations.js +190 -190
  97. package/dist-server/server/modules/database/repositories/api-keys.js +3 -3
  98. package/dist-server/server/modules/database/repositories/github-tokens.js +2 -2
  99. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js +28 -28
  100. package/dist-server/server/modules/database/repositories/notification-preferences.js +4 -4
  101. package/dist-server/server/modules/database/repositories/projects.db.js +61 -61
  102. package/dist-server/server/modules/database/repositories/provider-models.js +35 -35
  103. package/dist-server/server/modules/database/repositories/push-subscriptions.js +5 -5
  104. package/dist-server/server/modules/database/repositories/scan-state.db.js +5 -5
  105. package/dist-server/server/modules/database/repositories/sessions.db.js +92 -92
  106. package/dist-server/server/modules/database/schema.js +177 -177
  107. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +6 -6
  108. package/dist-server/server/modules/git/git.routes.js +17 -17
  109. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +12 -12
  110. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js +9 -9
  111. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +17 -17
  112. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +25 -25
  113. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +27 -27
  114. package/dist-server/server/modules/providers/services/provider-token-usage.service.js +9 -9
  115. package/dist-server/server/modules/providers/tests/mcp.test.js +3 -3
  116. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +96 -96
  117. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +18 -18
  118. package/dist-server/server/modules/taskmaster/taskmaster.routes.js +419 -419
  119. package/electron/cloud.js +260 -260
  120. package/electron/desktopNotifications.js +378 -378
  121. package/electron/desktopWindow.js +766 -766
  122. package/electron/launcher/index.html +14 -14
  123. package/electron/launcher/launcher.css +801 -801
  124. package/electron/launcher/launcher.js +687 -687
  125. package/electron/localServer.js +549 -549
  126. package/electron/main.js +944 -944
  127. package/electron/preload.cjs +60 -60
  128. package/electron/scripts/generate-macos-icon.js +62 -62
  129. package/electron/serverInstaller.js +277 -277
  130. package/electron/tabs.js +87 -87
  131. package/electron/viewHost.js +331 -331
  132. package/package.json +250 -247
  133. package/public/api-docs.html +901 -901
  134. package/scripts/fix-node-pty.js +67 -67
  135. package/scripts/promote-dist-server.mjs +50 -50
  136. package/scripts/release/build-server-bundle.js +176 -176
  137. package/scripts/release/prepare-desktop-app.js +152 -152
  138. package/server/index.ts +399 -399
  139. package/server/load-env.ts +47 -47
  140. package/server/modules/agent/agent.module.ts +52 -52
  141. package/server/modules/agent/agent.routes.ts +1287 -1287
  142. package/server/modules/agent/index.ts +2 -2
  143. package/server/modules/agent/tests/agent.routes.test.ts +205 -205
  144. package/server/modules/assets/assets.routes.ts +150 -150
  145. package/server/modules/assets/index.ts +3 -3
  146. package/server/modules/assets/services/image-assets.service.ts +127 -127
  147. package/server/modules/assets/tests/image-assets.service.test.ts +74 -74
  148. package/server/modules/auth/auth.middleware.ts +163 -163
  149. package/server/modules/auth/auth.module.ts +38 -38
  150. package/server/modules/auth/auth.routes.ts +57 -57
  151. package/server/modules/auth/auth.service.ts +155 -155
  152. package/server/modules/auth/index.ts +9 -9
  153. package/server/modules/auth/tests/auth.service.test.ts +95 -95
  154. package/server/modules/browser-use/browser-use-mcp.routes.ts +120 -120
  155. package/server/modules/browser-use/browser-use-mcp.ts +386 -386
  156. package/server/modules/browser-use/browser-use-runtime.ts +10 -10
  157. package/server/modules/browser-use/browser-use.routes.ts +96 -96
  158. package/server/modules/browser-use/browser-use.service.ts +836 -836
  159. package/server/modules/browser-use/index.ts +11 -11
  160. package/server/modules/browser-use/tests/browser-use.service.test.ts +10 -10
  161. package/server/modules/cli/cli.module.ts +93 -93
  162. package/server/modules/cli/cli.service.ts +248 -248
  163. package/server/modules/cli/cli.ts +19 -19
  164. package/server/modules/cli/index.ts +2 -2
  165. package/server/modules/cli/sandbox.service.ts +398 -398
  166. package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +186 -186
  167. package/server/modules/cli/tests/cli.service.test.ts +86 -86
  168. package/server/modules/cli/tests/sandbox.service.test.ts +58 -58
  169. package/server/modules/commands/commands.module.ts +22 -22
  170. package/server/modules/commands/commands.routes.ts +586 -586
  171. package/server/modules/commands/index.ts +2 -2
  172. package/server/modules/commands/tests/commands.test.ts +109 -109
  173. package/server/modules/database/connection.ts +143 -143
  174. package/server/modules/database/index.ts +17 -17
  175. package/server/modules/database/init-db.ts +17 -17
  176. package/server/modules/database/migrations.ts +515 -515
  177. package/server/modules/database/repositories/api-keys.ts +119 -119
  178. package/server/modules/database/repositories/app-config.ts +53 -53
  179. package/server/modules/database/repositories/credentials.ts +106 -106
  180. package/server/modules/database/repositories/github-tokens.ts +100 -100
  181. package/server/modules/database/repositories/notification-channel-endpoints.ts +153 -153
  182. package/server/modules/database/repositories/notification-preferences.ts +117 -117
  183. package/server/modules/database/repositories/projects.db.ts +196 -196
  184. package/server/modules/database/repositories/provider-models.ts +168 -168
  185. package/server/modules/database/repositories/push-subscriptions.ts +80 -80
  186. package/server/modules/database/repositories/scan-state.db.ts +42 -42
  187. package/server/modules/database/repositories/sessions.db.ts +524 -524
  188. package/server/modules/database/repositories/users.ts +140 -140
  189. package/server/modules/database/repositories/vapid-keys.ts +57 -57
  190. package/server/modules/database/schema.ts +210 -210
  191. package/server/modules/database/tests/projects.db.integration.test.ts +72 -72
  192. package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -125
  193. package/server/modules/database/tests/sessions-provider-mapping.test.ts +109 -109
  194. package/server/modules/database/tests/sessions.db.integration.test.ts +116 -116
  195. package/server/modules/file-tree/file-tree.module.ts +116 -116
  196. package/server/modules/file-tree/file-tree.routes.ts +258 -258
  197. package/server/modules/file-tree/file-tree.service.ts +675 -675
  198. package/server/modules/file-tree/index.ts +2 -2
  199. package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -157
  200. package/server/modules/file-tree/tests/file-tree.service.test.ts +371 -371
  201. package/server/modules/git/git-branch.service.ts +43 -43
  202. package/server/modules/git/git-parsing.service.ts +66 -66
  203. package/server/modules/git/git.module.ts +22 -22
  204. package/server/modules/git/git.routes.ts +1596 -1596
  205. package/server/modules/git/index.ts +2 -2
  206. package/server/modules/git/tests/git-branch.service.test.ts +60 -60
  207. package/server/modules/git/tests/git-init.routes.test.ts +132 -132
  208. package/server/modules/git/tests/git.test.ts +106 -106
  209. package/server/modules/notifications/index.ts +24 -24
  210. package/server/modules/notifications/notifications.routes.ts +127 -127
  211. package/server/modules/notifications/services/desktop-notification-clients.service.ts +124 -124
  212. package/server/modules/notifications/services/notification-orchestrator.service.js +310 -310
  213. package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -55
  214. package/server/modules/notifications/vapid-keys.service.ts +38 -38
  215. package/server/modules/notifications/websocket/desktop-notifications-websocket.service.ts +109 -109
  216. package/server/modules/plugins/index.ts +9 -9
  217. package/server/modules/plugins/plugin-process.service.ts +217 -217
  218. package/server/modules/plugins/plugin-registry.service.ts +459 -459
  219. package/server/modules/plugins/plugins.module.ts +33 -33
  220. package/server/modules/plugins/plugins.routes.ts +66 -66
  221. package/server/modules/plugins/plugins.service.ts +147 -147
  222. package/server/modules/plugins/tests/plugins.service.test.ts +32 -32
  223. package/server/modules/projects/index.ts +11 -11
  224. package/server/modules/projects/projects.routes.ts +273 -273
  225. package/server/modules/projects/services/project-clone.service.ts +323 -323
  226. package/server/modules/projects/services/project-delete.service.ts +90 -90
  227. package/server/modules/projects/services/project-management.service.ts +144 -144
  228. package/server/modules/projects/services/project-star.service.ts +78 -78
  229. package/server/modules/projects/services/projects-has-taskmaster.service.ts +248 -248
  230. package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +314 -314
  231. package/server/modules/projects/tests/project-clone.service.test.ts +183 -183
  232. package/server/modules/projects/tests/project-management.service.test.ts +117 -117
  233. package/server/modules/projects/tests/project-star.service.test.ts +123 -123
  234. package/server/modules/projects/tests/projects-has-taskmaster.service.test.ts +105 -105
  235. package/server/modules/providers/README.md +380 -380
  236. package/server/modules/providers/index.ts +10 -10
  237. package/server/modules/providers/list/claude/claude-auth.provider.ts +160 -160
  238. package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -135
  239. package/server/modules/providers/list/claude/claude-models.provider.ts +294 -294
  240. package/server/modules/providers/list/claude/claude-runtime.provider.js +1068 -1068
  241. package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +203 -203
  242. package/server/modules/providers/list/claude/claude-sessions.provider.ts +684 -684
  243. package/server/modules/providers/list/claude/claude-skills.provider.ts +265 -265
  244. package/server/modules/providers/list/claude/claude.provider.ts +30 -30
  245. package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -100
  246. package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -135
  247. package/server/modules/providers/list/codex/codex-models.provider.ts +123 -123
  248. package/server/modules/providers/list/codex/codex-runtime.provider.js +533 -533
  249. package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +203 -203
  250. package/server/modules/providers/list/codex/codex-sessions.provider.ts +938 -938
  251. package/server/modules/providers/list/codex/codex-skills.provider.ts +73 -73
  252. package/server/modules/providers/list/codex/codex.provider.ts +28 -28
  253. package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -143
  254. package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -108
  255. package/server/modules/providers/list/cursor/cursor-models.provider.ts +119 -119
  256. package/server/modules/providers/list/cursor/cursor-runtime.provider.js +385 -385
  257. package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +159 -159
  258. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +654 -654
  259. package/server/modules/providers/list/cursor/cursor-skills.provider.ts +39 -39
  260. package/server/modules/providers/list/cursor/cursor.provider.ts +30 -30
  261. package/server/modules/providers/list/opencode/opencode-auth.provider.ts +110 -110
  262. package/server/modules/providers/list/opencode/opencode-mcp.provider.ts +228 -228
  263. package/server/modules/providers/list/opencode/opencode-models.provider.ts +203 -203
  264. package/server/modules/providers/list/opencode/opencode-runtime.provider.js +434 -434
  265. package/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +261 -261
  266. package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +179 -179
  267. package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +500 -500
  268. package/server/modules/providers/list/opencode/opencode-skills.provider.ts +78 -78
  269. package/server/modules/providers/list/opencode/opencode.provider.ts +30 -30
  270. package/server/modules/providers/provider.registry.ts +36 -36
  271. package/server/modules/providers/provider.routes.ts +877 -877
  272. package/server/modules/providers/services/mcp.service.ts +109 -109
  273. package/server/modules/providers/services/provider-auth.service.ts +26 -26
  274. package/server/modules/providers/services/provider-capabilities.service.ts +97 -97
  275. package/server/modules/providers/services/provider-models.service.ts +401 -401
  276. package/server/modules/providers/services/provider-runtime.service.ts +108 -108
  277. package/server/modules/providers/services/provider-token-usage.service.ts +357 -357
  278. package/server/modules/providers/services/session-conversations-search.service.ts +1321 -1321
  279. package/server/modules/providers/services/session-synchronizer.service.ts +74 -74
  280. package/server/modules/providers/services/sessions-watcher.service.ts +247 -247
  281. package/server/modules/providers/services/sessions.service.ts +471 -471
  282. package/server/modules/providers/services/skills.service.ts +39 -39
  283. package/server/modules/providers/shared/base/abstract.provider.ts +32 -32
  284. package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -151
  285. package/server/modules/providers/shared/skills/skills.provider.ts +287 -287
  286. package/server/modules/providers/tests/claude-auth.test.ts +150 -150
  287. package/server/modules/providers/tests/claude-sessions.test.ts +61 -61
  288. package/server/modules/providers/tests/codex-sessions.test.ts +231 -231
  289. package/server/modules/providers/tests/mcp.test.ts +349 -349
  290. package/server/modules/providers/tests/opencode-models.test.ts +41 -41
  291. package/server/modules/providers/tests/opencode-sessions.test.ts +522 -522
  292. package/server/modules/providers/tests/provider-attachment-history.test.ts +247 -247
  293. package/server/modules/providers/tests/provider-models.service.test.ts +353 -353
  294. package/server/modules/providers/tests/provider-runtime.service.test.ts +138 -138
  295. package/server/modules/providers/tests/provider-token-usage.service.test.ts +186 -186
  296. package/server/modules/providers/tests/provider.routes.test.ts +244 -244
  297. package/server/modules/providers/tests/sessions-details.test.ts +73 -73
  298. package/server/modules/providers/tests/sessions.service.test.ts +127 -127
  299. package/server/modules/providers/tests/skills.test.ts +692 -692
  300. package/server/modules/settings/index.ts +2 -2
  301. package/server/modules/settings/settings.module.ts +50 -50
  302. package/server/modules/settings/settings.routes.ts +51 -51
  303. package/server/modules/settings/settings.service.ts +186 -186
  304. package/server/modules/settings/tests/settings.service.test.ts +54 -54
  305. package/server/modules/system/index.ts +2 -2
  306. package/server/modules/system/system.module.ts +62 -62
  307. package/server/modules/system/system.routes.ts +21 -21
  308. package/server/modules/system/system.service.ts +76 -76
  309. package/server/modules/system/tests/system.service.test.ts +118 -118
  310. package/server/modules/taskmaster/index.ts +2 -2
  311. package/server/modules/taskmaster/taskmaster.module.ts +24 -24
  312. package/server/modules/taskmaster/taskmaster.routes.ts +1482 -1482
  313. package/server/modules/taskmaster/taskmaster.service.ts +132 -132
  314. package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +144 -144
  315. package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -97
  316. package/server/modules/user/index.ts +2 -2
  317. package/server/modules/user/tests/user.service.test.ts +61 -61
  318. package/server/modules/user/user.module.ts +58 -58
  319. package/server/modules/user/user.routes.ts +50 -50
  320. package/server/modules/user/user.service.ts +85 -85
  321. package/server/modules/voice/index.ts +2 -2
  322. package/server/modules/voice/tests/voice.service.test.ts +98 -98
  323. package/server/modules/voice/voice.module.ts +47 -47
  324. package/server/modules/voice/voice.routes.ts +113 -113
  325. package/server/modules/voice/voice.service.ts +192 -192
  326. package/server/modules/websocket/README.md +273 -273
  327. package/server/modules/websocket/index.ts +3 -3
  328. package/server/modules/websocket/services/chat-run-registry.service.ts +343 -343
  329. package/server/modules/websocket/services/chat-session-writer.service.ts +145 -145
  330. package/server/modules/websocket/services/chat-websocket.service.ts +425 -425
  331. package/server/modules/websocket/services/plugin-websocket-proxy.service.ts +65 -65
  332. package/server/modules/websocket/services/shell-websocket.service.ts +502 -502
  333. package/server/modules/websocket/services/websocket-auth.service.ts +59 -59
  334. package/server/modules/websocket/services/websocket-server.service.ts +124 -124
  335. package/server/modules/websocket/services/websocket-state.service.ts +16 -16
  336. package/server/modules/websocket/services/websocket-writer.service.ts +38 -38
  337. package/server/modules/websocket/tests/chat-attachment-filter.test.ts +59 -59
  338. package/server/modules/websocket/tests/chat-run-registry.test.ts +282 -282
  339. package/server/modules/websocket/tests/shell-websocket.service.test.ts +100 -100
  340. package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -78
  341. package/server/modules/worktrees/index.ts +2 -2
  342. package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -53
  343. package/server/modules/worktrees/services/worktree-create.service.ts +104 -104
  344. package/server/modules/worktrees/services/worktree-git.service.ts +207 -207
  345. package/server/modules/worktrees/services/worktree-list.service.ts +143 -143
  346. package/server/modules/worktrees/services/worktree-merge.service.ts +157 -157
  347. package/server/modules/worktrees/services/worktree-open.service.ts +85 -85
  348. package/server/modules/worktrees/services/worktree-remove.service.ts +88 -88
  349. package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -68
  350. package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -142
  351. package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -84
  352. package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -45
  353. package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -213
  354. package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -122
  355. package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -227
  356. package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -199
  357. package/server/modules/worktrees/worktrees.module.ts +113 -113
  358. package/server/modules/worktrees/worktrees.routes.ts +116 -116
  359. package/server/shared/claude-cli-path.ts +139 -139
  360. package/server/shared/frontmatter.ts +18 -18
  361. package/server/shared/image-attachments.ts +435 -435
  362. package/server/shared/interfaces.ts +179 -179
  363. package/server/shared/tests/claude-cli-path.test.ts +61 -61
  364. package/server/shared/tests/image-attachments.test.ts +353 -353
  365. package/server/shared/tests/slice-tail-page.test.ts +42 -42
  366. package/server/shared/types.ts +1226 -1226
  367. package/server/shared/utils.ts +1161 -1161
  368. package/server/tsconfig.json +40 -40
  369. package/shared/networkHosts.js +22 -22
  370. package/dist/assets/channel-Bm0ZLE4z.js +0 -1
  371. package/dist/assets/classDiagram-JCYQIIEL-DqEOcNxw.js +0 -1
  372. package/dist/assets/classDiagram-v2-OCEON4UE-DqEOcNxw.js +0 -1
  373. package/dist/assets/stateDiagram-v2-UEYNNEHI-DARLpEFJ.js +0 -1
  374. package/dist/assets/swimlanesDiagram-ULZ7WXOC-CrgDgaY8.js +0 -8
@@ -26,80 +26,80 @@ async function runCliBootstrapFixture(isPlatform) {
26
26
  `VITE_IS_PLATFORM=${String(isPlatform)}`,
27
27
  `DATABASE_PATH=${fixtureDatabasePath.replace(/\\/g, '/')}`,
28
28
  ].join('\n'), 'utf8');
29
- const fixtureIndexSource = `
30
- import { createCliService } from ${JSON.stringify(sourceModuleUrl('server', 'modules', 'cli', 'cli.service.ts'))};
31
- import { authenticateToken } from ${JSON.stringify(sourceModuleUrl('server', 'modules', 'auth', 'index.ts'))};
32
- import { getBrowserUseRuntime } from ${JSON.stringify(sourceModuleUrl('server', 'modules', 'browser-use', 'index.ts'))};
33
- import { closeConnection, initializeDatabase, userDb } from ${JSON.stringify(sourceModuleUrl('server', 'modules', 'database', 'index.ts'))};
34
-
35
- let environmentFileReads = 0;
36
-
37
- export function createCliApplication() {
38
- const service = createCliService({
39
- applicationRoot: ${JSON.stringify(fixtureRoot)},
40
- defaultDatabasePath: ${JSON.stringify(fixtureDatabasePath)},
41
- homeDirectory: ${JSON.stringify(fixtureRoot)},
42
- packageMetadata: { version: '1.0.0' },
43
- environment: process.env,
44
- fileSystem: {
45
- readTextFile: () => {
46
- environmentFileReads += 1;
47
- return '';
48
- },
49
- pathExists: () => false,
50
- getFileStats: () => ({ size: 0, modifiedAt: new Date(0) }),
51
- },
52
- output: { log: () => undefined, error: () => undefined },
53
- sandboxService: { execute: async () => 0 },
54
- getLatestPackageVersion: async () => '1.0.0',
55
- updateGlobalPackage: () => undefined,
56
- startServer: async () => undefined,
57
- startBrowserUseMcp: async () => undefined,
58
- });
59
-
60
- return {
61
- async run(argumentsList: string[]) {
62
- const exitCode = await service.run(argumentsList);
63
- await initializeDatabase();
64
- userDb.createUser('bootstrap-user', 'password-hash');
65
-
66
- const request: any = { headers: {}, query: {} };
67
- const response: any = {
68
- statusCode: 200,
69
- body: null,
70
- headers: {},
71
- setHeader(name: string, value: string) {
72
- this.headers[name] = value;
73
- },
74
- status(statusCode: number) {
75
- this.statusCode = statusCode;
76
- return this;
77
- },
78
- json(body: unknown) {
79
- this.body = body;
80
- return this;
81
- },
82
- };
83
- let authNextCalled = false;
84
- await authenticateToken(request, response, () => {
85
- authNextCalled = true;
86
- });
87
- const runtime = getBrowserUseRuntime();
88
-
89
- console.log(${JSON.stringify(RESULT_PREFIX)} + JSON.stringify({
90
- command: argumentsList[0] ?? null,
91
- environmentFileReads,
92
- mode: process.env.VITE_IS_PLATFORM ?? null,
93
- authNextCalled,
94
- authStatus: response.statusCode,
95
- authenticatedUsername: request.user?.username ?? null,
96
- runtime,
97
- }));
98
- closeConnection();
99
- return exitCode;
100
- },
101
- };
102
- }
29
+ const fixtureIndexSource = `
30
+ import { createCliService } from ${JSON.stringify(sourceModuleUrl('server', 'modules', 'cli', 'cli.service.ts'))};
31
+ import { authenticateToken } from ${JSON.stringify(sourceModuleUrl('server', 'modules', 'auth', 'index.ts'))};
32
+ import { getBrowserUseRuntime } from ${JSON.stringify(sourceModuleUrl('server', 'modules', 'browser-use', 'index.ts'))};
33
+ import { closeConnection, initializeDatabase, userDb } from ${JSON.stringify(sourceModuleUrl('server', 'modules', 'database', 'index.ts'))};
34
+
35
+ let environmentFileReads = 0;
36
+
37
+ export function createCliApplication() {
38
+ const service = createCliService({
39
+ applicationRoot: ${JSON.stringify(fixtureRoot)},
40
+ defaultDatabasePath: ${JSON.stringify(fixtureDatabasePath)},
41
+ homeDirectory: ${JSON.stringify(fixtureRoot)},
42
+ packageMetadata: { version: '1.0.0' },
43
+ environment: process.env,
44
+ fileSystem: {
45
+ readTextFile: () => {
46
+ environmentFileReads += 1;
47
+ return '';
48
+ },
49
+ pathExists: () => false,
50
+ getFileStats: () => ({ size: 0, modifiedAt: new Date(0) }),
51
+ },
52
+ output: { log: () => undefined, error: () => undefined },
53
+ sandboxService: { execute: async () => 0 },
54
+ getLatestPackageVersion: async () => '1.0.0',
55
+ updateGlobalPackage: () => undefined,
56
+ startServer: async () => undefined,
57
+ startBrowserUseMcp: async () => undefined,
58
+ });
59
+
60
+ return {
61
+ async run(argumentsList: string[]) {
62
+ const exitCode = await service.run(argumentsList);
63
+ await initializeDatabase();
64
+ userDb.createUser('bootstrap-user', 'password-hash');
65
+
66
+ const request: any = { headers: {}, query: {} };
67
+ const response: any = {
68
+ statusCode: 200,
69
+ body: null,
70
+ headers: {},
71
+ setHeader(name: string, value: string) {
72
+ this.headers[name] = value;
73
+ },
74
+ status(statusCode: number) {
75
+ this.statusCode = statusCode;
76
+ return this;
77
+ },
78
+ json(body: unknown) {
79
+ this.body = body;
80
+ return this;
81
+ },
82
+ };
83
+ let authNextCalled = false;
84
+ await authenticateToken(request, response, () => {
85
+ authNextCalled = true;
86
+ });
87
+ const runtime = getBrowserUseRuntime();
88
+
89
+ console.log(${JSON.stringify(RESULT_PREFIX)} + JSON.stringify({
90
+ command: argumentsList[0] ?? null,
91
+ environmentFileReads,
92
+ mode: process.env.VITE_IS_PLATFORM ?? null,
93
+ authNextCalled,
94
+ authStatus: response.statusCode,
95
+ authenticatedUsername: request.user?.username ?? null,
96
+ runtime,
97
+ }));
98
+ closeConnection();
99
+ return exitCode;
100
+ },
101
+ };
102
+ }
103
103
  `;
104
104
  await writeFile(path.join(fixtureCliDirectory, 'index.ts'), fixtureIndexSource, 'utf8');
105
105
  const childEnvironment = { ...process.env };
@@ -211,32 +211,32 @@ export function createCommandsRouter(dependencies) {
211
211
  ? [...builtInCommands, ...codexNativeCommands]
212
212
  : builtInCommands;
213
213
  const helpText = `# ${isCodex ? "Codex and CloudCLI" : "CloudCLI"} Commands
214
-
215
- ## Built-in Commands
216
-
214
+
215
+ ## Built-in Commands
216
+
217
217
  ${helpCommands
218
- .map((cmd) => `### ${cmd.name}
219
- ${cmd.description}
218
+ .map((cmd) => `### ${cmd.name}
219
+ ${cmd.description}
220
220
  `)
221
- .join("\n")}
222
-
223
- ## Custom Commands
224
-
225
- Custom commands can be created in:
226
- - Project: \`.claude/commands/\` (project-specific)
227
- - User: \`~/.claude/commands/\` (available in all projects)
228
-
229
- ### Command Syntax
230
-
231
- - **Arguments**: Use \`$ARGUMENTS\` for all args or \`$1\`, \`$2\`, etc. for positional
232
- - **File Includes**: Use \`@filename\` to include file contents
233
- - **Bash Commands**: Use \`!command\` to execute bash commands
234
-
235
- ### Examples
236
-
237
- \`\`\`markdown
238
- /mycommand arg1 arg2
239
- \`\`\`
221
+ .join("\n")}
222
+
223
+ ## Custom Commands
224
+
225
+ Custom commands can be created in:
226
+ - Project: \`.claude/commands/\` (project-specific)
227
+ - User: \`~/.claude/commands/\` (available in all projects)
228
+
229
+ ### Command Syntax
230
+
231
+ - **Arguments**: Use \`$ARGUMENTS\` for all args or \`$1\`, \`$2\`, etc. for positional
232
+ - **File Includes**: Use \`@filename\` to include file contents
233
+ - **Bash Commands**: Use \`!command\` to execute bash commands
234
+
235
+ ### Examples
236
+
237
+ \`\`\`markdown
238
+ /mycommand arg1 arg2
239
+ \`\`\`
240
240
  `;
241
241
  return {
242
242
  type: "builtin",
@@ -1,10 +1,10 @@
1
1
  import { APP_CONFIG_TABLE_SCHEMA_SQL, LAST_SCANNED_AT_SQL, NOTIFICATION_CHANNEL_ENDPOINTS_TABLE_SCHEMA_SQL, PROJECTS_TABLE_SCHEMA_SQL, PROVIDER_MODELS_TABLE_SCHEMA_SQL, PUSH_SUBSCRIPTIONS_TABLE_SCHEMA_SQL, SESSIONS_TABLE_SCHEMA_SQL, USER_NOTIFICATION_PREFERENCES_TABLE_SCHEMA_SQL, VAPID_KEYS_TABLE_SCHEMA_SQL, } from '../../modules/database/schema.js';
2
- const SQLITE_UUID_SQL = `
3
- lower(hex(randomblob(4))) || '-' ||
4
- lower(hex(randomblob(2))) || '-' ||
5
- lower(hex(randomblob(2))) || '-' ||
6
- lower(hex(randomblob(2))) || '-' ||
7
- lower(hex(randomblob(6)))
2
+ const SQLITE_UUID_SQL = `
3
+ lower(hex(randomblob(4))) || '-' ||
4
+ lower(hex(randomblob(2))) || '-' ||
5
+ lower(hex(randomblob(2))) || '-' ||
6
+ lower(hex(randomblob(2))) || '-' ||
7
+ lower(hex(randomblob(6)))
8
8
  `;
9
9
  const addColumnToTableIfNotExists = (db, tableName, columnNames, columnName, columnType) => {
10
10
  if (!columnNames.includes(columnName)) {
@@ -24,21 +24,21 @@ const migrateLegacySessionNames = (db) => {
24
24
  }
25
25
  if (hasSessionsTable) {
26
26
  console.log('Running migration: Merging session_names into sessions');
27
- db.exec(`
28
- INSERT INTO sessions (session_id, provider, custom_name, created_at, updated_at)
29
- SELECT
30
- session_id,
31
- COALESCE(provider, 'claude'),
32
- custom_name,
33
- COALESCE(created_at, CURRENT_TIMESTAMP),
34
- COALESCE(updated_at, CURRENT_TIMESTAMP)
35
- FROM session_names
36
- WHERE true
37
- ON CONFLICT(session_id) DO UPDATE SET
38
- provider = excluded.provider,
39
- custom_name = COALESCE(excluded.custom_name, sessions.custom_name),
40
- created_at = COALESCE(sessions.created_at, excluded.created_at),
41
- updated_at = COALESCE(excluded.updated_at, sessions.updated_at)
27
+ db.exec(`
28
+ INSERT INTO sessions (session_id, provider, custom_name, created_at, updated_at)
29
+ SELECT
30
+ session_id,
31
+ COALESCE(provider, 'claude'),
32
+ custom_name,
33
+ COALESCE(created_at, CURRENT_TIMESTAMP),
34
+ COALESCE(updated_at, CURRENT_TIMESTAMP)
35
+ FROM session_names
36
+ WHERE true
37
+ ON CONFLICT(session_id) DO UPDATE SET
38
+ provider = excluded.provider,
39
+ custom_name = COALESCE(excluded.custom_name, sessions.custom_name),
40
+ created_at = COALESCE(sessions.created_at, excluded.created_at),
41
+ updated_at = COALESCE(excluded.updated_at, sessions.updated_at)
42
42
  `);
43
43
  db.exec('DROP TABLE session_names');
44
44
  return;
@@ -52,23 +52,23 @@ const migrateLegacyWorkspaceTableIntoProjects = (db) => {
52
52
  return;
53
53
  }
54
54
  console.log('Running migration: Migrating workspace_original_paths data into projects');
55
- db.exec(`
56
- INSERT INTO projects (project_id, project_path, custom_project_name, isStarred, isArchived)
57
- SELECT
58
- CASE
59
- WHEN workspace_id IS NULL OR trim(workspace_id) = ''
60
- THEN ${SQLITE_UUID_SQL}
61
- ELSE workspace_id
62
- END,
63
- workspace_path,
64
- custom_workspace_name,
65
- COALESCE(isStarred, 0),
66
- 0
67
- FROM workspace_original_paths
68
- WHERE workspace_path IS NOT NULL AND trim(workspace_path) <> ''
69
- ON CONFLICT(project_path) DO UPDATE SET
70
- custom_project_name = COALESCE(projects.custom_project_name, excluded.custom_project_name),
71
- isStarred = COALESCE(projects.isStarred, excluded.isStarred)
55
+ db.exec(`
56
+ INSERT INTO projects (project_id, project_path, custom_project_name, isStarred, isArchived)
57
+ SELECT
58
+ CASE
59
+ WHEN workspace_id IS NULL OR trim(workspace_id) = ''
60
+ THEN ${SQLITE_UUID_SQL}
61
+ ELSE workspace_id
62
+ END,
63
+ workspace_path,
64
+ custom_workspace_name,
65
+ COALESCE(isStarred, 0),
66
+ 0
67
+ FROM workspace_original_paths
68
+ WHERE workspace_path IS NOT NULL AND trim(workspace_path) <> ''
69
+ ON CONFLICT(project_path) DO UPDATE SET
70
+ custom_project_name = COALESCE(projects.custom_project_name, excluded.custom_project_name),
71
+ isStarred = COALESCE(projects.isStarred, excluded.isStarred)
72
72
  `);
73
73
  };
74
74
  const rebuildProjectsTableWithPrimaryKeySchema = (db) => {
@@ -84,10 +84,10 @@ const rebuildProjectsTableWithPrimaryKeySchema = (db) => {
84
84
  addColumnToTableIfNotExists(db, 'projects', columnNames, 'custom_project_name', 'TEXT DEFAULT NULL');
85
85
  addColumnToTableIfNotExists(db, 'projects', columnNames, 'isStarred', 'BOOLEAN DEFAULT 0');
86
86
  addColumnToTableIfNotExists(db, 'projects', columnNames, 'isArchived', 'BOOLEAN DEFAULT 0');
87
- db.exec(`
88
- UPDATE projects
89
- SET project_id = ${SQLITE_UUID_SQL}
90
- WHERE project_id IS NULL OR trim(project_id) = ''
87
+ db.exec(`
88
+ UPDATE projects
89
+ SET project_id = ${SQLITE_UUID_SQL}
90
+ WHERE project_id IS NULL OR trim(project_id) = ''
91
91
  `);
92
92
  return;
93
93
  }
@@ -105,76 +105,76 @@ const rebuildProjectsTableWithPrimaryKeySchema = (db) => {
105
105
  const isStarredExpression = columnNames.includes('isStarred') ? 'COALESCE(isStarred, 0)' : '0';
106
106
  const isArchivedExpression = columnNames.includes('isArchived') ? 'COALESCE(isArchived, 0)' : '0';
107
107
  const projectIdExpression = columnNames.includes('project_id')
108
- ? `CASE
109
- WHEN project_id IS NULL OR trim(project_id) = ''
110
- THEN ${SQLITE_UUID_SQL}
111
- ELSE project_id
108
+ ? `CASE
109
+ WHEN project_id IS NULL OR trim(project_id) = ''
110
+ THEN ${SQLITE_UUID_SQL}
111
+ ELSE project_id
112
112
  END`
113
113
  : SQLITE_UUID_SQL;
114
114
  db.exec('PRAGMA foreign_keys = OFF');
115
115
  try {
116
116
  db.exec('BEGIN TRANSACTION');
117
117
  db.exec('DROP TABLE IF EXISTS projects__new');
118
- db.exec(`
119
- CREATE TABLE projects__new (
120
- project_id TEXT PRIMARY KEY NOT NULL,
121
- project_path TEXT NOT NULL UNIQUE,
122
- custom_project_name TEXT DEFAULT NULL,
123
- isStarred BOOLEAN DEFAULT 0,
124
- isArchived BOOLEAN DEFAULT 0
125
- )
118
+ db.exec(`
119
+ CREATE TABLE projects__new (
120
+ project_id TEXT PRIMARY KEY NOT NULL,
121
+ project_path TEXT NOT NULL UNIQUE,
122
+ custom_project_name TEXT DEFAULT NULL,
123
+ isStarred BOOLEAN DEFAULT 0,
124
+ isArchived BOOLEAN DEFAULT 0
125
+ )
126
126
  `);
127
- db.exec(`
128
- WITH source_rows AS (
129
- SELECT
130
- ${projectPathExpression} AS project_path,
131
- ${customProjectNameExpression} AS custom_project_name,
132
- ${isStarredExpression} AS isStarred,
133
- ${isArchivedExpression} AS isArchived,
134
- ${projectIdExpression} AS candidate_project_id,
135
- rowid AS source_rowid
136
- FROM projects
137
- WHERE ${projectPathExpression} IS NOT NULL AND trim(${projectPathExpression}) <> ''
138
- ),
139
- deduped_paths AS (
140
- SELECT
141
- project_path,
142
- custom_project_name,
143
- isStarred,
144
- isArchived,
145
- candidate_project_id,
146
- source_rowid,
147
- ROW_NUMBER() OVER (PARTITION BY project_path ORDER BY source_rowid) AS project_path_rank
148
- FROM source_rows
149
- ),
150
- prepared_rows AS (
151
- SELECT
152
- CASE
153
- WHEN ROW_NUMBER() OVER (PARTITION BY candidate_project_id ORDER BY source_rowid) = 1
154
- THEN candidate_project_id
155
- ELSE ${SQLITE_UUID_SQL}
156
- END AS project_id,
157
- project_path,
158
- custom_project_name,
159
- isStarred,
160
- isArchived
161
- FROM deduped_paths
162
- WHERE project_path_rank = 1
163
- )
164
- INSERT INTO projects__new (
165
- project_id,
166
- project_path,
167
- custom_project_name,
168
- isStarred,
169
- isArchived
170
- )
171
- SELECT
172
- project_id,
173
- project_path,
174
- custom_project_name,
175
- isStarred,
176
- isArchived
177
- FROM prepared_rows
127
+ db.exec(`
128
+ WITH source_rows AS (
129
+ SELECT
130
+ ${projectPathExpression} AS project_path,
131
+ ${customProjectNameExpression} AS custom_project_name,
132
+ ${isStarredExpression} AS isStarred,
133
+ ${isArchivedExpression} AS isArchived,
134
+ ${projectIdExpression} AS candidate_project_id,
135
+ rowid AS source_rowid
136
+ FROM projects
137
+ WHERE ${projectPathExpression} IS NOT NULL AND trim(${projectPathExpression}) <> ''
138
+ ),
139
+ deduped_paths AS (
140
+ SELECT
141
+ project_path,
142
+ custom_project_name,
143
+ isStarred,
144
+ isArchived,
145
+ candidate_project_id,
146
+ source_rowid,
147
+ ROW_NUMBER() OVER (PARTITION BY project_path ORDER BY source_rowid) AS project_path_rank
148
+ FROM source_rows
149
+ ),
150
+ prepared_rows AS (
151
+ SELECT
152
+ CASE
153
+ WHEN ROW_NUMBER() OVER (PARTITION BY candidate_project_id ORDER BY source_rowid) = 1
154
+ THEN candidate_project_id
155
+ ELSE ${SQLITE_UUID_SQL}
156
+ END AS project_id,
157
+ project_path,
158
+ custom_project_name,
159
+ isStarred,
160
+ isArchived
161
+ FROM deduped_paths
162
+ WHERE project_path_rank = 1
163
+ )
164
+ INSERT INTO projects__new (
165
+ project_id,
166
+ project_path,
167
+ custom_project_name,
168
+ isStarred,
169
+ isArchived
170
+ )
171
+ SELECT
172
+ project_id,
173
+ project_path,
174
+ custom_project_name,
175
+ isStarred,
176
+ isArchived
177
+ FROM prepared_rows
178
178
  `);
179
179
  db.exec('DROP TABLE projects');
180
180
  db.exec('ALTER TABLE projects__new RENAME TO projects');
@@ -242,74 +242,74 @@ const rebuildSessionsTableWithProjectSchema = (db) => {
242
242
  try {
243
243
  db.exec('BEGIN TRANSACTION');
244
244
  db.exec('DROP TABLE IF EXISTS sessions__new');
245
- db.exec(`
246
- CREATE TABLE sessions__new (
247
- session_id TEXT NOT NULL,
248
- provider TEXT NOT NULL DEFAULT 'claude',
249
- custom_name TEXT,
250
- project_path TEXT,
251
- jsonl_path TEXT,
252
- isArchived BOOLEAN DEFAULT 0,
253
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
254
- updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
255
- PRIMARY KEY (session_id),
256
- FOREIGN KEY (project_path) REFERENCES projects(project_path)
257
- ON DELETE SET NULL
258
- ON UPDATE CASCADE
259
- )
245
+ db.exec(`
246
+ CREATE TABLE sessions__new (
247
+ session_id TEXT NOT NULL,
248
+ provider TEXT NOT NULL DEFAULT 'claude',
249
+ custom_name TEXT,
250
+ project_path TEXT,
251
+ jsonl_path TEXT,
252
+ isArchived BOOLEAN DEFAULT 0,
253
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
254
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
255
+ PRIMARY KEY (session_id),
256
+ FOREIGN KEY (project_path) REFERENCES projects(project_path)
257
+ ON DELETE SET NULL
258
+ ON UPDATE CASCADE
259
+ )
260
260
  `);
261
- db.exec(`
262
- WITH source_rows AS (
263
- SELECT
264
- session_id,
265
- ${providerExpression} AS provider,
266
- ${customNameExpression} AS custom_name,
267
- ${projectPathExpression} AS project_path,
268
- ${jsonlPathExpression} AS jsonl_path,
269
- ${isArchivedExpression} AS isArchived,
270
- ${createdAtExpression} AS created_at,
271
- ${updatedAtExpression} AS updated_at,
272
- rowid AS source_rowid
273
- FROM sessions
274
- WHERE session_id IS NOT NULL AND trim(session_id) <> ''
275
- ),
276
- ranked_rows AS (
277
- SELECT
278
- session_id,
279
- provider,
280
- custom_name,
281
- project_path,
282
- jsonl_path,
283
- isArchived,
284
- created_at,
285
- updated_at,
286
- ROW_NUMBER() OVER (
287
- PARTITION BY session_id
288
- ORDER BY datetime(COALESCE(updated_at, created_at)) DESC, source_rowid DESC
289
- ) AS session_rank
290
- FROM source_rows
291
- )
292
- INSERT INTO sessions__new (
293
- session_id,
294
- provider,
295
- custom_name,
296
- project_path,
297
- jsonl_path,
298
- isArchived,
299
- created_at,
300
- updated_at
301
- )
302
- SELECT
303
- session_id,
304
- provider,
305
- custom_name,
306
- project_path,
307
- jsonl_path,
308
- isArchived,
309
- created_at,
310
- updated_at
311
- FROM ranked_rows
312
- WHERE session_rank = 1
261
+ db.exec(`
262
+ WITH source_rows AS (
263
+ SELECT
264
+ session_id,
265
+ ${providerExpression} AS provider,
266
+ ${customNameExpression} AS custom_name,
267
+ ${projectPathExpression} AS project_path,
268
+ ${jsonlPathExpression} AS jsonl_path,
269
+ ${isArchivedExpression} AS isArchived,
270
+ ${createdAtExpression} AS created_at,
271
+ ${updatedAtExpression} AS updated_at,
272
+ rowid AS source_rowid
273
+ FROM sessions
274
+ WHERE session_id IS NOT NULL AND trim(session_id) <> ''
275
+ ),
276
+ ranked_rows AS (
277
+ SELECT
278
+ session_id,
279
+ provider,
280
+ custom_name,
281
+ project_path,
282
+ jsonl_path,
283
+ isArchived,
284
+ created_at,
285
+ updated_at,
286
+ ROW_NUMBER() OVER (
287
+ PARTITION BY session_id
288
+ ORDER BY datetime(COALESCE(updated_at, created_at)) DESC, source_rowid DESC
289
+ ) AS session_rank
290
+ FROM source_rows
291
+ )
292
+ INSERT INTO sessions__new (
293
+ session_id,
294
+ provider,
295
+ custom_name,
296
+ project_path,
297
+ jsonl_path,
298
+ isArchived,
299
+ created_at,
300
+ updated_at
301
+ )
302
+ SELECT
303
+ session_id,
304
+ provider,
305
+ custom_name,
306
+ project_path,
307
+ jsonl_path,
308
+ isArchived,
309
+ created_at,
310
+ updated_at
311
+ FROM ranked_rows
312
+ WHERE session_rank = 1
313
313
  `);
314
314
  db.exec('DROP TABLE sessions');
315
315
  db.exec('ALTER TABLE sessions__new RENAME TO sessions');
@@ -334,10 +334,10 @@ const addProviderSessionIdMapping = (db) => {
334
334
  const sessionsTableInfo = getTableInfo(db, 'sessions');
335
335
  const columnNames = sessionsTableInfo.map((column) => column.name);
336
336
  addColumnToTableIfNotExists(db, 'sessions', columnNames, 'provider_session_id', 'TEXT');
337
- db.exec(`
338
- UPDATE sessions
339
- SET provider_session_id = session_id
340
- WHERE provider_session_id IS NULL
337
+ db.exec(`
338
+ UPDATE sessions
339
+ SET provider_session_id = session_id
340
+ WHERE provider_session_id IS NULL
341
341
  `);
342
342
  };
343
343
  /**
@@ -367,17 +367,17 @@ const ensureProjectsForSessionPaths = (db) => {
367
367
  if (!tableExists(db, 'sessions')) {
368
368
  return;
369
369
  }
370
- db.exec(`
371
- INSERT INTO projects (project_id, project_path, custom_project_name, isStarred, isArchived)
372
- SELECT
373
- ${SQLITE_UUID_SQL},
374
- project_path,
375
- NULL,
376
- 0,
377
- 0
378
- FROM sessions
379
- WHERE project_path IS NOT NULL AND trim(project_path) <> ''
380
- ON CONFLICT(project_path) DO NOTHING
370
+ db.exec(`
371
+ INSERT INTO projects (project_id, project_path, custom_project_name, isStarred, isArchived)
372
+ SELECT
373
+ ${SQLITE_UUID_SQL},
374
+ project_path,
375
+ NULL,
376
+ 0,
377
+ 0
378
+ FROM sessions
379
+ WHERE project_path IS NOT NULL AND trim(project_path) <> ''
380
+ ON CONFLICT(project_path) DO NOTHING
381
381
  `);
382
382
  };
383
383
  export const runMigrations = (db) => {
@@ -396,9 +396,9 @@ export const runMigrations = (db) => {
396
396
  db.exec('CREATE INDEX IF NOT EXISTS idx_notification_channel_endpoints_user_channel ON notification_channel_endpoints(user_id, channel)');
397
397
  db.exec('CREATE INDEX IF NOT EXISTS idx_notification_channel_endpoints_enabled ON notification_channel_endpoints(enabled)');
398
398
  db.exec(PROVIDER_MODELS_TABLE_SCHEMA_SQL);
399
- db.exec(`
400
- CREATE INDEX IF NOT EXISTS idx_provider_models_provider_order
401
- ON provider_models(provider, sort_order, id)
399
+ db.exec(`
400
+ CREATE INDEX IF NOT EXISTS idx_provider_models_provider_order
401
+ ON provider_models(provider, sort_order, id)
402
402
  `);
403
403
  db.exec(PROJECTS_TABLE_SCHEMA_SQL);
404
404
  rebuildProjectsTableWithPrimaryKeySchema(db);
@@ -42,9 +42,9 @@ export const apiKeysDb = {
42
42
  validateApiKey(apiKey) {
43
43
  const db = getConnection();
44
44
  const row = db
45
- .prepare(`SELECT u.id, u.username, ak.id as api_key_id
46
- FROM api_keys ak
47
- JOIN users u ON ak.user_id = u.id
45
+ .prepare(`SELECT u.id, u.username, ak.id as api_key_id
46
+ FROM api_keys ak
47
+ JOIN users u ON ak.user_id = u.id
48
48
  WHERE ak.api_key = ? AND ak.is_active = 1 AND u.is_active = 1`)
49
49
  .get(apiKey);
50
50
  if (row) {