kordoc 4.24.0 → 4.24.2

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 (126) hide show
  1. package/README.md +26 -54
  2. package/dist/{-VEOO4BOM.js → -SRNEV7LS.js} +11 -11
  3. package/dist/{chunk-P35SCAJN.js → chunk-3HN65YAL.js} +2 -2
  4. package/dist/{chunk-H5PDQ66I.js → chunk-4745MFQU.js} +3 -3
  5. package/dist/{chunk-ENCAYXDI.js → chunk-4XC4O7FJ.js} +4 -4
  6. package/dist/{chunk-EN3PK6OT.js → chunk-7NTMM6PO.js} +2 -2
  7. package/dist/{chunk-GEY6ZMXH.js → chunk-C6ZVB547.js} +43 -23
  8. package/dist/{chunk-GEY6ZMXH.js.map → chunk-C6ZVB547.js.map} +1 -1
  9. package/dist/{chunk-CKCJU42Y.js → chunk-DHMBPMKC.js} +74 -30
  10. package/dist/chunk-DHMBPMKC.js.map +1 -0
  11. package/dist/{chunk-ZGNHJCDR.js → chunk-E6VBLBOO.js} +2 -2
  12. package/dist/{chunk-O2SLKE4L.js → chunk-E7B5CXYI.js} +2 -2
  13. package/dist/{chunk-DKWEZWCF.cjs → chunk-HLTPMSYW.cjs} +3 -3
  14. package/dist/{chunk-DKWEZWCF.cjs.map → chunk-HLTPMSYW.cjs.map} +1 -1
  15. package/dist/{chunk-DZT3CHNZ.cjs → chunk-IGG63DFK.cjs} +3 -3
  16. package/dist/{chunk-DZT3CHNZ.cjs.map → chunk-IGG63DFK.cjs.map} +1 -1
  17. package/dist/{chunk-IHNIPVPJ.cjs → chunk-JFUUFJZW.cjs} +6 -6
  18. package/dist/{chunk-IHNIPVPJ.cjs.map → chunk-JFUUFJZW.cjs.map} +1 -1
  19. package/dist/{chunk-PX6X4YOR.js → chunk-JMOAMKAR.js} +4 -4
  20. package/dist/{chunk-P6FNIU5P.js → chunk-KUC5I5MB.js} +2 -2
  21. package/dist/{chunk-Z5G6QNVH.js → chunk-LMEF7FN5.js} +2 -2
  22. package/dist/{chunk-OJISMR2Z.js → chunk-M46PB75E.js} +2 -2
  23. package/dist/{chunk-G4HWEM6Q.js → chunk-MHNJOJQV.js} +4 -4
  24. package/dist/{chunk-Z62PHCSU.js → chunk-NJ5RUDCW.js} +3 -3
  25. package/dist/{chunk-DM5YPONO.js → chunk-NMFFIUI6.js} +2 -2
  26. package/dist/{chunk-HOXHBG4C.cjs → chunk-PNSALBXH.cjs} +2 -2
  27. package/dist/{chunk-HOXHBG4C.cjs.map → chunk-PNSALBXH.cjs.map} +1 -1
  28. package/dist/{chunk-FHFPQ6MX.cjs → chunk-PNX5FYHC.cjs} +24 -24
  29. package/dist/{chunk-FHFPQ6MX.cjs.map → chunk-PNX5FYHC.cjs.map} +1 -1
  30. package/dist/{chunk-IZYYKE5F.js → chunk-R2GIGE5H.js} +2 -2
  31. package/dist/{chunk-55DOBEGD.js → chunk-RIRPLFPN.js} +2 -2
  32. package/dist/{chunk-3M2BIQLZ.js → chunk-TDMBTG7U.js} +2 -2
  33. package/dist/{chunk-6YDPTTIY.js → chunk-TW3V6FSH.js} +2 -2
  34. package/dist/{chunk-OHDGEGDJ.cjs → chunk-UNICY546.cjs} +23 -23
  35. package/dist/{chunk-OHDGEGDJ.cjs.map → chunk-UNICY546.cjs.map} +1 -1
  36. package/dist/{chunk-SRUBDR3Z.js → chunk-VPSF5LEM.js} +3 -3
  37. package/dist/{chunk-4VPN5MHS.js → chunk-W24TJJNN.js} +2 -2
  38. package/dist/{chunk-DBPDAG7N.js → chunk-WDSTW3BD.js} +2 -2
  39. package/dist/{chunk-XLY5ZJRP.js → chunk-WJAFE3Z6.js} +2 -2
  40. package/dist/chunks-AL4P5TO5.js +10 -0
  41. package/dist/cli.js +41 -30
  42. package/dist/cli.js.map +1 -1
  43. package/dist/{formula-4GRNVWIQ.js → formula-DSB574H7.js} +4 -4
  44. package/dist/{formula-R3OWFGCZ.cjs → formula-HK2MNZ3Q.cjs} +9 -9
  45. package/dist/{formula-R3OWFGCZ.cjs.map → formula-HK2MNZ3Q.cjs.map} +1 -1
  46. package/dist/{formula-6Y467S4R.js → formula-U2LZ67KI.js} +3 -3
  47. package/dist/{image-ocr-CGJJCD4E.js → image-ocr-3QB2HLSI.js} +9 -9
  48. package/dist/{image-ocr-ZLL66KNO.js → image-ocr-J54Q3YWP.js} +6 -6
  49. package/dist/{image-ocr-EBKG45KF.cjs → image-ocr-QNIMVE5A.cjs} +17 -17
  50. package/dist/{image-ocr-EBKG45KF.cjs.map → image-ocr-QNIMVE5A.cjs.map} +1 -1
  51. package/dist/index.cjs +683 -619
  52. package/dist/index.cjs.map +1 -1
  53. package/dist/index.d.cts +1 -1
  54. package/dist/index.d.ts +1 -1
  55. package/dist/index.js +106 -42
  56. package/dist/index.js.map +1 -1
  57. package/dist/mcp.js +36 -33
  58. package/dist/mcp.js.map +1 -1
  59. package/dist/{model-bundle-RD4KSNTB.js → model-bundle-CGWU4ALC.js} +5 -5
  60. package/dist/{models-OLGCZBXI.js → models-A3TF3BDV.js} +5 -5
  61. package/dist/{parse-worker-v2-YZY2GQY5.js → parse-worker-v2-MNUD4WAR.js} +20 -13
  62. package/dist/parse-worker-v2-MNUD4WAR.js.map +1 -0
  63. package/dist/{parser-IHCFHLHN.js → parser-C3ARF26I.js} +12 -12
  64. package/dist/{parser-J22QBXPP.js → parser-OBGWEWSU.js} +9 -9
  65. package/dist/{parser-DX4I3GT7.cjs → parser-RPAHN3OR.cjs} +157 -157
  66. package/dist/{parser-DX4I3GT7.cjs.map → parser-RPAHN3OR.cjs.map} +1 -1
  67. package/dist/{pdf-ocr-TYIH23RP.js → pdf-ocr-ENLVEEYL.js} +9 -9
  68. package/dist/pdf-ocr-GA5QJFNK.cjs +31 -0
  69. package/dist/{pdf-ocr-WU7SZHWM.cjs.map → pdf-ocr-GA5QJFNK.cjs.map} +1 -1
  70. package/dist/{pdf-ocr-H2247ZZH.js → pdf-ocr-K53REDNY.js} +6 -6
  71. package/dist/{profile-io-GH3TYTNJ.js → profile-io-ZGFEO7CB.js} +3 -3
  72. package/dist/{rasterize-7TFTVFMB.js → rasterize-QMC2SAUT.js} +3 -3
  73. package/dist/{redact-doc-DSSQOO3A.js → redact-doc-JH6RZZBE.js} +11 -11
  74. package/dist/{render-NKXZQINI.js → render-ZGKQLKPJ.js} +7 -7
  75. package/dist/seal-KMGYTJAV.js +10 -0
  76. package/dist/{setup-JVLMX2TH.js → setup-LAQGCYQ2.js} +3 -3
  77. package/dist/visual-4OYJFGXL.js +21 -0
  78. package/dist/{watch-5RZVHAKI.js → watch-7YPB4TKC.js} +12 -12
  79. package/package.json +1 -1
  80. package/dist/chunk-CKCJU42Y.js.map +0 -1
  81. package/dist/chunks-LV5EJBZ4.js +0 -10
  82. package/dist/parse-worker-v2-YZY2GQY5.js.map +0 -1
  83. package/dist/pdf-ocr-WU7SZHWM.cjs +0 -31
  84. package/dist/seal-JIVSSI3Z.js +0 -10
  85. package/dist/visual-BKVZN6HP.js +0 -21
  86. /package/dist/{-VEOO4BOM.js.map → -SRNEV7LS.js.map} +0 -0
  87. /package/dist/{chunk-P35SCAJN.js.map → chunk-3HN65YAL.js.map} +0 -0
  88. /package/dist/{chunk-H5PDQ66I.js.map → chunk-4745MFQU.js.map} +0 -0
  89. /package/dist/{chunk-ENCAYXDI.js.map → chunk-4XC4O7FJ.js.map} +0 -0
  90. /package/dist/{chunk-EN3PK6OT.js.map → chunk-7NTMM6PO.js.map} +0 -0
  91. /package/dist/{chunk-ZGNHJCDR.js.map → chunk-E6VBLBOO.js.map} +0 -0
  92. /package/dist/{chunk-O2SLKE4L.js.map → chunk-E7B5CXYI.js.map} +0 -0
  93. /package/dist/{chunk-PX6X4YOR.js.map → chunk-JMOAMKAR.js.map} +0 -0
  94. /package/dist/{chunk-P6FNIU5P.js.map → chunk-KUC5I5MB.js.map} +0 -0
  95. /package/dist/{chunk-Z5G6QNVH.js.map → chunk-LMEF7FN5.js.map} +0 -0
  96. /package/dist/{chunk-OJISMR2Z.js.map → chunk-M46PB75E.js.map} +0 -0
  97. /package/dist/{chunk-G4HWEM6Q.js.map → chunk-MHNJOJQV.js.map} +0 -0
  98. /package/dist/{chunk-Z62PHCSU.js.map → chunk-NJ5RUDCW.js.map} +0 -0
  99. /package/dist/{chunk-DM5YPONO.js.map → chunk-NMFFIUI6.js.map} +0 -0
  100. /package/dist/{chunk-IZYYKE5F.js.map → chunk-R2GIGE5H.js.map} +0 -0
  101. /package/dist/{chunk-55DOBEGD.js.map → chunk-RIRPLFPN.js.map} +0 -0
  102. /package/dist/{chunk-3M2BIQLZ.js.map → chunk-TDMBTG7U.js.map} +0 -0
  103. /package/dist/{chunk-6YDPTTIY.js.map → chunk-TW3V6FSH.js.map} +0 -0
  104. /package/dist/{chunk-SRUBDR3Z.js.map → chunk-VPSF5LEM.js.map} +0 -0
  105. /package/dist/{chunk-4VPN5MHS.js.map → chunk-W24TJJNN.js.map} +0 -0
  106. /package/dist/{chunk-DBPDAG7N.js.map → chunk-WDSTW3BD.js.map} +0 -0
  107. /package/dist/{chunk-XLY5ZJRP.js.map → chunk-WJAFE3Z6.js.map} +0 -0
  108. /package/dist/{chunks-LV5EJBZ4.js.map → chunks-AL4P5TO5.js.map} +0 -0
  109. /package/dist/{formula-4GRNVWIQ.js.map → formula-DSB574H7.js.map} +0 -0
  110. /package/dist/{formula-6Y467S4R.js.map → formula-U2LZ67KI.js.map} +0 -0
  111. /package/dist/{image-ocr-CGJJCD4E.js.map → image-ocr-3QB2HLSI.js.map} +0 -0
  112. /package/dist/{image-ocr-ZLL66KNO.js.map → image-ocr-J54Q3YWP.js.map} +0 -0
  113. /package/dist/{model-bundle-RD4KSNTB.js.map → model-bundle-CGWU4ALC.js.map} +0 -0
  114. /package/dist/{models-OLGCZBXI.js.map → models-A3TF3BDV.js.map} +0 -0
  115. /package/dist/{parser-IHCFHLHN.js.map → parser-C3ARF26I.js.map} +0 -0
  116. /package/dist/{parser-J22QBXPP.js.map → parser-OBGWEWSU.js.map} +0 -0
  117. /package/dist/{pdf-ocr-H2247ZZH.js.map → pdf-ocr-ENLVEEYL.js.map} +0 -0
  118. /package/dist/{pdf-ocr-TYIH23RP.js.map → pdf-ocr-K53REDNY.js.map} +0 -0
  119. /package/dist/{profile-io-GH3TYTNJ.js.map → profile-io-ZGFEO7CB.js.map} +0 -0
  120. /package/dist/{rasterize-7TFTVFMB.js.map → rasterize-QMC2SAUT.js.map} +0 -0
  121. /package/dist/{redact-doc-DSSQOO3A.js.map → redact-doc-JH6RZZBE.js.map} +0 -0
  122. /package/dist/{render-NKXZQINI.js.map → render-ZGKQLKPJ.js.map} +0 -0
  123. /package/dist/{seal-JIVSSI3Z.js.map → seal-KMGYTJAV.js.map} +0 -0
  124. /package/dist/{setup-JVLMX2TH.js.map → setup-LAQGCYQ2.js.map} +0 -0
  125. /package/dist/{visual-BKVZN6HP.js.map → visual-4OYJFGXL.js.map} +0 -0
  126. /package/dist/{watch-5RZVHAKI.js.map → watch-7YPB4TKC.js.map} +0 -0
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ALL_OCR_MODELS
4
- } from "./chunk-IZYYKE5F.js";
4
+ } from "./chunk-R2GIGE5H.js";
5
5
  import {
6
6
  ALL_FORMULA_MODELS,
7
7
  getModelStatusIn,
8
8
  getModelsDir
9
- } from "./chunk-4VPN5MHS.js";
10
- import "./chunk-3M2BIQLZ.js";
11
- import "./chunk-Z5G6QNVH.js";
9
+ } from "./chunk-W24TJJNN.js";
10
+ import "./chunk-TDMBTG7U.js";
11
+ import "./chunk-LMEF7FN5.js";
12
12
 
