kordoc 4.14.2 → 4.14.4

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 (151) hide show
  1. package/README.md +51 -6
  2. package/dist/{-AQKXLFIM.js → -Z4TJ3QGK.js} +13 -11
  3. package/dist/{chunk-QOMNEWCQ.cjs → chunk-5LAZQCUJ.cjs} +305 -31
  4. package/dist/chunk-5LAZQCUJ.cjs.map +1 -0
  5. package/dist/{chunk-7IAQ4HOK.js → chunk-6BWU6SQX.js} +1 -1
  6. package/dist/chunk-6BWU6SQX.js.map +1 -0
  7. package/dist/{chunk-FOJZNMMK.js → chunk-6CUIXJOC.js} +1 -1
  8. package/dist/chunk-6CUIXJOC.js.map +1 -0
  9. package/dist/{chunk-ZWD734EY.js → chunk-7SE4EZ45.js} +2 -2
  10. package/dist/{chunk-TSFS5VKD.js → chunk-D4U2TXDC.js} +332 -141
  11. package/dist/chunk-D4U2TXDC.js.map +1 -0
  12. package/dist/chunk-DPWWXUOG.js +2222 -0
  13. package/dist/chunk-DPWWXUOG.js.map +1 -0
  14. package/dist/{chunk-GDW4YP7K.js → chunk-GLSBEEZJ.js} +2 -2
  15. package/dist/{chunk-JQEFP45L.js → chunk-GUJ4Q73I.js} +2 -2
  16. package/dist/{chunk-ZWOFQRIB.js → chunk-HIJUKZHM.js} +3 -3
  17. package/dist/chunk-IMAAFSAX.cjs +1352 -0
  18. package/dist/chunk-IMAAFSAX.cjs.map +1 -0
  19. package/dist/{chunk-TNCKOL2O.js → chunk-LCW7SEPG.js} +2 -2
  20. package/dist/chunk-LFSQAMSM.js +1352 -0
  21. package/dist/chunk-LFSQAMSM.js.map +1 -0
  22. package/dist/chunk-MG6DJEX4.js +1299 -0
  23. package/dist/chunk-MG6DJEX4.js.map +1 -0
  24. package/dist/{chunk-QC5T6D4J.js → chunk-NLU6LBLY.js} +299 -25
  25. package/dist/chunk-NLU6LBLY.js.map +1 -0
  26. package/dist/{chunk-EQZI77PP.cjs → chunk-QEJUY6SK.cjs} +3 -3
  27. package/dist/{chunk-EQZI77PP.cjs.map → chunk-QEJUY6SK.cjs.map} +1 -1
  28. package/dist/{chunk-VQ5W4MYO.js → chunk-QIF2VXBQ.js} +298 -24
  29. package/dist/chunk-QIF2VXBQ.js.map +1 -0
  30. package/dist/{chunk-UET462HB.js → chunk-TITDJWVZ.js} +2 -2
  31. package/dist/{chunk-247ANM72.cjs → chunk-USHQCF5T.cjs} +870 -147
  32. package/dist/chunk-USHQCF5T.cjs.map +1 -0
  33. package/dist/{chunk-C7FQBSON.js → chunk-V3DX4DUF.js} +2 -2
  34. package/dist/{chunk-DOGPOY4B.js → chunk-VDN7LMPL.js} +2 -2
  35. package/dist/{chunk-EDNJLUSE.js → chunk-VJIL6PIL.js} +2 -2
  36. package/dist/{chunk-L7DMSMAG.cjs → chunk-VWUYVEFN.cjs} +1 -1
  37. package/dist/chunk-VWUYVEFN.cjs.map +1 -0
  38. package/dist/{chunk-HR2XNERB.cjs → chunk-WJHAU73B.cjs} +2 -2
  39. package/dist/{chunk-HR2XNERB.cjs.map → chunk-WJHAU73B.cjs.map} +1 -1
  40. package/dist/{chunk-NS55SM7A.js → chunk-WJJGW5PL.js} +2 -2
  41. package/dist/{chunk-EISO3POT.js → chunk-XVXHXQIO.js} +788 -194
  42. package/dist/chunk-XVXHXQIO.js.map +1 -0
  43. package/dist/{chunk-ILU76UF3.js → chunk-YAKC46HZ.js} +2 -2
  44. package/dist/chunk-YAKC46HZ.js.map +1 -0
  45. package/dist/{chunk-3DUADAY2.js → chunk-YAVHVFRY.js} +851 -128
  46. package/dist/chunk-YAVHVFRY.js.map +1 -0
  47. package/dist/{chunk-A7QC2ZVP.js → chunk-YT3GC62E.js} +851 -128
  48. package/dist/chunk-YT3GC62E.js.map +1 -0
  49. package/dist/chunks-CCMRL4MJ.js +10 -0
  50. package/dist/cli.js +228 -97
  51. package/dist/cli.js.map +1 -1
  52. package/dist/{formula-PJJ6S3Z2.cjs → formula-5LOVHAKE.cjs} +9 -9
  53. package/dist/{formula-PJJ6S3Z2.cjs.map → formula-5LOVHAKE.cjs.map} +1 -1
  54. package/dist/{formula-JGFTXWYT.js → formula-7RANCW5L.js} +3 -3
  55. package/dist/{formula-5S7WWXGH.js → formula-7UYJOVTB.js} +4 -4
  56. package/dist/{image-ocr-WCAYXLOA.js → image-ocr-I6JOCATS.js} +34 -16
  57. package/dist/image-ocr-I6JOCATS.js.map +1 -0
  58. package/dist/{image-ocr-ZTYAGV3W.cjs → image-ocr-NYBJEOH2.cjs} +36 -18
  59. package/dist/image-ocr-NYBJEOH2.cjs.map +1 -0
  60. package/dist/{image-ocr-FLIL7MGN.js → image-ocr-ZV6PDBUQ.js} +32 -14
  61. package/dist/image-ocr-ZV6PDBUQ.js.map +1 -0
  62. package/dist/index.cjs +4048 -1216
  63. package/dist/index.cjs.map +1 -1
  64. package/dist/index.d.cts +66 -28
  65. package/dist/index.d.ts +66 -28
  66. package/dist/index.js +3487 -655
  67. package/dist/index.js.map +1 -1
  68. package/dist/mcp.js +74 -53
  69. package/dist/mcp.js.map +1 -1
  70. package/dist/{model-bundle-FSPZZ2EM.js → model-bundle-2C5IYDLE.js} +5 -5
  71. package/dist/{models-CJPAQK5R.js → models-SEQZHZFT.js} +5 -5
  72. package/dist/{parser-SCUTZAIJ.js → parser-3FNXEP6T.js} +708 -250
  73. package/dist/parser-3FNXEP6T.js.map +1 -0
  74. package/dist/{parser-A4TMPJAM.js → parser-FJBJXRJK.js} +708 -250
  75. package/dist/parser-FJBJXRJK.js.map +1 -0
  76. package/dist/{parser-VCXE4I5A.cjs → parser-HVEKF73B.cjs} +733 -275
  77. package/dist/parser-HVEKF73B.cjs.map +1 -0
  78. package/dist/pdf-ocr-JRDBJ6TA.cjs +14 -0
  79. package/dist/{pdf-ocr-MBZZ57LD.cjs.map → pdf-ocr-JRDBJ6TA.cjs.map} +1 -1
  80. package/dist/pdf-ocr-UUBWBEHL.js +16 -0
  81. package/dist/pdf-ocr-VJSF2SQC.js +13 -0
  82. package/dist/{profile-io-LBM263K7.js → profile-io-RUFZOZO6.js} +3 -3
  83. package/dist/{rasterize-46RG4ZF6.js → rasterize-IOYXR5SI.js} +3 -3
  84. package/dist/redact-NMIKVHMP.js +18 -0
  85. package/dist/redact-doc-QBHNJ2BU.js +1284 -0
  86. package/dist/redact-doc-QBHNJ2BU.js.map +1 -0
  87. package/dist/{render-NGP5T24S.js → render-YZ2TEC3N.js} +7 -7
  88. package/dist/seal-ECV44TUH.js +10 -0
  89. package/dist/{setup-AU4OCHNH.js → setup-MPIEP6XT.js} +3 -3
  90. package/dist/visual-ICMOWUCR.js +19 -0
  91. package/dist/{watch-MKPUCPXM.js → watch-RYO7MN5B.js} +12 -12
  92. package/package.json +2 -2
  93. package/dist/chunk-247ANM72.cjs.map +0 -1
  94. package/dist/chunk-3DUADAY2.js.map +0 -1
  95. package/dist/chunk-422427XJ.cjs +0 -571
  96. package/dist/chunk-422427XJ.cjs.map +0 -1
  97. package/dist/chunk-7IAQ4HOK.js.map +0 -1
  98. package/dist/chunk-A7QC2ZVP.js.map +0 -1
  99. package/dist/chunk-DZIXKL7E.js +0 -145
  100. package/dist/chunk-DZIXKL7E.js.map +0 -1
  101. package/dist/chunk-EISO3POT.js.map +0 -1
  102. package/dist/chunk-EP7KOI2V.js +0 -571
  103. package/dist/chunk-EP7KOI2V.js.map +0 -1
  104. package/dist/chunk-FOJZNMMK.js.map +0 -1
  105. package/dist/chunk-ILU76UF3.js.map +0 -1
  106. package/dist/chunk-KVWV4ULP.js +0 -516
  107. package/dist/chunk-KVWV4ULP.js.map +0 -1
  108. package/dist/chunk-L7DMSMAG.cjs.map +0 -1
  109. package/dist/chunk-QC5T6D4J.js.map +0 -1
  110. package/dist/chunk-QOMNEWCQ.cjs.map +0 -1
  111. package/dist/chunk-TSFS5VKD.js.map +0 -1
  112. package/dist/chunk-VQ5W4MYO.js.map +0 -1
  113. package/dist/chunks-SX77P5CV.js +0 -10
  114. package/dist/image-ocr-FLIL7MGN.js.map +0 -1
  115. package/dist/image-ocr-WCAYXLOA.js.map +0 -1
  116. package/dist/image-ocr-ZTYAGV3W.cjs.map +0 -1
  117. package/dist/parser-A4TMPJAM.js.map +0 -1
  118. package/dist/parser-SCUTZAIJ.js.map +0 -1
  119. package/dist/parser-VCXE4I5A.cjs.map +0 -1
  120. package/dist/pdf-ocr-76SAUXMZ.js +0 -13
  121. package/dist/pdf-ocr-CPU55CVF.js +0 -16
  122. package/dist/pdf-ocr-MBZZ57LD.cjs +0 -14
  123. package/dist/redact-7ILEAUTS.js +0 -12
  124. package/dist/seal-RGUPOLXD.js +0 -10
  125. package/dist/visual-NZLYIYEM.js +0 -19
  126. /package/dist/{-AQKXLFIM.js.map → -Z4TJ3QGK.js.map} +0 -0
  127. /package/dist/{chunk-ZWD734EY.js.map → chunk-7SE4EZ45.js.map} +0 -0
  128. /package/dist/{chunk-GDW4YP7K.js.map → chunk-GLSBEEZJ.js.map} +0 -0
  129. /package/dist/{chunk-JQEFP45L.js.map → chunk-GUJ4Q73I.js.map} +0 -0
  130. /package/dist/{chunk-ZWOFQRIB.js.map → chunk-HIJUKZHM.js.map} +0 -0
  131. /package/dist/{chunk-TNCKOL2O.js.map → chunk-LCW7SEPG.js.map} +0 -0
  132. /package/dist/{chunk-UET462HB.js.map → chunk-TITDJWVZ.js.map} +0 -0
  133. /package/dist/{chunk-C7FQBSON.js.map → chunk-V3DX4DUF.js.map} +0 -0
  134. /package/dist/{chunk-DOGPOY4B.js.map → chunk-VDN7LMPL.js.map} +0 -0
  135. /package/dist/{chunk-EDNJLUSE.js.map → chunk-VJIL6PIL.js.map} +0 -0
  136. /package/dist/{chunk-NS55SM7A.js.map → chunk-WJJGW5PL.js.map} +0 -0
  137. /package/dist/{chunks-SX77P5CV.js.map → chunks-CCMRL4MJ.js.map} +0 -0
  138. /package/dist/{formula-JGFTXWYT.js.map → formula-7RANCW5L.js.map} +0 -0
  139. /package/dist/{formula-5S7WWXGH.js.map → formula-7UYJOVTB.js.map} +0 -0
  140. /package/dist/{model-bundle-FSPZZ2EM.js.map → model-bundle-2C5IYDLE.js.map} +0 -0
  141. /package/dist/{models-CJPAQK5R.js.map → models-SEQZHZFT.js.map} +0 -0
  142. /package/dist/{pdf-ocr-76SAUXMZ.js.map → pdf-ocr-UUBWBEHL.js.map} +0 -0
  143. /package/dist/{pdf-ocr-CPU55CVF.js.map → pdf-ocr-VJSF2SQC.js.map} +0 -0
  144. /package/dist/{profile-io-LBM263K7.js.map → profile-io-RUFZOZO6.js.map} +0 -0
  145. /package/dist/{rasterize-46RG4ZF6.js.map → rasterize-IOYXR5SI.js.map} +0 -0
  146. /package/dist/{redact-7ILEAUTS.js.map → redact-NMIKVHMP.js.map} +0 -0
  147. /package/dist/{render-NGP5T24S.js.map → render-YZ2TEC3N.js.map} +0 -0
  148. /package/dist/{seal-RGUPOLXD.js.map → seal-ECV44TUH.js.map} +0 -0
  149. /package/dist/{setup-AU4OCHNH.js.map → setup-MPIEP6XT.js.map} +0 -0
  150. /package/dist/{visual-NZLYIYEM.js.map → visual-ICMOWUCR.js.map} +0 -0
  151. /package/dist/{watch-MKPUCPXM.js.map → watch-RYO7MN5B.js.map} +0 -0
