@piecemaker-legal/piecemaker 2.0.9 → 2.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/assets/FindReplaceDialog-KU5TEIBJ-BucOHLdm.js +1 -0
  2. package/dist/assets/FootnotePropertiesDialog-W3YHM4BV-D5UqbelV.js +1 -0
  3. package/dist/assets/HyperlinkDialog-ZYH7ZHRF-8yEhLigd.js +144 -0
  4. package/dist/assets/HyperlinkDialog-ZYH7ZHRF-qIPBOssF.css +1 -0
  5. package/dist/assets/ImagePositionDialog-HEWYR6Q3-wGIBYxCm.js +1 -0
  6. package/dist/assets/ImagePropertiesDialog-RAB47C6M-D86PckZ2.js +1 -0
  7. package/dist/assets/PageSetupDialog-AIGIXO3E-DLETP-7v.js +1 -0
  8. package/dist/assets/SplitCellDialog-IFBKYCD6-CwdQBXeb.js +1 -0
  9. package/dist/assets/TablePropertiesDialog-TMLKGOOW-j2nA7KJs.js +1 -0
  10. package/dist/assets/WatermarkDialog-KRL7WMIS-XFJ9gTkC.js +1 -0
  11. package/dist/assets/{abnfDiagram-VCTEODGH-WrsSAHOe.js → abnfDiagram-VCTEODGH-DiCrND_Y.js} +1 -1
  12. package/dist/assets/arc-DOjgbMYz.js +1 -0
  13. package/dist/assets/architectureDiagram-5GKGNRK7-brzIFVhl.js +36 -0
  14. package/dist/assets/{blockDiagram-I7D4REHJ-zGMnF7Ox.js → blockDiagram-I7D4REHJ-C8JhTjQQ.js} +1 -1
  15. package/dist/assets/{c4Diagram-7LVT6UL2-ClWw3bqt.js → c4Diagram-7LVT6UL2-jfYxccyk.js} +1 -1
  16. package/dist/assets/channel-Dajzu2W1.js +1 -0
  17. package/dist/assets/{chunk-2Q5K7J3B-C-9ICPHv.js → chunk-2Q5K7J3B-CrlEShp9.js} +1 -1
  18. package/dist/assets/{chunk-5VM5RSS4-Bawy3teT.js → chunk-5VM5RSS4-DzPlUHGq.js} +1 -1
  19. package/dist/assets/{chunk-F27PBJKO-DQ375RQO.js → chunk-F27PBJKO-Cp9cpeWU.js} +1 -1
  20. package/dist/assets/{chunk-IMKFNOWR-CflNF2f6.js → chunk-IMKFNOWR-BifUldEN.js} +1 -1
  21. package/dist/assets/{chunk-JWPE2WC7-CIXQv0gc.js → chunk-JWPE2WC7-ggPEIkWu.js} +1 -1
  22. package/dist/assets/{chunk-POPQ4Y6H-Cza5j6Qw.js → chunk-POPQ4Y6H-3h_nayRX.js} +1 -1
  23. package/dist/assets/{chunk-SVP7TREG-GQ_VvWZR.js → chunk-SVP7TREG-CH29aG6J.js} +1 -1
  24. package/dist/assets/{chunk-TICWLB2K-BEmU16W5.js → chunk-TICWLB2K-PluJUM5k.js} +1 -1
  25. package/dist/assets/{chunk-XXDRQBXY-C1KpkLYH.js → chunk-XXDRQBXY-DXU39Vwg.js} +1 -1
  26. package/dist/assets/classDiagram-ZZMXUADV-dDEP_giv.js +1 -0
  27. package/dist/assets/classDiagram-v2-VYDZK3BY-dDEP_giv.js +1 -0
  28. package/dist/assets/{cose-bilkent-JH36ORCC-CZE48TRG.js → cose-bilkent-JH36ORCC-Dz6roYrN.js} +1 -1
  29. package/dist/assets/{cynefin-OW5HDTMX-L-tx1eC-.js → cynefin-OW5HDTMX-BLzrpSit.js} +1 -1
  30. package/dist/assets/{cynefinDiagram-5FMLGOSQ-Coa8oJwR.js → cynefinDiagram-5FMLGOSQ-kfxnERDZ.js} +1 -1
  31. package/dist/assets/{dagre-GXQ25YYZ-Bu_3Y75K.js → dagre-GXQ25YYZ-DP57bp-N.js} +1 -1
  32. package/dist/assets/{diagram-S7CK7UJ4-CFiiV4es.js → diagram-S7CK7UJ4-DAlsrQVW.js} +1 -1
  33. package/dist/assets/{diagram-UQ7AKVKN-CCXheGAA.js → diagram-UQ7AKVKN-By5yrMer.js} +1 -1
  34. package/dist/assets/{diagram-VSXAHHWV-B70m4lr_.js → diagram-VSXAHHWV-Dx89kryN.js} +1 -1
  35. package/dist/assets/{diagram-VX7I27RA-CHkiMOVA.js → diagram-VX7I27RA-B9fARitZ.js} +1 -1
  36. package/dist/assets/{diagram-Z3DM3KII-_awpc4Bs.js → diagram-Z3DM3KII-DC15CEH1.js} +1 -1
  37. package/dist/assets/{ebnfDiagram-PWID7BFC-CZzjH86H.js → ebnfDiagram-PWID7BFC-BKQzghGF.js} +1 -1
  38. package/dist/assets/{erDiagram-RLTQ6QDP-9DgiHZg9.js → erDiagram-RLTQ6QDP-CPY6RM7G.js} +1 -1
  39. package/dist/assets/{flowDiagram-HODETNUW-DHY_503b.js → flowDiagram-HODETNUW-4dL4GJcf.js} +1 -1
  40. package/dist/assets/{ganttDiagram-EL5Y4UJY-DPiiYZ_l.js → ganttDiagram-EL5Y4UJY-D4-cVcfb.js} +1 -1
  41. package/dist/assets/{gitGraphDiagram-WWUBYQGX-Ddd_evm7.js → gitGraphDiagram-WWUBYQGX-BMeVIEiX.js} +1 -1
  42. package/dist/assets/{index-tibHq7Qp.js → index-DNtFDOni.js} +140 -140
  43. package/dist/assets/index-Dc9wNuS4.css +1 -0
  44. package/dist/assets/{infoDiagram-27XIBGKW-BPRNhfwb.js → infoDiagram-27XIBGKW-D5qMSUEU.js} +1 -1
  45. package/dist/assets/{ishikawaDiagram-5VMMS53U-BXx6aqkq.js → ishikawaDiagram-5VMMS53U-BDnyKRHm.js} +1 -1
  46. package/dist/assets/{journeyDiagram-3NMN7TZE-BK8TZM29.js → journeyDiagram-3NMN7TZE-dGz5ZGzq.js} +1 -1
  47. package/dist/assets/{kanban-definition-UXKFOSKX-CHioRmxz.js → kanban-definition-UXKFOSKX-D7UAz7o_.js} +6 -6
  48. package/dist/assets/layout-DKrmEGrz.js +1 -0
  49. package/dist/assets/{linear-CTEhUcKG.js → linear-CrTdMY-p.js} +1 -1
  50. package/dist/assets/{mermaid.core-DYUb_UUB.js → mermaid.core-CXQOT5G6.js} +7 -7
  51. package/dist/assets/{mindmap-definition-YA3MSWOX-D7ODZ4oS.js → mindmap-definition-YA3MSWOX-VgEiYfay.js} +1 -1
  52. package/dist/assets/{pegDiagram-XKGWAZYB-8J-_2_kw.js → pegDiagram-XKGWAZYB-9IqT8gGx.js} +1 -1
  53. package/dist/assets/{pieDiagram-E7YTZNPT-ebg0yfMi.js → pieDiagram-E7YTZNPT-D98pRE-t.js} +1 -1
  54. package/dist/assets/processTemplate-GPFDLQMX-B1sVV2O0.js +22 -0
  55. package/dist/assets/{quadrantDiagram-AXDQQJYC-BoWkDiFb.js → quadrantDiagram-AXDQQJYC-b9PwkYzL.js} +1 -1
  56. package/dist/assets/{railroadDiagram-O6MQD6OU-BRJ77ldz.js → railroadDiagram-O6MQD6OU-Dz87hsPE.js} +1 -1
  57. package/dist/assets/{requirementDiagram-BXWQKSXE-Z0JJgktA.js → requirementDiagram-BXWQKSXE-CkcV73dK.js} +1 -1
  58. package/dist/assets/sankeyDiagram-P5KCCOFB-UBN31Yrs.js +40 -0
  59. package/dist/assets/{sequenceDiagram-WJ2MYXX4-BPAjtXwp.js → sequenceDiagram-WJ2MYXX4-CpQxd5Za.js} +1 -1
  60. package/dist/assets/{server.browser-BzI1jrZw.js → server.browser-BY3bL-IX.js} +1 -1
  61. package/dist/assets/{sizeCapture-INFHLROL-BGZPCzM4.js → sizeCapture-INFHLROL-mCsFmyzw.js} +1 -1
  62. package/dist/assets/stateDiagram-D77RDMKH-B0MTBN-3.js +1 -0
  63. package/dist/assets/stateDiagram-v2-MP3YSRHH-DzBPN39W.js +1 -0
  64. package/dist/assets/{swimlanes-42K2YHIH-DvuB15qF.js → swimlanes-42K2YHIH-Dzydjm0e.js} +1 -1
  65. package/dist/assets/swimlanesDiagram-VR7AAH4N-BXQpbUMD.js +8 -0
  66. package/dist/assets/{timeline-definition-24CTP7MA-ZIziYCIF.js → timeline-definition-24CTP7MA-Dz0toOLu.js} +3 -3
  67. package/dist/assets/{vendor-codemirror-CjW0lHR5.js → vendor-codemirror-CN-sJePf.js} +2 -2
  68. package/dist/assets/{vendor-react-D809iwXR.js → vendor-react-B22wqN3J.js} +5 -5
  69. package/dist/assets/{vennDiagram-4TSXK5OY-C5_B9gWa.js → vennDiagram-4TSXK5OY-DOWp7dkf.js} +4 -4
  70. package/dist/assets/{wardleyDiagram-VM6X3IG4-DMlH9Afw.js → wardleyDiagram-VM6X3IG4-CUxsztUB.js} +1 -1
  71. package/dist/assets/{xychartDiagram-S5SC5T6Z-BldhJt7i.js → xychartDiagram-S5SC5T6Z-DS96vNED.js} +1 -1
  72. package/dist/index.html +4 -4
  73. package/dist/sw.js +1 -1
  74. package/dist-server/server/modules/providers/list/mistral/mistral-models.provider.js +4 -53
  75. package/dist-server/server/modules/providers/list/mistral/mistral-models.provider.js.map +1 -1
  76. package/dist-server/server/modules/providers/list/mistral/mistral-runtime.provider.js +2 -3
  77. package/dist-server/server/modules/providers/list/mistral/mistral-runtime.provider.js.map +1 -1
  78. package/dist-server/server/modules/providers/list/mistral/mistral-vibe-models.js +30 -0
  79. package/dist-server/server/modules/providers/list/mistral/mistral-vibe-models.js.map +1 -0
  80. package/dist-server/server/modules/providers/tests/mistral-vibe-models.test.js +24 -0
  81. package/dist-server/server/modules/providers/tests/mistral-vibe-models.test.js.map +1 -0
  82. package/dist-server/server/piecemaker/agent-instructions.js +148 -0
  83. package/dist-server/server/piecemaker/agent-instructions.js.map +1 -0
  84. package/dist-server/server/piecemaker/anonymizer/lifecycle.js +2 -3
  85. package/dist-server/server/piecemaker/anonymizer/lifecycle.js.map +1 -1
  86. package/dist-server/server/piecemaker/docx-document.js +50 -0
  87. package/dist-server/server/piecemaker/docx-document.js.map +1 -0
  88. package/dist-server/server/piecemaker/index.js +13 -2
  89. package/dist-server/server/piecemaker/index.js.map +1 -1
  90. package/dist-server/server/piecemaker/model-discovery/codex-catalog.js +46 -0
  91. package/dist-server/server/piecemaker/model-discovery/codex-catalog.js.map +1 -0
  92. package/dist-server/server/piecemaker/model-discovery/index.js +42 -0
  93. package/dist-server/server/piecemaker/model-discovery/index.js.map +1 -0
  94. package/dist-server/server/piecemaker/model-discovery/mistral-catalog.js +19 -0
  95. package/dist-server/server/piecemaker/model-discovery/mistral-catalog.js.map +1 -0
  96. package/dist-server/server/piecemaker/model-discovery/stdio-rpc.js +61 -0
  97. package/dist-server/server/piecemaker/model-discovery/stdio-rpc.js.map +1 -0
  98. package/dist-server/server/piecemaker/project-registry.js +29 -0
  99. package/dist-server/server/piecemaker/project-registry.js.map +1 -0
  100. package/package.json +12 -1
  101. package/scripts/piecemaker/cli/disable-anonymizer.mjs +19 -0
  102. package/scripts/piecemaker/cli/lib/config.mjs +0 -1
  103. package/scripts/piecemaker/cli/lib/plugins.mjs +1 -0
  104. package/scripts/piecemaker/cli/lib/services.mjs +1 -10
  105. package/scripts/piecemaker/cli/piecemaker.mjs +0 -3
  106. package/server/modules/providers/list/mistral/mistral-models.provider.ts +4 -53
  107. package/server/modules/providers/list/mistral/mistral-runtime.provider.ts +2 -3
  108. package/server/modules/providers/list/mistral/mistral-vibe-models.ts +43 -0
  109. package/server/modules/providers/tests/mistral-vibe-models.test.ts +27 -0
  110. package/server/piecemaker/agent-instructions.ts +148 -0
  111. package/server/piecemaker/anonymizer/client-config.cjs +92 -92
  112. package/server/piecemaker/anonymizer/dictionary.cjs +34 -3
  113. package/server/piecemaker/anonymizer/hudsucker-fixture.cjs +9 -16
  114. package/server/piecemaker/anonymizer/hudsucker-proxy/Cargo.toml +1 -1
  115. package/server/piecemaker/anonymizer/hudsucker-proxy/src/main.rs +251 -268
  116. package/server/piecemaker/anonymizer/hudsucker-smoke.cjs +343 -0
  117. package/server/piecemaker/anonymizer/lifecycle.ts +2 -3
  118. package/server/piecemaker/anonymizer/rewriter-bridge.cjs +13 -4
  119. package/server/piecemaker/anonymizer/rewriter-worker.cjs +85 -0
  120. package/server/piecemaker/anonymizer/service.cjs +109 -179
  121. package/server/piecemaker/anonymizer/sqlite-dictionary.cjs +12 -1
  122. package/server/piecemaker/docx-document.ts +54 -0
  123. package/server/piecemaker/harness/decisions.cjs +1 -1
  124. package/server/piecemaker/harness/index.cjs +2 -3
  125. package/server/piecemaker/harness/verification.cjs +1 -1
  126. package/server/piecemaker/index.ts +15 -3
  127. package/server/piecemaker/model-discovery/codex-catalog.ts +67 -0
  128. package/server/piecemaker/model-discovery/index.ts +69 -0
  129. package/server/piecemaker/model-discovery/mistral-catalog.ts +36 -0
  130. package/server/piecemaker/model-discovery/stdio-rpc.ts +79 -0
  131. package/server/piecemaker/project-registry.ts +34 -0
  132. package/server/piecemaker/router.cjs +6 -8
  133. package/server/piecemaker/vendor/installer/bin/piecemaker.mjs +31 -77
  134. package/server/piecemaker/vendor/installer/lib/codex-skills.mjs +2 -84
  135. package/server/piecemaker/vendor/installer/lib/service.mjs +4 -24
  136. package/server/piecemaker/vendor/installer/steps/02-dependances-node.mjs +5 -5
  137. package/server/piecemaker/vendor/installer/steps/06-hooks.mjs +10 -21
  138. package/server/piecemaker/vendor/installer/steps/09-claude-assets.mjs +0 -11
  139. package/server/piecemaker/vendor/installer/steps/09-codex-plugin.mjs +6 -36
  140. package/server/piecemaker/vendor/installer/steps/13-garde-secrets.mjs +30 -12
  141. package/server/piecemaker/vendor/piecemaker-plugin/README.md +2 -9
  142. package/server/piecemaker/vendor/piecemaker-plugin/scripts/billing-track.mjs +5 -5
  143. package/server/piecemaker/vendor/piecemaker-plugin/scripts/classify-ai-documents.mjs +8 -8
  144. package/server/piecemaker/vendor/piecemaker-plugin/scripts/commit-track.mjs +2 -2
  145. package/server/piecemaker/vendor/piecemaker-plugin/scripts/compile-recherche.mjs +4 -6
  146. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folder-structure.cjs +2 -90
  147. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folders.cjs +71 -38
  148. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.cjs +8 -38
  149. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/protection.cjs +82 -61
  150. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/substitution.cjs +189 -41
  151. package/server/piecemaker/vendor/piecemaker-plugin/scripts/protect-originals.mjs +4 -55
  152. package/server/piecemaker/vendor/piecemaker-plugin/scripts/statusline.mjs +24 -117
  153. package/server/piecemaker/vendor/piecemaker-plugin/skills/ajout-de-fonctionnalites/SKILL.md +4 -18
  154. package/server/piecemaker/vendor/piecemaker-plugin/skills/tamponnage/SKILL.md +2 -2
  155. package/server/piecemaker/vendor/websocket-server/admin-routes.cjs +14 -148
  156. package/server/piecemaker/vendor/websocket-server/case-registry.cjs +16 -42
  157. package/server/piecemaker/vendor/websocket-server/claude-hooks.cjs +0 -73
  158. package/server/piecemaker/vendor/websocket-server/originals-pipeline.cjs +0 -7
  159. package/server/piecemaker/vendor/websocket-server/stamping-routes.cjs +3 -12
  160. package/server/piecemaker/vendor/websocket-server/workspace-paths.cjs +6 -6
  161. package/dist/assets/arc-DAA6wH-C.js +0 -1
  162. package/dist/assets/architectureDiagram-5GKGNRK7-BGNHr7ef.js +0 -36
  163. package/dist/assets/channel-BAQyfMll.js +0 -1
  164. package/dist/assets/classDiagram-ZZMXUADV-BNGCuvrR.js +0 -1
  165. package/dist/assets/classDiagram-v2-VYDZK3BY-BNGCuvrR.js +0 -1
  166. package/dist/assets/index-WwknP0l4.css +0 -1
  167. package/dist/assets/layout-DEnkyfTY.js +0 -1
  168. package/dist/assets/sankeyDiagram-P5KCCOFB-4PW5HTOP.js +0 -40
  169. package/dist/assets/stateDiagram-D77RDMKH-o-vEcKwz.js +0 -1
  170. package/dist/assets/stateDiagram-v2-MP3YSRHH-BsuDaKkN.js +0 -1
  171. package/dist/assets/swimlanesDiagram-VR7AAH4N-DcCAyKlT.js +0 -8
  172. package/scripts/piecemaker/cli/lib/piecemaker-anonymizer.mjs +0 -78
  173. package/scripts/piecemaker/hooks/proxy-guard.mjs +0 -251
  174. package/server/piecemaker/anonymizer/providers.cjs +0 -120
  175. package/server/piecemaker/vendor/installer/steps/08-telegram.mjs +0 -482
  176. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/central-mapping.cjs +0 -0
  177. package/server/piecemaker/vendor/websocket-server/telegram-admin.cjs +0 -602
