@piecemaker-legal/piecemaker 1.0.6

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 (1285) hide show
  1. package/LICENSE +718 -0
  2. package/README.md +79 -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-VCTEODGH-DF7LFtT-.js +1 -0
  65. package/dist/assets/arc-xOmjWeVH.js +1 -0
  66. package/dist/assets/architectureDiagram-5GKGNRK7-CESzNPwa.js +36 -0
  67. package/dist/assets/blockDiagram-I7D4REHJ-BjdN78Ad.js +129 -0
  68. package/dist/assets/c4Diagram-7LVT6UL2-BcK9EDWT.js +38 -0
  69. package/dist/assets/channel-Dz3eE5vU.js +1 -0
  70. package/dist/assets/chunk-2Q5K7J3B-DGUN1JFP.js +1 -0
  71. package/dist/assets/chunk-5VM5RSS4-BG3BBcFr.js +15 -0
  72. package/dist/assets/chunk-F27PBJKO-CLIOfrF5.js +1 -0
  73. package/dist/assets/chunk-IMKFNOWR-D6lGkqij.js +231 -0
  74. package/dist/assets/chunk-JWPE2WC7-BmF9vLBT.js +1 -0
  75. package/dist/assets/chunk-POPQ4Y6H-C_0SR3ak.js +1 -0
  76. package/dist/assets/chunk-SVP7TREG-rT20Wfpp.js +88 -0
  77. package/dist/assets/chunk-TICWLB2K-Cn2hkmcf.js +206 -0
  78. package/dist/assets/chunk-XXDRQBXY-Dm_eP1_v.js +1 -0
  79. package/dist/assets/classDiagram-ZZMXUADV-BC1eKV2j.js +1 -0
  80. package/dist/assets/classDiagram-v2-VYDZK3BY-BC1eKV2j.js +1 -0
  81. package/dist/assets/cose-bilkent-JH36ORCC-cJeeJsep.js +1 -0
  82. package/dist/assets/cynefin-OW5HDTMX-DX2ePIXe.js +166 -0
  83. package/dist/assets/cynefinDiagram-5FMLGOSQ-BvWXN-RR.js +62 -0
  84. package/dist/assets/cytoscape.esm-BB4DxJjf.js +321 -0
  85. package/dist/assets/dagre-GXQ25YYZ-CkwPRhGR.js +4 -0
  86. package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  87. package/dist/assets/diagram-S7CK7UJ4-CBGNzYyv.js +30 -0
  88. package/dist/assets/diagram-UQ7AKVKN-CiwCU0SJ.js +41 -0
  89. package/dist/assets/diagram-VSXAHHWV-Aekg4nTk.js +3 -0
  90. package/dist/assets/diagram-VX7I27RA-DPFP5K7r.js +24 -0
  91. package/dist/assets/diagram-Z3DM3KII-BHJkxoey.js +24 -0
  92. package/dist/assets/ebnfDiagram-PWID7BFC-2rV1P32T.js +1 -0
  93. package/dist/assets/erDiagram-RLTQ6QDP-C4BjyS_H.js +99 -0
  94. package/dist/assets/flowDiagram-HODETNUW-DL1TBlAG.js +168 -0
  95. package/dist/assets/ganttDiagram-EL5Y4UJY-MKjvzCWz.js +292 -0
  96. package/dist/assets/gitGraphDiagram-WWUBYQGX-CS_oTGK5.js +106 -0
  97. package/dist/assets/index-DhwJpHCq.css +1 -0
  98. package/dist/assets/index-XOGQDqU3.js +3993 -0
  99. package/dist/assets/infoDiagram-27XIBGKW-ihUr2GjN.js +2 -0
  100. package/dist/assets/init-Gi6I4Gst.js +1 -0
  101. package/dist/assets/ishikawaDiagram-5VMMS53U-D2YAnuir.js +70 -0
  102. package/dist/assets/journeyDiagram-3NMN7TZE-Bc2hSZGD.js +139 -0
  103. package/dist/assets/kanban-definition-UXKFOSKX-LRMGNonX.js +89 -0
  104. package/dist/assets/layout-CcfWOlPV.js +1 -0
  105. package/dist/assets/linear-7JoS2gQO.js +1 -0
  106. package/dist/assets/mermaid.core-ijh_SsuN.js +308 -0
  107. package/dist/assets/mindmap-definition-YA3MSWOX-DCE4nzfF.js +96 -0
  108. package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  109. package/dist/assets/pegDiagram-XKGWAZYB-SjaGa7lE.js +1 -0
  110. package/dist/assets/pieDiagram-E7YTZNPT-1xcRidSZ.js +39 -0
  111. package/dist/assets/quadrantDiagram-AXDQQJYC-obHAHnYV.js +7 -0
  112. package/dist/assets/railroadDiagram-O6MQD6OU-BsCVcRZb.js +1 -0
  113. package/dist/assets/requirementDiagram-BXWQKSXE-CUNkhvqb.js +84 -0
  114. package/dist/assets/sankeyDiagram-P5KCCOFB-DhezXMKm.js +40 -0
  115. package/dist/assets/sequenceDiagram-WJ2MYXX4-CL9VswXH.js +162 -0
  116. package/dist/assets/server.browser-BzI1jrZw.js +11 -0
  117. package/dist/assets/sizeCapture-INFHLROL-t0g9jiEz.js +1 -0
  118. package/dist/assets/stateDiagram-D77RDMKH-BW-g-IOz.js +1 -0
  119. package/dist/assets/stateDiagram-v2-MP3YSRHH-BXuT4zDG.js +1 -0
  120. package/dist/assets/swimlanes-42K2YHIH-LsuyeBte.js +1 -0
  121. package/dist/assets/swimlanesDiagram-VR7AAH4N-B0eYrB4U.js +8 -0
  122. package/dist/assets/timeline-definition-24CTP7MA-B0cFka1R.js +120 -0
  123. package/dist/assets/vendor-codemirror-C5qqu4R7.js +33 -0
  124. package/dist/assets/vendor-react-D809iwXR.js +8 -0
  125. package/dist/assets/vendor-xterm-BWUgpGtR.js +66 -0
  126. package/dist/assets/vennDiagram-4TSXK5OY-D3HNCDR3.js +34 -0
  127. package/dist/assets/wardleyDiagram-VM6X3IG4-DJ3Co8nb.js +78 -0
  128. package/dist/assets/xychartDiagram-S5SC5T6Z-Cz5E9New.js +7 -0
  129. package/dist/clear-cache.html +85 -0
  130. package/dist/convert-icons.md +53 -0
  131. package/dist/favicon.png +0 -0
  132. package/dist/favicon.svg +9 -0
  133. package/dist/generate-icons.js +49 -0
  134. package/dist/icons/claude-ai-icon.svg +1 -0
  135. package/dist/icons/codex-white.svg +3 -0
  136. package/dist/icons/codex.svg +3 -0
  137. package/dist/icons/cursor-white.svg +12 -0
  138. package/dist/icons/cursor.svg +1 -0
  139. package/dist/icons/icon-128x128.png +0 -0
  140. package/dist/icons/icon-128x128.svg +12 -0
  141. package/dist/icons/icon-144x144.png +0 -0
  142. package/dist/icons/icon-144x144.svg +12 -0
  143. package/dist/icons/icon-152x152.png +0 -0
  144. package/dist/icons/icon-152x152.svg +12 -0
  145. package/dist/icons/icon-192x192.png +0 -0
  146. package/dist/icons/icon-192x192.svg +12 -0
  147. package/dist/icons/icon-384x384.png +0 -0
  148. package/dist/icons/icon-384x384.svg +12 -0
  149. package/dist/icons/icon-512x512.png +0 -0
  150. package/dist/icons/icon-512x512.svg +12 -0
  151. package/dist/icons/icon-72x72.png +0 -0
  152. package/dist/icons/icon-72x72.svg +12 -0
  153. package/dist/icons/icon-96x96.png +0 -0
  154. package/dist/icons/icon-96x96.svg +12 -0
  155. package/dist/icons/icon-template.svg +12 -0
  156. package/dist/index.html +60 -0
  157. package/dist/logo-128.png +0 -0
  158. package/dist/logo-256.png +0 -0
  159. package/dist/logo-32.png +0 -0
  160. package/dist/logo-512.png +0 -0
  161. package/dist/logo-64.png +0 -0
  162. package/dist/logo.svg +17 -0
  163. package/dist/manifest.json +61 -0
  164. package/dist/screenshots/cli-selection.png +0 -0
  165. package/dist/screenshots/desktop-main.png +0 -0
  166. package/dist/screenshots/mobile-chat.png +0 -0
  167. package/dist/screenshots/tools-modal.png +0 -0
  168. package/dist/sw.js +125 -0
  169. package/dist-server/plugins/piecemaker-dossier/src/knowledge.js +272 -0
  170. package/dist-server/plugins/piecemaker-dossier/src/knowledge.js.map +1 -0
  171. package/dist-server/plugins/piecemaker-dossier/src/scan-result.js +160 -0
  172. package/dist-server/plugins/piecemaker-dossier/src/scan-result.js.map +1 -0
  173. package/dist-server/plugins/piecemaker-dossier/src/types.js +3 -0
  174. package/dist-server/plugins/piecemaker-dossier/src/types.js.map +1 -0
  175. package/dist-server/server/index.js +345 -0
  176. package/dist-server/server/index.js.map +1 -0
  177. package/dist-server/server/load-env.js +46 -0
  178. package/dist-server/server/load-env.js.map +1 -0
  179. package/dist-server/server/modules/agent/agent.module.js +38 -0
  180. package/dist-server/server/modules/agent/agent.module.js.map +1 -0
  181. package/dist-server/server/modules/agent/agent.routes.js +1161 -0
  182. package/dist-server/server/modules/agent/agent.routes.js.map +1 -0
  183. package/dist-server/server/modules/agent/index.js +3 -0
  184. package/dist-server/server/modules/agent/index.js.map +1 -0
  185. package/dist-server/server/modules/agent/tests/agent.routes.test.js +205 -0
  186. package/dist-server/server/modules/agent/tests/agent.routes.test.js.map +1 -0
  187. package/dist-server/server/modules/assets/assets.routes.js +130 -0
  188. package/dist-server/server/modules/assets/assets.routes.js.map +1 -0
  189. package/dist-server/server/modules/assets/index.js +4 -0
  190. package/dist-server/server/modules/assets/index.js.map +1 -0
  191. package/dist-server/server/modules/assets/services/image-assets.service.js +95 -0
  192. package/dist-server/server/modules/assets/services/image-assets.service.js.map +1 -0
  193. package/dist-server/server/modules/assets/tests/image-assets.service.test.js +56 -0
  194. package/dist-server/server/modules/assets/tests/image-assets.service.test.js.map +1 -0
  195. package/dist-server/server/modules/auth/auth.middleware.js +133 -0
  196. package/dist-server/server/modules/auth/auth.middleware.js.map +1 -0
  197. package/dist-server/server/modules/auth/auth.module.js +29 -0
  198. package/dist-server/server/modules/auth/auth.module.js.map +1 -0
  199. package/dist-server/server/modules/auth/auth.routes.js +45 -0
  200. package/dist-server/server/modules/auth/auth.routes.js.map +1 -0
  201. package/dist-server/server/modules/auth/auth.service.js +113 -0
  202. package/dist-server/server/modules/auth/auth.service.js.map +1 -0
  203. package/dist-server/server/modules/auth/index.js +9 -0
  204. package/dist-server/server/modules/auth/index.js.map +1 -0
  205. package/dist-server/server/modules/auth/tests/auth.service.test.js +80 -0
  206. package/dist-server/server/modules/auth/tests/auth.service.test.js.map +1 -0
  207. package/dist-server/server/modules/browser-use/browser-use-mcp.js +352 -0
  208. package/dist-server/server/modules/browser-use/browser-use-mcp.js.map +1 -0
  209. package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js +107 -0
  210. package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js.map +1 -0
  211. package/dist-server/server/modules/browser-use/browser-use-runtime.js +10 -0
  212. package/dist-server/server/modules/browser-use/browser-use-runtime.js.map +1 -0
  213. package/dist-server/server/modules/browser-use/browser-use.routes.js +99 -0
  214. package/dist-server/server/modules/browser-use/browser-use.routes.js.map +1 -0
  215. package/dist-server/server/modules/browser-use/browser-use.service.js +686 -0
  216. package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -0
  217. package/dist-server/server/modules/browser-use/index.js +11 -0
  218. package/dist-server/server/modules/browser-use/index.js.map +1 -0
  219. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js +8 -0
  220. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js.map +1 -0
  221. package/dist-server/server/modules/cli/cli.js +17 -0
  222. package/dist-server/server/modules/cli/cli.js.map +1 -0
  223. package/dist-server/server/modules/cli/cli.module.js +93 -0
  224. package/dist-server/server/modules/cli/cli.module.js.map +1 -0
  225. package/dist-server/server/modules/cli/cli.service.js +230 -0
  226. package/dist-server/server/modules/cli/cli.service.js.map +1 -0
  227. package/dist-server/server/modules/cli/index.js +3 -0
  228. package/dist-server/server/modules/cli/index.js.map +1 -0
  229. package/dist-server/server/modules/cli/pwa-launcher.js +116 -0
  230. package/dist-server/server/modules/cli/pwa-launcher.js.map +1 -0
  231. package/dist-server/server/modules/cli/sandbox.service.js +332 -0
  232. package/dist-server/server/modules/cli/sandbox.service.js.map +1 -0
  233. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +154 -0
  234. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js.map +1 -0
  235. package/dist-server/server/modules/cli/tests/cli.service.test.js +91 -0
  236. package/dist-server/server/modules/cli/tests/cli.service.test.js.map +1 -0
  237. package/dist-server/server/modules/cli/tests/sandbox.service.test.js +55 -0
  238. package/dist-server/server/modules/cli/tests/sandbox.service.test.js.map +1 -0
  239. package/dist-server/server/modules/commands/commands.module.js +20 -0
  240. package/dist-server/server/modules/commands/commands.module.js.map +1 -0
  241. package/dist-server/server/modules/commands/commands.routes.js +498 -0
  242. package/dist-server/server/modules/commands/commands.routes.js.map +1 -0
  243. package/dist-server/server/modules/commands/index.js +3 -0
  244. package/dist-server/server/modules/commands/index.js.map +1 -0
  245. package/dist-server/server/modules/commands/tests/commands.test.js +91 -0
  246. package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -0
  247. package/dist-server/server/modules/database/connection.js +125 -0
  248. package/dist-server/server/modules/database/connection.js.map +1 -0
  249. package/dist-server/server/modules/database/index.js +23 -0
  250. package/dist-server/server/modules/database/index.js.map +1 -0
  251. package/dist-server/server/modules/database/init-db.js +18 -0
  252. package/dist-server/server/modules/database/init-db.js.map +1 -0
  253. package/dist-server/server/modules/database/migrations.js +465 -0
  254. package/dist-server/server/modules/database/migrations.js.map +1 -0
  255. package/dist-server/server/modules/database/repositories/api-keys.js +72 -0
  256. package/dist-server/server/modules/database/repositories/api-keys.js.map +1 -0
  257. package/dist-server/server/modules/database/repositories/app-config.js +47 -0
  258. package/dist-server/server/modules/database/repositories/app-config.js.map +1 -0
  259. package/dist-server/server/modules/database/repositories/credentials.js +68 -0
  260. package/dist-server/server/modules/database/repositories/credentials.js.map +1 -0
  261. package/dist-server/server/modules/database/repositories/github-tokens.js +54 -0
  262. package/dist-server/server/modules/database/repositories/github-tokens.js.map +1 -0
  263. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js +100 -0
  264. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js.map +1 -0
  265. package/dist-server/server/modules/database/repositories/notification-preferences.js +82 -0
  266. package/dist-server/server/modules/database/repositories/notification-preferences.js.map +1 -0
  267. package/dist-server/server/modules/database/repositories/projects.db.js +172 -0
  268. package/dist-server/server/modules/database/repositories/projects.db.js.map +1 -0
  269. package/dist-server/server/modules/database/repositories/provider-models.js +112 -0
  270. package/dist-server/server/modules/database/repositories/provider-models.js.map +1 -0
  271. package/dist-server/server/modules/database/repositories/push-subscriptions.js +49 -0
  272. package/dist-server/server/modules/database/repositories/push-subscriptions.js.map +1 -0
  273. package/dist-server/server/modules/database/repositories/scan-state.db.js +31 -0
  274. package/dist-server/server/modules/database/repositories/scan-state.db.js.map +1 -0
  275. package/dist-server/server/modules/database/repositories/scheduled-messages.db.js +71 -0
  276. package/dist-server/server/modules/database/repositories/scheduled-messages.db.js.map +1 -0
  277. package/dist-server/server/modules/database/repositories/session-drafts.db.js +105 -0
  278. package/dist-server/server/modules/database/repositories/session-drafts.db.js.map +1 -0
  279. package/dist-server/server/modules/database/repositories/sessions.db.js +507 -0
  280. package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -0
  281. package/dist-server/server/modules/database/repositories/user-preferences.db.js +65 -0
  282. package/dist-server/server/modules/database/repositories/user-preferences.db.js.map +1 -0
  283. package/dist-server/server/modules/database/repositories/users.js +88 -0
  284. package/dist-server/server/modules/database/repositories/users.js.map +1 -0
  285. package/dist-server/server/modules/database/repositories/vapid-keys.js +38 -0
  286. package/dist-server/server/modules/database/repositories/vapid-keys.js.map +1 -0
  287. package/dist-server/server/modules/database/schema.js +291 -0
  288. package/dist-server/server/modules/database/schema.js.map +1 -0
  289. package/dist-server/server/modules/database/tests/projects.db.integration.test.js +64 -0
  290. package/dist-server/server/modules/database/tests/projects.db.integration.test.js.map +1 -0
  291. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +102 -0
  292. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js.map +1 -0
  293. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +79 -0
  294. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -0
  295. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +132 -0
  296. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -0
  297. package/dist-server/server/modules/database/tests/user-preferences.db.integration.test.js +105 -0
  298. package/dist-server/server/modules/database/tests/user-preferences.db.integration.test.js.map +1 -0
  299. package/dist-server/server/modules/file-tree/file-tree.module.js +95 -0
  300. package/dist-server/server/modules/file-tree/file-tree.module.js.map +1 -0
  301. package/dist-server/server/modules/file-tree/file-tree.routes.js +208 -0
  302. package/dist-server/server/modules/file-tree/file-tree.routes.js.map +1 -0
  303. package/dist-server/server/modules/file-tree/file-tree.service.js +584 -0
  304. package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -0
  305. package/dist-server/server/modules/file-tree/index.js +3 -0
  306. package/dist-server/server/modules/file-tree/index.js.map +1 -0
  307. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js +123 -0
  308. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js.map +1 -0
  309. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +311 -0
  310. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -0
  311. package/dist-server/server/modules/git/git-branch.service.js +15 -0
  312. package/dist-server/server/modules/git/git-branch.service.js.map +1 -0
  313. package/dist-server/server/modules/git/git-parsing.service.js +61 -0
  314. package/dist-server/server/modules/git/git-parsing.service.js.map +1 -0
  315. package/dist-server/server/modules/git/git.module.js +14 -0
  316. package/dist-server/server/modules/git/git.module.js.map +1 -0
  317. package/dist-server/server/modules/git/git.routes.js +1347 -0
  318. package/dist-server/server/modules/git/git.routes.js.map +1 -0
  319. package/dist-server/server/modules/git/index.js +3 -0
  320. package/dist-server/server/modules/git/index.js.map +1 -0
  321. package/dist-server/server/modules/git/tests/git-branch.service.test.js +52 -0
  322. package/dist-server/server/modules/git/tests/git-branch.service.test.js.map +1 -0
  323. package/dist-server/server/modules/git/tests/git-init.routes.test.js +132 -0
  324. package/dist-server/server/modules/git/tests/git-init.routes.test.js.map +1 -0
  325. package/dist-server/server/modules/git/tests/git.test.js +80 -0
  326. package/dist-server/server/modules/git/tests/git.test.js.map +1 -0
  327. package/dist-server/server/modules/notifications/index.js +20 -0
  328. package/dist-server/server/modules/notifications/index.js.map +1 -0
  329. package/dist-server/server/modules/notifications/notifications.routes.js +115 -0
  330. package/dist-server/server/modules/notifications/notifications.routes.js.map +1 -0
  331. package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js +97 -0
  332. package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js.map +1 -0
  333. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +249 -0
  334. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js.map +1 -0
  335. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js +44 -0
  336. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js.map +1 -0
  337. package/dist-server/server/modules/notifications/vapid-keys.service.js +28 -0
  338. package/dist-server/server/modules/notifications/vapid-keys.service.js.map +1 -0
  339. package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js +79 -0
  340. package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js.map +1 -0
  341. package/dist-server/server/modules/plugins/index.js +9 -0
  342. package/dist-server/server/modules/plugins/index.js.map +1 -0
  343. package/dist-server/server/modules/plugins/plugin-process.service.js +191 -0
  344. package/dist-server/server/modules/plugins/plugin-process.service.js.map +1 -0
  345. package/dist-server/server/modules/plugins/plugin-registry.service.js +415 -0
  346. package/dist-server/server/modules/plugins/plugin-registry.service.js.map +1 -0
  347. package/dist-server/server/modules/plugins/plugins.module.js +30 -0
  348. package/dist-server/server/modules/plugins/plugins.module.js.map +1 -0
  349. package/dist-server/server/modules/plugins/plugins.routes.js +70 -0
  350. package/dist-server/server/modules/plugins/plugins.routes.js.map +1 -0
  351. package/dist-server/server/modules/plugins/plugins.service.js +123 -0
  352. package/dist-server/server/modules/plugins/plugins.service.js.map +1 -0
  353. package/dist-server/server/modules/plugins/tests/plugins.service.test.js +28 -0
  354. package/dist-server/server/modules/plugins/tests/plugins.service.test.js.map +1 -0
  355. package/dist-server/server/modules/projects/index.js +9 -0
  356. package/dist-server/server/modules/projects/index.js.map +1 -0
  357. package/dist-server/server/modules/projects/projects.routes.js +205 -0
  358. package/dist-server/server/modules/projects/projects.routes.js.map +1 -0
  359. package/dist-server/server/modules/projects/services/project-clone.service.js +220 -0
  360. package/dist-server/server/modules/projects/services/project-clone.service.js.map +1 -0
  361. package/dist-server/server/modules/projects/services/project-delete.service.js +89 -0
  362. package/dist-server/server/modules/projects/services/project-delete.service.js.map +1 -0
  363. package/dist-server/server/modules/projects/services/project-management.service.js +90 -0
  364. package/dist-server/server/modules/projects/services/project-management.service.js.map +1 -0
  365. package/dist-server/server/modules/projects/services/project-star.service.js +60 -0
  366. package/dist-server/server/modules/projects/services/project-star.service.js.map +1 -0
  367. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js +167 -0
  368. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js.map +1 -0
  369. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js +188 -0
  370. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js.map +1 -0
  371. package/dist-server/server/modules/projects/tests/project-clone.service.test.js +126 -0
  372. package/dist-server/server/modules/projects/tests/project-clone.service.test.js.map +1 -0
  373. package/dist-server/server/modules/projects/tests/project-management.service.test.js +85 -0
  374. package/dist-server/server/modules/projects/tests/project-management.service.test.js.map +1 -0
  375. package/dist-server/server/modules/projects/tests/project-star.service.test.js +95 -0
  376. package/dist-server/server/modules/projects/tests/project-star.service.test.js.map +1 -0
  377. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js +87 -0
  378. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js.map +1 -0
  379. package/dist-server/server/modules/providers/index.js +12 -0
  380. package/dist-server/server/modules/providers/index.js.map +1 -0
  381. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +151 -0
  382. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -0
  383. package/dist-server/server/modules/providers/list/claude/claude-fork.provider.js +46 -0
  384. package/dist-server/server/modules/providers/list/claude/claude-fork.provider.js.map +1 -0
  385. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js +103 -0
  386. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js.map +1 -0
  387. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +278 -0
  388. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -0
  389. package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js +1058 -0
  390. package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js.map +1 -0
  391. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +141 -0
  392. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -0
  393. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +924 -0
  394. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -0
  395. package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js +208 -0
  396. package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js.map +1 -0
  397. package/dist-server/server/modules/providers/list/claude/claude.provider.js +23 -0
  398. package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -0
  399. package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js +204 -0
  400. package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js.map +1 -0
  401. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +84 -0
  402. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -0
  403. package/dist-server/server/modules/providers/list/codex/codex-fork.provider.js +32 -0
  404. package/dist-server/server/modules/providers/list/codex/codex-fork.provider.js.map +1 -0
  405. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js +107 -0
  406. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js.map +1 -0
  407. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +125 -0
  408. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -0
  409. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js +473 -0
  410. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -0
  411. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +153 -0
  412. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -0
  413. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +1955 -0
  414. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -0
  415. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js +62 -0
  416. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js.map +1 -0
  417. package/dist-server/server/modules/providers/list/codex/codex.provider.js +23 -0
  418. package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -0
  419. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +118 -0
  420. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -0
  421. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js +80 -0
  422. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js.map +1 -0
  423. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +100 -0
  424. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -0
  425. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js +305 -0
  426. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js.map +1 -0
  427. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js +111 -0
  428. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -0
  429. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +566 -0
  430. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -0
  431. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js +35 -0
  432. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js.map +1 -0
  433. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +21 -0
  434. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -0
  435. package/dist-server/server/modules/providers/list/mistral/mistral-auth.provider.js +147 -0
  436. package/dist-server/server/modules/providers/list/mistral/mistral-auth.provider.js.map +1 -0
  437. package/dist-server/server/modules/providers/list/mistral/mistral-mcp.provider.js +15 -0
  438. package/dist-server/server/modules/providers/list/mistral/mistral-mcp.provider.js.map +1 -0
  439. package/dist-server/server/modules/providers/list/mistral/mistral-models.provider.js +69 -0
  440. package/dist-server/server/modules/providers/list/mistral/mistral-models.provider.js.map +1 -0
  441. package/dist-server/server/modules/providers/list/mistral/mistral-runtime.provider.js +326 -0
  442. package/dist-server/server/modules/providers/list/mistral/mistral-runtime.provider.js.map +1 -0
  443. package/dist-server/server/modules/providers/list/mistral/mistral-session-synchronizer.provider.js +12 -0
  444. package/dist-server/server/modules/providers/list/mistral/mistral-session-synchronizer.provider.js.map +1 -0
  445. package/dist-server/server/modules/providers/list/mistral/mistral-sessions.provider.js +180 -0
  446. package/dist-server/server/modules/providers/list/mistral/mistral-sessions.provider.js.map +1 -0
  447. package/dist-server/server/modules/providers/list/mistral/mistral-skills.provider.js +15 -0
  448. package/dist-server/server/modules/providers/list/mistral/mistral-skills.provider.js.map +1 -0
  449. package/dist-server/server/modules/providers/list/mistral/mistral.provider.js +25 -0
  450. package/dist-server/server/modules/providers/list/mistral/mistral.provider.js.map +1 -0
  451. package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js +91 -0
  452. package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js.map +1 -0
  453. package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js +181 -0
  454. package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js.map +1 -0
  455. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +429 -0
  456. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -0
  457. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js +368 -0
  458. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js.map +1 -0
  459. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +225 -0
  460. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js.map +1 -0
  461. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +136 -0
  462. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -0
  463. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +404 -0
  464. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -0
  465. package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js +62 -0
  466. package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js.map +1 -0
  467. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js +21 -0
  468. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js.map +1 -0
  469. package/dist-server/server/modules/providers/provider.registry.js +33 -0
  470. package/dist-server/server/modules/providers/provider.registry.js.map +1 -0
  471. package/dist-server/server/modules/providers/provider.routes.js +676 -0
  472. package/dist-server/server/modules/providers/provider.routes.js.map +1 -0
  473. package/dist-server/server/modules/providers/services/mcp.service.js +84 -0
  474. package/dist-server/server/modules/providers/services/mcp.service.js.map +1 -0
  475. package/dist-server/server/modules/providers/services/provider-auth.service.js +25 -0
  476. package/dist-server/server/modules/providers/services/provider-auth.service.js.map +1 -0
  477. package/dist-server/server/modules/providers/services/provider-capabilities.service.js +94 -0
  478. package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -0
  479. package/dist-server/server/modules/providers/services/provider-models.service.js +289 -0
  480. package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -0
  481. package/dist-server/server/modules/providers/services/provider-runtime.service.js +66 -0
  482. package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -0
  483. package/dist-server/server/modules/providers/services/provider-token-usage.service.js +372 -0
  484. package/dist-server/server/modules/providers/services/provider-token-usage.service.js.map +1 -0
  485. package/dist-server/server/modules/providers/services/session-conversations-search.service.js +974 -0
  486. package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -0
  487. package/dist-server/server/modules/providers/services/session-history-cache.service.js +87 -0
  488. package/dist-server/server/modules/providers/services/session-history-cache.service.js.map +1 -0
  489. package/dist-server/server/modules/providers/services/session-synchronizer.service.js +130 -0
  490. package/dist-server/server/modules/providers/services/session-synchronizer.service.js.map +1 -0
  491. package/dist-server/server/modules/providers/services/sessions-watcher.service.js +214 -0
  492. package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -0
  493. package/dist-server/server/modules/providers/services/sessions.service.js +519 -0
  494. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -0
  495. package/dist-server/server/modules/providers/services/skills.service.js +22 -0
  496. package/dist-server/server/modules/providers/services/skills.service.js.map +1 -0
  497. package/dist-server/server/modules/providers/shared/base/abstract.provider.js +13 -0
  498. package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -0
  499. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js +102 -0
  500. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js.map +1 -0
  501. package/dist-server/server/modules/providers/shared/skills/skills.provider.js +207 -0
  502. package/dist-server/server/modules/providers/shared/skills/skills.provider.js.map +1 -0
  503. package/dist-server/server/modules/providers/tests/claude-auth.test.js +174 -0
  504. package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -0
  505. package/dist-server/server/modules/providers/tests/claude-models.test.js +39 -0
  506. package/dist-server/server/modules/providers/tests/claude-models.test.js.map +1 -0
  507. package/dist-server/server/modules/providers/tests/claude-sessions.test.js +470 -0
  508. package/dist-server/server/modules/providers/tests/claude-sessions.test.js.map +1 -0
  509. package/dist-server/server/modules/providers/tests/claude-subagent-echo.test.js +16 -0
  510. package/dist-server/server/modules/providers/tests/claude-subagent-echo.test.js.map +1 -0
  511. package/dist-server/server/modules/providers/tests/claude-token-budget.test.js +85 -0
  512. package/dist-server/server/modules/providers/tests/claude-token-budget.test.js.map +1 -0
  513. package/dist-server/server/modules/providers/tests/codex-message-editing.test.js +338 -0
  514. package/dist-server/server/modules/providers/tests/codex-message-editing.test.js.map +1 -0
  515. package/dist-server/server/modules/providers/tests/codex-runtime.test.js +51 -0
  516. package/dist-server/server/modules/providers/tests/codex-runtime.test.js.map +1 -0
  517. package/dist-server/server/modules/providers/tests/codex-session-fork.test.js +54 -0
  518. package/dist-server/server/modules/providers/tests/codex-session-fork.test.js.map +1 -0
  519. package/dist-server/server/modules/providers/tests/codex-sessions.test.js +491 -0
  520. package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -0
  521. package/dist-server/server/modules/providers/tests/mcp.test.js +291 -0
  522. package/dist-server/server/modules/providers/tests/mcp.test.js.map +1 -0
  523. package/dist-server/server/modules/providers/tests/opencode-models.test.js +132 -0
  524. package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -0
  525. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +424 -0
  526. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -0
  527. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js +205 -0
  528. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js.map +1 -0
  529. package/dist-server/server/modules/providers/tests/provider-models.service.test.js +268 -0
  530. package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -0
  531. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js +126 -0
  532. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js.map +1 -0
  533. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +329 -0
  534. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -0
  535. package/dist-server/server/modules/providers/tests/provider.routes.test.js +161 -0
  536. package/dist-server/server/modules/providers/tests/provider.routes.test.js.map +1 -0
  537. package/dist-server/server/modules/providers/tests/session-fork.test.js +113 -0
  538. package/dist-server/server/modules/providers/tests/session-fork.test.js.map +1 -0
  539. package/dist-server/server/modules/providers/tests/session-history-cache.service.test.js +120 -0
  540. package/dist-server/server/modules/providers/tests/session-history-cache.service.test.js.map +1 -0
  541. package/dist-server/server/modules/providers/tests/session-orphan-prune.test.js +90 -0
  542. package/dist-server/server/modules/providers/tests/session-orphan-prune.test.js.map +1 -0
  543. package/dist-server/server/modules/providers/tests/session-synchronizer-coalescing.test.js +122 -0
  544. package/dist-server/server/modules/providers/tests/session-synchronizer-coalescing.test.js.map +1 -0
  545. package/dist-server/server/modules/providers/tests/sessions-details.test.js +62 -0
  546. package/dist-server/server/modules/providers/tests/sessions-details.test.js.map +1 -0
  547. package/dist-server/server/modules/providers/tests/sessions.service.test.js +131 -0
  548. package/dist-server/server/modules/providers/tests/sessions.service.test.js.map +1 -0
  549. package/dist-server/server/modules/providers/tests/skills.test.js +410 -0
  550. package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -0
  551. package/dist-server/server/modules/scheduled-messages/index.js +5 -0
  552. package/dist-server/server/modules/scheduled-messages/index.js.map +1 -0
  553. package/dist-server/server/modules/scheduled-messages/scheduled-messages.routes.js +47 -0
  554. package/dist-server/server/modules/scheduled-messages/scheduled-messages.routes.js.map +1 -0
  555. package/dist-server/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.js +163 -0
  556. package/dist-server/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.js.map +1 -0
  557. package/dist-server/server/modules/scheduled-messages/services/scheduled-messages.service.js +95 -0
  558. package/dist-server/server/modules/scheduled-messages/services/scheduled-messages.service.js.map +1 -0
  559. package/dist-server/server/modules/scheduled-messages/tests/scheduled-messages.test.js +255 -0
  560. package/dist-server/server/modules/scheduled-messages/tests/scheduled-messages.test.js.map +1 -0
  561. package/dist-server/server/modules/settings/index.js +3 -0
  562. package/dist-server/server/modules/settings/index.js.map +1 -0
  563. package/dist-server/server/modules/settings/settings.module.js +35 -0
  564. package/dist-server/server/modules/settings/settings.module.js.map +1 -0
  565. package/dist-server/server/modules/settings/settings.routes.js +34 -0
  566. package/dist-server/server/modules/settings/settings.routes.js.map +1 -0
  567. package/dist-server/server/modules/settings/settings.service.js +116 -0
  568. package/dist-server/server/modules/settings/settings.service.js.map +1 -0
  569. package/dist-server/server/modules/settings/tests/settings.service.test.js +48 -0
  570. package/dist-server/server/modules/settings/tests/settings.service.test.js.map +1 -0
  571. package/dist-server/server/modules/system/index.js +3 -0
  572. package/dist-server/server/modules/system/index.js.map +1 -0
  573. package/dist-server/server/modules/system/system.module.js +44 -0
  574. package/dist-server/server/modules/system/system.module.js.map +1 -0
  575. package/dist-server/server/modules/system/system.routes.js +16 -0
  576. package/dist-server/server/modules/system/system.routes.js.map +1 -0
  577. package/dist-server/server/modules/system/system.service.js +45 -0
  578. package/dist-server/server/modules/system/system.service.js.map +1 -0
  579. package/dist-server/server/modules/system/tests/system.service.test.js +100 -0
  580. package/dist-server/server/modules/system/tests/system.service.test.js.map +1 -0
  581. package/dist-server/server/modules/taskmaster/index.js +3 -0
  582. package/dist-server/server/modules/taskmaster/index.js.map +1 -0
  583. package/dist-server/server/modules/taskmaster/taskmaster.module.js +20 -0
  584. package/dist-server/server/modules/taskmaster/taskmaster.module.js.map +1 -0
  585. package/dist-server/server/modules/taskmaster/taskmaster.routes.js +1372 -0
  586. package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -0
  587. package/dist-server/server/modules/taskmaster/taskmaster.service.js +107 -0
  588. package/dist-server/server/modules/taskmaster/taskmaster.service.js.map +1 -0
  589. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js +180 -0
  590. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js.map +1 -0
  591. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js +85 -0
  592. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js.map +1 -0
  593. package/dist-server/server/modules/user/index.js +3 -0
  594. package/dist-server/server/modules/user/index.js.map +1 -0
  595. package/dist-server/server/modules/user/tests/user.service.test.js +123 -0
  596. package/dist-server/server/modules/user/tests/user.service.test.js.map +1 -0
  597. package/dist-server/server/modules/user/user.module.js +56 -0
  598. package/dist-server/server/modules/user/user.module.js.map +1 -0
  599. package/dist-server/server/modules/user/user.routes.js +88 -0
  600. package/dist-server/server/modules/user/user.routes.js.map +1 -0
  601. package/dist-server/server/modules/user/user.service.js +134 -0
  602. package/dist-server/server/modules/user/user.service.js.map +1 -0
  603. package/dist-server/server/modules/voice/index.js +3 -0
  604. package/dist-server/server/modules/voice/index.js.map +1 -0
  605. package/dist-server/server/modules/voice/tests/voice.service.test.js +87 -0
  606. package/dist-server/server/modules/voice/tests/voice.service.test.js.map +1 -0
  607. package/dist-server/server/modules/voice/voice.module.js +44 -0
  608. package/dist-server/server/modules/voice/voice.module.js.map +1 -0
  609. package/dist-server/server/modules/voice/voice.routes.js +87 -0
  610. package/dist-server/server/modules/voice/voice.routes.js.map +1 -0
  611. package/dist-server/server/modules/voice/voice.service.js +148 -0
  612. package/dist-server/server/modules/voice/voice.service.js.map +1 -0
  613. package/dist-server/server/modules/websocket/index.js +11 -0
  614. package/dist-server/server/modules/websocket/index.js.map +1 -0
  615. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js +232 -0
  616. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js.map +1 -0
  617. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +135 -0
  618. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js.map +1 -0
  619. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +467 -0
  620. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -0
  621. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js +52 -0
  622. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js.map +1 -0
  623. package/dist-server/server/modules/websocket/services/session-upsert-broadcast.service.js +94 -0
  624. package/dist-server/server/modules/websocket/services/session-upsert-broadcast.service.js.map +1 -0
  625. package/dist-server/server/modules/websocket/services/shell-websocket.service.js +472 -0
  626. package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -0
  627. package/dist-server/server/modules/websocket/services/websocket-auth.service.js +36 -0
  628. package/dist-server/server/modules/websocket/services/websocket-auth.service.js.map +1 -0
  629. package/dist-server/server/modules/websocket/services/websocket-server.service.js +90 -0
  630. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -0
  631. package/dist-server/server/modules/websocket/services/websocket-state.service.js +14 -0
  632. package/dist-server/server/modules/websocket/services/websocket-state.service.js.map +1 -0
  633. package/dist-server/server/modules/websocket/services/websocket-writer.service.js +32 -0
  634. package/dist-server/server/modules/websocket/services/websocket-writer.service.js.map +1 -0
  635. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js +40 -0
  636. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js.map +1 -0
  637. package/dist-server/server/modules/websocket/tests/chat-edit-send.test.js +263 -0
  638. package/dist-server/server/modules/websocket/tests/chat-edit-send.test.js.map +1 -0
  639. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js +275 -0
  640. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js.map +1 -0
  641. package/dist-server/server/modules/websocket/tests/session-upsert-broadcast.test.js +106 -0
  642. package/dist-server/server/modules/websocket/tests/session-upsert-broadcast.test.js.map +1 -0
  643. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js +177 -0
  644. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js.map +1 -0
  645. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js +61 -0
  646. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js.map +1 -0
  647. package/dist-server/server/modules/worktrees/index.js +3 -0
  648. package/dist-server/server/modules/worktrees/index.js.map +1 -0
  649. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js +37 -0
  650. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js.map +1 -0
  651. package/dist-server/server/modules/worktrees/services/worktree-create.service.js +67 -0
  652. package/dist-server/server/modules/worktrees/services/worktree-create.service.js.map +1 -0
  653. package/dist-server/server/modules/worktrees/services/worktree-git.service.js +172 -0
  654. package/dist-server/server/modules/worktrees/services/worktree-git.service.js.map +1 -0
  655. package/dist-server/server/modules/worktrees/services/worktree-list.service.js +91 -0
  656. package/dist-server/server/modules/worktrees/services/worktree-list.service.js.map +1 -0
  657. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js +118 -0
  658. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js.map +1 -0
  659. package/dist-server/server/modules/worktrees/services/worktree-open.service.js +58 -0
  660. package/dist-server/server/modules/worktrees/services/worktree-open.service.js.map +1 -0
  661. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +65 -0
  662. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js.map +1 -0
  663. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js +58 -0
  664. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js.map +1 -0
  665. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js +85 -0
  666. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js.map +1 -0
  667. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js +58 -0
  668. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js.map +1 -0
  669. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js +34 -0
  670. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js.map +1 -0
  671. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js +137 -0
  672. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js.map +1 -0
  673. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js +99 -0
  674. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js.map +1 -0
  675. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js +157 -0
  676. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js.map +1 -0
  677. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js +167 -0
  678. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js.map +1 -0
  679. package/dist-server/server/modules/worktrees/worktrees.module.js +97 -0
  680. package/dist-server/server/modules/worktrees/worktrees.module.js.map +1 -0
  681. package/dist-server/server/modules/worktrees/worktrees.routes.js +84 -0
  682. package/dist-server/server/modules/worktrees/worktrees.routes.js.map +1 -0
  683. package/dist-server/server/piecemaker/anonymizer/lifecycle.js +20 -0
  684. package/dist-server/server/piecemaker/anonymizer/lifecycle.js.map +1 -0
  685. package/dist-server/server/piecemaker/harness/chat-harness.js +157 -0
  686. package/dist-server/server/piecemaker/harness/chat-harness.js.map +1 -0
  687. package/dist-server/server/piecemaker/harness/citation-instructions.js +17 -0
  688. package/dist-server/server/piecemaker/harness/citation-instructions.js.map +1 -0
  689. package/dist-server/server/piecemaker/harness/citation-store.js +72 -0
  690. package/dist-server/server/piecemaker/harness/citation-store.js.map +1 -0
  691. package/dist-server/server/piecemaker/harness/citation-turn.js +211 -0
  692. package/dist-server/server/piecemaker/harness/citation-turn.js.map +1 -0
  693. package/dist-server/server/piecemaker/harness/citations.routes.js +16 -0
  694. package/dist-server/server/piecemaker/harness/citations.routes.js.map +1 -0
  695. package/dist-server/server/piecemaker/harness/source-passages.js +19 -0
  696. package/dist-server/server/piecemaker/harness/source-passages.js.map +1 -0
  697. package/dist-server/server/piecemaker/index.js +49 -0
  698. package/dist-server/server/piecemaker/index.js.map +1 -0
  699. package/dist-server/server/piecemaker/knowledge/index.js +20 -0
  700. package/dist-server/server/piecemaker/knowledge/index.js.map +1 -0
  701. package/dist-server/server/piecemaker/knowledge/pipeline.js +162 -0
  702. package/dist-server/server/piecemaker/knowledge/pipeline.js.map +1 -0
  703. package/dist-server/server/piecemaker/knowledge/routes.js +26 -0
  704. package/dist-server/server/piecemaker/knowledge/routes.js.map +1 -0
  705. package/dist-server/server/piecemaker/knowledge/service.js +78 -0
  706. package/dist-server/server/piecemaker/knowledge/service.js.map +1 -0
  707. package/dist-server/server/piecemaker/library/index.js +66 -0
  708. package/dist-server/server/piecemaker/library/index.js.map +1 -0
  709. package/dist-server/server/piecemaker/library/marketplace.js +258 -0
  710. package/dist-server/server/piecemaker/library/marketplace.js.map +1 -0
  711. package/dist-server/server/piecemaker/library/migrate-cli.js +13 -0
  712. package/dist-server/server/piecemaker/library/migrate-cli.js.map +1 -0
  713. package/dist-server/server/piecemaker/library/migrate.js +53 -0
  714. package/dist-server/server/piecemaker/library/migrate.js.map +1 -0
  715. package/dist-server/server/piecemaker/library/provider-skills.js +40 -0
  716. package/dist-server/server/piecemaker/library/provider-skills.js.map +1 -0
  717. package/dist-server/server/piecemaker/library/routes.js +83 -0
  718. package/dist-server/server/piecemaker/library/routes.js.map +1 -0
  719. package/dist-server/server/piecemaker/library/runtime.js +34 -0
  720. package/dist-server/server/piecemaker/library/runtime.js.map +1 -0
  721. package/dist-server/server/piecemaker/library/store.js +468 -0
  722. package/dist-server/server/piecemaker/library/store.js.map +1 -0
  723. package/dist-server/server/piecemaker/library/workspace-installation.js +70 -0
  724. package/dist-server/server/piecemaker/library/workspace-installation.js.map +1 -0
  725. package/dist-server/server/piecemaker/timesheet/index.js +9 -0
  726. package/dist-server/server/piecemaker/timesheet/index.js.map +1 -0
  727. package/dist-server/server/piecemaker/timesheet/routes.js +42 -0
  728. package/dist-server/server/piecemaker/timesheet/routes.js.map +1 -0
  729. package/dist-server/server/piecemaker/timesheet/service.js +241 -0
  730. package/dist-server/server/piecemaker/timesheet/service.js.map +1 -0
  731. package/dist-server/server/piecemaker/timesheet/store.js +126 -0
  732. package/dist-server/server/piecemaker/timesheet/store.js.map +1 -0
  733. package/dist-server/server/shared/claude-cli-path.js +120 -0
  734. package/dist-server/server/shared/claude-cli-path.js.map +1 -0
  735. package/dist-server/server/shared/frontmatter.js +16 -0
  736. package/dist-server/server/shared/frontmatter.js.map +1 -0
  737. package/dist-server/server/shared/image-attachments.js +344 -0
  738. package/dist-server/server/shared/image-attachments.js.map +1 -0
  739. package/dist-server/server/shared/index.js +3 -0
  740. package/dist-server/server/shared/index.js.map +1 -0
  741. package/dist-server/server/shared/interfaces.js +2 -0
  742. package/dist-server/server/shared/interfaces.js.map +1 -0
  743. package/dist-server/server/shared/message-unification.js +376 -0
  744. package/dist-server/server/shared/message-unification.js.map +1 -0
  745. package/dist-server/server/shared/tests/application-data-root.test.js +33 -0
  746. package/dist-server/server/shared/tests/application-data-root.test.js.map +1 -0
  747. package/dist-server/server/shared/tests/claude-cli-path.test.js +89 -0
  748. package/dist-server/server/shared/tests/claude-cli-path.test.js.map +1 -0
  749. package/dist-server/server/shared/tests/image-attachments.test.js +262 -0
  750. package/dist-server/server/shared/tests/image-attachments.test.js.map +1 -0
  751. package/dist-server/server/shared/tests/message-unification.test.js +174 -0
  752. package/dist-server/server/shared/tests/message-unification.test.js.map +1 -0
  753. package/dist-server/server/shared/tests/slice-tail-page.test.js +35 -0
  754. package/dist-server/server/shared/tests/slice-tail-page.test.js.map +1 -0
  755. package/dist-server/server/shared/types.js +2 -0
  756. package/dist-server/server/shared/types.js.map +1 -0
  757. package/dist-server/server/shared/utils.js +1010 -0
  758. package/dist-server/server/shared/utils.js.map +1 -0
  759. package/dist-server/shared/networkHosts.js +20 -0
  760. package/dist-server/shared/networkHosts.js.map +1 -0
  761. package/dist-server/shared/product-config.mjs +79 -0
  762. package/dist-server/shared/product-config.mjs.map +1 -0
  763. package/package.json +271 -0
  764. package/product.config.json +17 -0
  765. package/public/api-docs.html +901 -0
  766. package/scripts/fix-node-pty.js +67 -0
  767. package/scripts/piecemaker/cli/install-command.mjs +130 -0
  768. package/scripts/piecemaker/cli/lib/composants.mjs +67 -0
  769. package/scripts/piecemaker/cli/lib/config.mjs +32 -0
  770. package/scripts/piecemaker/cli/lib/exec.mjs +79 -0
  771. package/scripts/piecemaker/cli/lib/node-runtime.mjs +76 -0
  772. package/scripts/piecemaker/cli/lib/plugins.mjs +35 -0
  773. package/scripts/piecemaker/cli/lib/ports.mjs +96 -0
  774. package/scripts/piecemaker/cli/lib/pwa.mjs +323 -0
  775. package/scripts/piecemaker/cli/lib/repos.mjs +140 -0
  776. package/scripts/piecemaker/cli/lib/services.mjs +71 -0
  777. package/scripts/piecemaker/cli/lib/ui.mjs +41 -0
  778. package/scripts/piecemaker/cli/piecemaker.mjs +161 -0
  779. package/scripts/piecemaker/cli/piecemaker.ps1 +63 -0
  780. package/scripts/piecemaker/cli/piecemaker.sh +60 -0
  781. package/scripts/piecemaker/generate-i18n-overrides.mjs +219 -0
  782. package/scripts/piecemaker/hooks/proxy-guard.mjs +286 -0
  783. package/scripts/promote-dist-server.mjs +50 -0
  784. package/scripts/release/build-server-bundle.js +178 -0
  785. package/scripts/release/package-piecemaker.sh +73 -0
  786. package/scripts/release/prepare-desktop-app.js +168 -0
  787. package/server/index.ts +410 -0
  788. package/server/load-env.ts +48 -0
  789. package/server/modules/agent/agent.module.ts +52 -0
  790. package/server/modules/agent/agent.routes.ts +1287 -0
  791. package/server/modules/agent/index.ts +2 -0
  792. package/server/modules/agent/tests/agent.routes.test.ts +237 -0
  793. package/server/modules/assets/assets.routes.ts +150 -0
  794. package/server/modules/assets/index.ts +3 -0
  795. package/server/modules/assets/services/image-assets.service.ts +127 -0
  796. package/server/modules/assets/tests/image-assets.service.test.ts +74 -0
  797. package/server/modules/auth/auth.middleware.ts +163 -0
  798. package/server/modules/auth/auth.module.ts +38 -0
  799. package/server/modules/auth/auth.routes.ts +57 -0
  800. package/server/modules/auth/auth.service.ts +155 -0
  801. package/server/modules/auth/index.ts +9 -0
  802. package/server/modules/auth/tests/auth.service.test.ts +95 -0
  803. package/server/modules/browser-use/browser-use-mcp.routes.ts +120 -0
  804. package/server/modules/browser-use/browser-use-mcp.ts +386 -0
  805. package/server/modules/browser-use/browser-use-runtime.ts +10 -0
  806. package/server/modules/browser-use/browser-use.routes.ts +159 -0
  807. package/server/modules/browser-use/browser-use.service.ts +835 -0
  808. package/server/modules/browser-use/index.ts +11 -0
  809. package/server/modules/browser-use/tests/browser-use.service.test.ts +10 -0
  810. package/server/modules/cli/cli.module.ts +110 -0
  811. package/server/modules/cli/cli.service.ts +266 -0
  812. package/server/modules/cli/cli.ts +19 -0
  813. package/server/modules/cli/index.ts +2 -0
  814. package/server/modules/cli/pwa-launcher.ts +131 -0
  815. package/server/modules/cli/sandbox.service.ts +413 -0
  816. package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +186 -0
  817. package/server/modules/cli/tests/cli.service.test.ts +107 -0
  818. package/server/modules/cli/tests/sandbox.service.test.ts +61 -0
  819. package/server/modules/commands/commands.module.ts +22 -0
  820. package/server/modules/commands/commands.routes.ts +605 -0
  821. package/server/modules/commands/index.ts +2 -0
  822. package/server/modules/commands/tests/commands.test.ts +114 -0
  823. package/server/modules/database/connection.ts +144 -0
  824. package/server/modules/database/index.ts +27 -0
  825. package/server/modules/database/init-db.ts +17 -0
  826. package/server/modules/database/migrations.ts +552 -0
  827. package/server/modules/database/repositories/api-keys.ts +119 -0
  828. package/server/modules/database/repositories/app-config.ts +53 -0
  829. package/server/modules/database/repositories/credentials.ts +106 -0
  830. package/server/modules/database/repositories/github-tokens.ts +100 -0
  831. package/server/modules/database/repositories/notification-channel-endpoints.ts +153 -0
  832. package/server/modules/database/repositories/notification-preferences.ts +117 -0
  833. package/server/modules/database/repositories/projects.db.ts +196 -0
  834. package/server/modules/database/repositories/provider-models.ts +168 -0
  835. package/server/modules/database/repositories/push-subscriptions.ts +80 -0
  836. package/server/modules/database/repositories/scan-state.db.ts +42 -0
  837. package/server/modules/database/repositories/scheduled-messages.db.ts +127 -0
  838. package/server/modules/database/repositories/session-drafts.db.ts +171 -0
  839. package/server/modules/database/repositories/sessions.db.ts +717 -0
  840. package/server/modules/database/repositories/user-preferences.db.ts +80 -0
  841. package/server/modules/database/repositories/users.ts +140 -0
  842. package/server/modules/database/repositories/vapid-keys.ts +57 -0
  843. package/server/modules/database/schema.ts +306 -0
  844. package/server/modules/database/tests/projects.db.integration.test.ts +72 -0
  845. package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -0
  846. package/server/modules/database/tests/sessions-provider-mapping.test.ts +109 -0
  847. package/server/modules/database/tests/sessions.db.integration.test.ts +168 -0
  848. package/server/modules/database/tests/user-preferences.db.integration.test.ts +135 -0
  849. package/server/modules/file-tree/file-tree.module.ts +116 -0
  850. package/server/modules/file-tree/file-tree.routes.ts +258 -0
  851. package/server/modules/file-tree/file-tree.service.ts +675 -0
  852. package/server/modules/file-tree/index.ts +2 -0
  853. package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -0
  854. package/server/modules/file-tree/tests/file-tree.service.test.ts +371 -0
  855. package/server/modules/git/git-branch.service.ts +43 -0
  856. package/server/modules/git/git-parsing.service.ts +66 -0
  857. package/server/modules/git/git.module.ts +22 -0
  858. package/server/modules/git/git.routes.ts +1600 -0
  859. package/server/modules/git/index.ts +2 -0
  860. package/server/modules/git/tests/git-branch.service.test.ts +60 -0
  861. package/server/modules/git/tests/git-init.routes.test.ts +135 -0
  862. package/server/modules/git/tests/git.test.ts +106 -0
  863. package/server/modules/notifications/index.ts +24 -0
  864. package/server/modules/notifications/notifications.routes.ts +127 -0
  865. package/server/modules/notifications/services/desktop-notification-clients.service.ts +124 -0
  866. package/server/modules/notifications/services/notification-orchestrator.service.js +310 -0
  867. package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -0
  868. package/server/modules/notifications/vapid-keys.service.ts +38 -0
  869. package/server/modules/notifications/websocket/desktop-notifications-websocket.service.ts +109 -0
  870. package/server/modules/plugins/index.ts +9 -0
  871. package/server/modules/plugins/plugin-process.service.ts +217 -0
  872. package/server/modules/plugins/plugin-registry.service.ts +461 -0
  873. package/server/modules/plugins/plugins.module.ts +33 -0
  874. package/server/modules/plugins/plugins.routes.ts +66 -0
  875. package/server/modules/plugins/plugins.service.ts +147 -0
  876. package/server/modules/plugins/tests/plugins.service.test.ts +32 -0
  877. package/server/modules/projects/index.ts +11 -0
  878. package/server/modules/projects/projects.routes.ts +273 -0
  879. package/server/modules/projects/services/project-clone.service.ts +323 -0
  880. package/server/modules/projects/services/project-delete.service.ts +102 -0
  881. package/server/modules/projects/services/project-management.service.ts +144 -0
  882. package/server/modules/projects/services/project-star.service.ts +78 -0
  883. package/server/modules/projects/services/projects-has-taskmaster.service.ts +248 -0
  884. package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +314 -0
  885. package/server/modules/projects/tests/project-clone.service.test.ts +183 -0
  886. package/server/modules/projects/tests/project-management.service.test.ts +117 -0
  887. package/server/modules/projects/tests/project-star.service.test.ts +123 -0
  888. package/server/modules/projects/tests/projects-has-taskmaster.service.test.ts +105 -0
  889. package/server/modules/providers/README.md +380 -0
  890. package/server/modules/providers/index.ts +14 -0
  891. package/server/modules/providers/list/claude/claude-auth.provider.ts +180 -0
  892. package/server/modules/providers/list/claude/claude-fork.provider.ts +57 -0
  893. package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -0
  894. package/server/modules/providers/list/claude/claude-models.provider.ts +326 -0
  895. package/server/modules/providers/list/claude/claude-runtime.provider.js +1217 -0
  896. package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +203 -0
  897. package/server/modules/providers/list/claude/claude-sessions.provider.ts +1108 -0
  898. package/server/modules/providers/list/claude/claude-skills.provider.ts +268 -0
  899. package/server/modules/providers/list/claude/claude.provider.ts +33 -0
  900. package/server/modules/providers/list/codex/codex-app-server.client.ts +243 -0
  901. package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -0
  902. package/server/modules/providers/list/codex/codex-fork.provider.ts +40 -0
  903. package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -0
  904. package/server/modules/providers/list/codex/codex-models.provider.ts +139 -0
  905. package/server/modules/providers/list/codex/codex-runtime.provider.ts +560 -0
  906. package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +212 -0
  907. package/server/modules/providers/list/codex/codex-sessions.provider.ts +2267 -0
  908. package/server/modules/providers/list/codex/codex-skills.provider.ts +73 -0
  909. package/server/modules/providers/list/codex/codex.provider.ts +33 -0
  910. package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -0
  911. package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -0
  912. package/server/modules/providers/list/cursor/cursor-models.provider.ts +119 -0
  913. package/server/modules/providers/list/cursor/cursor-runtime.provider.js +387 -0
  914. package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +158 -0
  915. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +654 -0
  916. package/server/modules/providers/list/cursor/cursor-skills.provider.ts +39 -0
  917. package/server/modules/providers/list/cursor/cursor.provider.ts +30 -0
  918. package/server/modules/providers/list/mistral/mistral-auth.provider.ts +181 -0
  919. package/server/modules/providers/list/mistral/mistral-mcp.provider.ts +20 -0
  920. package/server/modules/providers/list/mistral/mistral-models.provider.ts +76 -0
  921. package/server/modules/providers/list/mistral/mistral-runtime.provider.ts +417 -0
  922. package/server/modules/providers/list/mistral/mistral-session-synchronizer.provider.ts +15 -0
  923. package/server/modules/providers/list/mistral/mistral-sessions.provider.ts +210 -0
  924. package/server/modules/providers/list/mistral/mistral-skills.provider.ts +20 -0
  925. package/server/modules/providers/list/mistral/mistral.provider.ts +35 -0
  926. package/server/modules/providers/list/opencode/opencode-auth.provider.ts +110 -0
  927. package/server/modules/providers/list/opencode/opencode-mcp.provider.ts +228 -0
  928. package/server/modules/providers/list/opencode/opencode-models.provider.ts +476 -0
  929. package/server/modules/providers/list/opencode/opencode-runtime.provider.js +434 -0
  930. package/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +261 -0
  931. package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +179 -0
  932. package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +500 -0
  933. package/server/modules/providers/list/opencode/opencode-skills.provider.ts +78 -0
  934. package/server/modules/providers/list/opencode/opencode.provider.ts +30 -0
  935. package/server/modules/providers/provider.registry.ts +38 -0
  936. package/server/modules/providers/provider.routes.ts +909 -0
  937. package/server/modules/providers/services/mcp.service.ts +109 -0
  938. package/server/modules/providers/services/provider-auth.service.ts +26 -0
  939. package/server/modules/providers/services/provider-capabilities.service.ts +133 -0
  940. package/server/modules/providers/services/provider-models.service.ts +401 -0
  941. package/server/modules/providers/services/provider-runtime.service.ts +108 -0
  942. package/server/modules/providers/services/provider-token-usage.service.ts +484 -0
  943. package/server/modules/providers/services/session-conversations-search.service.ts +1321 -0
  944. package/server/modules/providers/services/session-history-cache.service.ts +139 -0
  945. package/server/modules/providers/services/session-synchronizer.service.ts +162 -0
  946. package/server/modules/providers/services/sessions-watcher.service.ts +266 -0
  947. package/server/modules/providers/services/sessions.service.ts +663 -0
  948. package/server/modules/providers/services/skills.service.ts +39 -0
  949. package/server/modules/providers/shared/base/abstract.provider.ts +32 -0
  950. package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -0
  951. package/server/modules/providers/shared/skills/skills.provider.ts +287 -0
  952. package/server/modules/providers/tests/claude-auth.test.ts +208 -0
  953. package/server/modules/providers/tests/claude-models.test.ts +87 -0
  954. package/server/modules/providers/tests/claude-sessions.test.ts +573 -0
  955. package/server/modules/providers/tests/claude-subagent-echo.test.ts +25 -0
  956. package/server/modules/providers/tests/claude-token-budget.test.ts +104 -0
  957. package/server/modules/providers/tests/codex-message-editing.test.ts +419 -0
  958. package/server/modules/providers/tests/codex-runtime.test.ts +58 -0
  959. package/server/modules/providers/tests/codex-session-fork.test.ts +59 -0
  960. package/server/modules/providers/tests/codex-sessions.test.ts +553 -0
  961. package/server/modules/providers/tests/mcp.test.ts +349 -0
  962. package/server/modules/providers/tests/opencode-models.test.ts +199 -0
  963. package/server/modules/providers/tests/opencode-sessions.test.ts +522 -0
  964. package/server/modules/providers/tests/provider-attachment-history.test.ts +247 -0
  965. package/server/modules/providers/tests/provider-models.service.test.ts +353 -0
  966. package/server/modules/providers/tests/provider-runtime.service.test.ts +138 -0
  967. package/server/modules/providers/tests/provider-token-usage.service.test.ts +373 -0
  968. package/server/modules/providers/tests/provider.routes.test.ts +244 -0
  969. package/server/modules/providers/tests/session-fork.test.ts +173 -0
  970. package/server/modules/providers/tests/session-history-cache.service.test.ts +143 -0
  971. package/server/modules/providers/tests/session-orphan-prune.test.ts +107 -0
  972. package/server/modules/providers/tests/session-synchronizer-coalescing.test.ts +136 -0
  973. package/server/modules/providers/tests/sessions-details.test.ts +73 -0
  974. package/server/modules/providers/tests/sessions.service.test.ts +193 -0
  975. package/server/modules/providers/tests/skills.test.ts +708 -0
  976. package/server/modules/scheduled-messages/index.ts +8 -0
  977. package/server/modules/scheduled-messages/scheduled-messages.routes.ts +68 -0
  978. package/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.ts +203 -0
  979. package/server/modules/scheduled-messages/services/scheduled-messages.service.ts +121 -0
  980. package/server/modules/scheduled-messages/tests/scheduled-messages.test.ts +310 -0
  981. package/server/modules/settings/index.ts +2 -0
  982. package/server/modules/settings/settings.module.ts +50 -0
  983. package/server/modules/settings/settings.routes.ts +51 -0
  984. package/server/modules/settings/settings.service.ts +186 -0
  985. package/server/modules/settings/tests/settings.service.test.ts +54 -0
  986. package/server/modules/system/index.ts +2 -0
  987. package/server/modules/system/system.module.ts +62 -0
  988. package/server/modules/system/system.routes.ts +21 -0
  989. package/server/modules/system/system.service.ts +76 -0
  990. package/server/modules/system/tests/system.service.test.ts +118 -0
  991. package/server/modules/taskmaster/index.ts +2 -0
  992. package/server/modules/taskmaster/taskmaster.module.ts +24 -0
  993. package/server/modules/taskmaster/taskmaster.routes.ts +1472 -0
  994. package/server/modules/taskmaster/taskmaster.service.ts +132 -0
  995. package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +201 -0
  996. package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -0
  997. package/server/modules/user/index.ts +2 -0
  998. package/server/modules/user/tests/user.service.test.ts +151 -0
  999. package/server/modules/user/user.module.ts +67 -0
  1000. package/server/modules/user/user.routes.ts +94 -0
  1001. package/server/modules/user/user.service.ts +190 -0
  1002. package/server/modules/voice/index.ts +2 -0
  1003. package/server/modules/voice/tests/voice.service.test.ts +99 -0
  1004. package/server/modules/voice/voice.module.ts +47 -0
  1005. package/server/modules/voice/voice.routes.ts +113 -0
  1006. package/server/modules/voice/voice.service.ts +192 -0
  1007. package/server/modules/websocket/README.md +273 -0
  1008. package/server/modules/websocket/index.ts +11 -0
  1009. package/server/modules/websocket/services/chat-run-registry.service.ts +310 -0
  1010. package/server/modules/websocket/services/chat-session-writer.service.ts +175 -0
  1011. package/server/modules/websocket/services/chat-websocket.service.ts +654 -0
  1012. package/server/modules/websocket/services/plugin-websocket-proxy.service.ts +65 -0
  1013. package/server/modules/websocket/services/session-upsert-broadcast.service.ts +108 -0
  1014. package/server/modules/websocket/services/shell-websocket.service.ts +628 -0
  1015. package/server/modules/websocket/services/websocket-auth.service.ts +59 -0
  1016. package/server/modules/websocket/services/websocket-server.service.ts +126 -0
  1017. package/server/modules/websocket/services/websocket-state.service.ts +16 -0
  1018. package/server/modules/websocket/services/websocket-writer.service.ts +38 -0
  1019. package/server/modules/websocket/tests/chat-attachment-filter.test.ts +59 -0
  1020. package/server/modules/websocket/tests/chat-edit-send.test.ts +309 -0
  1021. package/server/modules/websocket/tests/chat-run-registry.test.ts +313 -0
  1022. package/server/modules/websocket/tests/session-upsert-broadcast.test.ts +138 -0
  1023. package/server/modules/websocket/tests/shell-websocket.service.test.ts +227 -0
  1024. package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -0
  1025. package/server/modules/worktrees/index.ts +2 -0
  1026. package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -0
  1027. package/server/modules/worktrees/services/worktree-create.service.ts +104 -0
  1028. package/server/modules/worktrees/services/worktree-git.service.ts +207 -0
  1029. package/server/modules/worktrees/services/worktree-list.service.ts +143 -0
  1030. package/server/modules/worktrees/services/worktree-merge.service.ts +157 -0
  1031. package/server/modules/worktrees/services/worktree-open.service.ts +85 -0
  1032. package/server/modules/worktrees/services/worktree-remove.service.ts +88 -0
  1033. package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -0
  1034. package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -0
  1035. package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -0
  1036. package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -0
  1037. package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -0
  1038. package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -0
  1039. package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -0
  1040. package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -0
  1041. package/server/modules/worktrees/worktrees.module.ts +113 -0
  1042. package/server/modules/worktrees/worktrees.routes.ts +116 -0
  1043. package/server/piecemaker/activation/claude-mcp.cjs +115 -0
  1044. package/server/piecemaker/activation/claude-plugins.cjs +94 -0
  1045. package/server/piecemaker/activation/codex-mcp.cjs +102 -0
  1046. package/server/piecemaker/activation/errors.cjs +15 -0
  1047. package/server/piecemaker/activation/index.cjs +5 -0
  1048. package/server/piecemaker/activation/library.cjs +284 -0
  1049. package/server/piecemaker/activation/markdown.cjs +108 -0
  1050. package/server/piecemaker/activation/paths.cjs +104 -0
  1051. package/server/piecemaker/activation/routes.cjs +101 -0
  1052. package/server/piecemaker/activation/snapshot.cjs +30 -0
  1053. package/server/piecemaker/anonymizer/client-config.cjs +228 -0
  1054. package/server/piecemaker/anonymizer/dictionary.cjs +171 -0
  1055. package/server/piecemaker/anonymizer/lifecycle.ts +22 -0
  1056. package/server/piecemaker/anonymizer/providers.cjs +241 -0
  1057. package/server/piecemaker/anonymizer/proxy.cjs +365 -0
  1058. package/server/piecemaker/anonymizer/rewrite.cjs +343 -0
  1059. package/server/piecemaker/anonymizer/routes.cjs +43 -0
  1060. package/server/piecemaker/anonymizer/service.cjs +223 -0
  1061. package/server/piecemaker/anonymizer/sqlite-dictionary.cjs +121 -0
  1062. package/server/piecemaker/harness/chat-harness.ts +151 -0
  1063. package/server/piecemaker/harness/citation-instructions.ts +18 -0
  1064. package/server/piecemaker/harness/citation-store.ts +80 -0
  1065. package/server/piecemaker/harness/citation-turn.ts +197 -0
  1066. package/server/piecemaker/harness/citations.routes.ts +18 -0
  1067. package/server/piecemaker/harness/decisions.cjs +302 -0
  1068. package/server/piecemaker/harness/flux-sse.cjs +111 -0
  1069. package/server/piecemaker/harness/index.cjs +103 -0
  1070. package/server/piecemaker/harness/source-passages.ts +21 -0
  1071. package/server/piecemaker/harness/verification.cjs +159 -0
  1072. package/server/piecemaker/index.ts +62 -0
  1073. package/server/piecemaker/knowledge/index.ts +22 -0
  1074. package/server/piecemaker/knowledge/pipeline.ts +173 -0
  1075. package/server/piecemaker/knowledge/routes.ts +29 -0
  1076. package/server/piecemaker/knowledge/service.ts +80 -0
  1077. package/server/piecemaker/library/index.ts +54 -0
  1078. package/server/piecemaker/library/marketplace.ts +200 -0
  1079. package/server/piecemaker/library/migrate-cli.ts +11 -0
  1080. package/server/piecemaker/library/migrate.ts +49 -0
  1081. package/server/piecemaker/library/policy.cjs +9 -0
  1082. package/server/piecemaker/library/provider-skills.ts +48 -0
  1083. package/server/piecemaker/library/routes.ts +51 -0
  1084. package/server/piecemaker/library/runtime.ts +39 -0
  1085. package/server/piecemaker/library/store.ts +456 -0
  1086. package/server/piecemaker/library/workspace-installation.ts +61 -0
  1087. package/server/piecemaker/originals-cache.cjs +54 -0
  1088. package/server/piecemaker/protection/bypass.cjs +73 -0
  1089. package/server/piecemaker/protection/routes.cjs +39 -0
  1090. package/server/piecemaker/router.cjs +107 -0
  1091. package/server/piecemaker/timesheet/index.ts +9 -0
  1092. package/server/piecemaker/timesheet/routes.ts +48 -0
  1093. package/server/piecemaker/timesheet/service.ts +298 -0
  1094. package/server/piecemaker/timesheet/store.ts +167 -0
  1095. package/server/piecemaker/vendor/installer/assets/PieceMakerApp.swift +189 -0
  1096. package/server/piecemaker/vendor/installer/assets/claude-hooks/piecemaker-guard-secrets.mjs +230 -0
  1097. package/server/piecemaker/vendor/installer/assets/claude-hooks/piecemaker-secret-paths.default.json +1 -0
  1098. package/server/piecemaker/vendor/installer/assets/piecemaker.icns +0 -0
  1099. package/server/piecemaker/vendor/installer/assets/piecemaker.ico +0 -0
  1100. package/server/piecemaker/vendor/installer/bin/piecemaker.mjs +1066 -0
  1101. package/server/piecemaker/vendor/installer/lib/banner.mjs +35 -0
  1102. package/server/piecemaker/vendor/installer/lib/codex-skills.mjs +343 -0
  1103. package/server/piecemaker/vendor/installer/lib/commandes.mjs +13 -0
  1104. package/server/piecemaker/vendor/installer/lib/desktop-launcher.mjs +305 -0
  1105. package/server/piecemaker/vendor/installer/lib/legacy-legifrance.mjs +72 -0
  1106. package/server/piecemaker/vendor/installer/lib/platform.mjs +163 -0
  1107. package/server/piecemaker/vendor/installer/lib/prompt.mjs +138 -0
  1108. package/server/piecemaker/vendor/installer/lib/resume-steps.mjs +174 -0
  1109. package/server/piecemaker/vendor/installer/lib/secrets-guard.mjs +193 -0
  1110. package/server/piecemaker/vendor/installer/lib/service.mjs +467 -0
  1111. package/server/piecemaker/vendor/installer/lib/state.mjs +113 -0
  1112. package/server/piecemaker/vendor/installer/lib/ui.mjs +159 -0
  1113. package/server/piecemaker/vendor/installer/steps/00-identite.mjs +71 -0
  1114. package/server/piecemaker/vendor/installer/steps/01-prerequis.mjs +119 -0
  1115. package/server/piecemaker/vendor/installer/steps/02-dependances-node.mjs +127 -0
  1116. package/server/piecemaker/vendor/installer/steps/03-python-gliner.mjs +260 -0
  1117. package/server/piecemaker/vendor/installer/steps/04-conversion-md.mjs +147 -0
  1118. package/server/piecemaker/vendor/installer/steps/05-certificats.mjs +171 -0
  1119. package/server/piecemaker/vendor/installer/steps/06-hooks.mjs +266 -0
  1120. package/server/piecemaker/vendor/installer/steps/07-legifrance.mjs +279 -0
  1121. package/server/piecemaker/vendor/installer/steps/08-telegram.mjs +482 -0
  1122. package/server/piecemaker/vendor/installer/steps/09-claude-assets.mjs +151 -0
  1123. package/server/piecemaker/vendor/installer/steps/09-codex-plugin.mjs +142 -0
  1124. package/server/piecemaker/vendor/installer/steps/10-libreoffice.mjs +130 -0
  1125. package/server/piecemaker/vendor/installer/steps/10-pandoc.mjs +212 -0
  1126. package/server/piecemaker/vendor/installer/steps/11-docx-cli.mjs +144 -0
  1127. package/server/piecemaker/vendor/installer/steps/12-mcp-piecemaker.mjs +124 -0
  1128. package/server/piecemaker/vendor/installer/steps/13-garde-secrets.mjs +136 -0
  1129. package/server/piecemaker/vendor/installer/steps/14-mxc-sandbox.mjs +271 -0
  1130. package/server/piecemaker/vendor/installer/steps/15-pwa-desktop.mjs +64 -0
  1131. package/server/piecemaker/vendor/installer/templates/root-CLAUDE.md +56 -0
  1132. package/server/piecemaker/vendor/installer/templates/workspace-CLAUDE.md +52 -0
  1133. package/server/piecemaker/vendor/mcp/README.md +13 -0
  1134. package/server/piecemaker/vendor/mcp/piecemaker/server.mjs +217 -0
  1135. package/server/piecemaker/vendor/mike-defaults-fr/PROVENANCE.md +10 -0
  1136. package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/compare-documents/SKILL.md +51 -0
  1137. package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/draft-from-template/SKILL.md +27 -0
  1138. package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/extract-key-terms/SKILL.md +43 -0
  1139. package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/proofread/SKILL.md +98 -0
  1140. package/server/piecemaker/vendor/mike-defaults-fr/catalog.json +22 -0
  1141. package/server/piecemaker/vendor/mike-defaults-fr/tabular-review-workflows/commercial-agreement-tabular-review/SKILL.md +31 -0
  1142. package/server/piecemaker/vendor/mike-defaults-fr/tabular-review-workflows/commercial-agreement-tabular-review/table-columns.yaml +92 -0
  1143. package/server/piecemaker/vendor/package.json +7 -0
  1144. package/server/piecemaker/vendor/piecemaker-plugin/README.md +115 -0
  1145. package/server/piecemaker/vendor/piecemaker-plugin/agents/analyste-piece.md +24 -0
  1146. package/server/piecemaker/vendor/piecemaker-plugin/agents/jurisprudence-scanner.md +50 -0
  1147. package/server/piecemaker/vendor/piecemaker-plugin/hooks/hooks.json +84 -0
  1148. package/server/piecemaker/vendor/piecemaker-plugin/scripts/billing-track.mjs +194 -0
  1149. package/server/piecemaker/vendor/piecemaker-plugin/scripts/build-recherche-pdf.mjs +91 -0
  1150. package/server/piecemaker/vendor/piecemaker-plugin/scripts/classify-ai-documents.mjs +123 -0
  1151. package/server/piecemaker/vendor/piecemaker-plugin/scripts/commit-track.mjs +71 -0
  1152. package/server/piecemaker/vendor/piecemaker-plugin/scripts/compile-recherche.mjs +107 -0
  1153. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/anonymization-state.cjs +146 -0
  1154. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folder-structure.cjs +297 -0
  1155. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folders.cjs +86 -0
  1156. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/central-mapping.cjs +0 -0
  1157. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citation-sources.cjs +519 -0
  1158. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citations.cjs +292 -0
  1159. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/commits.cjs +1683 -0
  1160. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/docx-text-worker.cjs +43 -0
  1161. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/hook-io.mjs +249 -0
  1162. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/institutional-terms.cjs +160 -0
  1163. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/legifrance-reads.cjs +85 -0
  1164. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.cjs +346 -0
  1165. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/protection.cjs +419 -0
  1166. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/recherche-report.cjs +177 -0
  1167. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/session-timing.cjs +80 -0
  1168. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/substitution.cjs +288 -0
  1169. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/verify-citations.cjs +318 -0
  1170. package/server/piecemaker/vendor/piecemaker-plugin/scripts/protect-originals.mjs +256 -0
  1171. package/server/piecemaker/vendor/piecemaker-plugin/scripts/session-commit-worker.mjs +260 -0
  1172. package/server/piecemaker/vendor/piecemaker-plugin/scripts/session-commit.mjs +83 -0
  1173. package/server/piecemaker/vendor/piecemaker-plugin/scripts/statusline.mjs +179 -0
  1174. package/server/piecemaker/vendor/piecemaker-plugin/scripts/track-legifrance-reads.mjs +46 -0
  1175. package/server/piecemaker/vendor/piecemaker-plugin/skills/ajout-de-fonctionnalites/SKILL.md +66 -0
  1176. package/server/piecemaker/vendor/piecemaker-plugin/skills/conversion-md/SKILL.md +60 -0
  1177. package/server/piecemaker/vendor/piecemaker-plugin/skills/recherche-juridique/SKILL.md +234 -0
  1178. package/server/piecemaker/vendor/piecemaker-plugin/skills/redaction-juridique/SKILL.md +96 -0
  1179. package/server/piecemaker/vendor/piecemaker-plugin/skills/tamponnage/SKILL.md +148 -0
  1180. package/server/piecemaker/vendor/websocket-server/admin-routes.cjs +3116 -0
  1181. package/server/piecemaker/vendor/websocket-server/case-folder-structure.cjs +3 -0
  1182. package/server/piecemaker/vendor/websocket-server/case-instructions.cjs +111 -0
  1183. package/server/piecemaker/vendor/websocket-server/case-registry.cjs +93 -0
  1184. package/server/piecemaker/vendor/websocket-server/claude-assets.cjs +338 -0
  1185. package/server/piecemaker/vendor/websocket-server/claude-hooks.cjs +380 -0
  1186. package/server/piecemaker/vendor/websocket-server/document-index.cjs +665 -0
  1187. package/server/piecemaker/vendor/websocket-server/legal-forms.cjs +89 -0
  1188. package/server/piecemaker/vendor/websocket-server/lib/doc-generate.cjs +229 -0
  1189. package/server/piecemaker/vendor/websocket-server/lib/export-render.cjs +440 -0
  1190. package/server/piecemaker/vendor/websocket-server/lib/office-to-pdf.cjs +306 -0
  1191. package/server/piecemaker/vendor/websocket-server/lib/stamping.cjs +39 -0
  1192. package/server/piecemaker/vendor/websocket-server/originals-pipeline.cjs +1150 -0
  1193. package/server/piecemaker/vendor/websocket-server/scripts/ADDRESS_ANONYMIZATION.md +216 -0
  1194. package/server/piecemaker/vendor/websocket-server/scripts/DEDUPLICATION_CHANGES.md +134 -0
  1195. package/server/piecemaker/vendor/websocket-server/scripts/GLINER2_README.md +138 -0
  1196. package/server/piecemaker/vendor/websocket-server/scripts/__pycache__/scan_utils.cpython-312.pyc +0 -0
  1197. package/server/piecemaker/vendor/websocket-server/scripts/convert_and_scan_pipeline.py +1968 -0
  1198. package/server/piecemaker/vendor/websocket-server/scripts/mineru_improved_1.py +208 -0
  1199. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/AUDIT_PERF_QUALITE.md +246 -0
  1200. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/MODELE_COREML.md +62 -0
  1201. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/__pycache__/coreml_runtime.cpython-312.pyc +0 -0
  1202. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/__pycache__/model_config.cpython-312.pyc +0 -0
  1203. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/build_coreml.py +118 -0
  1204. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/coreml_runtime.py +164 -0
  1205. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/model_config.py +63 -0
  1206. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/presidio-gliner.py +479 -0
  1207. package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/scanner_worker.py +668 -0
  1208. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__init__.py +10 -0
  1209. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/__init__.cpython-312.pyc +0 -0
  1210. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/analysis_explanation.cpython-312.pyc +0 -0
  1211. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/entity_recognizer.cpython-312.pyc +0 -0
  1212. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/local_recognizer.cpython-312.pyc +0 -0
  1213. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/pattern.cpython-312.pyc +0 -0
  1214. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/pattern_recognizer.cpython-312.pyc +0 -0
  1215. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/recognizer_result.cpython-312.pyc +0 -0
  1216. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/analysis_explanation.py +65 -0
  1217. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/entity_recognizer.py +213 -0
  1218. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/__init__.py +21 -0
  1219. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/language_validation.py +18 -0
  1220. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/schemas.py +132 -0
  1221. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/yaml_recognizer_models.py +422 -0
  1222. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/local_recognizer.py +7 -0
  1223. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__init__.py +15 -0
  1224. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/__init__.cpython-312.pyc +0 -0
  1225. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/device_detector.cpython-312.pyc +0 -0
  1226. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/ner_model_configuration.cpython-312.pyc +0 -0
  1227. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/nlp_artifacts.cpython-312.pyc +0 -0
  1228. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/nlp_engine.cpython-312.pyc +0 -0
  1229. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/spacy_nlp_engine.cpython-312.pyc +0 -0
  1230. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/device_detector.py +65 -0
  1231. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/ner_model_configuration.py +128 -0
  1232. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/nlp_artifacts.py +88 -0
  1233. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/nlp_engine.py +65 -0
  1234. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/nlp_engine_provider.py +114 -0
  1235. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/spacy_nlp_engine.py +290 -0
  1236. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/pattern.py +66 -0
  1237. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/pattern_recognizer.py +297 -0
  1238. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/__init__.py +4 -0
  1239. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/__pycache__/__init__.cpython-312.pyc +0 -0
  1240. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/__pycache__/gliner_recognizer.cpython-312.pyc +0 -0
  1241. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__init__.py +0 -0
  1242. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/__init__.cpython-312.pyc +0 -0
  1243. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/credit_card_recognizer.cpython-312.pyc +0 -0
  1244. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/crypto_recognizer.cpython-312.pyc +0 -0
  1245. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/email_recognizer.cpython-312.pyc +0 -0
  1246. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/iban_patterns.cpython-312.pyc +0 -0
  1247. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/iban_recognizer.cpython-312.pyc +0 -0
  1248. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/ip_recognizer.cpython-312.pyc +0 -0
  1249. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/mac_recognizer.cpython-312.pyc +0 -0
  1250. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/url_recognizer.cpython-312.pyc +0 -0
  1251. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/credit_card_recognizer.py +82 -0
  1252. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/crypto_recognizer.py +141 -0
  1253. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/date_recognizer.py +102 -0
  1254. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/email_recognizer.py +48 -0
  1255. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/iban_patterns.py +173 -0
  1256. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/iban_recognizer.py +221 -0
  1257. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/ip_recognizer.py +65 -0
  1258. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/mac_recognizer.py +73 -0
  1259. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/url_recognizer.py +50 -0
  1260. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/gliner_recognizer.py +218 -0
  1261. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/spacy_recognizer.py +139 -0
  1262. package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/recognizer_result.py +188 -0
  1263. package/server/piecemaker/vendor/websocket-server/scripts/requirements.txt +29 -0
  1264. package/server/piecemaker/vendor/websocket-server/scripts/scan_utils.py +469 -0
  1265. package/server/piecemaker/vendor/websocket-server/scripts/smart_converter.py +366 -0
  1266. package/server/piecemaker/vendor/websocket-server/scripts/warmup.py +464 -0
  1267. package/server/piecemaker/vendor/websocket-server/stamping-routes.cjs +334 -0
  1268. package/server/piecemaker/vendor/websocket-server/telegram-admin.cjs +602 -0
  1269. package/server/piecemaker/vendor/websocket-server/workspace-paths.cjs +22 -0
  1270. package/server/shared/claude-cli-path.ts +157 -0
  1271. package/server/shared/frontmatter.ts +18 -0
  1272. package/server/shared/image-attachments.ts +437 -0
  1273. package/server/shared/index.ts +3 -0
  1274. package/server/shared/interfaces.ts +241 -0
  1275. package/server/shared/message-unification.ts +449 -0
  1276. package/server/shared/tests/application-data-root.test.ts +29 -0
  1277. package/server/shared/tests/claude-cli-path.test.ts +118 -0
  1278. package/server/shared/tests/image-attachments.test.ts +353 -0
  1279. package/server/shared/tests/message-unification.test.ts +218 -0
  1280. package/server/shared/tests/slice-tail-page.test.ts +42 -0
  1281. package/server/shared/types.ts +1354 -0
  1282. package/server/shared/utils.ts +1212 -0
  1283. package/server/tsconfig.json +40 -0
  1284. package/shared/networkHosts.js +22 -0
  1285. package/shared/product-config.mjs +86 -0
