wind-agent-cli 1.37.2

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 (932) hide show
  1. package/LICENSE +718 -0
  2. package/README.md +26 -0
  3. package/dist/api-docs.html +901 -0
  4. package/dist/assets/CodeEditor-B2Wf7Fg0.js +110 -0
  5. package/dist/assets/FileTree-N2IkkHlv.js +127 -0
  6. package/dist/assets/GitPanel-DZCeuFZ2.js +29 -0
  7. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  8. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  9. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  10. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  11. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  12. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  13. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  14. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  15. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  16. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  17. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  18. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  19. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  20. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  21. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  22. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  23. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  24. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  25. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  26. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  27. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  28. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  29. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  30. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  31. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  32. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  33. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  34. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  35. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  36. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  37. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  38. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  39. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  40. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  41. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  42. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  43. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  44. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  45. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  46. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  47. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  48. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  49. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  50. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  51. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  52. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  53. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  54. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  55. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  56. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  57. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  58. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  59. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  60. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  61. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  62. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  63. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  64. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  65. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  66. package/dist/assets/MarkdownPreview-C0tqYnVu.js +41 -0
  67. package/dist/assets/PluginTabContent-Bnuf-fb8.js +1 -0
  68. package/dist/assets/Shell-BfFnMZ-f.js +81 -0
  69. package/dist/assets/Shell-qxJ8_QYu.css +32 -0
  70. package/dist/assets/StandaloneShell-QmyYwNAl.js +1 -0
  71. package/dist/assets/TaskMasterPanel-fMsmvN9L.js +32 -0
  72. package/dist/assets/abnfDiagram-N423BO3Z-DjPU7HLs.js +1 -0
  73. package/dist/assets/arc-Pdq6Tvr3.js +1 -0
  74. package/dist/assets/architectureDiagram-T3A2C74G-D0JnT0Vh.js +36 -0
  75. package/dist/assets/blockDiagram-VBNYF7ZC-DpaEf3mv.js +132 -0
  76. package/dist/assets/c4Diagram-5PPSVZJV-MpqlPGFi.js +10 -0
  77. package/dist/assets/channel-Bm0ZLE4z.js +1 -0
  78. package/dist/assets/chunk-2GRJ4B5K-DoSdNo8u.js +1 -0
  79. package/dist/assets/chunk-2Q5K7J3B-CE7I3uMn.js +1 -0
  80. package/dist/assets/chunk-5RXB4S5H-B4UQ8snD.js +231 -0
  81. package/dist/assets/chunk-5VM5RSS4-B55XgqHZ.js +15 -0
  82. package/dist/assets/chunk-6Q2QTUOP-BS1KpefW.js +88 -0
  83. package/dist/assets/chunk-GF5L2VYU-DkEPedJP.js +206 -0
  84. package/dist/assets/chunk-JWPE2WC7-DOtkNhMm.js +1 -0
  85. package/dist/assets/chunk-KBJHAD2P-BXLjviqM.js +1 -0
  86. package/dist/assets/chunk-RYQCIY6F-C50fjNNz.js +1 -0
  87. package/dist/assets/chunk-XXDRQBXY-QBYqCkb7.js +1 -0
  88. package/dist/assets/classDiagram-JCYQIIEL-DqEOcNxw.js +1 -0
  89. package/dist/assets/classDiagram-v2-OCEON4UE-DqEOcNxw.js +1 -0
  90. package/dist/assets/code-xml-VK1YfShP.js +6 -0
  91. package/dist/assets/cose-bilkent-JH36ORCC-DrVTo1Nh.js +1 -0
  92. package/dist/assets/cynefin-VYW2F7L2-DnJa_OlQ.js +178 -0
  93. package/dist/assets/cynefinDiagram-MW4NZA55-CCxBjw9E.js +62 -0
  94. package/dist/assets/cytoscape.esm-C10L9Icf.js +331 -0
  95. package/dist/assets/dagre-VZM6K2ZE-C_GvE4lu.js +4 -0
  96. package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  97. package/dist/assets/diagram-7IWD3JNH-pFzs9HEu.js +30 -0
  98. package/dist/assets/diagram-B4RE2ZJO-CcehQC7x.js +3 -0
  99. package/dist/assets/diagram-LBJQPF4R-hfKcrrxe.js +24 -0
  100. package/dist/assets/diagram-Q27KOJAE-C1semJfK.js +24 -0
  101. package/dist/assets/diagram-UB23O5K3-57hvXQXO.js +41 -0
  102. package/dist/assets/ebnfDiagram-BXEA7PRR-9KIAlAVw.js +1 -0
  103. package/dist/assets/erDiagram-JOGREHBK-B7OzJ767.js +85 -0
  104. package/dist/assets/flowDiagram-UKHOOZJN-CJV8fQPR.js +156 -0
  105. package/dist/assets/ganttDiagram-PKOTCBZU-CbMNWWQu.js +292 -0
  106. package/dist/assets/gitGraphDiagram-DS77QQ5N-I_vZ5waO.js +106 -0
  107. package/dist/assets/graph-Cx-EqisW.js +1 -0
  108. package/dist/assets/index-DFnVoqpx.js +1174 -0
  109. package/dist/assets/index-DlSeAkw_.js +11 -0
  110. package/dist/assets/index-GFhXZyl2.js +62 -0
  111. package/dist/assets/index-ZHwIojzi.js +1 -0
  112. package/dist/assets/index-t1w8KNxn.css +1 -0
  113. package/dist/assets/infoDiagram-6WML65LV-Dh20Tsbq.js +2 -0
  114. package/dist/assets/init-Gi6I4Gst.js +1 -0
  115. package/dist/assets/ishikawaDiagram-WSZJBQD7-DH2Sm3ko.js +70 -0
  116. package/dist/assets/journeyDiagram-NVQOT4AX-BNFQqlVu.js +139 -0
  117. package/dist/assets/kanban-definition-27J2QSJJ-B3iL0ztJ.js +89 -0
  118. package/dist/assets/layout-D6BstSzF.js +1 -0
  119. package/dist/assets/linear-Cwe9dEKA.js +1 -0
  120. package/dist/assets/map-CV9uif0g.js +1 -0
  121. package/dist/assets/mermaid.core-BYRQSshi.js +312 -0
  122. package/dist/assets/mindmap-definition-FAOFIHXS-BgfBYMzr.js +96 -0
  123. package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  124. package/dist/assets/pegDiagram-VL7TDLO6-CNYpECr8.js +1 -0
  125. package/dist/assets/pieDiagram-7S7Q4E2Y-DeSrxc4I.js +39 -0
  126. package/dist/assets/quadrantDiagram-CIZ2JOQS-BXVVQsa6.js +7 -0
  127. package/dist/assets/railroadDiagram-AXF67PYL-JTroIW8F.js +1 -0
  128. package/dist/assets/requirementDiagram-LRYGKXZP-C1Z_inLz.js +84 -0
  129. package/dist/assets/sankeyDiagram-W5VNT64P-DCJgKFUk.js +40 -0
  130. package/dist/assets/sequenceDiagram-SI44F4Z6-D8Wrx5Vc.js +162 -0
  131. package/dist/assets/sizeCapture-X5ZJPWSS-CXqD68vD.js +1 -0
  132. package/dist/assets/stateDiagram-OKZ733FA-CF0Ekqjo.js +1 -0
  133. package/dist/assets/stateDiagram-v2-UEYNNEHI-DARLpEFJ.js +1 -0
  134. package/dist/assets/swimlanes-SLNWSIFB-DVIax_k4.js +2 -0
  135. package/dist/assets/swimlanesDiagram-ULZ7WXOC-CrgDgaY8.js +8 -0
  136. package/dist/assets/timeline-definition-Z64GVDOM-DSqk3ApG.js +120 -0
  137. package/dist/assets/vendor-react-whEHfigN.js +59 -0
  138. package/dist/assets/vennDiagram-T6HMQDX7-DNbTqyG5.js +34 -0
  139. package/dist/assets/wardleyDiagram-T6FBY63Y-BNCpsFZV.js +78 -0
  140. package/dist/assets/xychartDiagram-ELKLHX3M-XsVZphHr.js +7 -0
  141. package/dist/clear-cache.html +85 -0
  142. package/dist/convert-icons.md +53 -0
  143. package/dist/favicon.png +0 -0
  144. package/dist/favicon.svg +9 -0
  145. package/dist/generate-icons.js +49 -0
  146. package/dist/icons/claude-ai-icon.svg +1 -0
  147. package/dist/icons/codex-white.svg +3 -0
  148. package/dist/icons/codex.svg +3 -0
  149. package/dist/icons/cursor-white.svg +12 -0
  150. package/dist/icons/cursor.svg +1 -0
  151. package/dist/icons/icon-128x128.png +0 -0
  152. package/dist/icons/icon-128x128.svg +12 -0
  153. package/dist/icons/icon-144x144.png +0 -0
  154. package/dist/icons/icon-144x144.svg +12 -0
  155. package/dist/icons/icon-152x152.png +0 -0
  156. package/dist/icons/icon-152x152.svg +12 -0
  157. package/dist/icons/icon-192x192.png +0 -0
  158. package/dist/icons/icon-192x192.svg +12 -0
  159. package/dist/icons/icon-384x384.png +0 -0
  160. package/dist/icons/icon-384x384.svg +12 -0
  161. package/dist/icons/icon-512x512.png +0 -0
  162. package/dist/icons/icon-512x512.svg +12 -0
  163. package/dist/icons/icon-72x72.png +0 -0
  164. package/dist/icons/icon-72x72.svg +12 -0
  165. package/dist/icons/icon-96x96.png +0 -0
  166. package/dist/icons/icon-96x96.svg +12 -0
  167. package/dist/icons/icon-template.svg +12 -0
  168. package/dist/index.html +58 -0
  169. package/dist/logo-128.png +0 -0
  170. package/dist/logo-256.png +0 -0
  171. package/dist/logo-32.png +0 -0
  172. package/dist/logo-512.png +0 -0
  173. package/dist/logo-64.png +0 -0
  174. package/dist/logo.svg +17 -0
  175. package/dist/manifest.json +61 -0
  176. package/dist/screenshots/cli-selection.png +0 -0
  177. package/dist/screenshots/desktop-main.png +0 -0
  178. package/dist/screenshots/mobile-chat.png +0 -0
  179. package/dist/screenshots/new-session.png +0 -0
  180. package/dist/screenshots/tools-modal.png +0 -0
  181. package/dist/sw.js +124 -0
  182. package/dist-server/scripts/fix-codex-sdk-windows-hide.js +47 -0
  183. package/dist-server/scripts/fix-codex-sdk-windows-hide.js.map +1 -0
  184. package/dist-server/server/index.js +339 -0
  185. package/dist-server/server/index.js.map +1 -0
  186. package/dist-server/server/load-env.js +45 -0
  187. package/dist-server/server/load-env.js.map +1 -0
  188. package/dist-server/server/modules/agent/agent.module.js +38 -0
  189. package/dist-server/server/modules/agent/agent.module.js.map +1 -0
  190. package/dist-server/server/modules/agent/agent.routes.js +1161 -0
  191. package/dist-server/server/modules/agent/agent.routes.js.map +1 -0
  192. package/dist-server/server/modules/agent/index.js +3 -0
  193. package/dist-server/server/modules/agent/index.js.map +1 -0
  194. package/dist-server/server/modules/agent/tests/agent.routes.test.js +176 -0
  195. package/dist-server/server/modules/agent/tests/agent.routes.test.js.map +1 -0
  196. package/dist-server/server/modules/assets/assets.routes.js +130 -0
  197. package/dist-server/server/modules/assets/assets.routes.js.map +1 -0
  198. package/dist-server/server/modules/assets/index.js +4 -0
  199. package/dist-server/server/modules/assets/index.js.map +1 -0
  200. package/dist-server/server/modules/assets/services/image-assets.service.js +95 -0
  201. package/dist-server/server/modules/assets/services/image-assets.service.js.map +1 -0
  202. package/dist-server/server/modules/assets/tests/image-assets.service.test.js +56 -0
  203. package/dist-server/server/modules/assets/tests/image-assets.service.test.js.map +1 -0
  204. package/dist-server/server/modules/auth/auth.middleware.js +133 -0
  205. package/dist-server/server/modules/auth/auth.middleware.js.map +1 -0
  206. package/dist-server/server/modules/auth/auth.module.js +29 -0
  207. package/dist-server/server/modules/auth/auth.module.js.map +1 -0
  208. package/dist-server/server/modules/auth/auth.routes.js +45 -0
  209. package/dist-server/server/modules/auth/auth.routes.js.map +1 -0
  210. package/dist-server/server/modules/auth/auth.service.js +113 -0
  211. package/dist-server/server/modules/auth/auth.service.js.map +1 -0
  212. package/dist-server/server/modules/auth/index.js +9 -0
  213. package/dist-server/server/modules/auth/index.js.map +1 -0
  214. package/dist-server/server/modules/auth/tests/auth.service.test.js +80 -0
  215. package/dist-server/server/modules/auth/tests/auth.service.test.js.map +1 -0
  216. package/dist-server/server/modules/browser-use/browser-use-mcp.js +352 -0
  217. package/dist-server/server/modules/browser-use/browser-use-mcp.js.map +1 -0
  218. package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js +107 -0
  219. package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js.map +1 -0
  220. package/dist-server/server/modules/browser-use/browser-use-runtime.js +10 -0
  221. package/dist-server/server/modules/browser-use/browser-use-runtime.js.map +1 -0
  222. package/dist-server/server/modules/browser-use/browser-use.routes.js +93 -0
  223. package/dist-server/server/modules/browser-use/browser-use.routes.js.map +1 -0
  224. package/dist-server/server/modules/browser-use/browser-use.service.js +687 -0
  225. package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -0
  226. package/dist-server/server/modules/browser-use/index.js +11 -0
  227. package/dist-server/server/modules/browser-use/index.js.map +1 -0
  228. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js +8 -0
  229. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js.map +1 -0
  230. package/dist-server/server/modules/cli/cli.js +17 -0
  231. package/dist-server/server/modules/cli/cli.js.map +1 -0
  232. package/dist-server/server/modules/cli/cli.module.js +85 -0
  233. package/dist-server/server/modules/cli/cli.module.js.map +1 -0
  234. package/dist-server/server/modules/cli/cli.service.js +225 -0
  235. package/dist-server/server/modules/cli/cli.service.js.map +1 -0
  236. package/dist-server/server/modules/cli/index.js +3 -0
  237. package/dist-server/server/modules/cli/index.js.map +1 -0
  238. package/dist-server/server/modules/cli/sandbox.service.js +332 -0
  239. package/dist-server/server/modules/cli/sandbox.service.js.map +1 -0
  240. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +154 -0
  241. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js.map +1 -0
  242. package/dist-server/server/modules/cli/tests/cli.service.test.js +82 -0
  243. package/dist-server/server/modules/cli/tests/cli.service.test.js.map +1 -0
  244. package/dist-server/server/modules/cli/tests/sandbox.service.test.js +56 -0
  245. package/dist-server/server/modules/cli/tests/sandbox.service.test.js.map +1 -0
  246. package/dist-server/server/modules/commands/commands.module.js +20 -0
  247. package/dist-server/server/modules/commands/commands.module.js.map +1 -0
  248. package/dist-server/server/modules/commands/commands.routes.js +547 -0
  249. package/dist-server/server/modules/commands/commands.routes.js.map +1 -0
  250. package/dist-server/server/modules/commands/index.js +3 -0
  251. package/dist-server/server/modules/commands/index.js.map +1 -0
  252. package/dist-server/server/modules/commands/tests/commands.test.js +144 -0
  253. package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -0
  254. package/dist-server/server/modules/database/connection.js +125 -0
  255. package/dist-server/server/modules/database/connection.js.map +1 -0
  256. package/dist-server/server/modules/database/index.js +18 -0
  257. package/dist-server/server/modules/database/index.js.map +1 -0
  258. package/dist-server/server/modules/database/init-db.js +18 -0
  259. package/dist-server/server/modules/database/init-db.js.map +1 -0
  260. package/dist-server/server/modules/database/migrations.js +434 -0
  261. package/dist-server/server/modules/database/migrations.js.map +1 -0
  262. package/dist-server/server/modules/database/repositories/api-keys.js +72 -0
  263. package/dist-server/server/modules/database/repositories/api-keys.js.map +1 -0
  264. package/dist-server/server/modules/database/repositories/app-config.js +47 -0
  265. package/dist-server/server/modules/database/repositories/app-config.js.map +1 -0
  266. package/dist-server/server/modules/database/repositories/credentials.js +68 -0
  267. package/dist-server/server/modules/database/repositories/credentials.js.map +1 -0
  268. package/dist-server/server/modules/database/repositories/github-tokens.js +54 -0
  269. package/dist-server/server/modules/database/repositories/github-tokens.js.map +1 -0
  270. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js +100 -0
  271. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js.map +1 -0
  272. package/dist-server/server/modules/database/repositories/notification-preferences.js +82 -0
  273. package/dist-server/server/modules/database/repositories/notification-preferences.js.map +1 -0
  274. package/dist-server/server/modules/database/repositories/projects.db.js +172 -0
  275. package/dist-server/server/modules/database/repositories/projects.db.js.map +1 -0
  276. package/dist-server/server/modules/database/repositories/provider-models.js +112 -0
  277. package/dist-server/server/modules/database/repositories/provider-models.js.map +1 -0
  278. package/dist-server/server/modules/database/repositories/push-subscriptions.js +49 -0
  279. package/dist-server/server/modules/database/repositories/push-subscriptions.js.map +1 -0
  280. package/dist-server/server/modules/database/repositories/scan-state.db.js +31 -0
  281. package/dist-server/server/modules/database/repositories/scan-state.db.js.map +1 -0
  282. package/dist-server/server/modules/database/repositories/sessions.db.js +375 -0
  283. package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -0
  284. package/dist-server/server/modules/database/repositories/users.js +88 -0
  285. package/dist-server/server/modules/database/repositories/users.js.map +1 -0
  286. package/dist-server/server/modules/database/repositories/vapid-keys.js +38 -0
  287. package/dist-server/server/modules/database/repositories/vapid-keys.js.map +1 -0
  288. package/dist-server/server/modules/database/schema.js +199 -0
  289. package/dist-server/server/modules/database/schema.js.map +1 -0
  290. package/dist-server/server/modules/database/tests/projects.db.integration.test.js +64 -0
  291. package/dist-server/server/modules/database/tests/projects.db.integration.test.js.map +1 -0
  292. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +102 -0
  293. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js.map +1 -0
  294. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +79 -0
  295. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -0
  296. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +93 -0
  297. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -0
  298. package/dist-server/server/modules/file-tree/file-tree.module.js +95 -0
  299. package/dist-server/server/modules/file-tree/file-tree.module.js.map +1 -0
  300. package/dist-server/server/modules/file-tree/file-tree.routes.js +208 -0
  301. package/dist-server/server/modules/file-tree/file-tree.routes.js.map +1 -0
  302. package/dist-server/server/modules/file-tree/file-tree.service.js +584 -0
  303. package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -0
  304. package/dist-server/server/modules/file-tree/index.js +3 -0
  305. package/dist-server/server/modules/file-tree/index.js.map +1 -0
  306. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js +123 -0
  307. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js.map +1 -0
  308. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +311 -0
  309. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -0
  310. package/dist-server/server/modules/git/git-branch.service.js +15 -0
  311. package/dist-server/server/modules/git/git-branch.service.js.map +1 -0
  312. package/dist-server/server/modules/git/git-parsing.service.js +61 -0
  313. package/dist-server/server/modules/git/git-parsing.service.js.map +1 -0
  314. package/dist-server/server/modules/git/git.module.js +14 -0
  315. package/dist-server/server/modules/git/git.module.js.map +1 -0
  316. package/dist-server/server/modules/git/git.routes.js +1348 -0
  317. package/dist-server/server/modules/git/git.routes.js.map +1 -0
  318. package/dist-server/server/modules/git/index.js +3 -0
  319. package/dist-server/server/modules/git/index.js.map +1 -0
  320. package/dist-server/server/modules/git/tests/git-branch.service.test.js +52 -0
  321. package/dist-server/server/modules/git/tests/git-branch.service.test.js.map +1 -0
  322. package/dist-server/server/modules/git/tests/git-init.routes.test.js +177 -0
  323. package/dist-server/server/modules/git/tests/git-init.routes.test.js.map +1 -0
  324. package/dist-server/server/modules/git/tests/git.test.js +80 -0
  325. package/dist-server/server/modules/git/tests/git.test.js.map +1 -0
  326. package/dist-server/server/modules/notifications/index.js +20 -0
  327. package/dist-server/server/modules/notifications/index.js.map +1 -0
  328. package/dist-server/server/modules/notifications/notifications.routes.js +115 -0
  329. package/dist-server/server/modules/notifications/notifications.routes.js.map +1 -0
  330. package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js +97 -0
  331. package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js.map +1 -0
  332. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +249 -0
  333. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js.map +1 -0
  334. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js +44 -0
  335. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js.map +1 -0
  336. package/dist-server/server/modules/notifications/vapid-keys.service.js +28 -0
  337. package/dist-server/server/modules/notifications/vapid-keys.service.js.map +1 -0
  338. package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js +79 -0
  339. package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js.map +1 -0
  340. package/dist-server/server/modules/plugins/index.js +9 -0
  341. package/dist-server/server/modules/plugins/index.js.map +1 -0
  342. package/dist-server/server/modules/plugins/plugin-process.service.js +191 -0
  343. package/dist-server/server/modules/plugins/plugin-process.service.js.map +1 -0
  344. package/dist-server/server/modules/plugins/plugin-registry.service.js +414 -0
  345. package/dist-server/server/modules/plugins/plugin-registry.service.js.map +1 -0
  346. package/dist-server/server/modules/plugins/plugins.module.js +30 -0
  347. package/dist-server/server/modules/plugins/plugins.module.js.map +1 -0
  348. package/dist-server/server/modules/plugins/plugins.routes.js +70 -0
  349. package/dist-server/server/modules/plugins/plugins.routes.js.map +1 -0
  350. package/dist-server/server/modules/plugins/plugins.service.js +123 -0
  351. package/dist-server/server/modules/plugins/plugins.service.js.map +1 -0
  352. package/dist-server/server/modules/plugins/tests/plugins.service.test.js +28 -0
  353. package/dist-server/server/modules/plugins/tests/plugins.service.test.js.map +1 -0
  354. package/dist-server/server/modules/projects/index.js +9 -0
  355. package/dist-server/server/modules/projects/index.js.map +1 -0
  356. package/dist-server/server/modules/projects/projects.routes.js +205 -0
  357. package/dist-server/server/modules/projects/projects.routes.js.map +1 -0
  358. package/dist-server/server/modules/projects/services/project-clone.service.js +220 -0
  359. package/dist-server/server/modules/projects/services/project-clone.service.js.map +1 -0
  360. package/dist-server/server/modules/projects/services/project-delete.service.js +78 -0
  361. package/dist-server/server/modules/projects/services/project-delete.service.js.map +1 -0
  362. package/dist-server/server/modules/projects/services/project-management.service.js +90 -0
  363. package/dist-server/server/modules/projects/services/project-management.service.js.map +1 -0
  364. package/dist-server/server/modules/projects/services/project-star.service.js +60 -0
  365. package/dist-server/server/modules/projects/services/project-star.service.js.map +1 -0
  366. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js +167 -0
  367. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js.map +1 -0
  368. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js +188 -0
  369. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js.map +1 -0
  370. package/dist-server/server/modules/projects/tests/project-clone.service.test.js +126 -0
  371. package/dist-server/server/modules/projects/tests/project-clone.service.test.js.map +1 -0
  372. package/dist-server/server/modules/projects/tests/project-management.service.test.js +85 -0
  373. package/dist-server/server/modules/projects/tests/project-management.service.test.js.map +1 -0
  374. package/dist-server/server/modules/projects/tests/project-star.service.test.js +95 -0
  375. package/dist-server/server/modules/projects/tests/project-star.service.test.js.map +1 -0
  376. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js +87 -0
  377. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js.map +1 -0
  378. package/dist-server/server/modules/providers/index.js +9 -0
  379. package/dist-server/server/modules/providers/index.js.map +1 -0
  380. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +132 -0
  381. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -0
  382. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js +103 -0
  383. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js.map +1 -0
  384. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +249 -0
  385. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -0
  386. package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js +928 -0
  387. package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js.map +1 -0
  388. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +141 -0
  389. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -0
  390. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +586 -0
  391. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -0
  392. package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js +205 -0
  393. package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js.map +1 -0
  394. package/dist-server/server/modules/providers/list/claude/claude.provider.js +21 -0
  395. package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -0
  396. package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js +180 -0
  397. package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js.map +1 -0
  398. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +84 -0
  399. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -0
  400. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js +107 -0
  401. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js.map +1 -0
  402. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +109 -0
  403. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -0
  404. package/dist-server/server/modules/providers/list/codex/codex-native-command.service.js +22 -0
  405. package/dist-server/server/modules/providers/list/codex/codex-native-command.service.js.map +1 -0
  406. package/dist-server/server/modules/providers/list/codex/codex-native-runtime.provider.js +473 -0
  407. package/dist-server/server/modules/providers/list/codex/codex-native-runtime.provider.js.map +1 -0
  408. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js +462 -0
  409. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -0
  410. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +145 -0
  411. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -0
  412. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +822 -0
  413. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -0
  414. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js +62 -0
  415. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js.map +1 -0
  416. package/dist-server/server/modules/providers/list/codex/codex.provider.js +21 -0
  417. package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -0
  418. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +118 -0
  419. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -0
  420. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js +80 -0
  421. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js.map +1 -0
  422. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +100 -0
  423. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -0
  424. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js +303 -0
  425. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js.map +1 -0
  426. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js +111 -0
  427. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -0
  428. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +566 -0
  429. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -0
  430. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js +35 -0
  431. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js.map +1 -0
  432. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +21 -0
  433. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -0
  434. package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js +91 -0
  435. package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js.map +1 -0
  436. package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js +181 -0
  437. package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js.map +1 -0
  438. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +177 -0
  439. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -0
  440. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js +368 -0
  441. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js.map +1 -0
  442. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +225 -0
  443. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js.map +1 -0
  444. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +136 -0
  445. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -0
  446. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +404 -0
  447. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -0
  448. package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js +62 -0
  449. package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js.map +1 -0
  450. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js +21 -0
  451. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js.map +1 -0
  452. package/dist-server/server/modules/providers/provider.registry.js +31 -0
  453. package/dist-server/server/modules/providers/provider.registry.js.map +1 -0
  454. package/dist-server/server/modules/providers/provider.routes.js +651 -0
  455. package/dist-server/server/modules/providers/provider.routes.js.map +1 -0
  456. package/dist-server/server/modules/providers/services/mcp.service.js +84 -0
  457. package/dist-server/server/modules/providers/services/mcp.service.js.map +1 -0
  458. package/dist-server/server/modules/providers/services/provider-auth.service.js +25 -0
  459. package/dist-server/server/modules/providers/services/provider-auth.service.js.map +1 -0
  460. package/dist-server/server/modules/providers/services/provider-capabilities.service.js +67 -0
  461. package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -0
  462. package/dist-server/server/modules/providers/services/provider-models.service.js +289 -0
  463. package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -0
  464. package/dist-server/server/modules/providers/services/provider-runtime.service.js +66 -0
  465. package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -0
  466. package/dist-server/server/modules/providers/services/provider-token-usage.service.js +268 -0
  467. package/dist-server/server/modules/providers/services/provider-token-usage.service.js.map +1 -0
  468. package/dist-server/server/modules/providers/services/session-conversations-search.service.js +974 -0
  469. package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -0
  470. package/dist-server/server/modules/providers/services/session-synchronizer.service.js +56 -0
  471. package/dist-server/server/modules/providers/services/session-synchronizer.service.js.map +1 -0
  472. package/dist-server/server/modules/providers/services/session-watch-scheduler.js +130 -0
  473. package/dist-server/server/modules/providers/services/session-watch-scheduler.js.map +1 -0
  474. package/dist-server/server/modules/providers/services/sessions-watcher.service.js +310 -0
  475. package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -0
  476. package/dist-server/server/modules/providers/services/sessions.service.js +349 -0
  477. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -0
  478. package/dist-server/server/modules/providers/services/skills.service.js +22 -0
  479. package/dist-server/server/modules/providers/services/skills.service.js.map +1 -0
  480. package/dist-server/server/modules/providers/shared/base/abstract.provider.js +13 -0
  481. package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -0
  482. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js +102 -0
  483. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js.map +1 -0
  484. package/dist-server/server/modules/providers/shared/skills/skills.provider.js +207 -0
  485. package/dist-server/server/modules/providers/shared/skills/skills.provider.js.map +1 -0
  486. package/dist-server/server/modules/providers/tests/claude-auth.test.js +122 -0
  487. package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -0
  488. package/dist-server/server/modules/providers/tests/claude-sessions.test.js +44 -0
  489. package/dist-server/server/modules/providers/tests/claude-sessions.test.js.map +1 -0
  490. package/dist-server/server/modules/providers/tests/codex-app-server.client.test.js +65 -0
  491. package/dist-server/server/modules/providers/tests/codex-app-server.client.test.js.map +1 -0
  492. package/dist-server/server/modules/providers/tests/codex-native-command.service.test.js +192 -0
  493. package/dist-server/server/modules/providers/tests/codex-native-command.service.test.js.map +1 -0
  494. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide-patch.test.js +26 -0
  495. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide-patch.test.js.map +1 -0
  496. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide.test.js +13 -0
  497. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide.test.js.map +1 -0
  498. package/dist-server/server/modules/providers/tests/codex-sessions.test.js +202 -0
  499. package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -0
  500. package/dist-server/server/modules/providers/tests/mcp.test.js +291 -0
  501. package/dist-server/server/modules/providers/tests/mcp.test.js.map +1 -0
  502. package/dist-server/server/modules/providers/tests/opencode-models.test.js +19 -0
  503. package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -0
  504. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +424 -0
  505. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -0
  506. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js +205 -0
  507. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js.map +1 -0
  508. package/dist-server/server/modules/providers/tests/provider-models.service.test.js +268 -0
  509. package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -0
  510. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js +126 -0
  511. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js.map +1 -0
  512. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +166 -0
  513. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -0
  514. package/dist-server/server/modules/providers/tests/provider.routes.test.js +161 -0
  515. package/dist-server/server/modules/providers/tests/provider.routes.test.js.map +1 -0
  516. package/dist-server/server/modules/providers/tests/session-watch-scheduler.test.js +76 -0
  517. package/dist-server/server/modules/providers/tests/session-watch-scheduler.test.js.map +1 -0
  518. package/dist-server/server/modules/providers/tests/sessions-details.test.js +62 -0
  519. package/dist-server/server/modules/providers/tests/sessions-details.test.js.map +1 -0
  520. package/dist-server/server/modules/providers/tests/sessions-watcher-filter.test.js +22 -0
  521. package/dist-server/server/modules/providers/tests/sessions-watcher-filter.test.js.map +1 -0
  522. package/dist-server/server/modules/providers/tests/sessions.service.test.js +87 -0
  523. package/dist-server/server/modules/providers/tests/sessions.service.test.js.map +1 -0
  524. package/dist-server/server/modules/providers/tests/skills.test.js +398 -0
  525. package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -0
  526. package/dist-server/server/modules/settings/index.js +3 -0
  527. package/dist-server/server/modules/settings/index.js.map +1 -0
  528. package/dist-server/server/modules/settings/settings.module.js +35 -0
  529. package/dist-server/server/modules/settings/settings.module.js.map +1 -0
  530. package/dist-server/server/modules/settings/settings.routes.js +34 -0
  531. package/dist-server/server/modules/settings/settings.routes.js.map +1 -0
  532. package/dist-server/server/modules/settings/settings.service.js +116 -0
  533. package/dist-server/server/modules/settings/settings.service.js.map +1 -0
  534. package/dist-server/server/modules/settings/tests/settings.service.test.js +48 -0
  535. package/dist-server/server/modules/settings/tests/settings.service.test.js.map +1 -0
  536. package/dist-server/server/modules/system/index.js +3 -0
  537. package/dist-server/server/modules/system/index.js.map +1 -0
  538. package/dist-server/server/modules/system/system.module.js +44 -0
  539. package/dist-server/server/modules/system/system.module.js.map +1 -0
  540. package/dist-server/server/modules/system/system.routes.js +16 -0
  541. package/dist-server/server/modules/system/system.routes.js.map +1 -0
  542. package/dist-server/server/modules/system/system.service.js +45 -0
  543. package/dist-server/server/modules/system/system.service.js.map +1 -0
  544. package/dist-server/server/modules/system/tests/system.service.test.js +100 -0
  545. package/dist-server/server/modules/system/tests/system.service.test.js.map +1 -0
  546. package/dist-server/server/modules/taskmaster/index.js +3 -0
  547. package/dist-server/server/modules/taskmaster/index.js.map +1 -0
  548. package/dist-server/server/modules/taskmaster/taskmaster.module.js +20 -0
  549. package/dist-server/server/modules/taskmaster/taskmaster.module.js.map +1 -0
  550. package/dist-server/server/modules/taskmaster/taskmaster.routes.js +1372 -0
  551. package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -0
  552. package/dist-server/server/modules/taskmaster/taskmaster.service.js +107 -0
  553. package/dist-server/server/modules/taskmaster/taskmaster.service.js.map +1 -0
  554. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js +132 -0
  555. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js.map +1 -0
  556. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js +85 -0
  557. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js.map +1 -0
  558. package/dist-server/server/modules/user/index.js +3 -0
  559. package/dist-server/server/modules/user/index.js.map +1 -0
  560. package/dist-server/server/modules/user/tests/user.service.test.js +53 -0
  561. package/dist-server/server/modules/user/tests/user.service.test.js.map +1 -0
  562. package/dist-server/server/modules/user/user.module.js +47 -0
  563. package/dist-server/server/modules/user/user.module.js.map +1 -0
  564. package/dist-server/server/modules/user/user.routes.js +44 -0
  565. package/dist-server/server/modules/user/user.routes.js.map +1 -0
  566. package/dist-server/server/modules/user/user.service.js +59 -0
  567. package/dist-server/server/modules/user/user.service.js.map +1 -0
  568. package/dist-server/server/modules/voice/index.js +3 -0
  569. package/dist-server/server/modules/voice/index.js.map +1 -0
  570. package/dist-server/server/modules/voice/tests/voice.service.test.js +86 -0
  571. package/dist-server/server/modules/voice/tests/voice.service.test.js.map +1 -0
  572. package/dist-server/server/modules/voice/voice.module.js +44 -0
  573. package/dist-server/server/modules/voice/voice.module.js.map +1 -0
  574. package/dist-server/server/modules/voice/voice.routes.js +87 -0
  575. package/dist-server/server/modules/voice/voice.routes.js.map +1 -0
  576. package/dist-server/server/modules/voice/voice.service.js +148 -0
  577. package/dist-server/server/modules/voice/voice.service.js.map +1 -0
  578. package/dist-server/server/modules/websocket/index.js +4 -0
  579. package/dist-server/server/modules/websocket/index.js.map +1 -0
  580. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js +266 -0
  581. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js.map +1 -0
  582. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +105 -0
  583. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js.map +1 -0
  584. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +310 -0
  585. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -0
  586. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js +52 -0
  587. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js.map +1 -0
  588. package/dist-server/server/modules/websocket/services/shell-websocket.service.js +570 -0
  589. package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -0
  590. package/dist-server/server/modules/websocket/services/terminal-replay-store.js +161 -0
  591. package/dist-server/server/modules/websocket/services/terminal-replay-store.js.map +1 -0
  592. package/dist-server/server/modules/websocket/services/websocket-auth.service.js +36 -0
  593. package/dist-server/server/modules/websocket/services/websocket-auth.service.js.map +1 -0
  594. package/dist-server/server/modules/websocket/services/websocket-server.service.js +91 -0
  595. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -0
  596. package/dist-server/server/modules/websocket/services/websocket-state.service.js +14 -0
  597. package/dist-server/server/modules/websocket/services/websocket-state.service.js.map +1 -0
  598. package/dist-server/server/modules/websocket/services/websocket-writer.service.js +32 -0
  599. package/dist-server/server/modules/websocket/services/websocket-writer.service.js.map +1 -0
  600. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js +40 -0
  601. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js.map +1 -0
  602. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js +249 -0
  603. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js.map +1 -0
  604. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js +346 -0
  605. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js.map +1 -0
  606. package/dist-server/server/modules/websocket/tests/terminal-replay-store.test.js +65 -0
  607. package/dist-server/server/modules/websocket/tests/terminal-replay-store.test.js.map +1 -0
  608. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js +61 -0
  609. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js.map +1 -0
  610. package/dist-server/server/modules/worktrees/index.js +3 -0
  611. package/dist-server/server/modules/worktrees/index.js.map +1 -0
  612. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js +37 -0
  613. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js.map +1 -0
  614. package/dist-server/server/modules/worktrees/services/worktree-create.service.js +67 -0
  615. package/dist-server/server/modules/worktrees/services/worktree-create.service.js.map +1 -0
  616. package/dist-server/server/modules/worktrees/services/worktree-git.service.js +172 -0
  617. package/dist-server/server/modules/worktrees/services/worktree-git.service.js.map +1 -0
  618. package/dist-server/server/modules/worktrees/services/worktree-list.service.js +91 -0
  619. package/dist-server/server/modules/worktrees/services/worktree-list.service.js.map +1 -0
  620. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js +118 -0
  621. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js.map +1 -0
  622. package/dist-server/server/modules/worktrees/services/worktree-open.service.js +58 -0
  623. package/dist-server/server/modules/worktrees/services/worktree-open.service.js.map +1 -0
  624. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +65 -0
  625. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js.map +1 -0
  626. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js +58 -0
  627. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js.map +1 -0
  628. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js +85 -0
  629. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js.map +1 -0
  630. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js +58 -0
  631. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js.map +1 -0
  632. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js +34 -0
  633. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js.map +1 -0
  634. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js +137 -0
  635. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js.map +1 -0
  636. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js +99 -0
  637. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js.map +1 -0
  638. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js +157 -0
  639. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js.map +1 -0
  640. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js +167 -0
  641. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js.map +1 -0
  642. package/dist-server/server/modules/worktrees/worktrees.module.js +97 -0
  643. package/dist-server/server/modules/worktrees/worktrees.module.js.map +1 -0
  644. package/dist-server/server/modules/worktrees/worktrees.routes.js +84 -0
  645. package/dist-server/server/modules/worktrees/worktrees.routes.js.map +1 -0
  646. package/dist-server/server/shared/claude-cli-path.js +103 -0
  647. package/dist-server/server/shared/claude-cli-path.js.map +1 -0
  648. package/dist-server/server/shared/frontmatter.js +16 -0
  649. package/dist-server/server/shared/frontmatter.js.map +1 -0
  650. package/dist-server/server/shared/image-attachments.js +343 -0
  651. package/dist-server/server/shared/image-attachments.js.map +1 -0
  652. package/dist-server/server/shared/interfaces.js +2 -0
  653. package/dist-server/server/shared/interfaces.js.map +1 -0
  654. package/dist-server/server/shared/tests/claude-cli-path.test.js +45 -0
  655. package/dist-server/server/shared/tests/claude-cli-path.test.js.map +1 -0
  656. package/dist-server/server/shared/tests/image-attachments.test.js +262 -0
  657. package/dist-server/server/shared/tests/image-attachments.test.js.map +1 -0
  658. package/dist-server/server/shared/tests/slice-tail-page.test.js +35 -0
  659. package/dist-server/server/shared/tests/slice-tail-page.test.js.map +1 -0
  660. package/dist-server/server/shared/types.js +2 -0
  661. package/dist-server/server/shared/types.js.map +1 -0
  662. package/dist-server/server/shared/utils.js +966 -0
  663. package/dist-server/server/shared/utils.js.map +1 -0
  664. package/dist-server/shared/networkHosts.js +20 -0
  665. package/dist-server/shared/networkHosts.js.map +1 -0
  666. package/electron/assets/logo-macos.icns +0 -0
  667. package/electron/assets/logo-macos.png +0 -0
  668. package/electron/assets/logo-windows.ico +0 -0
  669. package/electron/cloud.js +260 -0
  670. package/electron/desktopNotifications.js +378 -0
  671. package/electron/desktopWindow.js +766 -0
  672. package/electron/launcher/index.html +14 -0
  673. package/electron/launcher/launcher.css +801 -0
  674. package/electron/launcher/launcher.js +687 -0
  675. package/electron/localServer.js +549 -0
  676. package/electron/main.js +944 -0
  677. package/electron/preload.cjs +60 -0
  678. package/electron/scripts/generate-macos-icon.js +62 -0
  679. package/electron/serverInstaller.js +277 -0
  680. package/electron/tabs.js +87 -0
  681. package/electron/viewHost.js +331 -0
  682. package/package.json +259 -0
  683. package/public/api-docs.html +901 -0
  684. package/scripts/fix-codex-sdk-windows-hide.js +66 -0
  685. package/scripts/fix-node-pty.js +67 -0
  686. package/scripts/promote-dist-server.mjs +50 -0
  687. package/scripts/release/build-server-bundle.js +176 -0
  688. package/scripts/release/prepare-desktop-app.js +152 -0
  689. package/server/index.ts +400 -0
  690. package/server/load-env.ts +47 -0
  691. package/server/modules/agent/agent.module.ts +52 -0
  692. package/server/modules/agent/agent.routes.ts +1287 -0
  693. package/server/modules/agent/index.ts +2 -0
  694. package/server/modules/agent/tests/agent.routes.test.ts +205 -0
  695. package/server/modules/assets/assets.routes.ts +150 -0
  696. package/server/modules/assets/index.ts +3 -0
  697. package/server/modules/assets/services/image-assets.service.ts +127 -0
  698. package/server/modules/assets/tests/image-assets.service.test.ts +74 -0
  699. package/server/modules/auth/auth.middleware.ts +163 -0
  700. package/server/modules/auth/auth.module.ts +38 -0
  701. package/server/modules/auth/auth.routes.ts +57 -0
  702. package/server/modules/auth/auth.service.ts +155 -0
  703. package/server/modules/auth/index.ts +9 -0
  704. package/server/modules/auth/tests/auth.service.test.ts +95 -0
  705. package/server/modules/browser-use/browser-use-mcp.routes.ts +120 -0
  706. package/server/modules/browser-use/browser-use-mcp.ts +386 -0
  707. package/server/modules/browser-use/browser-use-runtime.ts +10 -0
  708. package/server/modules/browser-use/browser-use.routes.ts +96 -0
  709. package/server/modules/browser-use/browser-use.service.ts +836 -0
  710. package/server/modules/browser-use/index.ts +11 -0
  711. package/server/modules/browser-use/tests/browser-use.service.test.ts +10 -0
  712. package/server/modules/cli/cli.module.ts +95 -0
  713. package/server/modules/cli/cli.service.ts +260 -0
  714. package/server/modules/cli/cli.ts +19 -0
  715. package/server/modules/cli/index.ts +2 -0
  716. package/server/modules/cli/sandbox.service.ts +413 -0
  717. package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +186 -0
  718. package/server/modules/cli/tests/cli.service.test.ts +98 -0
  719. package/server/modules/cli/tests/sandbox.service.test.ts +64 -0
  720. package/server/modules/commands/commands.module.ts +22 -0
  721. package/server/modules/commands/commands.routes.ts +655 -0
  722. package/server/modules/commands/index.ts +2 -0
  723. package/server/modules/commands/tests/commands.test.ts +171 -0
  724. package/server/modules/database/connection.ts +143 -0
  725. package/server/modules/database/index.ts +17 -0
  726. package/server/modules/database/init-db.ts +17 -0
  727. package/server/modules/database/migrations.ts +515 -0
  728. package/server/modules/database/repositories/api-keys.ts +119 -0
  729. package/server/modules/database/repositories/app-config.ts +53 -0
  730. package/server/modules/database/repositories/credentials.ts +106 -0
  731. package/server/modules/database/repositories/github-tokens.ts +100 -0
  732. package/server/modules/database/repositories/notification-channel-endpoints.ts +153 -0
  733. package/server/modules/database/repositories/notification-preferences.ts +117 -0
  734. package/server/modules/database/repositories/projects.db.ts +196 -0
  735. package/server/modules/database/repositories/provider-models.ts +168 -0
  736. package/server/modules/database/repositories/push-subscriptions.ts +80 -0
  737. package/server/modules/database/repositories/scan-state.db.ts +42 -0
  738. package/server/modules/database/repositories/sessions.db.ts +524 -0
  739. package/server/modules/database/repositories/users.ts +140 -0
  740. package/server/modules/database/repositories/vapid-keys.ts +57 -0
  741. package/server/modules/database/schema.ts +210 -0
  742. package/server/modules/database/tests/projects.db.integration.test.ts +72 -0
  743. package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -0
  744. package/server/modules/database/tests/sessions-provider-mapping.test.ts +109 -0
  745. package/server/modules/database/tests/sessions.db.integration.test.ts +116 -0
  746. package/server/modules/file-tree/file-tree.module.ts +116 -0
  747. package/server/modules/file-tree/file-tree.routes.ts +258 -0
  748. package/server/modules/file-tree/file-tree.service.ts +675 -0
  749. package/server/modules/file-tree/index.ts +2 -0
  750. package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -0
  751. package/server/modules/file-tree/tests/file-tree.service.test.ts +371 -0
  752. package/server/modules/git/git-branch.service.ts +43 -0
  753. package/server/modules/git/git-parsing.service.ts +66 -0
  754. package/server/modules/git/git.module.ts +22 -0
  755. package/server/modules/git/git.routes.ts +1601 -0
  756. package/server/modules/git/index.ts +2 -0
  757. package/server/modules/git/tests/git-branch.service.test.ts +60 -0
  758. package/server/modules/git/tests/git-init.routes.test.ts +179 -0
  759. package/server/modules/git/tests/git.test.ts +106 -0
  760. package/server/modules/notifications/index.ts +24 -0
  761. package/server/modules/notifications/notifications.routes.ts +127 -0
  762. package/server/modules/notifications/services/desktop-notification-clients.service.ts +124 -0
  763. package/server/modules/notifications/services/notification-orchestrator.service.js +310 -0
  764. package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -0
  765. package/server/modules/notifications/vapid-keys.service.ts +38 -0
  766. package/server/modules/notifications/websocket/desktop-notifications-websocket.service.ts +109 -0
  767. package/server/modules/plugins/index.ts +9 -0
  768. package/server/modules/plugins/plugin-process.service.ts +217 -0
  769. package/server/modules/plugins/plugin-registry.service.ts +459 -0
  770. package/server/modules/plugins/plugins.module.ts +33 -0
  771. package/server/modules/plugins/plugins.routes.ts +66 -0
  772. package/server/modules/plugins/plugins.service.ts +147 -0
  773. package/server/modules/plugins/tests/plugins.service.test.ts +32 -0
  774. package/server/modules/projects/index.ts +11 -0
  775. package/server/modules/projects/projects.routes.ts +273 -0
  776. package/server/modules/projects/services/project-clone.service.ts +323 -0
  777. package/server/modules/projects/services/project-delete.service.ts +90 -0
  778. package/server/modules/projects/services/project-management.service.ts +144 -0
  779. package/server/modules/projects/services/project-star.service.ts +78 -0
  780. package/server/modules/projects/services/projects-has-taskmaster.service.ts +248 -0
  781. package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +314 -0
  782. package/server/modules/projects/tests/project-clone.service.test.ts +183 -0
  783. package/server/modules/projects/tests/project-management.service.test.ts +117 -0
  784. package/server/modules/projects/tests/project-star.service.test.ts +123 -0
  785. package/server/modules/projects/tests/projects-has-taskmaster.service.test.ts +105 -0
  786. package/server/modules/providers/README.md +380 -0
  787. package/server/modules/providers/index.ts +10 -0
  788. package/server/modules/providers/list/claude/claude-auth.provider.ts +160 -0
  789. package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -0
  790. package/server/modules/providers/list/claude/claude-models.provider.ts +294 -0
  791. package/server/modules/providers/list/claude/claude-runtime.provider.js +1068 -0
  792. package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +203 -0
  793. package/server/modules/providers/list/claude/claude-sessions.provider.ts +684 -0
  794. package/server/modules/providers/list/claude/claude-skills.provider.ts +265 -0
  795. package/server/modules/providers/list/claude/claude.provider.ts +30 -0
  796. package/server/modules/providers/list/codex/codex-app-server.client.ts +226 -0
  797. package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -0
  798. package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -0
  799. package/server/modules/providers/list/codex/codex-models.provider.ts +123 -0
  800. package/server/modules/providers/list/codex/codex-native-command.service.ts +31 -0
  801. package/server/modules/providers/list/codex/codex-native-runtime.provider.ts +577 -0
  802. package/server/modules/providers/list/codex/codex-runtime.provider.js +533 -0
  803. package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +203 -0
  804. package/server/modules/providers/list/codex/codex-sessions.provider.ts +938 -0
  805. package/server/modules/providers/list/codex/codex-skills.provider.ts +73 -0
  806. package/server/modules/providers/list/codex/codex.provider.ts +30 -0
  807. package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -0
  808. package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -0
  809. package/server/modules/providers/list/cursor/cursor-models.provider.ts +119 -0
  810. package/server/modules/providers/list/cursor/cursor-runtime.provider.js +385 -0
  811. package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +159 -0
  812. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +654 -0
  813. package/server/modules/providers/list/cursor/cursor-skills.provider.ts +39 -0
  814. package/server/modules/providers/list/cursor/cursor.provider.ts +30 -0
  815. package/server/modules/providers/list/opencode/opencode-auth.provider.ts +110 -0
  816. package/server/modules/providers/list/opencode/opencode-mcp.provider.ts +228 -0
  817. package/server/modules/providers/list/opencode/opencode-models.provider.ts +203 -0
  818. package/server/modules/providers/list/opencode/opencode-runtime.provider.js +434 -0
  819. package/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +261 -0
  820. package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +179 -0
  821. package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +500 -0
  822. package/server/modules/providers/list/opencode/opencode-skills.provider.ts +78 -0
  823. package/server/modules/providers/list/opencode/opencode.provider.ts +30 -0
  824. package/server/modules/providers/provider.registry.ts +36 -0
  825. package/server/modules/providers/provider.routes.ts +877 -0
  826. package/server/modules/providers/services/mcp.service.ts +109 -0
  827. package/server/modules/providers/services/provider-auth.service.ts +26 -0
  828. package/server/modules/providers/services/provider-capabilities.service.ts +97 -0
  829. package/server/modules/providers/services/provider-models.service.ts +401 -0
  830. package/server/modules/providers/services/provider-runtime.service.ts +108 -0
  831. package/server/modules/providers/services/provider-token-usage.service.ts +357 -0
  832. package/server/modules/providers/services/session-conversations-search.service.ts +1321 -0
  833. package/server/modules/providers/services/session-synchronizer.service.ts +74 -0
  834. package/server/modules/providers/services/session-watch-scheduler.ts +183 -0
  835. package/server/modules/providers/services/sessions-watcher.service.ts +377 -0
  836. package/server/modules/providers/services/sessions.service.ts +471 -0
  837. package/server/modules/providers/services/skills.service.ts +39 -0
  838. package/server/modules/providers/shared/base/abstract.provider.ts +32 -0
  839. package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -0
  840. package/server/modules/providers/shared/skills/skills.provider.ts +287 -0
  841. package/server/modules/providers/tests/claude-auth.test.ts +150 -0
  842. package/server/modules/providers/tests/claude-sessions.test.ts +61 -0
  843. package/server/modules/providers/tests/codex-app-server.client.test.ts +74 -0
  844. package/server/modules/providers/tests/codex-native-command.service.test.ts +223 -0
  845. package/server/modules/providers/tests/codex-sdk-windows-hide-patch.test.ts +33 -0
  846. package/server/modules/providers/tests/codex-sdk-windows-hide.test.ts +20 -0
  847. package/server/modules/providers/tests/codex-sessions.test.ts +231 -0
  848. package/server/modules/providers/tests/mcp.test.ts +349 -0
  849. package/server/modules/providers/tests/opencode-models.test.ts +41 -0
  850. package/server/modules/providers/tests/opencode-sessions.test.ts +522 -0
  851. package/server/modules/providers/tests/provider-attachment-history.test.ts +247 -0
  852. package/server/modules/providers/tests/provider-models.service.test.ts +353 -0
  853. package/server/modules/providers/tests/provider-runtime.service.test.ts +138 -0
  854. package/server/modules/providers/tests/provider-token-usage.service.test.ts +186 -0
  855. package/server/modules/providers/tests/provider.routes.test.ts +244 -0
  856. package/server/modules/providers/tests/session-watch-scheduler.test.ts +87 -0
  857. package/server/modules/providers/tests/sessions-details.test.ts +73 -0
  858. package/server/modules/providers/tests/sessions-watcher-filter.test.ts +27 -0
  859. package/server/modules/providers/tests/sessions.service.test.ts +127 -0
  860. package/server/modules/providers/tests/skills.test.ts +692 -0
  861. package/server/modules/settings/index.ts +2 -0
  862. package/server/modules/settings/settings.module.ts +50 -0
  863. package/server/modules/settings/settings.routes.ts +51 -0
  864. package/server/modules/settings/settings.service.ts +186 -0
  865. package/server/modules/settings/tests/settings.service.test.ts +54 -0
  866. package/server/modules/system/index.ts +2 -0
  867. package/server/modules/system/system.module.ts +62 -0
  868. package/server/modules/system/system.routes.ts +21 -0
  869. package/server/modules/system/system.service.ts +76 -0
  870. package/server/modules/system/tests/system.service.test.ts +118 -0
  871. package/server/modules/taskmaster/index.ts +2 -0
  872. package/server/modules/taskmaster/taskmaster.module.ts +24 -0
  873. package/server/modules/taskmaster/taskmaster.routes.ts +1482 -0
  874. package/server/modules/taskmaster/taskmaster.service.ts +132 -0
  875. package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +144 -0
  876. package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -0
  877. package/server/modules/user/index.ts +2 -0
  878. package/server/modules/user/tests/user.service.test.ts +61 -0
  879. package/server/modules/user/user.module.ts +58 -0
  880. package/server/modules/user/user.routes.ts +50 -0
  881. package/server/modules/user/user.service.ts +85 -0
  882. package/server/modules/voice/index.ts +2 -0
  883. package/server/modules/voice/tests/voice.service.test.ts +98 -0
  884. package/server/modules/voice/voice.module.ts +47 -0
  885. package/server/modules/voice/voice.routes.ts +113 -0
  886. package/server/modules/voice/voice.service.ts +192 -0
  887. package/server/modules/websocket/README.md +273 -0
  888. package/server/modules/websocket/index.ts +3 -0
  889. package/server/modules/websocket/services/chat-run-registry.service.ts +343 -0
  890. package/server/modules/websocket/services/chat-session-writer.service.ts +145 -0
  891. package/server/modules/websocket/services/chat-websocket.service.ts +425 -0
  892. package/server/modules/websocket/services/plugin-websocket-proxy.service.ts +65 -0
  893. package/server/modules/websocket/services/shell-websocket.service.ts +776 -0
  894. package/server/modules/websocket/services/terminal-replay-store.ts +218 -0
  895. package/server/modules/websocket/services/websocket-auth.service.ts +59 -0
  896. package/server/modules/websocket/services/websocket-server.service.ts +127 -0
  897. package/server/modules/websocket/services/websocket-state.service.ts +16 -0
  898. package/server/modules/websocket/services/websocket-writer.service.ts +38 -0
  899. package/server/modules/websocket/tests/chat-attachment-filter.test.ts +59 -0
  900. package/server/modules/websocket/tests/chat-run-registry.test.ts +282 -0
  901. package/server/modules/websocket/tests/shell-websocket.service.test.ts +432 -0
  902. package/server/modules/websocket/tests/terminal-replay-store.test.ts +79 -0
  903. package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -0
  904. package/server/modules/worktrees/index.ts +2 -0
  905. package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -0
  906. package/server/modules/worktrees/services/worktree-create.service.ts +104 -0
  907. package/server/modules/worktrees/services/worktree-git.service.ts +207 -0
  908. package/server/modules/worktrees/services/worktree-list.service.ts +143 -0
  909. package/server/modules/worktrees/services/worktree-merge.service.ts +157 -0
  910. package/server/modules/worktrees/services/worktree-open.service.ts +85 -0
  911. package/server/modules/worktrees/services/worktree-remove.service.ts +88 -0
  912. package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -0
  913. package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -0
  914. package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -0
  915. package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -0
  916. package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -0
  917. package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -0
  918. package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -0
  919. package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -0
  920. package/server/modules/worktrees/worktrees.module.ts +113 -0
  921. package/server/modules/worktrees/worktrees.routes.ts +116 -0
  922. package/server/shared/claude-cli-path.ts +139 -0
  923. package/server/shared/frontmatter.ts +18 -0
  924. package/server/shared/image-attachments.ts +435 -0
  925. package/server/shared/interfaces.ts +179 -0
  926. package/server/shared/tests/claude-cli-path.test.ts +61 -0
  927. package/server/shared/tests/image-attachments.test.ts +353 -0
  928. package/server/shared/tests/slice-tail-page.test.ts +42 -0
  929. package/server/shared/types.ts +1268 -0
  930. package/server/shared/utils.ts +1161 -0
  931. package/server/tsconfig.json +40 -0
  932. package/shared/networkHosts.js +22 -0