@@ -5,9 +5,8 @@ const crypto = require('node:crypto');
5
5
  const { spawn, spawnSync } = require('child_process');
6
6
  const { performance } = require('node:perf_hooks');
7
7
  const {
8
- listConfiguredCases,
9
- readRegistryConfig,
10
- registerCaseFolder,
8
+ listProjectCases,
9
+ projectCaseEntry,
11
10
  resolveCaseReference,
12
11
  validateSelectedCaseFolder,
13
12
  } = require('./case-registry.cjs');
@@ -67,19 +66,6 @@ const {
67
66
  unregisterClaudeAsset,
68
67
  } = require('./claude-assets.cjs');
69
68
  const { claudeHooksStatus } = require('./claude-hooks.cjs');
70
- const {
71
- controlDossierBot,
72
- controlTelegram,
73
- getTelegramState,
74
- saveDossierBot,
75
- saveTelegramConfig,
76
- } = require('./telegram-admin.cjs');
77
- const {
78
- DEFAULT_CASE_FOLDER_STRUCTURE,
79
- configuredCaseFolderStructure,
80
- ensureCaseFolderStructure,
81
- normalizeCaseFolderStructure,
82
- } = require('./case-folder-structure.cjs');
83
69
 
84
70
  const MAX_MARKDOWN_BYTES = 1024 * 1024;
