@glwhappen/web-code 1.32.0

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 (479) hide show
  1. package/LICENSE +718 -0
  2. package/README.de.md +250 -0
  3. package/README.ja.md +242 -0
  4. package/README.ko.md +242 -0
  5. package/README.md +252 -0
  6. package/README.ru.md +250 -0
  7. package/README.tr.md +252 -0
  8. package/README.zh-CN.md +242 -0
  9. package/dist/api-docs.html +879 -0
  10. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  11. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  12. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  13. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  14. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  15. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  16. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  17. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  18. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  19. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  20. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  21. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  22. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  23. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  24. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  25. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  26. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  27. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  28. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  29. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  30. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  31. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  32. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  33. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  34. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  35. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  36. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  37. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  38. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  39. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  40. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  41. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  42. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  43. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  44. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  45. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  46. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  47. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  48. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  49. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  50. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  51. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  52. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  53. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  54. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  55. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  56. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  57. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  58. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  59. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  60. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  61. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  62. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  63. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  64. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  65. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  66. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  67. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  68. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  69. package/dist/assets/index-Ct6oPUQk.css +32 -0
  70. package/dist/assets/index-u6XmIqLb.js +1346 -0
  71. package/dist/assets/vendor-codemirror-OwyKSvPE.js +41 -0
  72. package/dist/assets/vendor-react-BGZc9oRE.js +59 -0
  73. package/dist/assets/vendor-xterm-CJZjLICi.js +66 -0
  74. package/dist/clear-cache.html +85 -0
  75. package/dist/convert-icons.md +53 -0
  76. package/dist/favicon.png +0 -0
  77. package/dist/favicon.svg +9 -0
  78. package/dist/generate-icons.js +49 -0
  79. package/dist/icons/claude-ai-icon.svg +1 -0
  80. package/dist/icons/codex-white.svg +3 -0
  81. package/dist/icons/codex.svg +3 -0
  82. package/dist/icons/cursor-white.svg +12 -0
  83. package/dist/icons/cursor.svg +1 -0
  84. package/dist/icons/gemini-ai-icon.svg +1 -0
  85. package/dist/icons/icon-128x128.png +0 -0
  86. package/dist/icons/icon-128x128.svg +12 -0
  87. package/dist/icons/icon-144x144.png +0 -0
  88. package/dist/icons/icon-144x144.svg +12 -0
  89. package/dist/icons/icon-152x152.png +0 -0
  90. package/dist/icons/icon-152x152.svg +12 -0
  91. package/dist/icons/icon-192x192.png +0 -0
  92. package/dist/icons/icon-192x192.svg +12 -0
  93. package/dist/icons/icon-384x384.png +0 -0
  94. package/dist/icons/icon-384x384.svg +12 -0
  95. package/dist/icons/icon-512x512.png +0 -0
  96. package/dist/icons/icon-512x512.svg +12 -0
  97. package/dist/icons/icon-72x72.png +0 -0
  98. package/dist/icons/icon-72x72.svg +12 -0
  99. package/dist/icons/icon-96x96.png +0 -0
  100. package/dist/icons/icon-96x96.svg +12 -0
  101. package/dist/icons/icon-template.svg +12 -0
  102. package/dist/index.html +52 -0
  103. package/dist/logo-128.png +0 -0
  104. package/dist/logo-256.png +0 -0
  105. package/dist/logo-32.png +0 -0
  106. package/dist/logo-512.png +0 -0
  107. package/dist/logo-64.png +0 -0
  108. package/dist/logo.svg +17 -0
  109. package/dist/manifest.json +61 -0
  110. package/dist/screenshots/cli-selection.png +0 -0
  111. package/dist/screenshots/desktop-main.png +0 -0
  112. package/dist/screenshots/mobile-chat.png +0 -0
  113. package/dist/screenshots/tools-modal.png +0 -0
  114. package/dist/sw.js +124 -0
  115. package/dist-server/server/claude-sdk.js +738 -0
  116. package/dist-server/server/claude-sdk.js.map +1 -0
  117. package/dist-server/server/cli.js +641 -0
  118. package/dist-server/server/cli.js.map +1 -0
  119. package/dist-server/server/constants/config.js +6 -0
  120. package/dist-server/server/constants/config.js.map +1 -0
  121. package/dist-server/server/cursor-cli.js +271 -0
  122. package/dist-server/server/cursor-cli.js.map +1 -0
  123. package/dist-server/server/gemini-cli.js +539 -0
  124. package/dist-server/server/gemini-cli.js.map +1 -0
  125. package/dist-server/server/gemini-response-handler.js +72 -0
  126. package/dist-server/server/gemini-response-handler.js.map +1 -0
  127. package/dist-server/server/index.js +1340 -0
  128. package/dist-server/server/index.js.map +1 -0
  129. package/dist-server/server/load-env.js +32 -0
  130. package/dist-server/server/load-env.js.map +1 -0
  131. package/dist-server/server/middleware/auth.js +117 -0
  132. package/dist-server/server/middleware/auth.js.map +1 -0
  133. package/dist-server/server/modules/database/connection.js +125 -0
  134. package/dist-server/server/modules/database/connection.js.map +1 -0
  135. package/dist-server/server/modules/database/index.js +13 -0
  136. package/dist-server/server/modules/database/index.js.map +1 -0
  137. package/dist-server/server/modules/database/init-db.js +18 -0
  138. package/dist-server/server/modules/database/init-db.js.map +1 -0
  139. package/dist-server/server/modules/database/migrations.js +419 -0
  140. package/dist-server/server/modules/database/migrations.js.map +1 -0
  141. package/dist-server/server/modules/database/repositories/api-keys.js +72 -0
  142. package/dist-server/server/modules/database/repositories/api-keys.js.map +1 -0
  143. package/dist-server/server/modules/database/repositories/app-config.js +47 -0
  144. package/dist-server/server/modules/database/repositories/app-config.js.map +1 -0
  145. package/dist-server/server/modules/database/repositories/credentials.js +68 -0
  146. package/dist-server/server/modules/database/repositories/credentials.js.map +1 -0
  147. package/dist-server/server/modules/database/repositories/github-tokens.js +54 -0
  148. package/dist-server/server/modules/database/repositories/github-tokens.js.map +1 -0
  149. package/dist-server/server/modules/database/repositories/notification-preferences.js +72 -0
  150. package/dist-server/server/modules/database/repositories/notification-preferences.js.map +1 -0
  151. package/dist-server/server/modules/database/repositories/projects.db.integration.test.js +67 -0
  152. package/dist-server/server/modules/database/repositories/projects.db.integration.test.js.map +1 -0
  153. package/dist-server/server/modules/database/repositories/projects.db.js +185 -0
  154. package/dist-server/server/modules/database/repositories/projects.db.js.map +1 -0
  155. package/dist-server/server/modules/database/repositories/push-subscriptions.js +49 -0
  156. package/dist-server/server/modules/database/repositories/push-subscriptions.js.map +1 -0
  157. package/dist-server/server/modules/database/repositories/scan-state.db.js +31 -0
  158. package/dist-server/server/modules/database/repositories/scan-state.db.js.map +1 -0
  159. package/dist-server/server/modules/database/repositories/sessions.db.integration.test.js +64 -0
  160. package/dist-server/server/modules/database/repositories/sessions.db.integration.test.js.map +1 -0
  161. package/dist-server/server/modules/database/repositories/sessions.db.js +150 -0
  162. package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -0
  163. package/dist-server/server/modules/database/repositories/users.js +116 -0
  164. package/dist-server/server/modules/database/repositories/users.js.map +1 -0
  165. package/dist-server/server/modules/database/repositories/vapid-keys.js +38 -0
  166. package/dist-server/server/modules/database/repositories/vapid-keys.js.map +1 -0
  167. package/dist-server/server/modules/database/schema.js +150 -0
  168. package/dist-server/server/modules/database/schema.js.map +1 -0
  169. package/dist-server/server/modules/projects/index.js +4 -0
  170. package/dist-server/server/modules/projects/index.js.map +1 -0
  171. package/dist-server/server/modules/projects/projects.routes.js +225 -0
  172. package/dist-server/server/modules/projects/projects.routes.js.map +1 -0
  173. package/dist-server/server/modules/projects/services/project-clone.service.js +220 -0
  174. package/dist-server/server/modules/projects/services/project-clone.service.js.map +1 -0
  175. package/dist-server/server/modules/projects/services/project-delete.service.js +83 -0
  176. package/dist-server/server/modules/projects/services/project-delete.service.js.map +1 -0
  177. package/dist-server/server/modules/projects/services/project-management.service.js +99 -0
  178. package/dist-server/server/modules/projects/services/project-management.service.js.map +1 -0
  179. package/dist-server/server/modules/projects/services/project-star.service.js +60 -0
  180. package/dist-server/server/modules/projects/services/project-star.service.js.map +1 -0
  181. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js +171 -0
  182. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js.map +1 -0
  183. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js +213 -0
  184. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js.map +1 -0
  185. package/dist-server/server/modules/projects/tests/project-clone.service.test.js +129 -0
  186. package/dist-server/server/modules/projects/tests/project-clone.service.test.js.map +1 -0
  187. package/dist-server/server/modules/projects/tests/project-management.service.test.js +89 -0
  188. package/dist-server/server/modules/projects/tests/project-management.service.test.js.map +1 -0
  189. package/dist-server/server/modules/projects/tests/project-star.service.test.js +99 -0
  190. package/dist-server/server/modules/projects/tests/project-star.service.test.js.map +1 -0
  191. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js +88 -0
  192. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js.map +1 -0
  193. package/dist-server/server/modules/providers/index.js +5 -0
  194. package/dist-server/server/modules/providers/index.js.map +1 -0
  195. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +104 -0
  196. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -0
  197. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js +103 -0
  198. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js.map +1 -0
  199. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +116 -0
  200. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -0
  201. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +546 -0
  202. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -0
  203. package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js +198 -0
  204. package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js.map +1 -0
  205. package/dist-server/server/modules/providers/list/claude/claude.provider.js +17 -0
  206. package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -0
  207. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +84 -0
  208. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -0
  209. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js +107 -0
  210. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js.map +1 -0
  211. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +123 -0
  212. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -0
  213. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +513 -0
  214. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -0
  215. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js +82 -0
  216. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js.map +1 -0
  217. package/dist-server/server/modules/providers/list/codex/codex.provider.js +17 -0
  218. package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -0
  219. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +118 -0
  220. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -0
  221. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js +80 -0
  222. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js.map +1 -0
  223. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js +105 -0
  224. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -0
  225. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +545 -0
  226. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -0
  227. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js +28 -0
  228. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js.map +1 -0
  229. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +17 -0
  230. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -0
  231. package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js +254 -0
  232. package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js.map +1 -0
  233. package/dist-server/server/modules/providers/list/gemini/gemini-mcp.provider.js +82 -0
  234. package/dist-server/server/modules/providers/list/gemini/gemini-mcp.provider.js.map +1 -0
  235. package/dist-server/server/modules/providers/list/gemini/gemini-session-synchronizer.provider.js +312 -0
  236. package/dist-server/server/modules/providers/list/gemini/gemini-session-synchronizer.provider.js.map +1 -0
  237. package/dist-server/server/modules/providers/list/gemini/gemini-sessions.provider.js +484 -0
  238. package/dist-server/server/modules/providers/list/gemini/gemini-sessions.provider.js.map +1 -0
  239. package/dist-server/server/modules/providers/list/gemini/gemini-skills.provider.js +33 -0
  240. package/dist-server/server/modules/providers/list/gemini/gemini-skills.provider.js.map +1 -0
  241. package/dist-server/server/modules/providers/list/gemini/gemini.provider.js +17 -0
  242. package/dist-server/server/modules/providers/list/gemini/gemini.provider.js.map +1 -0
  243. package/dist-server/server/modules/providers/provider.registry.js +31 -0
  244. package/dist-server/server/modules/providers/provider.registry.js.map +1 -0
  245. package/dist-server/server/modules/providers/provider.routes.js +377 -0
  246. package/dist-server/server/modules/providers/provider.routes.js.map +1 -0
  247. package/dist-server/server/modules/providers/services/mcp.service.js +69 -0
  248. package/dist-server/server/modules/providers/services/mcp.service.js.map +1 -0
  249. package/dist-server/server/modules/providers/services/provider-auth.service.js +25 -0
  250. package/dist-server/server/modules/providers/services/provider-auth.service.js.map +1 -0
  251. package/dist-server/server/modules/providers/services/session-conversations-search.service.js +984 -0
  252. package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -0
  253. package/dist-server/server/modules/providers/services/session-synchronizer.service.js +56 -0
  254. package/dist-server/server/modules/providers/services/session-synchronizer.service.js.map +1 -0
  255. package/dist-server/server/modules/providers/services/sessions-watcher.service.js +269 -0
  256. package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -0
  257. package/dist-server/server/modules/providers/services/sessions.service.js +179 -0
  258. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -0
  259. package/dist-server/server/modules/providers/services/skills.service.js +11 -0
  260. package/dist-server/server/modules/providers/services/skills.service.js.map +1 -0
  261. package/dist-server/server/modules/providers/shared/base/abstract.provider.js +14 -0
  262. package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -0
  263. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js +102 -0
  264. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js.map +1 -0
  265. package/dist-server/server/modules/providers/shared/skills/skills.provider.js +45 -0
  266. package/dist-server/server/modules/providers/shared/skills/skills.provider.js.map +1 -0
  267. package/dist-server/server/modules/providers/tests/mcp.test.js +250 -0
  268. package/dist-server/server/modules/providers/tests/mcp.test.js.map +1 -0
  269. package/dist-server/server/modules/providers/tests/skills.test.js +226 -0
  270. package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -0
  271. package/dist-server/server/modules/websocket/index.js +3 -0
  272. package/dist-server/server/modules/websocket/index.js.map +1 -0
  273. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +192 -0
  274. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -0
  275. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js +52 -0
  276. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js.map +1 -0
  277. package/dist-server/server/modules/websocket/services/shell-websocket.service.js +360 -0
  278. package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -0
  279. package/dist-server/server/modules/websocket/services/websocket-auth.service.js +32 -0
  280. package/dist-server/server/modules/websocket/services/websocket-auth.service.js.map +1 -0
  281. package/dist-server/server/modules/websocket/services/websocket-server.service.js +36 -0
  282. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -0
  283. package/dist-server/server/modules/websocket/services/websocket-state.service.js +14 -0
  284. package/dist-server/server/modules/websocket/services/websocket-state.service.js.map +1 -0
  285. package/dist-server/server/modules/websocket/services/websocket-writer.service.js +32 -0
  286. package/dist-server/server/modules/websocket/services/websocket-writer.service.js.map +1 -0
  287. package/dist-server/server/openai-codex.js +418 -0
  288. package/dist-server/server/openai-codex.js.map +1 -0
  289. package/dist-server/server/routes/admin.js +109 -0
  290. package/dist-server/server/routes/admin.js.map +1 -0
  291. package/dist-server/server/routes/agent.js +1145 -0
  292. package/dist-server/server/routes/agent.js.map +1 -0
  293. package/dist-server/server/routes/auth.js +123 -0
  294. package/dist-server/server/routes/auth.js.map +1 -0
  295. package/dist-server/server/routes/commands.js +487 -0
  296. package/dist-server/server/routes/commands.js.map +1 -0
  297. package/dist-server/server/routes/cursor.js +49 -0
  298. package/dist-server/server/routes/cursor.js.map +1 -0
  299. package/dist-server/server/routes/gemini.js +25 -0
  300. package/dist-server/server/routes/gemini.js.map +1 -0
  301. package/dist-server/server/routes/git.js +1263 -0
  302. package/dist-server/server/routes/git.js.map +1 -0
  303. package/dist-server/server/routes/mcp-utils.js +29 -0
  304. package/dist-server/server/routes/mcp-utils.js.map +1 -0
  305. package/dist-server/server/routes/plugins.js +266 -0
  306. package/dist-server/server/routes/plugins.js.map +1 -0
  307. package/dist-server/server/routes/settings.js +259 -0
  308. package/dist-server/server/routes/settings.js.map +1 -0
  309. package/dist-server/server/routes/taskmaster.js +1360 -0
  310. package/dist-server/server/routes/taskmaster.js.map +1 -0
  311. package/dist-server/server/routes/user.js +115 -0
  312. package/dist-server/server/routes/user.js.map +1 -0
  313. package/dist-server/server/services/notification-orchestrator.js +177 -0
  314. package/dist-server/server/services/notification-orchestrator.js.map +1 -0
  315. package/dist-server/server/services/vapid-keys.js +27 -0
  316. package/dist-server/server/services/vapid-keys.js.map +1 -0
  317. package/dist-server/server/sessionManager.js +215 -0
  318. package/dist-server/server/sessionManager.js.map +1 -0
  319. package/dist-server/server/shared/claude-cli-path.js +103 -0
  320. package/dist-server/server/shared/claude-cli-path.js.map +1 -0
  321. package/dist-server/server/shared/claude-cli-path.test.js +45 -0
  322. package/dist-server/server/shared/claude-cli-path.test.js.map +1 -0
  323. package/dist-server/server/shared/default-user.js +29 -0
  324. package/dist-server/server/shared/default-user.js.map +1 -0
  325. package/dist-server/server/shared/frontmatter.js +16 -0
  326. package/dist-server/server/shared/frontmatter.js.map +1 -0
  327. package/dist-server/server/shared/interfaces.js +2 -0
  328. package/dist-server/server/shared/interfaces.js.map +1 -0
  329. package/dist-server/server/shared/types.js +2 -0
  330. package/dist-server/server/shared/types.js.map +1 -0
  331. package/dist-server/server/shared/utils.js +633 -0
  332. package/dist-server/server/shared/utils.js.map +1 -0
  333. package/dist-server/server/utils/colors.js +20 -0
  334. package/dist-server/server/utils/colors.js.map +1 -0
  335. package/dist-server/server/utils/commandParser.js +255 -0
  336. package/dist-server/server/utils/commandParser.js.map +1 -0
  337. package/dist-server/server/utils/gitConfig.js +36 -0
  338. package/dist-server/server/utils/gitConfig.js.map +1 -0
  339. package/dist-server/server/utils/mcp-detector.js +134 -0
  340. package/dist-server/server/utils/mcp-detector.js.map +1 -0
  341. package/dist-server/server/utils/plugin-loader.js +413 -0
  342. package/dist-server/server/utils/plugin-loader.js.map +1 -0
  343. package/dist-server/server/utils/plugin-process-manager.js +163 -0
  344. package/dist-server/server/utils/plugin-process-manager.js.map +1 -0
  345. package/dist-server/server/utils/runtime-paths.js +30 -0
  346. package/dist-server/server/utils/runtime-paths.js.map +1 -0
  347. package/dist-server/server/utils/taskmaster-websocket.js +124 -0
  348. package/dist-server/server/utils/taskmaster-websocket.js.map +1 -0
  349. package/dist-server/server/utils/url-detection.js +58 -0
  350. package/dist-server/server/utils/url-detection.js.map +1 -0
  351. package/dist-server/shared/modelConstants.js +99 -0
  352. package/dist-server/shared/modelConstants.js.map +1 -0
  353. package/dist-server/shared/networkHosts.js +20 -0
  354. package/dist-server/shared/networkHosts.js.map +1 -0
  355. package/package.json +169 -0
  356. package/scripts/fix-node-pty.js +67 -0
  357. package/server/claude-sdk.js +864 -0
  358. package/server/cli.js +688 -0
  359. package/server/constants/config.js +5 -0
  360. package/server/cursor-cli.js +334 -0
  361. package/server/gemini-cli.js +622 -0
  362. package/server/gemini-response-handler.js +79 -0
  363. package/server/index.js +1505 -0
  364. package/server/load-env.js +34 -0
  365. package/server/middleware/auth.js +142 -0
  366. package/server/modules/database/connection.ts +143 -0
  367. package/server/modules/database/index.ts +12 -0
  368. package/server/modules/database/init-db.ts +17 -0
  369. package/server/modules/database/migrations.ts +496 -0
  370. package/server/modules/database/repositories/api-keys.ts +119 -0
  371. package/server/modules/database/repositories/app-config.ts +53 -0
  372. package/server/modules/database/repositories/credentials.ts +106 -0
  373. package/server/modules/database/repositories/github-tokens.ts +100 -0
  374. package/server/modules/database/repositories/notification-preferences.ts +103 -0
  375. package/server/modules/database/repositories/projects.db.integration.test.ts +78 -0
  376. package/server/modules/database/repositories/projects.db.ts +210 -0
  377. package/server/modules/database/repositories/push-subscriptions.ts +80 -0
  378. package/server/modules/database/repositories/scan-state.db.ts +42 -0
  379. package/server/modules/database/repositories/sessions.db.integration.test.ts +78 -0
  380. package/server/modules/database/repositories/sessions.db.ts +230 -0
  381. package/server/modules/database/repositories/users.ts +186 -0
  382. package/server/modules/database/repositories/vapid-keys.ts +57 -0
  383. package/server/modules/database/schema.ts +159 -0
  384. package/server/modules/projects/index.ts +6 -0
  385. package/server/modules/projects/projects.routes.ts +292 -0
  386. package/server/modules/projects/services/project-clone.service.ts +327 -0
  387. package/server/modules/projects/services/project-delete.service.ts +95 -0
  388. package/server/modules/projects/services/project-management.service.ts +158 -0
  389. package/server/modules/projects/services/project-star.service.ts +78 -0
  390. package/server/modules/projects/services/projects-has-taskmaster.service.ts +257 -0
  391. package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +355 -0
  392. package/server/modules/projects/tests/project-clone.service.test.ts +186 -0
  393. package/server/modules/projects/tests/project-management.service.test.ts +122 -0
  394. package/server/modules/projects/tests/project-star.service.test.ts +128 -0
  395. package/server/modules/projects/tests/projects-has-taskmaster.service.test.ts +107 -0
  396. package/server/modules/providers/README.md +346 -0
  397. package/server/modules/providers/index.ts +5 -0
  398. package/server/modules/providers/list/claude/claude-auth.provider.ts +124 -0
  399. package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -0
  400. package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +179 -0
  401. package/server/modules/providers/list/claude/claude-sessions.provider.ts +642 -0
  402. package/server/modules/providers/list/claude/claude-skills.provider.ts +257 -0
  403. package/server/modules/providers/list/claude/claude.provider.ts +24 -0
  404. package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -0
  405. package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -0
  406. package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +182 -0
  407. package/server/modules/providers/list/codex/codex-sessions.provider.ts +589 -0
  408. package/server/modules/providers/list/codex/codex-skills.provider.ts +100 -0
  409. package/server/modules/providers/list/codex/codex.provider.ts +24 -0
  410. package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -0
  411. package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -0
  412. package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +155 -0
  413. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +624 -0
  414. package/server/modules/providers/list/cursor/cursor-skills.provider.ts +31 -0
  415. package/server/modules/providers/list/cursor/cursor.provider.ts +24 -0
  416. package/server/modules/providers/list/gemini/gemini-auth.provider.ts +307 -0
  417. package/server/modules/providers/list/gemini/gemini-mcp.provider.ts +110 -0
  418. package/server/modules/providers/list/gemini/gemini-session-synchronizer.provider.ts +407 -0
  419. package/server/modules/providers/list/gemini/gemini-sessions.provider.ts +552 -0
  420. package/server/modules/providers/list/gemini/gemini-skills.provider.ts +36 -0
  421. package/server/modules/providers/list/gemini/gemini.provider.ts +24 -0
  422. package/server/modules/providers/provider.registry.ts +36 -0
  423. package/server/modules/providers/provider.routes.ts +488 -0
  424. package/server/modules/providers/services/mcp.service.ts +94 -0
  425. package/server/modules/providers/services/provider-auth.service.ts +26 -0
  426. package/server/modules/providers/services/session-conversations-search.service.ts +1319 -0
  427. package/server/modules/providers/services/session-synchronizer.service.ts +75 -0
  428. package/server/modules/providers/services/sessions-watcher.service.ts +318 -0
  429. package/server/modules/providers/services/sessions.service.ts +240 -0
  430. package/server/modules/providers/services/skills.service.ts +15 -0
  431. package/server/modules/providers/shared/base/abstract.provider.ts +29 -0
  432. package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -0
  433. package/server/modules/providers/shared/skills/skills.provider.ts +64 -0
  434. package/server/modules/providers/tests/mcp.test.ts +293 -0
  435. package/server/modules/providers/tests/skills.test.ts +446 -0
  436. package/server/modules/websocket/README.md +267 -0
  437. package/server/modules/websocket/index.ts +2 -0
  438. package/server/modules/websocket/services/chat-websocket.service.ts +275 -0
  439. package/server/modules/websocket/services/plugin-websocket-proxy.service.ts +65 -0
  440. package/server/modules/websocket/services/shell-websocket.service.ts +489 -0
  441. package/server/modules/websocket/services/websocket-auth.service.ts +54 -0
  442. package/server/modules/websocket/services/websocket-server.service.ts +58 -0
  443. package/server/modules/websocket/services/websocket-state.service.ts +16 -0
  444. package/server/modules/websocket/services/websocket-writer.service.ts +38 -0
  445. package/server/openai-codex.js +474 -0
  446. package/server/routes/admin.js +128 -0
  447. package/server/routes/agent.js +1246 -0
  448. package/server/routes/auth.js +144 -0
  449. package/server/routes/commands.js +556 -0
  450. package/server/routes/cursor.js +52 -0
  451. package/server/routes/gemini.js +30 -0
  452. package/server/routes/git.js +1493 -0
  453. package/server/routes/mcp-utils.js +31 -0
  454. package/server/routes/plugins.js +307 -0
  455. package/server/routes/settings.js +286 -0
  456. package/server/routes/taskmaster.js +1468 -0
  457. package/server/routes/user.js +123 -0
  458. package/server/services/notification-orchestrator.js +228 -0
  459. package/server/services/vapid-keys.js +36 -0
  460. package/server/sessionManager.js +248 -0
  461. package/server/shared/claude-cli-path.test.ts +61 -0
  462. package/server/shared/claude-cli-path.ts +139 -0
  463. package/server/shared/default-user.ts +30 -0
  464. package/server/shared/frontmatter.ts +18 -0
  465. package/server/shared/interfaces.ts +111 -0
  466. package/server/shared/types.ts +406 -0
  467. package/server/shared/utils.ts +763 -0
  468. package/server/tsconfig.json +36 -0
  469. package/server/utils/colors.js +21 -0
  470. package/server/utils/commandParser.js +305 -0
  471. package/server/utils/gitConfig.js +34 -0
  472. package/server/utils/mcp-detector.js +147 -0
  473. package/server/utils/plugin-loader.js +457 -0
  474. package/server/utils/plugin-process-manager.js +184 -0
  475. package/server/utils/runtime-paths.js +37 -0
  476. package/server/utils/taskmaster-websocket.js +135 -0
  477. package/server/utils/url-detection.js +71 -0
  478. package/shared/modelConstants.js +107 -0
  479. package/shared/networkHosts.js +22 -0
