@piecemaker-legal/piecemaker 2.0.11 → 2.0.12

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 (120) hide show
  1. package/dist/assets/{FindReplaceDialog-KU5TEIBJ-BucOHLdm.js → FindReplaceDialog-KU5TEIBJ-BBxf1he7.js} +1 -1
  2. package/dist/assets/{FootnotePropertiesDialog-W3YHM4BV-D5UqbelV.js → FootnotePropertiesDialog-W3YHM4BV-BYqp6U4x.js} +1 -1
  3. package/dist/assets/{HyperlinkDialog-ZYH7ZHRF-8yEhLigd.js → HyperlinkDialog-ZYH7ZHRF-BVC9zOMs.js} +4 -4
  4. package/dist/assets/{ImagePositionDialog-HEWYR6Q3-wGIBYxCm.js → ImagePositionDialog-HEWYR6Q3-Xn2mC64y.js} +1 -1
  5. package/dist/assets/{ImagePropertiesDialog-RAB47C6M-D86PckZ2.js → ImagePropertiesDialog-RAB47C6M-CFcdqEif.js} +1 -1
  6. package/dist/assets/{PageSetupDialog-AIGIXO3E-DLETP-7v.js → PageSetupDialog-AIGIXO3E-DECaeRS9.js} +1 -1
  7. package/dist/assets/{SplitCellDialog-IFBKYCD6-CwdQBXeb.js → SplitCellDialog-IFBKYCD6-ByYa04H_.js} +1 -1
  8. package/dist/assets/{TablePropertiesDialog-TMLKGOOW-j2nA7KJs.js → TablePropertiesDialog-TMLKGOOW-BuyqZB5A.js} +1 -1
  9. package/dist/assets/{WatermarkDialog-KRL7WMIS-XFJ9gTkC.js → WatermarkDialog-KRL7WMIS-ByZ1Acr2.js} +1 -1
  10. package/dist/assets/{abnfDiagram-VCTEODGH-DiCrND_Y.js → abnfDiagram-VCTEODGH-BtttzdZA.js} +1 -1
  11. package/dist/assets/{arc-DOjgbMYz.js → arc-DN4m1tLs.js} +1 -1
  12. package/dist/assets/{architectureDiagram-5GKGNRK7-brzIFVhl.js → architectureDiagram-5GKGNRK7-Bt-zFumG.js} +1 -1
  13. package/dist/assets/{blockDiagram-I7D4REHJ-C8JhTjQQ.js → blockDiagram-I7D4REHJ-D14V8v4j.js} +1 -1
  14. package/dist/assets/{c4Diagram-7LVT6UL2-jfYxccyk.js → c4Diagram-7LVT6UL2-BynDo1-W.js} +1 -1
  15. package/dist/assets/channel-C4gJXzYa.js +1 -0
  16. package/dist/assets/{chunk-2Q5K7J3B-CrlEShp9.js → chunk-2Q5K7J3B-B8gKhSj9.js} +1 -1
  17. package/dist/assets/{chunk-5VM5RSS4-DzPlUHGq.js → chunk-5VM5RSS4-GvOpglRR.js} +1 -1
  18. package/dist/assets/{chunk-F27PBJKO-Cp9cpeWU.js → chunk-F27PBJKO-CAgZy0qc.js} +1 -1
  19. package/dist/assets/{chunk-IMKFNOWR-BifUldEN.js → chunk-IMKFNOWR-gf8Ux8Zd.js} +1 -1
  20. package/dist/assets/{chunk-JWPE2WC7-ggPEIkWu.js → chunk-JWPE2WC7-D4zFFRMp.js} +1 -1
  21. package/dist/assets/{chunk-POPQ4Y6H-3h_nayRX.js → chunk-POPQ4Y6H-Ct8X_LaT.js} +1 -1
  22. package/dist/assets/{chunk-SVP7TREG-CH29aG6J.js → chunk-SVP7TREG-g5iH1bs5.js} +1 -1
  23. package/dist/assets/{chunk-TICWLB2K-PluJUM5k.js → chunk-TICWLB2K-89-VFKTn.js} +1 -1
  24. package/dist/assets/{chunk-XXDRQBXY-DXU39Vwg.js → chunk-XXDRQBXY-CaQbdObb.js} +1 -1
  25. package/dist/assets/classDiagram-ZZMXUADV-Cm08FeYk.js +1 -0
  26. package/dist/assets/classDiagram-v2-VYDZK3BY-Cm08FeYk.js +1 -0
  27. package/dist/assets/{cose-bilkent-JH36ORCC-Dz6roYrN.js → cose-bilkent-JH36ORCC-BiYOGJAU.js} +1 -1
  28. package/dist/assets/{cynefin-OW5HDTMX-BLzrpSit.js → cynefin-OW5HDTMX-F6mJ-4tj.js} +1 -1
  29. package/dist/assets/{cynefinDiagram-5FMLGOSQ-kfxnERDZ.js → cynefinDiagram-5FMLGOSQ-q-Rggn6r.js} +1 -1
  30. package/dist/assets/{dagre-GXQ25YYZ-DP57bp-N.js → dagre-GXQ25YYZ-COqImSUH.js} +1 -1
  31. package/dist/assets/{diagram-S7CK7UJ4-DAlsrQVW.js → diagram-S7CK7UJ4-BAg1dyEc.js} +1 -1
  32. package/dist/assets/{diagram-UQ7AKVKN-By5yrMer.js → diagram-UQ7AKVKN-DFJS8qCV.js} +1 -1
  33. package/dist/assets/{diagram-VSXAHHWV-Dx89kryN.js → diagram-VSXAHHWV-BfldL35r.js} +1 -1
  34. package/dist/assets/{diagram-VX7I27RA-B9fARitZ.js → diagram-VX7I27RA-kLjovpYe.js} +1 -1
  35. package/dist/assets/{diagram-Z3DM3KII-DC15CEH1.js → diagram-Z3DM3KII-Dhwvi3Iu.js} +1 -1
  36. package/dist/assets/{ebnfDiagram-PWID7BFC-BKQzghGF.js → ebnfDiagram-PWID7BFC-Bp4YE1i7.js} +1 -1
  37. package/dist/assets/{erDiagram-RLTQ6QDP-CPY6RM7G.js → erDiagram-RLTQ6QDP-BKDdaSWz.js} +1 -1
  38. package/dist/assets/{flowDiagram-HODETNUW-4dL4GJcf.js → flowDiagram-HODETNUW-zHProVxL.js} +1 -1
  39. package/dist/assets/{ganttDiagram-EL5Y4UJY-D4-cVcfb.js → ganttDiagram-EL5Y4UJY-B-B-BI6j.js} +1 -1
  40. package/dist/assets/{gitGraphDiagram-WWUBYQGX-BMeVIEiX.js → gitGraphDiagram-WWUBYQGX-BTHMg5CH.js} +1 -1
  41. package/dist/assets/index-C5slQNvE.css +1 -0
  42. package/dist/assets/{index-DNtFDOni.js → index-CJP4dZ-c.js} +146 -146
  43. package/dist/assets/{infoDiagram-27XIBGKW-D5qMSUEU.js → infoDiagram-27XIBGKW-mabp4H9I.js} +1 -1
  44. package/dist/assets/{ishikawaDiagram-5VMMS53U-BDnyKRHm.js → ishikawaDiagram-5VMMS53U-CLNhcCrM.js} +1 -1
  45. package/dist/assets/{journeyDiagram-3NMN7TZE-dGz5ZGzq.js → journeyDiagram-3NMN7TZE-CGEi2RB6.js} +1 -1
  46. package/dist/assets/{kanban-definition-UXKFOSKX-D7UAz7o_.js → kanban-definition-UXKFOSKX-B2fLX1fK.js} +1 -1
  47. package/dist/assets/{layout-DKrmEGrz.js → layout-CloKWsFq.js} +1 -1
  48. package/dist/assets/{linear-CrTdMY-p.js → linear-BFyydI0c.js} +1 -1
  49. package/dist/assets/{mermaid.core-CXQOT5G6.js → mermaid.core-Dxl3LVAh.js} +6 -6
  50. package/dist/assets/{mindmap-definition-YA3MSWOX-VgEiYfay.js → mindmap-definition-YA3MSWOX-FT4pm55s.js} +1 -1
  51. package/dist/assets/{pegDiagram-XKGWAZYB-9IqT8gGx.js → pegDiagram-XKGWAZYB-okyIfJWM.js} +1 -1
  52. package/dist/assets/{pieDiagram-E7YTZNPT-D98pRE-t.js → pieDiagram-E7YTZNPT-NF61CQz8.js} +1 -1
  53. package/dist/assets/{quadrantDiagram-AXDQQJYC-b9PwkYzL.js → quadrantDiagram-AXDQQJYC-uVfvZzzt.js} +1 -1
  54. package/dist/assets/{railroadDiagram-O6MQD6OU-Dz87hsPE.js → railroadDiagram-O6MQD6OU-Dp8IpeoH.js} +1 -1
  55. package/dist/assets/{requirementDiagram-BXWQKSXE-CkcV73dK.js → requirementDiagram-BXWQKSXE-D8VV0oQe.js} +1 -1
  56. package/dist/assets/{sankeyDiagram-P5KCCOFB-UBN31Yrs.js → sankeyDiagram-P5KCCOFB-D-xhxjob.js} +1 -1
  57. package/dist/assets/{sequenceDiagram-WJ2MYXX4-CpQxd5Za.js → sequenceDiagram-WJ2MYXX4-BAQBK95h.js} +1 -1
  58. package/dist/assets/{sizeCapture-INFHLROL-mCsFmyzw.js → sizeCapture-INFHLROL-C6rk9SVx.js} +1 -1
  59. package/dist/assets/{stateDiagram-D77RDMKH-B0MTBN-3.js → stateDiagram-D77RDMKH-DshqaEOj.js} +1 -1
  60. package/dist/assets/{stateDiagram-v2-MP3YSRHH-DzBPN39W.js → stateDiagram-v2-MP3YSRHH-BohZIrk5.js} +1 -1
  61. package/dist/assets/{swimlanes-42K2YHIH-Dzydjm0e.js → swimlanes-42K2YHIH-DgcPDy4l.js} +1 -1
  62. package/dist/assets/swimlanesDiagram-VR7AAH4N-CuM3Su0K.js +8 -0
  63. package/dist/assets/{timeline-definition-24CTP7MA-Dz0toOLu.js → timeline-definition-24CTP7MA-OgpIe-gQ.js} +1 -1
  64. package/dist/assets/{vennDiagram-4TSXK5OY-DOWp7dkf.js → vennDiagram-4TSXK5OY-BZzGd6jt.js} +1 -1
  65. package/dist/assets/{wardleyDiagram-VM6X3IG4-CUxsztUB.js → wardleyDiagram-VM6X3IG4-1tg-H7l_.js} +1 -1
  66. package/dist/assets/{xychartDiagram-S5SC5T6Z-DS96vNED.js → xychartDiagram-S5SC5T6Z-ByTsX8g0.js} +1 -1
  67. package/dist/index.html +2 -2
  68. package/dist/sw.js +1 -1
  69. package/dist-server/plugins/piecemaker-dossier/src/knowledge.js +61 -1
  70. package/dist-server/plugins/piecemaker-dossier/src/knowledge.js.map +1 -1
  71. package/dist-server/plugins/piecemaker-dossier/src/scan-result.js +0 -48
  72. package/dist-server/plugins/piecemaker-dossier/src/scan-result.js.map +1 -1
  73. package/dist-server/server/piecemaker/knowledge/pipeline.js +25 -29
  74. package/dist-server/server/piecemaker/knowledge/pipeline.js.map +1 -1
  75. package/dist-server/server/piecemaker/knowledge/service.js +1 -16
  76. package/dist-server/server/piecemaker/knowledge/service.js.map +1 -1
  77. package/dist-server/server/piecemaker/project-registry.js +5 -5
  78. package/dist-server/server/piecemaker/project-registry.js.map +1 -1
  79. package/package.json +1 -1
  80. package/server/piecemaker/anonymizer/hudsucker-fixture.cjs +1 -1
  81. package/server/piecemaker/anonymizer/hudsucker-proxy/src/main.rs +2 -1
  82. package/server/piecemaker/anonymizer/rewrite.cjs +2 -2
  83. package/server/piecemaker/anonymizer/service.cjs +3 -2
  84. package/server/piecemaker/anonymizer/sqlite-dictionary.cjs +3 -31
  85. package/server/piecemaker/index.ts +1 -1
  86. package/server/piecemaker/knowledge/pipeline.ts +24 -31
  87. package/server/piecemaker/knowledge/service.ts +1 -14
  88. package/server/piecemaker/project-registry.ts +6 -6
  89. package/server/piecemaker/vendor/installer/bin/piecemaker.mjs +9 -162
  90. package/server/piecemaker/vendor/installer/lib/commandes.mjs +1 -2
  91. package/server/piecemaker/vendor/installer/lib/conversion-client.mjs +62 -3
  92. package/server/piecemaker/vendor/installer/steps/06-hooks.mjs +23 -69
  93. package/server/piecemaker/vendor/installer/steps/12-mcp-piecemaker.mjs +3 -3
  94. package/server/piecemaker/vendor/mcp/README.md +1 -1
  95. package/server/piecemaker/vendor/mcp/piecemaker/server.mjs +12 -75
  96. package/server/piecemaker/vendor/piecemaker-plugin/hooks/hooks.json +0 -40
  97. package/server/piecemaker/vendor/piecemaker-plugin/scripts/compile-recherche.mjs +2 -2
  98. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folders.cjs +26 -7
  99. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/commits.cjs +0 -28
  100. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/hook-io.mjs +0 -13
  101. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/institutional-terms.cjs +3 -3
  102. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.cjs +10 -143
  103. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/protection.cjs +1 -1
  104. package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/session-timing.cjs +0 -65
  105. package/server/piecemaker/vendor/piecemaker-plugin/scripts/protect-originals.mjs +11 -2
  106. package/server/piecemaker/vendor/piecemaker-plugin/skills/conversion-md/SKILL.md +9 -5
  107. package/server/piecemaker/vendor/websocket-server/admin-routes.cjs +2 -150
  108. package/server/piecemaker/vendor/websocket-server/claude-hooks.cjs +3 -0
  109. package/server/piecemaker/vendor/websocket-server/originals-pipeline.cjs +23 -372
  110. package/server/piecemaker/vendor/websocket-server/renamed-originals.cjs +136 -0
  111. package/server/piecemaker/vendor/websocket-server/scripts/convert_and_scan_pipeline.py +115 -96
  112. package/dist/assets/channel-Dajzu2W1.js +0 -1
  113. package/dist/assets/classDiagram-ZZMXUADV-dDEP_giv.js +0 -1
  114. package/dist/assets/classDiagram-v2-VYDZK3BY-dDEP_giv.js +0 -1
  115. package/dist/assets/index-Dc9wNuS4.css +0 -1
  116. package/dist/assets/swimlanesDiagram-VR7AAH4N-BXQpbUMD.js +0 -8
  117. package/server/piecemaker/vendor/piecemaker-plugin/scripts/billing-track.mjs +0 -194
  118. package/server/piecemaker/vendor/piecemaker-plugin/scripts/commit-track.mjs +0 -71
  119. package/server/piecemaker/vendor/piecemaker-plugin/scripts/session-commit-worker.mjs +0 -260
  120. package/server/piecemaker/vendor/piecemaker-plugin/scripts/session-commit.mjs +0 -83