package/dist/mcp.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  assertWithinRoot,
4
4
  getAccessRoot,
5
5
  isOfflineMode
6
- } from "./chunk-GDW4YP7K.js";
6
+ } from "./chunk-GLSBEEZJ.js";
7
7
  import {
8
8
  APPROVAL_MAX,
9
9
  BODY_FONTS,
@@ -42,31 +42,31 @@ import {
42
42
  resolveBuiltinTemplate,
43
43
  unknownFontWarnings,
44
44
  usesGaejosikMunche
45
- } from "./chunk-EISO3POT.js";
46
- import "./chunk-ZWOFQRIB.js";
47
- import "./chunk-DZIXKL7E.js";
48
- import "./chunk-EDNJLUSE.js";
45
+ } from "./chunk-XVXHXQIO.js";
46
+ import "./chunk-HIJUKZHM.js";
47
+ import "./chunk-DPWWXUOG.js";
48
+ import "./chunk-VJIL6PIL.js";
49
49
  import {
50
50
  detectFormat,
51
51
  detectOle2Format,
52
52
  detectZipFormat,
53
53
  extractHwp5MetadataOnly
54
- } from "./chunk-TSFS5VKD.js";
54
+ } from "./chunk-D4U2TXDC.js";
55
55
  import "./chunk-7FCNOKOR.js";
