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
+ import { randomUUID } from 'node:crypto';
2
+ import fs from 'node:fs';
3
+ import {
4
+ access,
5
+ lstat,
6
+ mkdir,
7
+ readFile,
8
+ readdir,
9
+ readlink,
10
+ realpath,
11
+ stat,
12
+ writeFile,
13
+ } from 'node:fs/promises';
14
+ import os from 'node:os';
15
+ import path from 'node:path';
16
+ import readline from 'node:readline';
17
+ import { fileURLToPath } from 'node:url';
18
+
19
+ import type { NextFunction, Request, RequestHandler, Response } from 'express';
20
+
21
+ import { parseFrontMatter } from '@/shared/frontmatter.js';
22
+ import type {
23
+ AnyRecord,
24
+ ApiSuccessShape,
25
+ AppErrorOptions,
26
+ NormalizedMessage,
27
+ ProviderCurrentActiveModel,
28
+ ProviderModelsDefinition,
29
+ ProviderSkillSource,
30
+ WorkspacePathValidationResult,
31
+ } from '@/shared/types.js';
32
+
33
+ //----------------- ENVIRONMENT UTILITIES ------------
34
+ /**
35
+ * Indicates whether the backend is running in hosted Platform mode rather than
36
+ * self-hosted OSS mode. The server bootstrap, Agent, Auth, and Browser Use
37
+ * modules use this shared flag to keep environment-dependent behavior aligned.
38
+ * Environment variables must be loaded before this module is evaluated.
39
+ */
40
+ export const IS_PLATFORM = process.env.VITE_IS_PLATFORM === 'true';
41
+
42
+ // ---------------------------
43
+ //----------------- NORMALIZED MESSAGE HELPER INPUT TYPES ------------
44
+ /**
45
+ * Input payload accepted by `createNormalizedMessage`.
46
+ *
47
+ * Callers provide provider-specific fields plus the required `kind/provider`
48
+ * pair; this helper fills missing envelope fields (`id`, `sessionId`,
49
+ * `timestamp`) in a consistent way.
50
+ */
51
+ type NormalizedMessageInput =
52
+ {
53
+ kind: NormalizedMessage['kind'];
54
+ provider: NormalizedMessage['provider'];
55
+ id?: string | null;
56
+ sessionId?: string | null;
57
+ timestamp?: string | null;
58
+ } & Record<string, unknown>;
59
+
60
+ // ---------------------------
61
+ //----------------- HTTP HANDLER UTILITIES ------------
62
+ /**
63
+ * Wraps arbitrary data in the standard API success envelope.
64
+ *
65
+ * Use this helper in route handlers to keep successful JSON responses consistent
66
+ * across endpoints.
67
+ */
68
+ export function createApiSuccessResponse<TData>(
69
+ data: TData,
70
+ ): ApiSuccessShape<TData> {
71
+ return {
72
+ success: true,
73
+ data,
74
+ };
75
+ }
76
+
77
+ /**
78
+ * Converts an async Express handler into a standard `RequestHandler` and routes
79
+ * rejected promises to Express error middleware.
80
+ *
81
+ * Use this to avoid repeating `try/catch(next)` in every async route.
82
+ */
83
+ export function asyncHandler(
84
+ handler: (req: Request, res: Response, next: NextFunction) => Promise<unknown>
85
+ ): RequestHandler {
86
+ return (req, res, next) => {
87
+ void Promise.resolve(handler(req, res, next)).catch(next);
88
+ };
89
+ }
90
+
91
+ // ---------------------------
92
+ //----------------- SHARED ERROR UTILITIES ------------
93
+ /**
94
+ * Shared application error with HTTP status and machine-readable code metadata.
95
+ *
96
+ * Throw this from service/route layers when the caller should receive a
97
+ * controlled error response rather than a generic 500.
98
+ */
99
+ export class AppError extends Error {
100
+ readonly code: string;
101
+ readonly statusCode: number;
102
+ readonly details?: unknown;
103
+
104
+ constructor(message: string, options: AppErrorOptions = {}) {
105
+ super(message);
106
+ this.name = 'AppError';
107
+ this.code = options.code ?? 'INTERNAL_ERROR';
108
+ this.statusCode = options.statusCode ?? 500;
109
+ this.details = options.details;
110
+ }
111
+ }
112
+
113
+ // ---------------------------
114
+ //----------------- WORKSPACE PATH VALIDATION UTILITIES ------------
115
+ /**
116
+ * Root directory that all workspace/project paths must stay under.
117
+ *
118
+ * This is resolved from `WORKSPACES_ROOT` when configured; otherwise it falls
119
+ * back to the current user's home directory.
120
+ */
121
+ export const WORKSPACES_ROOT = process.env.WORKSPACES_ROOT || os.homedir();
122
+
123
+ /**
124
+ * System-critical paths that must never be used as workspace roots.
125
+ *
126
+ * The validation helper blocks these values directly and also blocks paths
127
+ * nested under them (with explicit allow-list exceptions where necessary).
128
+ */
129
+ export const FORBIDDEN_WORKSPACE_PATHS = [
130
+ // Unix
131
+ '/',
132
+ '/etc',
133
+ '/bin',
134
+ '/sbin',
135
+ '/usr',
136
+ '/dev',
137
+ '/proc',
138
+ '/sys',
139
+ '/var',
140
+ '/boot',
141
+ '/root',
142
+ '/lib',
143
+ '/lib64',
144
+ '/opt',
145
+ '/tmp',
146
+ '/run',
147
+ // Windows
148
+ 'C:\\Windows',
149
+ 'C:\\Program Files',
150
+ 'C:\\Program Files (x86)',
151
+ 'C:\\ProgramData',
152
+ 'C:\\System Volume Information',
153
+ 'C:\\$Recycle.Bin',
154
+ ];
155
+
156
+ function stripWindowsLongPathPrefix(inputPath: string): string {
157
+ if (inputPath.startsWith('\\\\?\\UNC\\')) {
158
+ return `\\\\${inputPath.slice('\\\\?\\UNC\\'.length)}`;
159
+ }
160
+
161
+ if (inputPath.startsWith('\\\\?\\')) {
162
+ return inputPath.slice('\\\\?\\'.length);
163
+ }
164
+
165
+ return inputPath;
166
+ }
167
+
168
+ function shouldUseWindowsPathNormalization(inputPath: string): boolean {
169
+ if (process.platform === 'win32') {
170
+ return true;
171
+ }
172
+
173
+ return inputPath.startsWith('\\\\') || /^[a-zA-Z]:([\\/]|$)/.test(inputPath);
174
+ }
175
+
176
+ /**
177
+ * Canonicalizes project/workspace paths for stable DB keys and comparisons.
178
+ *
179
+ * Normalization rules:
180
+ * - trim whitespace
181
+ * - strip Windows long-path prefixes (`\\?\` and `\\?\UNC\`)
182
+ * - normalize path separators and dot segments
183
+ * - trim trailing separators except for filesystem roots
184
+ */
185
+ export function normalizeProjectPath(inputPath: string): string {
186
+ if (typeof inputPath !== 'string') {
187
+ return '';
188
+ }
189
+
190
+ const trimmed = inputPath.trim();
191
+ if (!trimmed) {
192
+ return '';
193
+ }
194
+
195
+ const withoutLongPrefix = stripWindowsLongPathPrefix(trimmed);
196
+ const useWindowsPathRules = shouldUseWindowsPathNormalization(withoutLongPrefix);
197
+ const normalized = useWindowsPathRules
198
+ ? path.win32.normalize(withoutLongPrefix)
199
+ : path.posix.normalize(withoutLongPrefix);
200
+
201
+ if (!normalized) {
202
+ return '';
203
+ }
204
+
205
+ const parser = useWindowsPathRules ? path.win32 : path.posix;
206
+ const root = parser.parse(normalized).root;
207
+ if (normalized === root) {
208
+ return normalized;
209
+ }
210
+
211
+ return normalized.replace(/[\\/]+$/, '');
212
+ }
213
+
214
+ /**
215
+ * Validates that a user-supplied workspace path is safe to use.
216
+ *
217
+ * Call this before any filesystem mutation that creates or registers projects.
218
+ * The function resolves symlinks, enforces `WORKSPACES_ROOT` containment, and
219
+ * blocks known system directories.
220
+ */
221
+ export async function validateWorkspacePath(requestedPath: string): Promise<WorkspacePathValidationResult> {
222
+ try {
223
+ const normalizedRequestedPath = normalizeProjectPath(requestedPath);
224
+ if (!normalizedRequestedPath) {
225
+ return {
226
+ valid: false,
227
+ error: 'Workspace path is required',
228
+ };
229
+ }
230
+
231
+ const absolutePath = path.resolve(normalizedRequestedPath);
232
+ const normalizedPath = normalizeProjectPath(absolutePath);
233
+
234
+ if (FORBIDDEN_WORKSPACE_PATHS.includes(normalizedPath) || normalizedPath === '/') {
235
+ return {
236
+ valid: false,
237
+ error: 'Cannot use system-critical directories as workspace locations',
238
+ };
239
+ }
240
+
241
+ for (const forbiddenPath of FORBIDDEN_WORKSPACE_PATHS) {
242
+ const normalizedForbiddenPath = normalizeProjectPath(forbiddenPath);
243
+ if (
244
+ normalizedPath === normalizedForbiddenPath
245
+ || normalizedPath.startsWith(`${normalizedForbiddenPath}${path.sep}`)
246
+ ) {
247
+ // Allow specific user-writable folders under /var.
248
+ if (
249
+ normalizedForbiddenPath === '/var'
250
+ && (normalizedPath.startsWith('/var/tmp') || normalizedPath.startsWith('/var/folders'))
251
+ ) {
252
+ continue;
253
+ }
254
+
255
+ return {
256
+ valid: false,
257
+ error: `Cannot create workspace in system directory: ${forbiddenPath}`,
258
+ };
259
+ }
260
+ }
261
+
262
+ let resolvedPath = normalizeProjectPath(absolutePath);
263
+ try {
264
+ await access(absolutePath);
265
+ resolvedPath = normalizeProjectPath(await realpath(absolutePath));
266
+ } catch (error) {
267
+ const fileError = error as NodeJS.ErrnoException;
268
+ if (fileError.code !== 'ENOENT') {
269
+ throw fileError;
270
+ }
271
+
272
+ const parentPath = path.dirname(absolutePath);
273
+ try {
274
+ const parentRealPath = await realpath(parentPath);
275
+ resolvedPath = normalizeProjectPath(path.join(parentRealPath, path.basename(absolutePath)));
276
+ } catch (parentError) {
277
+ const parentFileError = parentError as NodeJS.ErrnoException;
278
+ if (parentFileError.code !== 'ENOENT') {
279
+ throw parentFileError;
280
+ }
281
+ }
282
+ }
283
+
284
+ const resolvedWorkspaceRoot = normalizeProjectPath(await realpath(WORKSPACES_ROOT));
285
+ if (
286
+ !resolvedPath.startsWith(`${resolvedWorkspaceRoot}${path.sep}`)
287
+ && resolvedPath !== resolvedWorkspaceRoot
288
+ ) {
289
+ return {
290
+ valid: false,
291
+ error: `Workspace path must be within the allowed workspace root: ${WORKSPACES_ROOT}`,
292
+ };
293
+ }
294
+
295
+ try {
296
+ await access(absolutePath);
297
+ const pathStats = await lstat(absolutePath);
298
+ if (pathStats.isSymbolicLink()) {
299
+ const symlinkTarget = await readlink(absolutePath);
300
+ const resolvedSymlinkPath = path.resolve(path.dirname(absolutePath), symlinkTarget);
301
+ const realSymlinkPath = await realpath(resolvedSymlinkPath);
302
+ if (
303
+ !realSymlinkPath.startsWith(`${resolvedWorkspaceRoot}${path.sep}`)
304
+ && realSymlinkPath !== resolvedWorkspaceRoot
305
+ ) {
306
+ return {
307
+ valid: false,
308
+ error: 'Symlink target is outside the allowed workspace root',
309
+ };
310
+ }
311
+ }
312
+ } catch (error) {
313
+ const fileError = error as NodeJS.ErrnoException;
314
+ if (fileError.code !== 'ENOENT') {
315
+ throw fileError;
316
+ }
317
+ }
318
+
319
+ return {
320
+ valid: true,
321
+ resolvedPath,
322
+ };
323
+ } catch (error) {
324
+ return {
325
+ valid: false,
326
+ error: `Path validation failed: ${(error as Error).message}`,
327
+ };
328
+ }
329
+ }
330
+
331
+ // ---------------------------
332
+ //----------------- NORMALIZED PROVIDER MESSAGE UTILITIES ------------
333
+ /**
334
+ * Generates a stable unique id for normalized provider messages.
335
+ */
336
+ export function generateMessageId(prefix = 'msg'): string {
337
+ return `${prefix}_${randomUUID()}`;
338
+ }
339
+
340
+ /**
341
+ * Creates a normalized provider message and fills the shared envelope fields.
342
+ *
343
+ * Provider adapters and live SDK handlers pass through provider-specific fields,
344
+ * while this helper guarantees every emitted event has an id, session id,
345
+ * timestamp, and provider marker.
346
+ */
347
+ export function createNormalizedMessage(fields: NormalizedMessageInput): NormalizedMessage {
348
+ return {
349
+ ...fields,
350
+ id: fields.id || generateMessageId(fields.kind),
351
+ sessionId: fields.sessionId || '',
352
+ timestamp: fields.timestamp || new Date().toISOString(),
353
+ provider: fields.provider,
354
+ };
355
+ }
356
+
357
+ /**
358
+ * Build the unified terminal `complete` lifecycle message.
359
+ *
360
+ * Contract: every provider run ends with exactly one `complete` (the
361
+ * abort-session handler emits it on behalf of cancelled runs, so aborted runs
362
+ * must NOT emit their own). The frontend treats `complete` as the only
363
+ * terminal signal and never needs provider-specific handling:
364
+ *
365
+ * - `sessionId` — the id the client knows this run by ('' if never discovered)
366
+ * - `actualSessionId` — canonical id after the run; equals `sessionId` unless
367
+ * the provider rewrote it mid-run
368
+ * - `exitCode` — 0 on success; a missing/null code (e.g. killed process)
369
+ * is reported as failure
370
+ * - `success` — exitCode === 0 and not aborted
371
+ * - `aborted` — run was cancelled by the user
372
+ */
373
+ export function createCompleteMessage(opts: {
374
+ provider: NormalizedMessage['provider'];
375
+ sessionId?: string | null;
376
+ actualSessionId?: string | null;
377
+ exitCode?: number | null;
378
+ aborted?: boolean;
379
+ }): NormalizedMessage {
380
+ const exitCode = typeof opts.exitCode === 'number' ? opts.exitCode : 1;
381
+ const aborted = Boolean(opts.aborted);
382
+
383
+ return createNormalizedMessage({
384
+ kind: 'complete',
385
+ provider: opts.provider,
386
+ sessionId: opts.sessionId || null,
387
+ actualSessionId: opts.actualSessionId || opts.sessionId || null,
388
+ exitCode,
389
+ success: exitCode === 0 && !aborted,
390
+ aborted,
391
+ });
392
+ }
393
+
394
+ // ---------------------------
395
+ //----------------- CONVERSATION HISTORY PAGINATION UTILITIES ------------
396
+ /**
397
+ * Slices one page from the END of a chronologically ordered message list.
398
+ *
399
+ * This is the single pagination contract for conversation history across all
400
+ * providers: `offset = 0` returns the most recent `limit` items, increasing
401
+ * offsets walk backwards in time (for "scroll up to load older" UIs), and a
402
+ * `null` limit returns everything. Items must already be sorted oldest-first;
403
+ * the returned page preserves that order.
404
+ *
405
+ * Every provider history reader must use this helper instead of slicing
406
+ * manually so `offset`/`limit` query params behave identically regardless of
407
+ * which provider produced the session.
408
+ */
409
+ export function sliceTailPage<T>(
410
+ items: T[],
411
+ limit: number | null,
412
+ offset: number,
413
+ ): { page: T[]; hasMore: boolean } {
414
+ const total = items.length;
415
+ const normalizedOffset = Math.max(0, offset);
416
+
417
+ if (limit === null) {
418
+ // A null limit returns the full list; offset still trims newest entries
419
+ // so "everything before the page I already have" stays expressible.
420
+ const end = Math.max(0, total - normalizedOffset);
421
+ return {
422
+ page: items.slice(0, end),
423
+ hasMore: false,
424
+ };
425
+ }
426
+
427
+ const end = Math.max(0, total - normalizedOffset);
428
+ const start = Math.max(0, end - Math.max(0, limit));
429
+ return {
430
+ page: items.slice(start, end),
431
+ hasMore: start > 0,
432
+ };
433
+ }
434
+
435
+ // ---------------------------
436
+ //----------------- MCP CONFIG PARSING UTILITIES ------------
437
+ /**
438
+ * Safely narrows an unknown value to a plain object record.
439
+ *
440
+ * This deliberately rejects arrays, `null`, and primitive values so callers can
441
+ * treat the returned value as a JSON-style object map without repeating the same
442
+ * defensive shape checks at every config read site.
443
+ */
444
+ export const readObjectRecord = (value: any): AnyRecord | null => {
445
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
446
+ return null;
447
+ }
448
+
449
+ return value as AnyRecord;
450
+ };
451
+
452
+ /**
453
+ * Reads an optional string from unknown input and normalizes empty or whitespace-only
454
+ * values to `undefined`.
455
+ *
456
+ * This is useful when parsing config files where a field may be missing, present
457
+ * with the wrong type, or present as an empty string that should be treated as
458
+ * "not configured".
459
+ */
460
+ export const readOptionalString = (value: unknown): string | undefined => {
461
+ if (typeof value !== 'string') {
462
+ return undefined;
463
+ }
464
+
465
+ const normalized = value.trim();
466
+ return normalized.length > 0 ? normalized : undefined;
467
+ };
468
+
469
+ /**
470
+ * Reads an optional string array from unknown input.
471
+ *
472
+ * Non-array values are ignored, and any array entries that are not strings are
473
+ * filtered out. This lets provider config readers consume loosely shaped JSON/TOML
474
+ * data without failing on incidental invalid members.
475
+ */
476
+ export const readStringArray = (value: unknown): string[] | undefined => {
477
+ if (!Array.isArray(value)) {
478
+ return undefined;
479
+ }
480
+
481
+ return value.filter((entry): entry is string => typeof entry === 'string');
482
+ };
483
+
484
+ /**
485
+ * Reads an optional string-to-string map from unknown input.
486
+ *
487
+ * The function first ensures the source value is a plain object, then keeps only
488
+ * keys whose values are strings. If no valid entries remain, it returns `undefined`
489
+ * so callers can distinguish "no usable map" from an empty object that was
490
+ * intentionally authored downstream.
491
+ */
492
+ export const readStringRecord = (value: unknown): Record<string, string> | undefined => {
493
+ const record = readObjectRecord(value);
494
+ if (!record) {
495
+ return undefined;
496
+ }
497
+
498
+ const normalized: Record<string, string> = {};
499
+ for (const [key, entry] of Object.entries(record)) {
500
+ if (typeof entry === 'string') {
501
+ normalized[key] = entry;
502
+ }
503
+ }
504
+
505
+ return Object.keys(normalized).length > 0 ? normalized : undefined;
506
+ };
507
+
508
+ // ---------------------------
509
+ //----------------- PROVIDER MODEL LOOKUP UTILITIES ------------
510
+ /**
511
+ * Builds the standard "default current model" result used when a provider
512
+ * cannot resolve a session-backed active model.
513
+ *
514
+ * Provider model adapters should call this after loading their supported model
515
+ * catalog so the fallback stays aligned with the provider's current `DEFAULT`
516
+ * selection instead of drifting to a hard-coded duplicate.
517
+ */
518
+ export function buildDefaultProviderCurrentActiveModel(
519
+ models: ProviderModelsDefinition,
520
+ ): ProviderCurrentActiveModel {
521
+ return {
522
+ model: models.DEFAULT,
523
+ };
524
+ }
525
+
526
+ // ---------------------------
527
+ //----------------- WEBSOCKET PAYLOAD PARSING UTILITIES ------------
528
+ /**
529
+ * Parses one websocket message payload into a plain JSON object record.
530
+ *
531
+ * Use this in realtime handlers that receive raw websocket payloads as `string`,
532
+ * `Buffer`, `ArrayBuffer`, or chunk arrays. The helper converts supported
533
+ * payload formats to UTF-8 text, parses JSON, and returns only object payloads.
534
+ * Primitive/array/invalid payloads return `null` so callers can handle bad input
535
+ * without throwing from deeply nested message handlers.
536
+ */
537
+ export const parseIncomingJsonObject = (payload: unknown): AnyRecord | null => {
538
+ let text: string | null = null;
539
+
540
+ if (typeof payload === 'string') {
541
+ text = payload;
542
+ } else if (Buffer.isBuffer(payload)) {
543
+ text = payload.toString('utf8');
544
+ } else if (payload instanceof ArrayBuffer) {
545
+ text = Buffer.from(payload).toString('utf8');
546
+ } else if (Array.isArray(payload)) {
547
+ const buffers = payload
548
+ .map((entry) => {
549
+ if (Buffer.isBuffer(entry)) {
550
+ return entry;
551
+ }
552
+
553
+ if (entry instanceof ArrayBuffer) {
554
+ return Buffer.from(entry);
555
+ }
556
+
557
+ if (ArrayBuffer.isView(entry)) {
558
+ return Buffer.from(entry.buffer, entry.byteOffset, entry.byteLength);
559
+ }
560
+
561
+ return null;
562
+ })
563
+ .filter((entry): entry is Buffer => entry !== null);
564
+
565
+ if (buffers.length > 0) {
566
+ text = Buffer.concat(buffers).toString('utf8');
567
+ }
568
+ }
569
+
570
+ if (typeof text !== 'string' || text.trim().length === 0) {
571
+ return null;
572
+ }
573
+
574
+ try {
575
+ const parsed = JSON.parse(text) as unknown;
576
+ return readObjectRecord(parsed);
577
+ } catch {
578
+ return null;
579
+ }
580
+ };
581
+
582
+ /**
583
+ * Reads a JSON config file and guarantees a plain object result.
584
+ *
585
+ * Missing files are treated as an empty config object so provider-specific MCP
586
+ * readers can operate against first-run environments without special-case file
587
+ * existence checks. If the file exists but contains invalid JSON, the parse error
588
+ * is preserved and rethrown.
589
+ */
590
+ export const readJsonConfig = async (filePath: string): Promise<Record<string, unknown>> => {
591
+ try {
592
+ const content = await readFile(filePath, 'utf8');
593
+ const parsed = JSON.parse(content) as Record<string, unknown>;
594
+ return readObjectRecord(parsed) ?? {};
595
+ } catch (error) {
596
+ const code = (error as NodeJS.ErrnoException).code;
597
+ if (code === 'ENOENT') {
598
+ return {};
599
+ }
600
+
601
+ throw error;
602
+ }
603
+ };
604
+
605
+ /**
606
+ * Writes a JSON config file with stable, human-readable formatting.
607
+ *
608
+ * The parent directory is created automatically so callers can persist config into
609
+ * provider-specific folders without pre-creating the directory tree. Output always
610
+ * ends with a trailing newline to keep the file diff-friendly.
611
+ */
612
+ export const writeJsonConfig = async (filePath: string, data: Record<string, unknown>): Promise<void> => {
613
+ await mkdir(path.dirname(filePath), { recursive: true });
614
+ await writeFile(filePath, `${JSON.stringify(data, null, 2)}\n`, 'utf8');
615
+ };
616
+
617
+ // ---------------------------
618
+ //----------------- PROVIDER SKILL FILE UTILITIES ------------
619
+ async function hasGitMarker(dirPath: string): Promise<boolean> {
620
+ try {
621
+ const gitMarkerStats = await stat(path.join(dirPath, '.git'));
622
+ return gitMarkerStats.isDirectory() || gitMarkerStats.isFile();
623
+ } catch {
624
+ return false;
625
+ }
626
+ }
627
+
628
+ /**
629
+ * Finds the highest git worktree root visible from a starting directory.
630
+ *
631
+ * Provider skill systems such as Codex and OpenCode walk upward through parent
632
+ * folders when resolving repository/project skills. Use this helper when a
633
+ * provider needs the topmost `.git` marker instead of only the nearest one, so
634
+ * monorepos and nested package folders discover shared root-level skills once.
635
+ */
636
+ export async function findTopmostGitRoot(startPath: string): Promise<string | null> {
637
+ let currentPath = path.resolve(startPath);
638
+ let topmostGitRoot: string | null = null;
639
+
640
+ while (true) {
641
+ if (await hasGitMarker(currentPath)) {
642
+ topmostGitRoot = currentPath;
643
+ }
644
+
645
+ const parentPath = path.dirname(currentPath);
646
+ if (parentPath === currentPath) {
647
+ break;
648
+ }
649
+
650
+ currentPath = parentPath;
651
+ }
652
+
653
+ return topmostGitRoot;
654
+ }
655
+
656
+ /**
657
+ * Adds one provider skill source after normalizing and de-duplicating its root.
658
+ *
659
+ * Provider skill lookup rules often point at overlapping folders (for example a
660
+ * workspace folder can also be the git root). Use this helper while building a
661
+ * provider's `ProviderSkillSource[]` so the shared skills scanner reads each
662
+ * physical root once and still preserves provider-specific scope/command data.
663
+ */
664
+ export function addUniqueProviderSkillSource(
665
+ sources: ProviderSkillSource[],
666
+ seenRootDirs: Set<string>,
667
+ source: ProviderSkillSource,
668
+ ): void {
669
+ const normalizedRootDir = path.resolve(source.rootDir);
670
+ if (seenRootDirs.has(normalizedRootDir)) {
671
+ return;
672
+ }
673
+
674
+ seenRootDirs.add(normalizedRootDir);
675
+ sources.push({ ...source, rootDir: normalizedRootDir });
676
+ }
677
+
678
+ // ---------------------------
679
+ //----------------- PROVIDER SKILL MARKDOWN UTILITIES ------------
680
+ /**
681
+ * Finds direct child skill markdown files under a provider skill root.
682
+ *
683
+ * Skill systems usually store one skill per child directory, so direct mode
684
+ * scans only `<root>/<skill-name>/SKILL.md`. Recursive mode is reserved for
685
+ * provider sources that can nest skills arbitrarily, and it returns every
686
+ * descendant `SKILL.md`. Missing or unreadable roots return an empty list
687
+ * because users may not have every provider installed or configured.
688
+ */
689
+ export async function findProviderSkillMarkdownFiles(
690
+ rootDir: string,
691
+ options: { recursive?: boolean } = {},
692
+ ): Promise<string[]> {
693
+ const skillFiles: string[] = [];
694
+
695
+ const collectRecursive = async (dirPath: string): Promise<void> => {
696
+ let entries;
697
+ try {
698
+ entries = await readdir(dirPath, { withFileTypes: true });
699
+ } catch {
700
+ return;
701
+ }
702
+
703
+ try {
704
+ const skillPath = path.join(dirPath, 'SKILL.md');
705
+ const skillStats = await stat(skillPath);
706
+ if (skillStats.isFile()) {
707
+ skillFiles.push(skillPath);
708
+ }
709
+ } catch {
710
+ // Directories without SKILL.md are expected while walking plugin trees.
711
+ }
712
+
713
+ for (const entry of entries) {
714
+ if (entry.isDirectory() || entry.isSymbolicLink()) {
715
+ await collectRecursive(path.join(dirPath, entry.name));
716
+ }
717
+ }
718
+ };
719
+
720
+ if (options.recursive) {
721
+ await collectRecursive(rootDir);
722
+ return skillFiles.sort((left, right) => left.localeCompare(right));
723
+ }
724
+
725
+ try {
726
+ const entries = await readdir(rootDir, { withFileTypes: true });
727
+
728
+ for (const entry of entries) {
729
+ if (!entry.isDirectory() && !entry.isSymbolicLink()) {
730
+ continue;
731
+ }
732
+
733
+ const skillPath = path.join(rootDir, entry.name, 'SKILL.md');
734
+ try {
735
+ const skillStats = await stat(skillPath);
736
+ if (skillStats.isFile()) {
737
+ skillFiles.push(skillPath);
738
+ }
739
+ } catch {
740
+ // A partial skill directory should not block discovery of sibling skills.
741
+ }
742
+ }
743
+
744
+ return skillFiles.sort((left, right) => left.localeCompare(right));
745
+ } catch {
746
+ return [];
747
+ }
748
+ }
749
+
750
+ /**
751
+ * Reads the `name` and `description` fields from a provider skill markdown file.
752
+ *
753
+ * The metadata is expected in markdown front matter. If a skill omits `name`, the
754
+ * parent directory name is used as a stable fallback so providers can still
755
+ * expose the skill. Missing descriptions are normalized to an empty string.
756
+ */
757
+ export async function readProviderSkillMarkdownDefinition(
758
+ skillPath: string,
759
+ ): Promise<{ name: string; description: string }> {
760
+ const content = await readFile(skillPath, 'utf8');
761
+ return readProviderSkillMarkdownDefinitionFromContent(
762
+ content,
763
+ path.basename(path.dirname(skillPath)),
764
+ );
765
+ }
766
+
767
+ /**
768
+ * Reads the `name` and `description` fields from raw skill markdown content.
769
+ *
770
+ * This keeps filesystem discovery and newly uploaded skill creation aligned on
771
+ * the same front matter parsing rules. `fallbackName` is used when the markdown
772
+ * omits a `name` field so callers still get a stable, non-empty skill id.
773
+ */
774
+ export function readProviderSkillMarkdownDefinitionFromContent(
775
+ content: string,
776
+ fallbackName: string,
777
+ ): { name: string; description: string } {
778
+ const parsed = parseFrontMatter(content);
779
+ const data = readObjectRecord(parsed.data) ?? {};
780
+
781
+ return {
782
+ name: readOptionalString(data.name) ?? fallbackName,
783
+ description: readOptionalString(data.description) ?? '',
784
+ };
785
+ }
786
+
787
+ // ---------------------------
788
+ //----------------- SESSION SYNCHRONIZER TITLE HELPERS ------------
789
+ /**
790
+ * Produces a compact session title suitable for UI rendering and DB storage.
791
+ *
792
+ * Use this when converting provider-native names into a consistent title value.
793
+ * The helper collapses repeated whitespace, trims the result, and truncates it
794
+ * to 120 characters so every provider writes stable and bounded metadata.
795
+ * If the normalized input is empty, it returns the supplied fallback title.
796
+ */
797
+ export function normalizeSessionName(rawValue: string | undefined, fallback: string): string {
798
+ const normalized = (rawValue ?? '').replace(/\s+/g, ' ').trim();
799
+ if (!normalized) {
800
+ return fallback;
801
+ }
802
+
803
+ return normalized.slice(0, 120);
804
+ }
805
+
806
+ // ---------------------------
807
+ //----------------- PROVIDER SESSION VALUE NORMALIZATION UTILITIES ------------
808
+ /**
809
+ * Converts provider-native timestamps into ISO strings.
810
+ *
811
+ * Provider CLIs commonly persist epoch timestamps as milliseconds, seconds, or
812
+ * already-formatted date strings. Use this helper when normalizing session
813
+ * metadata or transcript events so every provider writes the same ISO timestamp
814
+ * shape to API responses and database rows.
815
+ */
816
+ export function normalizeProviderTimestamp(value: unknown): string {
817
+ if (typeof value === 'number' && Number.isFinite(value) && value > 0) {
818
+ const millis = value < 1_000_000_000_000 ? value * 1000 : value;
819
+ return new Date(millis).toISOString();
820
+ }
821
+
822
+ if (typeof value === 'string' && value.trim()) {
823
+ const parsed = Number(value);
824
+ if (Number.isFinite(parsed)) {
825
+ return normalizeProviderTimestamp(parsed);
826
+ }
827
+
828
+ const date = new Date(value);
829
+ if (!Number.isNaN(date.getTime())) {
830
+ return date.toISOString();
831
+ }
832
+ }
833
+
834
+ return new Date().toISOString();
835
+ }
836
+
837
+ /**
838
+ * Parses a JSON string or narrows an existing object into a plain record.
839
+ *
840
+ * Use this when provider databases store structured JSON inside text columns.
841
+ * Invalid JSON, arrays, and primitive values return `null` so callers can skip
842
+ * malformed optional metadata without hiding the rest of a session transcript.
843
+ */
844
+ export function readJsonRecord(value: unknown): AnyRecord | null {
845
+ if (typeof value !== 'string') {
846
+ return readObjectRecord(value);
847
+ }
848
+
849
+ try {
850
+ return readObjectRecord(JSON.parse(value));
851
+ } catch {
852
+ return null;
853
+ }
854
+ }
855
+
856
+ // ---------------------------
857
+ //----------------- OPENCODE SESSION STORAGE UTILITIES ------------
858
+ /**
859
+ * Resolves the OpenCode SQLite session database path.
860
+ *
861
+ * OpenCode stores session, message, part, and project metadata in one shared
862
+ * `opencode.db` file under its XDG data directory. Provider readers and
863
+ * synchronizers should use this path for read-only access and should never store
864
+ * it as a deletable transcript path for an individual app session row.
865
+ */
866
+ export function getOpenCodeDatabasePath(): string {
867
+ return path.join(os.homedir(), '.local', 'share', 'opencode', 'opencode.db');
868
+ }
869
+
870
+ /**
871
+ * Decodes an OpenCode text payload that was persisted as a JSON string literal.
872
+ *
873
+ * OpenCode can store the first user prompt (and other text parts) as `"hello"`
874
+ * instead of `hello`. Used by both the OpenCode session reader (transcript
875
+ * history) and the OpenCode synchronizer (session titling) so a session name or
876
+ * message body never surfaces with surrounding quote characters. Only fully
877
+ * quoted, valid JSON string literals are unwrapped; ordinary prose that merely
878
+ * happens to start/end with a quote is returned untouched.
879
+ */
880
+ export function unwrapJsonStringLiteral(value: string): string {
881
+ const trimmed = value.trim();
882
+ if (!trimmed.startsWith('"') || !trimmed.endsWith('"')) {
883
+ return value;
884
+ }
885
+
886
+ try {
887
+ const parsed = JSON.parse(trimmed);
888
+ return typeof parsed === 'string' ? parsed : value;
889
+ } catch {
890
+ return value;
891
+ }
892
+ }
893
+
894
+ // ---------------------------
895
+ //----------------- SAFE DIRECTORY NAME UTILITIES ------------
896
+ /**
897
+ * Validates that a user or provider supplied identifier can safely be treated
898
+ * as one leaf directory name under an existing root folder.
899
+ *
900
+ * Use this before composing paths like `<root>/<session-id>/file.db>` to block
901
+ * path traversal and accidental nested paths. The returned string is trimmed but
902
+ * otherwise unchanged so callers can still match the provider's on-disk naming.
903
+ */
904
+ export function sanitizeLeafDirectoryName(inputName: string, label = 'directory name'): string {
905
+ const normalized = inputName.trim();
906
+ if (!normalized) {
907
+ throw new Error(`${label} is required.`);
908
+ }
909
+
910
+ if (
911
+ normalized.includes('..')
912
+ || normalized.includes(path.posix.sep)
913
+ || normalized.includes(path.win32.sep)
914
+ || normalized !== path.basename(normalized)
915
+ ) {
916
+ throw new Error(`Invalid ${label} "${inputName}".`);
917
+ }
918
+
919
+ return normalized;
920
+ }
921
+
922
+ // ---------------------------
923
+ //----------------- SESSION SYNCHRONIZER FILESYSTEM HELPERS ------------
924
+ /**
925
+ * Recursively discovers files that match one extension, with optional incremental filtering.
926
+ *
927
+ * Provider synchronizers call this to find transcript artifacts under provider
928
+ * home directories. Pass `lastScanAt` to include only files created after the
929
+ * previous scan, or pass `null` to perform a full rescan. Missing directories
930
+ * are treated as empty because not every provider exists on every machine.
931
+ */
932
+ export async function findFilesRecursivelyCreatedAfter(
933
+ rootDir: string,
934
+ extension: string,
935
+ lastScanAt: Date | null,
936
+ fileList: string[] = []
937
+ ): Promise<string[]> {
938
+ try {
939
+ const entries = await readdir(rootDir, { withFileTypes: true });
940
+ for (const entry of entries) {
941
+ const fullPath = path.join(rootDir, entry.name);
942
+
943
+ if (entry.isDirectory()) {
944
+ await findFilesRecursivelyCreatedAfter(fullPath, extension, lastScanAt, fileList);
945
+ continue;
946
+ }
947
+
948
+ if (!entry.isFile() || !entry.name.endsWith(extension)) {
949
+ continue;
950
+ }
951
+
952
+ if (!lastScanAt) {
953
+ fileList.push(fullPath);
954
+ continue;
955
+ }
956
+
957
+ const fileStat = await stat(fullPath);
958
+ if (fileStat.birthtime > lastScanAt) {
959
+ fileList.push(fullPath);
960
+ }
961
+ }
962
+ } catch {
963
+ // Missing provider folders are expected in first-run or partial setups.
964
+ }
965
+
966
+ return fileList;
967
+ }
968
+
969
+ /**
970
+ * Reads file creation/update timestamps and maps them to DB-friendly ISO strings.
971
+ *
972
+ * Session indexers use this to persist `created_at` and `updated_at` metadata
973
+ * when upserting sessions. If the file cannot be read, an empty object is
974
+ * returned so indexing can continue for other files.
975
+ */
976
+ export async function readFileTimestamps(
977
+ filePath: string
978
+ ): Promise<{ createdAt?: string; updatedAt?: string }> {
979
+ try {
980
+ const fileStat = await stat(filePath);
981
+ return {
982
+ createdAt: fileStat.birthtime.toISOString(),
983
+ updatedAt: fileStat.mtime.toISOString(),
984
+ };
985
+ } catch {
986
+ return {};
987
+ }
988
+ }
989
+
990
+ // ---------------------------
991
+ //----------------- SESSION SYNCHRONIZER JSONL PARSING HELPERS ------------
992
+ /**
993
+ * Builds a first-seen key/value lookup map from a JSONL file.
994
+ *
995
+ * Use this for provider index files where session id -> display name metadata
996
+ * is stored line-by-line. The first value for each key wins, preserving the
997
+ * earliest known label while avoiding repeated map overwrites.
998
+ */
999
+ export async function buildLookupMap(
1000
+ filePath: string,
1001
+ keyField: string,
1002
+ valueField: string
1003
+ ): Promise<Map<string, string>> {
1004
+ const lookup = new Map<string, string>();
1005
+
1006
+ try {
1007
+ const fileStream = fs.createReadStream(filePath);
1008
+ const lineReader = readline.createInterface({ input: fileStream, crlfDelay: Infinity });
1009
+
1010
+ for await (const line of lineReader) {
1011
+ const trimmed = line.trim();
1012
+ if (!trimmed) {
1013
+ continue;
1014
+ }
1015
+
1016
+ const parsed = JSON.parse(trimmed) as Record<string, unknown>;
1017
+ const key = parsed[keyField];
1018
+ const value = parsed[valueField];
1019
+
1020
+ if (typeof key === 'string' && typeof value === 'string' && !lookup.has(key)) {
1021
+ lookup.set(key, value);
1022
+ }
1023
+ }
1024
+ } catch {
1025
+ // Missing or unreadable lookup files should not block session sync.
1026
+ }
1027
+
1028
+ return lookup;
1029
+ }
1030
+
1031
+ /**
1032
+ * Reads a JSONL file and returns the first extracted payload that matches caller criteria.
1033
+ *
1034
+ * The caller supplies an `extractor` that validates provider-specific row
1035
+ * shapes. This helper centralizes line-by-line parsing and lets indexers stop
1036
+ * scanning as soon as one valid row is found.
1037
+ */
1038
+ export async function extractFirstValidJsonlData<T>(
1039
+ filePath: string,
1040
+ extractor: (parsedJson: unknown) => T | null | undefined
1041
+ ): Promise<T | null> {
1042
+ try {
1043
+ const fileStream = fs.createReadStream(filePath);
1044
+ const lineReader = readline.createInterface({ input: fileStream, crlfDelay: Infinity });
1045
+
1046
+ for await (const line of lineReader) {
1047
+ const trimmed = line.trim();
1048
+ if (!trimmed) {
1049
+ continue;
1050
+ }
1051
+
1052
+ const parsed = JSON.parse(trimmed);
1053
+ const extracted = extractor(parsed);
1054
+ if (extracted) {
1055
+ lineReader.close();
1056
+ fileStream.close();
1057
+ return extracted;
1058
+ }
1059
+ }
1060
+ } catch {
1061
+ // Ignore malformed or missing artifacts so full scans keep progressing.
1062
+ }
1063
+
1064
+ return null;
1065
+ }
1066
+
1067
+ // ---------------------------
1068
+ //----------------- CLI PROMPT ARGUMENT UTILITIES ------------
1069
+ /**
1070
+ * Makes a prompt safe to pass as one CLI argument to `.cmd`-shimmed tools on
1071
+ * Windows (cursor-agent and opencode installed via npm-style shims).
1072
+ *
1073
+ * cmd.exe cannot carry newlines inside an argument: everything after the
1074
+ * first newline is silently dropped before the target CLI ever sees it, which
1075
+ * truncates multi-line prompts and any appended `<images_input>` block.
1076
+ * Collapsing newline runs to single spaces loses formatting but never loses
1077
+ * content, so runtimes should call this on win32 right before spawning.
1078
+ *
1079
+ * Used by the cursor and opencode spawn runtimes.
1080
+ */
1081
+ export function flattenPromptForWindowsShell(prompt: string): string {
1082
+ if (process.platform !== 'win32' || typeof prompt !== 'string') {
1083
+ return prompt;
1084
+ }
1085
+ return prompt.replace(/\s*\r?\n\s*/g, ' ').trim();
1086
+ }
1087
+
1088
+ // ---------------------------
1089
+ //----------------- TERMINAL OUTPUT UTILITIES ------------
1090
+ const ANSI_TERMINAL_STYLES = {
1091
+ reset: '\x1b[0m',
1092
+ bright: '\x1b[1m',
1093
+ dim: '\x1b[2m',
1094
+ cyan: '\x1b[36m',
1095
+ green: '\x1b[32m',
1096
+ yellow: '\x1b[33m',
1097
+ blue: '\x1b[34m',
1098
+ } as const;
1099
+
1100
+ /**
1101
+ * Applies the small, consistent ANSI style vocabulary used by backend
1102
+ * terminal output. The CLI and server bootstrap share these formatters so
1103
+ * status, warning, and startup messages use one implementation. Callers
1104
+ * should pass complete display strings and write the returned value directly
1105
+ * to stdout or stderr; the reset suffix prevents styling subsequent output.
1106
+ */
1107
+ export const terminalTextStyles = {
1108
+ info: (text: string): string =>
1109
+ `${ANSI_TERMINAL_STYLES.cyan}${text}${ANSI_TERMINAL_STYLES.reset}`,
1110
+ ok: (text: string): string =>
1111
+ `${ANSI_TERMINAL_STYLES.green}${text}${ANSI_TERMINAL_STYLES.reset}`,
1112
+ warn: (text: string): string =>
1113
+ `${ANSI_TERMINAL_STYLES.yellow}${text}${ANSI_TERMINAL_STYLES.reset}`,
1114
+ error: (text: string): string =>
1115
+ `${ANSI_TERMINAL_STYLES.yellow}${text}${ANSI_TERMINAL_STYLES.reset}`,
1116
+ tip: (text: string): string =>
1117
+ `${ANSI_TERMINAL_STYLES.blue}${text}${ANSI_TERMINAL_STYLES.reset}`,
1118
+ bright: (text: string): string =>
1119
+ `${ANSI_TERMINAL_STYLES.bright}${text}${ANSI_TERMINAL_STYLES.reset}`,
1120
+ dim: (text: string): string =>
1121
+ `${ANSI_TERMINAL_STYLES.dim}${text}${ANSI_TERMINAL_STYLES.reset}`,
1122
+ };
1123
+
1124
+ // ---------------------------
1125
+ //----------------- RUNTIME PATH RESOLUTION UTILITIES ------------
1126
+ /**
1127
+ * Resolves the directory containing an ES module from `import.meta.url`.
1128
+ * Backend entrypoints and feature composition roots use this instead of
1129
+ * recreating CommonJS `__dirname` logic.
1130
+ */
1131
+ export function getModuleDirectory(importMetaUrl: string): string {
1132
+ return path.dirname(fileURLToPath(importMetaUrl));
1133
+ }
1134
+
1135
+ /**
1136
+ * Walks upward to the nearest `server` directory in either source or compiled
1137
+ * output. Callers use this stable anchor for server-relative resources.
1138
+ */
1139
+ export function findServerRoot(startDirectory: string): string {
1140
+ let currentDirectory = startDirectory;
1141
+ while (path.basename(currentDirectory) !== 'server') {
1142
+ const parentDirectory = path.dirname(currentDirectory);
1143
+ if (parentDirectory === currentDirectory) {
1144
+ throw new Error(`Could not resolve the backend server root from "${startDirectory}".`);
1145
+ }
1146
+ currentDirectory = parentDirectory;
1147
+ }
1148
+ return currentDirectory;
1149
+ }
1150
+
1151
+ /**
1152
+ * Resolves the application root from a source or `dist-server/server` path so
1153
+ * package-level resources work identically before and after compilation.
1154
+ */
1155
+ export function findApplicationRoot(startDirectory: string): string {
1156
+ const serverRoot = findServerRoot(startDirectory);
1157
+ const parentDirectory = path.dirname(serverRoot);
1158
+ return path.basename(parentDirectory) === 'dist-server'
1159
+ ? path.dirname(parentDirectory)
1160
+ : parentDirectory;
1161
+ }