@@ -0,0 +1,1150 @@
1
+ /**
2
+ * Conversion Markdown et pipeline d'anonymisation des pièces originales d'un
3
+ * dossier juridique, pilotés depuis l'administration.
4
+ *
5
+ * Les originaux ne sortent jamais du dossier, et le pipeline porte sur toutes
6
+ * les pièces du dossier, sans restriction de zone. Le Markdown d'une pièce de
7
+ * `01_CORRESPONDANCE` ou `02_DATA_ROOM` est rangé dans le sous-dossier de
8
+ * conversion métier correspondant ; celui d'une pièce hors de ces deux zones
9
+ * rejoint le sous-dossier de travail générique. Le mapping canonique reste
10
+ * dans `Fichiers convertis PieceMaker/` et l'état technique dans
11
+ * `.piecemaker/anonymization-state.json`. Seules les lignes `PROGRESS:` et un
12
+ * extrait d'erreur sont conservés dans le journal d'un travail : la sortie
13
+ * brute des scripts peut contenir du texte de pièce, qui ne doit jamais
14
+ * remonter dans l'interface.
15
+ */
16
+ const crypto = require('node:crypto');
17
+ const fs = require('node:fs');
18
+ const os = require('node:os');
19
+ const path = require('node:path');
20
+ const { spawn } = require('node:child_process');
21
+ const {
22
+ ensureProcessTreeStopped,
23
+ terminateProcessTree,
24
+ } = require('./process-group.cjs');
25
+
26
+ const {
27
+ createCommit,
28
+ originalFilesOverview,
29
+ resolveCase,
30
+ safeCaseFiles,
31
+ } = require('../piecemaker-plugin/scripts/lib/commits.cjs');
32
+ const { documentKey, WORKSPACE_SUBDIR } = require('../piecemaker-plugin/scripts/lib/protection.cjs');
33
+ const {
34
+ caseConversionOutputDirectory,
35
+ classifyRelativeCaseFolderPath,
36
+ readCaseFolderStructure,
37
+ } = require('./case-folder-structure.cjs');
38
+ const {
39
+ markFilesAnonymized,
40
+ markFilesConverted,
41
+ } = require('../piecemaker-plugin/scripts/lib/anonymization-state.cjs');
42
+ // Le mapping vit dans le plugin : c'est le seul des trois consommateurs (hooks,
43
+ // pipeline, routeur du task pane) qui soit distribué seul.
44
+ const {
45
+ caseMappingFile,
46
+ normalizeMappingDocument,
47
+ readCaseMapping,
48
+ readJsonFile,
49
+ sortedMapping,
50
+ } = require('../piecemaker-plugin/scripts/lib/mapping.cjs');
51
+ // Vocabulaire des sigles de sociétés (SA_1, SARL_1, PERS_MORALE_1…), miroir de
52
+ // `_LEGAL_FORMS` (scan_utils.py) — sert à classer un code déjà attribué.
53
+ const { isSocieteCode, societeCounterKey, detectCompanySigle, LEGAL_FORM_TOKENS } = require('./legal-forms.cjs');
54
+ // À chaque enregistrement d'un mapping de dossier, le mapping central global est
55
+ // reconstruit et dé-conflicté : c'est lui que le hook central applique à toute
56
+ // lecture, dossier ou non. `syncCentralMapping` ne jette jamais — un central qui
57
+ // échoue ne doit pas faire échouer la sauvegarde du dossier.
58
+ const { syncCentralMapping } = require('../piecemaker-plugin/scripts/lib/central-mapping.cjs');
59
+
60
+ const SCRIPTS_DIR = path.join(__dirname, 'scripts');
61
+ const CONVERTER_SCRIPT = () => process.env.SMART_CONVERTER_PATH || path.join(SCRIPTS_DIR, 'smart_converter.py');
62
+ const PIPELINE_SCRIPT = () => process.env.PIECEMAKER_PIPELINE_PATH || path.join(SCRIPTS_DIR, 'convert_and_scan_pipeline.py');
63
+ const PIECEMAKER_HOME = path.join(os.homedir(), '.piecemaker');
64
+ const configuredPythonPath = () => {
65
+ try {
66
+ const { pythonPath } = JSON.parse(fs.readFileSync(path.join(PIECEMAKER_HOME, 'config.json'), 'utf8'));
67
+ return pythonPath && fs.existsSync(pythonPath) ? pythonPath : null;
68
+ } catch {
69
+ return null;
70
+ }
71
+ };
72
+ const PYTHON = () => process.env.PYTHON_PATH || configuredPythonPath() || 'python3';
73
+ const MAX_LOG_LINES = 200;
74
+ const MAX_ERROR_LINES = 12;
75
+
76
+ const GIB = 1024 ** 3;
77
+ /**
78
+ * Contrôle d'admission des traitements — pensé pour ne jamais saturer la machine
79
+ * de l'utilisateur (sa priorité explicite). Deux contraintes :
80
+ * 1. exclusivité GLiNER : au plus un `anonymize` à la fois, quel que soit le
81
+ * dossier (deux workers chargeraient chacun ~400 Mo de poids et figeraient
82
+ * l'ordinateur) ;
83
+ * 2. budget RAM : les conversions peuvent tourner en parallèle tant que la somme
84
+ * de leurs réservations reste sous ~la moitié de la RAM.
85
+ * Tout est réglable par variable d'environnement, ce qui rend aussi les tests
86
+ * déterministes sans dépendre de la RAM réelle.
87
+ */
88
+ const RAM_BUDGET_BYTES = () => Number(process.env.PIECEMAKER_RAM_BUDGET_BYTES) || Math.floor(os.totalmem() * 0.5);
89
+ const JOB_RESERVE_BYTES = (action) => {
90
+ if (action === 'anonymize') return Number(process.env.PIECEMAKER_ANONYMIZE_JOB_BYTES) || 3 * GIB;
91
+ return Number(process.env.PIECEMAKER_CONVERT_JOB_BYTES) || 2 * GIB;
92
+ };
93
+ /** Priorité CPU (nice) des process de traitement : cède la main dès que l'utilisateur travaille. */
94
+ const JOB_NICE = () => {
95
+ const value = Number(process.env.PIECEMAKER_JOB_NICE);
96
+ return Number.isFinite(value) ? value : 10;
97
+ };
98
+ /** Threads torch du scanner : abaissé de 6 à 4 pour laisser des cœurs libres (le worker lit cette variable). */
99
+ const JOB_TORCH_THREADS = () => process.env.PIECEMAKER_TORCH_THREADS || '4';
100
+ const JOB_TIMEOUT_MS = () => {
101
+ const value = Number(process.env.PIECEMAKER_ORIGINALS_JOB_TIMEOUT_MS);
102
+ return Number.isFinite(value) && value > 0 ? value : 60 * 60 * 1000;
103
+ };
104
+ const PROCESS_TERMINATION_GRACE_MS = () => {
105
+ const value = Number(process.env.PIECEMAKER_PROCESS_GROUP_GRACE_MS);
106
+ return Number.isFinite(value) && value > 0 ? value : 2_000;
107
+ };
108
+
109
+ /** Les pièces d'un dossier listées dans l'administration : tout sauf le Markdown. */
110
+ async function listOriginals(caseRoot) {
111
+ const originals = await originalFilesOverview(caseRoot);
112
+ const snapshot = readCaseFolderStructure(caseRoot);
113
+ return originals
114
+ .map((file) => ({
115
+ file,
116
+ info: classifyRelativeCaseFolderPath(file.path, snapshot.structure, { managed: snapshot.exists }),
117
+ }))
118
+ // Les images et autres dérivés produits avec le Markdown ne redeviennent
119
+ // jamais des pièces originales dans l'administration.
120
+ .filter(({ file, info }) => file.extension !== '.md' && !info.generated)
121
+ .map(({ file, info }) => ({
122
+ ...file,
123
+ businessArea: info.area,
124
+ }));
125
+ }
126
+
127
+ function caseMappingPayload(document) {
128
+ const normalized = normalizeMappingDocument(document);
129
+ return {
130
+ mapping: sortedMapping(normalized.mapping),
131
+ reverse_mapping: normalized.reverse_mapping,
132
+ ...(Object.keys(normalized.extracted_data).length ? { extracted_data: normalized.extracted_data } : {}),
133
+ ...(normalized.ignored.length ? { ignored: normalized.ignored } : {}),
134
+ informations_dossier: normalized.informations_dossier,
135
+ };
136
+ }
137
+
138
+ function writeCaseMapping(caseRoot, document) {
139
+ const file = caseMappingFile(caseRoot);
140
+ const payload = caseMappingPayload(document);
141
+ fs.mkdirSync(path.dirname(file), { recursive: true });
142
+ const temporary = `${file}.piecemaker-${process.pid}.tmp`;
143
+ fs.writeFileSync(temporary, `${JSON.stringify(payload, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
144
+ fs.renameSync(temporary, file);
145
+ // Une fois le fichier canonique écrit avec succès, tous les autres mappings
146
+ // sont supprimés : les legacy (`mapping_<id>.json`) comme un `mapping_default.json`
147
+ // resté à la racine par une version antérieure — c'est la migration. La
148
+ // comparaison porte sur le chemin complet, sinon un `mapping_default.json`
149
+ // racine passerait pour le fichier canonique (même basename) et survivrait.
150
+ // `readCaseMapping` les a tous fusionnés au préalable ; aucune entité n'est perdue.
151
+ for (const dir of new Set([caseRoot, path.dirname(file)])) {
152
+ let entries;
153
+ try {
154
+ entries = fs.readdirSync(dir, { withFileTypes: true });
155
+ } catch {
156
+ continue;
157
+ }
158
+ for (const entry of entries) {
159
+ if (!entry.isFile() || !/^mapping.*\.json$/i.test(entry.name)) continue;
160
+ const full = path.join(dir, entry.name);
161
+ if (full === file) continue;
162
+ fs.unlinkSync(full);
163
+ }
164
+ }
165
+ // Le mapping central reflète désormais ce dossier. Best-effort et jamais bloquant.
166
+ try { syncCentralMapping(); } catch { /* le central ne doit pas bloquer une sauvegarde */ }
167
+ return { file, exists: true, ignored: payload.ignored || [], ...payload };
168
+ }
169
+
170
+ /**
171
+ * Enregistre un mapping édité à la main. Une entrée supprimée rejoint
172
+ * `ignored` : c'est ce qui empêche un faux positif écarté par le juriste
173
+ * d'être réintroduit par le scan suivant, que `rebuildCaseMapping` relit.
174
+ */
175
+ function saveCaseMapping(caseRoot, document) {
176
+ const current = readCaseMapping(caseRoot);
177
+ // L'éditeur n'envoie que `mapping` et `reverse_mapping` : `extracted_data`
178
+ // est repris du fichier, sinon un simple enregistrement perdrait les variants.
179
+ const next = normalizeMappingDocument({
180
+ extracted_data: current.extracted_data,
181
+ informations_dossier: current.informations_dossier,
182
+ ...document,
183
+ });
184
+ const removed = Object.keys(current.mapping).filter((entity) => !next.mapping[entity]);
185
+ const ignored = [...new Set([...current.ignored, ...removed])].filter((entity) => !next.mapping[entity]);
186
+ return writeCaseMapping(caseRoot, { ...next, ignored });
187
+ }
188
+
189
+ function codePrefix(entityType) {
190
+ return String(entityType || 'ENTITE')
191
+ .normalize('NFKD')
192
+ .replace(/[\u0300-\u036f]/g, '')
193
+ .toUpperCase()
194
+ .replace(/[^A-Z0-9]+/g, '_')
195
+ .replace(/^_+|_+$/g, '')
196
+ .slice(0, 32) || 'ENTITE';
197
+ }
198
+
199
+ // Vocabulaire de codes et regroupement des variantes : mêmes règles que
200
+ // `convert_to_anonymization_format` et `consolidate_duplicate_entities` dans
201
+ // `scripts/convert_and_scan_pipeline.py`. Les deux chemins écrivent le même
202
+ // fichier de mapping — s'ils codaient différemment, une reconstruction depuis
203
+ // l'administration dédoublerait les entités déjà codées par le CLI.
204
+
205
+ const ENTITY_CATEGORIES = {
206
+ PERSON: 'personnes_physiques',
207
+ ORGANIZATION: 'societes',
208
+ LOCATION: 'adresses',
209
+ EMAIL: 'autres',
210
+ PHONE: 'autres',
211
+ CREDIT_CARD: 'autres',
212
+ IBAN: 'autres',
213
+ IP_ADDRESS: 'autres',
214
+ URL: 'autres',
215
+ };
216
+
217
+ function entityCategory(entityType) {
218
+ const type = String(entityType || '').toUpperCase();
219
+ return ENTITY_CATEGORIES[type] || (type.startsWith('ORGANIZATION_') ? 'societes' : 'autres');
220
+ }
221
+
222
+ /** Catégorie d'un code déjà attribué — sert à repartir des bons compteurs. */
223
+ function codeCategory(code) {
224
+ if (code.startsWith('SIREN_')) return 'siren';
225
+ if (code.startsWith('ADRESSE_') || code.startsWith('LIEU_NAISSANCE_')) return 'adresses';
226
+ if (code.includes('PERSONNE_PHYSIQUE_') || code.startsWith('DIRIGEANT_') || code.startsWith('AVOCAT_')) return 'personnes_physiques';
227
+ // Sociétés : repli/legacy (…MORALE…, SOCIETE_…) et codes à sigle (SA_1, GMBH_2).
228
+ // Testé après les familles distinctives, qui ne portent aucun sigle.
229
+ if (isSocieteCode(code)) return 'societes';
230
+ return 'autres';
231
+ }
232
+
233
+ /** Clé de compteur société (le sigle) déduite du type d'entité scanné. */
234
+ function societeCodeKey(entityType) {
235
+ const type = String(entityType || '').toUpperCase();
236
+ return type.startsWith('ORGANIZATION_')
237
+ ? (codePrefix(type.slice('ORGANIZATION_'.length)) || 'PERS_MORALE')
238
+ : 'PERS_MORALE';
239
+ }
240
+
241
+ function entityCode(entityType, category, index) {
242
+ const type = String(entityType || 'AUTRE').toUpperCase();
243
+ // Sociétés : sigle en préfixe, sans zéro (SA_1, SARL_1, PERS_MORALE_1), compteur
244
+ // par sigle. Les autres familles gardent leur padding _01.
245
+ if (category === 'societes') return `${societeCodeKey(entityType)}_${index}`;
246
+ const number = String(index).padStart(2, '0');
247
+ if (category === 'personnes_physiques') return `PERSONNE_PHYSIQUE_${number}`;
248
+ if (category === 'adresses') return `ADRESSE_${number}`;
249
+ return `${codePrefix(type)}_${number}`;
250
+ }
251
+
252
+ /** Forme comparable d'un nom : sans accents, sans civilité, en minuscules. */
253
+ function normalizeEntityName(text) {
254
+ return String(text || '')
255
+ .normalize('NFKD')
256
+ .replace(/[\u0300-\u036f]/g, '')
257
+ .toLowerCase()
258
+ .replace(/\b(mr\.?|mrs\.?|ms\.?|dr\.?|prof\.?|m\.|mme\.?|mlle\.?|maitre)\s*/g, '')
259
+ .split(/\s+/)
260
+ .filter(Boolean)
261
+ .join(' ')
262
+ .trim();
263
+ }
264
+
265
+ /** Deux écritures d'une même personne : « M. Dupont » et « Jean Dupont ». */
266
+ function areNamesSimilar(first, second) {
267
+ if (!first || !second) return false;
268
+ if (first === second) return true;
269
+ if (Math.min(first.length, second.length) >= 3 && (first.includes(second) || second.includes(first))) return true;
270
+ const tokens = [new Set(first.split(' ')), new Set(second.split(' '))];
271
+ const [shorter, longer] = tokens[0].size <= tokens[1].size ? tokens : [tokens[1], tokens[0]];
272
+ return shorter.size > 0 && [...shorter].every((token) => longer.has(token));
273
+ }
274
+
275
+ const CIVILITY_PREFIX = /^(?:(?:m|mr|mrs|ms|mme|mlle|dr|pr|prof|ma[iî]tre)\.\s*|(?:mr|mrs|ms|mme|mlle|dr|pr|prof|ma[iî]tre)\s+)/i;
276
+
277
+ function withoutCivility(text) {
278
+ return String(text || '').replace(CIVILITY_PREFIX, '').trim();
279
+ }
280
+
281
+ function expandCivilityVariants(texts) {
282
+ const expanded = [];
283
+ for (const text of texts) {
284
+ expanded.push(text);
285
+ const bare = withoutCivility(text);
286
+ if (bare && bare !== text) expanded.push(bare);
287
+ }
288
+ return [...new Set(expanded)];
289
+ }
290
+
291
+ function companyIdentity(text) {
292
+ const tokens = normalizeEntityName(text)
293
+ .split(/\s+/)
294
+ .map((token) => token.replace(/[.,'’&"()]/g, ''))
295
+ .filter(Boolean);
296
+ const base = tokens.filter((token) => !LEGAL_FORM_TOKENS.has(token.toUpperCase())).join(' ');
297
+ return { base, sigle: detectCompanySigle(text) };
298
+ }
299
+
300
+ function areCompaniesSame(first, second) {
301
+ if (!first.base || !second.base) return false;
302
+ if (first.base !== second.base) return false;
303
+ return !first.sigle || !second.sigle || first.sigle === second.sigle;
304
+ }
305
+
306
+ function groupSimilarNames(texts) {
307
+ const groups = [];
308
+ for (const text of texts) {
309
+ const normalized = normalizeEntityName(text);
310
+ const group = groups.find((candidate) => candidate.normalized.some((member) => areNamesSimilar(normalized, member)));
311
+ if (group) {
312
+ group.texts.push(text);
313
+ group.normalized.push(normalized);
314
+ } else {
315
+ groups.push({ texts: [text], normalized: [normalized] });
316
+ }
317
+ }
318
+ return groups.map((group) => group.texts);
319
+ }
320
+
321
+ function groupSameCompanies(texts) {
322
+ const groups = [];
323
+ for (const text of texts) {
324
+ const identity = companyIdentity(text);
325
+ const group = groups.find((candidate) => candidate.identities.some((member) => areCompaniesSame(identity, member)));
326
+ if (group) {
327
+ group.texts.push(text);
328
+ group.identities.push(identity);
329
+ } else {
330
+ groups.push({ texts: [text], identities: [identity] });
331
+ }
332
+ }
333
+ return groups.map((group) => group.texts);
334
+ }
335
+
336
+ function groupEntityHits(hits, category) {
337
+ const texts = [...new Set(hits.map((hit) => String(hit?.text || '').trim()).filter(Boolean))];
338
+ if (category === 'personnes_physiques') return groupSimilarNames(expandCivilityVariants(texts));
339
+ if (category === 'societes') return groupSameCompanies(texts);
340
+ return texts.map((text) => [text]);
341
+ }
342
+
343
+ /**
344
+ * Migre les anciens `*_sensitive_map.json` du dossier dans son mapping.
345
+ * Une entrée déjà présente n'est jamais réécrite : un faux positif retiré à la
346
+ * main ne doit pas revenir au scan suivant, et un code ne doit jamais servir
347
+ * deux fois. Les écritures multiples d'une même personne rejoignent le code
348
+ * déjà attribué au lieu d'en obtenir un second.
349
+ */
350
+ async function rebuildCaseMapping(caseRoot) {
351
+ const current = readCaseMapping(caseRoot);
352
+ const mapping = { ...current.mapping };
353
+ const ignored = new Set(current.ignored);
354
+ const reverse = Object.fromEntries(Object.entries(current.reverse_mapping).map(([code, list]) => [code, [...list]]));
355
+ const extracted = Object.fromEntries(
356
+ Object.entries(current.extracted_data).map(([category, codes]) => [category, { ...codes }])
357
+ );
358
+
359
+ // Compteurs amorcés sur les codes déjà attribués. Les sociétés comptent par
360
+ // sigle : la clé `societes:<sigle>` (SA, SARL, PERS_MORALE…) sépare les suites,
361
+ // pour que la 1re SA soit SA_1 et la 1re SARL SARL_1 indépendamment.
362
+ const counters = new Map();
363
+ for (const code of new Set(Object.values(mapping))) {
364
+ const match = /_(\d+)$/.exec(code);
365
+ if (!match) continue;
366
+ const category = codeCategory(code);
367
+ const key = category === 'societes' ? `societes:${societeCounterKey(code)}` : category;
368
+ counters.set(key, Math.max(counters.get(key) || 0, Number(match[1])));
369
+ }
370
+
371
+ // Index des noms déjà codés : une variante détectée plus tard rejoint son
372
+ // code d'origine plutôt que d'en créer un nouveau.
373
+ const coded = Object.entries(mapping).map(([entity, code]) => ({
374
+ normalized: normalizeEntityName(entity),
375
+ identity: companyIdentity(entity),
376
+ category: codeCategory(code),
377
+ code,
378
+ }));
379
+
380
+ let added = 0;
381
+ for (const relative of await safeCaseFiles(caseRoot)) {
382
+ if (!relative.toLowerCase().endsWith('_sensitive_map.json')) continue;
383
+ const payload = readJsonFile(path.join(caseRoot, ...relative.split('/')), null);
384
+ const entities = payload && typeof payload.entities === 'object' ? payload.entities : {};
385
+ for (const [entityType, hits] of Object.entries(entities)) {
386
+ if (!Array.isArray(hits)) continue;
387
+ const category = entityCategory(entityType);
388
+ for (const group of groupEntityHits(hits, category)) {
389
+ const texts = group.filter((text) => !ignored.has(text));
390
+ if (!texts.length) continue;
391
+
392
+ let code = texts.map((text) => mapping[text]).find(Boolean);
393
+ if (!code && category === 'personnes_physiques') {
394
+ const normalized = texts.map(normalizeEntityName);
395
+ code = coded.find((entry) => entry.category === category
396
+ && normalized.some((name) => areNamesSimilar(name, entry.normalized)))?.code;
397
+ }
398
+ if (!code && category === 'societes') {
399
+ const identities = texts.map(companyIdentity);
400
+ code = coded.find((entry) => entry.category === category
401
+ && identities.some((identity) => areCompaniesSame(identity, entry.identity)))?.code;
402
+ }
403
+ const isNewCode = !code;
404
+ if (!code) {
405
+ const key = category === 'societes' ? `societes:${societeCodeKey(entityType)}` : category;
406
+ const index = (counters.get(key) || 0) + 1;
407
+ counters.set(key, index);
408
+ code = entityCode(entityType, category, index);
409
+ }
410
+
411
+ // Valeur principale : la plus longue écriture, comme côté Python.
412
+ const principal = [...texts].sort((a, b) => b.length - a.length)[0];
413
+ for (const text of texts) {
414
+ if (mapping[text]) continue;
415
+ mapping[text] = code;
416
+ coded.push({ normalized: normalizeEntityName(text), identity: companyIdentity(text), category, code });
417
+ added += 1;
418
+ }
419
+ if (isNewCode) reverse[code] = [principal];
420
+ for (const text of texts) {
421
+ if (!reverse[code].includes(text)) reverse[code].push(text);
422
+ }
423
+
424
+ if (!extracted[category]) extracted[category] = {};
425
+ const entry = extracted[category][code] || { original: principal, code, variants: [] };
426
+ entry.variants = [...new Set([...(entry.variants || []), ...texts])];
427
+ extracted[category][code] = entry;
428
+ }
429
+ }
430
+ }
431
+
432
+ const saved = writeCaseMapping(caseRoot, {
433
+ mapping,
434
+ reverse_mapping: reverse,
435
+ extracted_data: extracted,
436
+ ignored: [...ignored],
437
+ informations_dossier: current.informations_dossier,
438
+ });
439
+ const migratedScans = await migrateLegacySensitiveMaps(caseRoot);
440
+ return { ...saved, added, total: Object.keys(saved.mapping).length, migratedScans };
441
+ }
442
+
443
+ /**
444
+ * Transfère l'état porté par les anciens sensitive maps vers le manifeste sans
445
+ * PII, puis retire ces artefacts devenus inutiles. Le mapping doit avoir été
446
+ * reconstruit avant cet appel.
447
+ */
448
+ async function migrateLegacySensitiveMaps(caseRoot) {
449
+ const safeFiles = await safeCaseFiles(caseRoot);
450
+ const legacy = safeFiles.filter((relative) => relative.toLowerCase().endsWith('_sensitive_map.json'));
451
+ if (!legacy.length) return 0;
452
+
453
+ const scannedKeys = new Set(legacy.map((relative) => {
454
+ const basename = relative.split('/').at(-1) || '';
455
+ return documentKey(basename).replace(/-sensitive-map$/, '');
456
+ }));
457
+ const originals = await listOriginals(caseRoot);
458
+ const scannedOriginals = originals
459
+ .filter((original) => scannedKeys.has(documentKey(original.name)))
460
+ .map((original) => path.join(caseRoot, ...original.path.split('/')));
461
+ if (scannedOriginals.length) markFilesAnonymized(caseRoot, scannedOriginals);
462
+
463
+ for (const relative of legacy) fs.unlinkSync(path.join(caseRoot, ...relative.split('/')));
464
+ return legacy.length;
465
+ }
466
+
467
+ // ── Travaux de conversion / anonymisation ──────────────────────────────────
468
+
469
+ const jobs = new Map();
470
+ const JOB_RETENTION_MS = 30 * 60 * 1000;
471
+
472
+ function pruneJobs() {
473
+ const now = Date.now();
474
+ for (const [id, job] of jobs) {
475
+ if (job.state !== 'running' && job.finishedAt && now - Date.parse(job.finishedAt) > JOB_RETENTION_MS) jobs.delete(id);
476
+ }
477
+ }
478
+
479
+ /** Travail rendu déjà terminé — rien à traiter, aucun processus lancé. */
480
+ function finishedJob({ case: caseName, caseRoot, action, total, files, result }) {
481
+ const now = new Date().toISOString();
482
+ return {
483
+ id: crypto.randomUUID(),
484
+ case: caseName,
485
+ caseRoot,
486
+ action,
487
+ state: 'done',
488
+ phase: 'mapping',
489
+ percent: 100,
490
+ processed: total,
491
+ total,
492
+ skipped: result?.skipped || 0,
493
+ files,
494
+ log: [],
495
+ error: null,
496
+ result,
497
+ cancelled: false,
498
+ child: null,
499
+ startedAt: now,
500
+ finishedAt: now,
501
+ };
502
+ }
503
+
504
+ /**
505
+ * Forme exposée par l'API. `caseRoot`, `child` et `reserveBytes` en sont retirés :
506
+ * ils ne servent qu'à l'ordonnancement interne, et la réponse de
507
+ * `GET /api/admin/originals/job` n'a pas à véhiculer un chemin absolu du disque du
508
+ * cabinet ni des octets de réservation. `queuePosition` est ajouté pour un job en
509
+ * file, pour que l'admin puisse afficher « N devant ».
510
+ */
511
+ function publicJob(job) {
512
+ if (!job) return null;
513
+ const {
514
+ cancelReason,
515
+ child,
516
+ completion,
517
+ processGroupId,
518
+ reserveBytes,
519
+ stopPromise,
520
+ timeoutId,
521
+ ...rest
522
+ } = job;
523
+ if (job.state === 'queued') {
524
+ const position = waiting.findIndex((entry) => entry.job.id === job.id);
525
+ rest.queuePosition = position >= 0 ? position + 1 : 1;
526
+ }
527
+ return rest;
528
+ }
529
+
530
+ function appendLog(job, line) {
531
+ const text = String(line || '').trim();
532
+ if (!text) return;
533
+ job.log.push(text);
534
+ if (job.log.length > MAX_LOG_LINES) job.log.splice(0, job.log.length - MAX_LOG_LINES);
535
+ }
536
+
537
+ /**
538
+ * Le verrou porte sur la **racine** du dossier, pas sur son nom : deux dossiers
539
+ * juridiques enregistrés distincts peuvent porter le même nom, et un
540
+ * traitement lent sur l'une bloquait alors tout traitement sur l'autre. Un job en
541
+ * file compte aussi : sinon un double-clic empilerait deux traitements du même
542
+ * dossier au lieu d'un seul.
543
+ */
544
+ function runningJobForCase(caseRoot) {
545
+ for (const job of jobs.values()) {
546
+ if (['running', 'queued'].includes(job.state) && job.caseRoot === caseRoot) return job;
547
+ }
548
+ return null;
549
+ }
550
+
551
+ function getJob(jobId) {
552
+ return publicJob(jobs.get(String(jobId || '')));
553
+ }
554
+
555
+ // ── Contrôle d'admission : sérialise GLiNER, plafonne les conversions par la RAM ─
556
+
557
+ /** Descripteurs de traitements admis mais pas encore lancés, du plus ancien au plus récent. */
558
+ const waiting = [];
559
+ let reservedBytes = 0;
560
+ let acceptingJobs = true;
561
+
562
+ function runningAnonymize() {
563
+ for (const job of jobs.values()) {
564
+ if (job.state === 'running' && job.action === 'anonymize') return true;
565
+ }
566
+ return false;
567
+ }
568
+
569
+ /**
570
+ * Un job peut-il démarrer maintenant ? Exclusivité GLiNER pour `anonymize`, puis
571
+ * budget RAM. Un job seul est toujours admis même s'il dépasse le budget, sinon
572
+ * un traitement plus gros que la moitié de la RAM ne partirait jamais.
573
+ */
574
+ function canAdmit(job) {
575
+ if (job.action === 'anonymize' && runningAnonymize()) return false;
576
+ if (reservedBytes > 0 && reservedBytes + job.reserveBytes > RAM_BUDGET_BYTES()) return false;
577
+ return true;
578
+ }
579
+
580
+ /** Admet les traitements en file qui rentrent désormais, du plus ancien au plus récent. */
581
+ function pumpQueue() {
582
+ if (!acceptingJobs) return;
583
+ for (let index = 0; index < waiting.length; index += 1) {
584
+ const descriptor = waiting[index];
585
+ if (!canAdmit(descriptor.job)) continue;
586
+ waiting.splice(index, 1);
587
+ index -= 1;
588
+ launchJob(descriptor);
589
+ }
590
+ }
591
+
592
+ /**
593
+ * Lance le script Python et suit son avancement. Seules les lignes
594
+ * `PROGRESS:PHASE:pct:courant:total` alimentent le journal ; le reste de la
595
+ * sortie est ignoré (texte de pièce potentiel), à l'exception d'un extrait de
596
+ * stderr conservé pour diagnostiquer un échec.
597
+ *
598
+ * `progressScale` reporte le pourcentage 0-100 de cet appel dans la part
599
+ * `[offset, offset + weight]` du travail global : un `runJob` qui enchaîne
600
+ * plusieurs appels (un par groupe de sortie) garde ainsi une progression
601
+ * monotone plutôt qu'un pourcentage qui repart de zéro à chaque groupe.
602
+ *
603
+ * `convert_and_scan_pipeline.py` enchaîne lui-même CONVERT (markitdown) puis
604
+ * SCAN/CHUNKS (GLiNER) au sein d'un même appel, chacun avec son propre 0-100 :
605
+ * sans repère de sous-phase, le pourcentage retomberait à zéro au passage de
606
+ * l'un à l'autre. Le poids du groupe est donc partagé entre les deux, GLiNER
607
+ * (chargement du modèle puis analyse) dominant largement markitdown en durée.
608
+ */
609
+ const CONVERT_SUBPHASE_SHARE = 0.25;
610
+
611
+ function cancellationError(job) {
612
+ return new Error(
613
+ job.cancelReason === 'timeout'
614
+ ? 'Traitement interrompu après dépassement du délai maximal.'
615
+ : 'Traitement interrompu.'
616
+ );
617
+ }
618
+
619
+ function stopRunningJob(job, reason) {
620
+ if (!job.cancelled) {
621
+ job.cancelled = true;
622
+ job.cancelReason = reason;
623
+ }
624
+ if (!job.processGroupId) return Promise.resolve();
625
+ if (!job.stopPromise) {
626
+ job.stopPromise = terminateProcessTree(job.processGroupId, {
627
+ graceMs: PROCESS_TERMINATION_GRACE_MS(),
628
+ });
629
+ }
630
+ return job.stopPromise;
631
+ }
632
+
633
+ async function verifyJobProcessTreeStopped(job, processGroupId = job.processGroupId) {
634
+ if (!processGroupId) return;
635
+ if (job.stopPromise) await job.stopPromise;
636
+ await ensureProcessTreeStopped(processGroupId, {
637
+ graceMs: PROCESS_TERMINATION_GRACE_MS(),
638
+ });
639
+ }
640
+
641
+ function spawnTracked(job, script, args, progressScale = {}) {
642
+ const offset = progressScale.offset || 0;
643
+ const weight = progressScale.weight ?? 100;
644
+ const convertWeight = weight * CONVERT_SUBPHASE_SHARE;
645
+ const scanWeight = weight - convertWeight;
646
+ return new Promise((resolve, reject) => {
647
+ if (job.cancelled) {
648
+ reject(cancellationError(job));
649
+ return;
650
+ }
651
+ if (!fs.existsSync(script)) {
652
+ reject(new Error(`Script introuvable : ${path.basename(script)}`));
653
+ return;
654
+ }
655
+ const child = spawn(PYTHON(), [script, ...args], {
656
+ cwd: SCRIPTS_DIR,
657
+ // POSIX descendants inherit this dedicated process group. It lets the
658
+ // host stop Python, GLiNER, MinerU and office converters as one unit.
659
+ detached: process.platform !== 'win32',
660
+ env: {
661
+ ...process.env,
662
+ PYTHONUNBUFFERED: '1',
663
+ // Le worker et MinerU, enfants de ce process, héritent de la variable.
664
+ PIECEMAKER_TORCH_THREADS: JOB_TORCH_THREADS(),
665
+ },
666
+ windowsHide: true,
667
+ });
668
+ job.child = child;
669
+ job.processGroupId = child.pid;
670
+ job.stopPromise = null;
671
+ // Basse priorité CPU : un scan long ne doit pas figer la machine. Les enfants
672
+ // (worker GLiNER, MinerU) héritent du nice sous POSIX. Best-effort — un échec
673
+ // (droits, plateforme) ne doit jamais empêcher le traitement.
674
+ try {
675
+ os.setPriority(child.pid, JOB_NICE());
676
+ } catch {
677
+ // priorité inchangée, sans conséquence sur le résultat
678
+ }
679
+ const errorLines = [];
680
+ let stdoutRest = '';
681
+ let stderrRest = '';
682
+
683
+ const consumeStdout = (chunk) => {
684
+ stdoutRest += chunk;
685
+ const lines = stdoutRest.split(/\r?\n/);
686
+ stdoutRest = lines.pop() || '';
687
+ for (const line of lines) {
688
+ const progress = /^PROGRESS:([A-Z]+):(\d+):(\d+):(\d+)/.exec(line.trim());
689
+ if (!progress) continue;
690
+ const [, marker, pct, current, total] = progress;
691
+ // CONVERT : fichier par fichier. SCAN : fichier par fichier de la phase PII.
692
+ // CHUNKS : progression *à l'intérieur* d'un scan (réémise par le pipeline
693
+ // depuis le worker) — c'est elle qui fait vivre la barre pendant les longues
694
+ // minutes d'un gros document, là où SCAN restait figé sur « 1/1 ».
695
+ job.phase = marker === 'CONVERT' ? 'convert' : 'scan';
696
+ const subPct = Math.min(100, Number(pct) || 0);
697
+ job.percent = job.phase === 'convert'
698
+ ? Math.min(100, offset + (subPct * convertWeight) / 100)
699
+ : Math.min(100, offset + convertWeight + (subPct * scanWeight) / 100);
700
+ job.processed = Number(current) || 0;
701
+ job.total = Number(total) || job.total;
702
+ const unit = marker === 'CHUNKS' ? ' segments' : '';
703
+ appendLog(job, `${job.phase === 'scan' ? 'Analyse PII' : 'Conversion'} ${job.processed}/${job.total}${unit}`);
704
+ }
705
+ };
706
+ const consumeStderr = (chunk) => {
707
+ stderrRest += chunk;
708
+ const lines = stderrRest.split(/\r?\n/);
709
+ stderrRest = lines.pop() || '';
710
+ for (const line of lines) {
711
+ const text = line.trim();
712
+ if (!text) continue;
713
+ errorLines.push(text);
714
+ if (errorLines.length > MAX_ERROR_LINES) errorLines.shift();
715
+ }
716
+ };
717
+
718
+ child.stdout.setEncoding('utf8');
719
+ child.stderr.setEncoding('utf8');
720
+ child.stdout.on('data', consumeStdout);
721
+ child.stderr.on('data', consumeStderr);
722
+ let settled = false;
723
+ const finish = async (code, signal, spawnError = null) => {
724
+ if (settled) return;
725
+ settled = true;
726
+ const processGroupId = job.processGroupId;
727
+ try {
728
+ await verifyJobProcessTreeStopped(job, processGroupId);
729
+ if (spawnError) throw spawnError;
730
+ if (job.cancelled) throw cancellationError(job);
731
+ if (code !== 0) {
732
+ const detail = errorLines.slice(-3).join(' · ');
733
+ throw new Error(`${path.basename(script)} a échoué (${signal || `code ${code}`})${detail ? ` : ${detail}` : ''}`);
734
+ }
735
+ resolve();
736
+ } catch (error) {
737
+ reject(error);
738
+ } finally {
739
+ if (job.child === child) job.child = null;
740
+ if (job.processGroupId === processGroupId) job.processGroupId = null;
741
+ job.stopPromise = null;
742
+ }
743
+ };
744
+
745
+ // `exit` fires when the direct Python process ends. Waiting only for
746
+ // `close` can hang forever when an orphan still owns an inherited pipe.
747
+ child.once('error', (error) => void finish(null, null, error));
748
+ child.once('exit', (code, signal) => void finish(code, signal));
749
+ });
750
+ }
751
+
752
+ /**
753
+ * Migration « au prochain traitement », rattachée aux pièces du lot : range dans
754
+ * le dossier de conversion métier le Markdown que d'anciennes versions ont laissé à la racine
755
+ * pour une pièce effectivement (re)traitée. Le rattachement au lot est délibéré —
756
+ * comme `sessionArtifactPaths` — pour ne jamais déplacer un document de travail
757
+ * de l'utilisateur ni un fichier modifié en parallèle. Retourne les chemins
758
+ * racine retirés (POSIX) : le commit du lot les enregistre comme suppressions,
759
+ * sinon la relocalisation resterait un changement en attente.
760
+ *
761
+ * Le mapping n'est **pas** relocalisé ici : sa consolidation reste l'apanage du
762
+ * chemin de succès (`writeCaseMapping`), qui lit les copies racine puis les
763
+ * supprime. Un scan en échec ne doit pas migrer prématurément un ancien mapping.
764
+ */
765
+ function outputDirectoryForOriginal(caseRoot, absoluteFile) {
766
+ const relative = path.relative(caseRoot, absoluteFile).split(path.sep).join('/');
767
+ return caseConversionOutputDirectory(caseRoot, relative)
768
+ || path.join(caseRoot, WORKSPACE_SUBDIR);
769
+ }
770
+
771
+ function migrateRootArtifacts(caseRoot, absoluteFiles) {
772
+ const sourceByKey = new Map(absoluteFiles.map((file) => [documentKey(file), file]));
773
+ if (!sourceByKey.size) return [];
774
+ let entries;
775
+ try {
776
+ entries = fs.readdirSync(caseRoot, { withFileTypes: true });
777
+ } catch {
778
+ return [];
779
+ }
780
+ const toMove = entries.filter((entry) =>
781
+ entry.isFile()
782
+ && path.extname(entry.name).toLowerCase() === '.md'
783
+ && sourceByKey.has(documentKey(entry.name)));
784
+ if (!toMove.length) return [];
785
+ const removed = [];
786
+ for (const entry of toMove) {
787
+ const source = path.join(caseRoot, entry.name);
788
+ const outputDirectory = outputDirectoryForOriginal(caseRoot, sourceByKey.get(documentKey(entry.name)));
789
+ fs.mkdirSync(outputDirectory, { recursive: true });
790
+ const destination = path.join(outputDirectory, entry.name);
791
+ // Le sous-dossier fait autorité : un doublon plus récent y gagne, on se
792
+ // contente d'écarter la copie racine périmée.
793
+ if (fs.existsSync(destination)) fs.rmSync(source, { force: true });
794
+ else fs.renameSync(source, destination);
795
+ removed.push(entry.name);
796
+ }
797
+ return removed;
798
+ }
799
+
800
+ async function runJob(job, legalCase, absoluteFiles, options) {
801
+ job.migratedFromRoot = migrateRootArtifacts(legalCase.root, absoluteFiles);
802
+ if (job.cancelled) throw cancellationError(job);
803
+ if (job.action === 'convert') {
804
+ // `smart_converter.py` ne prend qu'un fichier : on avance dossier par
805
+ // dossier pour garder une progression lisible même sans ligne PROGRESS.
806
+ job.phase = 'convert';
807
+ for (const [index, absolute] of absoluteFiles.entries()) {
808
+ if (job.cancelled) throw cancellationError(job);
809
+ job.processed = index;
810
+ job.percent = Math.round((index / absoluteFiles.length) * 100);
811
+ const outputDirectory = outputDirectoryForOriginal(legalCase.root, absolute);
812
+ fs.mkdirSync(outputDirectory, { recursive: true });
813
+ const args = [absolute, '-o', outputDirectory];
814
+ if (options.engine) args.push('--engine', options.engine);
815
+ if (options.mode) args.push('--mode', options.mode);
816
+ if (options.lang) args.push('--lang', options.lang);
817
+ await spawnTracked(job, CONVERTER_SCRIPT(), args);
818
+ markFilesConverted(legalCase.root, [absolute]);
819
+ job.processed = index + 1;
820
+ job.percent = Math.round(((index + 1) / absoluteFiles.length) * 100);
821
+ appendLog(job, `Conversion ${job.processed}/${absoluteFiles.length}`);
822
+ }
823
+ return { converted: absoluteFiles.length };
824
+ }
825
+
826
+ const before = readCaseMapping(legalCase.root);
827
+ const mappingFile = caseMappingFile(legalCase.root);
828
+
829
+ // `--state-file` découple le statut « analysé » du contenu sensible ; les
830
+ // cartes brutes restent temporaires et ne sont jamais déposées ici.
831
+ // Le script n'accepte qu'un répertoire de sortie. On regroupe donc les
832
+ // pièces par répertoire de sortie (zones métier et sous-dossier de travail
833
+ // générique confondus).
834
+ const groups = new Map();
835
+ for (const absolute of absoluteFiles) {
836
+ const outputDirectory = outputDirectoryForOriginal(legalCase.root, absolute);
837
+ if (!groups.has(outputDirectory)) groups.set(outputDirectory, []);
838
+ groups.get(outputDirectory).push(absolute);
839
+ }
840
+ // Chaque groupe ne rapporte qu'une part de `job.percent`, proportionnelle
841
+ // à sa part du nombre total de fichiers du lot : sans quoi la barre
842
+ // repartirait de zéro à chaque nouveau groupe.
843
+ let filesDone = 0;
844
+ for (const [outputDirectory, groupFiles] of groups) {
845
+ if (job.cancelled) throw cancellationError(job);
846
+ fs.mkdirSync(outputDirectory, { recursive: true });
847
+ const args = [...groupFiles, '-o', outputDirectory, '--mapping-file', mappingFile];
848
+ // `--case-root` découple la clé du manifeste de `--output` : les pièces
849
+ // vivent sous le dossier juridique, pas sous le sous-dossier de sortie.
850
+ args.push('--case-root', legalCase.root);
851
+ args.push('--state-file', path.join(legalCase.root, '.piecemaker', 'anonymization-state.json'));
852
+ if (options.skipExisting) args.push('--skip-existing');
853
+ if (options.engine) args.push('--engine', options.engine);
854
+ if (options.mode) args.push('--mode', options.mode);
855
+ if (options.lang) args.push('--lang', options.lang);
856
+ const offset = absoluteFiles.length ? (filesDone / absoluteFiles.length) * 100 : 0;
857
+ const weight = absoluteFiles.length ? (groupFiles.length / absoluteFiles.length) * 100 : 100;
858
+ await spawnTracked(job, PIPELINE_SCRIPT(), args, { offset, weight });
859
+ filesDone += groupFiles.length;
860
+ }
861
+ job.phase = 'mapping';
862
+ job.percent = 100;
863
+ // Migration unique des dossiers créés par les anciennes versions : leurs
864
+ // scans sont absorbés dans le mapping et leur état technique avant suppression.
865
+ const mapping = await rebuildCaseMapping(legalCase.root);
866
+ const mappingAdded = Math.max(0, mapping.total - Object.keys(before.mapping).length);
867
+ appendLog(job, `Mapping : ${mappingAdded} nouvelle(s) entrée(s), ${mapping.total} au total`);
868
+ if (mapping.migratedScans) appendLog(job, `${mapping.migratedScans} ancien(s) sensitive map migré(s)`);
869
+ return { scanned: absoluteFiles.length, mappingAdded, mappingTotal: mapping.total };
870
+ }
871
+
872
+ /**
873
+ * Chemins produits par le lot courant. Le filtre est volontairement rattaché
874
+ * aux pièces sélectionnées : un autre fichier Markdown/JSON modifié pendant un
875
+ * OCR long ne doit jamais entrer dans le commit de cette session.
876
+ */
877
+ async function sessionArtifactPaths(legalCase, absoluteFiles, action) {
878
+ const documentKeys = new Set(absoluteFiles.map((file) => documentKey(file)));
879
+ const mappingPath = path.relative(legalCase.root, caseMappingFile(legalCase.root)).split(path.sep).join('/');
880
+ const safeFiles = await safeCaseFiles(legalCase.root);
881
+ return safeFiles.filter((relative) => {
882
+ if (action === 'anonymize' && relative === mappingPath) return true;
883
+ const segments = relative.split('/');
884
+ const basename = segments.at(-1) || '';
885
+ const extension = path.extname(basename).toLowerCase();
886
+ const insideDocumentOutput = segments.slice(0, -1).some((segment) => documentKeys.has(documentKey(segment)));
887
+ if (insideDocumentOutput) return true;
888
+ if (extension === '.md') return documentKeys.has(documentKey(basename));
889
+ return false;
890
+ });
891
+ }
892
+
893
+ async function commitJobArtifacts(job, legalCase, absoluteFiles, homeDir) {
894
+ if (!homeDir) return null;
895
+ const artifactPaths = await sessionArtifactPaths(legalCase, absoluteFiles, job.action);
896
+ // Les Markdown relocalisés depuis la racine rejoignent le commit du lot pour
897
+ // que leur suppression à l'ancien emplacement y soit enregistrée proprement.
898
+ const paths = [...new Set([...artifactPaths, ...(job.migratedFromRoot || [])])];
899
+ if (!paths.length) throw new Error('Traitement terminé, mais aucun fichier produit ne peut être commité.');
900
+ job.phase = 'commit';
901
+ appendLog(job, `Commit automatique de ${paths.length} fichier(s)`);
902
+ const count = absoluteFiles.length;
903
+ const commit = await createCommit({
904
+ casesRoot: legalCase.casesRoot,
905
+ caseName: legalCase.name,
906
+ homeDir,
907
+ label: job.action === 'convert'
908
+ ? `Conversion de ${count} pièce${count > 1 ? 's' : ''}`
909
+ : `Conversion et analyse PII de ${count} pièce${count > 1 ? 's' : ''}`,
910
+ sessionId: job.id,
911
+ event: job.action === 'convert' ? 'admin-conversion' : 'admin-scan',
912
+ paths,
913
+ waitForLockMs: 10_000,
914
+ });
915
+ if (commit.skipped === 'busy') throw new Error('Traitement terminé, mais l’historique est occupé : commit automatique non créé.');
916
+ return {
917
+ created: commit.created,
918
+ hash: commit.commit || null,
919
+ files: commit.files || [],
920
+ };
921
+ }
922
+
923
+ /**
924
+ * Démarre un travail sur les pièces d'un dossier.
925
+ * `action` vaut `convert` (Markdown seul) ou `anonymize` (Markdown + scan PII
926
+ * + régénération du mapping). `files` contient des chemins relatifs au dossier
927
+ * juridique, tels que renvoyés par `listOriginals`.
928
+ */
929
+ async function startOriginalsJob({ casesRoot, caseName, action, files = [], options = {}, homeDir = null } = {}) {
930
+ if (!['convert', 'anonymize'].includes(action)) throw new Error('Action inconnue sur les pièces originales.');
931
+ if (!acceptingJobs) throw new Error('Le serveur est en cours d’arrêt : aucun nouveau traitement ne peut démarrer.');
932
+ const legalCase = resolveCase(casesRoot, caseName);
933
+ const busy = runningJobForCase(legalCase.root);
934
+ if (busy) throw new Error('Un traitement est déjà en cours sur ce dossier.');
935
+
936
+ const originals = await listOriginals(legalCase.root);
937
+ const wanted = new Set(files.map((file) => String(file || '').replaceAll('\\', '/')));
938
+ // Les ressources sont volontairement hors périmètre : accessibles à l'IA telles
939
+ // quelles, elles ne sont ni converties ni scannées. On les écarte même si elles
940
+ // sont explicitement cochées, pour que le drapeau reste la seule vérité.
941
+ const selected = (wanted.size ? originals.filter((file) => wanted.has(file.path)) : originals)
942
+ .filter((file) => !file.resource);
943
+ if (!selected.length) {
944
+ throw new Error('Aucune pièce à traiter dans ce dossier.');
945
+ }
946
+
947
+ // Sans sélection, le travail porte sur tout le dossier et ne refait que ce
948
+ // qui manque : le modèle GLiNER ne se charge pas si tout est déjà scanné.
949
+ // Cocher des pièces vaut demande explicite de les retraiter.
950
+ const forced = wanted.size > 0 || options.force === true;
951
+ const pending = forced
952
+ ? selected
953
+ : selected.filter((file) => (action === 'convert' ? !file.converted : !(file.converted && file.scanned)));
954
+ const skipped = selected.length - pending.length;
955
+
956
+ pruneJobs();
957
+ if (!pending.length) {
958
+ // Rien à faire : on rend un travail déjà terminé plutôt qu'une erreur, pour
959
+ // que l'administration affiche « à jour » et non un échec.
960
+ const job = finishedJob({
961
+ case: legalCase.name,
962
+ caseRoot: legalCase.root,
963
+ action,
964
+ total: 0,
965
+ files: [],
966
+ result: { converted: 0, scanned: 0, skipped, upToDate: true },
967
+ });
968
+ jobs.set(job.id, job);
969
+ return publicJob(job);
970
+ }
971
+
972
+ // Les chemins sont relatifs au dossier juridique lui-même : les pièces ne
973
+ // vivent plus dans un sous-dossier dédié, elles sont là où le cabinet les a
974
+ // rangées, racine et sous-dossiers confondus.
975
+ const absoluteFiles = pending.map((file) => {
976
+ const absolute = path.resolve(legalCase.root, ...file.path.split('/'));
977
+ if (!absolute.startsWith(`${legalCase.root}${path.sep}`)) {
978
+ throw new Error('Pièce hors du dossier juridique.');
979
+ }
980
+ if (!fs.existsSync(absolute)) throw new Error(`Pièce introuvable : ${file.name}`);
981
+ return absolute;
982
+ });
983
+
984
+ const job = {
985
+ id: crypto.randomUUID(),
986
+ case: legalCase.name,
987
+ caseRoot: legalCase.root,
988
+ action,
989
+ state: 'queued',
990
+ phase: 'convert',
991
+ percent: 0,
992
+ processed: 0,
993
+ total: pending.length,
994
+ skipped,
995
+ files: pending.map((file) => file.path),
996
+ reserveBytes: JOB_RESERVE_BYTES(action),
997
+ log: [],
998
+ error: null,
999
+ result: null,
1000
+ cancelled: false,
1001
+ cancelReason: null,
1002
+ child: null,
1003
+ completion: null,
1004
+ processGroupId: null,
1005
+ stopPromise: null,
1006
+ timeoutId: null,
1007
+ queuedAt: new Date().toISOString(),
1008
+ startedAt: null,
1009
+ finishedAt: null,
1010
+ };
1011
+
1012
+ // Le descripteur porte tout ce dont `launchJob` a besoin, qu'il démarre
1013
+ // maintenant ou plus tard depuis la file.
1014
+ return admitOrQueue({ job, legalCase, absoluteFiles, options, homeDir, skipped, forced });
1015
+ }
1016
+
1017
+ /** Démarre le traitement maintenant s'il rentre, sinon le met en file d'attente. */
1018
+ function admitOrQueue(descriptor) {
1019
+ const { job } = descriptor;
1020
+ jobs.set(job.id, job);
1021
+ if (canAdmit(job)) {
1022
+ launchJob(descriptor);
1023
+ } else {
1024
+ job.state = 'queued';
1025
+ waiting.push(descriptor);
1026
+ }
1027
+ return publicJob(job);
1028
+ }
1029
+
1030
+ /**
1031
+ * Lance réellement le traitement : réserve sa RAM, exécute le script Python, puis
1032
+ * — quoi qu'il arrive — libère la réservation et relance la file. Le bloc
1033
+ * `finally` est le seul endroit qui rend une place : un traitement qui échoue
1034
+ * ne doit pas bloquer la file pour autant.
1035
+ */
1036
+ function launchJob(descriptor) {
1037
+ const { job, legalCase, absoluteFiles, options, homeDir, skipped, forced } = descriptor;
1038
+ job.state = 'running';
1039
+ job.startedAt = new Date().toISOString();
1040
+ reservedBytes += job.reserveBytes;
1041
+ job.timeoutId = setTimeout(() => {
1042
+ void stopRunningJob(job, 'timeout').catch((error) => {
1043
+ appendLog(job, `Nettoyage après délai dépassé : ${error.message}`);
1044
+ });
1045
+ }, JOB_TIMEOUT_MS());
1046
+
1047
+ job.completion = (async () => {
1048
+ try {
1049
+ const result = await runJob(job, legalCase, absoluteFiles, { ...options, skipExisting: !forced });
1050
+ if (job.cancelled) throw cancellationError(job);
1051
+ const commit = await commitJobArtifacts(job, legalCase, absoluteFiles, homeDir);
1052
+ if (job.cancelled) throw cancellationError(job);
1053
+ job.state = 'done';
1054
+ job.percent = 100;
1055
+ job.processed = job.total;
1056
+ job.result = { ...result, skipped, commit };
1057
+ } catch (error) {
1058
+ job.state = 'error';
1059
+ job.error = error.message;
1060
+ } finally {
1061
+ clearTimeout(job.timeoutId);
1062
+ job.timeoutId = null;
1063
+ const processGroupId = job.processGroupId;
1064
+ try {
1065
+ await verifyJobProcessTreeStopped(job, processGroupId);
1066
+ } catch (error) {
1067
+ job.state = 'error';
1068
+ job.error = `Nettoyage incomplet du pipeline : ${error.message}`;
1069
+ }
1070
+ job.child = null;
1071
+ job.processGroupId = null;
1072
+ job.stopPromise = null;
1073
+ job.finishedAt = new Date().toISOString();
1074
+ reservedBytes -= job.reserveBytes;
1075
+ pumpQueue();
1076
+ }
1077
+ })();
1078
+ }
1079
+
1080
+ let stopAllPromise = null;
1081
+
1082
+ /**
1083
+ * Arrêt serveur : ferme l'admission, annule toute la file, tue chaque groupe
1084
+ * actif et attend le `finally` de chaque job avant de rendre la main.
1085
+ */
1086
+ function stopOriginalsJobs() {
1087
+ if (stopAllPromise) return stopAllPromise;
1088
+ acceptingJobs = false;
1089
+
1090
+ stopAllPromise = (async () => {
1091
+ for (const descriptor of waiting.splice(0)) {
1092
+ const { job } = descriptor;
1093
+ job.cancelled = true;
1094
+ job.cancelReason = 'server-shutdown';
1095
+ job.state = 'error';
1096
+ job.error = 'Traitement interrompu par l’arrêt du serveur.';
1097
+ job.finishedAt = new Date().toISOString();
1098
+ }
1099
+
1100
+ const running = [...jobs.values()].filter((job) => job.state === 'running');
1101
+ const groups = [...new Set(running.map((job) => job.processGroupId).filter(Boolean))];
1102
+ await Promise.allSettled(running.map((job) => stopRunningJob(job, 'server-shutdown')));
1103
+ await Promise.allSettled(running.map((job) => job.completion).filter(Boolean));
1104
+
1105
+ // Contrôle défensif final, y compris si un enfant a fermé ses pipes avant
1106
+ // que son événement `exit` ait été traité par le suivi normal du job.
1107
+ await Promise.all(groups.map((processGroupId) => ensureProcessTreeStopped(processGroupId, {
1108
+ graceMs: PROCESS_TERMINATION_GRACE_MS(),
1109
+ })));
1110
+ })();
1111
+ return stopAllPromise;
1112
+ }
1113
+
1114
+ function cancelOriginalsJob(jobId) {
1115
+ const job = jobs.get(String(jobId || ''));
1116
+ if (!job) return null;
1117
+ // Un job encore en file n'a pas de process : on le retire de la file et on
1118
+ // laisse la place au suivant.
1119
+ if (job.state === 'queued') {
1120
+ const index = waiting.findIndex((entry) => entry.job.id === job.id);
1121
+ if (index >= 0) waiting.splice(index, 1);
1122
+ job.state = 'error';
1123
+ job.error = 'Traitement interrompu.';
1124
+ job.finishedAt = new Date().toISOString();
1125
+ pumpQueue();
1126
+ return publicJob(job);
1127
+ }
1128
+ if (job.state !== 'running') return null;
1129
+ void stopRunningJob(job, 'user-cancellation').catch((error) => {
1130
+ appendLog(job, `Nettoyage après annulation : ${error.message}`);
1131
+ });
1132
+ return publicJob(job);
1133
+ }
1134
+
1135
+ module.exports = {
1136
+ cancelOriginalsJob,
1137
+ groupEntityHits,
1138
+ stopOriginalsJobs,
1139
+ // Ré-exportés pour les routes de l'administration : l'implémentation vit
1140
+ // désormais dans `piecemaker-plugin/scripts/lib/mapping.cjs`.
1141
+ caseMappingFile,
1142
+ getJob,
1143
+ listOriginals,
1144
+ readCaseMapping,
1145
+ rebuildCaseMapping,
1146
+ saveCaseMapping,
1147
+ sessionArtifactPaths,
1148
+ startOriginalsJob,
1149
+ writeCaseMapping,
1150
+ };