56
- import "./chunk-7IAQ4HOK.js";
56
+ import "./chunk-6BWU6SQX.js";
57
57
  import "./chunk-MOL7MDBG.js";
58
- import "./chunk-ILU76UF3.js";
58
+ import "./chunk-YAKC46HZ.js";
59
59
  import {
60
60
  blocksToMarkdown
61
- } from "./chunk-QC5T6D4J.js";
62
- import "./chunk-C7FQBSON.js";
61
+ } from "./chunk-NLU6LBLY.js";
62
+ import "./chunk-V3DX4DUF.js";
63
63
  import {
64
64
  KordocError,
65
65
  VERSION,
66
66
  classifyError,
67
67
  sanitizeError,
68
68
  toArrayBuffer
69
- } from "./chunk-UET462HB.js";
69
+ } from "./chunk-TITDJWVZ.js";
70
70
 
71
71
  // src/mcp.ts
72
72
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -322,7 +322,7 @@ ${markdown}`);
322
322
  break;
323
323
  case "pdf":
324
324
  try {
325
- const { extractPdfMetadataOnly } = await import("./parser-SCUTZAIJ.js");
325
+ const { extractPdfMetadataOnly } = await import("./parser-3FNXEP6T.js");
326
326
  metadata = await extractPdfMetadataOnly(buffer);
327
327
  } catch {
328
328
  metadata = void 0;
@@ -498,7 +498,7 @@ ${tableMarkdown}` }]
498
498
  if (!parsed.success) {
499
499
  return { content: [{ type: "text", text: `\uD30C\uC2F1 \uC2E4\uD328: ${parsed.error}` }], isError: true };
500
500
  }