@@ -0,0 +1,1161 @@
1
+ // @ts-nocheck -- dynamic provider event payloads are normalized at the injected writer boundary.
2
+ import path from 'path';
3
+ import express from 'express';
4
+ import { normalizeProjectPath } from '../../shared/utils.js';
5
+ /**
6
+ * Creates Agent routes around explicit authentication, repository, provider,
7
+ * filesystem, subprocess, runtime, and GitHub dependencies.
8
+ */
9
+ export function createAgentRouter(dependencies) {
10
+ const fs = dependencies.fileSystem;
11
+ const crypto = dependencies.crypto;
12
+ const os = { homedir: dependencies.homeDirectory };
13
+ const spawn = dependencies.spawnProcess;
14
+ const IS_PLATFORM = dependencies.platformMode;
15
+ const userDb = dependencies.users;
16
+ const apiKeysDb = dependencies.apiKeys;
17
+ const githubTokensDb = dependencies.githubTokens;
18
+ const projectsDb = dependencies.projects;
19
+ const providerModelsService = dependencies.models;
20
+ const queryClaudeSDK = dependencies.queryClaude;
21
+ const spawnCursor = dependencies.queryCursor;
22
+ const queryCodex = dependencies.queryCodex;
23
+ const spawnOpenCode = dependencies.queryOpenCode;
24
+ const Octokit = dependencies.GithubClient;
25
+ const router = express.Router();
26
+ /**
27
+ * Middleware to authenticate agent API requests.
28
+ *
29
+ * Supports two authentication modes:
30
+ * 1. Platform mode (IS_PLATFORM=true): For managed/hosted deployments where
31
+ * authentication is handled by an external proxy. Requests are trusted and
32
+ * the default user context is used.
33
+ *
34
+ * 2. API key mode (default): For self-hosted deployments where users authenticate
35
+ * via API keys created in the UI. Keys are validated against the local database.
36
+ */
37
+ const validateExternalApiKey = (req, res, next) => {
38
+ // Platform mode: Authentication is handled externally (e.g., by a proxy layer).
39
+ // Trust the request and use the default user context.
40
+ if (IS_PLATFORM) {
41
+ try {
42
+ const user = userDb.getFirstUser();
43
+ if (!user) {
44
+ return res.status(500).json({ error: 'Platform mode: No user found in database' });
45
+ }
46
+ req.user = user;
47
+ return next();
48
+ }
49
+ catch (error) {
50
+ console.error('Platform mode error:', error);
51
+ return res.status(500).json({ error: 'Platform mode: Failed to fetch user' });
52
+ }
53
+ }
54
+ // Self-hosted mode: Validate API key from header or query parameter
55
+ const apiKey = req.headers['x-api-key'] || req.query.apiKey;
56
+ if (!apiKey) {
57
+ return res.status(401).json({ error: 'API key required' });
58
+ }
59
+ const user = apiKeysDb.validateApiKey(apiKey);
60
+ if (!user) {
61
+ return res.status(401).json({ error: 'Invalid or inactive API key' });
62
+ }
63
+ req.user = user;
64
+ next();
65
+ };
66
+ /**
67
+ * Get the remote URL of a git repository
68
+ * @param {string} repoPath - Path to the git repository
69
+ * @returns {Promise<string>} - Remote URL of the repository
70
+ */
71
+ async function getGitRemoteUrl(repoPath) {
72
+ return new Promise((resolve, reject) => {
73
+ const gitProcess = spawn('git', ['config', '--get', 'remote.origin.url'], {
74
+ cwd: repoPath,
75
+ stdio: ['pipe', 'pipe', 'pipe']
76
+ });
77
+ let stdout = '';
78
+ let stderr = '';
79
+ gitProcess.stdout.on('data', (data) => {
80
+ stdout += data.toString();
81
+ });
82
+ gitProcess.stderr.on('data', (data) => {
83
+ stderr += data.toString();
84
+ });
85
+ gitProcess.on('close', (code) => {
86
+ if (code === 0) {
87
+ resolve(stdout.trim());
88
+ }
89
+ else {
90
+ reject(new Error(`Failed to get git remote: ${stderr}`));
91
+ }
92
+ });
93
+ gitProcess.on('error', (error) => {
94
+ reject(new Error(`Failed to execute git: ${error.message}`));
95
+ });
96
+ });
97
+ }
98
+ /**
99
+ * Normalize GitHub URLs for comparison
100
+ * @param {string} url - GitHub URL
101
+ * @returns {string} - Normalized URL
102
+ */
103
+ function normalizeGitHubUrl(url) {
104
+ // Remove .git suffix
105
+ let normalized = url.replace(/\.git$/, '');
106
+ // Convert SSH to HTTPS format for comparison
107
+ normalized = normalized.replace(/^git@github\.com:/, 'https://github.com/');
108
+ // Remove trailing slash
109
+ normalized = normalized.replace(/\/$/, '');
110
+ return normalized.toLowerCase();
111
+ }
112
+ /**
113
+ * Parse GitHub URL to extract owner and repo
114
+ * @param {string} url - GitHub URL (HTTPS or SSH)
115
+ * @returns {{owner: string, repo: string}} - Parsed owner and repo
116
+ */
117
+ function parseGitHubUrl(url) {
118
+ // Handle HTTPS URLs: https://github.com/owner/repo or https://github.com/owner/repo.git
119
+ // Handle SSH URLs: git@github.com:owner/repo or git@github.com:owner/repo.git
120
+ const match = url.match(/github\.com[:/]([^/]+)\/([^/]+?)(?:\.git)?$/);
121
+ if (!match) {
122
+ throw new Error('Invalid GitHub URL format');
123
+ }
124
+ return {
125
+ owner: match[1],
126
+ repo: match[2].replace(/\.git$/, '')
127
+ };
128
+ }
129
+ /**
130
+ * Auto-generate a branch name from a message
131
+ * @param {string} message - The agent message
132
+ * @returns {string} - Generated branch name
133
+ */
134
+ function autogenerateBranchName(message) {
135
+ // Convert to lowercase, replace spaces/special chars with hyphens
136
+ let branchName = message
137
+ .toLowerCase()
138
+ .replace(/[^a-z0-9\s-]/g, '') // Remove special characters
139
+ .replace(/\s+/g, '-') // Replace spaces with hyphens
140
+ .replace(/-+/g, '-') // Replace multiple hyphens with single
141
+ .replace(/^-|-$/g, ''); // Remove leading/trailing hyphens
142
+ // Ensure non-empty fallback
143
+ if (!branchName) {
144
+ branchName = 'task';
145
+ }
146
+ // Generate timestamp suffix (last 6 chars of base36 timestamp)
147
+ const timestamp = Date.now().toString(36).slice(-6);
148
+ const suffix = `-${timestamp}`;
149
+ // Limit length to ensure total length including suffix fits within 50 characters
150
+ const maxBaseLength = 50 - suffix.length;
151
+ if (branchName.length > maxBaseLength) {
152
+ branchName = branchName.substring(0, maxBaseLength);
153
+ }
154
+ // Remove any trailing hyphen after truncation and ensure no leading hyphen
155
+ branchName = branchName.replace(/-$/, '').replace(/^-+/, '');
156
+ // If still empty or starts with hyphen after cleanup, use fallback
157
+ if (!branchName || branchName.startsWith('-')) {
158
+ branchName = 'task';
159
+ }
160
+ // Combine base name with timestamp suffix
161
+ branchName = `${branchName}${suffix}`;
162
+ // Final validation: ensure it matches safe pattern
163
+ if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(branchName)) {
164
+ // Fallback to deterministic safe name
165
+ return `branch-${timestamp}`;
166
+ }
167
+ return branchName;
168
+ }
169
+ /**
170
+ * Validate a Git branch name
171
+ * @param {string} branchName - Branch name to validate
172
+ * @returns {{valid: boolean, error?: string}} - Validation result
173
+ */
174
+ function validateBranchName(branchName) {
175
+ if (!branchName || branchName.trim() === '') {
176
+ return { valid: false, error: 'Branch name cannot be empty' };
177
+ }
178
+ // Git branch name rules
179
+ const invalidPatterns = [
180
+ { pattern: /^\./, message: 'Branch name cannot start with a dot' },
181
+ { pattern: /\.$/, message: 'Branch name cannot end with a dot' },
182
+ { pattern: /\.\./, message: 'Branch name cannot contain consecutive dots (..)' },
183
+ { pattern: /\s/, message: 'Branch name cannot contain spaces' },
184
+ { pattern: /[~^:?*\[\\]/, message: 'Branch name cannot contain special characters: ~ ^ : ? * [ \\' },
185
+ { pattern: /@{/, message: 'Branch name cannot contain @{' },
186
+ { pattern: /\/$/, message: 'Branch name cannot end with a slash' },
187
+ { pattern: /^\//, message: 'Branch name cannot start with a slash' },
188
+ { pattern: /\/\//, message: 'Branch name cannot contain consecutive slashes' },
189
+ { pattern: /\.lock$/, message: 'Branch name cannot end with .lock' }
190
+ ];
191
+ for (const { pattern, message } of invalidPatterns) {
192
+ if (pattern.test(branchName)) {
193
+ return { valid: false, error: message };
194
+ }
195
+ }
196
+ // Check for ASCII control characters
197
+ if (/[\x00-\x1F\x7F]/.test(branchName)) {
198
+ return { valid: false, error: 'Branch name cannot contain control characters' };
199
+ }
200
+ return { valid: true };
201
+ }
202
+ /**
203
+ * Get recent commit messages from a repository
204
+ * @param {string} projectPath - Path to the git repository
205
+ * @param {number} limit - Number of commits to retrieve (default: 5)
206
+ * @returns {Promise<string[]>} - Array of commit messages
207
+ */
208
+ async function getCommitMessages(projectPath, limit = 5) {
209
+ return new Promise((resolve, reject) => {
210
+ const gitProcess = spawn('git', ['log', `-${limit}`, '--pretty=format:%s'], {
211
+ cwd: projectPath,
212
+ stdio: ['pipe', 'pipe', 'pipe']
213
+ });
214
+ let stdout = '';
215
+ let stderr = '';
216
+ gitProcess.stdout.on('data', (data) => {
217
+ stdout += data.toString();
218
+ });
219
+ gitProcess.stderr.on('data', (data) => {
220
+ stderr += data.toString();
221
+ });
222
+ gitProcess.on('close', (code) => {
223
+ if (code === 0) {
224
+ const messages = stdout.trim().split('\n').filter(msg => msg.length > 0);
225
+ resolve(messages);
226
+ }
227
+ else {
228
+ reject(new Error(`Failed to get commit messages: ${stderr}`));
229
+ }
230
+ });
231
+ gitProcess.on('error', (error) => {
232
+ reject(new Error(`Failed to execute git: ${error.message}`));
233
+ });
234
+ });
235
+ }
236
+ /**
237
+ * Create a new branch on GitHub using the API
238
+ * @param {Octokit} octokit - Octokit instance
239
+ * @param {string} owner - Repository owner
240
+ * @param {string} repo - Repository name
241
+ * @param {string} branchName - Name of the new branch
242
+ * @param {string} baseBranch - Base branch to branch from (default: 'main')
243
+ * @returns {Promise<void>}
244
+ */
245
+ /**
246
+ * Create a pull request on GitHub
247
+ * @param {Octokit} octokit - Octokit instance
248
+ * @param {string} owner - Repository owner
249
+ * @param {string} repo - Repository name
250
+ * @param {string} branchName - Head branch name
251
+ * @param {string} title - PR title
252
+ * @param {string} body - PR body/description
253
+ * @param {string} baseBranch - Base branch (default: 'main')
254
+ * @returns {Promise<{number: number, url: string}>} - PR number and URL
255
+ */
256
+ async function createGitHubPR(octokit, owner, repo, branchName, title, body, baseBranch = 'main') {
257
+ const { data: pr } = await octokit.pulls.create({
258
+ owner,
259
+ repo,
260
+ title,
261
+ head: branchName,
262
+ base: baseBranch,
263
+ body
264
+ });
265
+ console.log(`✅ Created pull request #${pr.number}: ${pr.html_url}`);
266
+ return {
267
+ number: pr.number,
268
+ url: pr.html_url
269
+ };
270
+ }
271
+ /**
272
+ * Clone a GitHub repository to a directory
273
+ * @param {string} githubUrl - GitHub repository URL
274
+ * @param {string} githubToken - Optional GitHub token for private repos
275
+ * @param {string} projectPath - Path for cloning the repository
276
+ * @returns {Promise<{path: string, created: boolean}>} - Checkout path and ownership flag
277
+ */
278
+ async function cloneGitHubRepo(githubUrl, githubToken = null, projectPath) {
279
+ return new Promise(async (resolve, reject) => {
280
+ try {
281
+ // Validate the host before using credentials or invoking Git.
282
+ let parsedGithubUrl;
283
+ try {
284
+ parsedGithubUrl = new URL(githubUrl);
285
+ }
286
+ catch {
287
+ throw new Error('Invalid GitHub URL');
288
+ }
289
+ if (parsedGithubUrl.protocol !== 'https:'
290
+ || parsedGithubUrl.hostname !== 'github.com'
291
+ || parsedGithubUrl.username
292
+ || parsedGithubUrl.password) {
293
+ throw new Error('Invalid GitHub URL');
294
+ }
295
+ const cloneUrl = parsedGithubUrl.toString();
296
+ const cloneDir = path.resolve(projectPath);
297
+ // Check if directory already exists
298
+ try {
299
+ await fs.access(cloneDir);
300
+ // Directory exists - check if it's a git repo with the same URL
301
+ try {
302
+ const existingUrl = await getGitRemoteUrl(cloneDir);
303
+ const normalizedExisting = normalizeGitHubUrl(existingUrl);
304
+ const normalizedRequested = normalizeGitHubUrl(cloneUrl);
305
+ if (normalizedExisting === normalizedRequested) {
306
+ console.log('✅ Repository already exists at path with correct URL');
307
+ return resolve({ path: cloneDir, created: false });
308
+ }
309
+ else {
310
+ throw new Error(`Directory ${cloneDir} already exists with a different repository (${existingUrl}). Expected: ${githubUrl}`);
311
+ }
312
+ }
313
+ catch (gitError) {
314
+ throw new Error(`Directory ${cloneDir} already exists but is not a valid git repository or git command failed`);
315
+ }
316
+ }
317
+ catch (accessError) {
318
+ // Directory doesn't exist - proceed with clone
319
+ }
320
+ // Ensure parent directory exists
321
+ await fs.mkdir(path.dirname(cloneDir), { recursive: true });
322
+ console.log('🔄 Cloning repository:', githubUrl);
323
+ console.log('📁 Destination:', cloneDir);
324
+ // Execute git clone
325
+ const gitEnvironment = githubToken ? {
326
+ ...process.env,
327
+ GIT_CONFIG_COUNT: '2',
328
+ GIT_CONFIG_KEY_0: 'credential.helper',
329
+ GIT_CONFIG_VALUE_0: '',
330
+ GIT_CONFIG_KEY_1: 'credential.helper',
331
+ GIT_CONFIG_VALUE_1: '!f() { echo username=x-access-token; echo "password=$CLOUDCLI_GITHUB_TOKEN"; }; f',
332
+ CLOUDCLI_GITHUB_TOKEN: githubToken,
333
+ GIT_TERMINAL_PROMPT: '0'
334
+ } : process.env;
335
+ const gitProcess = spawn('git', ['clone', '--depth', '1', '--', cloneUrl, cloneDir], {
336
+ stdio: ['pipe', 'pipe', 'pipe'],
337
+ env: gitEnvironment
338
+ });
339
+ let stdout = '';
340
+ let stderr = '';
341
+ gitProcess.stdout.on('data', (data) => {
342
+ stdout += data.toString();
343
+ });
344
+ gitProcess.stderr.on('data', (data) => {
345
+ stderr += data.toString();
346
+ console.log('Git stderr:', data.toString());
347
+ });
348
+ gitProcess.on('close', (code) => {
349
+ if (code === 0) {
350
+ console.log('✅ Repository cloned successfully');
351
+ resolve({ path: cloneDir, created: true });
352
+ }
353
+ else {
354
+ console.error('❌ Git clone failed:', stderr);
355
+ reject(new Error(`Git clone failed: ${stderr}`));
356
+ }
357
+ });
358
+ gitProcess.on('error', (error) => {
359
+ reject(new Error(`Failed to execute git: ${error.message}`));
360
+ });
361
+ }
362
+ catch (error) {
363
+ reject(error);
364
+ }
365
+ });
366
+ }
367
+ /**
368
+ * Clean up a temporary project directory and its Claude session
369
+ * @param {string} projectPath - Path to the project directory
370
+ * @param {string} sessionId - Session ID to clean up
371
+ */
372
+ async function cleanupProject(projectPath, sessionId = null) {
373
+ try {
374
+ const externalProjectsRoot = await fs.realpath(path.join(os.homedir(), '.claude', 'external-projects'));
375
+ const canonicalProjectPath = await fs.realpath(projectPath);
376
+ const relativeProjectPath = path.relative(externalProjectsRoot, canonicalProjectPath);
377
+ const isContained = relativeProjectPath !== ''
378
+ && relativeProjectPath !== '..'
379
+ && !relativeProjectPath.startsWith(`..${path.sep}`)
380
+ && !path.isAbsolute(relativeProjectPath);
381
+ if (!isContained) {
382
+ console.warn('âš ī¸ Refusing to clean up non-external project:', projectPath);
383
+ return;
384
+ }
385
+ console.log('🧹 Cleaning up project:', projectPath);
386
+ await fs.rm(canonicalProjectPath, { recursive: true, force: true });
387
+ console.log('✅ Project cleaned up');
388
+ // Also clean up the Claude session directory if sessionId provided
389
+ if (sessionId) {
390
+ try {
391
+ const sessionPath = path.join(os.homedir(), '.claude', 'sessions', sessionId);
392
+ console.log('🧹 Cleaning up session directory:', sessionPath);
393
+ await fs.rm(sessionPath, { recursive: true, force: true });
394
+ console.log('✅ Session directory cleaned up');
395
+ }
396
+ catch (error) {
397
+ console.error('âš ī¸ Failed to clean up session directory:', error.message);
398
+ }
399
+ }
400
+ }
401
+ catch (error) {
402
+ console.error('❌ Failed to clean up project:', error);
403
+ }
404
+ }
405
+ /**
406
+ * SSE Stream Writer - Adapts SDK/CLI output to Server-Sent Events
407
+ */
408
+ class SSEStreamWriter {
409
+ constructor(res, userId = null) {
410
+ this.res = res;
411
+ this.sessionId = null;
412
+ this.userId = userId;
413
+ this.isSSEStreamWriter = true; // Marker for transport detection
414
+ }
415
+ send(data) {
416
+ if (this.res.writableEnded) {
417
+ return;
418
+ }
419
+ // Format as SSE - providers send raw objects, we stringify
420
+ this.res.write(`data: ${JSON.stringify(data)}\n\n`);
421
+ }
422
+ end() {
423
+ if (!this.res.writableEnded) {
424
+ this.res.write('data: {"type":"done"}\n\n');
425
+ this.res.end();
426
+ }
427
+ }
428
+ setSessionId(sessionId) {
429
+ this.sessionId = sessionId;
430
+ this.send({ type: 'session-id', sessionId });
431
+ }
432
+ getSessionId() {
433
+ return this.sessionId;
434
+ }
435
+ }
436
+ /**
437
+ * Non-streaming response collector
438
+ */
439
+ class ResponseCollector {
440
+ constructor(userId = null) {
441
+ this.messages = [];
442
+ this.sessionId = null;
443
+ this.userId = userId;
444
+ }
445
+ send(data) {
446
+ // Store ALL messages for now - we'll filter when returning
447
+ this.messages.push(data);
448
+ // Extract sessionId if present
449
+ if (typeof data === 'string') {
450
+ try {
451
+ const parsed = JSON.parse(data);
452
+ if (parsed.sessionId) {
453
+ this.sessionId = parsed.sessionId;
454
+ }
455
+ }
456
+ catch (e) {
457
+ // Not JSON, ignore
458
+ }
459
+ }
460
+ else if (data && data.sessionId) {
461
+ this.sessionId = data.sessionId;
462
+ }
463
+ }
464
+ end() {
465
+ // Do nothing - we'll collect all messages
466
+ }
467
+ setSessionId(sessionId) {
468
+ this.sessionId = sessionId;
469
+ }
470
+ getSessionId() {
471
+ return this.sessionId;
472
+ }
473
+ getMessages() {
474
+ return this.messages;
475
+ }
476
+ /**
477
+ * Get filtered assistant messages only
478
+ */
479
+ getAssistantMessages() {
480
+ const assistantMessages = [];
481
+ for (const msg of this.messages) {
482
+ // Skip initial status message
483
+ if (msg && msg.type === 'status') {
484
+ continue;
485
+ }
486
+ // Handle JSON strings
487
+ if (typeof msg === 'string') {
488
+ try {
489
+ const parsed = JSON.parse(msg);
490
+ // Only include claude-response messages with assistant type
491
+ if (parsed.type === 'claude-response' && parsed.data && parsed.data.type === 'assistant') {
492
+ assistantMessages.push(parsed.data);
493
+ }
494
+ }
495
+ catch (e) {
496
+ // Not JSON, skip
497
+ }
498
+ }
499
+ }
500
+ return assistantMessages;
501
+ }
502
+ /**
503
+ * Calculate total tokens from all messages
504
+ */
505
+ getTotalTokens() {
506
+ let totalInput = 0;
507
+ let totalOutput = 0;
508
+ let totalCacheRead = 0;
509
+ let totalCacheCreation = 0;
510
+ for (const msg of this.messages) {
511
+ let data = msg;
512
+ // Parse if string
513
+ if (typeof msg === 'string') {
514
+ try {
515
+ data = JSON.parse(msg);
516
+ }
517
+ catch (e) {
518
+ continue;
519
+ }
520
+ }
521
+ // Extract usage from claude-response messages
522
+ if (data && data.type === 'claude-response' && data.data) {
523
+ const msgData = data.data;
524
+ if (msgData.message && msgData.message.usage) {
525
+ const usage = msgData.message.usage;
526
+ totalInput += usage.input_tokens || 0;
527
+ totalOutput += usage.output_tokens || 0;
528
+ totalCacheRead += usage.cache_read_input_tokens || 0;
529
+ totalCacheCreation += usage.cache_creation_input_tokens || 0;
530
+ }
531
+ }
532
+ }
533
+ const inputTokens = totalInput + totalCacheRead + totalCacheCreation;
534
+ return {
535
+ inputTokens,
536
+ outputTokens: totalOutput,
537
+ cacheReadTokens: totalCacheRead,
538
+ cacheCreationTokens: totalCacheCreation,
539
+ totalTokens: inputTokens + totalOutput
540
+ };
541
+ }
542
+ }
543
+ // ===============================
544
+ // External API Endpoint
545
+ // ===============================
546
+ /**
547
+ * POST /api/agent
548
+ *
549
+ * Trigger an AI agent to work on a project.
550
+ * Supports automatic GitHub branch and pull request creation after successful completion.
551
+ *
552
+ * ================================================================================================
553
+ * REQUEST BODY PARAMETERS
554
+ * ================================================================================================
555
+ *
556
+ * @param {string} githubUrl - (Conditionally Required) GitHub repository URL to clone.
557
+ * Supported formats:
558
+ * - HTTPS: https://github.com/owner/repo
559
+ * - HTTPS with .git: https://github.com/owner/repo.git
560
+ * - SSH: git@github.com:owner/repo
561
+ * - SSH with .git: git@github.com:owner/repo.git
562
+ *
563
+ * @param {string} projectPath - (Conditionally Required) Path to existing project OR destination for cloning.
564
+ * Behavior depends on usage:
565
+ * - If used alone: Must point to existing project directory
566
+ * - If used with githubUrl: Target location for cloning
567
+ * - If omitted with githubUrl: Auto-generates temporary path in ~/.claude/external-projects/
568
+ *
569
+ * @param {string} message - (Required) Task description for the AI agent. Used as:
570
+ * - Instructions for the agent
571
+ * - Source for auto-generated branch names (if createBranch=true and no branchName)
572
+ * - Fallback for PR title if no commits are made
573
+ *
574
+ * @param {string} provider - (Optional) AI provider to use. Options: 'claude' | 'cursor' | 'codex' | 'opencode'
575
+ * Default: 'claude'
576
+ *
577
+ * @param {boolean} stream - (Optional) Enable Server-Sent Events (SSE) streaming for real-time updates.
578
+ * Default: true
579
+ * - true: Returns text/event-stream with incremental updates
580
+ * - false: Returns complete JSON response after completion
581
+ *
582
+ * @param {string} model - (Optional) Model identifier for providers.
583
+ *
584
+ * Claude models: 'default', 'sonnet', 'opus', 'haiku', 'sonnet[1m]', 'opus[1m]', 'fable'
585
+ * Cursor models: 'gpt-5' (default), 'gpt-5.2', 'gpt-5.2-high', 'sonnet-4.5', 'opus-4.5',
586
+ * 'composer-1', 'auto', 'gpt-5.1', 'gpt-5.1-high',
587
+ * 'gpt-5.1-codex', 'gpt-5.1-codex-high', 'gpt-5.1-codex-max',
588
+ * 'gpt-5.1-codex-max-high', 'opus-4.1', 'grok', and thinking variants
589
+ * Codex models: 'gpt-5.4' (default), 'gpt-5.5', 'gpt-5.4-mini'
590
+ *
591
+ * @param {string} effort - (Optional) Reasoning effort for providers/models that support it.
592
+ * Claude supports: 'low', 'medium', 'high', 'xhigh', 'max' depending on model.
593
+ * Codex supports: 'low', 'medium', 'high', 'xhigh'.
594
+ * 'default' or omission lets the provider decide.
595
+ *
596
+ * @param {boolean} cleanup - (Optional) Auto-cleanup project directory after completion.
597
+ * Default: true
598
+ * Behavior:
599
+ * - Only applies when cloning via githubUrl (not for existing projectPath)
600
+ * - Deletes cloned repository after 5 seconds
601
+ * - Also deletes associated Claude session directory
602
+ * - Remote branch and PR remain on GitHub if created
603
+ *
604
+ * @param {string} githubToken - (Optional) GitHub Personal Access Token for authentication.
605
+ * Overrides stored token from user settings.
606
+ * Required for:
607
+ * - Private repositories
608
+ * - Branch/PR creation features
609
+ * Token must have 'repo' scope for full functionality.
610
+ *
611
+ * @param {string} branchName - (Optional) Custom name for the Git branch.
612
+ * If provided, createBranch is automatically set to true.
613
+ * Validation rules (errors returned if violated):
614
+ * - Cannot be empty or whitespace only
615
+ * - Cannot start or end with dot (.)
616
+ * - Cannot contain consecutive dots (..)
617
+ * - Cannot contain spaces
618
+ * - Cannot contain special characters: ~ ^ : ? * [ \
619
+ * - Cannot contain @{
620
+ * - Cannot start or end with forward slash (/)
621
+ * - Cannot contain consecutive slashes (//)
622
+ * - Cannot end with .lock
623
+ * - Cannot contain ASCII control characters
624
+ * Examples: 'feature/user-auth', 'bugfix/login-error', 'refactor/db-optimization'
625
+ *
626
+ * @param {boolean} createBranch - (Optional) Create a new Git branch after successful agent completion.
627
+ * Default: false (or true if branchName is provided)
628
+ * Behavior:
629
+ * - Creates branch locally and pushes to remote
630
+ * - If branch exists locally: Checks out existing branch (no error)
631
+ * - If branch exists on remote: Uses existing branch (no error)
632
+ * - Branch name: Custom (if branchName provided) or auto-generated from message
633
+ * - Requires either githubUrl OR projectPath with GitHub remote
634
+ *
635
+ * @param {boolean} createPR - (Optional) Create a GitHub Pull Request after successful completion.
636
+ * Default: false
637
+ * Behavior:
638
+ * - PR title: First commit message (or fallback to message parameter)
639
+ * - PR description: Auto-generated from all commit messages
640
+ * - Base branch: Always 'main' (currently hardcoded)
641
+ * - If PR already exists: GitHub returns error with details
642
+ * - Requires either githubUrl OR projectPath with GitHub remote
643
+ *
644
+ * ================================================================================================
645
+ * PATH HANDLING BEHAVIOR
646
+ * ================================================================================================
647
+ *
648
+ * Scenario 1: Only githubUrl provided
649
+ * Input: { githubUrl: "https://github.com/owner/repo" }
650
+ * Action: Clones to auto-generated temporary path: ~/.claude/external-projects/<hash>/
651
+ * Cleanup: Yes (if cleanup=true)
652
+ *
653
+ * Scenario 2: Only projectPath provided
654
+ * Input: { projectPath: "/home/user/my-project" }
655
+ * Action: Uses existing project at specified path
656
+ * Validation: Path must exist and be accessible
657
+ * Cleanup: No (never cleanup existing projects)
658
+ *
659
+ * Scenario 3: Both githubUrl and projectPath provided
660
+ * Input: { githubUrl: "https://github.com/owner/repo", projectPath: "/custom/path" }
661
+ * Action: Clones githubUrl to projectPath location
662
+ * Validation:
663
+ * - If projectPath exists with git repo:
664
+ * - Compares remote URL with githubUrl
665
+ * - If URLs match: Reuses existing repo
666
+ * - If URLs differ: Returns error
667
+ * Cleanup: Yes (if cleanup=true)
668
+ *
669
+ * ================================================================================================
670
+ * GITHUB BRANCH/PR CREATION REQUIREMENTS
671
+ * ================================================================================================
672
+ *
673
+ * For createBranch or createPR to work, one of the following must be true:
674
+ *
675
+ * Option A: githubUrl provided
676
+ * - Repository URL directly specified
677
+ * - Works with both cloning and existing paths
678
+ *
679
+ * Option B: projectPath with GitHub remote
680
+ * - Project must be a Git repository
681
+ * - Must have 'origin' remote configured
682
+ * - Remote URL must point to github.com
683
+ * - System auto-detects GitHub URL via: git remote get-url origin
684
+ *
685
+ * Additional Requirements:
686
+ * - Valid GitHub token (from settings or githubToken parameter)
687
+ * - Token must have 'repo' scope for private repos
688
+ * - Project must have commits (for PR creation)
689
+ *
690
+ * ================================================================================================
691
+ * VALIDATION & ERROR HANDLING
692
+ * ================================================================================================
693
+ *
694
+ * Input Validations (400 Bad Request):
695
+ * - Either githubUrl OR projectPath must be provided (not neither)
696
+ * - message must be non-empty string
697
+ * - provider must be 'claude', 'cursor', 'codex', or 'opencode'
698
+ * - createBranch/createPR requires githubUrl OR projectPath (not neither)
699
+ * - branchName must pass Git naming rules (if provided)
700
+ *
701
+ * Runtime Validations (500 Internal Server Error or specific error in response):
702
+ * - projectPath must exist (if used alone)
703
+ * - GitHub URL format must be valid
704
+ * - Git remote URL must include github.com (for projectPath + branch/PR)
705
+ * - GitHub token must be available (for private repos and branch/PR)
706
+ * - Directory conflicts handled (existing path with different repo)
707
+ *
708
+ * Branch Name Validation Errors (returned in response, not HTTP error):
709
+ * Invalid names return: { branch: { error: "Invalid branch name: <reason>" } }
710
+ * Examples:
711
+ * - "my branch" → "Branch name cannot contain spaces"
712
+ * - ".feature" → "Branch name cannot start with a dot"
713
+ * - "feature.lock" → "Branch name cannot end with .lock"
714
+ *
715
+ * ================================================================================================
716
+ * RESPONSE FORMATS
717
+ * ================================================================================================
718
+ *
719
+ * Streaming Response (stream=true):
720
+ * Content-Type: text/event-stream
721
+ * Events:
722
+ * - { type: "status", message: "...", projectPath: "..." }
723
+ * - { type: "claude-response", data: {...} }
724
+ * - { type: "github-branch", branch: { name: "...", url: "..." } }
725
+ * - { type: "github-pr", pullRequest: { number: 42, url: "..." } }
726
+ * - { type: "github-error", error: "..." }
727
+ * - { type: "done" }
728
+ *
729
+ * Non-Streaming Response (stream=false):
730
+ * Content-Type: application/json
731
+ * {
732
+ * success: true,
733
+ * sessionId: "session-123",
734
+ * messages: [...], // Assistant messages only (filtered)
735
+ * tokens: {
736
+ * inputTokens: 150,
737
+ * outputTokens: 50,
738
+ * cacheReadTokens: 0,
739
+ * cacheCreationTokens: 0,
740
+ * totalTokens: 200
741
+ * },
742
+ * projectPath: "/path/to/project",
743
+ * branch: { // Only if createBranch=true
744
+ * name: "feature/xyz",
745
+ * url: "https://github.com/owner/repo/tree/feature/xyz"
746
+ * } | { error: "..." },
747
+ * pullRequest: { // Only if createPR=true
748
+ * number: 42,
749
+ * url: "https://github.com/owner/repo/pull/42"
750
+ * } | { error: "..." }
751
+ * }
752
+ *
753
+ * Error Response:
754
+ * HTTP Status: 400, 401, 500
755
+ * Content-Type: application/json
756
+ * { success: false, error: "Error description" }
757
+ *
758
+ * ================================================================================================
759
+ * EXAMPLES
760
+ * ================================================================================================
761
+ *
762
+ * Example 1: Clone and process with auto-cleanup
763
+ * POST /api/agent
764
+ * { "githubUrl": "https://github.com/user/repo", "message": "Fix bug" }
765
+ *
766
+ * Example 2: Use existing project with custom branch and PR
767
+ * POST /api/agent
768
+ * {
769
+ * "projectPath": "/home/user/project",
770
+ * "message": "Add feature",
771
+ * "branchName": "feature/new-feature",
772
+ * "createPR": true
773
+ * }
774
+ *
775
+ * Example 3: Clone to specific path with auto-generated branch
776
+ * POST /api/agent
777
+ * {
778
+ * "githubUrl": "https://github.com/user/repo",
779
+ * "projectPath": "/tmp/work",
780
+ * "message": "Refactor code",
781
+ * "createBranch": true,
782
+ * "cleanup": false
783
+ * }
784
+ */
785
+ router.post('/', validateExternalApiKey, async (req, res) => {
786
+ const { githubUrl, projectPath, message, provider = 'claude', model, githubToken, branchName, sessionId } = req.body;
787
+ const effort = typeof req.body.effort === 'string' && req.body.effort.trim()
788
+ ? req.body.effort.trim()
789
+ : undefined;
790
+ // Parse stream and cleanup as booleans (handle string "true"/"false" from curl)
791
+ const stream = req.body.stream === undefined ? true : (req.body.stream === true || req.body.stream === 'true');
792
+ const cleanup = req.body.cleanup === undefined ? true : (req.body.cleanup === true || req.body.cleanup === 'true');
793
+ // If branchName is provided, automatically enable createBranch
794
+ const createBranch = branchName ? true : (req.body.createBranch === true || req.body.createBranch === 'true');
795
+ const createPR = req.body.createPR === true || req.body.createPR === 'true';
796
+ // Validate inputs
797
+ if (!githubUrl && !projectPath) {
798
+ return res.status(400).json({ error: 'Either githubUrl or projectPath is required' });
799
+ }
800
+ if (!message || !message.trim()) {
801
+ return res.status(400).json({ error: 'message is required' });
802
+ }
803
+ if (!['claude', 'cursor', 'codex', 'opencode'].includes(provider)) {
804
+ return res.status(400).json({ error: 'provider must be "claude", "cursor", "codex", or "opencode"' });
805
+ }
806
+ // Validate GitHub branch/PR creation requirements
807
+ // Allow branch/PR creation with projectPath as long as it has a GitHub remote
808
+ if ((createBranch || createPR) && !githubUrl && !projectPath) {
809
+ return res.status(400).json({ error: 'createBranch and createPR require either githubUrl or projectPath with a GitHub remote' });
810
+ }
811
+ let finalProjectPath = null;
812
+ let clonedProjectCreated = false;
813
+ let writer = null;
814
+ try {
815
+ // Determine the final project path
816
+ if (githubUrl) {
817
+ // Clone repository (to projectPath if provided, otherwise generate path)
818
+ const tokenToUse = githubToken || githubTokensDb.getActiveGithubToken(req.user.id);
819
+ let targetPath;
820
+ if (projectPath) {
821
+ targetPath = projectPath;
822
+ }
823
+ else {
824
+ // Generate a unique path for cloning
825
+ const repoHash = crypto.createHash('md5').update(githubUrl + Date.now()).digest('hex');
826
+ targetPath = path.join(os.homedir(), '.claude', 'external-projects', repoHash);
827
+ }
828
+ const clonedProject = await cloneGitHubRepo(githubUrl.trim(), tokenToUse, targetPath);
829
+ finalProjectPath = clonedProject.path;
830
+ clonedProjectCreated = clonedProject.created;
831
+ }
832
+ else {
833
+ // Use existing project path
834
+ finalProjectPath = normalizeProjectPath(path.resolve(projectPath));
835
+ // Verify the path exists
836
+ try {
837
+ await fs.access(finalProjectPath);
838
+ }
839
+ catch (error) {
840
+ throw new Error(`Project path does not exist: ${finalProjectPath}`);
841
+ }
842
+ }
843
+ finalProjectPath = normalizeProjectPath(finalProjectPath);
844
+ // Register project path in DB (or reuse existing active registration)
845
+ const registrationResult = projectsDb.createProjectPath(finalProjectPath, null);
846
+ if (registrationResult.outcome === 'active_conflict') {
847
+ console.log('Project registration already exists for:', finalProjectPath);
848
+ }
849
+ else {
850
+ console.log('Project registered:', registrationResult.project);
851
+ }
852
+ // Set up writer based on streaming mode
853
+ if (stream) {
854
+ // Set up SSE headers for streaming
855
+ res.setHeader('Content-Type', 'text/event-stream');
856
+ res.setHeader('Cache-Control', 'no-cache');
857
+ res.setHeader('Connection', 'keep-alive');
858
+ res.setHeader('X-Accel-Buffering', 'no'); // Disable nginx buffering
859
+ writer = new SSEStreamWriter(res, req.user.id);
860
+ // Send initial status
861
+ writer.send({
862
+ type: 'status',
863
+ message: githubUrl ? 'Repository cloned and session started' : 'Session started',
864
+ projectPath: finalProjectPath
865
+ });
866
+ }
867
+ else {
868
+ // Non-streaming mode: collect messages
869
+ writer = new ResponseCollector(req.user.id);
870
+ // Collect initial status message
871
+ writer.send({
872
+ type: 'status',
873
+ message: githubUrl ? 'Repository cloned and session started' : 'Session started',
874
+ projectPath: finalProjectPath
875
+ });
876
+ }
877
+ const codexModels = (await providerModelsService.getProviderModels('codex')).models;
878
+ const opencodeModels = (await providerModelsService.getProviderModels('opencode')).models;
879
+ // Start the appropriate session
880
+ if (provider === 'claude') {
881
+ console.log('🤖 Starting Claude SDK session');
882
+ await queryClaudeSDK(message.trim(), {
883
+ projectPath: finalProjectPath,
884
+ cwd: finalProjectPath,
885
+ sessionId: sessionId || null,
886
+ model: model,
887
+ effort,
888
+ permissionMode: 'bypassPermissions' // Bypass all permissions for API calls
889
+ }, writer);
890
+ }
891
+ else if (provider === 'cursor') {
892
+ console.log('đŸ–ąī¸ Starting Cursor CLI session');
893
+ await spawnCursor(message.trim(), {
894
+ projectPath: finalProjectPath,
895
+ cwd: finalProjectPath,
896
+ sessionId: sessionId || null,
897
+ model: model || undefined,
898
+ skipPermissions: true // Bypass permissions for Cursor
899
+ }, writer);
900
+ }
901
+ else if (provider === 'codex') {
902
+ console.log('🤖 Starting Codex SDK session');
903
+ await queryCodex(message.trim(), {
904
+ projectPath: finalProjectPath,
905
+ cwd: finalProjectPath,
906
+ sessionId: sessionId || null,
907
+ model: model || codexModels.DEFAULT,
908
+ effort,
909
+ permissionMode: 'bypassPermissions'
910
+ }, writer);
911
+ }
912
+ else if (provider === 'opencode') {
913
+ console.log('Starting OpenCode CLI session');
914
+ await spawnOpenCode(message.trim(), {
915
+ projectPath: finalProjectPath,
916
+ cwd: finalProjectPath,
917
+ sessionId: sessionId || null,
918
+ model: model || opencodeModels.DEFAULT,
919
+ effort,
920
+ permissionMode: 'bypassPermissions' // Agent runs are non-interactive, like the other providers above
921
+ }, writer);
922
+ }
923
+ // Handle GitHub branch and PR creation after successful agent completion
924
+ let branchInfo = null;
925
+ let prInfo = null;
926
+ if (createBranch || createPR) {
927
+ try {
928
+ console.log('🔄 Starting GitHub branch/PR creation workflow...');
929
+ // Get GitHub token
930
+ const tokenToUse = githubToken || githubTokensDb.getActiveGithubToken(req.user.id);
931
+ if (!tokenToUse) {
932
+ throw new Error('GitHub token required for branch/PR creation. Please configure a GitHub token in settings.');
933
+ }
934
+ // Initialize Octokit
935
+ const octokit = new Octokit({ auth: tokenToUse });
936
+ // Get GitHub URL - either from parameter or from git remote
937
+ let repoUrl = githubUrl;
938
+ if (!repoUrl) {
939
+ console.log('🔍 Getting GitHub URL from git remote...');
940
+ try {
941
+ repoUrl = await getGitRemoteUrl(finalProjectPath);
942
+ if (!repoUrl.includes('github.com')) {
943
+ throw new Error('Project does not have a GitHub remote configured');
944
+ }
945
+ console.log(`✅ Found GitHub remote: ${repoUrl}`);
946
+ }
947
+ catch (error) {
948
+ throw new Error(`Failed to get GitHub remote URL: ${error.message}`);
949
+ }
950
+ }
951
+ // Parse GitHub URL to get owner and repo
952
+ const { owner, repo } = parseGitHubUrl(repoUrl);
953
+ console.log(`đŸ“Ļ Repository: ${owner}/${repo}`);
954
+ // Use provided branch name or auto-generate from message
955
+ const finalBranchName = branchName || autogenerateBranchName(message);
956
+ if (branchName) {
957
+ console.log(`đŸŒŋ Using provided branch name: ${finalBranchName}`);
958
+ // Validate custom branch name
959
+ const validation = validateBranchName(finalBranchName);
960
+ if (!validation.valid) {
961
+ throw new Error(`Invalid branch name: ${validation.error}`);
962
+ }
963
+ }
964
+ else {
965
+ console.log(`đŸŒŋ Auto-generated branch name: ${finalBranchName}`);
966
+ }
967
+ if (createBranch) {
968
+ // Create and checkout the new branch locally
969
+ console.log('🔄 Creating local branch...');
970
+ const checkoutProcess = spawn('git', ['checkout', '-b', finalBranchName], {
971
+ cwd: finalProjectPath,
972
+ stdio: 'pipe'
973
+ });
974
+ await new Promise((resolve, reject) => {
975
+ let stderr = '';
976
+ checkoutProcess.stderr.on('data', (data) => { stderr += data.toString(); });
977
+ checkoutProcess.on('close', (code) => {
978
+ if (code === 0) {
979
+ console.log(`✅ Created and checked out local branch '${finalBranchName}'`);
980
+ resolve();
981
+ }
982
+ else {
983
+ // Branch might already exist locally, try to checkout
984
+ if (stderr.includes('already exists')) {
985
+ console.log(`â„šī¸ Branch '${finalBranchName}' already exists locally, checking out...`);
986
+ const checkoutExisting = spawn('git', ['checkout', finalBranchName], {
987
+ cwd: finalProjectPath,
988
+ stdio: 'pipe'
989
+ });
990
+ checkoutExisting.on('close', (checkoutCode) => {
991
+ if (checkoutCode === 0) {
992
+ console.log(`✅ Checked out existing branch '${finalBranchName}'`);
993
+ resolve();
994
+ }
995
+ else {
996
+ reject(new Error(`Failed to checkout existing branch: ${stderr}`));
997
+ }
998
+ });
999
+ }
1000
+ else {
1001
+ reject(new Error(`Failed to create branch: ${stderr}`));
1002
+ }
1003
+ }
1004
+ });
1005
+ });
1006
+ // Push the branch to remote
1007
+ console.log('🔄 Pushing branch to remote...');
1008
+ const pushProcess = spawn('git', ['push', '-u', 'origin', finalBranchName], {
1009
+ cwd: finalProjectPath,
1010
+ stdio: 'pipe'
1011
+ });
1012
+ await new Promise((resolve, reject) => {
1013
+ let stderr = '';
1014
+ let stdout = '';
1015
+ pushProcess.stdout.on('data', (data) => { stdout += data.toString(); });
1016
+ pushProcess.stderr.on('data', (data) => { stderr += data.toString(); });
1017
+ pushProcess.on('close', (code) => {
1018
+ if (code === 0) {
1019
+ console.log(`✅ Pushed branch '${finalBranchName}' to remote`);
1020
+ resolve();
1021
+ }
1022
+ else {
1023
+ // Check if branch exists on remote but has different commits
1024
+ if (stderr.includes('already exists') || stderr.includes('up-to-date')) {
1025
+ console.log(`â„šī¸ Branch '${finalBranchName}' already exists on remote, using existing branch`);
1026
+ resolve();
1027
+ }
1028
+ else {
1029
+ reject(new Error(`Failed to push branch: ${stderr}`));
1030
+ }
1031
+ }
1032
+ });
1033
+ });
1034
+ branchInfo = {
1035
+ name: finalBranchName,
1036
+ url: `https://github.com/${owner}/${repo}/tree/${finalBranchName}`
1037
+ };
1038
+ }
1039
+ if (createPR) {
1040
+ // Get commit messages to generate PR description
1041
+ console.log('🔄 Generating PR title and description...');
1042
+ const commitMessages = await getCommitMessages(finalProjectPath, 5);
1043
+ // Use the first commit message as the PR title, or fallback to the agent message
1044
+ const prTitle = commitMessages.length > 0 ? commitMessages[0] : message;
1045
+ // Generate PR body from commit messages
1046
+ let prBody = '## Changes\n\n';
1047
+ if (commitMessages.length > 0) {
1048
+ prBody += commitMessages.map(msg => `- ${msg}`).join('\n');
1049
+ }
1050
+ else {
1051
+ prBody += `Agent task: ${message}`;
1052
+ }
1053
+ prBody += '\n\n---\n*This pull request was automatically created by CloudCLI.ai Agent.*';
1054
+ console.log(`📝 PR Title: ${prTitle}`);
1055
+ // Create the pull request
1056
+ console.log('🔄 Creating pull request...');
1057
+ prInfo = await createGitHubPR(octokit, owner, repo, finalBranchName, prTitle, prBody, 'main');
1058
+ }
1059
+ // Send branch/PR info in response
1060
+ if (stream) {
1061
+ if (branchInfo) {
1062
+ writer.send({
1063
+ type: 'github-branch',
1064
+ branch: branchInfo
1065
+ });
1066
+ }
1067
+ if (prInfo) {
1068
+ writer.send({
1069
+ type: 'github-pr',
1070
+ pullRequest: prInfo
1071
+ });
1072
+ }
1073
+ }
1074
+ }
1075
+ catch (error) {
1076
+ console.error('❌ GitHub branch/PR creation error:', error);
1077
+ // Send error but don't fail the entire request
1078
+ if (stream) {
1079
+ writer.send({
1080
+ type: 'github-error',
1081
+ error: error.message
1082
+ });
1083
+ }
1084
+ // Store error info for non-streaming response
1085
+ if (!stream) {
1086
+ branchInfo = { error: error.message };
1087
+ prInfo = { error: error.message };
1088
+ }
1089
+ }
1090
+ }
1091
+ // Handle response based on streaming mode
1092
+ if (stream) {
1093
+ // Streaming mode: end the SSE stream
1094
+ writer.end();
1095
+ }
1096
+ else {
1097
+ // Non-streaming mode: send filtered messages and token summary as JSON
1098
+ const assistantMessages = writer.getAssistantMessages();
1099
+ const tokenSummary = writer.getTotalTokens();
1100
+ const response = {
1101
+ success: true,
1102
+ sessionId: writer.getSessionId(),
1103
+ messages: assistantMessages,
1104
+ tokens: tokenSummary,
1105
+ projectPath: finalProjectPath
1106
+ };
1107
+ // Add branch/PR info if created
1108
+ if (branchInfo) {
1109
+ response.branch = branchInfo;
1110
+ }
1111
+ if (prInfo) {
1112
+ response.pullRequest = prInfo;
1113
+ }
1114
+ res.json(response);
1115
+ }
1116
+ // Clean up if requested
1117
+ if (cleanup && githubUrl && clonedProjectCreated) {
1118
+ // Only cleanup if we cloned a repo (not for existing project paths)
1119
+ const sessionIdForCleanup = writer.getSessionId();
1120
+ setTimeout(() => {
1121
+ cleanupProject(finalProjectPath, sessionIdForCleanup);
1122
+ }, 5000);
1123
+ }
1124
+ }
1125
+ catch (error) {
1126
+ console.error('❌ External session error:', error);
1127
+ // Clean up on error
1128
+ if (finalProjectPath && cleanup && githubUrl && clonedProjectCreated) {
1129
+ const sessionIdForCleanup = writer ? writer.getSessionId() : null;
1130
+ cleanupProject(finalProjectPath, sessionIdForCleanup);
1131
+ }
1132
+ if (stream) {
1133
+ // For streaming, send error event and stop
1134
+ if (!writer) {
1135
+ // Set up SSE headers if not already done
1136
+ res.setHeader('Content-Type', 'text/event-stream');
1137
+ res.setHeader('Cache-Control', 'no-cache');
1138
+ res.setHeader('Connection', 'keep-alive');
1139
+ res.setHeader('X-Accel-Buffering', 'no');
1140
+ writer = new SSEStreamWriter(res, req.user.id);
1141
+ }
1142
+ if (!res.writableEnded) {
1143
+ writer.send({
1144
+ type: 'error',
1145
+ error: error.message,
1146
+ message: `Failed: ${error.message}`
1147
+ });
1148
+ writer.end();
1149
+ }
1150
+ }
1151
+ else if (!res.headersSent) {
1152
+ res.status(500).json({
1153
+ success: false,
1154
+ error: error.message
1155
+ });
1156
+ }
1157
+ }
1158
+ });
1159
+ return router;
1160
+ }
1161
+ //# sourceMappingURL=agent.routes.js.map