13
13
  // src/shared/model-bundle.ts
14
14
  import { copyFile, mkdir } from "fs/promises";
@@ -101,4 +101,4 @@ export {
101
101
  importModels,
102
102
  modelCacheStatus
103
103
  };
104
- //# sourceMappingURL=model-bundle-RD4KSNTB.js.map
104
+ //# sourceMappingURL=model-bundle-CGWU4ALC.js.map
@@ -17,10 +17,10 @@ import {
17
17
  ocrSourcePath,
18
18
  parseCharacterDict,
19
19
  resolveOcrModels
20
- } from "./chunk-IZYYKE5F.js";
21
- import "./chunk-4VPN5MHS.js";
22
- import "./chunk-3M2BIQLZ.js";
23
- import "./chunk-Z5G6QNVH.js";
20
+ } from "./chunk-R2GIGE5H.js";
21
+ import "./chunk-W24TJJNN.js";
22
+ import "./chunk-TDMBTG7U.js";
23
+ import "./chunk-LMEF7FN5.js";
24
24
  export {
25
25
  ALL_OCR_MODELS,
26
26
  DEFAULT_OCR_MODELS,
@@ -40,4 +40,4 @@ export {
40
40
  parseCharacterDict,
41
41
  resolveOcrModels
42
42
  };
43
- //# sourceMappingURL=models-OLGCZBXI.js.map
43
+ //# sourceMappingURL=models-A3TF3BDV.js.map
@@ -1,28 +1,28 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  parseWorkerFile
4
- } from "./chunk-H5PDQ66I.js";
4
+ } from "./chunk-4745MFQU.js";
5
5
  import {
6
6
  PRESET_ALIAS,
7
7
  lintBlocks
8
- } from "./chunk-GEY6ZMXH.js";
9
- import "./chunk-DM5YPONO.js";
10
- import "./chunk-CKCJU42Y.js";
11
- import "./chunk-ZGNHJCDR.js";
12
- import "./chunk-EN3PK6OT.js";
8
+ } from "./chunk-C6ZVB547.js";
9
+ import "./chunk-NMFFIUI6.js";
10
+ import "./chunk-DHMBPMKC.js";
11
+ import "./chunk-E6VBLBOO.js";
12
+ import "./chunk-7NTMM6PO.js";
13
13
  import "./chunk-VKVDMH7X.js";