@@ -16,6 +16,10 @@
16
16
  * le skill `docx-cli` est disponible : il travaille par le binaire `docx`
17
17
  * (`docx read pièce.docx`, `docx find`…), qui contournerait entièrement un
18
18
  * garde-fou limité à Read/Grep/Glob.
19
+ *
20
+ * Le hook n'agit que dans un dossier au bouclier vert : anonymisation terminée
21
+ * (publiée par le serveur dans `~/.piecemaker/anonymized-projects.json`) et
22
+ * protection non levée. Ailleurs, il laisse tout passer.
19
23
  */
20
24
 
21
25
  import fs from 'node:fs';
@@ -27,6 +31,7 @@ const require = createRequire(import.meta.url);
27
31
  const { locateProjectCase } = require('./lib/case-folders.cjs');
28
32
  const {
29
33
  isMappingFile,
34
+ isProtectionBypassed,
30
35
  isSecretFile,
31
36
  isProtectedFile,
32
37
  markdownCounterpart,
@@ -153,6 +158,10 @@ function caseRootHasMapping(located) {
153
158
  }
154
159
  }
155
160
 
161
+ function shieldActive(located) {
162
+ return Boolean(located?.anonymized) && !isProtectionBypassed(located.caseRoot);
163
+ }
164
+
156
165
  async function main() {
157
166
  const payload = await readHookPayload(2000);
158
167
  if (!payload) return null;
@@ -163,7 +172,7 @@ async function main() {
163
172
  if (toolName === 'Bash') {
164
173
  for (const candidate of commandPaths(payload.tool_input?.command, cwd)) {
165
174
  const located = locateProjectCase(candidate);
166
- if (!located) continue;
175
+ if (!shieldActive(located)) continue;
167
176
  if (isMappingFile(candidate)) return deny(mappingReason(candidate));
168
177
  if (isSecretFile(candidate)) return deny(secretReason(candidate));
169
178
  if (isProtectedFile(candidate, located.caseRoot)) {
@@ -178,7 +187,7 @@ async function main() {
178
187
  const target = absolutePath(payload.tool_input?.file_path || payload.tool_input?.path, cwd);
179
188
  if (!target) return null;
180
189
  const located = locateProjectCase(target);
181
- if (!located) return null;
190
+ if (!shieldActive(located)) return null;
182
191
 
183
192
  // Un répertoire n'est pas une pièce : `Grep`/`Glob` en visent un couramment,
184
193
  // et c'est `isBroadCaseSearch` qui décide s'il est sûr de le parcourir.
@@ -46,12 +46,16 @@ Bridge (`taskpane/modules/python-bridge.js` →
46
46
 
47
47
  ## Enchaînement avec le scan PII
48
48
 
49
- Pour convertir puis scanner en un seul appel, utiliser
50
- `websocket-server/scripts/convert_and_scan_pipeline.py <file1> [file2 ...] -o <output_dir> [--engine ...] [--mode ...] [--lang ...]`,
51
- qui appelle `smart_converter.py` puis le worker
49
+ Le scan PII passe uniquement par PieceMaker (outil `conversion` du serveur MCP
50
+ `piecemaker`, ou le scan du dossier dans l'interface) : ne pas lancer
51
+ `websocket-server/scripts/convert_and_scan_pipeline.py` à la main. Ce script
52
+ appelle `smart_converter.py` puis le worker
52
53
  `websocket-server/scripts/presidio-gliner/scanner_worker.py` (GLiNER chargé
53
- une fois pour tout le lot). Sortie persistante : un Markdown par
54
- fichier et un unique `{output_dir}/mapping_default.json` cumulatif. Dans le
54
+ une fois pour tout le lot) ; il exige `--database` (les codes déjà attribués
55
+ par tous les dossiers y sont réservés), reçoit le mapping du dossier sur son
56
+ entrée standard et renvoie le mapping fusionné en lignes `MAPPING:` que
57
+ PieceMaker écrit en base. Aucun fichier de mapping n'est écrit. Sortie
58
+ persistante : un Markdown par fichier. Dans le
55
59
  pipeline d'administration d'un dossier, `-o` vise le sous-dossier
56
60
  `Fichiers convertis PieceMaker/` du dossier (racine réservée aux originaux) ;
57
61
  le manifeste technique caché `.piecemaker/anonymization-state.json` reste, lui, à
@@ -19,24 +19,16 @@ const {
19
19
  createHistoryBranch,
20
20
  historyBranches,
21
21
  historyMonths,
22
- isTechnicalCaseDirectoryName,
23
22
  listCases,
24
23
  listHistory,
25
24
  listHistoryPeriod,
26
- resolveCasesRoot,
27
25
  resolveCommitIdentity,
28
26
  restoreRevision,
29
27
  revisionDetails,
30
28
  safeCaseFiles,
31
29
  worktreeDetails,
32
30
  } = require('../piecemaker-plugin/scripts/lib/commits.cjs');
33
- const {
34
- listOriginals,
35
- readCaseMapping,
36
- rebuildCaseMapping,
37
- saveCaseMapping,
38
- writeCaseMapping,
39
- } = require('./originals-pipeline.cjs');
31
+ const { listOriginals } = require('./originals-pipeline.cjs');
40
32
  const { invalidateOriginals, listOriginalsCached } = require('../../originals-cache.cjs');
41
33
  const {
42
34
  documentKey,
@@ -81,44 +73,6 @@ const ENV_KEYS = new Set([
81
73
  'SMART_CONVERTER_PATH',
82
74
  ]);
83
75
 
84
- function validateNewCaseName(value) {
85
- const name = String(value || '').trim();
86
- if (!name || name.length > 120 || name === '.' || name === '..' || path.basename(name) !== name
87
- || name.startsWith('.') || /[\x00-\x1f\x7f]/.test(name) || isTechnicalCaseDirectoryName(name)) {
88
- throw new Error('Nom de dossier juridique invalide.');
89
- }
90
- return name;
91
- }
92
-
93
- async function createLegalCase({ casesRoot, homeDir, name }) {
94
- const root = resolveCasesRoot(casesRoot);
95
- const safeName = validateNewCaseName(name);
96
- const directory = path.join(root, safeName);
97
- if (fs.existsSync(directory)) throw new Error(`Le dossier juridique « ${safeName} » existe déjà.`);
98
- fs.mkdirSync(directory);
99
- try {
100
- writeProtection(directory, { unprotected: [] });
101
- const mapping = writeCaseMapping(directory, { mapping: {}, reverse_mapping: {} });
102
- await createCommit({
103
- casesRoot: root,
104
- caseName: safeName,
105
- homeDir,
106
- label: 'Création du dossier juridique',
107
- event: 'admin-case-create',
108
- // Le mapping vit dans le sous-dossier des fichiers produits : le commit doit
109
- // viser son chemin relatif au dossier, pas seulement son nom de base.
110
- paths: [path.relative(directory, mapping.file).split(path.sep).join('/')],
111
- waitForLockMs: 10_000,
112
- });
113
- const folder = await caseOverview(root, homeDir, safeName);
114
- folder.branches = await historyBranches(root, homeDir, safeName);
115
- return folder;
116
- } catch (error) {
117
- fs.rmSync(directory, { recursive: true, force: true });
118
- throw error;
119
- }
120
- }
121
-
122
76
  /** Native folder-picker commands. Arguments stay separate from the shell. */
123
77
  function folderPickerCommands(platform, initialFolder) {
124
78
  const start = path.resolve(initialFolder || os.homedir());
@@ -195,10 +149,6 @@ async function registerLegalCase({
195
149
  if (!entry) throw new Error('Ce dossier n’est pas un projet enregistré.');
196
150
  const protection = readProtection(root);
197
151
  if (!protection.exists) writeProtection(root, { unprotected: [] });
198
- const currentMapping = readCaseMapping(root);
199
- const mapping = currentMapping.exists
200
- ? currentMapping
201
- : writeCaseMapping(root, { mapping: {}, reverse_mapping: {} });
202
152
 
203
153
  const folderOverview = await caseOverview(path.dirname(root), homeDir, path.basename(root));
204
154
  folderOverview.path = entry.id;
@@ -208,7 +158,6 @@ async function registerLegalCase({
208
158
  return {
209
159
  folder: folderOverview,
210
160
  installed: {
211
- mapping: path.relative(root, mapping.file).split(path.sep).join('/'),
212
161
  protection: path.relative(root, protection.file).split(path.sep).join('/'),
213
162
  },
214
163
  };
@@ -688,8 +637,6 @@ async function configurationOverview({ repoRoot, homeDir, userHome, getRuntimeSt
688
637
  ].filter(Boolean);
689
638
  const hookFiles = [
690
639
  'protect-originals.mjs',
691
- 'commit-track.mjs',
692
- 'billing-track.mjs',
693
640
  ].map((name) => path.join(repoRoot, 'piecemaker-plugin', 'scripts', name));
694
641
  const hooksReady = hookFiles.every((file) => fs.existsSync(file))
695
642
  && fs.existsSync(path.join(repoRoot, 'piecemaker-plugin', 'hooks', 'hooks.json'));
@@ -2371,18 +2318,12 @@ function createAdminRouter({
2371
2318
  folder.location = legalCase.root;
2372
2319
  folder.registered = legalCase.registered;
2373
2320
  // Les Markdown convertis vivent déjà dans l'historique ; ce cadre ne
2374
- // présente que les pièces originales et un résumé non sensible du mapping.
2375
- const mapping = readCaseMapping(legalCase.root);
2321
+ // présente que les pièces originales.
2376
2322
  const [originals, branches] = await Promise.all([
2377
2323
  listOriginalsCached(legalCase.root),
2378
2324
  historyBranches(legalCase.casesRoot, homeDir, legalCase.caseName),
2379
2325
  ]);
2380
2326
  folder.originals = originals;
2381
- folder.mapping = {
2382
- exists: mapping.exists,
2383
- name: path.basename(mapping.file),
2384
- entries: Object.keys(mapping.mapping).length,
2385
- };
2386
2327
  folder.branches = branches;
2387
2328
  finishAdminTiming(res, 'case', startedAt, {
2388
2329
  changes: folder.changes,
@@ -2663,94 +2604,6 @@ function createAdminRouter({
2663
2604
  }
2664
2605
  });
2665
2606
 
2666
- // Le mapping du dossier est le seul fichier de l'administration qui contient
2667
- // des données personnelles en clair : il n'est jamais journalisé, seulement
2668
- // rendu au navigateur local qui l'a demandé.
2669
- router.get('/mapping', (req, res) => {
2670
- try {
2671
- const legalCase = selectedCase(req.query.case);
2672
- const mapping = readCaseMapping(legalCase.root);
2673
- res.json({
2674
- case: legalCase.id,
2675
- name: path.basename(mapping.file),
2676
- exists: mapping.exists,
2677
- mapping: mapping.mapping,
2678
- reverse_mapping: mapping.reverse_mapping,
2679
- informations_dossier: mapping.informations_dossier,
2680
- });
2681
- } catch (error) {
2682
- res.status(400).json({ error: error.message });
2683
- }
2684
- });
2685
-
2686
- router.put('/mapping', async (req, res) => {
2687
- try {
2688
- if (!req.body?.mapping || typeof req.body.mapping !== 'object' || Array.isArray(req.body.mapping)) {
2689
- throw new Error('Le mapping doit être un objet { entité: code }.');
2690
- }
2691
- const legalCase = selectedCase(req.body?.case);
2692
- const saved = saveCaseMapping(legalCase.root, {
2693
- mapping: req.body.mapping,
2694
- reverse_mapping: req.body.reverse_mapping,
2695
- ...(req.body.informations_dossier !== undefined
2696
- ? { informations_dossier: req.body.informations_dossier }
2697
- : {}),
2698
- });
2699
- const commit = await createCommit({
2700
- casesRoot: legalCase.casesRoot,
2701
- caseName: legalCase.caseName,
2702
- homeDir,
2703
- label: 'Modification du mapping d’anonymisation',
2704
- event: 'admin-mapping-edit',
2705
- paths: [path.relative(legalCase.root, saved.file).split(path.sep).join('/')],
2706
- waitForLockMs: 10_000,
2707
- });
2708
- if (commit.skipped === 'busy') throw new Error('Mapping enregistré, mais historique occupé : commit automatique non créé.');
2709
- res.json({
2710
- ok: true,
2711
- case: legalCase.id,
2712
- name: path.basename(saved.file),
2713
- exists: true,
2714
- mapping: saved.mapping,
2715
- reverse_mapping: saved.reverse_mapping,
2716
- informations_dossier: saved.informations_dossier,
2717
- commit: { created: commit.created, hash: commit.commit || null },
2718
- });
2719
- } catch (error) {
2720
- res.status(400).json({ error: error.message });
2721
- }
2722
- });
2723
-
2724
- router.post('/mapping/rebuild', async (req, res) => {
2725
- try {
2726
- const legalCase = selectedCase(req.body?.case);
2727
- const rebuilt = await rebuildCaseMapping(legalCase.root);
2728
- const commit = await createCommit({
2729
- casesRoot: legalCase.casesRoot,
2730
- caseName: legalCase.caseName,
2731
- homeDir,
2732
- label: 'Régénération du mapping d’anonymisation',
2733
- event: 'admin-mapping-rebuild',
2734
- paths: [path.relative(legalCase.root, rebuilt.file).split(path.sep).join('/')],
2735
- waitForLockMs: 10_000,
2736
- });
2737
- if (commit.skipped === 'busy') throw new Error('Mapping régénéré, mais historique occupé : commit automatique non créé.');
2738
- res.json({
2739
- ok: true,
2740
- case: legalCase.id,
2741
- name: path.basename(rebuilt.file),
2742
- added: rebuilt.added,
2743
- total: rebuilt.total,
2744
- mapping: rebuilt.mapping,
2745
- reverse_mapping: rebuilt.reverse_mapping,
2746
- informations_dossier: rebuilt.informations_dossier,
2747
- commit: { created: commit.created, hash: commit.commit || null },
2748
- });
2749
- } catch (error) {
2750
- res.status(400).json({ error: error.message });
2751
- }
2752
- });
2753
-
2754
2607
  router.get('/history', async (req, res) => {
2755
2608
  const startedAt = performance.now();
2756
2609
  try {
@@ -2896,7 +2749,6 @@ module.exports = {
2896
2749
  applyPluginComponentSelection,
2897
2750
  checkOllamaModelUpdate,
2898
2751
  configurationOverview,
2899
- createLegalCase,
2900
2752
  createAdminRouter,
2901
2753
  createManagedFile,
2902
2754
  deleteManagedAsset,
@@ -16,6 +16,9 @@ const DEPRECATED_HOOKS = new Set([
16
16
  'piecemaker-central-anonymize.mjs',
17
17
  'verify-citations.mjs',
18
18
  'decision-cache.mjs',
19
+ 'commit-track.mjs',
20
+ 'billing-track.mjs',
21
+ 'session-commit.mjs',
19
22
  ]);
20
23
 
21
24
  function settingsPath(userHome) {