501
- const { blocksToChunks } = await import("./chunks-SX77P5CV.js");
501
+ const { blocksToChunks } = await import("./chunks-CCMRL4MJ.js");
502
502
  const chunks = blocksToChunks(parsed.blocks, { granularity, includeTableCells: include_table_cells });
503
503
  return { content: [{ type: "text", text: capResponseText(JSON.stringify(chunks, null, 2)) }] };
504
504
  } catch (err) {
@@ -520,6 +520,15 @@ function buildFillInputs(fields, formats) {
520
520
  }
521
521
  return out;
522
522
  }
523
+ async function isSameFile(a, b) {
524
+ if (a === b) return true;
525
+ try {
526
+ const [sa, sb] = await Promise.all([stat2(a), stat2(b)]);
527
+ return sa.ino === sb.ino && sa.dev === sb.dev;
528
+ } catch {
529
+ return false;
530
+ }
531
+ }
523
532
  function registerFormTools(server2) {
524
533
  server2.tool(
525
534
  "parse_form",
@@ -734,7 +743,7 @@ ${previewMd}` }]
734
743
  }
735
744
  const image = new Uint8Array(await readFile2(imgResolved));
736
745
  const ext = extname2(imgResolved).slice(1).toLowerCase();
737
- const { placeSealHwpx } = await import("./seal-RGUPOLXD.js");
746
+ const { placeSealHwpx } = await import("./seal-ECV44TUH.js");
738
747
  const result = await placeSealHwpx(buffer, [{
739
748
  anchor,
740
749
  occurrence,
@@ -824,60 +833,72 @@ ${previewMd}` }]
824
833
  );