14
14
  import "./chunk-VQFA55IC.js";
15
15
  import {
16
16
  validateOcrOptions
17
17
  } from "./chunk-BYMPPVT3.js";
18
- import "./chunk-P6FNIU5P.js";
19
- import "./chunk-DBPDAG7N.js";
20
- import "./chunk-Z62PHCSU.js";
21
- import "./chunk-55DOBEGD.js";
18
+ import "./chunk-KUC5I5MB.js";
19
+ import "./chunk-WDSTW3BD.js";
20
+ import "./chunk-NJ5RUDCW.js";
21
+ import "./chunk-RIRPLFPN.js";
22
22
  import {
23
23
  VERSION,
24
24
  sanitizeError
25
- } from "./chunk-Z5G6QNVH.js";
25
+ } from "./chunk-LMEF7FN5.js";
26
26
  import "./chunk-3WSNLH4B.js";
27
27
 
28
28
  // src/cli/parse-worker-v2.ts
@@ -289,7 +289,14 @@ async function runParseWorkerV2(opts = {}) {
289
289
  await fail(id, "INVALID_OPTIONS", `\uC54C \uC218 \uC5C6\uB294 \uD504\uB9AC\uC14B: ${key.slice(0, 40)}`);
290
290
  continue;
291
291
  }
