@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.
- package/LICENSE +718 -0
- package/README.md +79 -0
- package/dist/Mistral-Icon-Gradient-RGB.svg +12 -0
- package/dist/api-docs.html +901 -0
- package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/assets/abnfDiagram-VCTEODGH-DF7LFtT-.js +1 -0
- package/dist/assets/arc-xOmjWeVH.js +1 -0
- package/dist/assets/architectureDiagram-5GKGNRK7-CESzNPwa.js +36 -0
- package/dist/assets/blockDiagram-I7D4REHJ-BjdN78Ad.js +129 -0
- package/dist/assets/c4Diagram-7LVT6UL2-BcK9EDWT.js +38 -0
- package/dist/assets/channel-Dz3eE5vU.js +1 -0
- package/dist/assets/chunk-2Q5K7J3B-DGUN1JFP.js +1 -0
- package/dist/assets/chunk-5VM5RSS4-BG3BBcFr.js +15 -0
- package/dist/assets/chunk-F27PBJKO-CLIOfrF5.js +1 -0
- package/dist/assets/chunk-IMKFNOWR-D6lGkqij.js +231 -0
- package/dist/assets/chunk-JWPE2WC7-BmF9vLBT.js +1 -0
- package/dist/assets/chunk-POPQ4Y6H-C_0SR3ak.js +1 -0
- package/dist/assets/chunk-SVP7TREG-rT20Wfpp.js +88 -0
- package/dist/assets/chunk-TICWLB2K-Cn2hkmcf.js +206 -0
- package/dist/assets/chunk-XXDRQBXY-Dm_eP1_v.js +1 -0
- package/dist/assets/classDiagram-ZZMXUADV-BC1eKV2j.js +1 -0
- package/dist/assets/classDiagram-v2-VYDZK3BY-BC1eKV2j.js +1 -0
- package/dist/assets/cose-bilkent-JH36ORCC-cJeeJsep.js +1 -0
- package/dist/assets/cynefin-OW5HDTMX-DX2ePIXe.js +166 -0
- package/dist/assets/cynefinDiagram-5FMLGOSQ-BvWXN-RR.js +62 -0
- package/dist/assets/cytoscape.esm-BB4DxJjf.js +321 -0
- package/dist/assets/dagre-GXQ25YYZ-CkwPRhGR.js +4 -0
- package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/assets/diagram-S7CK7UJ4-CBGNzYyv.js +30 -0
- package/dist/assets/diagram-UQ7AKVKN-CiwCU0SJ.js +41 -0
- package/dist/assets/diagram-VSXAHHWV-Aekg4nTk.js +3 -0
- package/dist/assets/diagram-VX7I27RA-DPFP5K7r.js +24 -0
- package/dist/assets/diagram-Z3DM3KII-BHJkxoey.js +24 -0
- package/dist/assets/ebnfDiagram-PWID7BFC-2rV1P32T.js +1 -0
- package/dist/assets/erDiagram-RLTQ6QDP-C4BjyS_H.js +99 -0
- package/dist/assets/flowDiagram-HODETNUW-DL1TBlAG.js +168 -0
- package/dist/assets/ganttDiagram-EL5Y4UJY-MKjvzCWz.js +292 -0
- package/dist/assets/gitGraphDiagram-WWUBYQGX-CS_oTGK5.js +106 -0
- package/dist/assets/index-DhwJpHCq.css +1 -0
- package/dist/assets/index-XOGQDqU3.js +3993 -0
- package/dist/assets/infoDiagram-27XIBGKW-ihUr2GjN.js +2 -0
- package/dist/assets/init-Gi6I4Gst.js +1 -0
- package/dist/assets/ishikawaDiagram-5VMMS53U-D2YAnuir.js +70 -0
- package/dist/assets/journeyDiagram-3NMN7TZE-Bc2hSZGD.js +139 -0
- package/dist/assets/kanban-definition-UXKFOSKX-LRMGNonX.js +89 -0
- package/dist/assets/layout-CcfWOlPV.js +1 -0
- package/dist/assets/linear-7JoS2gQO.js +1 -0
- package/dist/assets/mermaid.core-ijh_SsuN.js +308 -0
- package/dist/assets/mindmap-definition-YA3MSWOX-DCE4nzfF.js +96 -0
- package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/assets/pegDiagram-XKGWAZYB-SjaGa7lE.js +1 -0
- package/dist/assets/pieDiagram-E7YTZNPT-1xcRidSZ.js +39 -0
- package/dist/assets/quadrantDiagram-AXDQQJYC-obHAHnYV.js +7 -0
- package/dist/assets/railroadDiagram-O6MQD6OU-BsCVcRZb.js +1 -0
- package/dist/assets/requirementDiagram-BXWQKSXE-CUNkhvqb.js +84 -0
- package/dist/assets/sankeyDiagram-P5KCCOFB-DhezXMKm.js +40 -0
- package/dist/assets/sequenceDiagram-WJ2MYXX4-CL9VswXH.js +162 -0
- package/dist/assets/server.browser-BzI1jrZw.js +11 -0
- package/dist/assets/sizeCapture-INFHLROL-t0g9jiEz.js +1 -0
- package/dist/assets/stateDiagram-D77RDMKH-BW-g-IOz.js +1 -0
- package/dist/assets/stateDiagram-v2-MP3YSRHH-BXuT4zDG.js +1 -0
- package/dist/assets/swimlanes-42K2YHIH-LsuyeBte.js +1 -0
- package/dist/assets/swimlanesDiagram-VR7AAH4N-B0eYrB4U.js +8 -0
- package/dist/assets/timeline-definition-24CTP7MA-B0cFka1R.js +120 -0
- package/dist/assets/vendor-codemirror-C5qqu4R7.js +33 -0
- package/dist/assets/vendor-react-D809iwXR.js +8 -0
- package/dist/assets/vendor-xterm-BWUgpGtR.js +66 -0
- package/dist/assets/vennDiagram-4TSXK5OY-D3HNCDR3.js +34 -0
- package/dist/assets/wardleyDiagram-VM6X3IG4-DJ3Co8nb.js +78 -0
- package/dist/assets/xychartDiagram-S5SC5T6Z-Cz5E9New.js +7 -0
- package/dist/clear-cache.html +85 -0
- package/dist/convert-icons.md +53 -0
- package/dist/favicon.png +0 -0
- package/dist/favicon.svg +9 -0
- package/dist/generate-icons.js +49 -0
- package/dist/icons/claude-ai-icon.svg +1 -0
- package/dist/icons/codex-white.svg +3 -0
- package/dist/icons/codex.svg +3 -0
- package/dist/icons/cursor-white.svg +12 -0
- package/dist/icons/cursor.svg +1 -0
- package/dist/icons/icon-128x128.png +0 -0
- package/dist/icons/icon-128x128.svg +12 -0
- package/dist/icons/icon-144x144.png +0 -0
- package/dist/icons/icon-144x144.svg +12 -0
- package/dist/icons/icon-152x152.png +0 -0
- package/dist/icons/icon-152x152.svg +12 -0
- package/dist/icons/icon-192x192.png +0 -0
- package/dist/icons/icon-192x192.svg +12 -0
- package/dist/icons/icon-384x384.png +0 -0
- package/dist/icons/icon-384x384.svg +12 -0
- package/dist/icons/icon-512x512.png +0 -0
- package/dist/icons/icon-512x512.svg +12 -0
- package/dist/icons/icon-72x72.png +0 -0
- package/dist/icons/icon-72x72.svg +12 -0
- package/dist/icons/icon-96x96.png +0 -0
- package/dist/icons/icon-96x96.svg +12 -0
- package/dist/icons/icon-template.svg +12 -0
- package/dist/index.html +60 -0
- package/dist/logo-128.png +0 -0
- package/dist/logo-256.png +0 -0
- package/dist/logo-32.png +0 -0
- package/dist/logo-512.png +0 -0
- package/dist/logo-64.png +0 -0
- package/dist/logo.svg +17 -0
- package/dist/manifest.json +61 -0
- package/dist/screenshots/cli-selection.png +0 -0
- package/dist/screenshots/desktop-main.png +0 -0
- package/dist/screenshots/mobile-chat.png +0 -0
- package/dist/screenshots/tools-modal.png +0 -0
- package/dist/sw.js +125 -0
- package/dist-server/plugins/piecemaker-dossier/src/knowledge.js +272 -0
- package/dist-server/plugins/piecemaker-dossier/src/knowledge.js.map +1 -0
- package/dist-server/plugins/piecemaker-dossier/src/scan-result.js +160 -0
- package/dist-server/plugins/piecemaker-dossier/src/scan-result.js.map +1 -0
- package/dist-server/plugins/piecemaker-dossier/src/types.js +3 -0
- package/dist-server/plugins/piecemaker-dossier/src/types.js.map +1 -0
- package/dist-server/server/index.js +345 -0
- package/dist-server/server/index.js.map +1 -0
- package/dist-server/server/load-env.js +46 -0
- package/dist-server/server/load-env.js.map +1 -0
- package/dist-server/server/modules/agent/agent.module.js +38 -0
- package/dist-server/server/modules/agent/agent.module.js.map +1 -0
- package/dist-server/server/modules/agent/agent.routes.js +1161 -0
- package/dist-server/server/modules/agent/agent.routes.js.map +1 -0
- package/dist-server/server/modules/agent/index.js +3 -0
- package/dist-server/server/modules/agent/index.js.map +1 -0
- package/dist-server/server/modules/agent/tests/agent.routes.test.js +205 -0
- package/dist-server/server/modules/agent/tests/agent.routes.test.js.map +1 -0
- package/dist-server/server/modules/assets/assets.routes.js +130 -0
- package/dist-server/server/modules/assets/assets.routes.js.map +1 -0
- package/dist-server/server/modules/assets/index.js +4 -0
- package/dist-server/server/modules/assets/index.js.map +1 -0
- package/dist-server/server/modules/assets/services/image-assets.service.js +95 -0
- package/dist-server/server/modules/assets/services/image-assets.service.js.map +1 -0
- package/dist-server/server/modules/assets/tests/image-assets.service.test.js +56 -0
- package/dist-server/server/modules/assets/tests/image-assets.service.test.js.map +1 -0
- package/dist-server/server/modules/auth/auth.middleware.js +133 -0
- package/dist-server/server/modules/auth/auth.middleware.js.map +1 -0
- package/dist-server/server/modules/auth/auth.module.js +29 -0
- package/dist-server/server/modules/auth/auth.module.js.map +1 -0
- package/dist-server/server/modules/auth/auth.routes.js +45 -0
- package/dist-server/server/modules/auth/auth.routes.js.map +1 -0
- package/dist-server/server/modules/auth/auth.service.js +113 -0
- package/dist-server/server/modules/auth/auth.service.js.map +1 -0
- package/dist-server/server/modules/auth/index.js +9 -0
- package/dist-server/server/modules/auth/index.js.map +1 -0
- package/dist-server/server/modules/auth/tests/auth.service.test.js +80 -0
- package/dist-server/server/modules/auth/tests/auth.service.test.js.map +1 -0
- package/dist-server/server/modules/browser-use/browser-use-mcp.js +352 -0
- package/dist-server/server/modules/browser-use/browser-use-mcp.js.map +1 -0
- package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js +107 -0
- package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js.map +1 -0
- package/dist-server/server/modules/browser-use/browser-use-runtime.js +10 -0
- package/dist-server/server/modules/browser-use/browser-use-runtime.js.map +1 -0
- package/dist-server/server/modules/browser-use/browser-use.routes.js +99 -0
- package/dist-server/server/modules/browser-use/browser-use.routes.js.map +1 -0
- package/dist-server/server/modules/browser-use/browser-use.service.js +686 -0
- package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -0
- package/dist-server/server/modules/browser-use/index.js +11 -0
- package/dist-server/server/modules/browser-use/index.js.map +1 -0
- package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js +8 -0
- package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js.map +1 -0
- package/dist-server/server/modules/cli/cli.js +17 -0
- package/dist-server/server/modules/cli/cli.js.map +1 -0
- package/dist-server/server/modules/cli/cli.module.js +93 -0
- package/dist-server/server/modules/cli/cli.module.js.map +1 -0
- package/dist-server/server/modules/cli/cli.service.js +230 -0
- package/dist-server/server/modules/cli/cli.service.js.map +1 -0
- package/dist-server/server/modules/cli/index.js +3 -0
- package/dist-server/server/modules/cli/index.js.map +1 -0
- package/dist-server/server/modules/cli/pwa-launcher.js +116 -0
- package/dist-server/server/modules/cli/pwa-launcher.js.map +1 -0
- package/dist-server/server/modules/cli/sandbox.service.js +332 -0
- package/dist-server/server/modules/cli/sandbox.service.js.map +1 -0
- package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +154 -0
- package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js.map +1 -0
- package/dist-server/server/modules/cli/tests/cli.service.test.js +91 -0
- package/dist-server/server/modules/cli/tests/cli.service.test.js.map +1 -0
- package/dist-server/server/modules/cli/tests/sandbox.service.test.js +55 -0
- package/dist-server/server/modules/cli/tests/sandbox.service.test.js.map +1 -0
- package/dist-server/server/modules/commands/commands.module.js +20 -0
- package/dist-server/server/modules/commands/commands.module.js.map +1 -0
- package/dist-server/server/modules/commands/commands.routes.js +498 -0
- package/dist-server/server/modules/commands/commands.routes.js.map +1 -0
- package/dist-server/server/modules/commands/index.js +3 -0
- package/dist-server/server/modules/commands/index.js.map +1 -0
- package/dist-server/server/modules/commands/tests/commands.test.js +91 -0
- package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -0
- package/dist-server/server/modules/database/connection.js +125 -0
- package/dist-server/server/modules/database/connection.js.map +1 -0
- package/dist-server/server/modules/database/index.js +23 -0
- package/dist-server/server/modules/database/index.js.map +1 -0
- package/dist-server/server/modules/database/init-db.js +18 -0
- package/dist-server/server/modules/database/init-db.js.map +1 -0
- package/dist-server/server/modules/database/migrations.js +465 -0
- package/dist-server/server/modules/database/migrations.js.map +1 -0
- package/dist-server/server/modules/database/repositories/api-keys.js +72 -0
- package/dist-server/server/modules/database/repositories/api-keys.js.map +1 -0
- package/dist-server/server/modules/database/repositories/app-config.js +47 -0
- package/dist-server/server/modules/database/repositories/app-config.js.map +1 -0
- package/dist-server/server/modules/database/repositories/credentials.js +68 -0
- package/dist-server/server/modules/database/repositories/credentials.js.map +1 -0
- package/dist-server/server/modules/database/repositories/github-tokens.js +54 -0
- package/dist-server/server/modules/database/repositories/github-tokens.js.map +1 -0
- package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js +100 -0
- package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js.map +1 -0
- package/dist-server/server/modules/database/repositories/notification-preferences.js +82 -0
- package/dist-server/server/modules/database/repositories/notification-preferences.js.map +1 -0
- package/dist-server/server/modules/database/repositories/projects.db.js +172 -0
- package/dist-server/server/modules/database/repositories/projects.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/provider-models.js +112 -0
- package/dist-server/server/modules/database/repositories/provider-models.js.map +1 -0
- package/dist-server/server/modules/database/repositories/push-subscriptions.js +49 -0
- package/dist-server/server/modules/database/repositories/push-subscriptions.js.map +1 -0
- package/dist-server/server/modules/database/repositories/scan-state.db.js +31 -0
- package/dist-server/server/modules/database/repositories/scan-state.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/scheduled-messages.db.js +71 -0
- package/dist-server/server/modules/database/repositories/scheduled-messages.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/session-drafts.db.js +105 -0
- package/dist-server/server/modules/database/repositories/session-drafts.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/sessions.db.js +507 -0
- package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/user-preferences.db.js +65 -0
- package/dist-server/server/modules/database/repositories/user-preferences.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/users.js +88 -0
- package/dist-server/server/modules/database/repositories/users.js.map +1 -0
- package/dist-server/server/modules/database/repositories/vapid-keys.js +38 -0
- package/dist-server/server/modules/database/repositories/vapid-keys.js.map +1 -0
- package/dist-server/server/modules/database/schema.js +291 -0
- package/dist-server/server/modules/database/schema.js.map +1 -0
- package/dist-server/server/modules/database/tests/projects.db.integration.test.js +64 -0
- package/dist-server/server/modules/database/tests/projects.db.integration.test.js.map +1 -0
- package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +102 -0
- package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js.map +1 -0
- package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +79 -0
- package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -0
- package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +132 -0
- package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -0
- package/dist-server/server/modules/database/tests/user-preferences.db.integration.test.js +105 -0
- package/dist-server/server/modules/database/tests/user-preferences.db.integration.test.js.map +1 -0
- package/dist-server/server/modules/file-tree/file-tree.module.js +95 -0
- package/dist-server/server/modules/file-tree/file-tree.module.js.map +1 -0
- package/dist-server/server/modules/file-tree/file-tree.routes.js +208 -0
- package/dist-server/server/modules/file-tree/file-tree.routes.js.map +1 -0
- package/dist-server/server/modules/file-tree/file-tree.service.js +584 -0
- package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -0
- package/dist-server/server/modules/file-tree/index.js +3 -0
- package/dist-server/server/modules/file-tree/index.js.map +1 -0
- package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js +123 -0
- package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js.map +1 -0
- package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +311 -0
- package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -0
- package/dist-server/server/modules/git/git-branch.service.js +15 -0
- package/dist-server/server/modules/git/git-branch.service.js.map +1 -0
- package/dist-server/server/modules/git/git-parsing.service.js +61 -0
- package/dist-server/server/modules/git/git-parsing.service.js.map +1 -0
- package/dist-server/server/modules/git/git.module.js +14 -0
- package/dist-server/server/modules/git/git.module.js.map +1 -0
- package/dist-server/server/modules/git/git.routes.js +1347 -0
- package/dist-server/server/modules/git/git.routes.js.map +1 -0
- package/dist-server/server/modules/git/index.js +3 -0
- package/dist-server/server/modules/git/index.js.map +1 -0
- package/dist-server/server/modules/git/tests/git-branch.service.test.js +52 -0
- package/dist-server/server/modules/git/tests/git-branch.service.test.js.map +1 -0
- package/dist-server/server/modules/git/tests/git-init.routes.test.js +132 -0
- package/dist-server/server/modules/git/tests/git-init.routes.test.js.map +1 -0
- package/dist-server/server/modules/git/tests/git.test.js +80 -0
- package/dist-server/server/modules/git/tests/git.test.js.map +1 -0
- package/dist-server/server/modules/notifications/index.js +20 -0
- package/dist-server/server/modules/notifications/index.js.map +1 -0
- package/dist-server/server/modules/notifications/notifications.routes.js +115 -0
- package/dist-server/server/modules/notifications/notifications.routes.js.map +1 -0
- package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js +97 -0
- package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js.map +1 -0
- package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +249 -0
- package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js.map +1 -0
- package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js +44 -0
- package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js.map +1 -0
- package/dist-server/server/modules/notifications/vapid-keys.service.js +28 -0
- package/dist-server/server/modules/notifications/vapid-keys.service.js.map +1 -0
- package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js +79 -0
- package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js.map +1 -0
- package/dist-server/server/modules/plugins/index.js +9 -0
- package/dist-server/server/modules/plugins/index.js.map +1 -0
- package/dist-server/server/modules/plugins/plugin-process.service.js +191 -0
- package/dist-server/server/modules/plugins/plugin-process.service.js.map +1 -0
- package/dist-server/server/modules/plugins/plugin-registry.service.js +415 -0
- package/dist-server/server/modules/plugins/plugin-registry.service.js.map +1 -0
- package/dist-server/server/modules/plugins/plugins.module.js +30 -0
- package/dist-server/server/modules/plugins/plugins.module.js.map +1 -0
- package/dist-server/server/modules/plugins/plugins.routes.js +70 -0
- package/dist-server/server/modules/plugins/plugins.routes.js.map +1 -0
- package/dist-server/server/modules/plugins/plugins.service.js +123 -0
- package/dist-server/server/modules/plugins/plugins.service.js.map +1 -0
- package/dist-server/server/modules/plugins/tests/plugins.service.test.js +28 -0
- package/dist-server/server/modules/plugins/tests/plugins.service.test.js.map +1 -0
- package/dist-server/server/modules/projects/index.js +9 -0
- package/dist-server/server/modules/projects/index.js.map +1 -0
- package/dist-server/server/modules/projects/projects.routes.js +205 -0
- package/dist-server/server/modules/projects/projects.routes.js.map +1 -0
- package/dist-server/server/modules/projects/services/project-clone.service.js +220 -0
- package/dist-server/server/modules/projects/services/project-clone.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/project-delete.service.js +89 -0
- package/dist-server/server/modules/projects/services/project-delete.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/project-management.service.js +90 -0
- package/dist-server/server/modules/projects/services/project-management.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/project-star.service.js +60 -0
- package/dist-server/server/modules/projects/services/project-star.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js +167 -0
- package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js +188 -0
- package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js.map +1 -0
- package/dist-server/server/modules/projects/tests/project-clone.service.test.js +126 -0
- package/dist-server/server/modules/projects/tests/project-clone.service.test.js.map +1 -0
- package/dist-server/server/modules/projects/tests/project-management.service.test.js +85 -0
- package/dist-server/server/modules/projects/tests/project-management.service.test.js.map +1 -0
- package/dist-server/server/modules/projects/tests/project-star.service.test.js +95 -0
- package/dist-server/server/modules/projects/tests/project-star.service.test.js.map +1 -0
- package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js +87 -0
- package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/index.js +12 -0
- package/dist-server/server/modules/providers/index.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +151 -0
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-fork.provider.js +46 -0
- package/dist-server/server/modules/providers/list/claude/claude-fork.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js +103 -0
- package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +278 -0
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js +1058 -0
- package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +141 -0
- package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +924 -0
- package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js +208 -0
- package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude.provider.js +23 -0
- package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js +204 -0
- package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +84 -0
- package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-fork.provider.js +32 -0
- package/dist-server/server/modules/providers/list/codex/codex-fork.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js +107 -0
- package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +125 -0
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js +473 -0
- package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +153 -0
- package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +1955 -0
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js +62 -0
- package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex.provider.js +23 -0
- package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +118 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js +80 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +100 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js +305 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js +111 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +566 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js +35 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +21 -0
- package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-auth.provider.js +147 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-mcp.provider.js +15 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-models.provider.js +69 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-models.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-runtime.provider.js +326 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-runtime.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-session-synchronizer.provider.js +12 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-session-synchronizer.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-sessions.provider.js +180 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-skills.provider.js +15 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-skills.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral.provider.js +25 -0
- package/dist-server/server/modules/providers/list/mistral/mistral.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js +91 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js +181 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +429 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js +368 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +225 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +136 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +404 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js +62 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode.provider.js +21 -0
- package/dist-server/server/modules/providers/list/opencode/opencode.provider.js.map +1 -0
- package/dist-server/server/modules/providers/provider.registry.js +33 -0
- package/dist-server/server/modules/providers/provider.registry.js.map +1 -0
- package/dist-server/server/modules/providers/provider.routes.js +676 -0
- package/dist-server/server/modules/providers/provider.routes.js.map +1 -0
- package/dist-server/server/modules/providers/services/mcp.service.js +84 -0
- package/dist-server/server/modules/providers/services/mcp.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/provider-auth.service.js +25 -0
- package/dist-server/server/modules/providers/services/provider-auth.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/provider-capabilities.service.js +94 -0
- package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/provider-models.service.js +289 -0
- package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/provider-runtime.service.js +66 -0
- package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/provider-token-usage.service.js +372 -0
- package/dist-server/server/modules/providers/services/provider-token-usage.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/session-conversations-search.service.js +974 -0
- package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/session-history-cache.service.js +87 -0
- package/dist-server/server/modules/providers/services/session-history-cache.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/session-synchronizer.service.js +130 -0
- package/dist-server/server/modules/providers/services/session-synchronizer.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/sessions-watcher.service.js +214 -0
- package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/sessions.service.js +519 -0
- package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/skills.service.js +22 -0
- package/dist-server/server/modules/providers/services/skills.service.js.map +1 -0
- package/dist-server/server/modules/providers/shared/base/abstract.provider.js +13 -0
- package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -0
- package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js +102 -0
- package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/shared/skills/skills.provider.js +207 -0
- package/dist-server/server/modules/providers/shared/skills/skills.provider.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-auth.test.js +174 -0
- package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-models.test.js +39 -0
- package/dist-server/server/modules/providers/tests/claude-models.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-sessions.test.js +470 -0
- package/dist-server/server/modules/providers/tests/claude-sessions.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-subagent-echo.test.js +16 -0
- package/dist-server/server/modules/providers/tests/claude-subagent-echo.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-token-budget.test.js +85 -0
- package/dist-server/server/modules/providers/tests/claude-token-budget.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-message-editing.test.js +338 -0
- package/dist-server/server/modules/providers/tests/codex-message-editing.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-runtime.test.js +51 -0
- package/dist-server/server/modules/providers/tests/codex-runtime.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-session-fork.test.js +54 -0
- package/dist-server/server/modules/providers/tests/codex-session-fork.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js +491 -0
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/mcp.test.js +291 -0
- package/dist-server/server/modules/providers/tests/mcp.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/opencode-models.test.js +132 -0
- package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +424 -0
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js +205 -0
- package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/provider-models.service.test.js +268 -0
- package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js +126 -0
- package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +329 -0
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/provider.routes.test.js +161 -0
- package/dist-server/server/modules/providers/tests/provider.routes.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/session-fork.test.js +113 -0
- package/dist-server/server/modules/providers/tests/session-fork.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/session-history-cache.service.test.js +120 -0
- package/dist-server/server/modules/providers/tests/session-history-cache.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/session-orphan-prune.test.js +90 -0
- package/dist-server/server/modules/providers/tests/session-orphan-prune.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/session-synchronizer-coalescing.test.js +122 -0
- package/dist-server/server/modules/providers/tests/session-synchronizer-coalescing.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/sessions-details.test.js +62 -0
- package/dist-server/server/modules/providers/tests/sessions-details.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/sessions.service.test.js +131 -0
- package/dist-server/server/modules/providers/tests/sessions.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/skills.test.js +410 -0
- package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/index.js +5 -0
- package/dist-server/server/modules/scheduled-messages/index.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/scheduled-messages.routes.js +47 -0
- package/dist-server/server/modules/scheduled-messages/scheduled-messages.routes.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.js +163 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-messages.service.js +95 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-messages.service.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/tests/scheduled-messages.test.js +255 -0
- package/dist-server/server/modules/scheduled-messages/tests/scheduled-messages.test.js.map +1 -0
- package/dist-server/server/modules/settings/index.js +3 -0
- package/dist-server/server/modules/settings/index.js.map +1 -0
- package/dist-server/server/modules/settings/settings.module.js +35 -0
- package/dist-server/server/modules/settings/settings.module.js.map +1 -0
- package/dist-server/server/modules/settings/settings.routes.js +34 -0
- package/dist-server/server/modules/settings/settings.routes.js.map +1 -0
- package/dist-server/server/modules/settings/settings.service.js +116 -0
- package/dist-server/server/modules/settings/settings.service.js.map +1 -0
- package/dist-server/server/modules/settings/tests/settings.service.test.js +48 -0
- package/dist-server/server/modules/settings/tests/settings.service.test.js.map +1 -0
- package/dist-server/server/modules/system/index.js +3 -0
- package/dist-server/server/modules/system/index.js.map +1 -0
- package/dist-server/server/modules/system/system.module.js +44 -0
- package/dist-server/server/modules/system/system.module.js.map +1 -0
- package/dist-server/server/modules/system/system.routes.js +16 -0
- package/dist-server/server/modules/system/system.routes.js.map +1 -0
- package/dist-server/server/modules/system/system.service.js +45 -0
- package/dist-server/server/modules/system/system.service.js.map +1 -0
- package/dist-server/server/modules/system/tests/system.service.test.js +100 -0
- package/dist-server/server/modules/system/tests/system.service.test.js.map +1 -0
- package/dist-server/server/modules/taskmaster/index.js +3 -0
- package/dist-server/server/modules/taskmaster/index.js.map +1 -0
- package/dist-server/server/modules/taskmaster/taskmaster.module.js +20 -0
- package/dist-server/server/modules/taskmaster/taskmaster.module.js.map +1 -0
- package/dist-server/server/modules/taskmaster/taskmaster.routes.js +1372 -0
- package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -0
- package/dist-server/server/modules/taskmaster/taskmaster.service.js +107 -0
- package/dist-server/server/modules/taskmaster/taskmaster.service.js.map +1 -0
- package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js +180 -0
- package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js.map +1 -0
- package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js +85 -0
- package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js.map +1 -0
- package/dist-server/server/modules/user/index.js +3 -0
- package/dist-server/server/modules/user/index.js.map +1 -0
- package/dist-server/server/modules/user/tests/user.service.test.js +123 -0
- package/dist-server/server/modules/user/tests/user.service.test.js.map +1 -0
- package/dist-server/server/modules/user/user.module.js +56 -0
- package/dist-server/server/modules/user/user.module.js.map +1 -0
- package/dist-server/server/modules/user/user.routes.js +88 -0
- package/dist-server/server/modules/user/user.routes.js.map +1 -0
- package/dist-server/server/modules/user/user.service.js +134 -0
- package/dist-server/server/modules/user/user.service.js.map +1 -0
- package/dist-server/server/modules/voice/index.js +3 -0
- package/dist-server/server/modules/voice/index.js.map +1 -0
- package/dist-server/server/modules/voice/tests/voice.service.test.js +87 -0
- package/dist-server/server/modules/voice/tests/voice.service.test.js.map +1 -0
- package/dist-server/server/modules/voice/voice.module.js +44 -0
- package/dist-server/server/modules/voice/voice.module.js.map +1 -0
- package/dist-server/server/modules/voice/voice.routes.js +87 -0
- package/dist-server/server/modules/voice/voice.routes.js.map +1 -0
- package/dist-server/server/modules/voice/voice.service.js +148 -0
- package/dist-server/server/modules/voice/voice.service.js.map +1 -0
- package/dist-server/server/modules/websocket/index.js +11 -0
- package/dist-server/server/modules/websocket/index.js.map +1 -0
- package/dist-server/server/modules/websocket/services/chat-run-registry.service.js +232 -0
- package/dist-server/server/modules/websocket/services/chat-run-registry.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +135 -0
- package/dist-server/server/modules/websocket/services/chat-session-writer.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js +467 -0
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js +52 -0
- package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/session-upsert-broadcast.service.js +94 -0
- package/dist-server/server/modules/websocket/services/session-upsert-broadcast.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/shell-websocket.service.js +472 -0
- package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/websocket-auth.service.js +36 -0
- package/dist-server/server/modules/websocket/services/websocket-auth.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/websocket-server.service.js +90 -0
- package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/websocket-state.service.js +14 -0
- package/dist-server/server/modules/websocket/services/websocket-state.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/websocket-writer.service.js +32 -0
- package/dist-server/server/modules/websocket/services/websocket-writer.service.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js +40 -0
- package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/chat-edit-send.test.js +263 -0
- package/dist-server/server/modules/websocket/tests/chat-edit-send.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js +275 -0
- package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/session-upsert-broadcast.test.js +106 -0
- package/dist-server/server/modules/websocket/tests/session-upsert-broadcast.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js +177 -0
- package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js +61 -0
- package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/index.js +3 -0
- package/dist-server/server/modules/worktrees/index.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js +37 -0
- package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-create.service.js +67 -0
- package/dist-server/server/modules/worktrees/services/worktree-create.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-git.service.js +172 -0
- package/dist-server/server/modules/worktrees/services/worktree-git.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-list.service.js +91 -0
- package/dist-server/server/modules/worktrees/services/worktree-list.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-merge.service.js +118 -0
- package/dist-server/server/modules/worktrees/services/worktree-merge.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-open.service.js +58 -0
- package/dist-server/server/modules/worktrees/services/worktree-open.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +65 -0
- package/dist-server/server/modules/worktrees/services/worktree-remove.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js +58 -0
- package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js +85 -0
- package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js +58 -0
- package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js +34 -0
- package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js +137 -0
- package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js +99 -0
- package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js +157 -0
- package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js +167 -0
- package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/worktrees.module.js +97 -0
- package/dist-server/server/modules/worktrees/worktrees.module.js.map +1 -0
- package/dist-server/server/modules/worktrees/worktrees.routes.js +84 -0
- package/dist-server/server/modules/worktrees/worktrees.routes.js.map +1 -0
- package/dist-server/server/piecemaker/anonymizer/lifecycle.js +20 -0
- package/dist-server/server/piecemaker/anonymizer/lifecycle.js.map +1 -0
- package/dist-server/server/piecemaker/harness/chat-harness.js +157 -0
- package/dist-server/server/piecemaker/harness/chat-harness.js.map +1 -0
- package/dist-server/server/piecemaker/harness/citation-instructions.js +17 -0
- package/dist-server/server/piecemaker/harness/citation-instructions.js.map +1 -0
- package/dist-server/server/piecemaker/harness/citation-store.js +72 -0
- package/dist-server/server/piecemaker/harness/citation-store.js.map +1 -0
- package/dist-server/server/piecemaker/harness/citation-turn.js +211 -0
- package/dist-server/server/piecemaker/harness/citation-turn.js.map +1 -0
- package/dist-server/server/piecemaker/harness/citations.routes.js +16 -0
- package/dist-server/server/piecemaker/harness/citations.routes.js.map +1 -0
- package/dist-server/server/piecemaker/harness/source-passages.js +19 -0
- package/dist-server/server/piecemaker/harness/source-passages.js.map +1 -0
- package/dist-server/server/piecemaker/index.js +49 -0
- package/dist-server/server/piecemaker/index.js.map +1 -0
- package/dist-server/server/piecemaker/knowledge/index.js +20 -0
- package/dist-server/server/piecemaker/knowledge/index.js.map +1 -0
- package/dist-server/server/piecemaker/knowledge/pipeline.js +162 -0
- package/dist-server/server/piecemaker/knowledge/pipeline.js.map +1 -0
- package/dist-server/server/piecemaker/knowledge/routes.js +26 -0
- package/dist-server/server/piecemaker/knowledge/routes.js.map +1 -0
- package/dist-server/server/piecemaker/knowledge/service.js +78 -0
- package/dist-server/server/piecemaker/knowledge/service.js.map +1 -0
- package/dist-server/server/piecemaker/library/index.js +66 -0
- package/dist-server/server/piecemaker/library/index.js.map +1 -0
- package/dist-server/server/piecemaker/library/marketplace.js +258 -0
- package/dist-server/server/piecemaker/library/marketplace.js.map +1 -0
- package/dist-server/server/piecemaker/library/migrate-cli.js +13 -0
- package/dist-server/server/piecemaker/library/migrate-cli.js.map +1 -0
- package/dist-server/server/piecemaker/library/migrate.js +53 -0
- package/dist-server/server/piecemaker/library/migrate.js.map +1 -0
- package/dist-server/server/piecemaker/library/provider-skills.js +40 -0
- package/dist-server/server/piecemaker/library/provider-skills.js.map +1 -0
- package/dist-server/server/piecemaker/library/routes.js +83 -0
- package/dist-server/server/piecemaker/library/routes.js.map +1 -0
- package/dist-server/server/piecemaker/library/runtime.js +34 -0
- package/dist-server/server/piecemaker/library/runtime.js.map +1 -0
- package/dist-server/server/piecemaker/library/store.js +468 -0
- package/dist-server/server/piecemaker/library/store.js.map +1 -0
- package/dist-server/server/piecemaker/library/workspace-installation.js +70 -0
- package/dist-server/server/piecemaker/library/workspace-installation.js.map +1 -0
- package/dist-server/server/piecemaker/timesheet/index.js +9 -0
- package/dist-server/server/piecemaker/timesheet/index.js.map +1 -0
- package/dist-server/server/piecemaker/timesheet/routes.js +42 -0
- package/dist-server/server/piecemaker/timesheet/routes.js.map +1 -0
- package/dist-server/server/piecemaker/timesheet/service.js +241 -0
- package/dist-server/server/piecemaker/timesheet/service.js.map +1 -0
- package/dist-server/server/piecemaker/timesheet/store.js +126 -0
- package/dist-server/server/piecemaker/timesheet/store.js.map +1 -0
- package/dist-server/server/shared/claude-cli-path.js +120 -0
- package/dist-server/server/shared/claude-cli-path.js.map +1 -0
- package/dist-server/server/shared/frontmatter.js +16 -0
- package/dist-server/server/shared/frontmatter.js.map +1 -0
- package/dist-server/server/shared/image-attachments.js +344 -0
- package/dist-server/server/shared/image-attachments.js.map +1 -0
- package/dist-server/server/shared/index.js +3 -0
- package/dist-server/server/shared/index.js.map +1 -0
- package/dist-server/server/shared/interfaces.js +2 -0
- package/dist-server/server/shared/interfaces.js.map +1 -0
- package/dist-server/server/shared/message-unification.js +376 -0
- package/dist-server/server/shared/message-unification.js.map +1 -0
- package/dist-server/server/shared/tests/application-data-root.test.js +33 -0
- package/dist-server/server/shared/tests/application-data-root.test.js.map +1 -0
- package/dist-server/server/shared/tests/claude-cli-path.test.js +89 -0
- package/dist-server/server/shared/tests/claude-cli-path.test.js.map +1 -0
- package/dist-server/server/shared/tests/image-attachments.test.js +262 -0
- package/dist-server/server/shared/tests/image-attachments.test.js.map +1 -0
- package/dist-server/server/shared/tests/message-unification.test.js +174 -0
- package/dist-server/server/shared/tests/message-unification.test.js.map +1 -0
- package/dist-server/server/shared/tests/slice-tail-page.test.js +35 -0
- package/dist-server/server/shared/tests/slice-tail-page.test.js.map +1 -0
- package/dist-server/server/shared/types.js +2 -0
- package/dist-server/server/shared/types.js.map +1 -0
- package/dist-server/server/shared/utils.js +1010 -0
- package/dist-server/server/shared/utils.js.map +1 -0
- package/dist-server/shared/networkHosts.js +20 -0
- package/dist-server/shared/networkHosts.js.map +1 -0
- package/dist-server/shared/product-config.mjs +79 -0
- package/dist-server/shared/product-config.mjs.map +1 -0
- package/package.json +271 -0
- package/product.config.json +17 -0
- package/public/api-docs.html +901 -0
- package/scripts/fix-node-pty.js +67 -0
- package/scripts/piecemaker/cli/install-command.mjs +130 -0
- package/scripts/piecemaker/cli/lib/composants.mjs +67 -0
- package/scripts/piecemaker/cli/lib/config.mjs +32 -0
- package/scripts/piecemaker/cli/lib/exec.mjs +79 -0
- package/scripts/piecemaker/cli/lib/node-runtime.mjs +76 -0
- package/scripts/piecemaker/cli/lib/plugins.mjs +35 -0
- package/scripts/piecemaker/cli/lib/ports.mjs +96 -0
- package/scripts/piecemaker/cli/lib/pwa.mjs +323 -0
- package/scripts/piecemaker/cli/lib/repos.mjs +140 -0
- package/scripts/piecemaker/cli/lib/services.mjs +71 -0
- package/scripts/piecemaker/cli/lib/ui.mjs +41 -0
- package/scripts/piecemaker/cli/piecemaker.mjs +161 -0
- package/scripts/piecemaker/cli/piecemaker.ps1 +63 -0
- package/scripts/piecemaker/cli/piecemaker.sh +60 -0
- package/scripts/piecemaker/generate-i18n-overrides.mjs +219 -0
- package/scripts/piecemaker/hooks/proxy-guard.mjs +286 -0
- package/scripts/promote-dist-server.mjs +50 -0
- package/scripts/release/build-server-bundle.js +178 -0
- package/scripts/release/package-piecemaker.sh +73 -0
- package/scripts/release/prepare-desktop-app.js +168 -0
- package/server/index.ts +410 -0
- package/server/load-env.ts +48 -0
- package/server/modules/agent/agent.module.ts +52 -0
- package/server/modules/agent/agent.routes.ts +1287 -0
- package/server/modules/agent/index.ts +2 -0
- package/server/modules/agent/tests/agent.routes.test.ts +237 -0
- package/server/modules/assets/assets.routes.ts +150 -0
- package/server/modules/assets/index.ts +3 -0
- package/server/modules/assets/services/image-assets.service.ts +127 -0
- package/server/modules/assets/tests/image-assets.service.test.ts +74 -0
- package/server/modules/auth/auth.middleware.ts +163 -0
- package/server/modules/auth/auth.module.ts +38 -0
- package/server/modules/auth/auth.routes.ts +57 -0
- package/server/modules/auth/auth.service.ts +155 -0
- package/server/modules/auth/index.ts +9 -0
- package/server/modules/auth/tests/auth.service.test.ts +95 -0
- package/server/modules/browser-use/browser-use-mcp.routes.ts +120 -0
- package/server/modules/browser-use/browser-use-mcp.ts +386 -0
- package/server/modules/browser-use/browser-use-runtime.ts +10 -0
- package/server/modules/browser-use/browser-use.routes.ts +159 -0
- package/server/modules/browser-use/browser-use.service.ts +835 -0
- package/server/modules/browser-use/index.ts +11 -0
- package/server/modules/browser-use/tests/browser-use.service.test.ts +10 -0
- package/server/modules/cli/cli.module.ts +110 -0
- package/server/modules/cli/cli.service.ts +266 -0
- package/server/modules/cli/cli.ts +19 -0
- package/server/modules/cli/index.ts +2 -0
- package/server/modules/cli/pwa-launcher.ts +131 -0
- package/server/modules/cli/sandbox.service.ts +413 -0
- package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +186 -0
- package/server/modules/cli/tests/cli.service.test.ts +107 -0
- package/server/modules/cli/tests/sandbox.service.test.ts +61 -0
- package/server/modules/commands/commands.module.ts +22 -0
- package/server/modules/commands/commands.routes.ts +605 -0
- package/server/modules/commands/index.ts +2 -0
- package/server/modules/commands/tests/commands.test.ts +114 -0
- package/server/modules/database/connection.ts +144 -0
- package/server/modules/database/index.ts +27 -0
- package/server/modules/database/init-db.ts +17 -0
- package/server/modules/database/migrations.ts +552 -0
- package/server/modules/database/repositories/api-keys.ts +119 -0
- package/server/modules/database/repositories/app-config.ts +53 -0
- package/server/modules/database/repositories/credentials.ts +106 -0
- package/server/modules/database/repositories/github-tokens.ts +100 -0
- package/server/modules/database/repositories/notification-channel-endpoints.ts +153 -0
- package/server/modules/database/repositories/notification-preferences.ts +117 -0
- package/server/modules/database/repositories/projects.db.ts +196 -0
- package/server/modules/database/repositories/provider-models.ts +168 -0
- package/server/modules/database/repositories/push-subscriptions.ts +80 -0
- package/server/modules/database/repositories/scan-state.db.ts +42 -0
- package/server/modules/database/repositories/scheduled-messages.db.ts +127 -0
- package/server/modules/database/repositories/session-drafts.db.ts +171 -0
- package/server/modules/database/repositories/sessions.db.ts +717 -0
- package/server/modules/database/repositories/user-preferences.db.ts +80 -0
- package/server/modules/database/repositories/users.ts +140 -0
- package/server/modules/database/repositories/vapid-keys.ts +57 -0
- package/server/modules/database/schema.ts +306 -0
- package/server/modules/database/tests/projects.db.integration.test.ts +72 -0
- package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -0
- package/server/modules/database/tests/sessions-provider-mapping.test.ts +109 -0
- package/server/modules/database/tests/sessions.db.integration.test.ts +168 -0
- package/server/modules/database/tests/user-preferences.db.integration.test.ts +135 -0
- package/server/modules/file-tree/file-tree.module.ts +116 -0
- package/server/modules/file-tree/file-tree.routes.ts +258 -0
- package/server/modules/file-tree/file-tree.service.ts +675 -0
- package/server/modules/file-tree/index.ts +2 -0
- package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -0
- package/server/modules/file-tree/tests/file-tree.service.test.ts +371 -0
- package/server/modules/git/git-branch.service.ts +43 -0
- package/server/modules/git/git-parsing.service.ts +66 -0
- package/server/modules/git/git.module.ts +22 -0
- package/server/modules/git/git.routes.ts +1600 -0
- package/server/modules/git/index.ts +2 -0
- package/server/modules/git/tests/git-branch.service.test.ts +60 -0
- package/server/modules/git/tests/git-init.routes.test.ts +135 -0
- package/server/modules/git/tests/git.test.ts +106 -0
- package/server/modules/notifications/index.ts +24 -0
- package/server/modules/notifications/notifications.routes.ts +127 -0
- package/server/modules/notifications/services/desktop-notification-clients.service.ts +124 -0
- package/server/modules/notifications/services/notification-orchestrator.service.js +310 -0
- package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -0
- package/server/modules/notifications/vapid-keys.service.ts +38 -0
- package/server/modules/notifications/websocket/desktop-notifications-websocket.service.ts +109 -0
- package/server/modules/plugins/index.ts +9 -0
- package/server/modules/plugins/plugin-process.service.ts +217 -0
- package/server/modules/plugins/plugin-registry.service.ts +461 -0
- package/server/modules/plugins/plugins.module.ts +33 -0
- package/server/modules/plugins/plugins.routes.ts +66 -0
- package/server/modules/plugins/plugins.service.ts +147 -0
- package/server/modules/plugins/tests/plugins.service.test.ts +32 -0
- package/server/modules/projects/index.ts +11 -0
- package/server/modules/projects/projects.routes.ts +273 -0
- package/server/modules/projects/services/project-clone.service.ts +323 -0
- package/server/modules/projects/services/project-delete.service.ts +102 -0
- package/server/modules/projects/services/project-management.service.ts +144 -0
- package/server/modules/projects/services/project-star.service.ts +78 -0
- package/server/modules/projects/services/projects-has-taskmaster.service.ts +248 -0
- package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +314 -0
- package/server/modules/projects/tests/project-clone.service.test.ts +183 -0
- package/server/modules/projects/tests/project-management.service.test.ts +117 -0
- package/server/modules/projects/tests/project-star.service.test.ts +123 -0
- package/server/modules/projects/tests/projects-has-taskmaster.service.test.ts +105 -0
- package/server/modules/providers/README.md +380 -0
- package/server/modules/providers/index.ts +14 -0
- package/server/modules/providers/list/claude/claude-auth.provider.ts +180 -0
- package/server/modules/providers/list/claude/claude-fork.provider.ts +57 -0
- package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -0
- package/server/modules/providers/list/claude/claude-models.provider.ts +326 -0
- package/server/modules/providers/list/claude/claude-runtime.provider.js +1217 -0
- package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +203 -0
- package/server/modules/providers/list/claude/claude-sessions.provider.ts +1108 -0
- package/server/modules/providers/list/claude/claude-skills.provider.ts +268 -0
- package/server/modules/providers/list/claude/claude.provider.ts +33 -0
- package/server/modules/providers/list/codex/codex-app-server.client.ts +243 -0
- package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -0
- package/server/modules/providers/list/codex/codex-fork.provider.ts +40 -0
- package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -0
- package/server/modules/providers/list/codex/codex-models.provider.ts +139 -0
- package/server/modules/providers/list/codex/codex-runtime.provider.ts +560 -0
- package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +212 -0
- package/server/modules/providers/list/codex/codex-sessions.provider.ts +2267 -0
- package/server/modules/providers/list/codex/codex-skills.provider.ts +73 -0
- package/server/modules/providers/list/codex/codex.provider.ts +33 -0
- package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -0
- package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -0
- package/server/modules/providers/list/cursor/cursor-models.provider.ts +119 -0
- package/server/modules/providers/list/cursor/cursor-runtime.provider.js +387 -0
- package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +158 -0
- package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +654 -0
- package/server/modules/providers/list/cursor/cursor-skills.provider.ts +39 -0
- package/server/modules/providers/list/cursor/cursor.provider.ts +30 -0
- package/server/modules/providers/list/mistral/mistral-auth.provider.ts +181 -0
- package/server/modules/providers/list/mistral/mistral-mcp.provider.ts +20 -0
- package/server/modules/providers/list/mistral/mistral-models.provider.ts +76 -0
- package/server/modules/providers/list/mistral/mistral-runtime.provider.ts +417 -0
- package/server/modules/providers/list/mistral/mistral-session-synchronizer.provider.ts +15 -0
- package/server/modules/providers/list/mistral/mistral-sessions.provider.ts +210 -0
- package/server/modules/providers/list/mistral/mistral-skills.provider.ts +20 -0
- package/server/modules/providers/list/mistral/mistral.provider.ts +35 -0
- package/server/modules/providers/list/opencode/opencode-auth.provider.ts +110 -0
- package/server/modules/providers/list/opencode/opencode-mcp.provider.ts +228 -0
- package/server/modules/providers/list/opencode/opencode-models.provider.ts +476 -0
- package/server/modules/providers/list/opencode/opencode-runtime.provider.js +434 -0
- package/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +261 -0
- package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +179 -0
- package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +500 -0
- package/server/modules/providers/list/opencode/opencode-skills.provider.ts +78 -0
- package/server/modules/providers/list/opencode/opencode.provider.ts +30 -0
- package/server/modules/providers/provider.registry.ts +38 -0
- package/server/modules/providers/provider.routes.ts +909 -0
- package/server/modules/providers/services/mcp.service.ts +109 -0
- package/server/modules/providers/services/provider-auth.service.ts +26 -0
- package/server/modules/providers/services/provider-capabilities.service.ts +133 -0
- package/server/modules/providers/services/provider-models.service.ts +401 -0
- package/server/modules/providers/services/provider-runtime.service.ts +108 -0
- package/server/modules/providers/services/provider-token-usage.service.ts +484 -0
- package/server/modules/providers/services/session-conversations-search.service.ts +1321 -0
- package/server/modules/providers/services/session-history-cache.service.ts +139 -0
- package/server/modules/providers/services/session-synchronizer.service.ts +162 -0
- package/server/modules/providers/services/sessions-watcher.service.ts +266 -0
- package/server/modules/providers/services/sessions.service.ts +663 -0
- package/server/modules/providers/services/skills.service.ts +39 -0
- package/server/modules/providers/shared/base/abstract.provider.ts +32 -0
- package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -0
- package/server/modules/providers/shared/skills/skills.provider.ts +287 -0
- package/server/modules/providers/tests/claude-auth.test.ts +208 -0
- package/server/modules/providers/tests/claude-models.test.ts +87 -0
- package/server/modules/providers/tests/claude-sessions.test.ts +573 -0
- package/server/modules/providers/tests/claude-subagent-echo.test.ts +25 -0
- package/server/modules/providers/tests/claude-token-budget.test.ts +104 -0
- package/server/modules/providers/tests/codex-message-editing.test.ts +419 -0
- package/server/modules/providers/tests/codex-runtime.test.ts +58 -0
- package/server/modules/providers/tests/codex-session-fork.test.ts +59 -0
- package/server/modules/providers/tests/codex-sessions.test.ts +553 -0
- package/server/modules/providers/tests/mcp.test.ts +349 -0
- package/server/modules/providers/tests/opencode-models.test.ts +199 -0
- package/server/modules/providers/tests/opencode-sessions.test.ts +522 -0
- package/server/modules/providers/tests/provider-attachment-history.test.ts +247 -0
- package/server/modules/providers/tests/provider-models.service.test.ts +353 -0
- package/server/modules/providers/tests/provider-runtime.service.test.ts +138 -0
- package/server/modules/providers/tests/provider-token-usage.service.test.ts +373 -0
- package/server/modules/providers/tests/provider.routes.test.ts +244 -0
- package/server/modules/providers/tests/session-fork.test.ts +173 -0
- package/server/modules/providers/tests/session-history-cache.service.test.ts +143 -0
- package/server/modules/providers/tests/session-orphan-prune.test.ts +107 -0
- package/server/modules/providers/tests/session-synchronizer-coalescing.test.ts +136 -0
- package/server/modules/providers/tests/sessions-details.test.ts +73 -0
- package/server/modules/providers/tests/sessions.service.test.ts +193 -0
- package/server/modules/providers/tests/skills.test.ts +708 -0
- package/server/modules/scheduled-messages/index.ts +8 -0
- package/server/modules/scheduled-messages/scheduled-messages.routes.ts +68 -0
- package/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.ts +203 -0
- package/server/modules/scheduled-messages/services/scheduled-messages.service.ts +121 -0
- package/server/modules/scheduled-messages/tests/scheduled-messages.test.ts +310 -0
- package/server/modules/settings/index.ts +2 -0
- package/server/modules/settings/settings.module.ts +50 -0
- package/server/modules/settings/settings.routes.ts +51 -0
- package/server/modules/settings/settings.service.ts +186 -0
- package/server/modules/settings/tests/settings.service.test.ts +54 -0
- package/server/modules/system/index.ts +2 -0
- package/server/modules/system/system.module.ts +62 -0
- package/server/modules/system/system.routes.ts +21 -0
- package/server/modules/system/system.service.ts +76 -0
- package/server/modules/system/tests/system.service.test.ts +118 -0
- package/server/modules/taskmaster/index.ts +2 -0
- package/server/modules/taskmaster/taskmaster.module.ts +24 -0
- package/server/modules/taskmaster/taskmaster.routes.ts +1472 -0
- package/server/modules/taskmaster/taskmaster.service.ts +132 -0
- package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +201 -0
- package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -0
- package/server/modules/user/index.ts +2 -0
- package/server/modules/user/tests/user.service.test.ts +151 -0
- package/server/modules/user/user.module.ts +67 -0
- package/server/modules/user/user.routes.ts +94 -0
- package/server/modules/user/user.service.ts +190 -0
- package/server/modules/voice/index.ts +2 -0
- package/server/modules/voice/tests/voice.service.test.ts +99 -0
- package/server/modules/voice/voice.module.ts +47 -0
- package/server/modules/voice/voice.routes.ts +113 -0
- package/server/modules/voice/voice.service.ts +192 -0
- package/server/modules/websocket/README.md +273 -0
- package/server/modules/websocket/index.ts +11 -0
- package/server/modules/websocket/services/chat-run-registry.service.ts +310 -0
- package/server/modules/websocket/services/chat-session-writer.service.ts +175 -0
- package/server/modules/websocket/services/chat-websocket.service.ts +654 -0
- package/server/modules/websocket/services/plugin-websocket-proxy.service.ts +65 -0
- package/server/modules/websocket/services/session-upsert-broadcast.service.ts +108 -0
- package/server/modules/websocket/services/shell-websocket.service.ts +628 -0
- package/server/modules/websocket/services/websocket-auth.service.ts +59 -0
- package/server/modules/websocket/services/websocket-server.service.ts +126 -0
- package/server/modules/websocket/services/websocket-state.service.ts +16 -0
- package/server/modules/websocket/services/websocket-writer.service.ts +38 -0
- package/server/modules/websocket/tests/chat-attachment-filter.test.ts +59 -0
- package/server/modules/websocket/tests/chat-edit-send.test.ts +309 -0
- package/server/modules/websocket/tests/chat-run-registry.test.ts +313 -0
- package/server/modules/websocket/tests/session-upsert-broadcast.test.ts +138 -0
- package/server/modules/websocket/tests/shell-websocket.service.test.ts +227 -0
- package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -0
- package/server/modules/worktrees/index.ts +2 -0
- package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -0
- package/server/modules/worktrees/services/worktree-create.service.ts +104 -0
- package/server/modules/worktrees/services/worktree-git.service.ts +207 -0
- package/server/modules/worktrees/services/worktree-list.service.ts +143 -0
- package/server/modules/worktrees/services/worktree-merge.service.ts +157 -0
- package/server/modules/worktrees/services/worktree-open.service.ts +85 -0
- package/server/modules/worktrees/services/worktree-remove.service.ts +88 -0
- package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -0
- package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -0
- package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -0
- package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -0
- package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -0
- package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -0
- package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -0
- package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -0
- package/server/modules/worktrees/worktrees.module.ts +113 -0
- package/server/modules/worktrees/worktrees.routes.ts +116 -0
- package/server/piecemaker/activation/claude-mcp.cjs +115 -0
- package/server/piecemaker/activation/claude-plugins.cjs +94 -0
- package/server/piecemaker/activation/codex-mcp.cjs +102 -0
- package/server/piecemaker/activation/errors.cjs +15 -0
- package/server/piecemaker/activation/index.cjs +5 -0
- package/server/piecemaker/activation/library.cjs +284 -0
- package/server/piecemaker/activation/markdown.cjs +108 -0
- package/server/piecemaker/activation/paths.cjs +104 -0
- package/server/piecemaker/activation/routes.cjs +101 -0
- package/server/piecemaker/activation/snapshot.cjs +30 -0
- package/server/piecemaker/anonymizer/client-config.cjs +228 -0
- package/server/piecemaker/anonymizer/dictionary.cjs +171 -0
- package/server/piecemaker/anonymizer/lifecycle.ts +22 -0
- package/server/piecemaker/anonymizer/providers.cjs +241 -0
- package/server/piecemaker/anonymizer/proxy.cjs +365 -0
- package/server/piecemaker/anonymizer/rewrite.cjs +343 -0
- package/server/piecemaker/anonymizer/routes.cjs +43 -0
- package/server/piecemaker/anonymizer/service.cjs +223 -0
- package/server/piecemaker/anonymizer/sqlite-dictionary.cjs +121 -0
- package/server/piecemaker/harness/chat-harness.ts +151 -0
- package/server/piecemaker/harness/citation-instructions.ts +18 -0
- package/server/piecemaker/harness/citation-store.ts +80 -0
- package/server/piecemaker/harness/citation-turn.ts +197 -0
- package/server/piecemaker/harness/citations.routes.ts +18 -0
- package/server/piecemaker/harness/decisions.cjs +302 -0
- package/server/piecemaker/harness/flux-sse.cjs +111 -0
- package/server/piecemaker/harness/index.cjs +103 -0
- package/server/piecemaker/harness/source-passages.ts +21 -0
- package/server/piecemaker/harness/verification.cjs +159 -0
- package/server/piecemaker/index.ts +62 -0
- package/server/piecemaker/knowledge/index.ts +22 -0
- package/server/piecemaker/knowledge/pipeline.ts +173 -0
- package/server/piecemaker/knowledge/routes.ts +29 -0
- package/server/piecemaker/knowledge/service.ts +80 -0
- package/server/piecemaker/library/index.ts +54 -0
- package/server/piecemaker/library/marketplace.ts +200 -0
- package/server/piecemaker/library/migrate-cli.ts +11 -0
- package/server/piecemaker/library/migrate.ts +49 -0
- package/server/piecemaker/library/policy.cjs +9 -0
- package/server/piecemaker/library/provider-skills.ts +48 -0
- package/server/piecemaker/library/routes.ts +51 -0
- package/server/piecemaker/library/runtime.ts +39 -0
- package/server/piecemaker/library/store.ts +456 -0
- package/server/piecemaker/library/workspace-installation.ts +61 -0
- package/server/piecemaker/originals-cache.cjs +54 -0
- package/server/piecemaker/protection/bypass.cjs +73 -0
- package/server/piecemaker/protection/routes.cjs +39 -0
- package/server/piecemaker/router.cjs +107 -0
- package/server/piecemaker/timesheet/index.ts +9 -0
- package/server/piecemaker/timesheet/routes.ts +48 -0
- package/server/piecemaker/timesheet/service.ts +298 -0
- package/server/piecemaker/timesheet/store.ts +167 -0
- package/server/piecemaker/vendor/installer/assets/PieceMakerApp.swift +189 -0
- package/server/piecemaker/vendor/installer/assets/claude-hooks/piecemaker-guard-secrets.mjs +230 -0
- package/server/piecemaker/vendor/installer/assets/claude-hooks/piecemaker-secret-paths.default.json +1 -0
- package/server/piecemaker/vendor/installer/assets/piecemaker.icns +0 -0
- package/server/piecemaker/vendor/installer/assets/piecemaker.ico +0 -0
- package/server/piecemaker/vendor/installer/bin/piecemaker.mjs +1066 -0
- package/server/piecemaker/vendor/installer/lib/banner.mjs +35 -0
- package/server/piecemaker/vendor/installer/lib/codex-skills.mjs +343 -0
- package/server/piecemaker/vendor/installer/lib/commandes.mjs +13 -0
- package/server/piecemaker/vendor/installer/lib/desktop-launcher.mjs +305 -0
- package/server/piecemaker/vendor/installer/lib/legacy-legifrance.mjs +72 -0
- package/server/piecemaker/vendor/installer/lib/platform.mjs +163 -0
- package/server/piecemaker/vendor/installer/lib/prompt.mjs +138 -0
- package/server/piecemaker/vendor/installer/lib/resume-steps.mjs +174 -0
- package/server/piecemaker/vendor/installer/lib/secrets-guard.mjs +193 -0
- package/server/piecemaker/vendor/installer/lib/service.mjs +467 -0
- package/server/piecemaker/vendor/installer/lib/state.mjs +113 -0
- package/server/piecemaker/vendor/installer/lib/ui.mjs +159 -0
- package/server/piecemaker/vendor/installer/steps/00-identite.mjs +71 -0
- package/server/piecemaker/vendor/installer/steps/01-prerequis.mjs +119 -0
- package/server/piecemaker/vendor/installer/steps/02-dependances-node.mjs +127 -0
- package/server/piecemaker/vendor/installer/steps/03-python-gliner.mjs +260 -0
- package/server/piecemaker/vendor/installer/steps/04-conversion-md.mjs +147 -0
- package/server/piecemaker/vendor/installer/steps/05-certificats.mjs +171 -0
- package/server/piecemaker/vendor/installer/steps/06-hooks.mjs +266 -0
- package/server/piecemaker/vendor/installer/steps/07-legifrance.mjs +279 -0
- package/server/piecemaker/vendor/installer/steps/08-telegram.mjs +482 -0
- package/server/piecemaker/vendor/installer/steps/09-claude-assets.mjs +151 -0
- package/server/piecemaker/vendor/installer/steps/09-codex-plugin.mjs +142 -0
- package/server/piecemaker/vendor/installer/steps/10-libreoffice.mjs +130 -0
- package/server/piecemaker/vendor/installer/steps/10-pandoc.mjs +212 -0
- package/server/piecemaker/vendor/installer/steps/11-docx-cli.mjs +144 -0
- package/server/piecemaker/vendor/installer/steps/12-mcp-piecemaker.mjs +124 -0
- package/server/piecemaker/vendor/installer/steps/13-garde-secrets.mjs +136 -0
- package/server/piecemaker/vendor/installer/steps/14-mxc-sandbox.mjs +271 -0
- package/server/piecemaker/vendor/installer/steps/15-pwa-desktop.mjs +64 -0
- package/server/piecemaker/vendor/installer/templates/root-CLAUDE.md +56 -0
- package/server/piecemaker/vendor/installer/templates/workspace-CLAUDE.md +52 -0
- package/server/piecemaker/vendor/mcp/README.md +13 -0
- package/server/piecemaker/vendor/mcp/piecemaker/server.mjs +217 -0
- package/server/piecemaker/vendor/mike-defaults-fr/PROVENANCE.md +10 -0
- package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/compare-documents/SKILL.md +51 -0
- package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/draft-from-template/SKILL.md +27 -0
- package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/extract-key-terms/SKILL.md +43 -0
- package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/proofread/SKILL.md +98 -0
- package/server/piecemaker/vendor/mike-defaults-fr/catalog.json +22 -0
- package/server/piecemaker/vendor/mike-defaults-fr/tabular-review-workflows/commercial-agreement-tabular-review/SKILL.md +31 -0
- package/server/piecemaker/vendor/mike-defaults-fr/tabular-review-workflows/commercial-agreement-tabular-review/table-columns.yaml +92 -0
- package/server/piecemaker/vendor/package.json +7 -0
- package/server/piecemaker/vendor/piecemaker-plugin/README.md +115 -0
- package/server/piecemaker/vendor/piecemaker-plugin/agents/analyste-piece.md +24 -0
- package/server/piecemaker/vendor/piecemaker-plugin/agents/jurisprudence-scanner.md +50 -0
- package/server/piecemaker/vendor/piecemaker-plugin/hooks/hooks.json +84 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/billing-track.mjs +194 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/build-recherche-pdf.mjs +91 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/classify-ai-documents.mjs +123 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/commit-track.mjs +71 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/compile-recherche.mjs +107 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/anonymization-state.cjs +146 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folder-structure.cjs +297 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folders.cjs +86 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/central-mapping.cjs +0 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citation-sources.cjs +519 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citations.cjs +292 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/commits.cjs +1683 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/docx-text-worker.cjs +43 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/hook-io.mjs +249 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/institutional-terms.cjs +160 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/legifrance-reads.cjs +85 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.cjs +346 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/protection.cjs +419 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/recherche-report.cjs +177 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/session-timing.cjs +80 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/substitution.cjs +288 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/verify-citations.cjs +318 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/protect-originals.mjs +256 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/session-commit-worker.mjs +260 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/session-commit.mjs +83 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/statusline.mjs +179 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/track-legifrance-reads.mjs +46 -0
- package/server/piecemaker/vendor/piecemaker-plugin/skills/ajout-de-fonctionnalites/SKILL.md +66 -0
- package/server/piecemaker/vendor/piecemaker-plugin/skills/conversion-md/SKILL.md +60 -0
- package/server/piecemaker/vendor/piecemaker-plugin/skills/recherche-juridique/SKILL.md +234 -0
- package/server/piecemaker/vendor/piecemaker-plugin/skills/redaction-juridique/SKILL.md +96 -0
- package/server/piecemaker/vendor/piecemaker-plugin/skills/tamponnage/SKILL.md +148 -0
- package/server/piecemaker/vendor/websocket-server/admin-routes.cjs +3116 -0
- package/server/piecemaker/vendor/websocket-server/case-folder-structure.cjs +3 -0
- package/server/piecemaker/vendor/websocket-server/case-instructions.cjs +111 -0
- package/server/piecemaker/vendor/websocket-server/case-registry.cjs +93 -0
- package/server/piecemaker/vendor/websocket-server/claude-assets.cjs +338 -0
- package/server/piecemaker/vendor/websocket-server/claude-hooks.cjs +380 -0
- package/server/piecemaker/vendor/websocket-server/document-index.cjs +665 -0
- package/server/piecemaker/vendor/websocket-server/legal-forms.cjs +89 -0
- package/server/piecemaker/vendor/websocket-server/lib/doc-generate.cjs +229 -0
- package/server/piecemaker/vendor/websocket-server/lib/export-render.cjs +440 -0
- package/server/piecemaker/vendor/websocket-server/lib/office-to-pdf.cjs +306 -0
- package/server/piecemaker/vendor/websocket-server/lib/stamping.cjs +39 -0
- package/server/piecemaker/vendor/websocket-server/originals-pipeline.cjs +1150 -0
- package/server/piecemaker/vendor/websocket-server/scripts/ADDRESS_ANONYMIZATION.md +216 -0
- package/server/piecemaker/vendor/websocket-server/scripts/DEDUPLICATION_CHANGES.md +134 -0
- package/server/piecemaker/vendor/websocket-server/scripts/GLINER2_README.md +138 -0
- package/server/piecemaker/vendor/websocket-server/scripts/__pycache__/scan_utils.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/convert_and_scan_pipeline.py +1968 -0
- package/server/piecemaker/vendor/websocket-server/scripts/mineru_improved_1.py +208 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/AUDIT_PERF_QUALITE.md +246 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/MODELE_COREML.md +62 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/__pycache__/coreml_runtime.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/__pycache__/model_config.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/build_coreml.py +118 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/coreml_runtime.py +164 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/model_config.py +63 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/presidio-gliner.py +479 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/scanner_worker.py +668 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__init__.py +10 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/__init__.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/analysis_explanation.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/entity_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/local_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/pattern.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/pattern_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/recognizer_result.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/analysis_explanation.py +65 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/entity_recognizer.py +213 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/__init__.py +21 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/language_validation.py +18 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/schemas.py +132 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/yaml_recognizer_models.py +422 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/local_recognizer.py +7 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__init__.py +15 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/__init__.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/device_detector.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/ner_model_configuration.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/nlp_artifacts.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/nlp_engine.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/spacy_nlp_engine.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/device_detector.py +65 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/ner_model_configuration.py +128 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/nlp_artifacts.py +88 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/nlp_engine.py +65 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/nlp_engine_provider.py +114 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/spacy_nlp_engine.py +290 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/pattern.py +66 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/pattern_recognizer.py +297 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/__init__.py +4 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/__pycache__/__init__.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/__pycache__/gliner_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__init__.py +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/__init__.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/credit_card_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/crypto_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/email_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/iban_patterns.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/iban_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/ip_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/mac_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/url_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/credit_card_recognizer.py +82 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/crypto_recognizer.py +141 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/date_recognizer.py +102 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/email_recognizer.py +48 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/iban_patterns.py +173 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/iban_recognizer.py +221 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/ip_recognizer.py +65 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/mac_recognizer.py +73 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/url_recognizer.py +50 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/gliner_recognizer.py +218 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/spacy_recognizer.py +139 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/recognizer_result.py +188 -0
- package/server/piecemaker/vendor/websocket-server/scripts/requirements.txt +29 -0
- package/server/piecemaker/vendor/websocket-server/scripts/scan_utils.py +469 -0
- package/server/piecemaker/vendor/websocket-server/scripts/smart_converter.py +366 -0
- package/server/piecemaker/vendor/websocket-server/scripts/warmup.py +464 -0
- package/server/piecemaker/vendor/websocket-server/stamping-routes.cjs +334 -0
- package/server/piecemaker/vendor/websocket-server/telegram-admin.cjs +602 -0
- package/server/piecemaker/vendor/websocket-server/workspace-paths.cjs +22 -0
- package/server/shared/claude-cli-path.ts +157 -0
- package/server/shared/frontmatter.ts +18 -0
- package/server/shared/image-attachments.ts +437 -0
- package/server/shared/index.ts +3 -0
- package/server/shared/interfaces.ts +241 -0
- package/server/shared/message-unification.ts +449 -0
- package/server/shared/tests/application-data-root.test.ts +29 -0
- package/server/shared/tests/claude-cli-path.test.ts +118 -0
- package/server/shared/tests/image-attachments.test.ts +353 -0
- package/server/shared/tests/message-unification.test.ts +218 -0
- package/server/shared/tests/slice-tail-page.test.ts +42 -0
- package/server/shared/types.ts +1354 -0
- package/server/shared/utils.ts +1212 -0
- package/server/tsconfig.json +40 -0
- package/shared/networkHosts.js +22 -0
- 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
|
+
};
|