@piecemaker-legal/piecemaker 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1424) hide show
  1. package/LICENSE +718 -0
  2. package/README.md +80 -0
  3. package/dist/Mistral-Icon-Gradient-RGB.svg +12 -0
  4. package/dist/api-docs.html +901 -0
  5. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  6. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  7. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  8. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  9. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  10. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  11. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  12. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  13. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  14. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  15. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  16. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  17. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  18. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  19. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  20. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  21. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  22. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  23. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  24. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  25. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  26. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  27. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  28. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  29. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  30. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  31. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  32. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  33. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  34. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  35. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  36. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  37. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  38. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  39. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  40. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  41. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  42. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  43. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  44. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  45. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  46. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  47. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  48. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  49. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  50. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  51. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  52. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  53. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  54. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  55. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  56. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  57. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  58. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  59. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  60. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  61. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  62. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  63. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  64. package/dist/assets/abnfDiagram-N423BO3Z-DjEx6DRO.js +1 -0
  65. package/dist/assets/arc-DYt0oU_6.js +1 -0
  66. package/dist/assets/architectureDiagram-T3A2C74G-Dn6DhYDe.js +36 -0
  67. package/dist/assets/blockDiagram-VBNYF7ZC-CsvhTLZi.js +132 -0
  68. package/dist/assets/c4Diagram-5PPSVZJV-BuPnjHm6.js +10 -0
  69. package/dist/assets/channel-Czt0N91A.js +1 -0
  70. package/dist/assets/chunk-2GRJ4B5K-BZJJc1-J.js +1 -0
  71. package/dist/assets/chunk-2Q5K7J3B-6stdrDbe.js +1 -0
  72. package/dist/assets/chunk-5RXB4S5H-D5UwN5cg.js +231 -0
  73. package/dist/assets/chunk-5VM5RSS4-BDB8AQ_I.js +15 -0
  74. package/dist/assets/chunk-6Q2QTUOP-RhjQ-NDz.js +88 -0
  75. package/dist/assets/chunk-GF5L2VYU-CJuiA7R4.js +206 -0
  76. package/dist/assets/chunk-JWPE2WC7-DjFkIZqh.js +1 -0
  77. package/dist/assets/chunk-KBJHAD2P-BeSQsoqv.js +1 -0
  78. package/dist/assets/chunk-RYQCIY6F-CPgwsb0o.js +1 -0
  79. package/dist/assets/chunk-XXDRQBXY-CMMVEsX3.js +1 -0
  80. package/dist/assets/classDiagram-JCYQIIEL-BrnQyrwR.js +1 -0
  81. package/dist/assets/classDiagram-v2-OCEON4UE-BrnQyrwR.js +1 -0
  82. package/dist/assets/cose-bilkent-JH36ORCC-XAdYMfi5.js +1 -0
  83. package/dist/assets/cynefin-VYW2F7L2-d2GpDBn-.js +178 -0
  84. package/dist/assets/cynefinDiagram-MW4NZA55-CGtqUrU1.js +62 -0
  85. package/dist/assets/cytoscape.esm-C10L9Icf.js +331 -0
  86. package/dist/assets/dagre-VZM6K2ZE-BxujKIsf.js +4 -0
  87. package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  88. package/dist/assets/diagram-7IWD3JNH-CJn9hobL.js +30 -0
  89. package/dist/assets/diagram-B4RE2ZJO-DF0Cnjzz.js +3 -0
  90. package/dist/assets/diagram-LBJQPF4R-Bq4d3NfR.js +24 -0
  91. package/dist/assets/diagram-Q27KOJAE-DDdfoXt-.js +24 -0
  92. package/dist/assets/diagram-UB23O5K3-TSFk7FuJ.js +41 -0
  93. package/dist/assets/ebnfDiagram-BXEA7PRR-DRvm2Wy9.js +1 -0
  94. package/dist/assets/erDiagram-JOGREHBK-BmdN66-A.js +85 -0
  95. package/dist/assets/flowDiagram-UKHOOZJN-Dsp5LwJz.js +156 -0
  96. package/dist/assets/ganttDiagram-PKOTCBZU-CYfCQ4Yi.js +292 -0
  97. package/dist/assets/gitGraphDiagram-DS77QQ5N-DEzmuv8v.js +106 -0
  98. package/dist/assets/graph-Cx-EqisW.js +1 -0
  99. package/dist/assets/index-CqFxV_pT.css +32 -0
  100. package/dist/assets/index-dWwHeqcq.js +4989 -0
  101. package/dist/assets/infoDiagram-6WML65LV-B1EfV5Bm.js +2 -0
  102. package/dist/assets/init-Gi6I4Gst.js +1 -0
  103. package/dist/assets/ishikawaDiagram-WSZJBQD7-OuQJfUii.js +70 -0
  104. package/dist/assets/journeyDiagram-NVQOT4AX-DHIilb_4.js +139 -0
  105. package/dist/assets/kanban-definition-27J2QSJJ-D4CvKWBP.js +89 -0
  106. package/dist/assets/layout-D6BstSzF.js +1 -0
  107. package/dist/assets/linear-i_Nzyzap.js +1 -0
  108. package/dist/assets/map-CV9uif0g.js +1 -0
  109. package/dist/assets/mermaid.core-DbSHejzG.js +312 -0
  110. package/dist/assets/mindmap-definition-FAOFIHXS-DqhC-BPZ.js +96 -0
  111. package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  112. package/dist/assets/pegDiagram-VL7TDLO6-pBqvOEvm.js +1 -0
  113. package/dist/assets/pieDiagram-7S7Q4E2Y-BH53iuaz.js +39 -0
  114. package/dist/assets/quadrantDiagram-CIZ2JOQS-CvW9ldJo.js +7 -0
  115. package/dist/assets/railroadDiagram-AXF67PYL-CERi66oR.js +1 -0
  116. package/dist/assets/requirementDiagram-LRYGKXZP-DbcP4MGI.js +84 -0
  117. package/dist/assets/sankeyDiagram-W5VNT64P-DO9bPHWO.js +40 -0
  118. package/dist/assets/sequenceDiagram-SI44F4Z6-D3zd2eJS.js +162 -0
  119. package/dist/assets/server.browser-CtX3Hdl5.js +27 -0
  120. package/dist/assets/sizeCapture-X5ZJPWSS-mcEXJiem.js +1 -0
  121. package/dist/assets/stateDiagram-OKZ733FA-DMqQgpiD.js +1 -0
  122. package/dist/assets/stateDiagram-v2-UEYNNEHI-DprF_P9y.js +1 -0
  123. package/dist/assets/swimlanes-SLNWSIFB-Cb8rIhB1.js +2 -0
  124. package/dist/assets/swimlanesDiagram-ULZ7WXOC-C6NVYMho.js +8 -0
  125. package/dist/assets/timeline-definition-Z64GVDOM-BQ4r_QsK.js +120 -0
  126. package/dist/assets/vendor-codemirror-CYrSt7-U.js +41 -0
  127. package/dist/assets/vendor-react-BGZc9oRE.js +59 -0
  128. package/dist/assets/vendor-xterm-CS4rQ5Mr.js +66 -0
  129. package/dist/assets/vennDiagram-T6HMQDX7-BEkKGTum.js +34 -0
  130. package/dist/assets/wardleyDiagram-T6FBY63Y-kJwmgH-h.js +78 -0
  131. package/dist/assets/xychartDiagram-ELKLHX3M-CSJRTKCr.js +7 -0
  132. package/dist/clear-cache.html +85 -0
  133. package/dist/convert-icons.md +53 -0
  134. package/dist/favicon.png +0 -0
  135. package/dist/favicon.svg +9 -0
  136. package/dist/generate-icons.js +49 -0
  137. package/dist/icons/claude-ai-icon.svg +1 -0
  138. package/dist/icons/codex-white.svg +3 -0
  139. package/dist/icons/codex.svg +3 -0
  140. package/dist/icons/cursor-white.svg +12 -0
  141. package/dist/icons/cursor.svg +1 -0
  142. package/dist/icons/icon-128x128.png +0 -0
  143. package/dist/icons/icon-128x128.svg +12 -0
  144. package/dist/icons/icon-144x144.png +0 -0
  145. package/dist/icons/icon-144x144.svg +12 -0
  146. package/dist/icons/icon-152x152.png +0 -0
  147. package/dist/icons/icon-152x152.svg +12 -0
  148. package/dist/icons/icon-192x192.png +0 -0
  149. package/dist/icons/icon-192x192.svg +12 -0
  150. package/dist/icons/icon-384x384.png +0 -0
  151. package/dist/icons/icon-384x384.svg +12 -0
  152. package/dist/icons/icon-512x512.png +0 -0
  153. package/dist/icons/icon-512x512.svg +12 -0
  154. package/dist/icons/icon-72x72.png +0 -0
  155. package/dist/icons/icon-72x72.svg +12 -0
  156. package/dist/icons/icon-96x96.png +0 -0
  157. package/dist/icons/icon-96x96.svg +12 -0
  158. package/dist/icons/icon-template.svg +12 -0
  159. package/dist/index.html +60 -0
  160. package/dist/logo-128.png +0 -0
  161. package/dist/logo-256.png +0 -0
  162. package/dist/logo-32.png +0 -0
  163. package/dist/logo-512.png +0 -0
  164. package/dist/logo-64.png +0 -0
  165. package/dist/logo.svg +17 -0
  166. package/dist/manifest.json +61 -0
  167. package/dist/screenshots/cli-selection.png +0 -0
  168. package/dist/screenshots/desktop-main.png +0 -0
  169. package/dist/screenshots/mobile-chat.png +0 -0
  170. package/dist/screenshots/tools-modal.png +0 -0
  171. package/dist/sw.js +125 -0
  172. package/dist-server/server/index.js +345 -0
  173. package/dist-server/server/index.js.map +1 -0
  174. package/dist-server/server/load-env.js +46 -0
  175. package/dist-server/server/load-env.js.map +1 -0
  176. package/dist-server/server/modules/agent/agent.module.js +38 -0
  177. package/dist-server/server/modules/agent/agent.module.js.map +1 -0
  178. package/dist-server/server/modules/agent/agent.routes.js +1161 -0
  179. package/dist-server/server/modules/agent/agent.routes.js.map +1 -0
  180. package/dist-server/server/modules/agent/index.js +3 -0
  181. package/dist-server/server/modules/agent/index.js.map +1 -0
  182. package/dist-server/server/modules/agent/tests/agent.routes.test.js +176 -0
  183. package/dist-server/server/modules/agent/tests/agent.routes.test.js.map +1 -0
  184. package/dist-server/server/modules/assets/assets.routes.js +130 -0
  185. package/dist-server/server/modules/assets/assets.routes.js.map +1 -0
  186. package/dist-server/server/modules/assets/index.js +4 -0
  187. package/dist-server/server/modules/assets/index.js.map +1 -0
  188. package/dist-server/server/modules/assets/services/image-assets.service.js +95 -0
  189. package/dist-server/server/modules/assets/services/image-assets.service.js.map +1 -0
  190. package/dist-server/server/modules/assets/tests/image-assets.service.test.js +56 -0
  191. package/dist-server/server/modules/assets/tests/image-assets.service.test.js.map +1 -0
  192. package/dist-server/server/modules/auth/auth.middleware.js +133 -0
  193. package/dist-server/server/modules/auth/auth.middleware.js.map +1 -0
  194. package/dist-server/server/modules/auth/auth.module.js +29 -0
  195. package/dist-server/server/modules/auth/auth.module.js.map +1 -0
  196. package/dist-server/server/modules/auth/auth.routes.js +45 -0
  197. package/dist-server/server/modules/auth/auth.routes.js.map +1 -0
  198. package/dist-server/server/modules/auth/auth.service.js +113 -0
  199. package/dist-server/server/modules/auth/auth.service.js.map +1 -0
  200. package/dist-server/server/modules/auth/index.js +9 -0
  201. package/dist-server/server/modules/auth/index.js.map +1 -0
  202. package/dist-server/server/modules/auth/tests/auth.service.test.js +80 -0
  203. package/dist-server/server/modules/auth/tests/auth.service.test.js.map +1 -0
  204. package/dist-server/server/modules/browser-use/browser-use-mcp.js +352 -0
  205. package/dist-server/server/modules/browser-use/browser-use-mcp.js.map +1 -0
  206. package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js +107 -0
  207. package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js.map +1 -0
  208. package/dist-server/server/modules/browser-use/browser-use-runtime.js +10 -0
  209. package/dist-server/server/modules/browser-use/browser-use-runtime.js.map +1 -0
  210. package/dist-server/server/modules/browser-use/browser-use.routes.js +93 -0
  211. package/dist-server/server/modules/browser-use/browser-use.routes.js.map +1 -0
  212. package/dist-server/server/modules/browser-use/browser-use.service.js +686 -0
  213. package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -0
  214. package/dist-server/server/modules/browser-use/index.js +11 -0
  215. package/dist-server/server/modules/browser-use/index.js.map +1 -0
  216. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js +8 -0
  217. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js.map +1 -0
  218. package/dist-server/server/modules/cli/cli.js +17 -0
  219. package/dist-server/server/modules/cli/cli.js.map +1 -0
  220. package/dist-server/server/modules/cli/cli.module.js +93 -0
  221. package/dist-server/server/modules/cli/cli.module.js.map +1 -0
  222. package/dist-server/server/modules/cli/cli.service.js +230 -0
  223. package/dist-server/server/modules/cli/cli.service.js.map +1 -0
  224. package/dist-server/server/modules/cli/index.js +3 -0
  225. package/dist-server/server/modules/cli/index.js.map +1 -0
  226. package/dist-server/server/modules/cli/pwa-launcher.js +116 -0
  227. package/dist-server/server/modules/cli/pwa-launcher.js.map +1 -0
  228. package/dist-server/server/modules/cli/sandbox.service.js +332 -0
  229. package/dist-server/server/modules/cli/sandbox.service.js.map +1 -0
  230. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +154 -0
  231. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js.map +1 -0
  232. package/dist-server/server/modules/cli/tests/cli.service.test.js +91 -0
  233. package/dist-server/server/modules/cli/tests/cli.service.test.js.map +1 -0
  234. package/dist-server/server/modules/cli/tests/sandbox.service.test.js +55 -0
  235. package/dist-server/server/modules/cli/tests/sandbox.service.test.js.map +1 -0
  236. package/dist-server/server/modules/commands/commands.module.js +20 -0
  237. package/dist-server/server/modules/commands/commands.module.js.map +1 -0
  238. package/dist-server/server/modules/commands/commands.routes.js +498 -0
  239. package/dist-server/server/modules/commands/commands.routes.js.map +1 -0
  240. package/dist-server/server/modules/commands/index.js +3 -0
  241. package/dist-server/server/modules/commands/index.js.map +1 -0
  242. package/dist-server/server/modules/commands/tests/commands.test.js +91 -0
  243. package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -0
  244. package/dist-server/server/modules/database/connection.js +125 -0
  245. package/dist-server/server/modules/database/connection.js.map +1 -0
  246. package/dist-server/server/modules/database/index.js +23 -0
  247. package/dist-server/server/modules/database/index.js.map +1 -0
  248. package/dist-server/server/modules/database/init-db.js +18 -0
  249. package/dist-server/server/modules/database/init-db.js.map +1 -0
  250. package/dist-server/server/modules/database/migrations.js +465 -0
  251. package/dist-server/server/modules/database/migrations.js.map +1 -0
  252. package/dist-server/server/modules/database/repositories/api-keys.js +72 -0
  253. package/dist-server/server/modules/database/repositories/api-keys.js.map +1 -0
  254. package/dist-server/server/modules/database/repositories/app-config.js +47 -0
  255. package/dist-server/server/modules/database/repositories/app-config.js.map +1 -0
  256. package/dist-server/server/modules/database/repositories/credentials.js +68 -0
  257. package/dist-server/server/modules/database/repositories/credentials.js.map +1 -0
  258. package/dist-server/server/modules/database/repositories/github-tokens.js +54 -0
  259. package/dist-server/server/modules/database/repositories/github-tokens.js.map +1 -0
  260. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js +100 -0
  261. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js.map +1 -0
  262. package/dist-server/server/modules/database/repositories/notification-preferences.js +82 -0
  263. package/dist-server/server/modules/database/repositories/notification-preferences.js.map +1 -0
  264. package/dist-server/server/modules/database/repositories/projects.db.js +172 -0
  265. package/dist-server/server/modules/database/repositories/projects.db.js.map +1 -0
  266. package/dist-server/server/modules/database/repositories/provider-models.js +112 -0
  267. package/dist-server/server/modules/database/repositories/provider-models.js.map +1 -0
  268. package/dist-server/server/modules/database/repositories/push-subscriptions.js +49 -0
  269. package/dist-server/server/modules/database/repositories/push-subscriptions.js.map +1 -0
  270. package/dist-server/server/modules/database/repositories/scan-state.db.js +31 -0
  271. package/dist-server/server/modules/database/repositories/scan-state.db.js.map +1 -0
  272. package/dist-server/server/modules/database/repositories/scheduled-messages.db.js +71 -0
  273. package/dist-server/server/modules/database/repositories/scheduled-messages.db.js.map +1 -0
  274. package/dist-server/server/modules/database/repositories/session-drafts.db.js +105 -0
  275. package/dist-server/server/modules/database/repositories/session-drafts.db.js.map +1 -0
  276. package/dist-server/server/modules/database/repositories/sessions.db.js +507 -0
  277. package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -0
  278. package/dist-server/server/modules/database/repositories/user-preferences.db.js +65 -0
  279. package/dist-server/server/modules/database/repositories/user-preferences.db.js.map +1 -0
  280. package/dist-server/server/modules/database/repositories/users.js +88 -0
  281. package/dist-server/server/modules/database/repositories/users.js.map +1 -0
  282. package/dist-server/server/modules/database/repositories/vapid-keys.js +38 -0
  283. package/dist-server/server/modules/database/repositories/vapid-keys.js.map +1 -0
  284. package/dist-server/server/modules/database/schema.js +291 -0
  285. package/dist-server/server/modules/database/schema.js.map +1 -0
  286. package/dist-server/server/modules/database/tests/projects.db.integration.test.js +64 -0
  287. package/dist-server/server/modules/database/tests/projects.db.integration.test.js.map +1 -0
  288. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +102 -0
  289. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js.map +1 -0
  290. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +79 -0
  291. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -0
  292. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +93 -0
  293. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -0
  294. package/dist-server/server/modules/database/tests/user-preferences.db.integration.test.js +105 -0
  295. package/dist-server/server/modules/database/tests/user-preferences.db.integration.test.js.map +1 -0
  296. package/dist-server/server/modules/file-tree/file-tree.module.js +95 -0
  297. package/dist-server/server/modules/file-tree/file-tree.module.js.map +1 -0
  298. package/dist-server/server/modules/file-tree/file-tree.routes.js +208 -0
  299. package/dist-server/server/modules/file-tree/file-tree.routes.js.map +1 -0
  300. package/dist-server/server/modules/file-tree/file-tree.service.js +584 -0
  301. package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -0
  302. package/dist-server/server/modules/file-tree/index.js +3 -0
  303. package/dist-server/server/modules/file-tree/index.js.map +1 -0
  304. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js +123 -0
  305. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js.map +1 -0
  306. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +311 -0
  307. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -0
  308. package/dist-server/server/modules/git/git-branch.service.js +15 -0
  309. package/dist-server/server/modules/git/git-branch.service.js.map +1 -0
  310. package/dist-server/server/modules/git/git-parsing.service.js +61 -0
  311. package/dist-server/server/modules/git/git-parsing.service.js.map +1 -0
  312. package/dist-server/server/modules/git/git.module.js +14 -0
  313. package/dist-server/server/modules/git/git.module.js.map +1 -0
  314. package/dist-server/server/modules/git/git.routes.js +1347 -0
  315. package/dist-server/server/modules/git/git.routes.js.map +1 -0
  316. package/dist-server/server/modules/git/index.js +3 -0
  317. package/dist-server/server/modules/git/index.js.map +1 -0
  318. package/dist-server/server/modules/git/tests/git-branch.service.test.js +52 -0
  319. package/dist-server/server/modules/git/tests/git-branch.service.test.js.map +1 -0
  320. package/dist-server/server/modules/git/tests/git-init.routes.test.js +132 -0
  321. package/dist-server/server/modules/git/tests/git-init.routes.test.js.map +1 -0
  322. package/dist-server/server/modules/git/tests/git.test.js +80 -0
  323. package/dist-server/server/modules/git/tests/git.test.js.map +1 -0
  324. package/dist-server/server/modules/notifications/index.js +20 -0
  325. package/dist-server/server/modules/notifications/index.js.map +1 -0
  326. package/dist-server/server/modules/notifications/notifications.routes.js +115 -0
  327. package/dist-server/server/modules/notifications/notifications.routes.js.map +1 -0
  328. package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js +97 -0
  329. package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js.map +1 -0
  330. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +249 -0
  331. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js.map +1 -0
  332. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js +44 -0
  333. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js.map +1 -0
  334. package/dist-server/server/modules/notifications/vapid-keys.service.js +28 -0
  335. package/dist-server/server/modules/notifications/vapid-keys.service.js.map +1 -0
  336. package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js +79 -0
  337. package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js.map +1 -0
  338. package/dist-server/server/modules/plugins/index.js +9 -0
  339. package/dist-server/server/modules/plugins/index.js.map +1 -0
  340. package/dist-server/server/modules/plugins/plugin-process.service.js +191 -0
  341. package/dist-server/server/modules/plugins/plugin-process.service.js.map +1 -0
  342. package/dist-server/server/modules/plugins/plugin-registry.service.js +415 -0
  343. package/dist-server/server/modules/plugins/plugin-registry.service.js.map +1 -0
  344. package/dist-server/server/modules/plugins/plugins.module.js +30 -0
  345. package/dist-server/server/modules/plugins/plugins.module.js.map +1 -0
  346. package/dist-server/server/modules/plugins/plugins.routes.js +70 -0
  347. package/dist-server/server/modules/plugins/plugins.routes.js.map +1 -0
  348. package/dist-server/server/modules/plugins/plugins.service.js +123 -0
  349. package/dist-server/server/modules/plugins/plugins.service.js.map +1 -0
  350. package/dist-server/server/modules/plugins/tests/plugins.service.test.js +28 -0
  351. package/dist-server/server/modules/plugins/tests/plugins.service.test.js.map +1 -0
  352. package/dist-server/server/modules/projects/index.js +9 -0
  353. package/dist-server/server/modules/projects/index.js.map +1 -0
  354. package/dist-server/server/modules/projects/projects.routes.js +205 -0
  355. package/dist-server/server/modules/projects/projects.routes.js.map +1 -0
  356. package/dist-server/server/modules/projects/services/project-clone.service.js +220 -0
  357. package/dist-server/server/modules/projects/services/project-clone.service.js.map +1 -0
  358. package/dist-server/server/modules/projects/services/project-delete.service.js +89 -0
  359. package/dist-server/server/modules/projects/services/project-delete.service.js.map +1 -0
  360. package/dist-server/server/modules/projects/services/project-management.service.js +90 -0
  361. package/dist-server/server/modules/projects/services/project-management.service.js.map +1 -0
  362. package/dist-server/server/modules/projects/services/project-star.service.js +60 -0
  363. package/dist-server/server/modules/projects/services/project-star.service.js.map +1 -0
  364. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js +167 -0
  365. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js.map +1 -0
  366. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js +188 -0
  367. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js.map +1 -0
  368. package/dist-server/server/modules/projects/tests/project-clone.service.test.js +126 -0
  369. package/dist-server/server/modules/projects/tests/project-clone.service.test.js.map +1 -0
  370. package/dist-server/server/modules/projects/tests/project-management.service.test.js +85 -0
  371. package/dist-server/server/modules/projects/tests/project-management.service.test.js.map +1 -0
  372. package/dist-server/server/modules/projects/tests/project-star.service.test.js +95 -0
  373. package/dist-server/server/modules/projects/tests/project-star.service.test.js.map +1 -0
  374. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js +87 -0
  375. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js.map +1 -0
  376. package/dist-server/server/modules/providers/index.js +12 -0
  377. package/dist-server/server/modules/providers/index.js.map +1 -0
  378. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +151 -0
  379. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -0
  380. package/dist-server/server/modules/providers/list/claude/claude-fork.provider.js +46 -0
  381. package/dist-server/server/modules/providers/list/claude/claude-fork.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 +267 -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 +1058 -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 +924 -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 +23 -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 +204 -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-fork.provider.js +32 -0
  401. package/dist-server/server/modules/providers/list/codex/codex-fork.provider.js.map +1 -0
  402. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js +107 -0
  403. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js.map +1 -0
  404. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +109 -0
  405. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -0
  406. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js +498 -0
  407. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -0
  408. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +153 -0
  409. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -0
  410. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +1955 -0
  411. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -0
  412. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js +62 -0
  413. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js.map +1 -0
  414. package/dist-server/server/modules/providers/list/codex/codex.provider.js +23 -0
  415. package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -0
  416. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +118 -0
  417. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -0
  418. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js +80 -0
  419. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js.map +1 -0
  420. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +100 -0
  421. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -0
  422. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js +305 -0
  423. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js.map +1 -0
  424. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js +111 -0
  425. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -0
  426. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +566 -0
  427. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -0
  428. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js +35 -0
  429. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js.map +1 -0
  430. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +21 -0
  431. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -0
  432. package/dist-server/server/modules/providers/list/mistral/mistral-auth.provider.js +147 -0
  433. package/dist-server/server/modules/providers/list/mistral/mistral-auth.provider.js.map +1 -0
  434. package/dist-server/server/modules/providers/list/mistral/mistral-mcp.provider.js +15 -0
  435. package/dist-server/server/modules/providers/list/mistral/mistral-mcp.provider.js.map +1 -0
  436. package/dist-server/server/modules/providers/list/mistral/mistral-models.provider.js +69 -0
  437. package/dist-server/server/modules/providers/list/mistral/mistral-models.provider.js.map +1 -0
  438. package/dist-server/server/modules/providers/list/mistral/mistral-runtime.provider.js +326 -0
  439. package/dist-server/server/modules/providers/list/mistral/mistral-runtime.provider.js.map +1 -0
  440. package/dist-server/server/modules/providers/list/mistral/mistral-session-synchronizer.provider.js +12 -0
  441. package/dist-server/server/modules/providers/list/mistral/mistral-session-synchronizer.provider.js.map +1 -0
  442. package/dist-server/server/modules/providers/list/mistral/mistral-sessions.provider.js +180 -0
  443. package/dist-server/server/modules/providers/list/mistral/mistral-sessions.provider.js.map +1 -0
  444. package/dist-server/server/modules/providers/list/mistral/mistral-skills.provider.js +15 -0
  445. package/dist-server/server/modules/providers/list/mistral/mistral-skills.provider.js.map +1 -0
  446. package/dist-server/server/modules/providers/list/mistral/mistral.provider.js +25 -0
  447. package/dist-server/server/modules/providers/list/mistral/mistral.provider.js.map +1 -0
  448. package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js +91 -0
  449. package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js.map +1 -0
  450. package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js +181 -0
  451. package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js.map +1 -0
  452. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +257 -0
  453. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -0
  454. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js +368 -0
  455. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js.map +1 -0
  456. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +225 -0
  457. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js.map +1 -0
  458. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +136 -0
  459. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -0
  460. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +404 -0
  461. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -0
  462. package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js +62 -0
  463. package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js.map +1 -0
  464. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js +21 -0
  465. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js.map +1 -0
  466. package/dist-server/server/modules/providers/provider.registry.js +33 -0
  467. package/dist-server/server/modules/providers/provider.registry.js.map +1 -0
  468. package/dist-server/server/modules/providers/provider.routes.js +676 -0
  469. package/dist-server/server/modules/providers/provider.routes.js.map +1 -0
  470. package/dist-server/server/modules/providers/services/mcp.service.js +84 -0
  471. package/dist-server/server/modules/providers/services/mcp.service.js.map +1 -0
  472. package/dist-server/server/modules/providers/services/provider-auth.service.js +25 -0
  473. package/dist-server/server/modules/providers/services/provider-auth.service.js.map +1 -0
  474. package/dist-server/server/modules/providers/services/provider-capabilities.service.js +94 -0
  475. package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -0
  476. package/dist-server/server/modules/providers/services/provider-models.service.js +289 -0
  477. package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -0
  478. package/dist-server/server/modules/providers/services/provider-runtime.service.js +66 -0
  479. package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -0
  480. package/dist-server/server/modules/providers/services/provider-token-usage.service.js +372 -0
  481. package/dist-server/server/modules/providers/services/provider-token-usage.service.js.map +1 -0
  482. package/dist-server/server/modules/providers/services/session-conversations-search.service.js +974 -0
  483. package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -0
  484. package/dist-server/server/modules/providers/services/session-history-cache.service.js +87 -0
  485. package/dist-server/server/modules/providers/services/session-history-cache.service.js.map +1 -0
  486. package/dist-server/server/modules/providers/services/session-synchronizer.service.js +130 -0
  487. package/dist-server/server/modules/providers/services/session-synchronizer.service.js.map +1 -0
  488. package/dist-server/server/modules/providers/services/sessions-watcher.service.js +214 -0
  489. package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -0
  490. package/dist-server/server/modules/providers/services/sessions.service.js +519 -0
  491. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -0
  492. package/dist-server/server/modules/providers/services/skills.service.js +22 -0
  493. package/dist-server/server/modules/providers/services/skills.service.js.map +1 -0
  494. package/dist-server/server/modules/providers/shared/base/abstract.provider.js +13 -0
  495. package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -0
  496. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js +102 -0
  497. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js.map +1 -0
  498. package/dist-server/server/modules/providers/shared/skills/skills.provider.js +207 -0
  499. package/dist-server/server/modules/providers/shared/skills/skills.provider.js.map +1 -0
  500. package/dist-server/server/modules/providers/tests/claude-auth.test.js +174 -0
  501. package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -0
  502. package/dist-server/server/modules/providers/tests/claude-sessions.test.js +470 -0
  503. package/dist-server/server/modules/providers/tests/claude-sessions.test.js.map +1 -0
  504. package/dist-server/server/modules/providers/tests/claude-subagent-echo.test.js +16 -0
  505. package/dist-server/server/modules/providers/tests/claude-subagent-echo.test.js.map +1 -0
  506. package/dist-server/server/modules/providers/tests/claude-token-budget.test.js +85 -0
  507. package/dist-server/server/modules/providers/tests/claude-token-budget.test.js.map +1 -0
  508. package/dist-server/server/modules/providers/tests/codex-message-editing.test.js +338 -0
  509. package/dist-server/server/modules/providers/tests/codex-message-editing.test.js.map +1 -0
  510. package/dist-server/server/modules/providers/tests/codex-session-fork.test.js +54 -0
  511. package/dist-server/server/modules/providers/tests/codex-session-fork.test.js.map +1 -0
  512. package/dist-server/server/modules/providers/tests/codex-sessions.test.js +491 -0
  513. package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -0
  514. package/dist-server/server/modules/providers/tests/mcp.test.js +291 -0
  515. package/dist-server/server/modules/providers/tests/mcp.test.js.map +1 -0
  516. package/dist-server/server/modules/providers/tests/opencode-models.test.js +103 -0
  517. package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -0
  518. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +424 -0
  519. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -0
  520. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js +205 -0
  521. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js.map +1 -0
  522. package/dist-server/server/modules/providers/tests/provider-models.service.test.js +268 -0
  523. package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -0
  524. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js +126 -0
  525. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js.map +1 -0
  526. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +329 -0
  527. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -0
  528. package/dist-server/server/modules/providers/tests/provider.routes.test.js +161 -0
  529. package/dist-server/server/modules/providers/tests/provider.routes.test.js.map +1 -0
  530. package/dist-server/server/modules/providers/tests/session-fork.test.js +113 -0
  531. package/dist-server/server/modules/providers/tests/session-fork.test.js.map +1 -0
  532. package/dist-server/server/modules/providers/tests/session-history-cache.service.test.js +120 -0
  533. package/dist-server/server/modules/providers/tests/session-history-cache.service.test.js.map +1 -0
  534. package/dist-server/server/modules/providers/tests/session-orphan-prune.test.js +90 -0
  535. package/dist-server/server/modules/providers/tests/session-orphan-prune.test.js.map +1 -0
  536. package/dist-server/server/modules/providers/tests/session-synchronizer-coalescing.test.js +122 -0
  537. package/dist-server/server/modules/providers/tests/session-synchronizer-coalescing.test.js.map +1 -0
  538. package/dist-server/server/modules/providers/tests/sessions-details.test.js +62 -0
  539. package/dist-server/server/modules/providers/tests/sessions-details.test.js.map +1 -0
  540. package/dist-server/server/modules/providers/tests/sessions.service.test.js +131 -0
  541. package/dist-server/server/modules/providers/tests/sessions.service.test.js.map +1 -0
  542. package/dist-server/server/modules/providers/tests/skills.test.js +398 -0
  543. package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -0
  544. package/dist-server/server/modules/scheduled-messages/index.js +5 -0
  545. package/dist-server/server/modules/scheduled-messages/index.js.map +1 -0
  546. package/dist-server/server/modules/scheduled-messages/scheduled-messages.routes.js +47 -0
  547. package/dist-server/server/modules/scheduled-messages/scheduled-messages.routes.js.map +1 -0
  548. package/dist-server/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.js +163 -0
  549. package/dist-server/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.js.map +1 -0
  550. package/dist-server/server/modules/scheduled-messages/services/scheduled-messages.service.js +95 -0
  551. package/dist-server/server/modules/scheduled-messages/services/scheduled-messages.service.js.map +1 -0
  552. package/dist-server/server/modules/scheduled-messages/tests/scheduled-messages.test.js +255 -0
  553. package/dist-server/server/modules/scheduled-messages/tests/scheduled-messages.test.js.map +1 -0
  554. package/dist-server/server/modules/settings/index.js +3 -0
  555. package/dist-server/server/modules/settings/index.js.map +1 -0
  556. package/dist-server/server/modules/settings/settings.module.js +35 -0
  557. package/dist-server/server/modules/settings/settings.module.js.map +1 -0
  558. package/dist-server/server/modules/settings/settings.routes.js +34 -0
  559. package/dist-server/server/modules/settings/settings.routes.js.map +1 -0
  560. package/dist-server/server/modules/settings/settings.service.js +116 -0
  561. package/dist-server/server/modules/settings/settings.service.js.map +1 -0
  562. package/dist-server/server/modules/settings/tests/settings.service.test.js +48 -0
  563. package/dist-server/server/modules/settings/tests/settings.service.test.js.map +1 -0
  564. package/dist-server/server/modules/system/index.js +3 -0
  565. package/dist-server/server/modules/system/index.js.map +1 -0
  566. package/dist-server/server/modules/system/system.module.js +44 -0
  567. package/dist-server/server/modules/system/system.module.js.map +1 -0
  568. package/dist-server/server/modules/system/system.routes.js +16 -0
  569. package/dist-server/server/modules/system/system.routes.js.map +1 -0
  570. package/dist-server/server/modules/system/system.service.js +45 -0
  571. package/dist-server/server/modules/system/system.service.js.map +1 -0
  572. package/dist-server/server/modules/system/tests/system.service.test.js +100 -0
  573. package/dist-server/server/modules/system/tests/system.service.test.js.map +1 -0
  574. package/dist-server/server/modules/taskmaster/index.js +3 -0
  575. package/dist-server/server/modules/taskmaster/index.js.map +1 -0
  576. package/dist-server/server/modules/taskmaster/taskmaster.module.js +20 -0
  577. package/dist-server/server/modules/taskmaster/taskmaster.module.js.map +1 -0
  578. package/dist-server/server/modules/taskmaster/taskmaster.routes.js +1372 -0
  579. package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -0
  580. package/dist-server/server/modules/taskmaster/taskmaster.service.js +107 -0
  581. package/dist-server/server/modules/taskmaster/taskmaster.service.js.map +1 -0
  582. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js +180 -0
  583. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js.map +1 -0
  584. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js +85 -0
  585. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js.map +1 -0
  586. package/dist-server/server/modules/user/index.js +3 -0
  587. package/dist-server/server/modules/user/index.js.map +1 -0
  588. package/dist-server/server/modules/user/tests/user.service.test.js +123 -0
  589. package/dist-server/server/modules/user/tests/user.service.test.js.map +1 -0
  590. package/dist-server/server/modules/user/user.module.js +56 -0
  591. package/dist-server/server/modules/user/user.module.js.map +1 -0
  592. package/dist-server/server/modules/user/user.routes.js +88 -0
  593. package/dist-server/server/modules/user/user.routes.js.map +1 -0
  594. package/dist-server/server/modules/user/user.service.js +134 -0
  595. package/dist-server/server/modules/user/user.service.js.map +1 -0
  596. package/dist-server/server/modules/voice/index.js +3 -0
  597. package/dist-server/server/modules/voice/index.js.map +1 -0
  598. package/dist-server/server/modules/voice/tests/voice.service.test.js +87 -0
  599. package/dist-server/server/modules/voice/tests/voice.service.test.js.map +1 -0
  600. package/dist-server/server/modules/voice/voice.module.js +44 -0
  601. package/dist-server/server/modules/voice/voice.module.js.map +1 -0
  602. package/dist-server/server/modules/voice/voice.routes.js +87 -0
  603. package/dist-server/server/modules/voice/voice.routes.js.map +1 -0
  604. package/dist-server/server/modules/voice/voice.service.js +148 -0
  605. package/dist-server/server/modules/voice/voice.service.js.map +1 -0
  606. package/dist-server/server/modules/websocket/index.js +11 -0
  607. package/dist-server/server/modules/websocket/index.js.map +1 -0
  608. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js +232 -0
  609. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js.map +1 -0
  610. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +135 -0
  611. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js.map +1 -0
  612. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +467 -0
  613. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -0
  614. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js +52 -0
  615. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js.map +1 -0
  616. package/dist-server/server/modules/websocket/services/session-upsert-broadcast.service.js +94 -0
  617. package/dist-server/server/modules/websocket/services/session-upsert-broadcast.service.js.map +1 -0
  618. package/dist-server/server/modules/websocket/services/shell-websocket.service.js +472 -0
  619. package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -0
  620. package/dist-server/server/modules/websocket/services/websocket-auth.service.js +36 -0
  621. package/dist-server/server/modules/websocket/services/websocket-auth.service.js.map +1 -0
  622. package/dist-server/server/modules/websocket/services/websocket-server.service.js +90 -0
  623. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -0
  624. package/dist-server/server/modules/websocket/services/websocket-state.service.js +14 -0
  625. package/dist-server/server/modules/websocket/services/websocket-state.service.js.map +1 -0
  626. package/dist-server/server/modules/websocket/services/websocket-writer.service.js +32 -0
  627. package/dist-server/server/modules/websocket/services/websocket-writer.service.js.map +1 -0
  628. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js +40 -0
  629. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js.map +1 -0
  630. package/dist-server/server/modules/websocket/tests/chat-edit-send.test.js +263 -0
  631. package/dist-server/server/modules/websocket/tests/chat-edit-send.test.js.map +1 -0
  632. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js +275 -0
  633. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js.map +1 -0
  634. package/dist-server/server/modules/websocket/tests/session-upsert-broadcast.test.js +106 -0
  635. package/dist-server/server/modules/websocket/tests/session-upsert-broadcast.test.js.map +1 -0
  636. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js +177 -0
  637. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js.map +1 -0
  638. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js +61 -0
  639. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js.map +1 -0
  640. package/dist-server/server/modules/worktrees/index.js +3 -0
  641. package/dist-server/server/modules/worktrees/index.js.map +1 -0
  642. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js +37 -0
  643. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js.map +1 -0
  644. package/dist-server/server/modules/worktrees/services/worktree-create.service.js +67 -0
  645. package/dist-server/server/modules/worktrees/services/worktree-create.service.js.map +1 -0
  646. package/dist-server/server/modules/worktrees/services/worktree-git.service.js +172 -0
  647. package/dist-server/server/modules/worktrees/services/worktree-git.service.js.map +1 -0
  648. package/dist-server/server/modules/worktrees/services/worktree-list.service.js +91 -0
  649. package/dist-server/server/modules/worktrees/services/worktree-list.service.js.map +1 -0
  650. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js +118 -0
  651. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js.map +1 -0
  652. package/dist-server/server/modules/worktrees/services/worktree-open.service.js +58 -0
  653. package/dist-server/server/modules/worktrees/services/worktree-open.service.js.map +1 -0
  654. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +65 -0
  655. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js.map +1 -0
  656. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js +58 -0
  657. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js.map +1 -0
  658. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js +85 -0
  659. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js.map +1 -0
  660. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js +58 -0
  661. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js.map +1 -0
  662. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js +34 -0
  663. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js.map +1 -0
  664. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js +137 -0
  665. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js.map +1 -0
  666. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js +99 -0
  667. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js.map +1 -0
  668. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js +157 -0
  669. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js.map +1 -0
  670. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js +167 -0
  671. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js.map +1 -0
  672. package/dist-server/server/modules/worktrees/worktrees.module.js +97 -0
  673. package/dist-server/server/modules/worktrees/worktrees.module.js.map +1 -0
  674. package/dist-server/server/modules/worktrees/worktrees.routes.js +84 -0
  675. package/dist-server/server/modules/worktrees/worktrees.routes.js.map +1 -0
  676. package/dist-server/server/piecemaker/activation/claude-mcp.cjs +109 -0
  677. package/dist-server/server/piecemaker/activation/claude-mcp.cjs.map +1 -0
  678. package/dist-server/server/piecemaker/activation/claude-plugins.cjs +60 -0
  679. package/dist-server/server/piecemaker/activation/claude-plugins.cjs.map +1 -0
  680. package/dist-server/server/piecemaker/activation/codex-mcp.cjs +93 -0
  681. package/dist-server/server/piecemaker/activation/codex-mcp.cjs.map +1 -0
  682. package/dist-server/server/piecemaker/activation/errors.cjs +14 -0
  683. package/dist-server/server/piecemaker/activation/errors.cjs.map +1 -0
  684. package/dist-server/server/piecemaker/activation/library.cjs +281 -0
  685. package/dist-server/server/piecemaker/activation/library.cjs.map +1 -0
  686. package/dist-server/server/piecemaker/activation/library.test.js +281 -0
  687. package/dist-server/server/piecemaker/activation/library.test.js.map +1 -0
  688. package/dist-server/server/piecemaker/activation/markdown.cjs +103 -0
  689. package/dist-server/server/piecemaker/activation/markdown.cjs.map +1 -0
  690. package/dist-server/server/piecemaker/activation/paths.cjs +103 -0
  691. package/dist-server/server/piecemaker/activation/paths.cjs.map +1 -0
  692. package/dist-server/server/piecemaker/activation/paths.test.js +91 -0
  693. package/dist-server/server/piecemaker/activation/paths.test.js.map +1 -0
  694. package/dist-server/server/piecemaker/activation/routes.cjs +100 -0
  695. package/dist-server/server/piecemaker/activation/routes.cjs.map +1 -0
  696. package/dist-server/server/piecemaker/activation/routes.test.js +307 -0
  697. package/dist-server/server/piecemaker/activation/routes.test.js.map +1 -0
  698. package/dist-server/server/piecemaker/activation/snapshot.cjs +28 -0
  699. package/dist-server/server/piecemaker/activation/snapshot.cjs.map +1 -0
  700. package/dist-server/server/piecemaker/anonymizer/anonymizer.test.js +282 -0
  701. package/dist-server/server/piecemaker/anonymizer/anonymizer.test.js.map +1 -0
  702. package/dist-server/server/piecemaker/anonymizer/client-config.cjs +224 -0
  703. package/dist-server/server/piecemaker/anonymizer/client-config.cjs.map +1 -0
  704. package/dist-server/server/piecemaker/anonymizer/codex-http.test.js +19 -0
  705. package/dist-server/server/piecemaker/anonymizer/codex-http.test.js.map +1 -0
  706. package/dist-server/server/piecemaker/anonymizer/dictionary.cjs +163 -0
  707. package/dist-server/server/piecemaker/anonymizer/dictionary.cjs.map +1 -0
  708. package/dist-server/server/piecemaker/anonymizer/lifecycle.js +20 -0
  709. package/dist-server/server/piecemaker/anonymizer/lifecycle.js.map +1 -0
  710. package/dist-server/server/piecemaker/anonymizer/lifecycle.test.js +35 -0
  711. package/dist-server/server/piecemaker/anonymizer/lifecycle.test.js.map +1 -0
  712. package/dist-server/server/piecemaker/anonymizer/providers.cjs +236 -0
  713. package/dist-server/server/piecemaker/anonymizer/providers.cjs.map +1 -0
  714. package/dist-server/server/piecemaker/anonymizer/proxy.cjs +338 -0
  715. package/dist-server/server/piecemaker/anonymizer/proxy.cjs.map +1 -0
  716. package/dist-server/server/piecemaker/anonymizer/rewrite.cjs +249 -0
  717. package/dist-server/server/piecemaker/anonymizer/rewrite.cjs.map +1 -0
  718. package/dist-server/server/piecemaker/anonymizer/service.cjs +217 -0
  719. package/dist-server/server/piecemaker/anonymizer/service.cjs.map +1 -0
  720. package/dist-server/server/piecemaker/harness/chat-harness.js +157 -0
  721. package/dist-server/server/piecemaker/harness/chat-harness.js.map +1 -0
  722. package/dist-server/server/piecemaker/harness/chat-harness.test.js +120 -0
  723. package/dist-server/server/piecemaker/harness/chat-harness.test.js.map +1 -0
  724. package/dist-server/server/piecemaker/harness/citation-instructions.js +17 -0
  725. package/dist-server/server/piecemaker/harness/citation-instructions.js.map +1 -0
  726. package/dist-server/server/piecemaker/harness/citation-store.js +72 -0
  727. package/dist-server/server/piecemaker/harness/citation-store.js.map +1 -0
  728. package/dist-server/server/piecemaker/harness/citation-turn.js +211 -0
  729. package/dist-server/server/piecemaker/harness/citation-turn.js.map +1 -0
  730. package/dist-server/server/piecemaker/harness/citation-turn.test.js +144 -0
  731. package/dist-server/server/piecemaker/harness/citation-turn.test.js.map +1 -0
  732. package/dist-server/server/piecemaker/harness/citations.routes.js +16 -0
  733. package/dist-server/server/piecemaker/harness/citations.routes.js.map +1 -0
  734. package/dist-server/server/piecemaker/harness/citations.routes.test.js +68 -0
  735. package/dist-server/server/piecemaker/harness/citations.routes.test.js.map +1 -0
  736. package/dist-server/server/piecemaker/harness/decisions.cjs +298 -0
  737. package/dist-server/server/piecemaker/harness/decisions.cjs.map +1 -0
  738. package/dist-server/server/piecemaker/harness/flux-sse.cjs +108 -0
  739. package/dist-server/server/piecemaker/harness/flux-sse.cjs.map +1 -0
  740. package/dist-server/server/piecemaker/harness/harness.test.js +259 -0
  741. package/dist-server/server/piecemaker/harness/harness.test.js.map +1 -0
  742. package/dist-server/server/piecemaker/harness/index.cjs +100 -0
  743. package/dist-server/server/piecemaker/harness/index.cjs.map +1 -0
  744. package/dist-server/server/piecemaker/harness/proxy-harness.test.js +199 -0
  745. package/dist-server/server/piecemaker/harness/proxy-harness.test.js.map +1 -0
  746. package/dist-server/server/piecemaker/harness/source-passages.js +19 -0
  747. package/dist-server/server/piecemaker/harness/source-passages.js.map +1 -0
  748. package/dist-server/server/piecemaker/harness/verification.cjs +152 -0
  749. package/dist-server/server/piecemaker/harness/verification.cjs.map +1 -0
  750. package/dist-server/server/piecemaker/index.js +46 -0
  751. package/dist-server/server/piecemaker/index.js.map +1 -0
  752. package/dist-server/server/piecemaker/library/index.js +66 -0
  753. package/dist-server/server/piecemaker/library/index.js.map +1 -0
  754. package/dist-server/server/piecemaker/library/marketplace.js +204 -0
  755. package/dist-server/server/piecemaker/library/marketplace.js.map +1 -0
  756. package/dist-server/server/piecemaker/library/migrate-cli.js +13 -0
  757. package/dist-server/server/piecemaker/library/migrate-cli.js.map +1 -0
  758. package/dist-server/server/piecemaker/library/migrate.js +53 -0
  759. package/dist-server/server/piecemaker/library/migrate.js.map +1 -0
  760. package/dist-server/server/piecemaker/library/provider-skills.js +40 -0
  761. package/dist-server/server/piecemaker/library/provider-skills.js.map +1 -0
  762. package/dist-server/server/piecemaker/library/provider-skills.test.js +55 -0
  763. package/dist-server/server/piecemaker/library/provider-skills.test.js.map +1 -0
  764. package/dist-server/server/piecemaker/library/routes.js +56 -0
  765. package/dist-server/server/piecemaker/library/routes.js.map +1 -0
  766. package/dist-server/server/piecemaker/library/runtime.js +34 -0
  767. package/dist-server/server/piecemaker/library/runtime.js.map +1 -0
  768. package/dist-server/server/piecemaker/library/store.js +440 -0
  769. package/dist-server/server/piecemaker/library/store.js.map +1 -0
  770. package/dist-server/server/piecemaker/library/store.test.js +265 -0
  771. package/dist-server/server/piecemaker/library/store.test.js.map +1 -0
  772. package/dist-server/server/piecemaker/library/workspace-installation.js +70 -0
  773. package/dist-server/server/piecemaker/library/workspace-installation.js.map +1 -0
  774. package/dist-server/server/piecemaker/originals-cache.cjs +45 -0
  775. package/dist-server/server/piecemaker/originals-cache.cjs.map +1 -0
  776. package/dist-server/server/piecemaker/originals-cache.test.js +68 -0
  777. package/dist-server/server/piecemaker/originals-cache.test.js.map +1 -0
  778. package/dist-server/server/piecemaker/protection/bypass.cjs +66 -0
  779. package/dist-server/server/piecemaker/protection/bypass.cjs.map +1 -0
  780. package/dist-server/server/piecemaker/protection/bypass.test.js +117 -0
  781. package/dist-server/server/piecemaker/protection/bypass.test.js.map +1 -0
  782. package/dist-server/server/piecemaker/protection/routes.cjs +38 -0
  783. package/dist-server/server/piecemaker/protection/routes.cjs.map +1 -0
  784. package/dist-server/server/piecemaker/timesheet/index.js +9 -0
  785. package/dist-server/server/piecemaker/timesheet/index.js.map +1 -0
  786. package/dist-server/server/piecemaker/timesheet/routes.js +42 -0
  787. package/dist-server/server/piecemaker/timesheet/routes.js.map +1 -0
  788. package/dist-server/server/piecemaker/timesheet/service.js +241 -0
  789. package/dist-server/server/piecemaker/timesheet/service.js.map +1 -0
  790. package/dist-server/server/piecemaker/timesheet/service.test.js +124 -0
  791. package/dist-server/server/piecemaker/timesheet/service.test.js.map +1 -0
  792. package/dist-server/server/piecemaker/timesheet/store.js +126 -0
  793. package/dist-server/server/piecemaker/timesheet/store.js.map +1 -0
  794. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/anonymization-state.cjs +147 -0
  795. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/anonymization-state.cjs.map +1 -0
  796. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folder-structure.cjs +285 -0
  797. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folder-structure.cjs.map +1 -0
  798. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folders.cjs +87 -0
  799. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folders.cjs.map +1 -0
  800. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/central-mapping.cjs +0 -0
  801. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/central-mapping.cjs.map +1 -0
  802. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citation-sources.cjs +526 -0
  803. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citation-sources.cjs.map +1 -0
  804. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citations.cjs +304 -0
  805. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citations.cjs.map +1 -0
  806. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/commits.cjs +1660 -0
  807. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/commits.cjs.map +1 -0
  808. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/institutional-terms.cjs +152 -0
  809. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/institutional-terms.cjs.map +1 -0
  810. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/legifrance-reads.cjs +84 -0
  811. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/legifrance-reads.cjs.map +1 -0
  812. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.cjs +332 -0
  813. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.cjs.map +1 -0
  814. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.test.js +64 -0
  815. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.test.js.map +1 -0
  816. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/protection.cjs +420 -0
  817. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/protection.cjs.map +1 -0
  818. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/session-timing.cjs +91 -0
  819. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/session-timing.cjs.map +1 -0
  820. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/substitution.cjs +304 -0
  821. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/substitution.cjs.map +1 -0
  822. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/verify-citations.cjs +293 -0
  823. package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/verify-citations.cjs.map +1 -0
  824. package/dist-server/server/piecemaker/vendor/websocket-server/case-folder-structure.cjs +5 -0
  825. package/dist-server/server/piecemaker/vendor/websocket-server/case-folder-structure.cjs.map +1 -0
  826. package/dist-server/server/piecemaker/vendor/websocket-server/legal-forms.cjs +91 -0
  827. package/dist-server/server/piecemaker/vendor/websocket-server/legal-forms.cjs.map +1 -0
  828. package/dist-server/server/piecemaker/vendor/websocket-server/legal-forms.test.js +11 -0
  829. package/dist-server/server/piecemaker/vendor/websocket-server/legal-forms.test.js.map +1 -0
  830. package/dist-server/server/piecemaker/vendor/websocket-server/originals-pipeline.cjs +955 -0
  831. package/dist-server/server/piecemaker/vendor/websocket-server/originals-pipeline.cjs.map +1 -0
  832. package/dist-server/server/shared/claude-cli-path.js +120 -0
  833. package/dist-server/server/shared/claude-cli-path.js.map +1 -0
  834. package/dist-server/server/shared/frontmatter.js +16 -0
  835. package/dist-server/server/shared/frontmatter.js.map +1 -0
  836. package/dist-server/server/shared/image-attachments.js +344 -0
  837. package/dist-server/server/shared/image-attachments.js.map +1 -0
  838. package/dist-server/server/shared/interfaces.js +2 -0
  839. package/dist-server/server/shared/interfaces.js.map +1 -0
  840. package/dist-server/server/shared/message-unification.js +376 -0
  841. package/dist-server/server/shared/message-unification.js.map +1 -0
  842. package/dist-server/server/shared/tests/application-data-root.test.js +33 -0
  843. package/dist-server/server/shared/tests/application-data-root.test.js.map +1 -0
  844. package/dist-server/server/shared/tests/claude-cli-path.test.js +89 -0
  845. package/dist-server/server/shared/tests/claude-cli-path.test.js.map +1 -0
  846. package/dist-server/server/shared/tests/image-attachments.test.js +262 -0
  847. package/dist-server/server/shared/tests/image-attachments.test.js.map +1 -0
  848. package/dist-server/server/shared/tests/message-unification.test.js +174 -0
  849. package/dist-server/server/shared/tests/message-unification.test.js.map +1 -0
  850. package/dist-server/server/shared/tests/slice-tail-page.test.js +35 -0
  851. package/dist-server/server/shared/tests/slice-tail-page.test.js.map +1 -0
  852. package/dist-server/server/shared/types.js +2 -0
  853. package/dist-server/server/shared/types.js.map +1 -0
  854. package/dist-server/server/shared/utils.js +1010 -0
  855. package/dist-server/server/shared/utils.js.map +1 -0
  856. package/dist-server/shared/networkHosts.js +20 -0
  857. package/dist-server/shared/networkHosts.js.map +1 -0
  858. package/dist-server/shared/product-config.mjs +79 -0
  859. package/dist-server/shared/product-config.mjs.map +1 -0
  860. package/package.json +271 -0
  861. package/product.config.json +17 -0
  862. package/public/api-docs.html +901 -0
  863. package/scripts/fix-node-pty.js +67 -0
  864. package/scripts/piecemaker/cli/install-command.mjs +130 -0
  865. package/scripts/piecemaker/cli/lib/composants.mjs +68 -0
  866. package/scripts/piecemaker/cli/lib/config.mjs +32 -0
  867. package/scripts/piecemaker/cli/lib/exec.mjs +79 -0
  868. package/scripts/piecemaker/cli/lib/node-runtime.mjs +76 -0
  869. package/scripts/piecemaker/cli/lib/ports.mjs +96 -0
  870. package/scripts/piecemaker/cli/lib/pwa.mjs +323 -0
  871. package/scripts/piecemaker/cli/lib/repos.mjs +140 -0
  872. package/scripts/piecemaker/cli/lib/services.mjs +71 -0
  873. package/scripts/piecemaker/cli/lib/ui.mjs +41 -0
  874. package/scripts/piecemaker/cli/piecemaker.mjs +159 -0
  875. package/scripts/piecemaker/cli/piecemaker.ps1 +63 -0
  876. package/scripts/piecemaker/cli/piecemaker.sh +60 -0
  877. package/scripts/piecemaker/generate-i18n-overrides.mjs +219 -0
  878. package/scripts/piecemaker/hooks/proxy-guard.mjs +286 -0
  879. package/scripts/promote-dist-server.mjs +50 -0
  880. package/scripts/release/build-server-bundle.js +178 -0
  881. package/scripts/release/package-piecemaker.sh +73 -0
  882. package/scripts/release/prepare-desktop-app.js +168 -0
  883. package/server/index.ts +410 -0
  884. package/server/load-env.ts +48 -0
  885. package/server/modules/agent/agent.module.ts +52 -0
  886. package/server/modules/agent/agent.routes.ts +1287 -0
  887. package/server/modules/agent/index.ts +2 -0
  888. package/server/modules/agent/tests/agent.routes.test.ts +205 -0
  889. package/server/modules/assets/assets.routes.ts +150 -0
  890. package/server/modules/assets/index.ts +3 -0
  891. package/server/modules/assets/services/image-assets.service.ts +127 -0
  892. package/server/modules/assets/tests/image-assets.service.test.ts +74 -0
  893. package/server/modules/auth/auth.middleware.ts +163 -0
  894. package/server/modules/auth/auth.module.ts +38 -0
  895. package/server/modules/auth/auth.routes.ts +57 -0
  896. package/server/modules/auth/auth.service.ts +155 -0
  897. package/server/modules/auth/index.ts +9 -0
  898. package/server/modules/auth/tests/auth.service.test.ts +95 -0
  899. package/server/modules/browser-use/browser-use-mcp.routes.ts +120 -0
  900. package/server/modules/browser-use/browser-use-mcp.ts +386 -0
  901. package/server/modules/browser-use/browser-use-runtime.ts +10 -0
  902. package/server/modules/browser-use/browser-use.routes.ts +96 -0
  903. package/server/modules/browser-use/browser-use.service.ts +835 -0
  904. package/server/modules/browser-use/index.ts +11 -0
  905. package/server/modules/browser-use/tests/browser-use.service.test.ts +10 -0
  906. package/server/modules/cli/cli.module.ts +110 -0
  907. package/server/modules/cli/cli.service.ts +266 -0
  908. package/server/modules/cli/cli.ts +19 -0
  909. package/server/modules/cli/index.ts +2 -0
  910. package/server/modules/cli/pwa-launcher.ts +131 -0
  911. package/server/modules/cli/sandbox.service.ts +413 -0
  912. package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +186 -0
  913. package/server/modules/cli/tests/cli.service.test.ts +107 -0
  914. package/server/modules/cli/tests/sandbox.service.test.ts +61 -0
  915. package/server/modules/commands/commands.module.ts +22 -0
  916. package/server/modules/commands/commands.routes.ts +605 -0
  917. package/server/modules/commands/index.ts +2 -0
  918. package/server/modules/commands/tests/commands.test.ts +114 -0
  919. package/server/modules/database/connection.ts +144 -0
  920. package/server/modules/database/index.ts +27 -0
  921. package/server/modules/database/init-db.ts +17 -0
  922. package/server/modules/database/migrations.ts +552 -0
  923. package/server/modules/database/repositories/api-keys.ts +119 -0
  924. package/server/modules/database/repositories/app-config.ts +53 -0
  925. package/server/modules/database/repositories/credentials.ts +106 -0
  926. package/server/modules/database/repositories/github-tokens.ts +100 -0
  927. package/server/modules/database/repositories/notification-channel-endpoints.ts +153 -0
  928. package/server/modules/database/repositories/notification-preferences.ts +117 -0
  929. package/server/modules/database/repositories/projects.db.ts +196 -0
  930. package/server/modules/database/repositories/provider-models.ts +168 -0
  931. package/server/modules/database/repositories/push-subscriptions.ts +80 -0
  932. package/server/modules/database/repositories/scan-state.db.ts +42 -0
  933. package/server/modules/database/repositories/scheduled-messages.db.ts +127 -0
  934. package/server/modules/database/repositories/session-drafts.db.ts +171 -0
  935. package/server/modules/database/repositories/sessions.db.ts +714 -0
  936. package/server/modules/database/repositories/user-preferences.db.ts +80 -0
  937. package/server/modules/database/repositories/users.ts +140 -0
  938. package/server/modules/database/repositories/vapid-keys.ts +57 -0
  939. package/server/modules/database/schema.ts +306 -0
  940. package/server/modules/database/tests/projects.db.integration.test.ts +72 -0
  941. package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -0
  942. package/server/modules/database/tests/sessions-provider-mapping.test.ts +109 -0
  943. package/server/modules/database/tests/sessions.db.integration.test.ts +116 -0
  944. package/server/modules/database/tests/user-preferences.db.integration.test.ts +135 -0
  945. package/server/modules/file-tree/file-tree.module.ts +116 -0
  946. package/server/modules/file-tree/file-tree.routes.ts +258 -0
  947. package/server/modules/file-tree/file-tree.service.ts +675 -0
  948. package/server/modules/file-tree/index.ts +2 -0
  949. package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -0
  950. package/server/modules/file-tree/tests/file-tree.service.test.ts +371 -0
  951. package/server/modules/git/git-branch.service.ts +43 -0
  952. package/server/modules/git/git-parsing.service.ts +66 -0
  953. package/server/modules/git/git.module.ts +22 -0
  954. package/server/modules/git/git.routes.ts +1600 -0
  955. package/server/modules/git/index.ts +2 -0
  956. package/server/modules/git/tests/git-branch.service.test.ts +60 -0
  957. package/server/modules/git/tests/git-init.routes.test.ts +135 -0
  958. package/server/modules/git/tests/git.test.ts +106 -0
  959. package/server/modules/notifications/index.ts +24 -0
  960. package/server/modules/notifications/notifications.routes.ts +127 -0
  961. package/server/modules/notifications/services/desktop-notification-clients.service.ts +124 -0
  962. package/server/modules/notifications/services/notification-orchestrator.service.js +310 -0
  963. package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -0
  964. package/server/modules/notifications/vapid-keys.service.ts +38 -0
  965. package/server/modules/notifications/websocket/desktop-notifications-websocket.service.ts +109 -0
  966. package/server/modules/plugins/index.ts +9 -0
  967. package/server/modules/plugins/plugin-process.service.ts +217 -0
  968. package/server/modules/plugins/plugin-registry.service.ts +461 -0
  969. package/server/modules/plugins/plugins.module.ts +33 -0
  970. package/server/modules/plugins/plugins.routes.ts +66 -0
  971. package/server/modules/plugins/plugins.service.ts +147 -0
  972. package/server/modules/plugins/tests/plugins.service.test.ts +32 -0
  973. package/server/modules/projects/index.ts +11 -0
  974. package/server/modules/projects/projects.routes.ts +273 -0
  975. package/server/modules/projects/services/project-clone.service.ts +323 -0
  976. package/server/modules/projects/services/project-delete.service.ts +102 -0
  977. package/server/modules/projects/services/project-management.service.ts +144 -0
  978. package/server/modules/projects/services/project-star.service.ts +78 -0
  979. package/server/modules/projects/services/projects-has-taskmaster.service.ts +248 -0
  980. package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +314 -0
  981. package/server/modules/projects/tests/project-clone.service.test.ts +183 -0
  982. package/server/modules/projects/tests/project-management.service.test.ts +117 -0
  983. package/server/modules/projects/tests/project-star.service.test.ts +123 -0
  984. package/server/modules/projects/tests/projects-has-taskmaster.service.test.ts +105 -0
  985. package/server/modules/providers/README.md +380 -0
  986. package/server/modules/providers/index.ts +14 -0
  987. package/server/modules/providers/list/claude/claude-auth.provider.ts +180 -0
  988. package/server/modules/providers/list/claude/claude-fork.provider.ts +57 -0
  989. package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -0
  990. package/server/modules/providers/list/claude/claude-models.provider.ts +314 -0
  991. package/server/modules/providers/list/claude/claude-runtime.provider.js +1217 -0
  992. package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +203 -0
  993. package/server/modules/providers/list/claude/claude-sessions.provider.ts +1108 -0
  994. package/server/modules/providers/list/claude/claude-skills.provider.ts +265 -0
  995. package/server/modules/providers/list/claude/claude.provider.ts +33 -0
  996. package/server/modules/providers/list/codex/codex-app-server.client.ts +243 -0
  997. package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -0
  998. package/server/modules/providers/list/codex/codex-fork.provider.ts +40 -0
  999. package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -0
  1000. package/server/modules/providers/list/codex/codex-models.provider.ts +123 -0
  1001. package/server/modules/providers/list/codex/codex-runtime.provider.js +572 -0
  1002. package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +212 -0
  1003. package/server/modules/providers/list/codex/codex-sessions.provider.ts +2267 -0
  1004. package/server/modules/providers/list/codex/codex-skills.provider.ts +73 -0
  1005. package/server/modules/providers/list/codex/codex.provider.ts +33 -0
  1006. package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -0
  1007. package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -0
  1008. package/server/modules/providers/list/cursor/cursor-models.provider.ts +119 -0
  1009. package/server/modules/providers/list/cursor/cursor-runtime.provider.js +387 -0
  1010. package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +158 -0
  1011. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +654 -0
  1012. package/server/modules/providers/list/cursor/cursor-skills.provider.ts +39 -0
  1013. package/server/modules/providers/list/cursor/cursor.provider.ts +30 -0
  1014. package/server/modules/providers/list/mistral/mistral-auth.provider.ts +181 -0
  1015. package/server/modules/providers/list/mistral/mistral-mcp.provider.ts +20 -0
  1016. package/server/modules/providers/list/mistral/mistral-models.provider.ts +76 -0
  1017. package/server/modules/providers/list/mistral/mistral-runtime.provider.ts +417 -0
  1018. package/server/modules/providers/list/mistral/mistral-session-synchronizer.provider.ts +15 -0
  1019. package/server/modules/providers/list/mistral/mistral-sessions.provider.ts +210 -0
  1020. package/server/modules/providers/list/mistral/mistral-skills.provider.ts +20 -0
  1021. package/server/modules/providers/list/mistral/mistral.provider.ts +35 -0
  1022. package/server/modules/providers/list/opencode/opencode-auth.provider.ts +110 -0
  1023. package/server/modules/providers/list/opencode/opencode-mcp.provider.ts +228 -0
  1024. package/server/modules/providers/list/opencode/opencode-models.provider.ts +304 -0
  1025. package/server/modules/providers/list/opencode/opencode-runtime.provider.js +434 -0
  1026. package/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +261 -0
  1027. package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +179 -0
  1028. package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +500 -0
  1029. package/server/modules/providers/list/opencode/opencode-skills.provider.ts +78 -0
  1030. package/server/modules/providers/list/opencode/opencode.provider.ts +30 -0
  1031. package/server/modules/providers/provider.registry.ts +38 -0
  1032. package/server/modules/providers/provider.routes.ts +909 -0
  1033. package/server/modules/providers/services/mcp.service.ts +109 -0
  1034. package/server/modules/providers/services/provider-auth.service.ts +26 -0
  1035. package/server/modules/providers/services/provider-capabilities.service.ts +133 -0
  1036. package/server/modules/providers/services/provider-models.service.ts +401 -0
  1037. package/server/modules/providers/services/provider-runtime.service.ts +108 -0
  1038. package/server/modules/providers/services/provider-token-usage.service.ts +484 -0
  1039. package/server/modules/providers/services/session-conversations-search.service.ts +1321 -0
  1040. package/server/modules/providers/services/session-history-cache.service.ts +139 -0
  1041. package/server/modules/providers/services/session-synchronizer.service.ts +162 -0
  1042. package/server/modules/providers/services/sessions-watcher.service.ts +266 -0
  1043. package/server/modules/providers/services/sessions.service.ts +663 -0
  1044. package/server/modules/providers/services/skills.service.ts +39 -0
  1045. package/server/modules/providers/shared/base/abstract.provider.ts +32 -0
  1046. package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -0
  1047. package/server/modules/providers/shared/skills/skills.provider.ts +287 -0
  1048. package/server/modules/providers/tests/claude-auth.test.ts +208 -0
  1049. package/server/modules/providers/tests/claude-sessions.test.ts +573 -0
  1050. package/server/modules/providers/tests/claude-subagent-echo.test.ts +25 -0
  1051. package/server/modules/providers/tests/claude-token-budget.test.ts +104 -0
  1052. package/server/modules/providers/tests/codex-message-editing.test.ts +419 -0
  1053. package/server/modules/providers/tests/codex-session-fork.test.ts +59 -0
  1054. package/server/modules/providers/tests/codex-sessions.test.ts +553 -0
  1055. package/server/modules/providers/tests/mcp.test.ts +349 -0
  1056. package/server/modules/providers/tests/opencode-models.test.ts +154 -0
  1057. package/server/modules/providers/tests/opencode-sessions.test.ts +522 -0
  1058. package/server/modules/providers/tests/provider-attachment-history.test.ts +247 -0
  1059. package/server/modules/providers/tests/provider-models.service.test.ts +353 -0
  1060. package/server/modules/providers/tests/provider-runtime.service.test.ts +138 -0
  1061. package/server/modules/providers/tests/provider-token-usage.service.test.ts +373 -0
  1062. package/server/modules/providers/tests/provider.routes.test.ts +244 -0
  1063. package/server/modules/providers/tests/session-fork.test.ts +173 -0
  1064. package/server/modules/providers/tests/session-history-cache.service.test.ts +143 -0
  1065. package/server/modules/providers/tests/session-orphan-prune.test.ts +107 -0
  1066. package/server/modules/providers/tests/session-synchronizer-coalescing.test.ts +136 -0
  1067. package/server/modules/providers/tests/sessions-details.test.ts +73 -0
  1068. package/server/modules/providers/tests/sessions.service.test.ts +193 -0
  1069. package/server/modules/providers/tests/skills.test.ts +692 -0
  1070. package/server/modules/scheduled-messages/index.ts +8 -0
  1071. package/server/modules/scheduled-messages/scheduled-messages.routes.ts +68 -0
  1072. package/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.ts +203 -0
  1073. package/server/modules/scheduled-messages/services/scheduled-messages.service.ts +121 -0
  1074. package/server/modules/scheduled-messages/tests/scheduled-messages.test.ts +310 -0
  1075. package/server/modules/settings/index.ts +2 -0
  1076. package/server/modules/settings/settings.module.ts +50 -0
  1077. package/server/modules/settings/settings.routes.ts +51 -0
  1078. package/server/modules/settings/settings.service.ts +186 -0
  1079. package/server/modules/settings/tests/settings.service.test.ts +54 -0
  1080. package/server/modules/system/index.ts +2 -0
  1081. package/server/modules/system/system.module.ts +62 -0
  1082. package/server/modules/system/system.routes.ts +21 -0
  1083. package/server/modules/system/system.service.ts +76 -0
  1084. package/server/modules/system/tests/system.service.test.ts +118 -0
  1085. package/server/modules/taskmaster/index.ts +2 -0
  1086. package/server/modules/taskmaster/taskmaster.module.ts +24 -0
  1087. package/server/modules/taskmaster/taskmaster.routes.ts +1472 -0
  1088. package/server/modules/taskmaster/taskmaster.service.ts +132 -0
  1089. package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +201 -0
  1090. package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -0
  1091. package/server/modules/user/index.ts +2 -0
  1092. package/server/modules/user/tests/user.service.test.ts +151 -0
  1093. package/server/modules/user/user.module.ts +67 -0
  1094. package/server/modules/user/user.routes.ts +94 -0
  1095. package/server/modules/user/user.service.ts +190 -0
  1096. package/server/modules/voice/index.ts +2 -0
  1097. package/server/modules/voice/tests/voice.service.test.ts +99 -0
  1098. package/server/modules/voice/voice.module.ts +47 -0
  1099. package/server/modules/voice/voice.routes.ts +113 -0
  1100. package/server/modules/voice/voice.service.ts +192 -0
  1101. package/server/modules/websocket/README.md +273 -0
  1102. package/server/modules/websocket/index.ts +11 -0
  1103. package/server/modules/websocket/services/chat-run-registry.service.ts +310 -0
  1104. package/server/modules/websocket/services/chat-session-writer.service.ts +175 -0
  1105. package/server/modules/websocket/services/chat-websocket.service.ts +654 -0
  1106. package/server/modules/websocket/services/plugin-websocket-proxy.service.ts +65 -0
  1107. package/server/modules/websocket/services/session-upsert-broadcast.service.ts +108 -0
  1108. package/server/modules/websocket/services/shell-websocket.service.ts +628 -0
  1109. package/server/modules/websocket/services/websocket-auth.service.ts +59 -0
  1110. package/server/modules/websocket/services/websocket-server.service.ts +126 -0
  1111. package/server/modules/websocket/services/websocket-state.service.ts +16 -0
  1112. package/server/modules/websocket/services/websocket-writer.service.ts +38 -0
  1113. package/server/modules/websocket/tests/chat-attachment-filter.test.ts +59 -0
  1114. package/server/modules/websocket/tests/chat-edit-send.test.ts +309 -0
  1115. package/server/modules/websocket/tests/chat-run-registry.test.ts +313 -0
  1116. package/server/modules/websocket/tests/session-upsert-broadcast.test.ts +138 -0
  1117. package/server/modules/websocket/tests/shell-websocket.service.test.ts +227 -0
  1118. package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -0
  1119. package/server/modules/worktrees/index.ts +2 -0
  1120. package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -0
  1121. package/server/modules/worktrees/services/worktree-create.service.ts +104 -0
  1122. package/server/modules/worktrees/services/worktree-git.service.ts +207 -0
  1123. package/server/modules/worktrees/services/worktree-list.service.ts +143 -0
  1124. package/server/modules/worktrees/services/worktree-merge.service.ts +157 -0
  1125. package/server/modules/worktrees/services/worktree-open.service.ts +85 -0
  1126. package/server/modules/worktrees/services/worktree-remove.service.ts +88 -0
  1127. package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -0
  1128. package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -0
  1129. package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -0
  1130. package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -0
  1131. package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -0
  1132. package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -0
  1133. package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -0
  1134. package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -0
  1135. package/server/modules/worktrees/worktrees.module.ts +113 -0
  1136. package/server/modules/worktrees/worktrees.routes.ts +116 -0
  1137. package/server/piecemaker/activation/claude-mcp.cjs +115 -0
  1138. package/server/piecemaker/activation/claude-plugins.cjs +65 -0
  1139. package/server/piecemaker/activation/codex-mcp.cjs +102 -0
  1140. package/server/piecemaker/activation/errors.cjs +15 -0
  1141. package/server/piecemaker/activation/index.cjs +5 -0
  1142. package/server/piecemaker/activation/library.cjs +284 -0
  1143. package/server/piecemaker/activation/library.cjs.bak +223 -0
  1144. package/server/piecemaker/activation/library.test.js +365 -0
  1145. package/server/piecemaker/activation/markdown.cjs +108 -0
  1146. package/server/piecemaker/activation/markdown.cjs.bak +78 -0
  1147. package/server/piecemaker/activation/paths.cjs +104 -0
  1148. package/server/piecemaker/activation/paths.test.js +158 -0
  1149. package/server/piecemaker/activation/routes.cjs +101 -0
  1150. package/server/piecemaker/activation/routes.test.js +344 -0
  1151. package/server/piecemaker/activation/snapshot.cjs +30 -0
  1152. package/server/piecemaker/anonymizer/anonymizer.test.js +320 -0
  1153. package/server/piecemaker/anonymizer/client-config.cjs +228 -0
  1154. package/server/piecemaker/anonymizer/codex-http.test.js +20 -0
  1155. package/server/piecemaker/anonymizer/dictionary.cjs +174 -0
  1156. package/server/piecemaker/anonymizer/lifecycle.test.ts +37 -0
  1157. package/server/piecemaker/anonymizer/lifecycle.ts +22 -0
  1158. package/server/piecemaker/anonymizer/providers.cjs +241 -0
  1159. package/server/piecemaker/anonymizer/proxy.cjs +365 -0
  1160. package/server/piecemaker/anonymizer/rewrite.cjs +251 -0
  1161. package/server/piecemaker/anonymizer/routes.cjs +43 -0
  1162. package/server/piecemaker/anonymizer/service.cjs +218 -0
  1163. package/server/piecemaker/harness/chat-harness.test.ts +131 -0
  1164. package/server/piecemaker/harness/chat-harness.ts +151 -0
  1165. package/server/piecemaker/harness/citation-instructions.ts +18 -0
  1166. package/server/piecemaker/harness/citation-store.ts +80 -0
  1167. package/server/piecemaker/harness/citation-turn.test.ts +155 -0
  1168. package/server/piecemaker/harness/citation-turn.ts +197 -0
  1169. package/server/piecemaker/harness/citations.routes.test.ts +68 -0
  1170. package/server/piecemaker/harness/citations.routes.ts +18 -0
  1171. package/server/piecemaker/harness/decisions.cjs +302 -0
  1172. package/server/piecemaker/harness/flux-sse.cjs +111 -0
  1173. package/server/piecemaker/harness/harness.test.js +296 -0
  1174. package/server/piecemaker/harness/index.cjs +103 -0
  1175. package/server/piecemaker/harness/proxy-harness.test.js +226 -0
  1176. package/server/piecemaker/harness/source-passages.ts +21 -0
  1177. package/server/piecemaker/harness/verification.cjs +159 -0
  1178. package/server/piecemaker/index.ts +59 -0
  1179. package/server/piecemaker/library/index.ts +54 -0
  1180. package/server/piecemaker/library/marketplace.ts +152 -0
  1181. package/server/piecemaker/library/migrate-cli.ts +11 -0
  1182. package/server/piecemaker/library/migrate.ts +49 -0
  1183. package/server/piecemaker/library/policy.cjs +9 -0
  1184. package/server/piecemaker/library/provider-skills.test.ts +61 -0
  1185. package/server/piecemaker/library/provider-skills.ts +48 -0
  1186. package/server/piecemaker/library/routes.ts +38 -0
  1187. package/server/piecemaker/library/runtime.ts +39 -0
  1188. package/server/piecemaker/library/store.test.ts +280 -0
  1189. package/server/piecemaker/library/store.ts +429 -0
  1190. package/server/piecemaker/library/workspace-installation.ts +61 -0
  1191. package/server/piecemaker/originals-cache.cjs +54 -0
  1192. package/server/piecemaker/originals-cache.test.js +77 -0
  1193. package/server/piecemaker/protection/bypass.cjs +73 -0
  1194. package/server/piecemaker/protection/bypass.test.js +140 -0
  1195. package/server/piecemaker/protection/routes.cjs +39 -0
  1196. package/server/piecemaker/router.cjs +109 -0
  1197. package/server/piecemaker/timesheet/index.ts +9 -0
  1198. package/server/piecemaker/timesheet/routes.ts +48 -0
  1199. package/server/piecemaker/timesheet/service.test.ts +142 -0
  1200. package/server/piecemaker/timesheet/service.ts +298 -0
  1201. package/server/piecemaker/timesheet/store.ts +167 -0
  1202. package/server/piecemaker/vendor/.env +2 -0
  1203. package/server/piecemaker/vendor/installer/assets/PieceMakerApp.swift +189 -0
  1204. package/server/piecemaker/vendor/installer/assets/claude-hooks/piecemaker-guard-secrets.mjs +230 -0
  1205. package/server/piecemaker/vendor/installer/assets/claude-hooks/piecemaker-secret-paths.default.json +1 -0
  1206. package/server/piecemaker/vendor/installer/assets/piecemaker.icns +0 -0
  1207. package/server/piecemaker/vendor/installer/assets/piecemaker.ico +0 -0
  1208. package/server/piecemaker/vendor/installer/bin/piecemaker.mjs +1018 -0
  1209. package/server/piecemaker/vendor/installer/lib/banner.mjs +35 -0
  1210. package/server/piecemaker/vendor/installer/lib/codex-skills.mjs +343 -0
  1211. package/server/piecemaker/vendor/installer/lib/commandes.mjs +13 -0
  1212. package/server/piecemaker/vendor/installer/lib/desktop-launcher.mjs +305 -0
  1213. package/server/piecemaker/vendor/installer/lib/legacy-legifrance.mjs +72 -0
  1214. package/server/piecemaker/vendor/installer/lib/platform.mjs +163 -0
  1215. package/server/piecemaker/vendor/installer/lib/prompt.mjs +138 -0
  1216. package/server/piecemaker/vendor/installer/lib/resume-steps.mjs +174 -0
  1217. package/server/piecemaker/vendor/installer/lib/secrets-guard.mjs +193 -0
  1218. package/server/piecemaker/vendor/installer/lib/service.mjs +467 -0
  1219. package/server/piecemaker/vendor/installer/lib/state.mjs +114 -0
  1220. package/server/piecemaker/vendor/installer/lib/ui.mjs +159 -0
  1221. package/server/piecemaker/vendor/installer/steps/00-identite.mjs +71 -0
  1222. package/server/piecemaker/vendor/installer/steps/01-prerequis.mjs +119 -0
  1223. package/server/piecemaker/vendor/installer/steps/02-dependances-node.mjs +127 -0
  1224. package/server/piecemaker/vendor/installer/steps/03-python-gliner.mjs +249 -0
  1225. package/server/piecemaker/vendor/installer/steps/03b-python-graphify.mjs +161 -0
  1226. package/server/piecemaker/vendor/installer/steps/04-conversion-md.mjs +147 -0
  1227. package/server/piecemaker/vendor/installer/steps/05-certificats.mjs +171 -0
  1228. package/server/piecemaker/vendor/installer/steps/06-hooks.mjs +266 -0
  1229. package/server/piecemaker/vendor/installer/steps/07-legifrance.mjs +279 -0
  1230. package/server/piecemaker/vendor/installer/steps/08-telegram.mjs +482 -0
  1231. package/server/piecemaker/vendor/installer/steps/09-claude-assets.mjs +151 -0
  1232. package/server/piecemaker/vendor/installer/steps/09-codex-plugin.mjs +142 -0
  1233. package/server/piecemaker/vendor/installer/steps/10-libreoffice.mjs +130 -0
  1234. package/server/piecemaker/vendor/installer/steps/10-pandoc.mjs +212 -0
  1235. package/server/piecemaker/vendor/installer/steps/11-docx-cli.mjs +144 -0
  1236. package/server/piecemaker/vendor/installer/steps/12-mcp-piecemaker.mjs +124 -0
  1237. package/server/piecemaker/vendor/installer/steps/13-garde-secrets.mjs +136 -0
  1238. package/server/piecemaker/vendor/installer/steps/14-mxc-sandbox.mjs +271 -0
  1239. package/server/piecemaker/vendor/installer/steps/15-pwa-desktop.mjs +64 -0
  1240. package/server/piecemaker/vendor/installer/templates/root-CLAUDE.md +79 -0
  1241. package/server/piecemaker/vendor/installer/templates/workspace-CLAUDE.md +111 -0
  1242. package/server/piecemaker/vendor/mcp/README.md +13 -0
  1243. package/server/piecemaker/vendor/mcp/piecemaker/server.mjs +222 -0
  1244. package/server/piecemaker/vendor/mike-defaults-fr/PROVENANCE.md +10 -0
  1245. package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/compare-documents/SKILL.md +51 -0
  1246. package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/draft-from-template/SKILL.md +27 -0
  1247. package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/extract-key-terms/SKILL.md +43 -0
  1248. package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/proofread/SKILL.md +98 -0
  1249. package/server/piecemaker/vendor/mike-defaults-fr/catalog.json +22 -0
  1250. package/server/piecemaker/vendor/mike-defaults-fr/tabular-review-workflows/commercial-agreement-tabular-review/SKILL.md +31 -0
  1251. package/server/piecemaker/vendor/mike-defaults-fr/tabular-review-workflows/commercial-agreement-tabular-review/table-columns.yaml +92 -0
  1252. package/server/piecemaker/vendor/package.json +7 -0
  1253. package/server/piecemaker/vendor/piecemaker-plugin/README.md +115 -0
  1254. package/server/piecemaker/vendor/piecemaker-plugin/agents/analyste-piece.md +38 -0
  1255. package/server/piecemaker/vendor/piecemaker-plugin/agents/jurisprudence-scanner.md +50 -0
  1256. package/server/piecemaker/vendor/piecemaker-plugin/hooks/hooks.json +84 -0
  1257. package/server/piecemaker/vendor/piecemaker-plugin/scripts/billing-track.mjs +194 -0
  1258. package/server/piecemaker/vendor/piecemaker-plugin/scripts/build-recherche-pdf.mjs +91 -0
  1259. package/server/piecemaker/vendor/piecemaker-plugin/scripts/classify-ai-documents.mjs +123 -0
  1260. package/server/piecemaker/vendor/piecemaker-plugin/scripts/commit-track.mjs +71 -0
  1261. package/server/piecemaker/vendor/piecemaker-plugin/scripts/compile-recherche.mjs +107 -0
  1262. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/anonymization-state.cjs +146 -0
  1263. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folder-structure.cjs +303 -0
  1264. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folders.cjs +86 -0
  1265. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/central-mapping.cjs +0 -0
  1266. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citation-sources.cjs +519 -0
  1267. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citations.cjs +292 -0
  1268. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/commits.cjs +1683 -0
  1269. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/docx-text-worker.cjs +43 -0
  1270. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/hook-io.mjs +249 -0
  1271. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/institutional-terms.cjs +160 -0
  1272. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/legifrance-reads.cjs +85 -0
  1273. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.cjs +346 -0
  1274. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.test.js +68 -0
  1275. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/protection.cjs +419 -0
  1276. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/recherche-report.cjs +177 -0
  1277. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/session-timing.cjs +80 -0
  1278. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/substitution.cjs +318 -0
  1279. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/verify-citations.cjs +318 -0
  1280. package/server/piecemaker/vendor/piecemaker-plugin/scripts/protect-originals.mjs +256 -0
  1281. package/server/piecemaker/vendor/piecemaker-plugin/scripts/session-commit-worker.mjs +260 -0
  1282. package/server/piecemaker/vendor/piecemaker-plugin/scripts/session-commit.mjs +83 -0
  1283. package/server/piecemaker/vendor/piecemaker-plugin/scripts/statusline.mjs +179 -0
  1284. package/server/piecemaker/vendor/piecemaker-plugin/scripts/track-legifrance-reads.mjs +46 -0
  1285. package/server/piecemaker/vendor/piecemaker-plugin/skills/ajout-de-fonctionnalites/SKILL.md +66 -0
  1286. package/server/piecemaker/vendor/piecemaker-plugin/skills/conversion-md/SKILL.md +60 -0
  1287. package/server/piecemaker/vendor/piecemaker-plugin/skills/graphe-juridique/SKILL.md +105 -0
  1288. package/server/piecemaker/vendor/piecemaker-plugin/skills/recherche-juridique/SKILL.md +234 -0
  1289. package/server/piecemaker/vendor/piecemaker-plugin/skills/redaction-juridique/SKILL.md +96 -0
  1290. package/server/piecemaker/vendor/piecemaker-plugin/skills/tamponnage/SKILL.md +148 -0
  1291. package/server/piecemaker/vendor/websocket-server/admin-routes.cjs +3195 -0
  1292. package/server/piecemaker/vendor/websocket-server/case-folder-structure.cjs +3 -0
  1293. package/server/piecemaker/vendor/websocket-server/case-instructions.cjs +114 -0
  1294. package/server/piecemaker/vendor/websocket-server/case-registry.cjs +93 -0
  1295. package/server/piecemaker/vendor/websocket-server/claude-assets.cjs +338 -0
  1296. package/server/piecemaker/vendor/websocket-server/claude-hooks.cjs +380 -0
  1297. package/server/piecemaker/vendor/websocket-server/document-index.cjs +682 -0
  1298. package/server/piecemaker/vendor/websocket-server/graphify-document-graph.cjs +456 -0
  1299. package/server/piecemaker/vendor/websocket-server/legal-chronology.cjs +502 -0
  1300. package/server/piecemaker/vendor/websocket-server/legal-forms.cjs +89 -0
  1301. package/server/piecemaker/vendor/websocket-server/legal-forms.test.js +10 -0
  1302. package/server/piecemaker/vendor/websocket-server/legal-graph-materializer.cjs +234 -0
  1303. package/server/piecemaker/vendor/websocket-server/legal-graph-prompt.txt +155 -0
  1304. package/server/piecemaker/vendor/websocket-server/legal-graph.cjs +2021 -0
  1305. package/server/piecemaker/vendor/websocket-server/legal-identity-boundary.cjs +247 -0
  1306. package/server/piecemaker/vendor/websocket-server/legal-party-registry.cjs +261 -0
  1307. package/server/piecemaker/vendor/websocket-server/lib/doc-generate.cjs +229 -0
  1308. package/server/piecemaker/vendor/websocket-server/lib/export-render.cjs +442 -0
  1309. package/server/piecemaker/vendor/websocket-server/lib/office-to-pdf.cjs +306 -0
  1310. package/server/piecemaker/vendor/websocket-server/lib/stamping.cjs +39 -0
  1311. package/server/piecemaker/vendor/websocket-server/originals-pipeline.cjs +965 -0
  1312. package/server/piecemaker/vendor/websocket-server/scripts/ADDRESS_ANONYMIZATION.md +216 -0
  1313. package/server/piecemaker/vendor/websocket-server/scripts/DEDUPLICATION_CHANGES.md +134 -0
  1314. package/server/piecemaker/vendor/websocket-server/scripts/GLINER2_README.md +138 -0
  1315. package/server/piecemaker/vendor/websocket-server/scripts/__pycache__/scan_utils.cpython-312.pyc +0 -0
  1316. package/server/piecemaker/vendor/websocket-server/scripts/convert_and_scan_pipeline.py +1984 -0
  1317. package/server/piecemaker/vendor/websocket-server/scripts/graphify-legal-sitecustomize.py +50 -0
  1318. package/server/piecemaker/vendor/websocket-server/scripts/mineru_improved_1.py +208 -0
  1319. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/AUDIT_PERF_QUALITE.md +246 -0
  1320. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/MODELE_COREML.md +62 -0
  1321. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/__pycache__/coreml_runtime.cpython-312.pyc +0 -0
  1322. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/__pycache__/model_config.cpython-312.pyc +0 -0
  1323. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/build_coreml.py +118 -0
  1324. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/coreml_runtime.py +164 -0
  1325. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/BACKENDS_MESURES.md +384 -0
  1326. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/CRITERES_QUALITE.md +81 -0
  1327. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/__pycache__/coreml_encoder.cpython-312.pyc +0 -0
  1328. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/bench_backend.py +151 -0
  1329. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/bench_batchsize.py +47 -0
  1330. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/bench_coreml_pipeline.py +138 -0
  1331. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/bench_gensight.py +124 -0
  1332. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/check_gold.py +66 -0
  1333. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/coreml_encoder.py +182 -0
  1334. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/encoder_backends.py +179 -0
  1335. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/evaluate.py +130 -0
  1336. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/gold.py +59 -0
  1337. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/profile_split.py +65 -0
  1338. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/slice_A.md +67 -0
  1339. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/slice_B.md +57 -0
  1340. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/slice_C.md +907 -0
  1341. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/sweep.py +115 -0
  1342. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/verify_substitution.cjs +116 -0
  1343. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/verify_whitespace.py +67 -0
  1344. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/verify_worker.py +106 -0
  1345. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/model_config.py +28 -0
  1346. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/presidio-gliner.py +471 -0
  1347. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/scanner_worker.py +668 -0
  1348. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__init__.py +10 -0
  1349. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/__init__.cpython-312.pyc +0 -0
  1350. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/analysis_explanation.cpython-312.pyc +0 -0
  1351. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/entity_recognizer.cpython-312.pyc +0 -0
  1352. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/local_recognizer.cpython-312.pyc +0 -0
  1353. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/pattern.cpython-312.pyc +0 -0
  1354. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/pattern_recognizer.cpython-312.pyc +0 -0
  1355. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/recognizer_result.cpython-312.pyc +0 -0
  1356. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/analysis_explanation.py +65 -0
  1357. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/entity_recognizer.py +213 -0
  1358. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/__init__.py +21 -0
  1359. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/language_validation.py +18 -0
  1360. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/schemas.py +132 -0
  1361. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/yaml_recognizer_models.py +422 -0
  1362. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/local_recognizer.py +7 -0
  1363. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__init__.py +15 -0
  1364. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/__init__.cpython-312.pyc +0 -0
  1365. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/device_detector.cpython-312.pyc +0 -0
  1366. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/ner_model_configuration.cpython-312.pyc +0 -0
  1367. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/nlp_artifacts.cpython-312.pyc +0 -0
  1368. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/nlp_engine.cpython-312.pyc +0 -0
  1369. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/spacy_nlp_engine.cpython-312.pyc +0 -0
  1370. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/device_detector.py +65 -0
  1371. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/ner_model_configuration.py +128 -0
  1372. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/nlp_artifacts.py +88 -0
  1373. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/nlp_engine.py +65 -0
  1374. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/nlp_engine_provider.py +114 -0
  1375. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/spacy_nlp_engine.py +290 -0
  1376. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/pattern.py +66 -0
  1377. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/pattern_recognizer.py +297 -0
  1378. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/__init__.py +4 -0
  1379. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/__pycache__/__init__.cpython-312.pyc +0 -0
  1380. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/__pycache__/gliner_recognizer.cpython-312.pyc +0 -0
  1381. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__init__.py +0 -0
  1382. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/__init__.cpython-312.pyc +0 -0
  1383. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/credit_card_recognizer.cpython-312.pyc +0 -0
  1384. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/crypto_recognizer.cpython-312.pyc +0 -0
  1385. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/email_recognizer.cpython-312.pyc +0 -0
  1386. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/iban_patterns.cpython-312.pyc +0 -0
  1387. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/iban_recognizer.cpython-312.pyc +0 -0
  1388. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/ip_recognizer.cpython-312.pyc +0 -0
  1389. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/mac_recognizer.cpython-312.pyc +0 -0
  1390. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/url_recognizer.cpython-312.pyc +0 -0
  1391. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/credit_card_recognizer.py +82 -0
  1392. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/crypto_recognizer.py +141 -0
  1393. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/date_recognizer.py +102 -0
  1394. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/email_recognizer.py +48 -0
  1395. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/iban_patterns.py +173 -0
  1396. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/iban_recognizer.py +221 -0
  1397. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/ip_recognizer.py +65 -0
  1398. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/mac_recognizer.py +73 -0
  1399. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/url_recognizer.py +50 -0
  1400. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/gliner_recognizer.py +218 -0
  1401. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/spacy_recognizer.py +139 -0
  1402. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/recognizer_result.py +188 -0
  1403. package/server/piecemaker/vendor/websocket-server/scripts/requirements.txt +29 -0
  1404. package/server/piecemaker/vendor/websocket-server/scripts/scan_utils.py +469 -0
  1405. package/server/piecemaker/vendor/websocket-server/scripts/smart_converter.py +356 -0
  1406. package/server/piecemaker/vendor/websocket-server/scripts/warmup.py +454 -0
  1407. package/server/piecemaker/vendor/websocket-server/stamping-routes.cjs +334 -0
  1408. package/server/piecemaker/vendor/websocket-server/telegram-admin.cjs +602 -0
  1409. package/server/piecemaker/vendor/websocket-server/workspace-paths.cjs +22 -0
  1410. package/server/shared/claude-cli-path.ts +157 -0
  1411. package/server/shared/frontmatter.ts +18 -0
  1412. package/server/shared/image-attachments.ts +437 -0
  1413. package/server/shared/interfaces.ts +241 -0
  1414. package/server/shared/message-unification.ts +449 -0
  1415. package/server/shared/tests/application-data-root.test.ts +29 -0
  1416. package/server/shared/tests/claude-cli-path.test.ts +118 -0
  1417. package/server/shared/tests/image-attachments.test.ts +353 -0
  1418. package/server/shared/tests/message-unification.test.ts +218 -0
  1419. package/server/shared/tests/slice-tail-page.test.ts +42 -0
  1420. package/server/shared/types.ts +1354 -0
  1421. package/server/shared/utils.ts +1212 -0
  1422. package/server/tsconfig.json +40 -0
  1423. package/shared/networkHosts.js +22 -0
  1424. package/shared/product-config.mjs +86 -0