292
- await write({ id, result: lintBlocks(lr.data.blocks, { ...flags, ...key !== void 0 ? { preset: PRESET_ALIAS[key] } : {} }) });
292
+ let result2;
293
+ try {
294
+ result2 = lintBlocks(lr.data.blocks, { ...flags, ...key !== void 0 ? { preset: PRESET_ALIAS[key] } : {} });
295
+ } catch (err) {
296
+ await fail(id, "LINT_FAILED", String(err?.message ?? err).slice(0, 200));
297
+ continue;
298
+ }
299
+ await write({ id, result: result2 });
293
300
  continue;
294
301
  }
295
302
  const req = parseRequestSchema.safeParse(msg);
@@ -347,4 +354,4 @@ export {
347
354
  runParseWorkerV2,
348
355
  toParseOptions
349
356
  };
350
- //# sourceMappingURL=parse-worker-v2-YZY2GQY5.js.map
357
+ //# sourceMappingURL=parse-worker-v2-MNUD4WAR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/parse-worker-v2.ts"],"sourcesContent":["/**\n * parse-worker protocol 2 — Java·Python SDK 용 상주 워커 계약 (docs/parse-worker-protocol.md).\n * protocol 1 과 같은 parseWorkerFile 로 파싱하고, 요청 검증·옵션 허용 목록·이미지 파일 전송·입출력 상한만 더한다.\n */\n\nimport { createHash } from \"crypto\"\nimport { mkdtempSync, realpathSync, rmSync, statSync, writeFileSync } from \"fs\"\nimport { basename, isAbsolute, join } from \"path\"\nimport { z } from \"zod\"\nimport type { IRBlock, ParseOptions, ParseResult } from \"../types.js\"\nimport { VERSION, sanitizeError } from \"../utils.js\"\nimport { parseWorkerFile } from \"./worker-parse.js\"\nimport { validateOcrOptions } from \"../ocr/options.js\"\nimport { lintBlocks } from \"../hwpx/lint-blocks.js\"\nimport { PRESET_ALIAS } from \"../hwpx/gongmun.js\"\n\nexport const PARSE_WORKER_PROTOCOL_V2 = 2\nexport const CAPABILITIES = [\"parse\", \"options\", \"transport.images.inline\", \"transport.images.files\", \"lint.blocks\"] as const\n/** 요청 한 줄 기본 상한 — parse 요청은 경로·옵션뿐이지만 lint_blocks 는 문서 글(블록)을 싣는다 */\nexport const DEFAULT_MAX_REQUEST_BYTES = 8 * 1024 * 1024\n/** 응답 한 줄 기본 상한 — V8 문자열 한계(약 512MB) 아래. 넘으면 transport.images \"files\" 로 */\nexport const DEFAULT_MAX_RESPONSE_BYTES = 256 * 1024 * 1024\n\nexport type WorkerErrorCode =\n | \"INVALID_JSON\" | \"INVALID_REQUEST\" | \"INVALID_OPTIONS\" | \"UNSUPPORTED_COMMAND\" | \"DUPLICATE_ID\"\n | \"REQUEST_TOO_LARGE\" | \"RESPONSE_TOO_LARGE\" | \"ASSET_WRITE_FAILED\" | \"LINT_FAILED\"\n\n/** 파싱 실패(result.success:false)가 아닌 요청·전송 오류 — 응답 {id?, error:{code, message}} */\nexport class WorkerProtocolError extends Error {\n constructor(readonly code: WorkerErrorCode, message: string) {\n super(message)\n this.name = \"WorkerProtocolError\"\n }\n}\n\n/** 로컬 OCR 모델 파일 {path, sha256} — 값 검증(절대 경로·16진 64자)은 validateOcrOptions 가 parse() 와 같은 문구로 */\nconst modelFileSchema = z.object({ path: z.string(), sha256: z.string() }).strict()\n\n/** wire 로 받는 ParseOptions 허용 목록. 함수 값(ocr 프로바이더·onProgress)과 filePath 는 받지 않는다 */\nconst optionsSchema = z.object({\n tableFormat: z.literal(\"gfm\"),\n htmlTables: z.boolean(),\n layoutTables: z.enum([\"visual\", \"keep\"]),\n classifyTables: z.boolean(),\n tables: z.boolean(),\n plain: z.boolean(),\n scriptTags: z.boolean(),\n removeHeaderFooter: z.boolean(),\n dedupeRunningHeaders: z.boolean(),\n keepTrailingEmptyCols: z.boolean(),\n keepEmptyParagraphs: z.boolean(),\n includeFieldPlaceholders: z.boolean(),\n pages: z.union([z.string(), z.array(z.number().int().positive())]),\n images: z.boolean(),\n inlineImages: z.boolean(),\n ocr: z.union([z.boolean(), z.literal(\"force\")]),\n ocrLines: z.union([z.boolean(), z.literal(\"all\")]),\n ocrDet: z.union([z.enum([\"mobile\", \"server\"]), modelFileSchema]),\n ocrDetLongSide: z.number().int(),\n ocrRec: z.union([z.literal(\"handwriting\"), modelFileSchema]),\n ocrRecDict: modelFileSchema,\n formulaOcr: z.boolean(),\n password: z.string(),\n}).partial().strict()\n\nconst transportSchema = z.object({\n images: z.enum([\"inline\", \"files\"]).optional(),\n assetsDir: z.string().optional(),\n}).strict()\n\nconst parseRequestSchema = z.object({\n id: z.number(),\n cmd: z.literal(\"parse\"),\n file: z.string().min(1),\n options: z.unknown().optional(),\n transport: transportSchema.optional(),\n}).strict()\n\n/** lint_blocks — 열린 문서의 문단·표 칸 블록을 검수해 블록 id·블록 안 위치로 (lint-blocks.ts) */\nconst lintBlocksRequestSchema = z.object({\n id: z.number(),\n cmd: z.literal(\"lint_blocks\"),\n blocks: z.array(z.object({\n id: z.string().min(1).max(200),\n text: z.string().max(100_000),\n table: z.object({ id: z.string().min(1).max(200), row: z.number().int().min(0).max(10_000), col: z.number().int().min(0).max(1_000) }).strict().optional(),\n }).strict()).max(20_000),\n options: z.object({\n munche: z.boolean(), slop: z.boolean(), logic: z.boolean(), numbers: z.boolean(), budget: z.boolean(), gate: z.boolean(), preset: z.string(),\n }).partial().strict().optional(),\n}).strict()\n\nconst issueText = (e: z.ZodError, prefix: string): string =>\n e.issues.map(i => `${[prefix, ...i.path].filter(Boolean).join(\".\")}: ${i.message}`).join(\"; \")\n\n/** wire options → ParseOptions. 미지정은 키를 두지 않아(엔진 기본값) false 와 구분한다. filePath 는 실제 입력 경로 */\nexport function toParseOptions(wire: unknown, absPath: string): ParseOptions {\n const parsed = optionsSchema.safeParse(wire ?? {})\n if (!parsed.success) throw new WorkerProtocolError(\"INVALID_OPTIONS\", issueText(parsed.error, \"options\"))\n const o = parsed.data\n // parse() 는 실패 결과로 막지만, 요청 자체의 잘못이라 프로토콜 오류로 돌려준다\n if (o.htmlTables && o.tableFormat) throw new WorkerProtocolError(\"INVALID_OPTIONS\", \"options: htmlTables 와 tableFormat 은 함께 쓸 수 없습니다\")\n const ocrError = validateOcrOptions(o)\n if (ocrError) throw new WorkerProtocolError(\"INVALID_OPTIONS\", `options: ${ocrError}`)\n const out: ParseOptions = { filePath: absPath }\n for (const [k, v] of Object.entries(o)) if (v !== undefined) (out as Record<string, unknown>)[k] = v\n return out\n}\n\ninterface ImageHolder { data?: unknown; filename?: string; dataRef?: { path: string; byteLength: number } }\n\n/** 결과 안의 이미지 바이트(result.images[]·블록 imageData — children·셀 blocks·captionBlocks 까지)를 모은다 */\nfunction collectImageHolders(result: ParseResult): ImageHolder[] {\n if (!result.success) return []\n const holders: ImageHolder[] = [...(result.images ?? [])]\n const walk = (blocks: IRBlock[] | undefined, depth: number): void => {\n if (!blocks || depth > 64) return\n for (const b of blocks) {\n if (b.imageData) holders.push(b.imageData)\n walk(b.children, depth + 1)\n if (b.table) {\n for (const row of b.table.cells) for (const cell of row) walk(cell.blocks, depth + 1)\n walk(b.table.captionBlocks, depth + 1)\n }\n }\n }\n walk(result.blocks, 0)\n return holders\n}\n\n/** 파일 이름으로 쓸 수 있는 글자만 — 경로 구분자·상위 경로·제어 문자를 막는다 */\nfunction safeFileName(name: string | undefined, fallback: string): string {\n const base = basename((name ?? \"\").replace(/\\\\/g, \"/\")).replace(/[\\u0000-\\u001f<>:\"|?*]/g, \"_\").replace(/^\\.+/, \"\")\n const safe = base && base !== \".\" && base !== \"..\" ? base.slice(0, 120) : fallback\n // 확장자는 그림 형식만 — 문서가 정한 이름(payload.html·x.svg)을 그대로 쓰면 자산 폴더를 열거나 서빙할 때 스크립트가 돈다\n return /\\.(?:png|jpe?g|gif|bmp|tiff?|wmf|emf|webp|bin)$/i.test(safe) ? safe : safe.replace(/(\\.[^.]*)?$/, \".bin\")\n}\n\n/**\n * transport.images \"files\" — 이미지 바이트를 assetsDir 아래 요청별 새 디렉터리에 쓰고 data 를 dataRef {path, byteLength} 로 바꾼다.\n * path 는 그 디렉터리 기준 파일 이름. 같은 바이트는 한 파일을 함께 가리키고, 이름이 같아도 바이트가 다르면 다른 파일로 쓴다.\n * 파일은 배타 생성(wx)이라 기존 파일·링크를 덮어쓰지 않는다. 실패하면 이 요청이 만든 디렉터리만 지운다.\n * 이미지가 없으면 디렉터리를 만들지 않고 undefined\n */\nexport async function externalizeImages(result: ParseResult, assetsRoot: string, id: number): Promise<string | undefined> {\n const holders = collectImageHolders(result).filter(h => h.data !== undefined)\n if (!holders.length) return undefined\n const root = realpathSync(assetsRoot)\n const dir = mkdtempSync(join(root, `kordoc-${id}-`))\n try {\n const byHash = new Map<string, string>()\n const used = new Set<string>()\n let n = 0\n for (const h of holders) {\n if (!(h.data instanceof Uint8Array)) throw new WorkerProtocolError(\"ASSET_WRITE_FAILED\", \"이미지 바이트가 Uint8Array 가 아닙니다\")\n const bytes = h.data\n const hash = createHash(\"sha256\").update(bytes).digest(\"hex\")\n let path = byHash.get(hash)\n if (!path) {\n const name = safeFileName(h.filename, `image_${String(++n).padStart(3, \"0\")}.bin`)\n path = name\n for (let k = 2; used.has(path); k++) path = name.replace(/(\\.[^.]*)?$/, ext => `-${k}${ext}`)\n writeFileSync(join(dir, path), bytes, { flag: \"wx\" })\n used.add(path)\n byHash.set(hash, path)\n }\n delete h.data\n h.dataRef = { path, byteLength: bytes.byteLength }\n }\n return dir\n } catch (err) {\n rmSync(dir, { recursive: true, force: true })\n if (err instanceof WorkerProtocolError) throw err\n throw new WorkerProtocolError(\"ASSET_WRITE_FAILED\", sanitizeError(err))\n }\n}\n\n/** stdin 을 바이트 단위로 줄로 자른다 — 멀티바이트 글자가 read 경계에 걸려도 줄 단위로 해독. 상한을 넘은 줄은 tooLarge */\nasync function* readLines(input: NodeJS.ReadableStream, maxBytes: number): AsyncGenerator<{ line?: string; tooLarge?: true }> {\n let pending: Buffer[] = []\n let pendingBytes = 0\n let discarding = false\n for await (const chunk of input as AsyncIterable<Buffer>) {\n let buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n for (let nl = buf.indexOf(0x0a); nl !== -1; nl = buf.indexOf(0x0a)) {\n const head = buf.subarray(0, nl)\n buf = buf.subarray(nl + 1)\n if (discarding) { discarding = false; continue }\n if (pendingBytes + head.length > maxBytes) { pending = []; pendingBytes = 0; yield { tooLarge: true }; continue }\n const line = Buffer.concat([...pending, head]).toString(\"utf8\").replace(/\\r$/, \"\")\n pending = []\n pendingBytes = 0\n yield { line }\n }\n if (discarding) continue\n if (pendingBytes + buf.length > maxBytes) { pending = []; pendingBytes = 0; discarding = true; yield { tooLarge: true }; continue }\n if (buf.length) { pending.push(buf); pendingBytes += buf.length }\n }\n if (!discarding && pendingBytes) yield { line: Buffer.concat(pending).toString(\"utf8\").replace(/\\r$/, \"\") }\n}\n\nconst bytesToBase64 = (_key: string, value: unknown): unknown =>\n value instanceof Uint8Array ? Buffer.from(value).toString(\"base64\") : value\n\nconst validId = (v: unknown): v is number => typeof v === \"number\" && Number.isSafeInteger(v) && v > 0\n\nexport interface ParseWorkerV2Options {\n maxRequestBytes?: number\n maxResponseBytes?: number\n input?: NodeJS.ReadableStream\n output?: NodeJS.WritableStream\n}\n\n/** protocol 2 워커 루프 — ready 를 쓰고 요청을 하나씩 처리한다. quit 또는 stdin EOF 에서 마지막 응답을 비우고 돌아온다 */\nexport async function runParseWorkerV2(opts: ParseWorkerV2Options = {}): Promise<void> {\n const input = opts.input ?? process.stdin\n const output = opts.output ?? process.stdout\n const maxRequestBytes = opts.maxRequestBytes ?? DEFAULT_MAX_REQUEST_BYTES\n const maxResponseBytes = opts.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES\n const seen = new Set<number>()\n let broken = false\n // 쓰기 오류는 write 콜백이 다룬다 — 리스너가 없으면 뒤따르는 'error' 가 uncaught 로 exit 1 을 낸다\n output.on(\"error\", () => {})\n\n /** 한 줄 쓰기 — 상한을 넘거나 직렬화가 터지면 잘린 성공 대신 RESPONSE_TOO_LARGE(false 반환). stdout 이 닫혀 못 보냈어도 false */\n const write = async (o: Record<string, unknown>): Promise<boolean> => {\n let text: string\n let sent = true\n try {\n text = JSON.stringify(o, bytesToBase64)\n if (Buffer.byteLength(text) > maxResponseBytes) throw new RangeError(\"limit\")\n } catch {\n sent = false\n text = JSON.stringify({ ...(validId(o.id) ? { id: o.id } : {}), error: { code: \"RESPONSE_TOO_LARGE\", message: `응답이 상한(${maxResponseBytes}바이트)을 넘습니다 — transport.images \"files\" 로 이미지를 파일로 받으세요` } })\n }\n // 쓰기 콜백까지 기다린다 — drain 대기를 겸한다\n const delivered = await new Promise<boolean>((done, reject) => output.write(text + \"\\n\", err => {\n if (!err) return done(true)\n const code = (err as NodeJS.ErrnoException).code\n if (code !== \"EPIPE\" && code !== \"ERR_STREAM_DESTROYED\") return reject(err)\n // 답할 곳이 없으니 stdin 도 끊어 다음 줄이나 EOF 를 기다리지 않는다\n broken = true\n ;(input as { destroy?: () => void }).destroy?.()\n done(false)\n }))\n return sent && delivered\n }\n const fail = (id: unknown, code: WorkerErrorCode, message: string) =>\n write({ ...(validId(id) ? { id } : {}), error: { code, message } })\n\n await write({ ready: true, version: VERSION, protocol: PARSE_WORKER_PROTOCOL_V2, capabilities: [...CAPABILITIES] })\n\n /** stdout 이 닫혀 stdin 을 끊어 생긴 premature close 는 입력의 끝으로 본다 */\n async function* requests(): AsyncGenerator<{ line?: string; tooLarge?: true }> {\n try { yield* readLines(input, maxRequestBytes) } catch (err) {\n if (!broken || (err as NodeJS.ErrnoException).code !== \"ERR_STREAM_PREMATURE_CLOSE\") throw err\n }\n }\n\n for await (const { line, tooLarge } of requests()) {\n // stdout 이 닫혔으면 남은 요청은 답할 곳이 없다 — 파싱하지 않고 끝낸다\n if (broken) break\n if (tooLarge) { await fail(undefined, \"REQUEST_TOO_LARGE\", `요청이 상한(${maxRequestBytes}바이트)을 넘습니다`); continue }\n const t = line!.trim()\n if (!t) continue\n let raw: unknown\n try { raw = JSON.parse(t) } catch { await fail(undefined, \"INVALID_JSON\", \"잘못된 JSON 라인\"); continue }\n if (raw === null || typeof raw !== \"object\" || Array.isArray(raw)) { await fail(undefined, \"INVALID_REQUEST\", \"JSON 객체가 아닙니다\"); continue }\n const msg = raw as Record<string, unknown>\n if (msg.cmd === \"quit\") break\n const id = msg.id\n if (!validId(id)) { await fail(undefined, \"INVALID_REQUEST\", \"id 는 양의 안전한 정수여야 합니다\"); continue }\n if (msg.cmd !== undefined && msg.cmd !== \"parse\" && msg.cmd !== \"lint_blocks\") { await fail(id, \"UNSUPPORTED_COMMAND\", `지원하지 않는 cmd: ${String(msg.cmd).slice(0, 40)}`); continue }\n if (seen.has(id)) { await fail(id, \"DUPLICATE_ID\", `이미 쓴 id: ${id}`); continue }\n seen.add(id)\n if (msg.cmd === \"lint_blocks\") {\n const lr = lintBlocksRequestSchema.safeParse(msg)\n if (!lr.success) { await fail(id, \"INVALID_REQUEST\", issueText(lr.error, \"\")); continue }\n const { preset, ...flags } = lr.data.options ?? {}\n const key = preset?.trim()\n // 자기 키만 — 프로토타입 키(\"constructor\")가 프리셋으로 통과하지 않게\n if (key !== undefined && !Object.hasOwn(PRESET_ALIAS, key)) { await fail(id, \"INVALID_OPTIONS\", `알 수 없는 프리셋: ${key.slice(0, 40)}`); continue }\n let result: ReturnType<typeof lintBlocks>\n try { result = lintBlocks(lr.data.blocks, { ...flags, ...(key !== undefined ? { preset: PRESET_ALIAS[key] } : {}) }) } catch (err) {\n // 검수 예외 하나로 워커 루프가 끝나지 않게\n await fail(id, \"LINT_FAILED\", String((err as Error)?.message ?? err).slice(0, 200))\n continue\n }\n await write({ id, result })\n continue\n }\n const req = parseRequestSchema.safeParse(msg)\n if (!req.success) { await fail(id, \"INVALID_REQUEST\", issueText(req.error, \"\")); continue }\n const { file, transport } = req.data\n if (!isAbsolute(file)) { await fail(id, \"INVALID_REQUEST\", \"file 은 절대 경로여야 합니다\"); continue }\n const files = transport?.images === \"files\"\n if (files) {\n const dir = transport?.assetsDir\n let isDir = false\n try { isDir = !!dir && isAbsolute(dir) && statSync(dir).isDirectory() } catch { /* 없는 경로 */ }\n if (!isDir) { await fail(id, \"INVALID_REQUEST\", \"transport.images \\\"files\\\" 는 있는 디렉터리의 절대 경로 assetsDir 가 필요합니다\"); continue }\n }\n let options: ParseOptions\n try { options = toParseOptions(req.data.options, file) } catch (err) {\n await fail(id, (err as WorkerProtocolError).code, (err as Error).message)\n continue\n }\n const result = await parseWorkerFile(file, options)\n let assetsDir: string | undefined\n if (files) {\n try { assetsDir = await externalizeImages(result, transport!.assetsDir!, id) } catch (err) {\n await fail(id, \"ASSET_WRITE_FAILED\", (err as Error).message)\n continue\n }\n }\n const sent = await write({ id, rss: process.memoryUsage.rss(), ...(assetsDir ? { assetsDir } : {}), result })\n // 응답을 못 보냈으면(상한 초과·stdout 닫힘) 그 요청의 자산은 아무도 가리키지 않는다 — 미완료 자산으로 지운다\n if (!sent && assetsDir) rmSync(assetsDir, { recursive: true, force: true })\n }\n // 파이프 stdout 은 맥·윈도에서 비동기라 다 비운 뒤 돌아간다\n await new Promise<void>(done => output.write(\"\", () => done()))\n}\n"],"mappings":"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","names":["result"]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  blocksToPages
4
- } from "./chunk-EN3PK6OT.js";
4
+ } from "./chunk-7NTMM6PO.js";
5
5
  import {
6
6
  encodePng
7
7
  } from "./chunk-VKVDMH7X.js";
