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,1372 @@
1
+ // @ts-nocheck -- temporary while Taskmaster workflows are extracted into the injected service.
2
+ /**
3
+ * TASKMASTER API ROUTES
4
+ * ====================
5
+ *
6
+ * This module provides API endpoints for TaskMaster integration including:
7
+ * - .taskmaster folder detection in project directories
8
+ * - MCP server configuration detection
9
+ * - TaskMaster state and metadata management
10
+ */
11
+ import path from 'path';
12
+ import express from 'express';
13
+ function broadcastTaskMasterUpdate(wss, type, projectId, payloadKey, payload) {
14
+ if (!wss || !projectId)
15
+ return;
16
+ const message = JSON.stringify({
17
+ type,
18
+ projectId,
19
+ ...(payload === undefined ? {} : { [payloadKey]: payload }),
20
+ timestamp: new Date().toISOString(),
21
+ });
22
+ wss.clients.forEach((client) => {
23
+ if (client.readyState === 1)
24
+ client.send(message);
25
+ });
26
+ }
27
+ function broadcastTaskMasterProjectUpdate(wss, projectId, taskMasterData) {
28
+ broadcastTaskMasterUpdate(wss, 'taskmaster-project-updated', projectId, 'taskMasterData', taskMasterData);
29
+ }
30
+ function broadcastTaskMasterTasksUpdate(wss, projectId, tasksData) {
31
+ broadcastTaskMasterUpdate(wss, 'taskmaster-tasks-updated', projectId, 'tasksData', tasksData);
32
+ }
33
+ /**
34
+ * Resolve the absolute project directory from a DB-assigned `projectId`.
35
+ *
36
+ * TaskMaster routes used to accept a Claude-encoded folder name (`projectName`)
37
+ * and derive the path from JSONL history. After the projectId migration the
38
+ * only identifier we accept is the primary key of the `projects` table, so
39
+ * every handler calls this helper and 404s when the id is unknown.
40
+ */
41
+ /** Creates Taskmaster routes around explicit filesystem, process, MCP, and project adapters. */
42
+ export function createTaskmasterRouter(dependencies) {
43
+ const fs = dependencies.fileSystem;
44
+ const fsPromises = dependencies.fileSystemPromises;
45
+ const spawn = dependencies.spawnProcess;
46
+ const taskmasterService = dependencies.taskmasterService;
47
+ const resolveProjectPathFromId = async (projectId) => projectId
48
+ ? dependencies.resolveProjectPathById(projectId)
49
+ : null;
50
+ const router = express.Router();
51
+ function runTaskmasterProcess(command, args, options, onComplete) {
52
+ const child = spawn(command, args, options);
53
+ let stdout = '';
54
+ let stderr = '';
55
+ let settled = false;
56
+ child.stdout.on('data', (data) => {
57
+ stdout += data.toString();
58
+ });
59
+ child.stderr.on('data', (data) => {
60
+ stderr += data.toString();
61
+ });
62
+ const settle = (code, error = null) => {
63
+ if (settled)
64
+ return;
65
+ settled = true;
66
+ onComplete({ code, error, stdout, stderr });
67
+ };
68
+ child.once('error', (error) => settle(null, error));
69
+ child.once('close', (code) => settle(code));
70
+ return child;
71
+ }
72
+ /**
73
+ * Check if TaskMaster CLI is installed globally
74
+ * @returns {Promise<Object>} Installation status result
75
+ */
76
+ async function checkTaskMasterInstallation() {
77
+ return new Promise((resolve) => {
78
+ // Check if task-master command is available
79
+ const child = spawn('which', ['task-master'], {
80
+ stdio: ['ignore', 'pipe', 'pipe'],
81
+ shell: true
82
+ });
83
+ let output = '';
84
+ let errorOutput = '';
85
+ child.stdout.on('data', (data) => {
86
+ output += data.toString();
87
+ });
88
+ child.stderr.on('data', (data) => {
89
+ errorOutput += data.toString();
90
+ });
91
+ child.on('close', (code) => {
92
+ if (code === 0 && output.trim()) {
93
+ // TaskMaster is installed, get version
94
+ const versionChild = spawn('task-master', ['--version'], {
95
+ stdio: ['ignore', 'pipe', 'pipe'],
96
+ shell: true
97
+ });
98
+ let versionOutput = '';
99
+ versionChild.stdout.on('data', (data) => {
100
+ versionOutput += data.toString();
101
+ });
102
+ versionChild.on('close', (versionCode) => {
103
+ resolve({
104
+ isInstalled: true,
105
+ installPath: output.trim(),
106
+ version: versionCode === 0 ? versionOutput.trim() : 'unknown',
107
+ reason: null
108
+ });
109
+ });
110
+ versionChild.on('error', () => {
111
+ resolve({
112
+ isInstalled: true,
113
+ installPath: output.trim(),
114
+ version: 'unknown',
115
+ reason: null
116
+ });
117
+ });
118
+ }
119
+ else {
120
+ resolve({
121
+ isInstalled: false,
122
+ installPath: null,
123
+ version: null,
124
+ reason: 'TaskMaster CLI not found in PATH'
125
+ });
126
+ }
127
+ });
128
+ child.on('error', (error) => {
129
+ resolve({
130
+ isInstalled: false,
131
+ installPath: null,
132
+ version: null,
133
+ reason: `Error checking installation: ${error.message}`
134
+ });
135
+ });
136
+ });
137
+ }
138
+ // API Routes
139
+ /**
140
+ * GET /api/taskmaster/installation-status
141
+ * Check if TaskMaster CLI is installed on the system
142
+ */
143
+ router.get('/installation-status', async (req, res) => {
144
+ try {
145
+ const installationStatus = await checkTaskMasterInstallation();
146
+ // Also check for MCP server configuration
147
+ const mcpStatus = await taskmasterService.detectMcpServer();
148
+ res.json({
149
+ success: true,
150
+ installation: installationStatus,
151
+ mcpServer: mcpStatus,
152
+ isReady: installationStatus.isInstalled && mcpStatus.hasMCPServer
153
+ });
154
+ }
155
+ catch (error) {
156
+ console.error('Error checking TaskMaster installation:', error);
157
+ res.status(500).json({
158
+ success: false,
159
+ error: 'Failed to check TaskMaster installation status',
160
+ installation: {
161
+ isInstalled: false,
162
+ reason: `Server error: ${error.message}`
163
+ },
164
+ mcpServer: {
165
+ hasMCPServer: false,
166
+ reason: `Server error: ${error.message}`
167
+ },
168
+ isReady: false
169
+ });
170
+ }
171
+ });
172
+ /**
173
+ * GET /api/taskmaster/mcp-status
174
+ * Check whether TaskMaster is configured in the user's Claude MCP settings.
175
+ */
176
+ router.get('/mcp-status', async (_req, res) => {
177
+ try {
178
+ res.json(await taskmasterService.detectMcpServer());
179
+ }
180
+ catch (error) {
181
+ const message = error instanceof Error ? error.message : 'Unknown error';
182
+ console.error('TaskMaster MCP detection error:', error);
183
+ res.status(500).json({
184
+ error: 'Failed to detect TaskMaster MCP server',
185
+ message
186
+ });
187
+ }
188
+ });
189
+ /**
190
+ * GET /api/taskmaster/tasks/:projectId
191
+ * Load actual tasks from .taskmaster/tasks/tasks.json
192
+ *
193
+ * `projectId` is the DB primary key of the project; the folder is resolved via
194
+ * the projects table rather than extracted from Claude JSONL history.
195
+ */
196
+ router.get('/tasks/:projectId', async (req, res) => {
197
+ try {
198
+ const { projectId } = req.params;
199
+ // Get project path via the DB; the legacy JSONL-based resolver is gone.
200
+ const projectPath = await resolveProjectPathFromId(projectId);
201
+ if (!projectPath) {
202
+ return res.status(404).json({
203
+ error: 'Project not found',
204
+ message: `Project "${projectId}" does not exist`
205
+ });
206
+ }
207
+ const taskMasterPath = path.join(projectPath, '.taskmaster');
208
+ const tasksFilePath = path.join(taskMasterPath, 'tasks', 'tasks.json');
209
+ // Check if tasks file exists
210
+ try {
211
+ await fsPromises.access(tasksFilePath);
212
+ }
213
+ catch (error) {
214
+ return res.json({
215
+ projectId,
216
+ tasks: [],
217
+ message: 'No tasks.json file found'
218
+ });
219
+ }
220
+ // Read and parse tasks file
221
+ try {
222
+ const tasksContent = await fsPromises.readFile(tasksFilePath, 'utf8');
223
+ const tasksData = JSON.parse(tasksContent);
224
+ let tasks = [];
225
+ let currentTag = 'master';
226
+ // Handle both tagged and legacy formats
227
+ if (Array.isArray(tasksData)) {
228
+ // Legacy format
229
+ tasks = tasksData;
230
+ }
231
+ else if (tasksData.tasks) {
232
+ // Simple format with tasks array
233
+ tasks = tasksData.tasks;
234
+ }
235
+ else {
236
+ // Tagged format - get tasks from current tag or master
237
+ if (tasksData[currentTag] && tasksData[currentTag].tasks) {
238
+ tasks = tasksData[currentTag].tasks;
239
+ }
240
+ else if (tasksData.master && tasksData.master.tasks) {
241
+ tasks = tasksData.master.tasks;
242
+ }
243
+ else {
244
+ // Get tasks from first available tag
245
+ const firstTag = Object.keys(tasksData).find(key => tasksData[key].tasks && Array.isArray(tasksData[key].tasks));
246
+ if (firstTag) {
247
+ tasks = tasksData[firstTag].tasks;
248
+ currentTag = firstTag;
249
+ }
250
+ }
251
+ }
252
+ // Transform tasks to ensure all have required fields
253
+ const transformedTasks = tasks.map(task => ({
254
+ id: task.id,
255
+ title: task.title || 'Untitled Task',
256
+ description: task.description || '',
257
+ status: task.status || 'pending',
258
+ priority: task.priority || 'medium',
259
+ dependencies: task.dependencies || [],
260
+ createdAt: task.createdAt || task.created || new Date().toISOString(),
261
+ updatedAt: task.updatedAt || task.updated || new Date().toISOString(),
262
+ details: task.details || '',
263
+ testStrategy: task.testStrategy || task.test_strategy || '',
264
+ subtasks: task.subtasks || []
265
+ }));
266
+ res.json({
267
+ projectId,
268
+ projectPath,
269
+ tasks: transformedTasks,
270
+ currentTag,
271
+ totalTasks: transformedTasks.length,
272
+ tasksByStatus: {
273
+ pending: transformedTasks.filter(t => t.status === 'pending').length,
274
+ 'in-progress': transformedTasks.filter(t => t.status === 'in-progress').length,
275
+ done: transformedTasks.filter(t => t.status === 'done').length,
276
+ review: transformedTasks.filter(t => t.status === 'review').length,
277
+ deferred: transformedTasks.filter(t => t.status === 'deferred').length,
278
+ cancelled: transformedTasks.filter(t => t.status === 'cancelled').length
279
+ },
280
+ timestamp: new Date().toISOString()
281
+ });
282
+ }
283
+ catch (parseError) {
284
+ console.error('Failed to parse tasks.json:', parseError);
285
+ return res.status(500).json({
286
+ error: 'Failed to parse tasks file',
287
+ message: parseError.message
288
+ });
289
+ }
290
+ }
291
+ catch (error) {
292
+ console.error('TaskMaster tasks loading error:', error);
293
+ res.status(500).json({
294
+ error: 'Failed to load TaskMaster tasks',
295
+ message: error.message
296
+ });
297
+ }
298
+ });
299
+ /**
300
+ * GET /api/taskmaster/prd/:projectId
301
+ * List all PRD files in the project's .taskmaster/docs directory
302
+ */
303
+ router.get('/prd/:projectId', async (req, res) => {
304
+ try {
305
+ const { projectId } = req.params;
306
+ // projectId → projectPath lookup through the DB (post-migration).
307
+ const projectPath = await resolveProjectPathFromId(projectId);
308
+ if (!projectPath) {
309
+ return res.status(404).json({
310
+ error: 'Project not found',
311
+ message: `Project "${projectId}" does not exist`
312
+ });
313
+ }
314
+ const docsPath = path.join(projectPath, '.taskmaster', 'docs');
315
+ // Check if docs directory exists
316
+ try {
317
+ await fsPromises.access(docsPath, fs.constants.R_OK);
318
+ }
319
+ catch (error) {
320
+ return res.json({
321
+ projectId,
322
+ prdFiles: [],
323
+ message: 'No .taskmaster/docs directory found'
324
+ });
325
+ }
326
+ // Read directory and filter for PRD files
327
+ try {
328
+ const files = await fsPromises.readdir(docsPath);
329
+ const prdFiles = [];
330
+ for (const file of files) {
331
+ const filePath = path.join(docsPath, file);
332
+ const stats = await fsPromises.stat(filePath);
333
+ if (stats.isFile() && (file.endsWith('.txt') || file.endsWith('.md'))) {
334
+ prdFiles.push({
335
+ name: file,
336
+ path: path.relative(projectPath, filePath),
337
+ size: stats.size,
338
+ modified: stats.mtime.toISOString(),
339
+ created: stats.birthtime.toISOString()
340
+ });
341
+ }
342
+ }
343
+ res.json({
344
+ projectId,
345
+ projectPath,
346
+ prdFiles: prdFiles.sort((a, b) => new Date(b.modified) - new Date(a.modified)),
347
+ timestamp: new Date().toISOString()
348
+ });
349
+ }
350
+ catch (readError) {
351
+ console.error('Error reading docs directory:', readError);
352
+ return res.status(500).json({
353
+ error: 'Failed to read PRD files',
354
+ message: readError.message
355
+ });
356
+ }
357
+ }
358
+ catch (error) {
359
+ console.error('PRD list error:', error);
360
+ res.status(500).json({
361
+ error: 'Failed to list PRD files',
362
+ message: error.message
363
+ });
364
+ }
365
+ });
366
+ /**
367
+ * POST /api/taskmaster/prd/:projectId
368
+ * Create or update a PRD file in the project's .taskmaster/docs directory
369
+ */
370
+ router.post('/prd/:projectId', async (req, res) => {
371
+ try {
372
+ const { projectId } = req.params;
373
+ const { fileName, content } = req.body;
374
+ if (!fileName || !content) {
375
+ return res.status(400).json({
376
+ error: 'Missing required fields',
377
+ message: 'fileName and content are required'
378
+ });
379
+ }
380
+ // Validate filename
381
+ if (!fileName.match(/^[\w\-. ]+\.(txt|md)$/)) {
382
+ return res.status(400).json({
383
+ error: 'Invalid filename',
384
+ message: 'Filename must end with .txt or .md and contain only alphanumeric characters, spaces, dots, and dashes'
385
+ });
386
+ }
387
+ // Resolve the project folder through the DB using the projectId param.
388
+ const projectPath = await resolveProjectPathFromId(projectId);
389
+ if (!projectPath) {
390
+ return res.status(404).json({
391
+ error: 'Project not found',
392
+ message: `Project "${projectId}" does not exist`
393
+ });
394
+ }
395
+ const docsPath = path.join(projectPath, '.taskmaster', 'docs');
396
+ const filePath = path.join(docsPath, fileName);
397
+ // Ensure docs directory exists
398
+ try {
399
+ await fsPromises.mkdir(docsPath, { recursive: true });
400
+ }
401
+ catch (error) {
402
+ console.error('Failed to create docs directory:', error);
403
+ return res.status(500).json({
404
+ error: 'Failed to create directory',
405
+ message: error.message
406
+ });
407
+ }
408
+ // Write the PRD file
409
+ try {
410
+ await fsPromises.writeFile(filePath, content, 'utf8');
411
+ // Get file stats
412
+ const stats = await fsPromises.stat(filePath);
413
+ res.json({
414
+ projectId,
415
+ projectPath,
416
+ fileName,
417
+ filePath: path.relative(projectPath, filePath),
418
+ size: stats.size,
419
+ created: stats.birthtime.toISOString(),
420
+ modified: stats.mtime.toISOString(),
421
+ message: 'PRD file saved successfully',
422
+ timestamp: new Date().toISOString()
423
+ });
424
+ }
425
+ catch (writeError) {
426
+ console.error('Failed to write PRD file:', writeError);
427
+ return res.status(500).json({
428
+ error: 'Failed to write PRD file',
429
+ message: writeError.message
430
+ });
431
+ }
432
+ }
433
+ catch (error) {
434
+ console.error('PRD create/update error:', error);
435
+ res.status(500).json({
436
+ error: 'Failed to create/update PRD file',
437
+ message: error.message
438
+ });
439
+ }
440
+ });
441
+ /**
442
+ * GET /api/taskmaster/prd/:projectId/:fileName
443
+ * Get content of a specific PRD file
444
+ */
445
+ router.get('/prd/:projectId/:fileName', async (req, res) => {
446
+ try {
447
+ const { projectId, fileName } = req.params;
448
+ const projectPath = await resolveProjectPathFromId(projectId);
449
+ if (!projectPath) {
450
+ return res.status(404).json({
451
+ error: 'Project not found',
452
+ message: `Project "${projectId}" does not exist`
453
+ });
454
+ }
455
+ const filePath = path.join(projectPath, '.taskmaster', 'docs', fileName);
456
+ // Check if file exists
457
+ try {
458
+ await fsPromises.access(filePath, fs.constants.R_OK);
459
+ }
460
+ catch (error) {
461
+ return res.status(404).json({
462
+ error: 'PRD file not found',
463
+ message: `File "${fileName}" does not exist`
464
+ });
465
+ }
466
+ // Read file content
467
+ try {
468
+ const content = await fsPromises.readFile(filePath, 'utf8');
469
+ const stats = await fsPromises.stat(filePath);
470
+ res.json({
471
+ projectId,
472
+ projectPath,
473
+ fileName,
474
+ filePath: path.relative(projectPath, filePath),
475
+ content,
476
+ size: stats.size,
477
+ created: stats.birthtime.toISOString(),
478
+ modified: stats.mtime.toISOString(),
479
+ timestamp: new Date().toISOString()
480
+ });
481
+ }
482
+ catch (readError) {
483
+ console.error('Failed to read PRD file:', readError);
484
+ return res.status(500).json({
485
+ error: 'Failed to read PRD file',
486
+ message: readError.message
487
+ });
488
+ }
489
+ }
490
+ catch (error) {
491
+ console.error('PRD read error:', error);
492
+ res.status(500).json({
493
+ error: 'Failed to read PRD file',
494
+ message: error.message
495
+ });
496
+ }
497
+ });
498
+ /**
499
+ * POST /api/taskmaster/init/:projectId
500
+ * Initialize TaskMaster in a project
501
+ */
502
+ router.post('/init/:projectId', async (req, res) => {
503
+ try {
504
+ const { projectId } = req.params;
505
+ const projectPath = await resolveProjectPathFromId(projectId);
506
+ if (!projectPath) {
507
+ return res.status(404).json({
508
+ error: 'Project not found',
509
+ message: `Project "${projectId}" does not exist`
510
+ });
511
+ }
512
+ // Check if TaskMaster is already initialized
513
+ const taskMasterPath = path.join(projectPath, '.taskmaster');
514
+ try {
515
+ await fsPromises.access(taskMasterPath, fs.constants.F_OK);
516
+ return res.status(400).json({
517
+ error: 'TaskMaster already initialized',
518
+ message: 'TaskMaster is already configured for this project'
519
+ });
520
+ }
521
+ catch (error) {
522
+ // Directory doesn't exist, we can proceed
523
+ }
524
+ // Run taskmaster init command
525
+ const initProcess = runTaskmasterProcess('npx', ['task-master', 'init'], {
526
+ cwd: projectPath,
527
+ stdio: ['pipe', 'pipe', 'pipe']
528
+ }, ({ code, error, stdout, stderr }) => {
529
+ if (code === 0) {
530
+ // Broadcast TaskMaster project update via WebSocket. The
531
+ // WebSocket payload keeps using `projectId` so the frontend
532
+ // can match notifications against the current selection.
533
+ if (req.app.locals.wss) {
534
+ broadcastTaskMasterProjectUpdate(req.app.locals.wss, projectId, { hasTaskmaster: true, status: 'initialized' });
535
+ }
536
+ res.json({
537
+ projectId,
538
+ projectPath,
539
+ message: 'TaskMaster initialized successfully',
540
+ output: stdout,
541
+ timestamp: new Date().toISOString()
542
+ });
543
+ }
544
+ else {
545
+ console.error('TaskMaster init failed:', stderr);
546
+ res.status(500).json({
547
+ error: 'Failed to initialize TaskMaster',
548
+ message: error?.message || stderr || stdout,
549
+ code
550
+ });
551
+ }
552
+ });
553
+ // Send 'yes' responses to automated prompts
554
+ initProcess.stdin.write('yes\n');
555
+ initProcess.stdin.end();
556
+ }
557
+ catch (error) {
558
+ console.error('TaskMaster init error:', error);
559
+ res.status(500).json({
560
+ error: 'Failed to initialize TaskMaster',
561
+ message: error.message
562
+ });
563
+ }
564
+ });
565
+ /**
566
+ * POST /api/taskmaster/add-task/:projectId
567
+ * Add a new task to the project
568
+ */
569
+ router.post('/add-task/:projectId', async (req, res) => {
570
+ try {
571
+ const { projectId } = req.params;
572
+ const { prompt, title, description, priority = 'medium', dependencies } = req.body;
573
+ if (!prompt && (!title || !description)) {
574
+ return res.status(400).json({
575
+ error: 'Missing required parameters',
576
+ message: 'Either "prompt" or both "title" and "description" are required'
577
+ });
578
+ }
579
+ const projectPath = await resolveProjectPathFromId(projectId);
580
+ if (!projectPath) {
581
+ return res.status(404).json({
582
+ error: 'Project not found',
583
+ message: `Project "${projectId}" does not exist`
584
+ });
585
+ }
586
+ // Build the task-master add-task command
587
+ const args = ['task-master-ai', 'add-task'];
588
+ if (prompt) {
589
+ args.push('--prompt', prompt);
590
+ args.push('--research'); // Use research for AI-generated tasks
591
+ }
592
+ else {
593
+ args.push('--prompt', `Create a task titled "${title}" with description: ${description}`);
594
+ }
595
+ if (priority) {
596
+ args.push('--priority', priority);
597
+ }
598
+ if (dependencies) {
599
+ args.push('--dependencies', dependencies);
600
+ }
601
+ // Run task-master add-task command
602
+ const addTaskProcess = runTaskmasterProcess('npx', args, {
603
+ cwd: projectPath,
604
+ stdio: ['pipe', 'pipe', 'pipe']
605
+ }, ({ code, error, stdout, stderr }) => {
606
+ console.log('Add task process completed with code:', code);
607
+ console.log('Stdout:', stdout);
608
+ console.log('Stderr:', stderr);
609
+ if (code === 0) {
610
+ // Broadcast task update via WebSocket using the projectId so
611
+ // clients subscribed to this project get notified immediately.
612
+ if (req.app.locals.wss) {
613
+ broadcastTaskMasterTasksUpdate(req.app.locals.wss, projectId);
614
+ }
615
+ res.json({
616
+ projectId,
617
+ projectPath,
618
+ message: 'Task added successfully',
619
+ output: stdout,
620
+ timestamp: new Date().toISOString()
621
+ });
622
+ }
623
+ else {
624
+ console.error('Add task failed:', stderr);
625
+ res.status(500).json({
626
+ error: 'Failed to add task',
627
+ message: error?.message || stderr || stdout,
628
+ code
629
+ });
630
+ }
631
+ });
632
+ addTaskProcess.stdin.end();
633
+ }
634
+ catch (error) {
635
+ console.error('Add task error:', error);
636
+ res.status(500).json({
637
+ error: 'Failed to add task',
638
+ message: error.message
639
+ });
640
+ }
641
+ });
642
+ /**
643
+ * PUT /api/taskmaster/update-task/:projectId/:taskId
644
+ * Update a specific task using TaskMaster CLI
645
+ */
646
+ router.put('/update-task/:projectId/:taskId', async (req, res) => {
647
+ try {
648
+ const { projectId, taskId } = req.params;
649
+ const { title, description, status, priority, details } = req.body;
650
+ const projectPath = await resolveProjectPathFromId(projectId);
651
+ if (!projectPath) {
652
+ return res.status(404).json({
653
+ error: 'Project not found',
654
+ message: `Project "${projectId}" does not exist`
655
+ });
656
+ }
657
+ // If only updating status, use set-status command
658
+ if (status && Object.keys(req.body).length === 1) {
659
+ const setStatusProcess = runTaskmasterProcess('npx', ['task-master-ai', 'set-status', `--id=${taskId}`, `--status=${status}`], {
660
+ cwd: projectPath,
661
+ stdio: ['pipe', 'pipe', 'pipe']
662
+ }, ({ code, error, stdout, stderr }) => {
663
+ if (code === 0) {
664
+ // Broadcast task update via WebSocket
665
+ if (req.app.locals.wss) {
666
+ broadcastTaskMasterTasksUpdate(req.app.locals.wss, projectId);
667
+ }
668
+ res.json({
669
+ projectId,
670
+ projectPath,
671
+ taskId,
672
+ message: 'Task status updated successfully',
673
+ output: stdout,
674
+ timestamp: new Date().toISOString()
675
+ });
676
+ }
677
+ else {
678
+ console.error('Set task status failed:', stderr);
679
+ res.status(500).json({
680
+ error: 'Failed to update task status',
681
+ message: error?.message || stderr || stdout,
682
+ code
683
+ });
684
+ }
685
+ });
686
+ setStatusProcess.stdin.end();
687
+ }
688
+ else {
689
+ // For other updates, use update-task command with a prompt describing the changes
690
+ const updates = [];
691
+ if (title)
692
+ updates.push(`title: "${title}"`);
693
+ if (description)
694
+ updates.push(`description: "${description}"`);
695
+ if (priority)
696
+ updates.push(`priority: "${priority}"`);
697
+ if (details)
698
+ updates.push(`details: "${details}"`);
699
+ const prompt = `Update task with the following changes: ${updates.join(', ')}`;
700
+ const updateProcess = runTaskmasterProcess('npx', ['task-master-ai', 'update-task', `--id=${taskId}`, `--prompt=${prompt}`], {
701
+ cwd: projectPath,
702
+ stdio: ['pipe', 'pipe', 'pipe']
703
+ }, ({ code, error, stdout, stderr }) => {
704
+ if (code === 0) {
705
+ // Broadcast task update via WebSocket
706
+ if (req.app.locals.wss) {
707
+ broadcastTaskMasterTasksUpdate(req.app.locals.wss, projectId);
708
+ }
709
+ res.json({
710
+ projectId,
711
+ projectPath,
712
+ taskId,
713
+ message: 'Task updated successfully',
714
+ output: stdout,
715
+ timestamp: new Date().toISOString()
716
+ });
717
+ }
718
+ else {
719
+ console.error('Update task failed:', stderr);
720
+ res.status(500).json({
721
+ error: 'Failed to update task',
722
+ message: error?.message || stderr || stdout,
723
+ code
724
+ });
725
+ }
726
+ });
727
+ updateProcess.stdin.end();
728
+ }
729
+ }
730
+ catch (error) {
731
+ console.error('Update task error:', error);
732
+ res.status(500).json({
733
+ error: 'Failed to update task',
734
+ message: error.message
735
+ });
736
+ }
737
+ });
738
+ /**
739
+ * POST /api/taskmaster/parse-prd/:projectId
740
+ * Parse a PRD file to generate tasks
741
+ */
742
+ router.post('/parse-prd/:projectId', async (req, res) => {
743
+ try {
744
+ const { projectId } = req.params;
745
+ const { fileName = 'prd.txt', numTasks, append = false } = req.body;
746
+ const projectPath = await resolveProjectPathFromId(projectId);
747
+ if (!projectPath) {
748
+ return res.status(404).json({
749
+ error: 'Project not found',
750
+ message: `Project "${projectId}" does not exist`
751
+ });
752
+ }
753
+ const prdPath = path.join(projectPath, '.taskmaster', 'docs', fileName);
754
+ // Check if PRD file exists
755
+ try {
756
+ await fsPromises.access(prdPath, fs.constants.F_OK);
757
+ }
758
+ catch (error) {
759
+ return res.status(404).json({
760
+ error: 'PRD file not found',
761
+ message: `File "${fileName}" does not exist in .taskmaster/docs/`
762
+ });
763
+ }
764
+ // Build the command args
765
+ const args = ['task-master-ai', 'parse-prd', prdPath];
766
+ if (numTasks) {
767
+ args.push('--num-tasks', numTasks.toString());
768
+ }
769
+ if (append) {
770
+ args.push('--append');
771
+ }
772
+ args.push('--research'); // Use research for better PRD parsing
773
+ // Run task-master parse-prd command
774
+ const parsePRDProcess = runTaskmasterProcess('npx', args, {
775
+ cwd: projectPath,
776
+ stdio: ['pipe', 'pipe', 'pipe']
777
+ }, ({ code, error, stdout, stderr }) => {
778
+ if (code === 0) {
779
+ // Broadcast task update via WebSocket
780
+ if (req.app.locals.wss) {
781
+ broadcastTaskMasterTasksUpdate(req.app.locals.wss, projectId);
782
+ }
783
+ res.json({
784
+ projectId,
785
+ projectPath,
786
+ prdFile: fileName,
787
+ message: 'PRD parsed and tasks generated successfully',
788
+ output: stdout,
789
+ timestamp: new Date().toISOString()
790
+ });
791
+ }
792
+ else {
793
+ console.error('Parse PRD failed:', stderr);
794
+ res.status(500).json({
795
+ error: 'Failed to parse PRD',
796
+ message: error?.message || stderr || stdout,
797
+ code
798
+ });
799
+ }
800
+ });
801
+ parsePRDProcess.stdin.end();
802
+ }
803
+ catch (error) {
804
+ console.error('Parse PRD error:', error);
805
+ res.status(500).json({
806
+ error: 'Failed to parse PRD',
807
+ message: error.message
808
+ });
809
+ }
810
+ });
811
+ /**
812
+ * GET /api/taskmaster/prd-templates
813
+ * Get available PRD templates
814
+ */
815
+ router.get('/prd-templates', async (req, res) => {
816
+ try {
817
+ // Return built-in templates
818
+ const templates = [
819
+ {
820
+ id: 'web-app',
821
+ name: 'Web Application',
822
+ description: 'Template for web application projects with frontend and backend components',
823
+ category: 'web',
824
+ content: `# Product Requirements Document - Web Application
825
+
826
+ ## Overview
827
+ **Product Name:** [Your App Name]
828
+ **Version:** 1.0
829
+ **Date:** ${new Date().toISOString().split('T')[0]}
830
+ **Author:** [Your Name]
831
+
832
+ ## Executive Summary
833
+ Brief description of what this web application will do and why it's needed.
834
+
835
+ ## Product Goals
836
+ - Goal 1: [Specific measurable goal]
837
+ - Goal 2: [Specific measurable goal]
838
+ - Goal 3: [Specific measurable goal]
839
+
840
+ ## User Stories
841
+ ### Core Features
842
+ 1. **User Registration & Authentication**
843
+ - As a user, I want to create an account so I can access personalized features
844
+ - As a user, I want to log in securely so my data is protected
845
+ - As a user, I want to reset my password if I forget it
846
+
847
+ 2. **Main Application Features**
848
+ - As a user, I want to [core feature 1] so I can [benefit]
849
+ - As a user, I want to [core feature 2] so I can [benefit]
850
+ - As a user, I want to [core feature 3] so I can [benefit]
851
+
852
+ 3. **User Interface**
853
+ - As a user, I want a responsive design so I can use the app on any device
854
+ - As a user, I want intuitive navigation so I can easily find features
855
+
856
+ ## Technical Requirements
857
+ ### Frontend
858
+ - Framework: React/Vue/Angular or vanilla JavaScript
859
+ - Styling: CSS framework (Tailwind, Bootstrap, etc.)
860
+ - State Management: Redux/Vuex/Context API
861
+ - Build Tools: Webpack/Vite
862
+ - Testing: Jest/Vitest for unit tests
863
+
864
+ ### Backend
865
+ - Runtime: Node.js/Python/Java
866
+ - Database: PostgreSQL/MySQL/MongoDB
867
+ - API: RESTful API or GraphQL
868
+ - Authentication: JWT tokens
869
+ - Testing: Integration and unit tests
870
+
871
+ ### Infrastructure
872
+ - Hosting: Cloud provider (AWS, Azure, GCP)
873
+ - CI/CD: GitHub Actions/GitLab CI
874
+ - Monitoring: Application monitoring tools
875
+ - Security: HTTPS, input validation, rate limiting
876
+
877
+ ## Success Metrics
878
+ - User engagement metrics
879
+ - Performance benchmarks (load time < 2s)
880
+ - Error rates < 1%
881
+ - User satisfaction scores
882
+
883
+ ## Timeline
884
+ - Phase 1: Core functionality (4-6 weeks)
885
+ - Phase 2: Advanced features (2-4 weeks)
886
+ - Phase 3: Polish and launch (2 weeks)
887
+
888
+ ## Constraints & Assumptions
889
+ - Budget constraints
890
+ - Technical limitations
891
+ - Team size and expertise
892
+ - Timeline constraints`
893
+ },
894
+ {
895
+ id: 'api',
896
+ name: 'REST API',
897
+ description: 'Template for REST API development projects',
898
+ category: 'backend',
899
+ content: `# Product Requirements Document - REST API
900
+
901
+ ## Overview
902
+ **API Name:** [Your API Name]
903
+ **Version:** v1.0
904
+ **Date:** ${new Date().toISOString().split('T')[0]}
905
+ **Author:** [Your Name]
906
+
907
+ ## Executive Summary
908
+ Description of the API's purpose, target users, and primary use cases.
909
+
910
+ ## API Goals
911
+ - Goal 1: Provide secure data access
912
+ - Goal 2: Ensure scalable architecture
913
+ - Goal 3: Maintain high availability (99.9% uptime)
914
+
915
+ ## Functional Requirements
916
+ ### Core Endpoints
917
+ 1. **Authentication Endpoints**
918
+ - POST /api/auth/login - User authentication
919
+ - POST /api/auth/logout - User logout
920
+ - POST /api/auth/refresh - Token refresh
921
+ - POST /api/auth/register - User registration
922
+
923
+ 2. **Data Management Endpoints**
924
+ - GET /api/resources - List resources with pagination
925
+ - GET /api/resources/{id} - Get specific resource
926
+ - POST /api/resources - Create new resource
927
+ - PUT /api/resources/{id} - Update existing resource
928
+ - DELETE /api/resources/{id} - Delete resource
929
+
930
+ 3. **Administrative Endpoints**
931
+ - GET /api/admin/users - Manage users (admin only)
932
+ - GET /api/admin/analytics - System analytics
933
+ - POST /api/admin/backup - Trigger system backup
934
+
935
+ ## Technical Requirements
936
+ ### API Design
937
+ - RESTful architecture following OpenAPI 3.0 specification
938
+ - JSON request/response format
939
+ - Consistent error response format
940
+ - API versioning strategy
941
+
942
+ ### Authentication & Security
943
+ - JWT token-based authentication
944
+ - Role-based access control (RBAC)
945
+ - Rate limiting (100 requests/minute per user)
946
+ - Input validation and sanitization
947
+ - HTTPS enforcement
948
+
949
+ ### Database
950
+ - Database type: [PostgreSQL/MongoDB/MySQL]
951
+ - Connection pooling
952
+ - Database migrations
953
+ - Backup and recovery procedures
954
+
955
+ ### Performance Requirements
956
+ - Response time: < 200ms for 95% of requests
957
+ - Throughput: 1000+ requests/second
958
+ - Concurrent users: 10,000+
959
+ - Database query optimization
960
+
961
+ ### Documentation
962
+ - Auto-generated API documentation (Swagger/OpenAPI)
963
+ - Code examples for common use cases
964
+ - SDK development for major languages
965
+ - Postman collection for testing
966
+
967
+ ## Error Handling
968
+ - Standardized error codes and messages
969
+ - Proper HTTP status codes
970
+ - Detailed error logging
971
+ - Graceful degradation strategies
972
+
973
+ ## Testing Strategy
974
+ - Unit tests (80%+ coverage)
975
+ - Integration tests for all endpoints
976
+ - Load testing and performance testing
977
+ - Security testing (OWASP compliance)
978
+
979
+ ## Monitoring & Logging
980
+ - Application performance monitoring
981
+ - Error tracking and alerting
982
+ - Access logs and audit trails
983
+ - Health check endpoints
984
+
985
+ ## Deployment
986
+ - Containerized deployment (Docker)
987
+ - CI/CD pipeline setup
988
+ - Environment management (dev, staging, prod)
989
+ - Blue-green deployment strategy
990
+
991
+ ## Success Metrics
992
+ - API uptime > 99.9%
993
+ - Average response time < 200ms
994
+ - Zero critical security vulnerabilities
995
+ - Developer adoption metrics`
996
+ },
997
+ {
998
+ id: 'mobile-app',
999
+ name: 'Mobile Application',
1000
+ description: 'Template for mobile app development projects (iOS/Android)',
1001
+ category: 'mobile',
1002
+ content: `# Product Requirements Document - Mobile Application
1003
+
1004
+ ## Overview
1005
+ **App Name:** [Your App Name]
1006
+ **Platform:** iOS / Android / Cross-platform
1007
+ **Version:** 1.0
1008
+ **Date:** ${new Date().toISOString().split('T')[0]}
1009
+ **Author:** [Your Name]
1010
+
1011
+ ## Executive Summary
1012
+ Brief description of the mobile app's purpose, target audience, and key value proposition.
1013
+
1014
+ ## Product Goals
1015
+ - Goal 1: [Specific user engagement goal]
1016
+ - Goal 2: [Specific functionality goal]
1017
+ - Goal 3: [Specific performance goal]
1018
+
1019
+ ## User Stories
1020
+ ### Core Features
1021
+ 1. **Onboarding & Authentication**
1022
+ - As a new user, I want a simple onboarding process
1023
+ - As a user, I want to sign up with email or social media
1024
+ - As a user, I want biometric authentication for security
1025
+
1026
+ 2. **Main App Features**
1027
+ - As a user, I want [core feature 1] accessible from home screen
1028
+ - As a user, I want [core feature 2] to work offline
1029
+ - As a user, I want to sync data across devices
1030
+
1031
+ 3. **User Experience**
1032
+ - As a user, I want intuitive navigation patterns
1033
+ - As a user, I want fast loading times
1034
+ - As a user, I want accessibility features
1035
+
1036
+ ## Technical Requirements
1037
+ ### Mobile Development
1038
+ - **Cross-platform:** React Native / Flutter / Xamarin
1039
+ - **Native:** Swift (iOS) / Kotlin (Android)
1040
+ - **State Management:** Redux / MobX / Provider
1041
+ - **Navigation:** React Navigation / Flutter Navigation
1042
+
1043
+ ### Backend Integration
1044
+ - REST API or GraphQL integration
1045
+ - Real-time features (WebSockets/Push notifications)
1046
+ - Offline data synchronization
1047
+ - Background processing
1048
+
1049
+ ### Device Features
1050
+ - Camera and photo library access
1051
+ - GPS location services
1052
+ - Push notifications
1053
+ - Biometric authentication
1054
+ - Device storage
1055
+
1056
+ ### Performance Requirements
1057
+ - App launch time < 3 seconds
1058
+ - Screen transition animations < 300ms
1059
+ - Memory usage optimization
1060
+ - Battery usage optimization
1061
+
1062
+ ## Platform-Specific Considerations
1063
+ ### iOS Requirements
1064
+ - iOS 13.0+ minimum version
1065
+ - App Store guidelines compliance
1066
+ - iOS design guidelines (Human Interface Guidelines)
1067
+ - TestFlight beta testing
1068
+
1069
+ ### Android Requirements
1070
+ - Android 8.0+ (API level 26) minimum
1071
+ - Google Play Store guidelines
1072
+ - Material Design guidelines
1073
+ - Google Play Console testing
1074
+
1075
+ ## User Interface Design
1076
+ - Responsive design for different screen sizes
1077
+ - Dark mode support
1078
+ - Accessibility compliance (WCAG 2.1)
1079
+ - Consistent design system
1080
+
1081
+ ## Security & Privacy
1082
+ - Secure data storage (Keychain/Keystore)
1083
+ - API communication encryption
1084
+ - Privacy policy compliance (GDPR/CCPA)
1085
+ - App security best practices
1086
+
1087
+ ## Testing Strategy
1088
+ - Unit testing (80%+ coverage)
1089
+ - UI/E2E testing (Detox/Appium)
1090
+ - Device testing on multiple screen sizes
1091
+ - Performance testing
1092
+ - Security testing
1093
+
1094
+ ## App Store Deployment
1095
+ - App store optimization (ASO)
1096
+ - App icons and screenshots
1097
+ - Store listing content
1098
+ - Release management strategy
1099
+
1100
+ ## Analytics & Monitoring
1101
+ - User analytics (Firebase/Analytics)
1102
+ - Crash reporting (Crashlytics/Sentry)
1103
+ - Performance monitoring
1104
+ - User feedback collection
1105
+
1106
+ ## Success Metrics
1107
+ - App store ratings > 4.0
1108
+ - User retention rates
1109
+ - Daily/Monthly active users
1110
+ - App performance metrics
1111
+ - Conversion rates`
1112
+ },
1113
+ {
1114
+ id: 'data-analysis',
1115
+ name: 'Data Analysis Project',
1116
+ description: 'Template for data analysis and visualization projects',
1117
+ category: 'data',
1118
+ content: `# Product Requirements Document - Data Analysis Project
1119
+
1120
+ ## Overview
1121
+ **Project Name:** [Your Analysis Project]
1122
+ **Analysis Type:** [Descriptive/Predictive/Prescriptive]
1123
+ **Date:** ${new Date().toISOString().split('T')[0]}
1124
+ **Author:** [Your Name]
1125
+
1126
+ ## Executive Summary
1127
+ Description of the business problem, data sources, and expected insights.
1128
+
1129
+ ## Project Goals
1130
+ - Goal 1: [Specific business question to answer]
1131
+ - Goal 2: [Specific prediction to make]
1132
+ - Goal 3: [Specific recommendation to provide]
1133
+
1134
+ ## Business Requirements
1135
+ ### Key Questions
1136
+ 1. What patterns exist in the current data?
1137
+ 2. What factors influence [target variable]?
1138
+ 3. What predictions can be made for [future outcome]?
1139
+ 4. What recommendations can improve [business metric]?
1140
+
1141
+ ### Success Criteria
1142
+ - Actionable insights for stakeholders
1143
+ - Statistical significance in findings
1144
+ - Reproducible analysis pipeline
1145
+ - Clear visualization and reporting
1146
+
1147
+ ## Data Requirements
1148
+ ### Data Sources
1149
+ 1. **Primary Data**
1150
+ - Source: [Database/API/Files]
1151
+ - Format: [CSV/JSON/SQL]
1152
+ - Size: [Volume estimate]
1153
+ - Update frequency: [Real-time/Daily/Monthly]
1154
+
1155
+ 2. **External Data**
1156
+ - Third-party APIs
1157
+ - Public datasets
1158
+ - Market research data
1159
+
1160
+ ### Data Quality Requirements
1161
+ - Data completeness (< 5% missing values)
1162
+ - Data accuracy validation
1163
+ - Data consistency checks
1164
+ - Historical data availability
1165
+
1166
+ ## Technical Requirements
1167
+ ### Data Pipeline
1168
+ - Data extraction and ingestion
1169
+ - Data cleaning and preprocessing
1170
+ - Data transformation and feature engineering
1171
+ - Data validation and quality checks
1172
+
1173
+ ### Analysis Tools
1174
+ - **Programming:** Python/R/SQL
1175
+ - **Libraries:** pandas, numpy, scikit-learn, matplotlib
1176
+ - **Visualization:** Tableau, PowerBI, or custom dashboards
1177
+ - **Version Control:** Git for code and DVC for data
1178
+
1179
+ ### Computing Resources
1180
+ - Local development environment
1181
+ - Cloud computing (AWS/GCP/Azure) if needed
1182
+ - Database access and permissions
1183
+ - Storage requirements
1184
+
1185
+ ## Analysis Methodology
1186
+ ### Data Exploration
1187
+ 1. Descriptive statistics and data profiling
1188
+ 2. Data visualization and pattern identification
1189
+ 3. Correlation analysis
1190
+ 4. Outlier detection and handling
1191
+
1192
+ ### Statistical Analysis
1193
+ 1. Hypothesis formulation
1194
+ 2. Statistical testing
1195
+ 3. Confidence intervals
1196
+ 4. Effect size calculations
1197
+
1198
+ ### Machine Learning (if applicable)
1199
+ 1. Feature selection and engineering
1200
+ 2. Model selection and training
1201
+ 3. Cross-validation and evaluation
1202
+ 4. Model interpretation and explainability
1203
+
1204
+ ## Deliverables
1205
+ ### Reports
1206
+ - Executive summary for stakeholders
1207
+ - Technical analysis report
1208
+ - Data quality report
1209
+ - Methodology documentation
1210
+
1211
+ ### Visualizations
1212
+ - Interactive dashboards
1213
+ - Static charts and graphs
1214
+ - Data story presentations
1215
+ - Key findings infographics
1216
+
1217
+ ### Code & Documentation
1218
+ - Reproducible analysis scripts
1219
+ - Data pipeline code
1220
+ - Documentation and comments
1221
+ - Testing and validation code
1222
+
1223
+ ## Timeline
1224
+ - Phase 1: Data collection and exploration (2 weeks)
1225
+ - Phase 2: Analysis and modeling (3 weeks)
1226
+ - Phase 3: Reporting and visualization (1 week)
1227
+ - Phase 4: Stakeholder presentation (1 week)
1228
+
1229
+ ## Risks & Assumptions
1230
+ - Data availability and quality risks
1231
+ - Technical complexity assumptions
1232
+ - Resource and timeline constraints
1233
+ - Stakeholder engagement assumptions
1234
+
1235
+ ## Success Metrics
1236
+ - Stakeholder satisfaction with insights
1237
+ - Accuracy of predictions (if applicable)
1238
+ - Business impact of recommendations
1239
+ - Reproducibility of results`
1240
+ }
1241
+ ];
1242
+ res.json({
1243
+ templates,
1244
+ timestamp: new Date().toISOString()
1245
+ });
1246
+ }
1247
+ catch (error) {
1248
+ console.error('PRD templates error:', error);
1249
+ res.status(500).json({
1250
+ error: 'Failed to get PRD templates',
1251
+ message: error.message
1252
+ });
1253
+ }
1254
+ });
1255
+ /**
1256
+ * POST /api/taskmaster/apply-template/:projectId
1257
+ * Apply a PRD template to create a new PRD file
1258
+ */
1259
+ router.post('/apply-template/:projectId', async (req, res) => {
1260
+ try {
1261
+ const { projectId } = req.params;
1262
+ const { templateId, fileName = 'prd.txt', customizations = {} } = req.body;
1263
+ if (!templateId) {
1264
+ return res.status(400).json({
1265
+ error: 'Missing required parameter',
1266
+ message: 'templateId is required'
1267
+ });
1268
+ }
1269
+ const projectPath = await resolveProjectPathFromId(projectId);
1270
+ if (!projectPath) {
1271
+ return res.status(404).json({
1272
+ error: 'Project not found',
1273
+ message: `Project "${projectId}" does not exist`
1274
+ });
1275
+ }
1276
+ // Get the template content (this would normally fetch from the templates list)
1277
+ const templates = await getAvailableTemplates();
1278
+ const template = templates.find(t => t.id === templateId);
1279
+ if (!template) {
1280
+ return res.status(404).json({
1281
+ error: 'Template not found',
1282
+ message: `Template "${templateId}" does not exist`
1283
+ });
1284
+ }
1285
+ // Apply customizations to template content
1286
+ let content = template.content;
1287
+ // Replace placeholders with customizations
1288
+ for (const [key, value] of Object.entries(customizations)) {
1289
+ const placeholder = `[${key}]`;
1290
+ content = content.replace(new RegExp(placeholder.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'g'), value);
1291
+ }
1292
+ // Ensure .taskmaster/docs directory exists
1293
+ const docsDir = path.join(projectPath, '.taskmaster', 'docs');
1294
+ try {
1295
+ await fsPromises.mkdir(docsDir, { recursive: true });
1296
+ }
1297
+ catch (error) {
1298
+ console.error('Failed to create docs directory:', error);
1299
+ }
1300
+ const filePath = path.join(docsDir, fileName);
1301
+ // Write the template content to the file
1302
+ try {
1303
+ await fsPromises.writeFile(filePath, content, 'utf8');
1304
+ res.json({
1305
+ projectId,
1306
+ projectPath,
1307
+ templateId,
1308
+ templateName: template.name,
1309
+ fileName,
1310
+ filePath: filePath,
1311
+ message: 'PRD template applied successfully',
1312
+ timestamp: new Date().toISOString()
1313
+ });
1314
+ }
1315
+ catch (writeError) {
1316
+ console.error('Failed to write PRD template:', writeError);
1317
+ return res.status(500).json({
1318
+ error: 'Failed to write PRD template',
1319
+ message: writeError.message
1320
+ });
1321
+ }
1322
+ }
1323
+ catch (error) {
1324
+ console.error('Apply template error:', error);
1325
+ res.status(500).json({
1326
+ error: 'Failed to apply PRD template',
1327
+ message: error.message
1328
+ });
1329
+ }
1330
+ });
1331
+ // Helper function to get available templates
1332
+ async function getAvailableTemplates() {
1333
+ // This could be extended to read from files or database
1334
+ return [
1335
+ {
1336
+ id: 'web-app',
1337
+ name: 'Web Application',
1338
+ description: 'Template for web application projects',
1339
+ category: 'web',
1340
+ content: `# Product Requirements Document - Web Application
1341
+
1342
+ ## Overview
1343
+ **Product Name:** [Your App Name]
1344
+ **Version:** 1.0
1345
+ **Date:** ${new Date().toISOString().split('T')[0]}
1346
+ **Author:** [Your Name]
1347
+
1348
+ ## Executive Summary
1349
+ Brief description of what this web application will do and why it's needed.
1350
+
1351
+ ## User Stories
1352
+ 1. As a user, I want [feature] so I can [benefit]
1353
+ 2. As a user, I want [feature] so I can [benefit]
1354
+ 3. As a user, I want [feature] so I can [benefit]
1355
+
1356
+ ## Technical Requirements
1357
+ - Frontend framework
1358
+ - Backend services
1359
+ - Database requirements
1360
+ - Security considerations
1361
+
1362
+ ## Success Metrics
1363
+ - User engagement metrics
1364
+ - Performance benchmarks
1365
+ - Business objectives`
1366
+ },
1367
+ // Add other templates here if needed
1368
+ ];
1369
+ }
1370
+ return router;
1371
+ }
1372
+ //# sourceMappingURL=taskmaster.routes.js.map