825
834
  server2.tool(
826
835
  "redact_document",
827
- "\uBB38\uC11C\uC758 \uAC1C\uC778\uC815\uBCF4(\uC8FC\uBBFC\uBC88\uD638\xB7\uC804\uD654\xB7\uC774\uBA54\uC77C\xB7\uCE74\uB4DC\xB7\uACC4\uC88C)\uB97C \uD0D0\uC9C0\uD574 \uC11C\uC2DD \uBCF4\uC874 \uB9C8\uC2A4\uD0B9\uD569\uB2C8\uB2E4. HWPX/HWP\uB294 \uC6D0\uBCF8 \uC11C\uC2DD 1\uBC14\uC774\uD2B8 \uADF8\uB300\uB85C patch, \uADF8 \uC678 \uD3EC\uB9F7\uC740 \uB9C8\uC2A4\uD0B9\uB41C \uB9C8\uD06C\uB2E4\uC6B4\uC73C\uB85C \uCD9C\uB825. \uC790\uB3D9 \uAC80\uCD9C \uBCF4\uC870 \uB3C4\uAD6C \u2014 \uACB0\uACFC \uB9AC\uD3EC\uD2B8\uB97C \uC0AC\uB78C\uC774 \uCD5C\uC885 \uD655\uC778\uD574\uC57C \uD558\uBA70 \uC774\uBBF8\uC9C0 \uC548 \uD14D\uC2A4\uD2B8\uB294 \uD0D0\uC9C0\uD558\uC9C0 \uBABB\uD569\uB2C8\uB2E4. \uB9C8\uC2A4\uD0B9 \uD6C4 render_document\uB85C \uB208\uC73C\uB85C \uD655\uC778\uD558\uB294 \uAC83\uC744 \uAD8C\uC7A5\uD569\uB2C8\uB2E4.",
836
+ "\uBB38\uC11C\uC758 \uAC1C\uC778\uC815\uBCF4(\uC8FC\uBBFC\xB7\uC678\uAD6D\uC778\uB4F1\uB85D\uBC88\uD638\xB7\uC804\uD654\xB7\uC774\uBA54\uC77C\xB7\uCE74\uB4DC\xB7\uACC4\uC88C\xB7\uC0AC\uC5C5\uC790\uB4F1\uB85D\uBC88\uD638\xB7\uC5EC\uAD8C\xB7\uC6B4\uC804\uBA74\uD5C8, rules \uB85C \uC778\uBA85\xB7\uC8FC\uC18C opt-in)\uB97C \uD0D0\uC9C0\uD574 \uC11C\uC2DD \uBCF4\uC874 \uB9C8\uC2A4\uD0B9\uD569\uB2C8\uB2E4. HWPX/HWP\uB294 \uC6D0\uBCF8 \uC11C\uC2DD \uADF8\uB300\uB85C \uAC19\uC740 \uAE38\uC774\uB85C \uAC00\uB9B0 \uD30C\uC77C \u2014 \uBCF8\uBB38\xB7\uD45C\xB7\uC911\uCCA9\uD45C\xB7\uBA38\uB9AC\uB9D0/\uAF2C\uB9AC\uB9D0\xB7\uAC01\uC8FC\xB7\uAE00\uC0C1\uC790\xB7\uD544\uB4DC\xB7\uBBF8\uB9AC\uBCF4\uAE30(\uD14D\uC2A4\uD2B8\xB7\uC774\uBBF8\uC9C0)\xB7\uBB38\uC11C \uC815\uBCF4(\uC81C\uBAA9\xB7\uC791\uC131\uC790)\uAE4C\uC9C0 \uAC00\uB9AC\uACE0, \uC800\uC7A5 \uC804 \uACB0\uACFC \uD30C\uC77C\uC744 \uB2E4\uC2DC \uD6D1\uC5B4 \uB0A8\uC740 PII\uB97C \uBCF4\uACE0\uD569\uB2C8\uB2E4. \uADF8 \uC678 \uD3EC\uB9F7(PDF\xB7DOCX\xB7XLSX \uB4F1)\uC740 \uC6D0\uBCF8\uC744 \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uACE0 \uB9C8\uC2A4\uD0B9\uB41C \uB9C8\uD06C\uB2E4\uC6B4\uB9CC \uCD9C\uB825\uD569\uB2C8\uB2E4. \uC790\uB3D9 \uAC80\uCD9C \uBCF4\uC870 \uB3C4\uAD6C \u2014 \uACB0\uACFC \uB9AC\uD3EC\uD2B8\uB97C \uC0AC\uB78C\uC774 \uCD5C\uC885 \uD655\uC778\uD574\uC57C \uD558\uBA70 \uC774\uBBF8\uC9C0 \uC18D \uAE00\uC790\uB294 \uD0D0\uC9C0\uD558\uC9C0 \uBABB\uD569\uB2C8\uB2E4. \uB9C8\uC2A4\uD0B9 \uD6C4 render_document\uB85C \uB208\uC73C\uB85C \uD655\uC778\uD558\uB294 \uAC83\uC744 \uAD8C\uC7A5\uD569\uB2C8\uB2E4.",
828
837
  {
829
838
  file_path: z2.string().min(1).describe("\uB300\uC0C1 \uBB38\uC11C\uC758 \uC808\uB300 \uACBD\uB85C"),
830
- rules: z2.array(z2.enum(["rrn", "phone", "email", "card", "account", "passport", "driver"])).optional().describe("\uC801\uC6A9 \uB8F0 (\uAE30\uBCF8: rrn\xB7phone\xB7email\xB7card\xB7account \u2014 passport\xB7driver\uB294 opt-in)"),
839
+ rules: z2.array(z2.enum(["rrn", "phone", "email", "card", "account", "brn", "passport", "driver", "crn", "ip", "name", "address"])).optional().describe("\uC801\uC6A9 \uB8F0 (\uAE30\uBCF8: rrn\xB7phone\xB7email\xB7card\xB7account\xB7brn\xB7passport\xB7driver \u2014 crn(\uBC95\uC778\uB4F1\uB85D\uBC88\uD638)\xB7ip\xB7name(\uC778\uBA85, \uBB38\uB9E5 \uAC8C\uC774\uD2B8)\xB7address(\uC8FC\uC18C)\uB294 opt-in)"),
831
840
  mask_char: z2.string().min(1).max(1).optional().describe("\uB9C8\uC2A4\uD06C \uBB38\uC790 1\uAE00\uC790 (\uAE30\uBCF8: \u25CF)"),
832
841
  output_path: z2.string().min(1).optional().describe("\uCD9C\uB825 \uACBD\uB85C (HWPX/HWP\uB294 \uAC19\uC740 \uD655\uC7A5\uC790, \uADF8 \uC678\uB294 .md) \u2014 dry_run\uC774 \uC544\uB2C8\uBA74 \uD544\uC218"),
833
842
  dry_run: z2.boolean().default(false).describe("\uD0D0\uC9C0 \uB9AC\uD3EC\uD2B8\uB9CC \uBC18\uD658, \uD30C\uC77C \uBBF8\uC0DD\uC131")
834
843
  },
835
844
  async ({ file_path, rules, mask_char, output_path, dry_run }) => {
836
845
  try {
837
- const { buffer } = await readValidatedFile(file_path);
838
- const format = detectFormat(buffer);
846
+ const { buffer, resolved } = await readValidatedFile(file_path);
847
+ let format = detectFormat(buffer);
848
+ if (format === "hwpx") {
849
+ const z5 = await detectZipFormat(buffer);
850
+ if (z5 !== "unknown") format = z5;
851
+ } else if (format === "hwp") {
852
+ const o = detectOle2Format(buffer);
853
+ if (o !== "unknown") format = o;
854
+ }
839
855
  const patchable = format === "hwpx" || format === "hwp";
840
856
  if (!dry_run && !output_path) {
841
857
  return { content: [{ type: "text", text: "output_path\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4 (\uD0D0\uC9C0\uB9CC \uC6D0\uD558\uBA74 dry_run: true)." }], isError: true };
842
858
  }
843
859
  const outPath = !dry_run ? safeOutputPath(output_path, new Set(patchable ? [format === "hwp" ? ".hwp" : ".hwpx"] : [".md", ".markdown", ".txt"])) : void 0;
844
- const parsed = await parse(buffer, { filePath: file_path });
845
- if (!parsed.success) {
846
- return { content: [{ type: "text", text: `\uD30C\uC2F1 \uC2E4\uD328: ${parsed.error}` }], isError: true };
860
+ if (outPath && await isSameFile(outPath, resolved)) {
861
+ return { content: [{ type: "text", text: "output_path\uAC00 \uC785\uB825 \uD30C\uC77C\uACFC \uAC19\uC2B5\uB2C8\uB2E4 \u2014 \uC6D0\uBCF8\uC744 \uB36E\uC5B4\uC4F0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB2E4\uB978 \uACBD\uB85C\uB97C \uC9C0\uC815\uD558\uC138\uC694." }], isError: true };
847
862
  }
848
- const { redactMarkdown } = await import("./redact-7ILEAUTS.js");
849
- const r = redactMarkdown(parsed.markdown, { rules, maskChar: mask_char });
863
+ const { redactDocument } = await import("./redact-doc-QBHNJ2BU.js");
864
+ const r = await redactDocument(buffer, { rules, maskChar: mask_char, filePath: file_path, dryRun: dry_run });
865
+ const MAX_LINES = 50;
866
+ const listed = r.fileHits.length > 0 ? r.fileHits.map((h) => ` - [${h.rule}] ${h.masked} (${h.where} @ ${h.part})`) : r.markdownHits.map((h) => ` - [${h.rule}] ${h.masked}`);
850
867
  const byRule = /* @__PURE__ */ new Map();
851
- for (const h of r.hits) byRule.set(h.rule, (byRule.get(h.rule) ?? 0) + 1);
868
+ for (const h of r.fileHits.length > 0 ? r.fileHits : r.markdownHits) byRule.set(h.rule, (byRule.get(h.rule) ?? 0) + 1);
869
+ const grouped = /* @__PURE__ */ new Map();
870
+ for (const l of listed) grouped.set(l, (grouped.get(l) ?? 0) + 1);
871
+ const groupedLines = [...grouped].map(([l, n]) => n > 1 ? `${l} \xD7${n}` : l);
852
872
  const lines = [
853
- `\uD0D0\uC9C0: ${r.hits.length}\uAC74 (${[...byRule.entries()].map(([k, v]) => `${k} ${v}`).join(", ") || "\uC5C6\uC74C"})`,
854
- ...r.hits.map((h) => ` - [${h.rule}] ${h.masked}`)
873
+ `\uD0D0\uC9C0: ${[...byRule.values()].reduce((a, b) => a + b, 0)}\uAC74 (${[...byRule.entries()].map(([k, v]) => `${k} ${v}`).join(", ") || "\uC5C6\uC74C"})`,
874
+ ...groupedLines.slice(0, MAX_LINES),
875
+ ...groupedLines.length > MAX_LINES ? [` \u2026 \uC678 ${groupedLines.length - MAX_LINES}\uC904`] : []
855
876
  ];
856
- if (!dry_run && r.hits.length > 0) {
857
- if (patchable) {
858
- const original = new Uint8Array(buffer);
859
- const result = format === "hwp" ? await patchHwp(original, r.text) : await patchHwpx(original, r.text);
860
- if (!result.success || !result.data) {
861
- return { content: [{ type: "text", text: `\uB9C8\uC2A4\uD0B9 \uD328\uCE58 \uC2E4\uD328: ${result.error ?? "\uC54C \uC218 \uC5C6\uB294 \uC624\uB958"}` }], isError: true };
862
- }
863
- await mkdir(dirname2(outPath), { recursive: true });
864
- await writeFile(outPath, Buffer.from(result.data));
877
+ const save = r.data ? r.changed : r.markdownHits.length > 0;
878
+ if (!dry_run && save) {
879
+ await mkdir(dirname2(outPath), { recursive: true });
880
+ if (r.data) {
881
+ await writeFile(outPath, Buffer.from(r.data));
865
882
  lines.push(`\uC800\uC7A5: ${outPath} (\uC6D0\uBCF8 \uC11C\uC2DD \uBCF4\uC874)`);
866
- if (result.skipped.length > 0) {
867
- lines.push(`\u26A0\uFE0F \uBBF8\uC801\uC6A9 ${result.skipped.length}\uAC74 \u2014 \uD574\uB2F9 \uC704\uCE58\uB294 \uC6D0\uBB38\uC774 \uB0A8\uC544 \uC788\uC73C\uB2C8 \uBC18\uB4DC\uC2DC \uC218\uB3D9 \uD655\uC778:`);
868
- for (const s of result.skipped) lines.push(` - ${s.reason}`);
869
- }
870
- lines.push("render_document\uB85C \uB9C8\uC2A4\uD0B9 \uACB0\uACFC\uB97C \uB208\uC73C\uB85C \uD655\uC778\uD558\uC138\uC694.");
871
883
  } else {
872
- await mkdir(dirname2(outPath), { recursive: true });
873
- await writeFile(outPath, r.text, "utf-8");
874
- lines.push(`\uC800\uC7A5: ${outPath} (${format}\uB294 \uC11C\uC2DD \uBCF4\uC874 \uBBF8\uC9C0\uC6D0 \u2014 \uB9C8\uC2A4\uD0B9\uB41C \uB9C8\uD06C\uB2E4\uC6B4)`);
884
+ await writeFile(outPath, r.markdown, "utf-8");
885
+ lines.push(`\uC800\uC7A5: ${outPath} (${r.format} \uC6D0\uBCF8\uC740 \uC218\uC815\uD558\uC9C0 \uC54A\uC74C \u2014 \uB9C8\uC2A4\uD0B9\uB41C \uB9C8\uD06C\uB2E4\uC6B4)`);
875
886
  }
876
887
  } else if (!dry_run) {
877
- lines.push("\uD0D0\uC9C0 0\uAC74 \u2014 \uCD9C\uB825 \uD30C\uC77C\uC744 \uB9CC\uB4E4\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.");
888
+ lines.push(listed.length > 0 ? "\u274C \uD30C\uC77C\uC5D0\uC11C \uAC00\uB9B0 \uACF3\uC774 \uC5C6\uC5B4 \uCD9C\uB825 \uD30C\uC77C\uC744 \uB9CC\uB4E4\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4." : "\uD0D0\uC9C0 0\uAC74 \u2014 \uCD9C\uB825 \uD30C\uC77C\uC744 \uB9CC\uB4E4\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.");
889
+ }
890
+ const failed = r.residual.length > 0 || r.unscanned.length > 0;
891
+ if (r.residual.length > 0) {
892
+ lines.push(`\u274C \uB9C8\uC2A4\uD0B9 \uD6C4 \uC7AC\uAC80\uC0AC\uC5D0\uC11C PII ${r.residual.length}\uAC74\uC774 \uB0A8\uC544 \uC788\uC2B5\uB2C8\uB2E4 \u2014 \uCD9C\uB825 \uD30C\uC77C\uC744 \uACF5\uAC1C\uD558\uC9C0 \uB9D0\uACE0 \uC218\uB3D9 \uD655\uC778\uD558\uC138\uC694:`);
893
+ for (const h of r.residual.slice(0, MAX_LINES)) lines.push(` - [${h.rule}] ${h.masked} (${h.where} @ ${h.part})`);
894
+ if (r.residual.length > MAX_LINES) lines.push(` \u2026 \uC678 ${r.residual.length - MAX_LINES}\uAC74`);
878
895
  }
879
- lines.push("\uC8FC\uC758: \uC790\uB3D9 \uAC80\uCD9C\uC740 \uBCF4\uC870 \uC218\uB2E8\uC785\uB2C8\uB2E4. \uC774\uBBF8\uC9C0 \uC18D \uD14D\uC2A4\uD2B8\xB7\uD45C\uAE30 \uBCC0\uD615\uC740 \uB193\uCE60 \uC218 \uC788\uC73C\uB2C8 \uCD5C\uC885 \uACF5\uAC1C \uC804 \uC0AC\uB78C \uAC80\uD1A0\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.");
880
- return { content: [{ type: "text", text: capResponseText(lines.join("\n")) }] };
896
+ if (r.unscanned.length > 0) lines.push(`\u274C \uAE00\uC790\uB97C \uAC80\uC0AC\uD558\uC9C0 \uBABB\uD55C \uACF3\uC774 \uC788\uC2B5\uB2C8\uB2E4 \u2014 \uCD9C\uB825 \uD30C\uC77C\uC744 \uACF5\uAC1C\uD558\uC9C0 \uB9D0\uACE0 \uC218\uB3D9 \uD655\uC778\uD558\uC138\uC694: ${r.unscanned.join(", ")}`);
897
+ if (!failed && r.data && save) lines.push("\uC7AC\uAC80\uC0AC: \uACB0\uACFC \uD30C\uC77C \uC804\uCCB4(\uBCF8\uBB38\xB7\uBA38\uB9AC\uB9D0\xB7\uAC01\uC8FC\xB7\uBBF8\uB9AC\uBCF4\uAE30\xB7\uBA54\uD0C0\uB370\uC774\uD130\xB7\uBBF8\uD560\uB2F9 \uC601\uC5ED)\uC640 \uB2E4\uC2DC \uC77D\uC740 \uBCF8\uBB38\uC5D0\uC11C \uB0A8\uC740 PII 0\uAC74");
898
+ for (const w of r.warnings) lines.push(`\u26A0\uFE0F ${w}`);
899
+ if (r.data && save) lines.push("render_document\uB85C \uB9C8\uC2A4\uD0B9 \uACB0\uACFC\uB97C \uB208\uC73C\uB85C \uD655\uC778\uD558\uC138\uC694.");
900
+ lines.push("\uC8FC\uC758: \uC790\uB3D9 \uAC80\uCD9C\uC740 \uBCF4\uC870 \uC218\uB2E8\uC785\uB2C8\uB2E4. \uC774\uBBF8\uC9C0 \uC18D \uD14D\uC2A4\uD2B8\xB7\uD45C\uAE30 \uBCC0\uD615\xB7\uC774\uB984\xB7\uC8FC\uC18C\uB294 \uB193\uCE60 \uC218 \uC788\uC73C\uB2C8 \uCD5C\uC885 \uACF5\uAC1C \uC804 \uC0AC\uB78C \uAC80\uD1A0\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.");
901
+ return { content: [{ type: "text", text: capResponseText(lines.join("\n")) }], ...failed ? { isError: true } : {} };
881
902
  } catch (err) {
882
903
  return { content: [{ type: "text", text: `\uB9C8\uC2A4\uD0B9 \uC2E4\uD328: ${describeError(err)}` }], isError: true };
883
904
  }
@@ -913,7 +934,7 @@ function registerRenderTools(server2) {
913
934
  const { buffer, resolved } = await readValidatedFile(file_path, MAX_FILE_SIZE, /* @__PURE__ */ new Set([".hwpx", ".hwp"]));
914
935
  const isHwp5 = resolved.toLowerCase().endsWith(".hwp");
915
936
  if (!isHwp5 && !pages && (format === "png" || format === "svg")) {
916
- const { renderHwpxToSvg } = await import("./render-NGP5T24S.js");
937
+ const { renderHwpxToSvg } = await import("./render-YZ2TEC3N.js");
917
938
  const result = await renderHwpxToSvg(buffer, { highlights, reflow: true, reflowMode: reflow_mode });
918
939
  const summary2 = [
919
940
  `\uB80C\uB354 \uC644\uB8CC: ${result.pageCount}\uD398\uC774\uC9C0, ${Math.round(result.width)}x${Math.round(result.height)}pt (\uD14D\uC2A4\uD2B8 ${result.stats.texts}\xB7\uC774\uBBF8\uC9C0 ${result.stats.images}\xB7\uD45C ${result.stats.tables})`,
@@ -925,7 +946,7 @@ function registerRenderTools(server2) {
925
946
  summary2.push(`\uC800\uC7A5: ${outPath}`);
926
947
  return { content: [{ type: "text", text: summary2.join("\n") }] };
927
948
  }
928
- const { rasterizeSvg } = await import("./rasterize-46RG4ZF6.js");
949
+ const { rasterizeSvg } = await import("./rasterize-IOYXR5SI.js");
929
950
  const raster = await rasterizeSvg(result.svg, result.width, result.height, max_width_px ? { maxWidthPx: max_width_px } : void 0);
930
951
  if (outPath) {
931
952
  await mkdir2(dirname3(outPath), { recursive: true });
@@ -940,7 +961,7 @@ function registerRenderTools(server2) {
940
961
  ]
941
962
  };
942
963
  }
943
- const { renderDocument } = await import("./render-NGP5T24S.js");
964
+ const { renderDocument } = await import("./render-YZ2TEC3N.js");
944
965
  const { scene, assets } = await renderDocument(buffer, { format, pages, highlights, reflow: true, reflowMode: reflow_mode, maxWidthPx: max_width_px });
945
966
  const summary = [
946
967
  `\uB80C\uB354 \uC644\uB8CC: \uBB38\uC11C ${scene.pages.length}\uD398\uC774\uC9C0 \uC911 ${assets.filter((a) => a.page !== void 0).length || 1}\uAC74 (\uD14D\uC2A4\uD2B8 ${scene.stats.texts}\xB7\uC774\uBBF8\uC9C0 ${scene.stats.images}\xB7\uD45C ${scene.stats.tables}\xB7\uB3C4\uD615 ${scene.stats.shapes})`,
@@ -990,7 +1011,7 @@ function registerRenderTools(server2) {
990
1011
  try {
991
1012
  const { buffer } = await readValidatedFile(file_path, MAX_FILE_SIZE, /* @__PURE__ */ new Set([".hwpx", ".hwp"]));
992
1013
  const dir = safeOutputPath(join(output_dir, "regions.json"), /* @__PURE__ */ new Set([".json"])).replace(/[\\/]regions\.json$/, "");
993
- const { extractRenderedRegions } = await import("./render-NGP5T24S.js");
1014
+ const { extractRenderedRegions } = await import("./render-YZ2TEC3N.js");
994
1015
  const regions = await extractRenderedRegions(buffer, { types: target, format, pages, paddingPt: padding_pt, reflow: true });
995
1016
  await mkdir2(dir, { recursive: true });
996
1017
  const ext = format === "jpeg" ? "jpg" : "png";
@@ -1026,7 +1047,7 @@ function registerRenderTools(server2) {
1026
1047
  }
1027
1048
  const { buffer } = await readValidatedFile(file_path, MAX_FILE_SIZE, /* @__PURE__ */ new Set([".hwpx", ".hwp"]));
1028
1049
  const dir = output_dir ? safeOutputPath(join(output_dir, "tables.json"), /* @__PURE__ */ new Set([".json"])).replace(/[\\/]tables\.json$/, "") : void 0;
1029
- const { extractTables } = await import("./visual-NZLYIYEM.js");
1050
+ const { extractTables } = await import("./visual-ICMOWUCR.js");
1030
1051
  const tables = await extractTables(buffer, { policy: visual, format, paddingPt: padding_pt });
1031
1052
  if (dir) await mkdir2(dir, { recursive: true });
1032
1053
  const ext = format === "jpeg" ? "jpg" : "png";
@@ -1083,7 +1104,7 @@ function registerGenerateTools(server2) {
1083
1104
  try {
1084
1105
  const out = safeOutputPath(output_path, PROFILE_EXTENSIONS);
1085
1106
  const { buffer } = await readValidatedFile(hwpx_path);
1086
- const { hwpxToProfile } = await import("./-AQKXLFIM.js");
1107
+ const { hwpxToProfile } = await import("./-Z4TJ3QGK.js");
1087
1108
  const profile = await hwpxToProfile(buffer);
1088
1109
  await mkdir3(dirname4(out), { recursive: true });
1089
1110
  await writeFile3(out, JSON.stringify(profile, null, 2));
@@ -1186,7 +1207,7 @@ function registerGenerateTools(server2) {
1186
1207
  }
1187
1208
  let profile;
1188
1209
  if (profile_path) {
1189
- const { parseFormatProfileJson } = await import("./profile-io-LBM263K7.js");
1210
+ const { parseFormatProfileJson } = await import("./profile-io-RUFZOZO6.js");
1190
1211
  profile = parseFormatProfileJson(await readFile3(safePath(profile_path, PROFILE_EXTENSIONS), "utf-8"));
1191
1212
  }
1192
1213
  const out = safeOutputPath(output_path, /* @__PURE__ */ new Set([".hwpx"]));