@@ -62,7 +62,7 @@ import {
62
62
  stripAbsorbedRunningLines,
63
63
  trimTrailingEmptyTableCols,
64
64
  wrapJoiner
65
- } from "./chunk-SRUBDR3Z.js";
65
+ } from "./chunk-VPSF5LEM.js";
66
66
  import {
67
67
  validateOcrOptions
68
68
  } from "./chunk-BYMPPVT3.js";
@@ -74,7 +74,7 @@ import {
74
74
  escapeLiteralTags,
75
75
  stripScriptTags,
76
76
  unframeLayoutTables
77
- } from "./chunk-P6FNIU5P.js";
77
+ } from "./chunk-KUC5I5MB.js";
78
78
  import {
79
79
  WINGDINGS,
80
80
  assignTableIds,
@@ -83,17 +83,17 @@ import {
83
83
  escapeLiteralDollar,
84
84
  mapPuaText,
85
85
  pairedNumber
86
- } from "./chunk-DBPDAG7N.js";
86
+ } from "./chunk-WDSTW3BD.js";
87
87
  import {
88
88
  ocrModelsCached,
89
89
  resolveOcrModels
90
- } from "./chunk-IZYYKE5F.js";
91
- import "./chunk-4VPN5MHS.js";
92
- import "./chunk-3M2BIQLZ.js";
90
+ } from "./chunk-R2GIGE5H.js";
91
+ import "./chunk-W24TJJNN.js";
92
+ import "./chunk-TDMBTG7U.js";
93
93
  import {
94
94
  KordocError,
95
95
  sanitizeHref
96
- } from "./chunk-Z5G6QNVH.js";
96
+ } from "./chunk-LMEF7FN5.js";
97
97
 