@@ -0,0 +1,150 @@
1
+ import { getConnection } from '../../../modules/database/connection.js';
2
+ import { projectsDb } from '../../../modules/database/repositories/projects.db.js';
3
+ import { normalizeProjectPath } from '../../../shared/utils.js';
4
+ function normalizeTimestamp(value) {
5
+ if (!value)
6
+ return null;
7
+ const parsed = new Date(value);
8
+ if (Number.isNaN(parsed.getTime())) {
9
+ return null;
10
+ }
11
+ return parsed.toISOString();
12
+ }
13
+ function normalizeProjectPathForProvider(provider, projectPath) {
14
+ void provider;
15
+ return normalizeProjectPath(projectPath);
16
+ }
17
+ export const sessionsDb = {
18
+ createSession(userId, sessionId, provider, projectPath, customName, createdAt, updatedAt, jsonlPath) {
19
+ const db = getConnection();
20
+ const createdAtValue = normalizeTimestamp(createdAt);
21
+ const updatedAtValue = normalizeTimestamp(updatedAt);
22
+ const normalizedProjectPath = normalizeProjectPathForProvider(provider, projectPath);
23
+ // First, ensure the project path is recorded in the projects table,
24
+ // since it's a foreign key in the sessions table.
25
+ projectsDb.createProjectPath(userId, normalizedProjectPath);
26
+ db.prepare(`INSERT INTO sessions (session_id, user_id, provider, custom_name, project_path, jsonl_path, isArchived, created_at, updated_at)
27
+ VALUES (?, ?, ?, ?, ?, ?, 0, COALESCE(?, CURRENT_TIMESTAMP), COALESCE(?, CURRENT_TIMESTAMP))
28
+ ON CONFLICT(user_id, session_id) DO UPDATE SET
29
+ provider = excluded.provider,
30
+ updated_at = excluded.updated_at,
31
+ project_path = excluded.project_path,
32
+ jsonl_path = excluded.jsonl_path,
33
+ isArchived = 0,
34
+ custom_name = COALESCE(excluded.custom_name, sessions.custom_name)`).run(sessionId, userId, provider, customName ?? null, normalizedProjectPath, jsonlPath ?? null, createdAtValue, updatedAtValue);
35
+ return sessionId;
36
+ },
37
+ updateSessionCustomName(userId, sessionId, customName) {
38
+ const db = getConnection();
39
+ db.prepare(`UPDATE sessions
40
+ SET custom_name = ?
41
+ WHERE user_id = ? AND session_id = ?`).run(customName, userId, sessionId);
42
+ },
43
+ getSessionById(userId, sessionId) {
44
+ const db = getConnection();
45
+ const row = db
46
+ .prepare(`SELECT session_id, user_id, provider, project_path, jsonl_path, custom_name, isArchived, created_at, updated_at
47
+ FROM sessions
48
+ WHERE user_id = ? AND session_id = ?
49
+ ORDER BY updated_at DESC
50
+ LIMIT 1`)
51
+ .get(userId, sessionId);
52
+ return row ?? null;
53
+ },
54
+ getAllSessions(userId) {
55
+ const db = getConnection();
56
+ return db
57
+ .prepare(`SELECT session_id, user_id, provider, project_path, jsonl_path, custom_name, isArchived, created_at, updated_at
58
+ FROM sessions
59
+ WHERE user_id = ? AND isArchived = 0`)
60
+ .all(userId);
61
+ },
62
+ /**
63
+ * Archived rows are intentionally queried separately so the caller can render
64
+ * them in a dedicated view without reintroducing them into active session lists.
65
+ */
66
+ getArchivedSessions(userId) {
67
+ const db = getConnection();
68
+ return db
69
+ .prepare(`SELECT session_id, user_id, provider, project_path, jsonl_path, custom_name, isArchived, created_at, updated_at
70
+ FROM sessions
71
+ WHERE user_id = ? AND isArchived = 1
72
+ ORDER BY datetime(COALESCE(updated_at, created_at)) DESC, session_id DESC`)
73
+ .all(userId);
74
+ },
75
+ getSessionsByProjectPath(userId, projectPath) {
76
+ const db = getConnection();
77
+ const normalizedProjectPath = normalizeProjectPath(projectPath);
78
+ return db
79
+ .prepare(`SELECT session_id, user_id, provider, project_path, jsonl_path, custom_name, isArchived, created_at, updated_at
80
+ FROM sessions
81
+ WHERE user_id = ? AND project_path = ?
82
+ AND isArchived = 0`)
83
+ .all(userId, normalizedProjectPath);
84
+ },
85
+ /**
86
+ * Permanent project deletion must see every session row for the path,
87
+ * including archived ones, so their transcript files can be cleaned up.
88
+ */
89
+ getSessionsByProjectPathIncludingArchived(userId, projectPath) {
90
+ const db = getConnection();
91
+ const normalizedProjectPath = normalizeProjectPath(projectPath);
92
+ return db
93
+ .prepare(`SELECT session_id, user_id, provider, project_path, jsonl_path, custom_name, isArchived, created_at, updated_at
94
+ FROM sessions
95
+ WHERE user_id = ? AND project_path = ?`)
96
+ .all(userId, normalizedProjectPath);
97
+ },
98
+ getSessionsByProjectPathPage(userId, projectPath, limit, offset) {
99
+ const db = getConnection();
100
+ const normalizedProjectPath = normalizeProjectPath(projectPath);
101
+ return db
102
+ .prepare(`SELECT session_id, user_id, provider, project_path, jsonl_path, custom_name, isArchived, created_at, updated_at
103
+ FROM sessions
104
+ WHERE user_id = ? AND project_path = ?
105
+ AND isArchived = 0
106
+ ORDER BY datetime(COALESCE(updated_at, created_at)) DESC, session_id DESC
107
+ LIMIT ? OFFSET ?`)
108
+ .all(userId, normalizedProjectPath, limit, offset);
109
+ },
110
+ countSessionsByProjectPath(userId, projectPath) {
111
+ const db = getConnection();
112
+ const normalizedProjectPath = normalizeProjectPath(projectPath);
113
+ const row = db
114
+ .prepare(`SELECT COUNT(*) AS count
115
+ FROM sessions
116
+ WHERE user_id = ? AND project_path = ?
117
+ AND isArchived = 0`)
118
+ .get(userId, normalizedProjectPath);
119
+ return Number(row?.count ?? 0);
120
+ },
121
+ deleteSessionsByProjectPath(userId, projectPath) {
122
+ const db = getConnection();
123
+ const normalizedProjectPath = normalizeProjectPath(projectPath);
124
+ db.prepare(`DELETE FROM sessions WHERE user_id = ? AND project_path = ?`).run(userId, normalizedProjectPath);
125
+ },
126
+ getSessionName(userId, sessionId, provider) {
127
+ const db = getConnection();
128
+ const row = db
129
+ .prepare(`SELECT custom_name
130
+ FROM sessions
131
+ WHERE user_id = ? AND session_id = ? AND provider = ?`)
132
+ .get(userId, sessionId, provider);
133
+ return row?.custom_name ?? null;
134
+ },
135
+ /**
136
+ * Soft-delete and restore both use the same flag update so callers keep the
137
+ * row, metadata, and file path intact while toggling visibility.
138
+ */
139
+ updateSessionIsArchived(userId, sessionId, isArchived) {
140
+ const db = getConnection();
141
+ db.prepare(`UPDATE sessions
142
+ SET isArchived = ?
143
+ WHERE user_id = ? AND session_id = ?`).run(isArchived ? 1 : 0, userId, sessionId);
144
+ },
145
+ deleteSessionById(userId, sessionId) {
146
+ const db = getConnection();
147
+ return (db.prepare('DELETE FROM sessions WHERE user_id = ? AND session_id = ?').run(userId, sessionId).changes > 0);
148
+ },
149
+ };
150
+ //# sourceMappingURL=sessions.db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.db.js","sourceRoot":"","sources":["../../../../../server/modules/database/repositories/sessions.db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * User repository.
3
+ *
4
+ * Provides typed CRUD operations for the `users` table.
5
+ */
6
+ import { getConnection } from '../../../modules/database/connection.js';
7
+ const normalizePublicUser = (row) => {
8
+ if (!row) {
9
+ return undefined;
10
+ }
11
+ return {
12
+ id: row.id,
13
+ username: row.username,
14
+ created_at: row.created_at,
15
+ last_login: row.last_login,
16
+ isAdmin: row.is_admin === 1,
17
+ };
18
+ };
19
+ export const userDb = {
20
+ /** Returns true if at least one user exists in the database. */
21
+ hasUsers() {
22
+ const db = getConnection();
23
+ const row = db.prepare('SELECT COUNT(*) as count FROM users').get();
24
+ return row.count > 0;
25
+ },
26
+ /** Inserts a new user and returns the created public fields. */
27
+ createUser(username, passwordHash, options = {}) {
28
+ const db = getConnection();
29
+ const isAdmin = options.isAdmin ?? false;
30
+ const result = db
31
+ .prepare('INSERT INTO users (username, password_hash, is_admin) VALUES (?, ?, ?)')
32
+ .run(username, passwordHash, isAdmin ? 1 : 0);
33
+ return {
34
+ id: Number(result.lastInsertRowid),
35
+ username,
36
+ isAdmin,
37
+ };
38
+ },
39
+ /** Looks up an active user by username, including password hash for auth verification. */
40
+ getUserByUsername(username) {
41
+ const db = getConnection();
42
+ return db
43
+ .prepare('SELECT * FROM users WHERE username = ? AND is_active = 1')
44
+ .get(username);
45
+ },
46
+ /** Updates the last_login timestamp. Non-fatal — logs but does not throw. */
47
+ updateLastLogin(userId) {
48
+ try {
49
+ const db = getConnection();
50
+ db.prepare('UPDATE users SET last_login = CURRENT_TIMESTAMP WHERE id = ?').run(userId);
51
+ }
52
+ catch (err) {
53
+ const message = err instanceof Error ? err.message : String(err);
54
+ console.error('Failed to update last login', { error: message });
55
+ }
56
+ },
57
+ /** Returns public user fields by ID (no password hash). */
58
+ getUserById(userId) {
59
+ const db = getConnection();
60
+ const row = db
61
+ .prepare('SELECT id, username, created_at, last_login, is_admin FROM users WHERE id = ? AND is_active = 1')
62
+ .get(userId);
63
+ return normalizePublicUser(row);
64
+ },
65
+ /** Returns the first active user. Used for single-user mode lookups. */
66
+ getFirstUser() {
67
+ const db = getConnection();
68
+ const row = db
69
+ .prepare('SELECT id, username, created_at, last_login, is_admin FROM users WHERE is_active = 1 ORDER BY id ASC LIMIT 1')
70
+ .get();
71
+ return normalizePublicUser(row);
72
+ },
73
+ listUsers() {
74
+ const db = getConnection();
75
+ const rows = db
76
+ .prepare('SELECT id, username, created_at, last_login, is_admin FROM users WHERE is_active = 1 ORDER BY id ASC')
77
+ .all();
78
+ return rows.map((row) => normalizePublicUser(row)).filter(Boolean);
79
+ },
80
+ deleteUser(userId) {
81
+ const db = getConnection();
82
+ const result = db.prepare('DELETE FROM users WHERE id = ?').run(userId);
83
+ return result.changes > 0;
84
+ },
85
+ /** Stores the user's preferred git name and email. */
86
+ updateGitConfig(userId, gitName, gitEmail) {
87
+ const db = getConnection();
88
+ db.prepare('UPDATE users SET git_name = ?, git_email = ? WHERE id = ?').run(gitName, gitEmail, userId);
89
+ },
90
+ /** Retrieves the user's git identity (name + email). */
91
+ getGitConfig(userId) {
92
+ const db = getConnection();
93
+ return db
94
+ .prepare('SELECT git_name, git_email FROM users WHERE id = ?')
95
+ .get(userId);
96
+ },
97
+ /** Marks onboarding as complete for the given user. */
98
+ completeOnboarding(userId) {
99
+ const db = getConnection();
100
+ db.prepare('UPDATE users SET has_completed_onboarding = 1 WHERE id = ?').run(userId);
101
+ },
102
+ /** Returns true if the user has finished the onboarding flow. */
103
+ hasCompletedOnboarding(userId) {
104
+ const db = getConnection();
105
+ const row = db
106
+ .prepare('SELECT has_completed_onboarding FROM users WHERE id = ?')
107
+ .get(userId);
108
+ return row?.has_completed_onboarding === 1;
109
+ },
110
+ /** Updates the password hash for a given user. */
111
+ updatePassword(userId, passwordHash) {
112
+ const db = getConnection();
113
+ db.prepare('UPDATE users SET password_hash = ? WHERE id = ?').run(passwordHash, userId);
114
+ },
115
+ };
116
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../../../../server/modules/database/repositories/users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * VAPID keys repository.
3
+ *
4
+ * Stores and retrieves the Web Push VAPID key pair.
5
+ */
6
+ import { getConnection } from '../../../modules/database/connection.js';
7
+ export const vapidKeysDb = {
8
+ /** Returns the latest stored VAPID key pair, or null when unset. */
9
+ getVapidKeys() {
10
+ const db = getConnection();
11
+ const row = db
12
+ .prepare('SELECT public_key, private_key FROM vapid_keys ORDER BY id DESC LIMIT 1')
13
+ .get();
14
+ if (!row)
15
+ return null;
16
+ return {
17
+ publicKey: row.public_key,
18
+ privateKey: row.private_key,
19
+ };
20
+ },
21
+ /** Persists a new VAPID key pair. */
22
+ createVapidKeys(publicKey, privateKey) {
23
+ const db = getConnection();
24
+ db.prepare('INSERT INTO vapid_keys (public_key, private_key) VALUES (?, ?)').run(publicKey, privateKey);
25
+ },
26
+ /** Replaces all existing keys with a fresh pair. */
27
+ updateVapidKeys(publicKey, privateKey) {
28
+ const db = getConnection();
29
+ db.prepare('DELETE FROM vapid_keys').run();
30
+ vapidKeysDb.createVapidKeys(publicKey, privateKey);
31
+ },
32
+ /** Deletes all VAPID key rows. */
33
+ deleteVapidKeys() {
34
+ const db = getConnection();
35
+ db.prepare('DELETE FROM vapid_keys').run();
36
+ },
37
+ };
38
+ //# sourceMappingURL=vapid-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vapid-keys.js","sourceRoot":"","sources":["../../../../../server/modules/database/repositories/vapid-keys.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAYjE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,oEAAoE;IACpE,YAAY;QACV,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CACN,yEAAyE,CAC1E;aACA,GAAG,EAAiE,CAAC;QAExE,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO;YACL,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,UAAU,EAAE,GAAG,CAAC,WAAW;SAC5B,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,eAAe,CAAC,SAAiB,EAAE,UAAkB;QACnD,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;QAC3B,EAAE,CAAC,OAAO,CACR,gEAAgE,CACjE,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,oDAAoD;IACpD,eAAe,CAAC,SAAiB,EAAE,UAAkB;QACnD,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;QAC3B,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,GAAG,EAAE,CAAC;QAC3C,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IAED,kCAAkC;IAClC,eAAe;QACb,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;QAC3B,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,GAAG,EAAE,CAAC;IAC7C,CAAC;CACF,CAAC"}
@@ -0,0 +1,150 @@
1
+ const USER_TABLE_SCHEMA_SQL = `
2
+ CREATE TABLE IF NOT EXISTS users (
3
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
4
+ username TEXT UNIQUE NOT NULL,
5
+ password_hash TEXT NOT NULL,
6
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
7
+ last_login DATETIME,
8
+ is_active BOOLEAN DEFAULT 1,
9
+ git_name TEXT,
10
+ git_email TEXT,
11
+ has_completed_onboarding BOOLEAN DEFAULT 0,
12
+ is_admin BOOLEAN DEFAULT 0
13
+ );
14
+ `;
15
+ export const API_KEYS_TABLE_SCHEMA_SQL = `
16
+ CREATE TABLE IF NOT EXISTS api_keys (
17
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
18
+ user_id INTEGER NOT NULL,
19
+ key_name TEXT NOT NULL,
20
+ api_key TEXT UNIQUE NOT NULL,
21
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
22
+ last_used DATETIME,
23
+ is_active BOOLEAN DEFAULT 1,
24
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
25
+ );
26
+ `;
27
+ export const USER_CREDENTIALS_TABLE_SCHEMA_SQL = `
28
+ CREATE TABLE IF NOT EXISTS user_credentials (
29
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
30
+ user_id INTEGER NOT NULL,
31
+ credential_name TEXT NOT NULL,
32
+ credential_type TEXT NOT NULL, -- 'github_token', 'gitlab_token', 'bitbucket_token', etc.
33
+ credential_value TEXT NOT NULL,
34
+ description TEXT,
35
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
36
+ is_active BOOLEAN DEFAULT 1,
37
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
38
+ );
39
+ `;
40
+ export const USER_NOTIFICATION_PREFERENCES_TABLE_SCHEMA_SQL = `
41
+ CREATE TABLE IF NOT EXISTS user_notification_preferences (
42
+ user_id INTEGER PRIMARY KEY,
43
+ preferences_json TEXT NOT NULL,
44
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
45
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
46
+ );
47
+ `;
48
+ export const VAPID_KEYS_TABLE_SCHEMA_SQL = `
49
+ CREATE TABLE IF NOT EXISTS vapid_keys (
50
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
51
+ public_key TEXT NOT NULL,
52
+ private_key TEXT NOT NULL,
53
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
54
+ );
55
+ `;
56
+ export const PUSH_SUBSCRIPTIONS_TABLE_SCHEMA_SQL = `
57
+ CREATE TABLE IF NOT EXISTS push_subscriptions (
58
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
59
+ user_id INTEGER NOT NULL,
60
+ endpoint TEXT NOT NULL UNIQUE,
61
+ keys_p256dh TEXT NOT NULL,
62
+ keys_auth TEXT NOT NULL,
63
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
64
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
65
+ );
66
+ `;
67
+ export const PROJECTS_TABLE_SCHEMA_SQL = `
68
+ CREATE TABLE IF NOT EXISTS projects (
69
+ project_id TEXT PRIMARY KEY NOT NULL,
70
+ user_id INTEGER NOT NULL,
71
+ project_path TEXT NOT NULL,
72
+ custom_project_name TEXT DEFAULT NULL,
73
+ isStarred BOOLEAN DEFAULT 0,
74
+ isArchived BOOLEAN DEFAULT 0,
75
+ UNIQUE(user_id, project_path),
76
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
77
+ );
78
+ `;
79
+ export const SESSIONS_TABLE_SCHEMA_SQL = `
80
+ CREATE TABLE IF NOT EXISTS sessions (
81
+ session_id TEXT NOT NULL,
82
+ user_id INTEGER NOT NULL,
83
+ provider TEXT NOT NULL DEFAULT 'claude',
84
+ custom_name TEXT,
85
+ project_path TEXT,
86
+ jsonl_path TEXT,
87
+ isArchived BOOLEAN DEFAULT 0,
88
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
89
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
90
+ PRIMARY KEY (user_id, session_id),
91
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
92
+ FOREIGN KEY (user_id, project_path) REFERENCES projects(user_id, project_path)
93
+ ON DELETE CASCADE
94
+ ON UPDATE CASCADE
95
+ );
96
+ `;
97
+ export const LAST_SCANNED_AT_SQL = `
98
+ CREATE TABLE IF NOT EXISTS scan_state (
99
+ id INTEGER PRIMARY KEY CHECK (id = 1),
100
+ last_scanned_at TIMESTAMP NULL
101
+ );
102
+ `;
103
+ export const APP_CONFIG_TABLE_SCHEMA_SQL = `
104
+ CREATE TABLE IF NOT EXISTS app_config (
105
+ key TEXT PRIMARY KEY,
106
+ value TEXT NOT NULL,
107
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
108
+ );
109
+ `;
110
+ export const INIT_SCHEMA_SQL = `
111
+ -- Initialize authentication database
112
+ PRAGMA foreign_keys = ON;
113
+
114
+ ${USER_TABLE_SCHEMA_SQL}
115
+ -- Indexes for performance for user lookups
116
+ CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
117
+ CREATE INDEX IF NOT EXISTS idx_users_active ON users(is_active);
118
+
119
+ ${API_KEYS_TABLE_SCHEMA_SQL}
120
+ CREATE INDEX IF NOT EXISTS idx_api_keys_key ON api_keys(api_key);
121
+ CREATE INDEX IF NOT EXISTS idx_api_keys_user_id ON api_keys(user_id);
122
+ CREATE INDEX IF NOT EXISTS idx_api_keys_active ON api_keys(is_active);
123
+
124
+ ${USER_CREDENTIALS_TABLE_SCHEMA_SQL}
125
+ CREATE INDEX IF NOT EXISTS idx_user_credentials_user_id ON user_credentials(user_id);
126
+ CREATE INDEX IF NOT EXISTS idx_user_credentials_type ON user_credentials(credential_type);
127
+ CREATE INDEX IF NOT EXISTS idx_user_credentials_active ON user_credentials(is_active);
128
+
129
+ ${USER_NOTIFICATION_PREFERENCES_TABLE_SCHEMA_SQL}
130
+ CREATE INDEX IF NOT EXISTS idx_user_notification_preferences_user_id ON user_notification_preferences(user_id);
131
+
132
+ ${VAPID_KEYS_TABLE_SCHEMA_SQL}
133
+
134
+ ${PUSH_SUBSCRIPTIONS_TABLE_SCHEMA_SQL}
135
+ CREATE INDEX IF NOT EXISTS idx_push_subscriptions_user_id ON push_subscriptions(user_id);
136
+
137
+ ${PROJECTS_TABLE_SCHEMA_SQL}
138
+ -- NOTE: These indexes are created in migrations after legacy table-shape repairs.
139
+ -- Creating them here can fail on upgraded installs where projects lacks those columns.
140
+
141
+ ${SESSIONS_TABLE_SCHEMA_SQL}
142
+ CREATE INDEX IF NOT EXISTS idx_session_ids_lookup ON sessions(session_id);
143
+ -- NOTE: This index is created in migrations after sessions is rebuilt to include project_path.
144
+ -- Creating it here can fail on upgraded installs where the legacy sessions table has no project_path.
145
+
146
+ ${LAST_SCANNED_AT_SQL}
147
+
148
+ ${APP_CONFIG_TABLE_SCHEMA_SQL}
149
+ `;
150
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../server/modules/database/schema.ts"],"names":[],"mappings":"AAAA,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;CAa7B,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;CAWxC,CAAC;AAEF,MAAM,CAAC,MAAM,iCAAiC,GAAG;;;;;;;;;;;;CAYhD,CAAC;AAEF,MAAM,CAAC,MAAM,8CAA8C,GAAG;;;;;;;CAO7D,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;CAO1C,CAAC;AAEF,MAAM,CAAC,MAAM,mCAAmC,GAAG;;;;;;;;;;CAUlD,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;CAWxC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;CAiBxC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;CAKlC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;CAM1C,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;;;;EAI7B,qBAAqB;;;;;EAKrB,yBAAyB;;;;;EAKzB,iCAAiC;;;;;EAKjC,8CAA8C;;;EAG9C,2BAA2B;;EAE3B,mCAAmC;;;EAGnC,yBAAyB;;;;EAIzB,yBAAyB;;;;;EAKzB,mBAAmB;;EAEnB,2BAA2B;CAC5B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { generateDisplayName, getProjectsWithSessions, } from './services/projects-with-sessions-fetch.service.js';
2
+ export { updateProjectDisplayName } from './services/project-management.service.js';
3
+ export { deleteOrArchiveProject, deleteSessionJsonlFilesForProjectPath } from './services/project-delete.service.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/modules/projects/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,qCAAqC,EAAE,MAAM,sCAAsC,CAAC"}