85
71
  const SECRET_KEYS = new Set([
@@ -104,14 +90,13 @@ function validateNewCaseName(value) {
104
90
  return name;
105
91
  }
106
92
 
107
- async function createLegalCase({ casesRoot, homeDir, name, config = {} }) {
93
+ async function createLegalCase({ casesRoot, homeDir, name }) {
108
94
  const root = resolveCasesRoot(casesRoot);
109
95
  const safeName = validateNewCaseName(name);
110
96
  const directory = path.join(root, safeName);
111
97
  if (fs.existsSync(directory)) throw new Error(`Le dossier juridique « ${safeName} » existe déjà.`);
112
98
  fs.mkdirSync(directory);
113
99
  try {
114
- const structure = ensureCaseFolderStructure(directory, config);
115
100
  writeProtection(directory, { unprotected: [] });
116
101
  const mapping = writeCaseMapping(directory, { mapping: {}, reverse_mapping: {} });
117
102
  await createCommit({
@@ -127,7 +112,6 @@ async function createLegalCase({ casesRoot, homeDir, name, config = {} }) {
127
112
  });
128
113
  const folder = await caseOverview(root, homeDir, safeName);
129
114
  folder.branches = await historyBranches(root, homeDir, safeName);
130
- folder.structure = structure;
131
115
  return folder;
132
116
  } catch (error) {
133
117
  fs.rmSync(directory, { recursive: true, force: true });
@@ -204,12 +188,11 @@ async function selectLocalFolder(platform = process.platform, initialFolder = os
204
188
 
205
189
  async function registerLegalCase({
206
190
  folder,
207
- configFile,
208
191
  homeDir,
209
192
  } = {}) {
210
193
  const root = validateSelectedCaseFolder(folder);
211
- const previous = readRegistryConfig(configFile);
212
- const structure = ensureCaseFolderStructure(root, previous);
194
+ const entry = projectCaseEntry(root);
195
+ if (!entry) throw new Error('Ce dossier n’est pas un projet enregistré.');
213
196
  const protection = readProtection(root);
214
197
  if (!protection.exists) writeProtection(root, { unprotected: [] });
215
198
  const currentMapping = readCaseMapping(root);
@@ -217,11 +200,8 @@ async function registerLegalCase({
217
200
  ? currentMapping
218
201
  : writeCaseMapping(root, { mapping: {}, reverse_mapping: {} });
219
202
 
220
- const registered = registerCaseFolder(previous, root);
221
- atomicWrite(configFile, `${JSON.stringify(registered.config, null, 2)}\n`);
222
-
223
203
  const folderOverview = await caseOverview(path.dirname(root), homeDir, path.basename(root));
224
- folderOverview.path = registered.entry.id;
204
+ folderOverview.path = entry.id;
225
205
  folderOverview.location = root;
226
206
  folderOverview.registered = true;
227
207
  folderOverview.branches = await historyBranches(path.dirname(root), homeDir, path.basename(root));
@@ -230,27 +210,17 @@ async function registerLegalCase({
230
210
  installed: {
231
211
  mapping: path.relative(root, mapping.file).split(path.sep).join('/'),
232
212
  protection: path.relative(root, protection.file).split(path.sep).join('/'),
233
- structure: structure.directories,
234
213
  },
235
214
  };
236
215
  }
237
216
 
238
217
  function defaultConfig(repoRoot, homeDir = path.join(os.homedir(), '.piecemaker')) {
239
218
  return {
240
- port: 43098,
241
219
  pythonPath: null,
242
220
  venvPath: path.join(homeDir, 'venv'),
243
- adminTheme: 'light',
244
- caseFolderStructure: { ...DEFAULT_CASE_FOLDER_STRUCTURE },
245
221
  };
246
222
  }
247
223
 
248
- function validateAdminTheme(value) {
249
- const theme = String(value || '');
250
- if (theme !== 'light' && theme !== 'dark') throw new Error('Le thème doit être « light » ou « dark ».');
251
- return theme;
252
- }
253
-
254
224
  function readJson(file, fallback) {
255
225
  try {
256
226
  return fs.existsSync(file) ? JSON.parse(fs.readFileSync(file, 'utf8')) : fallback;
@@ -741,7 +711,6 @@ async function configurationOverview({ repoRoot, homeDir, userHome, getRuntimeSt
741
711
  },
742
712
  ];
743
713
  const models = await ollamaState(fetchImpl);
744
- const telegram = getTelegramState({ repoRoot, homeDir, userHome });
745
714
 
746
715
  // Moteurs Python locaux du venv — détection par présence de paquet, sans import
747
716
  // (importer gliner2/mineru chargerait des centaines de Mo à chaque appel).
@@ -777,22 +746,11 @@ async function configurationOverview({ repoRoot, homeDir, userHome, getRuntimeSt
777
746
  && glinerModelReady;
778
747
  const mineruReady = hasPackage('mineru') || hasPackage('magic_pdf')
779
748
  || fs.existsSync(path.join(venvDir, 'bin', 'mineru'));
780
- const folders = listConfiguredCases(readRegistryConfig(path.join(homeDir, 'config.json'))).map((entry) => {
781
- const bot = telegram.dossiers.find((candidate) => {
782
- try { return path.resolve(candidate.workdir) === path.resolve(entry.root); } catch { return false; }
783
- });
784
- return {
785
- id: entry.id,
786
- name: entry.name,
787
- path: entry.root,
788
- bot: bot ? {
789
- id: bot.id,
790
- name: bot.name,
791
- configured: Boolean(bot.linked),
792
- running: Boolean(bot.running),
793
- } : null,
794
- };
795
- });
749
+ const folders = listProjectCases().map((entry) => ({
750
+ id: entry.id,
751
+ name: entry.name,
752
+ path: entry.root,
753
+ }));
796
754
 
797
755
  return {
798
756
  components: {
@@ -845,22 +803,6 @@ async function configurationOverview({ repoRoot, homeDir, userHome, getRuntimeSt
845
803
  ? 'OCR local · PDF scannés et images'
846
804
  : 'Optionnel · non installé',
847
805
  },
848
- telegram: {
849
- name: 'Telegram',
850
- installed: true,
851
- optional: true,
852
- configured: Boolean(telegram.assistant.token.configured || telegram.monitor.token.configured),
853
- summary: (() => {
854
- const running = [telegram.assistant.running && 'Assistant', telegram.monitor.running && 'Surveillance'].filter(Boolean);
855
- if (running.length) return `${running.join(' + ')} en ligne`;
856
- if (telegram.assistant.token.configured || telegram.monitor.token.configured) return 'Configuré · arrêté';
857
- return 'Aucun bot configuré';
858
- })(),
859
- bots: [
860
- { name: telegram.assistant.name, role: 'Assistant', configured: Boolean(telegram.assistant.token.configured), running: Boolean(telegram.assistant.running) },
861
- { name: telegram.monitor.name, role: 'Surveillance', configured: Boolean(telegram.monitor.token.configured), running: Boolean(telegram.monitor.running) },
862
- ],
863
- },
864
806
  },
865
807
  models: {
866
808
  provider: 'Ollama',
@@ -1584,9 +1526,8 @@ function finishAdminTiming(res, metric, startedAt, details = {}) {
1584
1526
  // dans l'arborescence. Chaque dossier expose ses pièces originales — tout fichier
1585
1527
  // qui n'est ni `.md` ni `.json` —, identifiées par leur chemin relatif au dossier.
1586
1528
  async function listDossiers(repoRoot, homeDir) {
1587
- const config = readRegistryConfig(path.join(homeDir, 'config.json'));
1588
1529
  const dossiers = [];
1589
- for (const entry of listConfiguredCases(config)) {
1530
+ for (const entry of listProjectCases()) {
1590
1531
  let originals;
1591
1532
  try {
1592
1533
  originals = await listOriginals(entry.root);
@@ -2043,14 +1984,8 @@ function createAdminRouter({
2043
1984
  const router = express.Router();
2044
1985
  const configFile = path.join(homeDir, 'config.json');
2045
1986
  const envFile = path.join(repoRoot, '.env');
2046
- const registryConfig = () => readRegistryConfig(configFile);
2047
1987
  const selectedCase = (reference) => {
2048
- const config = registryConfig();
2049
- const legalCase = resolveCaseReference(config, reference);
2050
- // Migration idempotente des dossiers enregistrés avant l'introduction de
2051
- // l'arborescence métier. Le manifeste fige les noms utilisés par ce dossier.
2052
- ensureCaseFolderStructure(legalCase.root, config);
2053
- return legalCase;
1988
+ return resolveCaseReference(reference);
2054
1989
  };
2055
1990
 
2056
1991
  // Migration : l'identité de commit ne vivait que dans le `.env` du clone
@@ -2148,7 +2083,6 @@ function createAdminRouter({
2148
2083
 
2149
2084
  router.get('/settings', (req, res) => {
2150
2085
  const config = { ...defaultConfig(repoRoot, homeDir), ...readJson(configFile, {}) };
2151
- config.caseFolderStructure = configuredCaseFolderStructure(config);
2152
2086
  const env = readEnvFile(envFile);
2153
2087
  const publicEnv = {};
2154
2088
  const secrets = {};
@@ -2162,25 +2096,10 @@ function createAdminRouter({
2162
2096
  router.put('/settings', (req, res) => {
2163
2097
  try {
2164
2098
  const current = { ...defaultConfig(repoRoot, homeDir), ...readJson(configFile, {}) };
2165
- current.caseFolderStructure = configuredCaseFolderStructure(current);
2166
2099
  const patch = req.body?.config || {};
2167
2100
  const next = { ...current };
2168
2101
 
2169
- if (patch.port !== undefined) {
2170
- const port = Number(patch.port);
2171
- if (!Number.isInteger(port) || port < 1024 || port > 65535) throw new Error('Le port doit être compris entre 1024 et 65535.');
2172
- next.port = port;
2173
- }
2174
2102
  if (patch.pythonPath !== undefined) next.pythonPath = String(patch.pythonPath || '').trim() || null;
2175
- if (patch.adminTheme !== undefined) next.adminTheme = validateAdminTheme(patch.adminTheme);
2176
- if (patch.caseFolderStructure !== undefined) {
2177
- next.caseFolderStructure = normalizeCaseFolderStructure({
2178
- ...current.caseFolderStructure,
2179
- ...(patch.caseFolderStructure && typeof patch.caseFolderStructure === 'object'
2180
- ? patch.caseFolderStructure
2181
- : {}),
2182
- });
2183
- }
2184
2103
 
2185
2104
  // L'identité de commit est aussi mémorisée dans config.json : le hook
2186
2105
  // d'édition (lancé depuis le cache du plugin) ne peut pas lire le `.env`
@@ -2421,8 +2340,7 @@ function createAdminRouter({
2421
2340
  router.get('/repository', async (req, res) => {
2422
2341
  const startedAt = performance.now();
2423
2342
  try {
2424
- const config = registryConfig();
2425
- const entries = listConfiguredCases(config);
2343
+ const entries = listProjectCases();
2426
2344
  const overview = {
2427
2345
  name: 'PieceMaker',
2428
2346
  root: '',
@@ -2444,21 +2362,6 @@ function createAdminRouter({
2444
2362
  }
2445
2363
  });
2446
2364
 
2447
- router.post('/repository/cases', async (req, res) => {
2448
- try {
2449
- const selected = await pickFolder(process.platform, userHome);
2450
- if (!selected) return res.json({ ok: true, cancelled: true });
2451
- const result = await registerLegalCase({
2452
- folder: selected,
2453
- configFile,
2454
- homeDir,
2455
- });
2456
- res.status(201).json({ ok: true, ...result });
2457
- } catch (error) {
2458
- res.status(400).json({ error: error.message });
2459
- }
2460
- });
2461
-
2462
2365
  router.get('/repository/case', async (req, res) => {
2463
2366
  const startedAt = performance.now();
2464
2367
  try {
@@ -2980,42 +2883,6 @@ function createAdminRouter({
2980
2883
  }
2981
2884
  });
2982
2885
 
2983
- router.get('/telegram', (req, res) => {
2984
- res.json(getTelegramState({ repoRoot, homeDir, userHome }));
2985
- });
2986
-
2987
- router.put('/telegram', (req, res) => {
2988
- try {
2989
- res.json({ ok: true, ...saveTelegramConfig({ repoRoot, homeDir, userHome }, req.body) });
2990
- } catch (error) {
2991
- res.status(400).json({ error: error.message });
2992
- }
2993
- });
2994
-
2995
- router.post('/telegram/:role/:action', (req, res) => {
2996
- try {
2997
- res.json(controlTelegram({ repoRoot, homeDir, userHome }, req.params.role, req.params.action));
2998
- } catch (error) {
2999
- res.status(400).json({ error: error.message });
3000
- }
3001
- });
3002
-
3003
- router.put('/telegram/dossiers/:id', (req, res) => {
3004
- try {
3005
- res.json({ ok: true, dossier: saveDossierBot({ repoRoot, homeDir, userHome }, req.params.id, req.body) });
3006
- } catch (error) {
3007
- res.status(400).json({ error: error.message });
3008
- }
3009
- });
3010
-
3011
- router.post('/telegram/dossiers/:id/:action', (req, res) => {
3012
- try {
3013
- res.json(controlDossierBot({ repoRoot, homeDir, userHome }, req.params.id, req.params.action));
3014
- } catch (error) {
3015
- res.status(400).json({ error: error.message });
3016
- }
3017
- });
3018
-
3019
2886
  return router;
3020
2887
  }
3021
2888
 
@@ -3057,5 +2924,4 @@ module.exports = {
3057
2924
  saveManagedFile,
3058
2925
  selectLocalFolder,
3059
2926
  updateEnvFile,
3060
- validateAdminTheme,
3061
2927
  };
@@ -1,4 +1,4 @@
1
- /** Explicit legal-case folder registry used by the local admin and hooks. */
1
+ /** Legal-case registry: every CloudCLI project published by the server is a case. */
2
2
  const crypto = require('node:crypto');
3
3
  const fs = require('node:fs');
4
4
  const path = require('node:path');
@@ -6,27 +6,15 @@ const path = require('node:path');
6
6
  const {
7
7
  isTechnicalCaseDirectoryName,
8
8
  } = require('../piecemaker-plugin/scripts/lib/commits.cjs');
9
- const {
10
- configuredWatchPaths,
11
- registeredCaseFolders,
12
- } = require('../piecemaker-plugin/scripts/lib/case-folders.cjs');
13
-
14
- function readRegistryConfig(configFile) {
15
- try {
16
- const parsed = JSON.parse(fs.readFileSync(configFile, 'utf8'));
17
- return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
18
- } catch {
19
- return {};
20
- }
21
- }
9
+ const { registeredProjectFolders } = require('../piecemaker-plugin/scripts/lib/case-folders.cjs');
22
10
 
23
11
  function caseFolderId(folder) {
24
12
  const digest = crypto.createHash('sha256').update(path.resolve(folder)).digest('hex').slice(0, 20);
25
13
  return `folder-${digest}`;
26
14
  }
27
15
 
28
- function explicitEntries(config) {
29
- return registeredCaseFolders(config).map((root) => ({
16
+ function projectEntries() {
17
+ return registeredProjectFolders().map((root) => ({
30
18
  id: caseFolderId(root),
31
19
  name: path.basename(root),
32
20
  root,
@@ -36,22 +24,21 @@ function explicitEntries(config) {
36
24
  }));
37
25
  }
38
26
 
39
- /**
40
- * Admin index: only the explicitly registered legal-case folders. There is no
41
- * longer a workspace root whose immediate children are listed automatically —
42
- * a matter appears once it has been registered from the admin panel.
43
- */
44
- function listConfiguredCases(config) {
45
- return explicitEntries(config).sort((a, b) =>
27
+ function listProjectCases() {
28
+ return projectEntries().sort((a, b) =>
46
29
  a.name.localeCompare(b.name, 'fr') || a.root.localeCompare(b.root, 'fr'));
47
30
  }
48
31
 
49
- function resolveCaseReference(config, reference) {
32
+ function resolveCaseReference(reference) {
50
33
  const token = String(reference || '').trim();
51
34
  if (!token) throw new Error('Dossier juridique invalide.');
52
- const explicit = explicitEntries(config).find((entry) => entry.id === token);
53
- if (!explicit) throw new Error('Ce dossier juridique n’est pas enregistré.');
54
- return explicit;
35
+ const entry = projectEntries().find((candidate) => candidate.id === token);
36
+ if (!entry) throw new Error('Ce dossier juridique n’est pas un projet enregistré.');
37
+ return entry;
38
+ }
39
+
40
+ function projectCaseEntry(root) {
41
+ return projectEntries().find((entry) => entry.root === root) || null;
55
42
  }
56
43
 
57
44
  function validateSelectedCaseFolder(folder) {
@@ -71,23 +58,10 @@ function validateSelectedCaseFolder(folder) {
71
58
  return root;
72
59
  }
73
60
 
74
- function registerCaseFolder(config, folder) {
75
- const root = validateSelectedCaseFolder(folder);
76
- const existing = registeredCaseFolders(config);
77
- const caseFolders = [...new Set([...existing, root])];
78
- const next = { ...config, caseFolders };
79
- next.anonymization = {
80
- ...(config?.anonymization || {}),
81
- watchPaths: configuredWatchPaths(next),
82
- };
83
- return { config: next, entry: explicitEntries(next).find((item) => item.root === root) };
84
- }
85
-
86
61
  module.exports = {
87
62
  caseFolderId,
88
- listConfiguredCases,
89
- readRegistryConfig,
90
- registerCaseFolder,
63
+ listProjectCases,
64
+ projectCaseEntry,
91
65
  resolveCaseReference,
92
66
  validateSelectedCaseFolder,
93
67
  };
@@ -10,9 +10,6 @@
10
10
  const fs = require('fs');
11
11
  const path = require('path');
12
12
 
13
- /** Racine du dépôt git, quatre niveaux au-dessus de ce fichier vendorisé. */
14
- const GIT_REPO_ROOT = path.resolve(__dirname, '..', '..', '..', '..');
15
-
16
13
  const DEPRECATED_HOOKS = new Set([
17
14
  'anonymize-read.mjs',
18
15
  'deanonymize-write.mjs',
@@ -231,74 +228,6 @@ function installClaudeHooks(repoRoot, userHome) {
231
228
  return { ok: true, changed: changed || cleanup.changed, registered, settings: target, cleanup };
232
229
  }
233
230
 
234
- /**
235
- * Sentinelle SessionStart (proxy PII) — script unique, partagé avec Codex,
236
- * hors de piecemaker-plugin/ (voir scripts/piecemaker/hooks/proxy-guard.mjs).
237
- * Non sourcée depuis hooks.json : son placeholder ${CLAUDE_PLUGIN_ROOT} ne
238
- * peut pas désigner un script qui n'est délibérément pas vendorisé.
239
- */
240
- function sessionHookScriptPath() {
241
- return path.join(GIT_REPO_ROOT, 'scripts', 'piecemaker', 'hooks', 'proxy-guard.mjs');
242
- }
243
-
244
- function sessionHookCommand() {
245
- return `node "${sessionHookScriptPath().replaceAll('"', '\\"')}"`;
246
- }
247
-
248
- function isOwnSessionHook(hook) {
249
- const command = typeof hook?.command === 'string' ? hook.command : '';
250
- return command.includes('proxy-guard.mjs');
251
- }
252
-
253
- function claudeSessionHookStatus(userHome) {
254
- const target = settingsPath(userHome);
255
- const command = sessionHookCommand();
256
- if (!fs.existsSync(target)) return { ok: false, reason: 'settings-absent', command };
257
- const settings = readJson(target);
258
- if (!settings) return { ok: false, reason: 'settings-invalide', command };
259
- const groups = Array.isArray(settings.hooks?.SessionStart) ? settings.hooks.SessionStart : [];
260
- const managed = groups.flatMap((group) => Array.isArray(group?.hooks) ? group.hooks : []).filter(isOwnSessionHook);
261
- const exact = groups.some((group) => group?.matcher === 'startup|resume|clear'
262
- && Array.isArray(group.hooks)
263
- && group.hooks.some((hook) => hook?.type === 'command' && hook.command === command));
264
- return { ok: exact && managed.length === 1, reason: exact && managed.length === 1 ? '' : 'hook-absent-ou-perime', command };
265
- }
266
-
267
- /** Fusionne uniquement la sentinelle SessionStart ; tous les hooks personnels sont conservés. */
268
- function installClaudeSessionHook(userHome) {
269
- const target = settingsPath(userHome);
270
- const command = sessionHookCommand();
271
-
272
- let settings = {};
273
- if (fs.existsSync(target)) {
274
- settings = readJson(target);
275
- if (!settings) return { ok: false, changed: false, reason: 'settings-invalide', command, settings: target };
276
- }
277
- if (!settings.hooks || typeof settings.hooks !== 'object' || Array.isArray(settings.hooks)) settings.hooks = {};
278
-
279
- const groups = Array.isArray(settings.hooks.SessionStart) ? settings.hooks.SessionStart : [];
280
- const preserved = [];
281
- for (const group of groups) {
282
- if (!group || typeof group !== 'object' || Array.isArray(group)) {
283
- preserved.push(group);
284
- continue;
285
- }
286
- const hooks = Array.isArray(group.hooks) ? group.hooks.filter((hook) => !isOwnSessionHook(hook)) : [];
287
- if (hooks.length || !Array.isArray(group.hooks)) preserved.push({ ...group, hooks });
288
- }
289
-
290
- const status = claudeSessionHookStatus(userHome);
291
- if (status.ok) return { ok: true, changed: false, command, settings: target };
292
-
293
- settings.hooks.SessionStart = [...preserved, {
294
- matcher: 'startup|resume|clear',
295
- hooks: [{ type: 'command', command, timeout: 45 }],
296
- }];
297
- fs.mkdirSync(path.dirname(target), { recursive: true });
298
- fs.writeFileSync(target, `${JSON.stringify(settings, null, 2)}\n`, 'utf8');
299
- return { ok: true, changed: true, command, settings: target };
300
- }
301
-
302
231
  /**
303
232
  * statusLine Claude Code — même logique de matérialisation que les hooks,
304
233
  * mais pour une clé unique de settings.json (`statusLine`) plutôt qu'un
@@ -371,11 +300,9 @@ function installClaudeStatusLine(repoRoot, userHome) {
371
300
 
372
301
  module.exports = {
373
302
  claudeHooksStatus,
374
- claudeSessionHookStatus,
375
303
  claudeStatusLineStatus,
376
304
  directHookGroups,
377
305
  installClaudeHooks,
378
- installClaudeSessionHook,
379
306
  installClaudeStatusLine,
380
307
  removeDeprecatedHooks,
381
308
  settingsPath,
@@ -45,11 +45,6 @@ const {
45
45
  // Vocabulaire des sigles de sociétés (SA_1, SARL_1, PERS_MORALE_1…), miroir de
46
46
  // `_LEGAL_FORMS` (scan_utils.py) — sert à classer un code déjà attribué.
47
47
  const { isSocieteCode, societeCounterKey, detectCompanySigle, LEGAL_FORM_TOKENS } = require('./legal-forms.cjs');
48
- // À chaque enregistrement d'un mapping de dossier, le mapping central global est
49
- // reconstruit et dé-conflicté : c'est lui que le hook central applique à toute
50
- // lecture, dossier ou non. `syncCentralMapping` ne jette jamais — un central qui
51
- // échoue ne doit pas faire échouer la sauvegarde du dossier.
52
- const { syncCentralMapping } = require('../piecemaker-plugin/scripts/lib/central-mapping.cjs');
53
48
 
54
49
  const SCRIPTS_DIR = path.join(__dirname, 'scripts');
55
50
  const PIECEMAKER_HOME = path.join(os.homedir(), '.piecemaker');
@@ -154,8 +149,6 @@ function writeCaseMapping(caseRoot, document) {
154
149
  fs.unlinkSync(full);
155
150
  }
156
151
  }
157
- // Le mapping central reflète désormais ce dossier. Best-effort et jamais bloquant.
158
- try { syncCentralMapping(); } catch { /* le central ne doit pas bloquer une sauvegarde */ }
159
152
  return { file, exists: true, ignored: payload.ignored || [], ...payload };
160
153
  }
161
154
 
@@ -1,7 +1,7 @@
1
1
  // Routes tampon et tamponnage, extraites de `websocket-server/server.cjs` de
2
2
  // PieceMaker-Installer (endpoints /api/tampon/* et /api/stamping) pour être
3
3
  // montées sur le serveur CloudCLI. La logique est reprise telle quelle ; seules
4
- // les dépendances au module `server.cjs` (PIECEMAKER_HOME, readUserConfig,
4
+ // les dépendances au module `server.cjs` (PIECEMAKER_HOME,
5
5
  // readFileStripBOM) sont devenues des paramètres ou des fonctions locales.
6
6
  const fs = require('fs');
7
7
  const os = require('os');
@@ -13,7 +13,7 @@ const {
13
13
  stampDataUrl,
14
14
  stampedPiecesDirectory,
15
15
  } = require('./lib/stamping.cjs');
16
- const { isInside, resolveConfiguredLegalCaseFolder } = require('./workspace-paths.cjs');
16
+ const { isInside, resolveProjectCaseFolder } = require('./workspace-paths.cjs');
17
17
 
18
18
  const ORIGINALS_SUBFOLDER = 'pièces originales';
19
19
  const DOSSIER_FOLDERS_FILE = 'dossier_folders.json';
@@ -63,17 +63,8 @@ function createStampingRouter({ homeDir = path.join(os.homedir(), '.piecemaker')
63
63
  const express = require('express');
64
64
  const router = express.Router();
65
65
 
66
- const configPath = path.join(homeDir, 'config.json');
67
66
  const getSystemDataPath = (...segments) => path.join(homeDir, ...segments);
68
67
 
69
- const readUserConfig = () => {
70
- try {
71
- return fs.existsSync(configPath) ? JSON.parse(fs.readFileSync(configPath, 'utf8')) : {};
72
- } catch {
73
- return {};
74
- }
75
- };
76
-
77
68
  const readDossierFolders = () => {
78
69
  try {
79
70
  const file = getSystemDataPath(DOSSIER_FOLDERS_FILE);
@@ -85,7 +76,7 @@ function createStampingRouter({ homeDir = path.join(os.homedir(), '.piecemaker')
85
76
 
86
77
  const rememberDossierFolder = (documentId, folder) => {
87
78
  if (!documentId || !folder) throw new Error('documentId et dossier de travail requis.');
88
- const legalCase = resolveConfiguredLegalCaseFolder(readUserConfig(), folder);
79
+ const legalCase = resolveProjectCaseFolder(folder);
89
80
  const registry = readDossierFolders();
90
81
  if (registry[documentId] === legalCase) return legalCase;
91
82
  registry[documentId] = legalCase;
@@ -1,22 +1,22 @@
1
1
  const path = require('path');
2
- const { locateConfiguredCase } = require('../piecemaker-plugin/scripts/lib/case-folders.cjs');
2
+ const { locateProjectCase } = require('../piecemaker-plugin/scripts/lib/case-folders.cjs');
3
3
 
4
4
  function isInside(root, candidate) {
5
5
  const relative = path.relative(root, candidate);
6
6
  return relative !== '' && relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
7
7
  }
8
8
 
9
- /** Resolve a selected path to the registered legal-case folder that contains it. */
10
- function resolveConfiguredLegalCaseFolder(config, selectedFolder) {
9
+ /** Resolve a selected path to the project folder that contains it. */
10
+ function resolveProjectCaseFolder(selectedFolder) {
11
11
  if (!selectedFolder) throw new Error('Dossier de travail manquant.');
12
- const located = locateConfiguredCase(config || {}, selectedFolder);
12
+ const located = locateProjectCase(selectedFolder);
13
13
  if (!located) {
14
- throw new Error('Ce dossier de travail n’est pas enregistré dans PieceMaker. Ajoutez-le depuis le panneau d’administration.');
14
+ throw new Error('Ce dossier de travail n’est pas un projet PieceMaker. Ouvrez-le comme projet.');
15
15
  }
16
16
  return located.caseRoot;
17
17
  }
18
18
 
19
19
  module.exports = {
20
20
  isInside,
21
- resolveConfiguredLegalCaseFolder,
21
+ resolveProjectCaseFolder,
22
22
  };
@@ -1 +0,0 @@
1
- import{$ as ln,a0 as an,a1 as y,a2 as tn,a3 as G,a4 as q,a5 as _,a6 as un,a7 as rn,a8 as K,a9 as o,aa as z,ab as sn,ac as on,ad as fn}from"./mermaid.core-DYUb_UUB.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,B,a){var O=I-l,i=D-h,n=B-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function V(l,h,I,D,v,A,B){var a=l-I,O=h-D,i=(B?A:-A)/K(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,C=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*K(fn(0,T*T*R-P*P)),$=(P*g-m*S)/R,j=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=$-C,e=j-t,r=w-C,F=p-t;return x*x+e*e>r*r+F*F&&($=w,j=p),{cx:$,cy:j,x01:-n,y01:-d,x11:$*(v/T-1),y11:j*(v/T-1)}}function hn(){var l=cn,h=yn,I=z(0),D=null,v=gn,A=dn,B=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-an,c=A.apply(this,arguments)-an,C=un(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(C>tn-y)a.moveTo(s*G(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*G(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=C,S=C,$=B.apply(this,arguments)/2,j=$>y&&(D?+D.apply(this,arguments):K(u*u+s*s)),w=_(un(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if(j>y){var F=sn(j/u*q($)),L=sn(j/s*q($));(P-=F*2)>y?(F*=t?1:-1,R+=F,T-=F):(P=0,R=T=(f+c)/2),(S-=L*2)>y?(L*=t?1:-1,m+=L,g-=L):(S=0,m=g=(f+c)/2)}var H=s*G(m),J=s*q(m),M=u*G(T),N=u*q(T);if(w>y){var Q=s*G(g),U=s*q(g),W=u*G(R),X=u*q(R),E;if(C<rn)if(E=pn(H,J,W,X,Q,U,M,N)){var Y=H-E[0],Z=J-E[1],b=Q-E[0],k=U-E[1],nn=1/q(on((Y*b+Z*k)/(K(Y*Y+Z*Z)*K(b*b+k*k)))/2),en=K(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=V(W,X,H,J,s,x,t),r=V(Q,U,M,N,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(H,J),a.arc(0,0,s,m,g,!t)):a.moveTo(H,J),!(u>y)||!(P>y)?a.lineTo(M,N):p>y?(e=V(M,N,Q,U,u,-p,t),r=V(H,J,W,X,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-rn/2;return[G(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:z(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:z(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:z(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:z(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:z(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:z(+n),i):A},i.padAngle=function(n){return arguments.length?(B=typeof n=="function"?n:z(+n),i):B},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};