@@ -0,0 +1,1600 @@
1
+ // @ts-nocheck -- temporary while Git workflows are extracted into the injected service.
2
+ import path from 'path';
3
+
4
+ import express from 'express';
5
+
6
+ import type { ProviderRunFunction } from '@/shared/types.js';
7
+ import { AppError } from '@/shared/utils.js';
8
+
9
+ // cross-spawn: drop-in spawn with Windows .cmd/PATHEXT resolution.
10
+ import { parseGitLogWithStats, parseGitStatusOutput } from './git-parsing.service.js';
11
+ import { deleteLocalBranch } from './git-branch.service.js';
12
+
13
+ type GitRouterDependencies = {
14
+ fileSystem: typeof import('node:fs/promises');
15
+ spawnProcess: typeof import('cross-spawn').default;
16
+ resolveProjectPathById(projectId: string): string | null;
17
+ queryClaude: ProviderRunFunction;
18
+ queryCursor: ProviderRunFunction;
19
+ };
20
+
21
+ /** Creates Git routes around explicit repository, filesystem, subprocess, and AI adapters. */
22
+ export function createGitRouter(dependencies: GitRouterDependencies): express.Router {
23
+ const fs = dependencies.fileSystem;
24
+ const spawn = dependencies.spawnProcess;
25
+ const projectsDb = { getProjectPathById: dependencies.resolveProjectPathById };
26
+ const queryClaudeSDK = dependencies.queryClaude;
27
+ const spawnCursor = dependencies.queryCursor;
28
+ const router = express.Router();
29
+ const COMMIT_DIFF_CHARACTER_LIMIT = 500_000;
30
+
31
+ function spawnAsync(command, args, options = {}) {
32
+ return new Promise((resolve, reject) => {
33
+ const child = spawn(command, args, {
34
+ ...options,
35
+ shell: false,
36
+ });
37
+
38
+ let stdout = '';
39
+ let stderr = '';
40
+
41
+ child.stdout.on('data', (data) => {
42
+ stdout += data.toString();
43
+ });
44
+
45
+ child.stderr.on('data', (data) => {
46
+ stderr += data.toString();
47
+ });
48
+
49
+ child.on('error', (error) => {
50
+ reject(error);
51
+ });
52
+
53
+ child.on('close', (code) => {
54
+ if (code === 0) {
55
+ resolve({ stdout, stderr });
56
+ return;
57
+ }
58
+
59
+ const error = new Error(`Command failed: ${command} ${args.join(' ')}`);
60
+ error.code = code;
61
+ error.stdout = stdout;
62
+ error.stderr = stderr;
63
+ reject(error);
64
+ });
65
+ });
66
+ }
67
+
68
+ // Input validation helpers (defense-in-depth)
69
+ function validateCommitRef(commit) {
70
+ // Allow hex hashes, HEAD, HEAD~N, HEAD^N, tag names, branch names
71
+ if (!/^[a-zA-Z0-9._~^{}@\/-]+$/.test(commit)) {
72
+ throw new Error('Invalid commit reference');
73
+ }
74
+ return commit;
75
+ }
76
+
77
+ function validateBranchName(branch) {
78
+ if (!/^[a-zA-Z0-9._\/-]+$/.test(branch)) {
79
+ throw new Error('Invalid branch name');
80
+ }
81
+ return branch;
82
+ }
83
+
84
+ function validateFilePath(file, projectPath) {
85
+ if (!file || file.includes('\0')) {
86
+ throw new Error('Invalid file path');
87
+ }
88
+ // Prevent path traversal: resolve the file relative to the project root
89
+ // and ensure the result stays within the project directory
90
+ if (projectPath) {
91
+ const resolved = path.resolve(projectPath, file);
92
+ const normalizedRoot = path.resolve(projectPath) + path.sep;
93
+ if (!resolved.startsWith(normalizedRoot) && resolved !== path.resolve(projectPath)) {
94
+ throw new Error('Invalid file path: path traversal detected');
95
+ }
96
+ }
97
+ return file;
98
+ }
99
+
100
+ function validateRemoteName(remote) {
101
+ if (!/^[a-zA-Z0-9._-]+$/.test(remote)) {
102
+ throw new Error('Invalid remote name');
103
+ }
104
+ return remote;
105
+ }
106
+
107
+ function validateProjectPath(projectPath) {
108
+ if (!projectPath || projectPath.includes('\0')) {
109
+ throw new Error('Invalid project path');
110
+ }
111
+ const resolved = path.resolve(projectPath);
112
+ // Must be an absolute path after resolution
113
+ if (!path.isAbsolute(resolved)) {
114
+ throw new Error('Invalid project path: must be absolute');
115
+ }
116
+ // Block obviously dangerous paths
117
+ if (resolved === '/' || resolved === path.sep) {
118
+ throw new Error('Invalid project path: root directory not allowed');
119
+ }
120
+ return resolved;
121
+ }
122
+
123
+ /**
124
+ * Resolve the absolute project directory for a given DB `projectId`.
125
+ *
126
+ * After the projectName → projectId migration, every git endpoint receives
127
+ * the DB primary key (`project` query/body param). The legacy filesystem
128
+ * resolver that walked Claude's JSONL history is no longer used here; the
129
+ * path comes straight from the `projects` table and is then sanity-checked
130
+ * by `validateProjectPath` before any `git` command runs against it.
131
+ */
132
+ async function getActualProjectPath(projectId) {
133
+ const projectPath = await projectsDb.getProjectPathById(projectId);
134
+ if (!projectPath) {
135
+ throw new Error(`Unable to resolve project path for "${projectId}"`);
136
+ }
137
+ return validateProjectPath(projectPath);
138
+ }
139
+
140
+ // Helper function to strip git diff headers
141
+ function stripDiffHeaders(diff) {
142
+ if (!diff) return '';
143
+
144
+ const lines = diff.split('\n');
145
+ const filteredLines = [];
146
+ let startIncluding = false;
147
+
148
+ for (const line of lines) {
149
+ // Skip all header lines including diff --git, index, file mode, and --- / +++ file paths
150
+ if (line.startsWith('diff --git') ||
151
+ line.startsWith('index ') ||
152
+ line.startsWith('new file mode') ||
153
+ line.startsWith('deleted file mode') ||
154
+ line.startsWith('---') ||
155
+ line.startsWith('+++')) {
156
+ continue;
157
+ }
158
+
159
+ // Start including lines from @@ hunk headers onwards
160
+ if (line.startsWith('@@') || startIncluding) {
161
+ startIncluding = true;
162
+ filteredLines.push(line);
163
+ }
164
+ }
165
+
166
+ return filteredLines.join('\n');
167
+ }
168
+
169
+ // Helper function to validate git repository
170
+ async function validateGitRepository(projectPath) {
171
+ try {
172
+ // Check if directory exists
173
+ await fs.access(projectPath);
174
+ } catch {
175
+ throw new Error(`Project path not found: ${projectPath}`);
176
+ }
177
+
178
+ try {
179
+ // Allow any directory that is inside a work tree (repo root or nested folder).
180
+ const { stdout: insideWorkTreeOutput } = await spawnAsync('git', ['rev-parse', '--is-inside-work-tree'], { cwd: projectPath });
181
+ const isInsideWorkTree = insideWorkTreeOutput.trim() === 'true';
182
+ if (!isInsideWorkTree) {
183
+ throw new AppError('Not a git repository', {
184
+ code: 'NOT_A_GIT_REPOSITORY',
185
+ statusCode: 400,
186
+ });
187
+ }
188
+
189
+ // Ensure git can resolve the repository root for this directory.
190
+ await spawnAsync('git', ['rev-parse', '--show-toplevel'], { cwd: projectPath });
191
+ } catch (error) {
192
+ if (
193
+ error instanceof AppError
194
+ && error.code === 'NOT_A_GIT_REPOSITORY'
195
+ ) {
196
+ throw error;
197
+ }
198
+
199
+ if (/not a git repository/i.test(getGitErrorDetails(error))) {
200
+ throw new AppError('Not a git repository. Initialize a git repository with "git init" to use source control features.', {
201
+ code: 'NOT_A_GIT_REPOSITORY',
202
+ statusCode: 400,
203
+ });
204
+ }
205
+
206
+ throw error;
207
+ }
208
+ }
209
+
210
+ function getGitErrorDetails(error) {
211
+ return `${error?.message || ''} ${error?.stderr || ''} ${error?.stdout || ''}`;
212
+ }
213
+
214
+ function isMissingHeadRevisionError(error) {
215
+ const errorDetails = getGitErrorDetails(error).toLowerCase();
216
+ return errorDetails.includes('unknown revision')
217
+ || errorDetails.includes('ambiguous argument')
218
+ || errorDetails.includes('needed a single revision')
219
+ || errorDetails.includes('bad revision');
220
+ }
221
+
222
+ async function getCurrentBranchName(projectPath) {
223
+ try {
224
+ // symbolic-ref works even when the repository has no commits.
225
+ const { stdout } = await spawnAsync('git', ['symbolic-ref', '--short', 'HEAD'], { cwd: projectPath });
226
+ const branchName = stdout.trim();
227
+ if (branchName) {
228
+ return branchName;
229
+ }
230
+ } catch (error) {
231
+ // Fall back to rev-parse for detached HEAD and older git edge cases.
232
+ }
233
+
234
+ const { stdout } = await spawnAsync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: projectPath });
235
+ return stdout.trim();
236
+ }
237
+
238
+ async function repositoryHasCommits(projectPath) {
239
+ try {
240
+ await spawnAsync('git', ['rev-parse', '--verify', 'HEAD'], { cwd: projectPath });
241
+ return true;
242
+ } catch (error) {
243
+ if (isMissingHeadRevisionError(error)) {
244
+ return false;
245
+ }
246
+ throw error;
247
+ }
248
+ }
249
+
250
+ async function getRepositoryRootPath(projectPath) {
251
+ const { stdout } = await spawnAsync('git', ['rev-parse', '--show-toplevel'], { cwd: projectPath });
252
+ return stdout.trim();
253
+ }
254
+
255
+ function normalizeRepositoryRelativeFilePath(filePath) {
256
+ return String(filePath)
257
+ .replace(/\\/g, '/')
258
+ .replace(/^\.\/+/, '')
259
+ .replace(/^\/+/, '')
260
+ .trim();
261
+ }
262
+
263
+ function parseStatusFilePaths(statusOutput) {
264
+ return statusOutput
265
+ .split('\n')
266
+ .map((line) => line.trimEnd())
267
+ .filter((line) => line.trim())
268
+ .map((line) => {
269
+ const statusPath = line.substring(3);
270
+ const renamedFilePath = statusPath.split(' -> ')[1];
271
+ return normalizeRepositoryRelativeFilePath(renamedFilePath || statusPath);
272
+ })
273
+ .filter(Boolean);
274
+ }
275
+
276
+ function buildFilePathCandidates(projectPath, repositoryRootPath, filePath) {
277
+ const normalizedFilePath = normalizeRepositoryRelativeFilePath(filePath);
278
+ const projectRelativePath = normalizeRepositoryRelativeFilePath(path.relative(repositoryRootPath, projectPath));
279
+ const candidates = [normalizedFilePath];
280
+
281
+ if (
282
+ projectRelativePath
283
+ && projectRelativePath !== '.'
284
+ && !normalizedFilePath.startsWith(`${projectRelativePath}/`)
285
+ ) {
286
+ candidates.push(`${projectRelativePath}/${normalizedFilePath}`);
287
+ }
288
+
289
+ return Array.from(new Set(candidates.filter(Boolean)));
290
+ }
291
+
292
+ async function resolveRepositoryFilePath(projectPath, filePath) {
293
+ validateFilePath(filePath);
294
+
295
+ const repositoryRootPath = await getRepositoryRootPath(projectPath);
296
+ const candidateFilePaths = buildFilePathCandidates(projectPath, repositoryRootPath, filePath);
297
+
298
+ for (const candidateFilePath of candidateFilePaths) {
299
+ const { stdout } = await spawnAsync('git', ['status', '--porcelain', '--', candidateFilePath], { cwd: repositoryRootPath });
300
+ if (stdout.trim()) {
301
+ return {
302
+ repositoryRootPath,
303
+ repositoryRelativeFilePath: candidateFilePath,
304
+ };
305
+ }
306
+ }
307
+
308
+ // If the caller sent a bare filename (e.g. "hello.ts"), recover it from changed files.
309
+ const normalizedFilePath = normalizeRepositoryRelativeFilePath(filePath);
310
+ if (!normalizedFilePath.includes('/')) {
311
+ const { stdout: repositoryStatusOutput } = await spawnAsync('git', ['status', '--porcelain'], { cwd: repositoryRootPath });
312
+ const changedFilePaths = parseStatusFilePaths(repositoryStatusOutput);
313
+ const suffixMatches = changedFilePaths.filter(
314
+ (changedFilePath) => changedFilePath === normalizedFilePath || changedFilePath.endsWith(`/${normalizedFilePath}`),
315
+ );
316
+
317
+ if (suffixMatches.length === 1) {
318
+ return {
319
+ repositoryRootPath,
320
+ repositoryRelativeFilePath: suffixMatches[0],
321
+ };
322
+ }
323
+ }
324
+
325
+ return {
326
+ repositoryRootPath,
327
+ repositoryRelativeFilePath: candidateFilePaths[0],
328
+ };
329
+ }
330
+
331
+ // Get Git status for a project; parsing is isolated in git-parsing.service.ts.
332
+ router.get('/status', async (req, res) => {
333
+ const { project } = req.query;
334
+
335
+ if (!project) {
336
+ return res.status(400).json({ error: 'Project id is required' });
337
+ }
338
+
339
+ try {
340
+ const projectPath = await getActualProjectPath(project);
341
+
342
+ // Validate git repository
343
+ await validateGitRepository(projectPath);
344
+
345
+ const branch = await getCurrentBranchName(projectPath);
346
+ const hasCommits = await repositoryHasCommits(projectPath);
347
+
348
+ const { stdout: statusOutput } = await spawnAsync('git', ['status', '--porcelain=v1', '-z'], { cwd: projectPath });
349
+ const { modified, added, deleted, untracked, staged } = parseGitStatusOutput(statusOutput);
350
+
351
+ res.json({
352
+ branch,
353
+ hasCommits,
354
+ modified,
355
+ added,
356
+ deleted,
357
+ untracked,
358
+ staged
359
+ });
360
+ } catch (error) {
361
+ // Case-insensitive so "Not a git repository..." from validateGitRepository
362
+ // matches; `notGitRepository` lets the UI offer a one-click `git init`.
363
+ const isNotGitRepository = error instanceof AppError && error.code === 'NOT_A_GIT_REPOSITORY';
364
+ // A project without a repository is an expected state, not a failure.
365
+ if (!isNotGitRepository) {
366
+ console.error('Git status error:', error);
367
+ }
368
+ res.json({
369
+ error: isNotGitRepository ? 'Not a git repository' : 'Git operation failed',
370
+ details: isNotGitRepository ? error.message : `Failed to get git status: ${error.message}`,
371
+ notGitRepository: isNotGitRepository
372
+ });
373
+ }
374
+ });
375
+
376
+ // Initialize a new git repository in the project directory
377
+ router.post('/init', async (req, res) => {
378
+ const { project } = req.body;
379
+
380
+ if (!project) {
381
+ return res.status(400).json({ error: 'Project id is required' });
382
+ }
383
+
384
+ try {
385
+ const projectPath = await getActualProjectPath(project);
386
+
387
+ let isAlreadyRepository = false;
388
+ try {
389
+ await validateGitRepository(projectPath);
390
+ isAlreadyRepository = true;
391
+ } catch (error) {
392
+ if (!(error instanceof AppError) || error.code !== 'NOT_A_GIT_REPOSITORY') {
393
+ throw error;
394
+ }
395
+ // Not a repository yet — proceed with git init.
396
+ }
397
+
398
+ if (isAlreadyRepository) {
399
+ return res.json({ success: true, output: 'Repository already initialized' });
400
+ }
401
+
402
+ const { stdout, stderr } = await spawnAsync('git', ['init'], { cwd: projectPath });
403
+ res.json({ success: true, output: stdout.trim() || stderr.trim() });
404
+ } catch (error) {
405
+ console.error('Git init error:', error);
406
+ res.json({ success: false, error: error.stderr?.trim() || error.message });
407
+ }
408
+ });
409
+
410
+ // Get diff for a specific file
411
+ router.get('/diff', async (req, res) => {
412
+ const { project, file } = req.query;
413
+
414
+ if (!project || !file) {
415
+ return res.status(400).json({ error: 'Project id and file path are required' });
416
+ }
417
+
418
+ try {
419
+ const projectPath = await getActualProjectPath(project);
420
+
421
+ // Validate git repository
422
+ await validateGitRepository(projectPath);
423
+
424
+ const {
425
+ repositoryRootPath,
426
+ repositoryRelativeFilePath,
427
+ } = await resolveRepositoryFilePath(projectPath, file);
428
+
429
+ // Check if file is untracked or deleted
430
+ const { stdout: statusOutput } = await spawnAsync(
431
+ 'git',
432
+ ['status', '--porcelain', '--', repositoryRelativeFilePath],
433
+ { cwd: repositoryRootPath },
434
+ );
435
+ const isUntracked = statusOutput.startsWith('??');
436
+ const isDeleted = statusOutput.trim().startsWith('D ') || statusOutput.trim().startsWith(' D');
437
+
438
+ let diff;
439
+ if (isUntracked) {
440
+ // For untracked files, show the entire file content as additions
441
+ const filePath = path.join(repositoryRootPath, repositoryRelativeFilePath);
442
+ const stats = await fs.stat(filePath);
443
+
444
+ if (stats.isDirectory()) {
445
+ // For directories, show a simple message
446
+ diff = `Directory: ${repositoryRelativeFilePath}\n(Cannot show diff for directories)`;
447
+ } else {
448
+ const fileContent = await fs.readFile(filePath, 'utf-8');
449
+ const lines = fileContent.split('\n');
450
+ diff = `--- /dev/null\n+++ b/${repositoryRelativeFilePath}\n@@ -0,0 +1,${lines.length} @@\n` +
451
+ lines.map(line => `+${line}`).join('\n');
452
+ }
453
+ } else if (isDeleted) {
454
+ // For deleted files, show the entire file content from HEAD as deletions
455
+ const { stdout: fileContent } = await spawnAsync(
456
+ 'git',
457
+ ['show', `HEAD:${repositoryRelativeFilePath}`],
458
+ { cwd: repositoryRootPath },
459
+ );
460
+ const lines = fileContent.split('\n');
461
+ diff = `--- a/${repositoryRelativeFilePath}\n+++ /dev/null\n@@ -1,${lines.length} +0,0 @@\n` +
462
+ lines.map(line => `-${line}`).join('\n');
463
+ } else {
464
+ // Get diff for tracked files
465
+ // First check for unstaged changes (working tree vs index)
466
+ const { stdout: unstagedDiff } = await spawnAsync(
467
+ 'git',
468
+ ['diff', '--', repositoryRelativeFilePath],
469
+ { cwd: repositoryRootPath },
470
+ );
471
+
472
+ if (unstagedDiff) {
473
+ // Show unstaged changes if they exist
474
+ diff = stripDiffHeaders(unstagedDiff);
475
+ } else {
476
+ // If no unstaged changes, check for staged changes (index vs HEAD)
477
+ const { stdout: stagedDiff } = await spawnAsync(
478
+ 'git',
479
+ ['diff', '--cached', '--', repositoryRelativeFilePath],
480
+ { cwd: repositoryRootPath },
481
+ );
482
+ diff = stripDiffHeaders(stagedDiff) || '';
483
+ }
484
+ }
485
+
486
+ res.json({ diff });
487
+ } catch (error) {
488
+ console.error('Git diff error:', error);
489
+ res.json({ error: error.message });
490
+ }
491
+ });
492
+
493
+ // Get file content with diff information for CodeEditor
494
+ router.get('/file-with-diff', async (req, res) => {
495
+ const { project, file } = req.query;
496
+
497
+ if (!project || !file) {
498
+ return res.status(400).json({ error: 'Project id and file path are required' });
499
+ }
500
+
501
+ try {
502
+ const projectPath = await getActualProjectPath(project);
503
+
504
+ // Validate git repository
505
+ await validateGitRepository(projectPath);
506
+
507
+ const {
508
+ repositoryRootPath,
509
+ repositoryRelativeFilePath,
510
+ } = await resolveRepositoryFilePath(projectPath, file);
511
+
512
+ // Check file status
513
+ const { stdout: statusOutput } = await spawnAsync(
514
+ 'git',
515
+ ['status', '--porcelain', '--', repositoryRelativeFilePath],
516
+ { cwd: repositoryRootPath },
517
+ );
518
+ const isUntracked = statusOutput.startsWith('??');
519
+ const isDeleted = statusOutput.trim().startsWith('D ') || statusOutput.trim().startsWith(' D');
520
+
521
+ let currentContent = '';
522
+ let oldContent = '';
523
+
524
+ if (isDeleted) {
525
+ // For deleted files, get content from HEAD
526
+ const { stdout: headContent } = await spawnAsync(
527
+ 'git',
528
+ ['show', `HEAD:${repositoryRelativeFilePath}`],
529
+ { cwd: repositoryRootPath },
530
+ );
531
+ oldContent = headContent;
532
+ currentContent = headContent; // Show the deleted content in editor
533
+ } else {
534
+ // Get current file content
535
+ const filePath = path.join(repositoryRootPath, repositoryRelativeFilePath);
536
+ const stats = await fs.stat(filePath);
537
+
538
+ if (stats.isDirectory()) {
539
+ // Cannot show content for directories
540
+ return res.status(400).json({ error: 'Cannot show diff for directories' });
541
+ }
542
+
543
+ currentContent = await fs.readFile(filePath, 'utf-8');
544
+
545
+ if (!isUntracked) {
546
+ // Get the old content from HEAD for tracked files
547
+ try {
548
+ const { stdout: headContent } = await spawnAsync(
549
+ 'git',
550
+ ['show', `HEAD:${repositoryRelativeFilePath}`],
551
+ { cwd: repositoryRootPath },
552
+ );
553
+ oldContent = headContent;
554
+ } catch (error) {
555
+ // File might be newly added to git (staged but not committed)
556
+ oldContent = '';
557
+ }
558
+ }
559
+ }
560
+
561
+ res.json({
562
+ currentContent,
563
+ oldContent,
564
+ isDeleted,
565
+ isUntracked
566
+ });
567
+ } catch (error) {
568
+ console.error('Git file-with-diff error:', error);
569
+ res.json({ error: error.message });
570
+ }
571
+ });
572
+
573
+ // Create initial commit
574
+ router.post('/initial-commit', async (req, res) => {
575
+ const { project } = req.body;
576
+
577
+ if (!project) {
578
+ return res.status(400).json({ error: 'Project id is required' });
579
+ }
580
+
581
+ try {
582
+ const projectPath = await getActualProjectPath(project);
583
+
584
+ // Validate git repository
585
+ await validateGitRepository(projectPath);
586
+
587
+ // Check if there are already commits
588
+ try {
589
+ await spawnAsync('git', ['rev-parse', 'HEAD'], { cwd: projectPath });
590
+ return res.status(400).json({ error: 'Repository already has commits. Use regular commit instead.' });
591
+ } catch (error) {
592
+ // No HEAD - this is good, we can create initial commit
593
+ }
594
+
595
+ // Add all files
596
+ await spawnAsync('git', ['add', '.'], { cwd: projectPath });
597
+
598
+ // Create initial commit
599
+ const { stdout } = await spawnAsync('git', ['commit', '-m', 'Initial commit'], { cwd: projectPath });
600
+
601
+ res.json({ success: true, output: stdout, message: 'Initial commit created successfully' });
602
+ } catch (error) {
603
+ console.error('Git initial commit error:', error);
604
+
605
+ // Handle the case where there's nothing to commit
606
+ if (error.message.includes('nothing to commit')) {
607
+ return res.status(400).json({
608
+ error: 'Nothing to commit',
609
+ details: 'No files found in the repository. Add some files first.'
610
+ });
611
+ }
612
+
613
+ res.status(500).json({ error: error.message });
614
+ }
615
+ });
616
+
617
+ // Commit changes
618
+ router.post('/commit', async (req, res) => {
619
+ const { project, message, files } = req.body;
620
+
621
+ if (!project || !message || !files || files.length === 0) {
622
+ return res.status(400).json({ error: 'Project name, commit message, and files are required' });
623
+ }
624
+
625
+ try {
626
+ const projectPath = await getActualProjectPath(project);
627
+
628
+ // Validate git repository
629
+ await validateGitRepository(projectPath);
630
+ const repositoryRootPath = await getRepositoryRootPath(projectPath);
631
+
632
+ // Stage selected files
633
+ for (const file of files) {
634
+ const { repositoryRelativeFilePath } = await resolveRepositoryFilePath(projectPath, file);
635
+ await spawnAsync('git', ['add', '--', repositoryRelativeFilePath], { cwd: repositoryRootPath });
636
+ }
637
+
638
+ // Commit with message
639
+ const { stdout } = await spawnAsync('git', ['commit', '-m', message], { cwd: repositoryRootPath });
640
+
641
+ res.json({ success: true, output: stdout });
642
+ } catch (error) {
643
+ console.error('Git commit error:', error);
644
+ res.status(500).json({ error: error.message });
645
+ }
646
+ });
647
+
648
+ // Stage files (git add). Mirrors what the UI shows as the "Staged" section,
649
+ // so the app's staging state and the real git index never drift apart.
650
+ router.post('/stage', async (req, res) => {
651
+ const { project, files } = req.body;
652
+
653
+ if (!project || !Array.isArray(files) || files.length === 0) {
654
+ return res.status(400).json({ error: 'Project id and files are required' });
655
+ }
656
+
657
+ try {
658
+ const projectPath = await getActualProjectPath(project);
659
+ await validateGitRepository(projectPath);
660
+ const repositoryRootPath = await getRepositoryRootPath(projectPath);
661
+
662
+ for (const file of files) {
663
+ const { repositoryRelativeFilePath } = await resolveRepositoryFilePath(projectPath, file);
664
+ await spawnAsync('git', ['add', '--', repositoryRelativeFilePath], { cwd: repositoryRootPath });
665
+ }
666
+
667
+ res.json({ success: true });
668
+ } catch (error) {
669
+ console.error('Git stage error:', error);
670
+ res.status(500).json({ error: error.message });
671
+ }
672
+ });
673
+
674
+ // Unstage files (remove from the index, keep the worktree changes)
675
+ router.post('/unstage', async (req, res) => {
676
+ const { project, files } = req.body;
677
+
678
+ if (!project || !Array.isArray(files) || files.length === 0) {
679
+ return res.status(400).json({ error: 'Project id and files are required' });
680
+ }
681
+
682
+ try {
683
+ const projectPath = await getActualProjectPath(project);
684
+ await validateGitRepository(projectPath);
685
+ const repositoryRootPath = await getRepositoryRootPath(projectPath);
686
+ const hasCommits = await repositoryHasCommits(projectPath);
687
+
688
+ for (const file of files) {
689
+ const { repositoryRelativeFilePath } = await resolveRepositoryFilePath(projectPath, file);
690
+ if (hasCommits) {
691
+ await spawnAsync('git', ['reset', 'HEAD', '--', repositoryRelativeFilePath], { cwd: repositoryRootPath });
692
+ } else {
693
+ // No HEAD to reset against before the first commit; dropping the
694
+ // index entry is the only way to unstage while keeping the file.
695
+ await spawnAsync('git', ['rm', '--cached', '-r', '--force', '--', repositoryRelativeFilePath], { cwd: repositoryRootPath });
696
+ }
697
+ }
698
+
699
+ res.json({ success: true });
700
+ } catch (error) {
701
+ console.error('Git unstage error:', error);
702
+ res.status(500).json({ error: error.message });
703
+ }
704
+ });
705
+
706
+ // Revert latest local commit (keeps changes staged)
707
+ router.post('/revert-local-commit', async (req, res) => {
708
+ const { project } = req.body;
709
+
710
+ if (!project) {
711
+ return res.status(400).json({ error: 'Project id is required' });
712
+ }
713
+
714
+ try {
715
+ const projectPath = await getActualProjectPath(project);
716
+ await validateGitRepository(projectPath);
717
+
718
+ try {
719
+ await spawnAsync('git', ['rev-parse', '--verify', 'HEAD'], { cwd: projectPath });
720
+ } catch (error) {
721
+ return res.status(400).json({
722
+ error: 'No local commit to revert',
723
+ details: 'This repository has no commit yet.',
724
+ });
725
+ }
726
+
727
+ try {
728
+ // Soft reset rewinds one commit while preserving all file changes in the index.
729
+ await spawnAsync('git', ['reset', '--soft', 'HEAD~1'], { cwd: projectPath });
730
+ } catch (error) {
731
+ const errorDetails = `${error.stderr || ''} ${error.message || ''}`;
732
+ const isInitialCommit = errorDetails.includes('HEAD~1') &&
733
+ (errorDetails.includes('unknown revision') || errorDetails.includes('ambiguous argument'));
734
+
735
+ if (!isInitialCommit) {
736
+ throw error;
737
+ }
738
+
739
+ // Initial commit has no parent; deleting HEAD uncommits it and keeps files staged.
740
+ await spawnAsync('git', ['update-ref', '-d', 'HEAD'], { cwd: projectPath });
741
+ }
742
+
743
+ res.json({
744
+ success: true,
745
+ output: 'Latest local commit reverted successfully. Changes were kept staged.',
746
+ });
747
+ } catch (error) {
748
+ console.error('Git revert local commit error:', error);
749
+ res.status(500).json({ error: error.message });
750
+ }
751
+ });
752
+
753
+ // Get list of branches
754
+ router.get('/branches', async (req, res) => {
755
+ const { project } = req.query;
756
+
757
+ if (!project) {
758
+ return res.status(400).json({ error: 'Project id is required' });
759
+ }
760
+
761
+ try {
762
+ const projectPath = await getActualProjectPath(project);
763
+
764
+ // Validate git repository
765
+ await validateGitRepository(projectPath);
766
+
767
+ // Get all branches
768
+ const { stdout } = await spawnAsync('git', ['branch', '-a'], { cwd: projectPath });
769
+
770
+ const rawLines = stdout
771
+ .split('\n')
772
+ .map(b => b.trim())
773
+ .filter(b => b && !b.includes('->'));
774
+
775
+ // Local branches (may start with '* ' for current)
776
+ const localBranches = rawLines
777
+ .filter(b => !b.startsWith('remotes/'))
778
+ .map(b => (b.startsWith('* ') ? b.substring(2) : b));
779
+
780
+ // Remote branches — strip 'remotes/<remote>/' prefix
781
+ const remoteBranches = rawLines
782
+ .filter(b => b.startsWith('remotes/'))
783
+ .map(b => b.replace(/^remotes\/[^/]+\//, ''))
784
+ .filter(name => !localBranches.includes(name)); // skip if already a local branch
785
+
786
+ // Backward-compat flat list (local + unique remotes, deduplicated)
787
+ const branches = [...localBranches, ...remoteBranches]
788
+ .filter((b, i, arr) => arr.indexOf(b) === i);
789
+
790
+ res.json({ branches, localBranches, remoteBranches });
791
+ } catch (error) {
792
+ console.error('Git branches error:', error);
793
+ res.json({ error: error.message });
794
+ }
795
+ });
796
+
797
+ // Checkout branch
798
+ router.post('/checkout', async (req, res) => {
799
+ const { project, branch } = req.body;
800
+
801
+ if (!project || !branch) {
802
+ return res.status(400).json({ error: 'Project id and branch are required' });
803
+ }
804
+
805
+ try {
806
+ const projectPath = await getActualProjectPath(project);
807
+
808
+ // Checkout the branch
809
+ validateBranchName(branch);
810
+ const { stdout } = await spawnAsync('git', ['checkout', branch], { cwd: projectPath });
811
+
812
+ res.json({ success: true, output: stdout });
813
+ } catch (error) {
814
+ console.error('Git checkout error:', error);
815
+ res.status(500).json({ error: error.message });
816
+ }
817
+ });
818
+
819
+ // Create new branch
820
+ router.post('/create-branch', async (req, res) => {
821
+ const { project, branch } = req.body;
822
+
823
+ if (!project || !branch) {
824
+ return res.status(400).json({ error: 'Project id and branch name are required' });
825
+ }
826
+
827
+ try {
828
+ const projectPath = await getActualProjectPath(project);
829
+
830
+ // Create and checkout new branch
831
+ validateBranchName(branch);
832
+ const { stdout } = await spawnAsync('git', ['checkout', '-b', branch], { cwd: projectPath });
833
+
834
+ res.json({ success: true, output: stdout });
835
+ } catch (error) {
836
+ console.error('Git create branch error:', error);
837
+ res.status(500).json({ error: error.message });
838
+ }
839
+ });
840
+
841
+ // Delete a local branch
842
+ router.post('/delete-branch', async (req, res) => {
843
+ const { project, branch, force = false } = req.body;
844
+
845
+ if (!project || !branch) {
846
+ return res.status(400).json({ error: 'Project id and branch name are required' });
847
+ }
848
+
849
+ if (typeof force !== 'boolean') {
850
+ return res.status(400).json({ error: 'force must be a boolean' });
851
+ }
852
+
853
+ try {
854
+ const projectPath = await getActualProjectPath(project);
855
+ await validateGitRepository(projectPath);
856
+ validateBranchName(branch);
857
+ const stdout = await deleteLocalBranch({
858
+ projectPath,
859
+ branch,
860
+ force,
861
+ runCommand: spawnAsync,
862
+ });
863
+ res.json({ success: true, output: stdout });
864
+ } catch (error) {
865
+ console.error('Git delete branch error:', error);
866
+ if (error instanceof AppError) {
867
+ return res.status(error.statusCode).json({ error: error.message });
868
+ }
869
+ res.status(500).json({ error: error.message });
870
+ }
871
+ });
872
+
873
+ // Fields are joined with the ASCII unit separator so pipes (or anything else
874
+ // typed into a commit subject) cannot break parsing.
875
+ const GIT_LOG_PRETTY_FORMAT = '%H%x1f%P%x1f%D%x1f%an%x1f%ae%x1f%ad%x1f%s';
876
+
877
+ // Get recent commits (across all branches, in graph order)
878
+ router.get('/commits', async (req, res) => {
879
+ const { project, limit = 10 } = req.query;
880
+
881
+ if (!project) {
882
+ return res.status(400).json({ error: 'Project id is required' });
883
+ }
884
+
885
+ try {
886
+ const projectPath = await getActualProjectPath(project);
887
+ await validateGitRepository(projectPath);
888
+ const parsedLimit = Number.parseInt(String(limit), 10);
889
+ const safeLimit = Number.isFinite(parsedLimit) && parsedLimit > 0
890
+ ? Math.min(parsedLimit, 100)
891
+ : 10;
892
+
893
+ // Branches/remotes/tags (not --all, which would drag in refs/stash) with
894
+ // `--topo-order` guarantee children appear before their parents across
895
+ // every branch, which the frontend lane-assignment relies on.
896
+ // `--shortstat` replaces the previous per-commit `git show --stat` calls.
897
+ const { stdout } = await spawnAsync(
898
+ 'git',
899
+ [
900
+ 'log',
901
+ '--branches',
902
+ '--remotes',
903
+ '--tags',
904
+ '--topo-order',
905
+ '--shortstat',
906
+ `--pretty=format:${GIT_LOG_PRETTY_FORMAT}`,
907
+ '--date=iso-strict',
908
+ '-n', String(safeLimit)
909
+ ],
910
+ { cwd: projectPath },
911
+ );
912
+
913
+ res.json({ commits: parseGitLogWithStats(stdout) });
914
+ } catch (error) {
915
+ console.error('Git commits error:', error);
916
+ res.json({ error: error.message });
917
+ }
918
+ });
919
+
920
+ // Get diff for a specific commit
921
+ router.get('/commit-diff', async (req, res) => {
922
+ const { project, commit } = req.query;
923
+
924
+ if (!project || !commit) {
925
+ return res.status(400).json({ error: 'Project id and commit hash are required' });
926
+ }
927
+
928
+ try {
929
+ const projectPath = await getActualProjectPath(project);
930
+
931
+ // Validate commit reference (defense-in-depth)
932
+ validateCommitRef(commit);
933
+
934
+ // Get diff for the commit
935
+ const { stdout } = await spawnAsync(
936
+ 'git', ['show', commit],
937
+ { cwd: projectPath }
938
+ );
939
+
940
+ const isTruncated = stdout.length > COMMIT_DIFF_CHARACTER_LIMIT;
941
+ const diff = isTruncated
942
+ ? `${stdout.slice(0, COMMIT_DIFF_CHARACTER_LIMIT)}\n\n... Diff truncated to keep the UI responsive ...`
943
+ : stdout;
944
+
945
+ res.json({ diff, isTruncated });
946
+ } catch (error) {
947
+ console.error('Git commit diff error:', error);
948
+ res.json({ error: error.message });
949
+ }
950
+ });
951
+
952
+ // Generate commit message based on staged changes using AI
953
+ router.post('/generate-commit-message', async (req, res) => {
954
+ const { project, files, provider = 'claude' } = req.body;
955
+
956
+ if (!project || !files || files.length === 0) {
957
+ return res.status(400).json({ error: 'Project id and files are required' });
958
+ }
959
+
960
+ // Validate provider
961
+ if (!['claude', 'cursor'].includes(provider)) {
962
+ return res.status(400).json({ error: 'provider must be "claude" or "cursor"' });
963
+ }
964
+
965
+ try {
966
+ const projectPath = await getActualProjectPath(project);
967
+ await validateGitRepository(projectPath);
968
+ const repositoryRootPath = await getRepositoryRootPath(projectPath);
969
+
970
+ // Get diff for selected files
971
+ let diffContext = '';
972
+ for (const file of files) {
973
+ try {
974
+ const { repositoryRelativeFilePath } = await resolveRepositoryFilePath(projectPath, file);
975
+ const { stdout } = await spawnAsync(
976
+ 'git', ['diff', 'HEAD', '--', repositoryRelativeFilePath],
977
+ { cwd: repositoryRootPath }
978
+ );
979
+ if (stdout) {
980
+ diffContext += `\n--- ${repositoryRelativeFilePath} ---\n${stdout}`;
981
+ }
982
+ } catch (error) {
983
+ console.error(`Error getting diff for ${file}:`, error);
984
+ }
985
+ }
986
+
987
+ // If no diff found, might be untracked files
988
+ if (!diffContext.trim()) {
989
+ // Try to get content of untracked files
990
+ for (const file of files) {
991
+ try {
992
+ const { repositoryRelativeFilePath } = await resolveRepositoryFilePath(projectPath, file);
993
+ const filePath = path.join(repositoryRootPath, repositoryRelativeFilePath);
994
+ const stats = await fs.stat(filePath);
995
+
996
+ if (!stats.isDirectory()) {
997
+ const content = await fs.readFile(filePath, 'utf-8');
998
+ diffContext += `\n--- ${repositoryRelativeFilePath} (new file) ---\n${content.substring(0, 1000)}\n`;
999
+ } else {
1000
+ diffContext += `\n--- ${repositoryRelativeFilePath} (new directory) ---\n`;
1001
+ }
1002
+ } catch (error) {
1003
+ console.error(`Error reading file ${file}:`, error);
1004
+ }
1005
+ }
1006
+ }
1007
+
1008
+ // Generate commit message using AI
1009
+ const message = await generateCommitMessageWithAI(files, diffContext, provider, projectPath);
1010
+
1011
+ res.json({ message });
1012
+ } catch (error) {
1013
+ console.error('Generate commit message error:', error);
1014
+ res.status(500).json({ error: error.message });
1015
+ }
1016
+ });
1017
+
1018
+ /**
1019
+ * Generates a commit message using AI (Claude SDK or Cursor CLI)
1020
+ * @param {Array<string>} files - List of changed files
1021
+ * @param {string} diffContext - Git diff content
1022
+ * @param {string} provider - 'claude' or 'cursor'
1023
+ * @param {string} projectPath - Project directory path
1024
+ * @returns {Promise<string>} Generated commit message
1025
+ */
1026
+ async function generateCommitMessageWithAI(files, diffContext, provider, projectPath) {
1027
+ // Create the prompt
1028
+ const prompt = `Generate a conventional commit message for these changes.
1029
+
1030
+ REQUIREMENTS:
1031
+ - Format: type(scope): subject
1032
+ - Include body explaining what changed and why
1033
+ - Types: feat, fix, docs, style, refactor, perf, test, build, ci, chore
1034
+ - Subject under 50 chars, body wrapped at 72 chars
1035
+ - Focus on user-facing changes, not implementation details
1036
+ - Consider what's being added AND removed
1037
+ - Return ONLY the commit message (no markdown, explanations, or code blocks)
1038
+
1039
+ FILES CHANGED:
1040
+ ${files.map(f => `- ${f}`).join('\n')}
1041
+
1042
+ DIFFS:
1043
+ ${diffContext.substring(0, 4000)}
1044
+
1045
+ Generate the commit message:`;
1046
+
1047
+ try {
1048
+ // Create a simple writer that collects the response
1049
+ let responseText = '';
1050
+ const writer = {
1051
+ send: (data) => {
1052
+ try {
1053
+ const parsed = typeof data === 'string' ? JSON.parse(data) : data;
1054
+ console.log('🔍 Writer received message type:', parsed.type);
1055
+
1056
+ // Handle different message formats from Claude SDK and Cursor CLI
1057
+ // Claude SDK sends: {type: 'claude-response', data: {message: {content: [...]}}}
1058
+ if (parsed.type === 'claude-response' && parsed.data) {
1059
+ const message = parsed.data.message || parsed.data;
1060
+ console.log('📦 Claude response message:', JSON.stringify(message, null, 2).substring(0, 500));
1061
+ if (message.content && Array.isArray(message.content)) {
1062
+ // Extract text from content array
1063
+ for (const item of message.content) {
1064
+ if (item.type === 'text' && item.text) {
1065
+ console.log('✅ Extracted text chunk:', item.text.substring(0, 100));
1066
+ responseText += item.text;
1067
+ }
1068
+ }
1069
+ }
1070
+ }
1071
+ // Cursor CLI sends: {type: 'cursor-output', output: '...'}
1072
+ else if (parsed.type === 'cursor-output' && parsed.output) {
1073
+ console.log('✅ Cursor output:', parsed.output.substring(0, 100));
1074
+ responseText += parsed.output;
1075
+ }
1076
+ // Also handle direct text messages
1077
+ else if (parsed.type === 'text' && parsed.text) {
1078
+ console.log('✅ Direct text:', parsed.text.substring(0, 100));
1079
+ responseText += parsed.text;
1080
+ }
1081
+ } catch (e) {
1082
+ // Ignore parse errors
1083
+ console.error('Error parsing writer data:', e);
1084
+ }
1085
+ },
1086
+ setSessionId: () => {}, // No-op for this use case
1087
+ };
1088
+
1089
+ console.log('🚀 Calling AI agent with provider:', provider);
1090
+ console.log('📝 Prompt length:', prompt.length);
1091
+
1092
+ // Call the appropriate agent
1093
+ if (provider === 'claude') {
1094
+ await queryClaudeSDK(prompt, {
1095
+ cwd: projectPath,
1096
+ permissionMode: 'bypassPermissions',
1097
+ model: 'sonnet'
1098
+ }, writer);
1099
+ } else if (provider === 'cursor') {
1100
+ await spawnCursor(prompt, {
1101
+ cwd: projectPath,
1102
+ skipPermissions: true
1103
+ }, writer);
1104
+ }
1105
+
1106
+ console.log('📊 Total response text collected:', responseText.length, 'characters');
1107
+ console.log('📄 Response preview:', responseText.substring(0, 200));
1108
+
1109
+ // Clean up the response
1110
+ const cleanedMessage = cleanCommitMessage(responseText);
1111
+ console.log('🧹 Cleaned message:', cleanedMessage.substring(0, 200));
1112
+
1113
+ return cleanedMessage || 'chore: update files';
1114
+ } catch (error) {
1115
+ console.error('Error generating commit message with AI:', error);
1116
+ // Fallback to simple message
1117
+ return `chore: update ${files.length} file${files.length !== 1 ? 's' : ''}`;
1118
+ }
1119
+ }
1120
+
1121
+ /**
1122
+ * Cleans the AI-generated commit message by removing markdown, code blocks, and extra formatting
1123
+ * @param {string} text - Raw AI response
1124
+ * @returns {string} Clean commit message
1125
+ */
1126
+ function cleanCommitMessage(text) {
1127
+ if (!text || !text.trim()) {
1128
+ return '';
1129
+ }
1130
+
1131
+ let cleaned = text.trim();
1132
+
1133
+ // Remove markdown code blocks
1134
+ cleaned = cleaned.replace(/```[a-z]*\n/g, '');
1135
+ cleaned = cleaned.replace(/```/g, '');
1136
+
1137
+ // Remove markdown headers
1138
+ cleaned = cleaned.replace(/^#+\s*/gm, '');
1139
+
1140
+ // Remove leading/trailing quotes
1141
+ cleaned = cleaned.replace(/^["']|["']$/g, '');
1142
+
1143
+ // If there are multiple lines, take everything (subject + body)
1144
+ // Just clean up extra blank lines
1145
+ cleaned = cleaned.replace(/\n{3,}/g, '\n\n');
1146
+
1147
+ // Remove any explanatory text before the actual commit message
1148
+ // Look for conventional commit pattern and start from there
1149
+ const conventionalCommitMatch = cleaned.match(/(feat|fix|docs|style|refactor|perf|test|build|ci|chore)(\(.+?\))?:.+/s);
1150
+ if (conventionalCommitMatch) {
1151
+ cleaned = cleaned.substring(cleaned.indexOf(conventionalCommitMatch[0]));
1152
+ }
1153
+
1154
+ return cleaned.trim();
1155
+ }
1156
+
1157
+ // Get remote status (ahead/behind commits with smart remote detection)
1158
+ router.get('/remote-status', async (req, res) => {
1159
+ const { project } = req.query;
1160
+
1161
+ if (!project) {
1162
+ return res.status(400).json({ error: 'Project id is required' });
1163
+ }
1164
+
1165
+ try {
1166
+ const projectPath = await getActualProjectPath(project);
1167
+ await validateGitRepository(projectPath);
1168
+
1169
+ const branch = await getCurrentBranchName(projectPath);
1170
+ const hasCommits = await repositoryHasCommits(projectPath);
1171
+
1172
+ const { stdout: remoteOutput } = await spawnAsync('git', ['remote'], { cwd: projectPath });
1173
+ const remotes = remoteOutput.trim().split('\n').filter(r => r.trim());
1174
+ const hasRemote = remotes.length > 0;
1175
+ const fallbackRemoteName = hasRemote
1176
+ ? (remotes.includes('origin') ? 'origin' : remotes[0])
1177
+ : null;
1178
+
1179
+ // Repositories initialized with `git init` can have a branch but no commits.
1180
+ // Return a non-error state so the UI can show the initial-commit workflow.
1181
+ if (!hasCommits) {
1182
+ return res.json({
1183
+ hasRemote,
1184
+ hasUpstream: false,
1185
+ branch,
1186
+ remoteName: fallbackRemoteName,
1187
+ ahead: 0,
1188
+ behind: 0,
1189
+ isUpToDate: false,
1190
+ message: 'Repository has no commits yet'
1191
+ });
1192
+ }
1193
+
1194
+ // Check if there's a remote tracking branch (smart detection)
1195
+ let trackingBranch;
1196
+ let remoteName;
1197
+ try {
1198
+ const { stdout } = await spawnAsync('git', ['rev-parse', '--abbrev-ref', `${branch}@{upstream}`], { cwd: projectPath });
1199
+ trackingBranch = stdout.trim();
1200
+ remoteName = trackingBranch.split('/')[0]; // Extract remote name (e.g., "origin/main" -> "origin")
1201
+ } catch (error) {
1202
+ return res.json({
1203
+ hasRemote,
1204
+ hasUpstream: false,
1205
+ branch,
1206
+ remoteName: fallbackRemoteName,
1207
+ message: 'No remote tracking branch configured'
1208
+ });
1209
+ }
1210
+
1211
+ // Get ahead/behind counts
1212
+ const { stdout: countOutput } = await spawnAsync(
1213
+ 'git', ['rev-list', '--count', '--left-right', `${trackingBranch}...HEAD`],
1214
+ { cwd: projectPath }
1215
+ );
1216
+
1217
+ const [behind, ahead] = countOutput.trim().split('\t').map(Number);
1218
+
1219
+ res.json({
1220
+ hasRemote: true,
1221
+ hasUpstream: true,
1222
+ branch,
1223
+ remoteBranch: trackingBranch,
1224
+ remoteName,
1225
+ ahead: ahead || 0,
1226
+ behind: behind || 0,
1227
+ isUpToDate: ahead === 0 && behind === 0
1228
+ });
1229
+ } catch (error) {
1230
+ console.error('Git remote status error:', error);
1231
+ res.json({ error: error.message });
1232
+ }
1233
+ });
1234
+
1235
+ // Fetch from remote (using smart remote detection)
1236
+ router.post('/fetch', async (req, res) => {
1237
+ const { project } = req.body;
1238
+
1239
+ if (!project) {
1240
+ return res.status(400).json({ error: 'Project id is required' });
1241
+ }
1242
+
1243
+ try {
1244
+ const projectPath = await getActualProjectPath(project);
1245
+ await validateGitRepository(projectPath);
1246
+
1247
+ // Get current branch and its upstream remote
1248
+ const branch = await getCurrentBranchName(projectPath);
1249
+
1250
+ let remoteName = 'origin'; // fallback
1251
+ try {
1252
+ const { stdout } = await spawnAsync('git', ['rev-parse', '--abbrev-ref', `${branch}@{upstream}`], { cwd: projectPath });
1253
+ remoteName = stdout.trim().split('/')[0]; // Extract remote name
1254
+ } catch (error) {
1255
+ // No upstream, try to fetch from origin anyway
1256
+ console.log('No upstream configured, using origin as fallback');
1257
+ }
1258
+
1259
+ validateRemoteName(remoteName);
1260
+ const { stdout } = await spawnAsync('git', ['fetch', remoteName], { cwd: projectPath });
1261
+
1262
+ res.json({ success: true, output: stdout || 'Fetch completed successfully', remoteName });
1263
+ } catch (error) {
1264
+ console.error('Git fetch error:', error);
1265
+ res.status(500).json({
1266
+ error: 'Fetch failed',
1267
+ details: error.message.includes('Could not resolve hostname')
1268
+ ? 'Unable to connect to remote repository. Check your internet connection.'
1269
+ : error.message.includes('fatal: \'origin\' does not appear to be a git repository')
1270
+ ? 'No remote repository configured. Add a remote with: git remote add origin <url>'
1271
+ : error.message
1272
+ });
1273
+ }
1274
+ });
1275
+
1276
+ // Pull from remote (fetch + merge using smart remote detection)
1277
+ router.post('/pull', async (req, res) => {
1278
+ const { project } = req.body;
1279
+
1280
+ if (!project) {
1281
+ return res.status(400).json({ error: 'Project id is required' });
1282
+ }
1283
+
1284
+ try {
1285
+ const projectPath = await getActualProjectPath(project);
1286
+ await validateGitRepository(projectPath);
1287
+
1288
+ // Get current branch and its upstream remote
1289
+ const branch = await getCurrentBranchName(projectPath);
1290
+
1291
+ let remoteName = 'origin'; // fallback
1292
+ let remoteBranch = branch; // fallback
1293
+ try {
1294
+ const { stdout } = await spawnAsync('git', ['rev-parse', '--abbrev-ref', `${branch}@{upstream}`], { cwd: projectPath });
1295
+ const tracking = stdout.trim();
1296
+ remoteName = tracking.split('/')[0]; // Extract remote name
1297
+ remoteBranch = tracking.split('/').slice(1).join('/'); // Extract branch name
1298
+ } catch (error) {
1299
+ // No upstream, use fallback
1300
+ console.log('No upstream configured, using origin/branch as fallback');
1301
+ }
1302
+
1303
+ validateRemoteName(remoteName);
1304
+ validateBranchName(remoteBranch);
1305
+ const { stdout } = await spawnAsync('git', ['pull', remoteName, remoteBranch], { cwd: projectPath });
1306
+
1307
+ res.json({
1308
+ success: true,
1309
+ output: stdout || 'Pull completed successfully',
1310
+ remoteName,
1311
+ remoteBranch
1312
+ });
1313
+ } catch (error) {
1314
+ console.error('Git pull error:', error);
1315
+
1316
+ // Enhanced error handling for common pull scenarios
1317
+ let errorMessage = 'Pull failed';
1318
+ let details = error.message;
1319
+
1320
+ if (error.message.includes('CONFLICT')) {
1321
+ errorMessage = 'Merge conflicts detected';
1322
+ details = 'Pull created merge conflicts. Please resolve conflicts manually in the editor, then commit the changes.';
1323
+ } else if (error.message.includes('Please commit your changes or stash them')) {
1324
+ errorMessage = 'Uncommitted changes detected';
1325
+ details = 'Please commit or stash your local changes before pulling.';
1326
+ } else if (error.message.includes('Could not resolve hostname')) {
1327
+ errorMessage = 'Network error';
1328
+ details = 'Unable to connect to remote repository. Check your internet connection.';
1329
+ } else if (error.message.includes('fatal: \'origin\' does not appear to be a git repository')) {
1330
+ errorMessage = 'Remote not configured';
1331
+ details = 'No remote repository configured. Add a remote with: git remote add origin <url>';
1332
+ } else if (error.message.includes('diverged')) {
1333
+ errorMessage = 'Branches have diverged';
1334
+ details = 'Your local branch and remote branch have diverged. Consider fetching first to review changes.';
1335
+ }
1336
+
1337
+ res.status(500).json({
1338
+ error: errorMessage,
1339
+ details: details
1340
+ });
1341
+ }
1342
+ });
1343
+
1344
+ // Push commits to remote repository
1345
+ router.post('/push', async (req, res) => {
1346
+ const { project } = req.body;
1347
+
1348
+ if (!project) {
1349
+ return res.status(400).json({ error: 'Project id is required' });
1350
+ }
1351
+
1352
+ try {
1353
+ const projectPath = await getActualProjectPath(project);
1354
+ await validateGitRepository(projectPath);
1355
+
1356
+ // Get current branch and its upstream remote
1357
+ const branch = await getCurrentBranchName(projectPath);
1358
+
1359
+ let remoteName = 'origin'; // fallback
1360
+ let remoteBranch = branch; // fallback
1361
+ try {
1362
+ const { stdout } = await spawnAsync('git', ['rev-parse', '--abbrev-ref', `${branch}@{upstream}`], { cwd: projectPath });
1363
+ const tracking = stdout.trim();
1364
+ remoteName = tracking.split('/')[0]; // Extract remote name
1365
+ remoteBranch = tracking.split('/').slice(1).join('/'); // Extract branch name
1366
+ } catch (error) {
1367
+ // No upstream, use fallback
1368
+ console.log('No upstream configured, using origin/branch as fallback');
1369
+ }
1370
+
1371
+ validateRemoteName(remoteName);
1372
+ validateBranchName(remoteBranch);
1373
+ const { stdout } = await spawnAsync('git', ['push', remoteName, remoteBranch], { cwd: projectPath });
1374
+
1375
+ res.json({
1376
+ success: true,
1377
+ output: stdout || 'Push completed successfully',
1378
+ remoteName,
1379
+ remoteBranch
1380
+ });
1381
+ } catch (error) {
1382
+ console.error('Git push error:', error);
1383
+
1384
+ // Enhanced error handling for common push scenarios
1385
+ let errorMessage = 'Push failed';
1386
+ let details = error.message;
1387
+
1388
+ if (error.message.includes('rejected')) {
1389
+ errorMessage = 'Push rejected';
1390
+ details = 'The remote has newer commits. Pull first to merge changes before pushing.';
1391
+ } else if (error.message.includes('non-fast-forward')) {
1392
+ errorMessage = 'Non-fast-forward push';
1393
+ details = 'Your branch is behind the remote. Pull the latest changes first.';
1394
+ } else if (error.message.includes('Could not resolve hostname')) {
1395
+ errorMessage = 'Network error';
1396
+ details = 'Unable to connect to remote repository. Check your internet connection.';
1397
+ } else if (error.message.includes('fatal: \'origin\' does not appear to be a git repository')) {
1398
+ errorMessage = 'Remote not configured';
1399
+ details = 'No remote repository configured. Add a remote with: git remote add origin <url>';
1400
+ } else if (error.message.includes('Permission denied')) {
1401
+ errorMessage = 'Authentication failed';
1402
+ details = 'Permission denied. Check your credentials or SSH keys.';
1403
+ } else if (error.message.includes('no upstream branch')) {
1404
+ errorMessage = 'No upstream branch';
1405
+ details = 'No upstream branch configured. Use: git push --set-upstream origin <branch>';
1406
+ }
1407
+
1408
+ res.status(500).json({
1409
+ error: errorMessage,
1410
+ details: details
1411
+ });
1412
+ }
1413
+ });
1414
+
1415
+ // Publish branch to remote (set upstream and push)
1416
+ router.post('/publish', async (req, res) => {
1417
+ const { project, branch } = req.body;
1418
+
1419
+ if (!project || !branch) {
1420
+ return res.status(400).json({ error: 'Project id and branch are required' });
1421
+ }
1422
+
1423
+ try {
1424
+ const projectPath = await getActualProjectPath(project);
1425
+ await validateGitRepository(projectPath);
1426
+
1427
+ // Validate branch name
1428
+ validateBranchName(branch);
1429
+
1430
+ // Get current branch to verify it matches the requested branch
1431
+ const currentBranchName = await getCurrentBranchName(projectPath);
1432
+
1433
+ if (currentBranchName !== branch) {
1434
+ return res.status(400).json({
1435
+ error: `Branch mismatch. Current branch is ${currentBranchName}, but trying to publish ${branch}`
1436
+ });
1437
+ }
1438
+
1439
+ // Check if remote exists
1440
+ let remoteName = 'origin';
1441
+ try {
1442
+ const { stdout } = await spawnAsync('git', ['remote'], { cwd: projectPath });
1443
+ const remotes = stdout.trim().split('\n').filter(r => r.trim());
1444
+ if (remotes.length === 0) {
1445
+ return res.status(400).json({
1446
+ error: 'No remote repository configured. Add a remote with: git remote add origin <url>'
1447
+ });
1448
+ }
1449
+ remoteName = remotes.includes('origin') ? 'origin' : remotes[0];
1450
+ } catch (error) {
1451
+ return res.status(400).json({
1452
+ error: 'No remote repository configured. Add a remote with: git remote add origin <url>'
1453
+ });
1454
+ }
1455
+
1456
+ // Publish the branch (set upstream and push)
1457
+ validateRemoteName(remoteName);
1458
+ const { stdout } = await spawnAsync('git', ['push', '--set-upstream', remoteName, branch], { cwd: projectPath });
1459
+
1460
+ res.json({
1461
+ success: true,
1462
+ output: stdout || 'Branch published successfully',
1463
+ remoteName,
1464
+ branch
1465
+ });
1466
+ } catch (error) {
1467
+ console.error('Git publish error:', error);
1468
+
1469
+ // Enhanced error handling for common publish scenarios
1470
+ let errorMessage = 'Publish failed';
1471
+ let details = error.message;
1472
+
1473
+ if (error.message.includes('rejected')) {
1474
+ errorMessage = 'Publish rejected';
1475
+ details = 'The remote branch already exists and has different commits. Use push instead.';
1476
+ } else if (error.message.includes('Could not resolve hostname')) {
1477
+ errorMessage = 'Network error';
1478
+ details = 'Unable to connect to remote repository. Check your internet connection.';
1479
+ } else if (error.message.includes('Permission denied')) {
1480
+ errorMessage = 'Authentication failed';
1481
+ details = 'Permission denied. Check your credentials or SSH keys.';
1482
+ } else if (error.message.includes('fatal:') && error.message.includes('does not appear to be a git repository')) {
1483
+ errorMessage = 'Remote not configured';
1484
+ details = 'Remote repository not properly configured. Check your remote URL.';
1485
+ }
1486
+
1487
+ res.status(500).json({
1488
+ error: errorMessage,
1489
+ details: details
1490
+ });
1491
+ }
1492
+ });
1493
+
1494
+ // Discard changes for a specific file
1495
+ router.post('/discard', async (req, res) => {
1496
+ const { project, file } = req.body;
1497
+
1498
+ if (!project || !file) {
1499
+ return res.status(400).json({ error: 'Project id and file path are required' });
1500
+ }
1501
+
1502
+ try {
1503
+ const projectPath = await getActualProjectPath(project);
1504
+ await validateGitRepository(projectPath);
1505
+ const {
1506
+ repositoryRootPath,
1507
+ repositoryRelativeFilePath,
1508
+ } = await resolveRepositoryFilePath(projectPath, file);
1509
+
1510
+ // Check file status to determine correct discard command
1511
+ const { stdout: statusOutput } = await spawnAsync(
1512
+ 'git',
1513
+ ['status', '--porcelain', '--', repositoryRelativeFilePath],
1514
+ { cwd: repositoryRootPath },
1515
+ );
1516
+
1517
+ if (!statusOutput.trim()) {
1518
+ return res.status(400).json({ error: 'No changes to discard for this file' });
1519
+ }
1520
+
1521
+ const status = statusOutput.substring(0, 2);
1522
+
1523
+ if (status === '??') {
1524
+ // Untracked file or directory - delete it
1525
+ const filePath = path.join(repositoryRootPath, repositoryRelativeFilePath);
1526
+ const stats = await fs.stat(filePath);
1527
+
1528
+ if (stats.isDirectory()) {
1529
+ await fs.rm(filePath, { recursive: true, force: true });
1530
+ } else {
1531
+ await fs.unlink(filePath);
1532
+ }
1533
+ } else if (status.includes('M') || status.includes('D')) {
1534
+ // Modified or deleted file - restore from HEAD
1535
+ await spawnAsync('git', ['restore', '--', repositoryRelativeFilePath], { cwd: repositoryRootPath });
1536
+ } else if (status.includes('A')) {
1537
+ // Added file - unstage it
1538
+ await spawnAsync('git', ['reset', 'HEAD', '--', repositoryRelativeFilePath], { cwd: repositoryRootPath });
1539
+ }
1540
+
1541
+ res.json({ success: true, message: `Changes discarded for ${repositoryRelativeFilePath}` });
1542
+ } catch (error) {
1543
+ console.error('Git discard error:', error);
1544
+ res.status(500).json({ error: error.message });
1545
+ }
1546
+ });
1547
+
1548
+ // Delete untracked file
1549
+ router.post('/delete-untracked', async (req, res) => {
1550
+ const { project, file } = req.body;
1551
+
1552
+ if (!project || !file) {
1553
+ return res.status(400).json({ error: 'Project id and file path are required' });
1554
+ }
1555
+
1556
+ try {
1557
+ const projectPath = await getActualProjectPath(project);
1558
+ await validateGitRepository(projectPath);
1559
+ const {
1560
+ repositoryRootPath,
1561
+ repositoryRelativeFilePath,
1562
+ } = await resolveRepositoryFilePath(projectPath, file);
1563
+
1564
+ // Check if file is actually untracked
1565
+ const { stdout: statusOutput } = await spawnAsync(
1566
+ 'git',
1567
+ ['status', '--porcelain', '--', repositoryRelativeFilePath],
1568
+ { cwd: repositoryRootPath },
1569
+ );
1570
+
1571
+ if (!statusOutput.trim()) {
1572
+ return res.status(400).json({ error: 'File is not untracked or does not exist' });
1573
+ }
1574
+
1575
+ const status = statusOutput.substring(0, 2);
1576
+
1577
+ if (status !== '??') {
1578
+ return res.status(400).json({ error: 'File is not untracked. Use discard for tracked files.' });
1579
+ }
1580
+
1581
+ // Delete the untracked file or directory
1582
+ const filePath = path.join(repositoryRootPath, repositoryRelativeFilePath);
1583
+ const stats = await fs.stat(filePath);
1584
+
1585
+ if (stats.isDirectory()) {
1586
+ // Use rm with recursive option for directories
1587
+ await fs.rm(filePath, { recursive: true, force: true });
1588
+ res.json({ success: true, message: `Untracked directory ${repositoryRelativeFilePath} deleted successfully` });
1589
+ } else {
1590
+ await fs.unlink(filePath);
1591
+ res.json({ success: true, message: `Untracked file ${repositoryRelativeFilePath} deleted successfully` });
1592
+ }
1593
+ } catch (error) {
1594
+ console.error('Git delete untracked error:', error);
1595
+ res.status(500).json({ error: error.message });
1596
+ }
1597
+ });
1598
+
1599
+ return router;
1600
+ }