98
98
  // src/pdf/image-extract.ts
99
99
  import { createHash } from "crypto";
@@ -4013,7 +4013,7 @@ function mergeLinkRuns(markdown) {
4013
4013
 
4014
4014
  // src/pdf/formula-ocr.ts
4015
4015
  async function applyFormulaOcr(buffer, blocks, pageFilter, effectivePageCount, warnings, _onProgress) {
4016
- const formulaMod = await import("./formula-4GRNVWIQ.js");
4016
+ const formulaMod = await import("./formula-DSB574H7.js");
4017
4017
  const { FormulaPipeline, ensureFormulaModels } = formulaMod;
4018
4018
  await ensureFormulaModels((p) => {
4019
4019
  if (p.phase === "download" && p.total) {
@@ -4440,10 +4440,10 @@ async function parsePdfDocument(buffer, options) {
4440
4440
  }
4441
4441
  if (targets.size > 0) {
4442
4442
  try {
4443
- const { runPdfOcr } = await import("./pdf-ocr-TYIH23RP.js");
4443
+ const { runPdfOcr } = await import("./pdf-ocr-ENLVEEYL.js");
4444
4444
  const mode = typeof options?.ocr === "function" ? options.ocr : "builtin";
4445
4445
  const regionPages = new Map([...ocrRegions].filter(([p]) => options?.ocr !== "force" && !isImageBased && !pageQuality.find((q) => q.page === p)?.needsOcr));
4446
- const { builtinOcrConfig } = await import("./pdf-ocr-TYIH23RP.js");
4446
+ const { builtinOcrConfig } = await import("./pdf-ocr-ENLVEEYL.js");
4447
4447
  const ocrPageBlocks = await runPdfOcr(ocrBuffer, targets, mode, warnings, options?.onProgress, options?.tables !== false, vectorPageOps, regionPages, builtinOcrConfig(options), ocrLinesOut);
4448
4448
  for (const obs of ocrPageBlocks.values()) stripScriptTags({ blocks: obs });
4449
4449
  if (ocrPageBlocks.size > 0) {
@@ -4688,4 +4688,4 @@ export {
4688
4688
  parsePdfDocument,
4689
4689
  removeHeaderFooterBlocks
4690
4690
  };
4691
- //# sourceMappingURL=parser-IHCFHLHN.js.map
4691
+ //# sourceMappingURL=parser-C3ARF26I.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  blocksToPages,
3
3
  encodePng
4
- } from "./chunk-P35SCAJN.js";
4
+ } from "./chunk-3HN65YAL.js";
5
5
  import {
6
6
  hasRequestedPagesAfter,
7
7
  parsePageRange
@@ -61,7 +61,7 @@ import {
61
61
  stripAbsorbedRunningLines,
62
62
  trimTrailingEmptyTableCols,
63
63
  wrapJoiner
64
- } from "./chunk-PX6X4YOR.js";
64
+ } from "./chunk-JMOAMKAR.js";
65
65
  import {
66
66
  CELL_BASELINES,
67
67
  CELL_EDGES,
@@ -78,12 +78,12 @@ import {
78
78
  stripScriptTags,
79
79
  unframeLayoutTables,
80
80
  validateOcrOptions
81
- } from "./chunk-6YDPTTIY.js";
82
- import "./chunk-O2SLKE4L.js";
81
+ } from "./chunk-TW3V6FSH.js";
82
+ import "./chunk-E7B5CXYI.js";
83
83
  import {
84
84
  KordocError,
85
85
  sanitizeHref
86
- } from "./chunk-XLY5ZJRP.js";
86
+ } from "./chunk-WJAFE3Z6.js";
87
87
 
88
88
  // src/pdf/image-extract.ts
89
89
  import { createHash } from "crypto";
@@ -4003,7 +4003,7 @@ function mergeLinkRuns(markdown) {
4003
4003
 
4004
4004
  // src/pdf/formula-ocr.ts
4005
4005
  async function applyFormulaOcr(buffer, blocks, pageFilter, effectivePageCount, warnings, _onProgress) {
4006
- const formulaMod = await import("./formula-6Y467S4R.js");
4006
+ const formulaMod = await import("./formula-U2LZ67KI.js");
4007
4007
  const { FormulaPipeline, ensureFormulaModels } = formulaMod;
4008
4008
  await ensureFormulaModels((p) => {
4009
4009
  if (p.phase === "download" && p.total) {
@@ -4430,10 +4430,10 @@ async function parsePdfDocument(buffer, options) {
4430
4430
  }
4431
4431
  if (targets.size > 0) {
4432
4432
  try {
4433
- const { runPdfOcr } = await import("./pdf-ocr-H2247ZZH.js");
4433
+ const { runPdfOcr } = await import("./pdf-ocr-K53REDNY.js");
4434
4434
  const mode = typeof options?.ocr === "function" ? options.ocr : "builtin";
4435
4435
  const regionPages = new Map([...ocrRegions].filter(([p]) => options?.ocr !== "force" && !isImageBased && !pageQuality.find((q) => q.page === p)?.needsOcr));
4436
- const { builtinOcrConfig } = await import("./pdf-ocr-H2247ZZH.js");
4436
+ const { builtinOcrConfig } = await import("./pdf-ocr-K53REDNY.js");
4437
4437
  const ocrPageBlocks = await runPdfOcr(ocrBuffer, targets, mode, warnings, options?.onProgress, options?.tables !== false, vectorPageOps, regionPages, builtinOcrConfig(options), ocrLinesOut);
4438
4438
  for (const obs of ocrPageBlocks.values()) stripScriptTags({ blocks: obs });
4439
4439
  if (ocrPageBlocks.size > 0) {
@@ -4678,4 +4678,4 @@ export {
4678
4678
  parsePdfDocument,
4679
4679
  removeHeaderFooterBlocks
4680
4680
  };
4681
- //# sourceMappingURL=parser-J22QBXPP.js.map
4681
+ //# sourceMappingURL=parser-OBGWEWSU.js.map