mineru-open-sdk 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -60,7 +60,6 @@ module.exports = __toCommonJS(index_exports);
60
60
  // src/constants.ts
61
61
  var DEFAULT_BASE_URL = "https://mineru.net/api/v4";
62
62
  var DEFAULT_FLASH_BASE_URL = "https://mineru.net/api/v1/agent";
63
- var UPLOAD_TIMEOUT_MS = 3e5;
64
63
 
65
64
  // src/client.ts
66
65
  var import_promises2 = require("fs/promises");
@@ -223,8 +222,7 @@ var ApiClient = class {
223
222
  async putFile(url, data) {
224
223
  const resp = await fetch(url, {
225
224
  method: "PUT",
226
- body: data,
227
- signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS)
225
+ body: data
228
226
  });
229
227
  if (!resp.ok) {
230
228
  throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);
@@ -284,7 +282,7 @@ var FlashApiClient = class {
284
282
  return this.handle(resp);
285
283
  }
286
284
  async putFile(url, data) {
287
- const resp = await fetch(url, { method: "PUT", body: data, signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS) });
285
+ const resp = await fetch(url, { method: "PUT", body: data });
288
286
  if (!resp.ok) {
289
287
  throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);
290
288
  }
@@ -740,32 +738,26 @@ var MinerU = class {
740
738
  // Flash (agent) mode
741
739
  // ══════════════════════════════════════════════════════════════════
742
740
  async flashExtract(source, options = {}) {
743
- const { language = "ch", pageRange, ocr, formula, table, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;
741
+ const { language = "ch", pageRange, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;
744
742
  let taskId;
745
743
  if (isUrl(source)) {
746
- taskId = await this.flashSubmitUrl(source, language, pageRange, ocr, formula, table);
744
+ taskId = await this.flashSubmitUrl(source, language, pageRange);
747
745
  } else {
748
- taskId = await this.flashSubmitFile(source, language, pageRange, ocr, formula, table);
746
+ taskId = await this.flashSubmitFile(source, language, pageRange);
749
747
  }
750
748
  return this.flashWait(taskId, timeout);
751
749
  }
752
750
  // ── Flash internal helpers ──
753
- async flashSubmitUrl(url, language, pageRange, ocr, formula, table) {
751
+ async flashSubmitUrl(url, language, pageRange) {
754
752
  const payload = { url, language };
755
753
  if (pageRange != null) payload["page_range"] = pageRange;
756
- if (ocr != null) payload["is_ocr"] = ocr;
757
- if (formula != null) payload["enable_formula"] = formula;
758
- if (table != null) payload["enable_table"] = table;
759
754
  const body = await this.flashApi.post("/parse/url", payload);
760
755
  return body.data["task_id"];
761
756
  }
762
- async flashSubmitFile(filePath, language, pageRange, ocr, formula, table) {
757
+ async flashSubmitFile(filePath, language, pageRange) {
763
758
  const fileName = (0, import_node_path2.basename)(filePath);
764
759
  const payload = { file_name: fileName, language };
765
760
  if (pageRange != null) payload["page_range"] = pageRange;
766
- if (ocr != null) payload["is_ocr"] = ocr;
767
- if (formula != null) payload["enable_formula"] = formula;
768
- if (table != null) payload["enable_table"] = table;
769
761
  const body = await this.flashApi.post("/parse/file", payload);
770
762
  const taskId = body.data["task_id"];
771
763
  const fileUrl = body.data["file_url"];
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/client.ts","../src/errors.ts","../src/api.ts","../src/flash-api.ts","../src/models.ts","../src/zip.ts"],"sourcesContent":["export { DEFAULT_BASE_URL, DEFAULT_FLASH_BASE_URL } from \"./constants.js\";\n\nexport { MinerU } from \"./client.js\";\nexport type { ExtractOptions, BatchOptions, FlashExtractOptions, FileParam } from \"./client.js\";\n\nexport type { ExtractResult, Image, Progress } from \"./models.js\";\nexport {\n saveMarkdown,\n saveDocx,\n saveHtml,\n saveLatex,\n saveAll,\n progressPercent,\n progressToString,\n} from \"./models.js\";\n\nexport {\n MinerUError,\n AuthError,\n ParamError,\n FileTooLargeError,\n PageLimitError,\n TaskNotFoundError,\n ExtractFailedError,\n TimeoutError,\n QuotaExceededError,\n FlashFileTooLargeError,\n FlashUnsupportedTypeError,\n FlashPageLimitError,\n FlashParamError,\n NoAuthClientError,\n} from \"./errors.js\";\n","export const DEFAULT_BASE_URL = \"https://mineru.net/api/v4\";\n\nexport const DEFAULT_FLASH_BASE_URL = \"https://mineru.net/api/v1/agent\";\n\n/** Timeout for file uploads in milliseconds (PUT to pre-signed URL). */\nexport const UPLOAD_TIMEOUT_MS = 300_000;\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\n\nimport { ApiClient } from \"./api.js\";\nimport { DEFAULT_BASE_URL } from \"./constants.js\";\nimport { NoAuthClientError, TimeoutError } from \"./errors.js\";\nimport { FlashApiClient } from \"./flash-api.js\";\nimport type { ExtractResult, Progress } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\nimport { parseZip } from \"./zip.js\";\n\nconst MODEL_MAP: Record<string, string> = {\n pipeline: \"pipeline\",\n vlm: \"vlm\",\n html: \"MinerU-HTML\",\n};\n\nconst HTML_EXTENSIONS = new Set([\".html\", \".htm\"]);\n\nconst DEFAULT_SOURCE = \"open-api-sdk-js\";\n\n/** Default total business timeouts for extraction tasks (in seconds). */\nconst DEFAULT_TIMEOUT_POLL_SINGLE = 300;\nconst DEFAULT_TIMEOUT_POLL_BATCH = 1800;\n\nfunction isUrl(source: string): boolean {\n return source.startsWith(\"http://\") || source.startsWith(\"https://\");\n}\n\nfunction getExtension(source: string): string {\n if (isUrl(source)) {\n const path = source.split(\"?\")[0]!.split(\"#\")[0]!;\n const dot = path.lastIndexOf(\".\");\n return dot === -1 ? \"\" : path.slice(dot).toLowerCase();\n }\n return extname(source).toLowerCase();\n}\n\nfunction inferModel(source: string): string {\n return HTML_EXTENSIONS.has(getExtension(source)) ? \"MinerU-HTML\" : \"vlm\";\n}\n\nfunction resolveModel(model: string | undefined, source: string): string {\n if (model != null) {\n return MODEL_MAP[model] ?? model;\n }\n return inferModel(source);\n}\n\nexport interface ExtractOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n pages?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\nexport interface BatchOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for all tasks (polling). */\n timeout?: number;\n}\n\nexport interface FlashExtractOptions {\n language?: string;\n pageRange?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\n/** Per-file parameter overrides for batch methods. */\nexport interface FileParam {\n /** Override page_ranges for this file (e.g. \"1-10,15\"). */\n pages?: string;\n /** Override is_ocr for this file. */\n ocr?: boolean;\n /** Set data_id for this file. */\n dataId?: string;\n}\n\n/** Only includes fields the user explicitly set. Never assumes API defaults. */\nfunction buildApiOptions(\n modelVersion: string,\n opts: ExtractOptions | BatchOptions,\n): Record<string, unknown> {\n const o: Record<string, unknown> = { model_version: modelVersion };\n if (opts.formula !== undefined) o[\"enable_formula\"] = opts.formula;\n if (opts.table !== undefined) o[\"enable_table\"] = opts.table;\n if (opts.language !== undefined) o[\"language\"] = opts.language;\n if (opts.extraFormats?.length) {\n o[\"extra_formats\"] = opts.extraFormats;\n }\n return o;\n}\n\n/** Adds per-file fields (is_ocr, page_ranges, data_id) to a file entry. */\nfunction applyFileFields(\n entry: Record<string, unknown>,\n key: string,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n): void {\n const fp = fileParams?.[key];\n\n // OCR: per-file overrides global\n const effectiveOcr = fp?.ocr !== undefined ? fp.ocr : ocr;\n if (effectiveOcr !== undefined) entry[\"is_ocr\"] = effectiveOcr;\n\n // Pages: per-file overrides global\n const effectivePages = fp?.pages || pages;\n if (effectivePages) entry[\"page_ranges\"] = effectivePages;\n\n // DataID: per-file only\n if (fp?.dataId) entry[\"data_id\"] = fp.dataId;\n}\n\nfunction parseTaskResult(data: Record<string, unknown>): ExtractResult {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n result.filename = (data[\"file_name\"] as string) ?? null;\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n result.zipUrl = (data[\"full_zip_url\"] as string) ?? null;\n\n const ep = data[\"extract_progress\"] as Record<string, unknown> | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n } satisfies Progress;\n }\n return result;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * MinerU API client. Turn documents into Markdown with one method call.\n */\nexport class MinerU {\n private readonly api: ApiClient | null;\n private readonly flashApi: FlashApiClient;\n\n /**\n * @param token - API token.\n * @param baseUrl - API base URL.\n * @param flashBaseUrl - Flash API base URL.\n */\n constructor(\n token?: string,\n baseUrl = DEFAULT_BASE_URL,\n flashBaseUrl?: string,\n ) {\n const resolved = token ?? process.env[\"MINERU_TOKEN\"];\n if (resolved) {\n // ApiClient should ideally use DEFAULT_TIMEOUT_REQUEST internally\n this.api = new ApiClient(resolved, baseUrl, DEFAULT_SOURCE);\n } else {\n this.api = null; // flash-only mode\n }\n this.flashApi = new FlashApiClient(flashBaseUrl, DEFAULT_SOURCE);\n }\n\n setSource(source: string): void {\n if (this.api !== null) {\n this.api.setSource(source);\n }\n this.flashApi.setSource(source);\n }\n\n private requireAuth(): ApiClient {\n if (this.api === null) {\n throw new NoAuthClientError();\n }\n return this.api;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Synchronous (blocking) methods\n // ══════════════════════════════════════════════════════════════════\n\n async extract(\n source: string,\n options: ExtractOptions = {},\n ): Promise<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_SINGLE, ...opts } = options;\n const modelVersion = resolveModel(opts.model, source);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n let batchId: string;\n if (isUrl(source)) {\n batchId = await this.submitUrlsBatch([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n } else {\n batchId = await this.uploadAndSubmit([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n }\n const results = await this.waitBatch(batchId, timeout);\n return results[0]!;\n }\n\n async *extractBatch(\n sources: string[],\n options: BatchOptions = {},\n ): AsyncGenerator<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_BATCH, ...opts } = options;\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(opts.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n const batchIds: string[] = [];\n if (urls.length > 0) {\n batchIds.push(await this.submitUrlsBatch(urls, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n if (files.length > 0) {\n batchIds.push(await this.uploadAndSubmit(files, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n\n yield* this.yieldBatch(batchIds, sources.length, timeout);\n }\n\n async crawl(\n url: string,\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): Promise<ExtractResult> {\n return this.extract(url, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_SINGLE, ...options });\n }\n\n async *crawlBatch(\n urls: string[],\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): AsyncGenerator<ExtractResult> {\n yield* this.extractBatch(urls, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_BATCH, ...options });\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Async primitives (no polling, no waiting)\n // ══════════════════════════════════════════════════════════════════\n\n async submit(\n source: string,\n options: Omit<ExtractOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const modelVersion = resolveModel(options.model, source);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n if (isUrl(source)) {\n return this.submitUrlsBatch([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n return this.uploadAndSubmit([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n\n async submitBatch(\n sources: string[],\n options: Omit<BatchOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(options.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n if (urls.length === 0 && files.length === 0) {\n throw new Error(\"No sources provided.\");\n }\n if (urls.length > 0 && files.length > 0) {\n throw new Error(\n \"submitBatch() does not support mixing URLs and local files in one call. \" +\n \"Please submit them separately or use extractBatch() instead.\",\n );\n }\n\n if (urls.length > 0) {\n return this.submitUrlsBatch(urls, apiOpts, options.ocr, undefined, options.fileParams);\n }\n return this.uploadAndSubmit(files, apiOpts, options.ocr, undefined, options.fileParams);\n }\n\n async getTask(taskId: string): Promise<ExtractResult> {\n const api = this.requireAuth();\n const body = await api.get(`/extract/task/${taskId}`);\n const result = parseTaskResult(body.data);\n if (result.state === \"done\" && result.zipUrl) {\n return this.downloadAndParse(result);\n }\n return result;\n }\n\n async getBatch(batchId: string): Promise<ExtractResult[]> {\n const api = this.requireAuth();\n const body = await api.get(`/extract-results/batch/${batchId}`);\n const items = (body.data[\"extract_result\"] as Record<string, unknown>[]) ?? [];\n const results: ExtractResult[] = [];\n for (const item of items) {\n let r = parseTaskResult(item);\n if (r.state === \"done\" && r.zipUrl) {\n r = await this.downloadAndParse(r);\n }\n results.push(r);\n }\n return results;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Internal helpers\n // ══════════════════════════════════════════════════════════════════\n\n private async submitUrlsBatch(\n urls: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const files = urls.map((u) => {\n const entry: Record<string, unknown> = { url: u };\n applyFileFields(entry, u, ocr, pages, fileParams);\n return entry;\n });\n const body = await this.requireAuth().post(\"/extract/task/batch\", {\n files,\n ...opts,\n });\n return body.data[\"batch_id\"] as string;\n }\n\n private async uploadAndSubmit(\n filePaths: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const api = this.requireAuth();\n const filesMeta = filePaths.map((p) => {\n const entry: Record<string, unknown> = { name: basename(p) };\n applyFileFields(entry, p, ocr, pages, fileParams);\n return entry;\n });\n const body = await api.post(\"/file-urls/batch\", {\n files: filesMeta,\n ...opts,\n });\n const batchId = body.data[\"batch_id\"] as string;\n const uploadUrls = body.data[\"file_urls\"] as string[];\n\n for (let i = 0; i < filePaths.length; i++) {\n const data = await readFile(filePaths[i]!);\n await api.putFile(uploadUrls[i]!, new Uint8Array(data));\n }\n\n return batchId;\n }\n\n private async downloadAndParse(\n result: ExtractResult,\n ): Promise<ExtractResult> {\n const zipBytes = await this.requireAuth().download(result.zipUrl!);\n const parsed = parseZip(zipBytes, result.taskId, result.filename);\n parsed.zipUrl = result.zipUrl;\n return parsed;\n }\n\n private async waitBatch(\n batchId: string,\n timeout: number,\n ): Promise<ExtractResult[]> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const results = await this.getBatch(batchId);\n if (results.every((r) => r.state === \"done\" || r.state === \"failed\")) {\n return results;\n }\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchId);\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async *yieldBatch(\n batchIds: string[],\n total: number,\n timeout: number,\n ): AsyncGenerator<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n const yielded = new Set<string>();\n let interval = 2000;\n\n while (yielded.size < total) {\n for (const bid of batchIds) {\n const results = await this.getBatch(bid);\n for (let idx = 0; idx < results.length; idx++) {\n const key = `${bid}:${idx}`;\n const r = results[idx]!;\n if (!yielded.has(key) && (r.state === \"done\" || r.state === \"failed\")) {\n yielded.add(key);\n yield r;\n }\n }\n }\n\n if (yielded.size >= total) break;\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchIds.join(\",\"));\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Flash (agent) mode\n // ══════════════════════════════════════════════════════════════════\n\n async flashExtract(\n source: string,\n options: FlashExtractOptions = {},\n ): Promise<ExtractResult> {\n const { language = \"ch\", pageRange, ocr, formula, table, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;\n\n let taskId: string;\n if (isUrl(source)) {\n taskId = await this.flashSubmitUrl(source, language, pageRange, ocr, formula, table);\n } else {\n taskId = await this.flashSubmitFile(source, language, pageRange, ocr, formula, table);\n }\n\n return this.flashWait(taskId, timeout);\n }\n\n // ── Flash internal helpers ──\n\n private async flashSubmitUrl(\n url: string,\n language: string,\n pageRange?: string,\n ocr?: boolean,\n formula?: boolean,\n table?: boolean,\n ): Promise<string> {\n const payload: Record<string, unknown> = { url, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n if (ocr != null) payload[\"is_ocr\"] = ocr;\n if (formula != null) payload[\"enable_formula\"] = formula;\n if (table != null) payload[\"enable_table\"] = table;\n const body = await this.flashApi.post(\"/parse/url\", payload);\n return body.data[\"task_id\"] as string;\n }\n\n private async flashSubmitFile(\n filePath: string,\n language: string,\n pageRange?: string,\n ocr?: boolean,\n formula?: boolean,\n table?: boolean,\n ): Promise<string> {\n const fileName = basename(filePath);\n const payload: Record<string, unknown> = { file_name: fileName, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n if (ocr != null) payload[\"is_ocr\"] = ocr;\n if (formula != null) payload[\"enable_formula\"] = formula;\n if (table != null) payload[\"enable_table\"] = table;\n const body = await this.flashApi.post(\"/parse/file\", payload);\n const taskId = body.data[\"task_id\"] as string;\n const fileUrl = body.data[\"file_url\"] as string;\n\n const data = await readFile(filePath);\n await this.flashApi.putFile(fileUrl, new Uint8Array(data));\n return taskId;\n }\n\n private async flashWait(\n taskId: string,\n timeout: number,\n ): Promise<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const result = await this.flashGetTask(taskId);\n if (result.state === \"done\" || result.state === \"failed\") return result;\n if (Date.now() > deadline) throw new TimeoutError(timeout, taskId);\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async flashGetTask(taskId: string): Promise<ExtractResult> {\n const body = await this.flashApi.get(`/parse/${taskId}`);\n return this.parseFlashTask(body.data);\n }\n\n private async parseFlashTask(\n data: Record<string, unknown>,\n ): Promise<ExtractResult> {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n\n const ep = data[\"extract_progress\"] as\n | Record<string, unknown>\n | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n };\n }\n\n if (result.state === \"done\" && data[\"markdown_url\"]) {\n result.markdown = await this.flashApi.downloadText(\n data[\"markdown_url\"] as string,\n );\n }\n\n return result;\n }\n}\n","export class MinerUError extends Error {\n readonly code: string;\n readonly traceId: string;\n\n constructor(code: string | number, message: string, traceId = \"\") {\n const tag = traceId ? ` (trace: ${traceId})` : \"\";\n super(`[${code}] ${message}${tag}`);\n this.name = \"MinerUError\";\n this.code = String(code);\n this.traceId = traceId;\n }\n}\n\nexport class AuthError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"AuthError\";\n }\n}\n\nexport class ParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ParamError\";\n }\n}\n\nexport class FileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FileTooLargeError\";\n }\n}\n\nexport class PageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"PageLimitError\";\n }\n}\n\nexport class TaskNotFoundError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"TaskNotFoundError\";\n }\n}\n\nexport class ExtractFailedError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ExtractFailedError\";\n }\n}\n\nexport class TimeoutError extends MinerUError {\n readonly timeout: number;\n readonly taskId: string;\n\n constructor(timeout: number, taskId: string) {\n super(\"TIMEOUT\", `Task ${taskId} did not complete within ${timeout}s`);\n this.name = \"TimeoutError\";\n this.timeout = timeout;\n this.taskId = taskId;\n }\n}\n\nexport class QuotaExceededError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"QuotaExceededError\";\n }\n}\n\n// Flash API specific errors\n\nexport class FlashFileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashFileTooLargeError\";\n }\n}\n\nexport class FlashUnsupportedTypeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashUnsupportedTypeError\";\n }\n}\n\nexport class FlashPageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashPageLimitError\";\n }\n}\n\nexport class FlashParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashParamError\";\n }\n}\n\nexport class NoAuthClientError extends MinerUError {\n constructor() {\n super(\n \"-1\",\n \"This operation requires an authenticated client; pass token to MinerU() or set MINERU_TOKEN env var.\",\n );\n this.name = \"NoAuthClientError\";\n }\n}\n\nconst CODE_TO_ERROR: Record<string, typeof MinerUError> = {\n A0202: AuthError,\n A0211: AuthError,\n \"-500\": ParamError,\n \"-10002\": ParamError,\n \"-60005\": FileTooLargeError,\n \"-60006\": PageLimitError,\n \"-60010\": ExtractFailedError,\n \"-60012\": TaskNotFoundError,\n \"-60013\": MinerUError,\n \"-60018\": QuotaExceededError,\n \"-60019\": QuotaExceededError,\n \"-30001\": FlashFileTooLargeError,\n \"-30002\": FlashUnsupportedTypeError,\n \"-30003\": FlashPageLimitError,\n \"-30004\": FlashParamError,\n};\n\nexport function raiseForCode(\n code: number | string,\n msg: string,\n traceId = \"\",\n): never {\n const ErrorClass = CODE_TO_ERROR[String(code)] ?? MinerUError;\n throw new ErrorClass(code, msg, traceId);\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { UPLOAD_TIMEOUT_MS } from \"./constants.js\";\n\ninterface ApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(token: string, baseUrl: string, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<ApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<ApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n headers: this.headers,\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, {\n method: \"PUT\",\n body: data,\n signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS),\n });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async download(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return new Uint8Array(await resp.arrayBuffer());\n }\n\n private async handle(resp: Response): Promise<ApiResponse> {\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as ApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { DEFAULT_FLASH_BASE_URL, UPLOAD_TIMEOUT_MS } from \"./constants.js\";\n\ninterface FlashApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class FlashApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(baseUrl: string = DEFAULT_FLASH_BASE_URL, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = { \"Content-Type\": \"application/json\" };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<FlashApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<FlashApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, { method: \"PUT\", body: data, signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS) });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async downloadText(url: string): Promise<string> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return resp.text();\n }\n\n private async handle(resp: Response): Promise<FlashApiResponse> {\n if (resp.status === 429) {\n raiseForCode(\n \"RATE_LIMITED\",\n \"flash API rate limit exceeded; try again later\",\n );\n }\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as FlashApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface Image {\n name: string;\n data: Uint8Array;\n path: string;\n}\n\nexport interface Progress {\n extractedPages: number;\n totalPages: number;\n startTime: string;\n}\n\nexport function progressPercent(p: Progress): number {\n if (p.totalPages === 0) return 0;\n return (p.extractedPages / p.totalPages) * 100;\n}\n\nexport function progressToString(p: Progress): string {\n return `${p.extractedPages}/${p.totalPages} (${progressPercent(p).toFixed(0)}%)`;\n}\n\nexport interface ExtractResult {\n taskId: string;\n state: string;\n filename: string | null;\n errCode: string;\n error: string | null;\n zipUrl: string | null;\n\n progress: Progress | null;\n\n markdown: string | null;\n contentList: Record<string, unknown>[] | null;\n images: Image[];\n\n docx: Uint8Array | null;\n html: string | null;\n latex: string | null;\n\n /** @internal */\n _zipBytes: Uint8Array | null;\n}\n\nexport function createEmptyResult(\n taskId: string,\n state: string,\n): ExtractResult {\n return {\n taskId,\n state,\n filename: null,\n errCode: \"\",\n error: null,\n zipUrl: null,\n progress: null,\n markdown: null,\n contentList: null,\n images: [],\n docx: null,\n html: null,\n latex: null,\n _zipBytes: null,\n };\n}\n\nasync function ensureDir(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n\nexport async function saveMarkdown(\n result: ExtractResult,\n path: string,\n withImages = true,\n): Promise<void> {\n if (result.markdown == null) {\n throw new Error(\"No markdown content available (state != done)\");\n }\n await ensureDir(path);\n await writeFile(path, result.markdown, \"utf-8\");\n if (withImages && result.images.length > 0) {\n const imgDir = join(dirname(path), \"images\");\n await mkdir(imgDir, { recursive: true });\n for (const img of result.images) {\n await writeFile(join(imgDir, img.name), img.data);\n }\n }\n}\n\nexport async function saveDocx(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.docx == null) {\n throw new Error(\n \"No docx content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.docx);\n}\n\nexport async function saveHtml(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.html == null) {\n throw new Error(\n \"No html content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.html, \"utf-8\");\n}\n\nexport async function saveLatex(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.latex == null) {\n throw new Error(\n \"No latex content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.latex, \"utf-8\");\n}\n\nexport async function saveAll(\n result: ExtractResult,\n dir: string,\n): Promise<void> {\n if (result._zipBytes == null) {\n throw new Error(\"No zip data available (state != done)\");\n }\n const { unzipSync } = await import(\"fflate\");\n const entries = unzipSync(new Uint8Array(result._zipBytes));\n await mkdir(dir, { recursive: true });\n for (const [relativePath, content] of Object.entries(entries)) {\n if (relativePath.endsWith(\"/\")) continue;\n const fullPath = join(dir, relativePath);\n await ensureDir(fullPath);\n await writeFile(fullPath, content);\n }\n}\n","import { unzipSync } from \"fflate\";\nimport type { ExtractResult, Image } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\n\nconst IMAGE_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".svg\", \".webp\",\n]);\n\nfunction extname(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot === -1 ? \"\" : filename.slice(dot).toLowerCase();\n}\n\nfunction basename(filepath: string): string {\n const parts = filepath.replace(/\\\\/g, \"/\").split(\"/\");\n return parts[parts.length - 1] ?? \"\";\n}\n\nexport function parseZip(\n zipBytes: Uint8Array,\n taskId: string,\n filename: string | null = null,\n): ExtractResult {\n const result = createEmptyResult(taskId, \"done\");\n result.filename = filename;\n result._zipBytes = zipBytes;\n\n const entries = unzipSync(zipBytes);\n const images: Image[] = [];\n let contentList: Record<string, unknown>[] | null = null;\n\n for (const [relPath, data] of Object.entries(entries)) {\n if (relPath.endsWith(\"/\")) continue;\n\n const name = basename(relPath);\n const ext = extname(name);\n const text = () => new TextDecoder().decode(data);\n\n if (ext === \".md\") {\n result.markdown = text();\n } else if (\n name.endsWith(\"_content_list.json\") ||\n name === \"content_list.json\"\n ) {\n contentList = JSON.parse(text()) as Record<string, unknown>[];\n } else if (ext === \".json\" && contentList == null) {\n try {\n const parsed: unknown = JSON.parse(text());\n if (Array.isArray(parsed)) {\n contentList = parsed as Record<string, unknown>[];\n }\n } catch {\n // not a valid JSON array — skip\n }\n } else if (IMAGE_EXTENSIONS.has(ext)) {\n images.push({ name, data: new Uint8Array(data), path: relPath });\n } else if (ext === \".docx\") {\n result.docx = new Uint8Array(data);\n } else if (ext === \".html\" || ext === \".htm\") {\n result.html = text();\n } else if (ext === \".tex\") {\n result.latex = text();\n }\n }\n\n result.contentList = contentList;\n result.images = images;\n return result;\n}\n"],"mappings":"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","names":["import_promises","import_node_path","unzipSync"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/client.ts","../src/errors.ts","../src/api.ts","../src/flash-api.ts","../src/models.ts","../src/zip.ts"],"sourcesContent":["export { DEFAULT_BASE_URL, DEFAULT_FLASH_BASE_URL } from \"./constants.js\";\n\nexport { MinerU } from \"./client.js\";\nexport type { ExtractOptions, BatchOptions, FlashExtractOptions, FileParam } from \"./client.js\";\n\nexport type { ExtractResult, Image, Progress } from \"./models.js\";\nexport {\n saveMarkdown,\n saveDocx,\n saveHtml,\n saveLatex,\n saveAll,\n progressPercent,\n progressToString,\n} from \"./models.js\";\n\nexport {\n MinerUError,\n AuthError,\n ParamError,\n FileTooLargeError,\n PageLimitError,\n TaskNotFoundError,\n ExtractFailedError,\n TimeoutError,\n QuotaExceededError,\n FlashFileTooLargeError,\n FlashUnsupportedTypeError,\n FlashPageLimitError,\n FlashParamError,\n NoAuthClientError,\n} from \"./errors.js\";\n","export const DEFAULT_BASE_URL = \"https://mineru.net/api/v4\";\n\nexport const DEFAULT_FLASH_BASE_URL = \"https://mineru.net/api/v1/agent\";\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\n\nimport { ApiClient } from \"./api.js\";\nimport { DEFAULT_BASE_URL } from \"./constants.js\";\nimport { NoAuthClientError, TimeoutError } from \"./errors.js\";\nimport { FlashApiClient } from \"./flash-api.js\";\nimport type { ExtractResult, Progress } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\nimport { parseZip } from \"./zip.js\";\n\nconst MODEL_MAP: Record<string, string> = {\n pipeline: \"pipeline\",\n vlm: \"vlm\",\n html: \"MinerU-HTML\",\n};\n\nconst HTML_EXTENSIONS = new Set([\".html\", \".htm\"]);\n\nconst DEFAULT_SOURCE = \"open-api-sdk-js\";\n\n/** Default total business timeouts for extraction tasks (in seconds). */\nconst DEFAULT_TIMEOUT_POLL_SINGLE = 300;\nconst DEFAULT_TIMEOUT_POLL_BATCH = 1800;\n\nfunction isUrl(source: string): boolean {\n return source.startsWith(\"http://\") || source.startsWith(\"https://\");\n}\n\nfunction getExtension(source: string): string {\n if (isUrl(source)) {\n const path = source.split(\"?\")[0]!.split(\"#\")[0]!;\n const dot = path.lastIndexOf(\".\");\n return dot === -1 ? \"\" : path.slice(dot).toLowerCase();\n }\n return extname(source).toLowerCase();\n}\n\nfunction inferModel(source: string): string {\n return HTML_EXTENSIONS.has(getExtension(source)) ? \"MinerU-HTML\" : \"vlm\";\n}\n\nfunction resolveModel(model: string | undefined, source: string): string {\n if (model != null) {\n return MODEL_MAP[model] ?? model;\n }\n return inferModel(source);\n}\n\nexport interface ExtractOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n pages?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\nexport interface BatchOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for all tasks (polling). */\n timeout?: number;\n}\n\nexport interface FlashExtractOptions {\n language?: string;\n pageRange?: string;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\n/** Per-file parameter overrides for batch methods. */\nexport interface FileParam {\n /** Override page_ranges for this file (e.g. \"1-10,15\"). */\n pages?: string;\n /** Override is_ocr for this file. */\n ocr?: boolean;\n /** Set data_id for this file. */\n dataId?: string;\n}\n\n/** Only includes fields the user explicitly set. Never assumes API defaults. */\nfunction buildApiOptions(\n modelVersion: string,\n opts: ExtractOptions | BatchOptions,\n): Record<string, unknown> {\n const o: Record<string, unknown> = { model_version: modelVersion };\n if (opts.formula !== undefined) o[\"enable_formula\"] = opts.formula;\n if (opts.table !== undefined) o[\"enable_table\"] = opts.table;\n if (opts.language !== undefined) o[\"language\"] = opts.language;\n if (opts.extraFormats?.length) {\n o[\"extra_formats\"] = opts.extraFormats;\n }\n return o;\n}\n\n/** Adds per-file fields (is_ocr, page_ranges, data_id) to a file entry. */\nfunction applyFileFields(\n entry: Record<string, unknown>,\n key: string,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n): void {\n const fp = fileParams?.[key];\n\n // OCR: per-file overrides global\n const effectiveOcr = fp?.ocr !== undefined ? fp.ocr : ocr;\n if (effectiveOcr !== undefined) entry[\"is_ocr\"] = effectiveOcr;\n\n // Pages: per-file overrides global\n const effectivePages = fp?.pages || pages;\n if (effectivePages) entry[\"page_ranges\"] = effectivePages;\n\n // DataID: per-file only\n if (fp?.dataId) entry[\"data_id\"] = fp.dataId;\n}\n\nfunction parseTaskResult(data: Record<string, unknown>): ExtractResult {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n result.filename = (data[\"file_name\"] as string) ?? null;\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n result.zipUrl = (data[\"full_zip_url\"] as string) ?? null;\n\n const ep = data[\"extract_progress\"] as Record<string, unknown> | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n } satisfies Progress;\n }\n return result;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * MinerU API client. Turn documents into Markdown with one method call.\n */\nexport class MinerU {\n private readonly api: ApiClient | null;\n private readonly flashApi: FlashApiClient;\n\n /**\n * @param token - API token.\n * @param baseUrl - API base URL.\n * @param flashBaseUrl - Flash API base URL.\n */\n constructor(\n token?: string,\n baseUrl = DEFAULT_BASE_URL,\n flashBaseUrl?: string,\n ) {\n const resolved = token ?? process.env[\"MINERU_TOKEN\"];\n if (resolved) {\n // ApiClient should ideally use DEFAULT_TIMEOUT_REQUEST internally\n this.api = new ApiClient(resolved, baseUrl, DEFAULT_SOURCE);\n } else {\n this.api = null; // flash-only mode\n }\n this.flashApi = new FlashApiClient(flashBaseUrl, DEFAULT_SOURCE);\n }\n\n setSource(source: string): void {\n if (this.api !== null) {\n this.api.setSource(source);\n }\n this.flashApi.setSource(source);\n }\n\n private requireAuth(): ApiClient {\n if (this.api === null) {\n throw new NoAuthClientError();\n }\n return this.api;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Synchronous (blocking) methods\n // ══════════════════════════════════════════════════════════════════\n\n async extract(\n source: string,\n options: ExtractOptions = {},\n ): Promise<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_SINGLE, ...opts } = options;\n const modelVersion = resolveModel(opts.model, source);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n let batchId: string;\n if (isUrl(source)) {\n batchId = await this.submitUrlsBatch([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n } else {\n batchId = await this.uploadAndSubmit([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n }\n const results = await this.waitBatch(batchId, timeout);\n return results[0]!;\n }\n\n async *extractBatch(\n sources: string[],\n options: BatchOptions = {},\n ): AsyncGenerator<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_BATCH, ...opts } = options;\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(opts.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n const batchIds: string[] = [];\n if (urls.length > 0) {\n batchIds.push(await this.submitUrlsBatch(urls, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n if (files.length > 0) {\n batchIds.push(await this.uploadAndSubmit(files, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n\n yield* this.yieldBatch(batchIds, sources.length, timeout);\n }\n\n async crawl(\n url: string,\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): Promise<ExtractResult> {\n return this.extract(url, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_SINGLE, ...options });\n }\n\n async *crawlBatch(\n urls: string[],\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): AsyncGenerator<ExtractResult> {\n yield* this.extractBatch(urls, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_BATCH, ...options });\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Async primitives (no polling, no waiting)\n // ══════════════════════════════════════════════════════════════════\n\n async submit(\n source: string,\n options: Omit<ExtractOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const modelVersion = resolveModel(options.model, source);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n if (isUrl(source)) {\n return this.submitUrlsBatch([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n return this.uploadAndSubmit([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n\n async submitBatch(\n sources: string[],\n options: Omit<BatchOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(options.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n if (urls.length === 0 && files.length === 0) {\n throw new Error(\"No sources provided.\");\n }\n if (urls.length > 0 && files.length > 0) {\n throw new Error(\n \"submitBatch() does not support mixing URLs and local files in one call. \" +\n \"Please submit them separately or use extractBatch() instead.\",\n );\n }\n\n if (urls.length > 0) {\n return this.submitUrlsBatch(urls, apiOpts, options.ocr, undefined, options.fileParams);\n }\n return this.uploadAndSubmit(files, apiOpts, options.ocr, undefined, options.fileParams);\n }\n\n async getTask(taskId: string): Promise<ExtractResult> {\n const api = this.requireAuth();\n const body = await api.get(`/extract/task/${taskId}`);\n const result = parseTaskResult(body.data);\n if (result.state === \"done\" && result.zipUrl) {\n return this.downloadAndParse(result);\n }\n return result;\n }\n\n async getBatch(batchId: string): Promise<ExtractResult[]> {\n const api = this.requireAuth();\n const body = await api.get(`/extract-results/batch/${batchId}`);\n const items = (body.data[\"extract_result\"] as Record<string, unknown>[]) ?? [];\n const results: ExtractResult[] = [];\n for (const item of items) {\n let r = parseTaskResult(item);\n if (r.state === \"done\" && r.zipUrl) {\n r = await this.downloadAndParse(r);\n }\n results.push(r);\n }\n return results;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Internal helpers\n // ══════════════════════════════════════════════════════════════════\n\n private async submitUrlsBatch(\n urls: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const files = urls.map((u) => {\n const entry: Record<string, unknown> = { url: u };\n applyFileFields(entry, u, ocr, pages, fileParams);\n return entry;\n });\n const body = await this.requireAuth().post(\"/extract/task/batch\", {\n files,\n ...opts,\n });\n return body.data[\"batch_id\"] as string;\n }\n\n private async uploadAndSubmit(\n filePaths: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const api = this.requireAuth();\n const filesMeta = filePaths.map((p) => {\n const entry: Record<string, unknown> = { name: basename(p) };\n applyFileFields(entry, p, ocr, pages, fileParams);\n return entry;\n });\n const body = await api.post(\"/file-urls/batch\", {\n files: filesMeta,\n ...opts,\n });\n const batchId = body.data[\"batch_id\"] as string;\n const uploadUrls = body.data[\"file_urls\"] as string[];\n\n for (let i = 0; i < filePaths.length; i++) {\n const data = await readFile(filePaths[i]!);\n await api.putFile(uploadUrls[i]!, new Uint8Array(data));\n }\n\n return batchId;\n }\n\n private async downloadAndParse(\n result: ExtractResult,\n ): Promise<ExtractResult> {\n const zipBytes = await this.requireAuth().download(result.zipUrl!);\n const parsed = parseZip(zipBytes, result.taskId, result.filename);\n parsed.zipUrl = result.zipUrl;\n return parsed;\n }\n\n private async waitBatch(\n batchId: string,\n timeout: number,\n ): Promise<ExtractResult[]> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const results = await this.getBatch(batchId);\n if (results.every((r) => r.state === \"done\" || r.state === \"failed\")) {\n return results;\n }\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchId);\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async *yieldBatch(\n batchIds: string[],\n total: number,\n timeout: number,\n ): AsyncGenerator<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n const yielded = new Set<string>();\n let interval = 2000;\n\n while (yielded.size < total) {\n for (const bid of batchIds) {\n const results = await this.getBatch(bid);\n for (let idx = 0; idx < results.length; idx++) {\n const key = `${bid}:${idx}`;\n const r = results[idx]!;\n if (!yielded.has(key) && (r.state === \"done\" || r.state === \"failed\")) {\n yielded.add(key);\n yield r;\n }\n }\n }\n\n if (yielded.size >= total) break;\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchIds.join(\",\"));\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Flash (agent) mode\n // ══════════════════════════════════════════════════════════════════\n\n async flashExtract(\n source: string,\n options: FlashExtractOptions = {},\n ): Promise<ExtractResult> {\n const { language = \"ch\", pageRange, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;\n\n let taskId: string;\n if (isUrl(source)) {\n taskId = await this.flashSubmitUrl(source, language, pageRange);\n } else {\n taskId = await this.flashSubmitFile(source, language, pageRange);\n }\n\n return this.flashWait(taskId, timeout);\n }\n\n // ── Flash internal helpers ──\n\n private async flashSubmitUrl(\n url: string,\n language: string,\n pageRange?: string,\n ): Promise<string> {\n const payload: Record<string, unknown> = { url, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n const body = await this.flashApi.post(\"/parse/url\", payload);\n return body.data[\"task_id\"] as string;\n }\n\n private async flashSubmitFile(\n filePath: string,\n language: string,\n pageRange?: string,\n ): Promise<string> {\n const fileName = basename(filePath);\n const payload: Record<string, unknown> = { file_name: fileName, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n const body = await this.flashApi.post(\"/parse/file\", payload);\n const taskId = body.data[\"task_id\"] as string;\n const fileUrl = body.data[\"file_url\"] as string;\n\n const data = await readFile(filePath);\n await this.flashApi.putFile(fileUrl, new Uint8Array(data));\n return taskId;\n }\n\n private async flashWait(\n taskId: string,\n timeout: number,\n ): Promise<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const result = await this.flashGetTask(taskId);\n if (result.state === \"done\" || result.state === \"failed\") return result;\n if (Date.now() > deadline) throw new TimeoutError(timeout, taskId);\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async flashGetTask(taskId: string): Promise<ExtractResult> {\n const body = await this.flashApi.get(`/parse/${taskId}`);\n return this.parseFlashTask(body.data);\n }\n\n private async parseFlashTask(\n data: Record<string, unknown>,\n ): Promise<ExtractResult> {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n\n const ep = data[\"extract_progress\"] as\n | Record<string, unknown>\n | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n };\n }\n\n if (result.state === \"done\" && data[\"markdown_url\"]) {\n result.markdown = await this.flashApi.downloadText(\n data[\"markdown_url\"] as string,\n );\n }\n\n return result;\n }\n}\n","export class MinerUError extends Error {\n readonly code: string;\n readonly traceId: string;\n\n constructor(code: string | number, message: string, traceId = \"\") {\n const tag = traceId ? ` (trace: ${traceId})` : \"\";\n super(`[${code}] ${message}${tag}`);\n this.name = \"MinerUError\";\n this.code = String(code);\n this.traceId = traceId;\n }\n}\n\nexport class AuthError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"AuthError\";\n }\n}\n\nexport class ParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ParamError\";\n }\n}\n\nexport class FileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FileTooLargeError\";\n }\n}\n\nexport class PageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"PageLimitError\";\n }\n}\n\nexport class TaskNotFoundError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"TaskNotFoundError\";\n }\n}\n\nexport class ExtractFailedError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ExtractFailedError\";\n }\n}\n\nexport class TimeoutError extends MinerUError {\n readonly timeout: number;\n readonly taskId: string;\n\n constructor(timeout: number, taskId: string) {\n super(\"TIMEOUT\", `Task ${taskId} did not complete within ${timeout}s`);\n this.name = \"TimeoutError\";\n this.timeout = timeout;\n this.taskId = taskId;\n }\n}\n\nexport class QuotaExceededError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"QuotaExceededError\";\n }\n}\n\n// Flash API specific errors\n\nexport class FlashFileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashFileTooLargeError\";\n }\n}\n\nexport class FlashUnsupportedTypeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashUnsupportedTypeError\";\n }\n}\n\nexport class FlashPageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashPageLimitError\";\n }\n}\n\nexport class FlashParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashParamError\";\n }\n}\n\nexport class NoAuthClientError extends MinerUError {\n constructor() {\n super(\n \"-1\",\n \"This operation requires an authenticated client; pass token to MinerU() or set MINERU_TOKEN env var.\",\n );\n this.name = \"NoAuthClientError\";\n }\n}\n\nconst CODE_TO_ERROR: Record<string, typeof MinerUError> = {\n A0202: AuthError,\n A0211: AuthError,\n \"-500\": ParamError,\n \"-10002\": ParamError,\n \"-60005\": FileTooLargeError,\n \"-60006\": PageLimitError,\n \"-60010\": ExtractFailedError,\n \"-60012\": TaskNotFoundError,\n \"-60013\": MinerUError,\n \"-60018\": QuotaExceededError,\n \"-60019\": QuotaExceededError,\n \"-30001\": FlashFileTooLargeError,\n \"-30002\": FlashUnsupportedTypeError,\n \"-30003\": FlashPageLimitError,\n \"-30004\": FlashParamError,\n};\n\nexport function raiseForCode(\n code: number | string,\n msg: string,\n traceId = \"\",\n): never {\n const ErrorClass = CODE_TO_ERROR[String(code)] ?? MinerUError;\n throw new ErrorClass(code, msg, traceId);\n}\n","import { raiseForCode } from \"./errors.js\";\n\ninterface ApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(token: string, baseUrl: string, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<ApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<ApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n headers: this.headers,\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, {\n method: \"PUT\",\n body: data,\n });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async download(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return new Uint8Array(await resp.arrayBuffer());\n }\n\n private async handle(resp: Response): Promise<ApiResponse> {\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as ApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { DEFAULT_FLASH_BASE_URL } from \"./constants.js\";\n\ninterface FlashApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class FlashApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(baseUrl: string = DEFAULT_FLASH_BASE_URL, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = { \"Content-Type\": \"application/json\" };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<FlashApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<FlashApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, { method: \"PUT\", body: data });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async downloadText(url: string): Promise<string> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return resp.text();\n }\n\n private async handle(resp: Response): Promise<FlashApiResponse> {\n if (resp.status === 429) {\n raiseForCode(\n \"RATE_LIMITED\",\n \"flash API rate limit exceeded; try again later\",\n );\n }\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as FlashApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface Image {\n name: string;\n data: Uint8Array;\n path: string;\n}\n\nexport interface Progress {\n extractedPages: number;\n totalPages: number;\n startTime: string;\n}\n\nexport function progressPercent(p: Progress): number {\n if (p.totalPages === 0) return 0;\n return (p.extractedPages / p.totalPages) * 100;\n}\n\nexport function progressToString(p: Progress): string {\n return `${p.extractedPages}/${p.totalPages} (${progressPercent(p).toFixed(0)}%)`;\n}\n\nexport interface ExtractResult {\n taskId: string;\n state: string;\n filename: string | null;\n errCode: string;\n error: string | null;\n zipUrl: string | null;\n\n progress: Progress | null;\n\n markdown: string | null;\n contentList: Record<string, unknown>[] | null;\n images: Image[];\n\n docx: Uint8Array | null;\n html: string | null;\n latex: string | null;\n\n /** @internal */\n _zipBytes: Uint8Array | null;\n}\n\nexport function createEmptyResult(\n taskId: string,\n state: string,\n): ExtractResult {\n return {\n taskId,\n state,\n filename: null,\n errCode: \"\",\n error: null,\n zipUrl: null,\n progress: null,\n markdown: null,\n contentList: null,\n images: [],\n docx: null,\n html: null,\n latex: null,\n _zipBytes: null,\n };\n}\n\nasync function ensureDir(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n\nexport async function saveMarkdown(\n result: ExtractResult,\n path: string,\n withImages = true,\n): Promise<void> {\n if (result.markdown == null) {\n throw new Error(\"No markdown content available (state != done)\");\n }\n await ensureDir(path);\n await writeFile(path, result.markdown, \"utf-8\");\n if (withImages && result.images.length > 0) {\n const imgDir = join(dirname(path), \"images\");\n await mkdir(imgDir, { recursive: true });\n for (const img of result.images) {\n await writeFile(join(imgDir, img.name), img.data);\n }\n }\n}\n\nexport async function saveDocx(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.docx == null) {\n throw new Error(\n \"No docx content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.docx);\n}\n\nexport async function saveHtml(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.html == null) {\n throw new Error(\n \"No html content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.html, \"utf-8\");\n}\n\nexport async function saveLatex(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.latex == null) {\n throw new Error(\n \"No latex content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.latex, \"utf-8\");\n}\n\nexport async function saveAll(\n result: ExtractResult,\n dir: string,\n): Promise<void> {\n if (result._zipBytes == null) {\n throw new Error(\"No zip data available (state != done)\");\n }\n const { unzipSync } = await import(\"fflate\");\n const entries = unzipSync(new Uint8Array(result._zipBytes));\n await mkdir(dir, { recursive: true });\n for (const [relativePath, content] of Object.entries(entries)) {\n if (relativePath.endsWith(\"/\")) continue;\n const fullPath = join(dir, relativePath);\n await ensureDir(fullPath);\n await writeFile(fullPath, content);\n }\n}\n","import { unzipSync } from \"fflate\";\nimport type { ExtractResult, Image } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\n\nconst IMAGE_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".svg\", \".webp\",\n]);\n\nfunction extname(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot === -1 ? \"\" : filename.slice(dot).toLowerCase();\n}\n\nfunction basename(filepath: string): string {\n const parts = filepath.replace(/\\\\/g, \"/\").split(\"/\");\n return parts[parts.length - 1] ?? \"\";\n}\n\nexport function parseZip(\n zipBytes: Uint8Array,\n taskId: string,\n filename: string | null = null,\n): ExtractResult {\n const result = createEmptyResult(taskId, \"done\");\n result.filename = filename;\n result._zipBytes = zipBytes;\n\n const entries = unzipSync(zipBytes);\n const images: Image[] = [];\n let contentList: Record<string, unknown>[] | null = null;\n\n for (const [relPath, data] of Object.entries(entries)) {\n if (relPath.endsWith(\"/\")) continue;\n\n const name = basename(relPath);\n const ext = extname(name);\n const text = () => new TextDecoder().decode(data);\n\n if (ext === \".md\") {\n result.markdown = text();\n } else if (\n name.endsWith(\"_content_list.json\") ||\n name === \"content_list.json\"\n ) {\n contentList = JSON.parse(text()) as Record<string, unknown>[];\n } else if (ext === \".json\" && contentList == null) {\n try {\n const parsed: unknown = JSON.parse(text());\n if (Array.isArray(parsed)) {\n contentList = parsed as Record<string, unknown>[];\n }\n } catch {\n // not a valid JSON array — skip\n }\n } else if (IMAGE_EXTENSIONS.has(ext)) {\n images.push({ name, data: new Uint8Array(data), path: relPath });\n } else if (ext === \".docx\") {\n result.docx = new Uint8Array(data);\n } else if (ext === \".html\" || ext === \".htm\") {\n result.html = text();\n } else if (ext === \".tex\") {\n result.latex = text();\n }\n }\n\n result.contentList = contentList;\n result.images = images;\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,mBAAmB;AAEzB,IAAM,yBAAyB;;;ACFtC,IAAAA,mBAAyB;AACzB,IAAAC,oBAAkC;;;ACD3B,IAAM,cAAN,cAA0B,MAAM;AAAA,EAC5B;AAAA,EACA;AAAA,EAET,YAAY,MAAuB,SAAiB,UAAU,IAAI;AAChE,UAAM,MAAM,UAAU,YAAY,OAAO,MAAM;AAC/C,UAAM,IAAI,IAAI,KAAK,OAAO,GAAG,GAAG,EAAE;AAClC,SAAK,OAAO;AACZ,SAAK,OAAO,OAAO,IAAI;AACvB,SAAK,UAAU;AAAA,EACjB;AACF;AAEO,IAAM,YAAN,cAAwB,YAAY;AAAA,EACzC,YAAY,MAAuB,SAAiB,UAAU,IAAI;AAChE,UAAM,MAAM,SAAS,OAAO;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,aAAN,cAAyB,YAAY;AAAA,EAC1C,YAAY,MAAuB,SAAiB,UAAU,IAAI;AAChE,UAAM,MAAM,SAAS,OAAO;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,oBAAN,cAAgC,YAAY;AAAA,EACjD,YAAY,MAAuB,SAAiB,UAAU,IAAI;AAChE,UAAM,MAAM,SAAS,OAAO;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,iBAAN,cAA6B,YAAY;AAAA,EAC9C,YAAY,MAAuB,SAAiB,UAAU,IAAI;AAChE,UAAM,MAAM,SAAS,OAAO;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,oBAAN,cAAgC,YAAY;AAAA,EACjD,YAAY,MAAuB,SAAiB,UAAU,IAAI;AAChE,UAAM,MAAM,SAAS,OAAO;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,YAAY;AAAA,EAClD,YAAY,MAAuB,SAAiB,UAAU,IAAI;AAChE,UAAM,MAAM,SAAS,OAAO;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,eAAN,cAA2B,YAAY;AAAA,EACnC;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,QAAgB;AAC3C,UAAM,WAAW,QAAQ,MAAM,4BAA4B,OAAO,GAAG;AACrE,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAChB;AACF;AAEO,IAAM,qBAAN,cAAiC,YAAY;AAAA,EAClD,YAAY,MAAuB,SAAiB,UAAU,IAAI;AAChE,UAAM,MAAM,SAAS,OAAO;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAIO,IAAM,yBAAN,cAAqC,YAAY;AAAA,EACtD,YAAY,MAAuB,SAAiB,UAAU,IAAI;AAChE,UAAM,MAAM,SAAS,OAAO;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,4BAAN,cAAwC,YAAY;AAAA,EACzD,YAAY,MAAuB,SAAiB,UAAU,IAAI;AAChE,UAAM,MAAM,SAAS,OAAO;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,sBAAN,cAAkC,YAAY;AAAA,EACnD,YAAY,MAAuB,SAAiB,UAAU,IAAI;AAChE,UAAM,MAAM,SAAS,OAAO;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,YAAY;AAAA,EAC/C,YAAY,MAAuB,SAAiB,UAAU,IAAI;AAChE,UAAM,MAAM,SAAS,OAAO;AAC5B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,oBAAN,cAAgC,YAAY;AAAA,EACjD,cAAc;AACZ;AAAA,MACE;AAAA,MACA;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAEA,IAAM,gBAAoD;AAAA,EACxD,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AACZ;AAEO,SAAS,aACd,MACA,KACA,UAAU,IACH;AACP,QAAM,aAAa,cAAc,OAAO,IAAI,CAAC,KAAK;AAClD,QAAM,IAAI,WAAW,MAAM,KAAK,OAAO;AACzC;;;AClIO,IAAM,YAAN,MAAgB;AAAA,EACJ;AAAA,EACA;AAAA,EACT;AAAA,EAER,YAAY,OAAe,SAAiB,SAAS,IAAI;AACvD,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,MACb,eAAe,UAAU,KAAK;AAAA,MAC9B,gBAAgB;AAAA,IAClB;AACA,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,UAAU,QAAsB;AAC9B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KACJ,MACA,MACsB;AACtB,UAAM,UAAkC,EAAE,GAAG,KAAK,QAAQ;AAC1D,QAAI,KAAK,QAAQ;AACf,cAAQ,QAAQ,IAAI,KAAK;AAAA,IAC3B;AACA,UAAM,OAAO,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MACjD,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AACD,WAAO,KAAK,OAAO,IAAI;AAAA,EACzB;AAAA,EAEA,MAAM,IAAI,MAAoC;AAC5C,UAAM,OAAO,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MACjD,QAAQ;AAAA,MACR,SAAS,KAAK;AAAA,IAChB,CAAC;AACD,WAAO,KAAK,OAAO,IAAI;AAAA,EACzB;AAAA,EAEA,MAAM,QAAQ,KAAa,MAAiC;AAC1D,UAAM,OAAO,MAAM,MAAM,KAAK;AAAA,MAC5B,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AACD,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,kBAAkB,KAAK,MAAM,IAAI,KAAK,UAAU,EAAE;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,KAAkC;AAC/C,UAAM,OAAO,MAAM,MAAM,KAAK,EAAE,UAAU,SAAS,CAAC;AACpD,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,oBAAoB,KAAK,MAAM,IAAI,KAAK,UAAU,EAAE;AAAA,IACtE;AACA,WAAO,IAAI,WAAW,MAAM,KAAK,YAAY,CAAC;AAAA,EAChD;AAAA,EAEA,MAAc,OAAO,MAAsC;AACzD,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,OAAO,MAAM,KAAK,KAAK,EAAE,MAAM,MAAM,EAAE;AAC7C,YAAM,IAAI;AAAA,QACR,QAAQ,KAAK,MAAM,KAAK,KAAK,UAAU,GAAG,OAAO,WAAM,IAAI,KAAK,EAAE;AAAA,MACpE;AAAA,IACF;AACA,UAAM,OAAQ,MAAM,KAAK,KAAK;AAC9B,QAAI,KAAK,SAAS,GAAG;AACnB,mBAAa,KAAK,MAAM,KAAK,OAAO,iBAAiB,KAAK,YAAY,EAAE;AAAA,IAC1E;AACA,WAAO;AAAA,EACT;AACF;;;ACxEO,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EACA;AAAA,EACT;AAAA,EAER,YAAY,UAAkB,wBAAwB,SAAS,IAAI;AACjE,SAAK,UAAU;AACf,SAAK,UAAU,EAAE,gBAAgB,mBAAmB;AACpD,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,UAAU,QAAsB;AAC9B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KACJ,MACA,MAC2B;AAC3B,UAAM,UAAkC,EAAE,GAAG,KAAK,QAAQ;AAC1D,QAAI,KAAK,QAAQ;AACf,cAAQ,QAAQ,IAAI,KAAK;AAAA,IAC3B;AACA,UAAM,OAAO,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MACjD,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AACD,WAAO,KAAK,OAAO,IAAI;AAAA,EACzB;AAAA,EAEA,MAAM,IAAI,MAAyC;AACjD,UAAM,OAAO,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MACjD,QAAQ;AAAA,IACV,CAAC;AACD,WAAO,KAAK,OAAO,IAAI;AAAA,EACzB;AAAA,EAEA,MAAM,QAAQ,KAAa,MAAiC;AAC1D,UAAM,OAAO,MAAM,MAAM,KAAK,EAAE,QAAQ,OAAO,MAAM,KAAK,CAAC;AAC3D,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,kBAAkB,KAAK,MAAM,IAAI,KAAK,UAAU,EAAE;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,KAA8B;AAC/C,UAAM,OAAO,MAAM,MAAM,KAAK,EAAE,UAAU,SAAS,CAAC;AACpD,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,oBAAoB,KAAK,MAAM,IAAI,KAAK,UAAU,EAAE;AAAA,IACtE;AACA,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA,EAEA,MAAc,OAAO,MAA2C;AAC9D,QAAI,KAAK,WAAW,KAAK;AACvB;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,OAAO,MAAM,KAAK,KAAK,EAAE,MAAM,MAAM,EAAE;AAC7C,YAAM,IAAI;AAAA,QACR,QAAQ,KAAK,MAAM,KAAK,KAAK,UAAU,GAAG,OAAO,WAAM,IAAI,KAAK,EAAE;AAAA,MACpE;AAAA,IACF;AACA,UAAM,OAAQ,MAAM,KAAK,KAAK;AAC9B,QAAI,KAAK,SAAS,GAAG;AACnB,mBAAa,KAAK,MAAM,KAAK,OAAO,iBAAiB,KAAK,YAAY,EAAE;AAAA,IAC1E;AACA,WAAO;AAAA,EACT;AACF;;;AClFA,sBAAiC;AACjC,uBAA8B;AAcvB,SAAS,gBAAgB,GAAqB;AACnD,MAAI,EAAE,eAAe,EAAG,QAAO;AAC/B,SAAQ,EAAE,iBAAiB,EAAE,aAAc;AAC7C;AAEO,SAAS,iBAAiB,GAAqB;AACpD,SAAO,GAAG,EAAE,cAAc,IAAI,EAAE,UAAU,KAAK,gBAAgB,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC9E;AAwBO,SAAS,kBACd,QACA,OACe;AACf,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AACF;AAEA,eAAe,UAAU,UAAiC;AACxD,YAAM,2BAAM,0BAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD;AAEA,eAAsB,aACpB,QACA,MACA,aAAa,MACE;AACf,MAAI,OAAO,YAAY,MAAM;AAC3B,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,QAAM,UAAU,IAAI;AACpB,YAAM,2BAAU,MAAM,OAAO,UAAU,OAAO;AAC9C,MAAI,cAAc,OAAO,OAAO,SAAS,GAAG;AAC1C,UAAM,aAAS,2BAAK,0BAAQ,IAAI,GAAG,QAAQ;AAC3C,cAAM,uBAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AACvC,eAAW,OAAO,OAAO,QAAQ;AAC/B,gBAAM,+BAAU,uBAAK,QAAQ,IAAI,IAAI,GAAG,IAAI,IAAI;AAAA,IAClD;AAAA,EACF;AACF;AAEA,eAAsB,SACpB,QACA,MACe;AACf,MAAI,OAAO,QAAQ,MAAM;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,IAAI;AACpB,YAAM,2BAAU,MAAM,OAAO,IAAI;AACnC;AAEA,eAAsB,SACpB,QACA,MACe;AACf,MAAI,OAAO,QAAQ,MAAM;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,IAAI;AACpB,YAAM,2BAAU,MAAM,OAAO,MAAM,OAAO;AAC5C;AAEA,eAAsB,UACpB,QACA,MACe;AACf,MAAI,OAAO,SAAS,MAAM;AACxB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,IAAI;AACpB,YAAM,2BAAU,MAAM,OAAO,OAAO,OAAO;AAC7C;AAEA,eAAsB,QACpB,QACA,KACe;AACf,MAAI,OAAO,aAAa,MAAM;AAC5B,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AACA,QAAM,EAAE,WAAAC,WAAU,IAAI,MAAM,OAAO,QAAQ;AAC3C,QAAM,UAAUA,WAAU,IAAI,WAAW,OAAO,SAAS,CAAC;AAC1D,YAAM,uBAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,aAAW,CAAC,cAAc,OAAO,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC7D,QAAI,aAAa,SAAS,GAAG,EAAG;AAChC,UAAM,eAAW,uBAAK,KAAK,YAAY;AACvC,UAAM,UAAU,QAAQ;AACxB,cAAM,2BAAU,UAAU,OAAO;AAAA,EACnC;AACF;;;AClJA,oBAA0B;AAI1B,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AACnD,CAAC;AAED,SAAS,QAAQ,UAA0B;AACzC,QAAM,MAAM,SAAS,YAAY,GAAG;AACpC,SAAO,QAAQ,KAAK,KAAK,SAAS,MAAM,GAAG,EAAE,YAAY;AAC3D;AAEA,SAAS,SAAS,UAA0B;AAC1C,QAAM,QAAQ,SAAS,QAAQ,OAAO,GAAG,EAAE,MAAM,GAAG;AACpD,SAAO,MAAM,MAAM,SAAS,CAAC,KAAK;AACpC;AAEO,SAAS,SACd,UACA,QACA,WAA0B,MACX;AACf,QAAM,SAAS,kBAAkB,QAAQ,MAAM;AAC/C,SAAO,WAAW;AAClB,SAAO,YAAY;AAEnB,QAAM,cAAU,yBAAU,QAAQ;AAClC,QAAM,SAAkB,CAAC;AACzB,MAAI,cAAgD;AAEpD,aAAW,CAAC,SAAS,IAAI,KAAK,OAAO,QAAQ,OAAO,GAAG;AACrD,QAAI,QAAQ,SAAS,GAAG,EAAG;AAE3B,UAAM,OAAO,SAAS,OAAO;AAC7B,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,OAAO,MAAM,IAAI,YAAY,EAAE,OAAO,IAAI;AAEhD,QAAI,QAAQ,OAAO;AACjB,aAAO,WAAW,KAAK;AAAA,IACzB,WACE,KAAK,SAAS,oBAAoB,KAClC,SAAS,qBACT;AACA,oBAAc,KAAK,MAAM,KAAK,CAAC;AAAA,IACjC,WAAW,QAAQ,WAAW,eAAe,MAAM;AACjD,UAAI;AACF,cAAM,SAAkB,KAAK,MAAM,KAAK,CAAC;AACzC,YAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,wBAAc;AAAA,QAChB;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF,WAAW,iBAAiB,IAAI,GAAG,GAAG;AACpC,aAAO,KAAK,EAAE,MAAM,MAAM,IAAI,WAAW,IAAI,GAAG,MAAM,QAAQ,CAAC;AAAA,IACjE,WAAW,QAAQ,SAAS;AAC1B,aAAO,OAAO,IAAI,WAAW,IAAI;AAAA,IACnC,WAAW,QAAQ,WAAW,QAAQ,QAAQ;AAC5C,aAAO,OAAO,KAAK;AAAA,IACrB,WAAW,QAAQ,QAAQ;AACzB,aAAO,QAAQ,KAAK;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,cAAc;AACrB,SAAO,SAAS;AAChB,SAAO;AACT;;;ALzDA,IAAM,YAAoC;AAAA,EACxC,UAAU;AAAA,EACV,KAAK;AAAA,EACL,MAAM;AACR;AAEA,IAAM,kBAAkB,oBAAI,IAAI,CAAC,SAAS,MAAM,CAAC;AAEjD,IAAM,iBAAiB;AAGvB,IAAM,8BAA8B;AACpC,IAAM,6BAA6B;AAEnC,SAAS,MAAM,QAAyB;AACtC,SAAO,OAAO,WAAW,SAAS,KAAK,OAAO,WAAW,UAAU;AACrE;AAEA,SAAS,aAAa,QAAwB;AAC5C,MAAI,MAAM,MAAM,GAAG;AACjB,UAAM,OAAO,OAAO,MAAM,GAAG,EAAE,CAAC,EAAG,MAAM,GAAG,EAAE,CAAC;AAC/C,UAAM,MAAM,KAAK,YAAY,GAAG;AAChC,WAAO,QAAQ,KAAK,KAAK,KAAK,MAAM,GAAG,EAAE,YAAY;AAAA,EACvD;AACA,aAAO,2BAAQ,MAAM,EAAE,YAAY;AACrC;AAEA,SAAS,WAAW,QAAwB;AAC1C,SAAO,gBAAgB,IAAI,aAAa,MAAM,CAAC,IAAI,gBAAgB;AACrE;AAEA,SAAS,aAAa,OAA2B,QAAwB;AACvE,MAAI,SAAS,MAAM;AACjB,WAAO,UAAU,KAAK,KAAK;AAAA,EAC7B;AACA,SAAO,WAAW,MAAM;AAC1B;AA+CA,SAAS,gBACP,cACA,MACyB;AACzB,QAAM,IAA6B,EAAE,eAAe,aAAa;AACjE,MAAI,KAAK,YAAY,OAAW,GAAE,gBAAgB,IAAI,KAAK;AAC3D,MAAI,KAAK,UAAU,OAAW,GAAE,cAAc,IAAI,KAAK;AACvD,MAAI,KAAK,aAAa,OAAW,GAAE,UAAU,IAAI,KAAK;AACtD,MAAI,KAAK,cAAc,QAAQ;AAC7B,MAAE,eAAe,IAAI,KAAK;AAAA,EAC5B;AACA,SAAO;AACT;AAGA,SAAS,gBACP,OACA,KACA,KACA,OACA,YACM;AACN,QAAM,KAAK,aAAa,GAAG;AAG3B,QAAM,eAAe,IAAI,QAAQ,SAAY,GAAG,MAAM;AACtD,MAAI,iBAAiB,OAAW,OAAM,QAAQ,IAAI;AAGlD,QAAM,iBAAiB,IAAI,SAAS;AACpC,MAAI,eAAgB,OAAM,aAAa,IAAI;AAG3C,MAAI,IAAI,OAAQ,OAAM,SAAS,IAAI,GAAG;AACxC;AAEA,SAAS,gBAAgB,MAA8C;AACrE,QAAM,SAAS;AAAA,IACZ,KAAK,SAAS,KAAgB;AAAA,IAC9B,KAAK,OAAO,KAAgB;AAAA,EAC/B;AACA,SAAO,WAAY,KAAK,WAAW,KAAgB;AACnD,QAAM,aAAa,KAAK,UAAU;AAClC,SAAO,UAAU,cAAc,OAAO,KAAK,OAAO,UAAU;AAC5D,SAAO,QAAS,KAAK,SAAS,KAAgB;AAC9C,SAAO,SAAU,KAAK,cAAc,KAAgB;AAEpD,QAAM,KAAK,KAAK,kBAAkB;AAClC,MAAI,IAAI;AACN,WAAO,WAAW;AAAA,MAChB,gBAAiB,GAAG,iBAAiB,KAAgB;AAAA,MACrD,YAAa,GAAG,aAAa,KAAgB;AAAA,MAC7C,WAAY,GAAG,YAAY,KAAgB;AAAA,IAC7C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAKO,IAAM,SAAN,MAAa;AAAA,EACD;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,YACE,OACA,UAAU,kBACV,cACA;AACA,UAAM,WAAW,SAAS,QAAQ,IAAI,cAAc;AACpD,QAAI,UAAU;AAEZ,WAAK,MAAM,IAAI,UAAU,UAAU,SAAS,cAAc;AAAA,IAC5D,OAAO;AACL,WAAK,MAAM;AAAA,IACb;AACA,SAAK,WAAW,IAAI,eAAe,cAAc,cAAc;AAAA,EACjE;AAAA,EAEA,UAAU,QAAsB;AAC9B,QAAI,KAAK,QAAQ,MAAM;AACrB,WAAK,IAAI,UAAU,MAAM;AAAA,IAC3B;AACA,SAAK,SAAS,UAAU,MAAM;AAAA,EAChC;AAAA,EAEQ,cAAyB;AAC/B,QAAI,KAAK,QAAQ,MAAM;AACrB,YAAM,IAAI,kBAAkB;AAAA,IAC9B;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QACJ,QACA,UAA0B,CAAC,GACH;AACxB,SAAK,YAAY;AACjB,UAAM,EAAE,UAAU,6BAA6B,GAAG,KAAK,IAAI;AAC3D,UAAM,eAAe,aAAa,KAAK,OAAO,MAAM;AACpD,UAAM,UAAU,gBAAgB,cAAc,IAAI;AAElD,QAAI;AACJ,QAAI,MAAM,MAAM,GAAG;AACjB,gBAAU,MAAM,KAAK,gBAAgB,CAAC,MAAM,GAAG,SAAS,KAAK,KAAK,KAAK,OAAO,KAAK,UAAU;AAAA,IAC/F,OAAO;AACL,gBAAU,MAAM,KAAK,gBAAgB,CAAC,MAAM,GAAG,SAAS,KAAK,KAAK,KAAK,OAAO,KAAK,UAAU;AAAA,IAC/F;AACA,UAAM,UAAU,MAAM,KAAK,UAAU,SAAS,OAAO;AACrD,WAAO,QAAQ,CAAC;AAAA,EAClB;AAAA,EAEA,OAAO,aACL,SACA,UAAwB,CAAC,GACM;AAC/B,SAAK,YAAY;AACjB,UAAM,EAAE,UAAU,4BAA4B,GAAG,KAAK,IAAI;AAC1D,UAAM,cAAc,QAAQ,CAAC,KAAK;AAClC,UAAM,eAAe,aAAa,KAAK,OAAO,WAAW;AACzD,UAAM,UAAU,gBAAgB,cAAc,IAAI;AAElD,UAAM,OAAO,QAAQ,OAAO,KAAK;AACjC,UAAM,QAAQ,QAAQ,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAE7C,UAAM,WAAqB,CAAC;AAC5B,QAAI,KAAK,SAAS,GAAG;AACnB,eAAS,KAAK,MAAM,KAAK,gBAAgB,MAAM,SAAS,KAAK,KAAK,QAAW,KAAK,UAAU,CAAC;AAAA,IAC/F;AACA,QAAI,MAAM,SAAS,GAAG;AACpB,eAAS,KAAK,MAAM,KAAK,gBAAgB,OAAO,SAAS,KAAK,KAAK,QAAW,KAAK,UAAU,CAAC;AAAA,IAChG;AAEA,WAAO,KAAK,WAAW,UAAU,QAAQ,QAAQ,OAAO;AAAA,EAC1D;AAAA,EAEA,MAAM,MACJ,KACA,UAAyD,CAAC,GAClC;AACxB,WAAO,KAAK,QAAQ,KAAK,EAAE,OAAO,QAAQ,SAAS,6BAA6B,GAAG,QAAQ,CAAC;AAAA,EAC9F;AAAA,EAEA,OAAO,WACL,MACA,UAAyD,CAAC,GAC3B;AAC/B,WAAO,KAAK,aAAa,MAAM,EAAE,OAAO,QAAQ,SAAS,4BAA4B,GAAG,QAAQ,CAAC;AAAA,EACnG;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OACJ,QACA,UAA2C,CAAC,GAC3B;AACjB,SAAK,YAAY;AACjB,UAAM,eAAe,aAAa,QAAQ,OAAO,MAAM;AACvD,UAAM,UAAU,gBAAgB,cAAc,OAAO;AAErD,QAAI,MAAM,MAAM,GAAG;AACjB,aAAO,KAAK,gBAAgB,CAAC,MAAM,GAAG,SAAS,QAAQ,KAAK,QAAQ,OAAO,QAAQ,UAAU;AAAA,IAC/F;AACA,WAAO,KAAK,gBAAgB,CAAC,MAAM,GAAG,SAAS,QAAQ,KAAK,QAAQ,OAAO,QAAQ,UAAU;AAAA,EAC/F;AAAA,EAEA,MAAM,YACJ,SACA,UAAyC,CAAC,GACzB;AACjB,SAAK,YAAY;AACjB,UAAM,cAAc,QAAQ,CAAC,KAAK;AAClC,UAAM,eAAe,aAAa,QAAQ,OAAO,WAAW;AAC5D,UAAM,UAAU,gBAAgB,cAAc,OAAO;AAErD,UAAM,OAAO,QAAQ,OAAO,KAAK;AACjC,UAAM,QAAQ,QAAQ,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAE7C,QAAI,KAAK,WAAW,KAAK,MAAM,WAAW,GAAG;AAC3C,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,QAAI,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG;AACvC,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,GAAG;AACnB,aAAO,KAAK,gBAAgB,MAAM,SAAS,QAAQ,KAAK,QAAW,QAAQ,UAAU;AAAA,IACvF;AACA,WAAO,KAAK,gBAAgB,OAAO,SAAS,QAAQ,KAAK,QAAW,QAAQ,UAAU;AAAA,EACxF;AAAA,EAEA,MAAM,QAAQ,QAAwC;AACpD,UAAM,MAAM,KAAK,YAAY;AAC7B,UAAM,OAAO,MAAM,IAAI,IAAI,iBAAiB,MAAM,EAAE;AACpD,UAAM,SAAS,gBAAgB,KAAK,IAAI;AACxC,QAAI,OAAO,UAAU,UAAU,OAAO,QAAQ;AAC5C,aAAO,KAAK,iBAAiB,MAAM;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,SAA2C;AACxD,UAAM,MAAM,KAAK,YAAY;AAC7B,UAAM,OAAO,MAAM,IAAI,IAAI,0BAA0B,OAAO,EAAE;AAC9D,UAAM,QAAS,KAAK,KAAK,gBAAgB,KAAmC,CAAC;AAC7E,UAAM,UAA2B,CAAC;AAClC,eAAW,QAAQ,OAAO;AACxB,UAAI,IAAI,gBAAgB,IAAI;AAC5B,UAAI,EAAE,UAAU,UAAU,EAAE,QAAQ;AAClC,YAAI,MAAM,KAAK,iBAAiB,CAAC;AAAA,MACnC;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBACZ,MACA,MACA,KACA,OACA,YACiB;AACjB,UAAM,QAAQ,KAAK,IAAI,CAAC,MAAM;AAC5B,YAAM,QAAiC,EAAE,KAAK,EAAE;AAChD,sBAAgB,OAAO,GAAG,KAAK,OAAO,UAAU;AAChD,aAAO;AAAA,IACT,CAAC;AACD,UAAM,OAAO,MAAM,KAAK,YAAY,EAAE,KAAK,uBAAuB;AAAA,MAChE;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AACD,WAAO,KAAK,KAAK,UAAU;AAAA,EAC7B;AAAA,EAEA,MAAc,gBACZ,WACA,MACA,KACA,OACA,YACiB;AACjB,UAAM,MAAM,KAAK,YAAY;AAC7B,UAAM,YAAY,UAAU,IAAI,CAAC,MAAM;AACrC,YAAM,QAAiC,EAAE,UAAM,4BAAS,CAAC,EAAE;AAC3D,sBAAgB,OAAO,GAAG,KAAK,OAAO,UAAU;AAChD,aAAO;AAAA,IACT,CAAC;AACD,UAAM,OAAO,MAAM,IAAI,KAAK,oBAAoB;AAAA,MAC9C,OAAO;AAAA,MACP,GAAG;AAAA,IACL,CAAC;AACD,UAAM,UAAU,KAAK,KAAK,UAAU;AACpC,UAAM,aAAa,KAAK,KAAK,WAAW;AAExC,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAM,OAAO,UAAM,2BAAS,UAAU,CAAC,CAAE;AACzC,YAAM,IAAI,QAAQ,WAAW,CAAC,GAAI,IAAI,WAAW,IAAI,CAAC;AAAA,IACxD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,iBACZ,QACwB;AACxB,UAAM,WAAW,MAAM,KAAK,YAAY,EAAE,SAAS,OAAO,MAAO;AACjE,UAAM,SAAS,SAAS,UAAU,OAAO,QAAQ,OAAO,QAAQ;AAChE,WAAO,SAAS,OAAO;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,UACZ,SACA,SAC0B;AAC1B,UAAM,WAAW,KAAK,IAAI,IAAI,UAAU;AACxC,QAAI,WAAW;AACf,eAAS;AACP,YAAM,UAAU,MAAM,KAAK,SAAS,OAAO;AAC3C,UAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,UAAU,UAAU,EAAE,UAAU,QAAQ,GAAG;AACpE,eAAO;AAAA,MACT;AACA,UAAI,KAAK,IAAI,IAAI,UAAU;AACzB,cAAM,IAAI,aAAa,SAAS,OAAO;AAAA,MACzC;AACA,YAAM,MAAM,KAAK,IAAI,UAAU,KAAK,IAAI,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC;AAClE,iBAAW,KAAK,IAAI,WAAW,GAAG,GAAM;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,OAAe,WACb,UACA,OACA,SAC+B;AAC/B,UAAM,WAAW,KAAK,IAAI,IAAI,UAAU;AACxC,UAAM,UAAU,oBAAI,IAAY;AAChC,QAAI,WAAW;AAEf,WAAO,QAAQ,OAAO,OAAO;AAC3B,iBAAW,OAAO,UAAU;AAC1B,cAAM,UAAU,MAAM,KAAK,SAAS,GAAG;AACvC,iBAAS,MAAM,GAAG,MAAM,QAAQ,QAAQ,OAAO;AAC7C,gBAAM,MAAM,GAAG,GAAG,IAAI,GAAG;AACzB,gBAAM,IAAI,QAAQ,GAAG;AACrB,cAAI,CAAC,QAAQ,IAAI,GAAG,MAAM,EAAE,UAAU,UAAU,EAAE,UAAU,WAAW;AACrE,oBAAQ,IAAI,GAAG;AACf,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,UAAI,QAAQ,QAAQ,MAAO;AAC3B,UAAI,KAAK,IAAI,IAAI,UAAU;AACzB,cAAM,IAAI,aAAa,SAAS,SAAS,KAAK,GAAG,CAAC;AAAA,MACpD;AACA,YAAM,MAAM,KAAK,IAAI,UAAU,KAAK,IAAI,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC;AAClE,iBAAW,KAAK,IAAI,WAAW,GAAG,GAAM;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aACJ,QACA,UAA+B,CAAC,GACR;AACxB,UAAM,EAAE,WAAW,MAAM,WAAW,UAAU,4BAA4B,IAAI;AAE9E,QAAI;AACJ,QAAI,MAAM,MAAM,GAAG;AACjB,eAAS,MAAM,KAAK,eAAe,QAAQ,UAAU,SAAS;AAAA,IAChE,OAAO;AACL,eAAS,MAAM,KAAK,gBAAgB,QAAQ,UAAU,SAAS;AAAA,IACjE;AAEA,WAAO,KAAK,UAAU,QAAQ,OAAO;AAAA,EACvC;AAAA;AAAA,EAIA,MAAc,eACZ,KACA,UACA,WACiB;AACjB,UAAM,UAAmC,EAAE,KAAK,SAAS;AACzD,QAAI,aAAa,KAAM,SAAQ,YAAY,IAAI;AAC/C,UAAM,OAAO,MAAM,KAAK,SAAS,KAAK,cAAc,OAAO;AAC3D,WAAO,KAAK,KAAK,SAAS;AAAA,EAC5B;AAAA,EAEA,MAAc,gBACZ,UACA,UACA,WACiB;AACjB,UAAM,eAAW,4BAAS,QAAQ;AAClC,UAAM,UAAmC,EAAE,WAAW,UAAU,SAAS;AACzE,QAAI,aAAa,KAAM,SAAQ,YAAY,IAAI;AAC/C,UAAM,OAAO,MAAM,KAAK,SAAS,KAAK,eAAe,OAAO;AAC5D,UAAM,SAAS,KAAK,KAAK,SAAS;AAClC,UAAM,UAAU,KAAK,KAAK,UAAU;AAEpC,UAAM,OAAO,UAAM,2BAAS,QAAQ;AACpC,UAAM,KAAK,SAAS,QAAQ,SAAS,IAAI,WAAW,IAAI,CAAC;AACzD,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,UACZ,QACA,SACwB;AACxB,UAAM,WAAW,KAAK,IAAI,IAAI,UAAU;AACxC,QAAI,WAAW;AACf,eAAS;AACP,YAAM,SAAS,MAAM,KAAK,aAAa,MAAM;AAC7C,UAAI,OAAO,UAAU,UAAU,OAAO,UAAU,SAAU,QAAO;AACjE,UAAI,KAAK,IAAI,IAAI,SAAU,OAAM,IAAI,aAAa,SAAS,MAAM;AACjE,YAAM,MAAM,KAAK,IAAI,UAAU,KAAK,IAAI,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC;AAClE,iBAAW,KAAK,IAAI,WAAW,GAAG,GAAM;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,MAAc,aAAa,QAAwC;AACjE,UAAM,OAAO,MAAM,KAAK,SAAS,IAAI,UAAU,MAAM,EAAE;AACvD,WAAO,KAAK,eAAe,KAAK,IAAI;AAAA,EACtC;AAAA,EAEA,MAAc,eACZ,MACwB;AACxB,UAAM,SAAS;AAAA,MACZ,KAAK,SAAS,KAAgB;AAAA,MAC9B,KAAK,OAAO,KAAgB;AAAA,IAC/B;AACA,UAAM,aAAa,KAAK,UAAU;AAClC,WAAO,UAAU,cAAc,OAAO,KAAK,OAAO,UAAU;AAC5D,WAAO,QAAS,KAAK,SAAS,KAAgB;AAE9C,UAAM,KAAK,KAAK,kBAAkB;AAGlC,QAAI,IAAI;AACN,aAAO,WAAW;AAAA,QAChB,gBAAiB,GAAG,iBAAiB,KAAgB;AAAA,QACrD,YAAa,GAAG,aAAa,KAAgB;AAAA,QAC7C,WAAY,GAAG,YAAY,KAAgB;AAAA,MAC7C;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,UAAU,KAAK,cAAc,GAAG;AACnD,aAAO,WAAW,MAAM,KAAK,SAAS;AAAA,QACpC,KAAK,cAAc;AAAA,MACrB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;","names":["import_promises","import_node_path","unzipSync"]}
package/dist/index.d.cts CHANGED
@@ -64,9 +64,6 @@ interface BatchOptions {
64
64
  interface FlashExtractOptions {
65
65
  language?: string;
66
66
  pageRange?: string;
67
- ocr?: boolean;
68
- formula?: boolean;
69
- table?: boolean;
70
67
  /** Max total seconds to wait for task completion (polling). */
71
68
  timeout?: number;
72
69
  }
package/dist/index.d.ts CHANGED
@@ -64,9 +64,6 @@ interface BatchOptions {
64
64
  interface FlashExtractOptions {
65
65
  language?: string;
66
66
  pageRange?: string;
67
- ocr?: boolean;
68
- formula?: boolean;
69
- table?: boolean;
70
67
  /** Max total seconds to wait for task completion (polling). */
71
68
  timeout?: number;
72
69
  }
package/dist/index.js CHANGED
@@ -1,7 +1,6 @@
1
1
  // src/constants.ts
2
2
  var DEFAULT_BASE_URL = "https://mineru.net/api/v4";
3
3
  var DEFAULT_FLASH_BASE_URL = "https://mineru.net/api/v1/agent";
4
- var UPLOAD_TIMEOUT_MS = 3e5;
5
4
 
6
5
  // src/client.ts
7
6
  import { readFile } from "fs/promises";
@@ -164,8 +163,7 @@ var ApiClient = class {
164
163
  async putFile(url, data) {
165
164
  const resp = await fetch(url, {
166
165
  method: "PUT",
167
- body: data,
168
- signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS)
166
+ body: data
169
167
  });
170
168
  if (!resp.ok) {
171
169
  throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);
@@ -225,7 +223,7 @@ var FlashApiClient = class {
225
223
  return this.handle(resp);
226
224
  }
227
225
  async putFile(url, data) {
228
- const resp = await fetch(url, { method: "PUT", body: data, signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS) });
226
+ const resp = await fetch(url, { method: "PUT", body: data });
229
227
  if (!resp.ok) {
230
228
  throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);
231
229
  }
@@ -681,32 +679,26 @@ var MinerU = class {
681
679
  // Flash (agent) mode
682
680
  // ══════════════════════════════════════════════════════════════════
683
681
  async flashExtract(source, options = {}) {
684
- const { language = "ch", pageRange, ocr, formula, table, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;
682
+ const { language = "ch", pageRange, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;
685
683
  let taskId;
686
684
  if (isUrl(source)) {
687
- taskId = await this.flashSubmitUrl(source, language, pageRange, ocr, formula, table);
685
+ taskId = await this.flashSubmitUrl(source, language, pageRange);
688
686
  } else {
689
- taskId = await this.flashSubmitFile(source, language, pageRange, ocr, formula, table);
687
+ taskId = await this.flashSubmitFile(source, language, pageRange);
690
688
  }
691
689
  return this.flashWait(taskId, timeout);
692
690
  }
693
691
  // ── Flash internal helpers ──
694
- async flashSubmitUrl(url, language, pageRange, ocr, formula, table) {
692
+ async flashSubmitUrl(url, language, pageRange) {
695
693
  const payload = { url, language };
696
694
  if (pageRange != null) payload["page_range"] = pageRange;
697
- if (ocr != null) payload["is_ocr"] = ocr;
698
- if (formula != null) payload["enable_formula"] = formula;
699
- if (table != null) payload["enable_table"] = table;
700
695
  const body = await this.flashApi.post("/parse/url", payload);
701
696
  return body.data["task_id"];
702
697
  }
703
- async flashSubmitFile(filePath, language, pageRange, ocr, formula, table) {
698
+ async flashSubmitFile(filePath, language, pageRange) {
704
699
  const fileName = basename2(filePath);
705
700
  const payload = { file_name: fileName, language };
706
701
  if (pageRange != null) payload["page_range"] = pageRange;
707
- if (ocr != null) payload["is_ocr"] = ocr;
708
- if (formula != null) payload["enable_formula"] = formula;
709
- if (table != null) payload["enable_table"] = table;
710
702
  const body = await this.flashApi.post("/parse/file", payload);
711
703
  const taskId = body.data["task_id"];
712
704
  const fileUrl = body.data["file_url"];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/client.ts","../src/errors.ts","../src/api.ts","../src/flash-api.ts","../src/models.ts","../src/zip.ts"],"sourcesContent":["export const DEFAULT_BASE_URL = \"https://mineru.net/api/v4\";\n\nexport const DEFAULT_FLASH_BASE_URL = \"https://mineru.net/api/v1/agent\";\n\n/** Timeout for file uploads in milliseconds (PUT to pre-signed URL). */\nexport const UPLOAD_TIMEOUT_MS = 300_000;\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\n\nimport { ApiClient } from \"./api.js\";\nimport { DEFAULT_BASE_URL } from \"./constants.js\";\nimport { NoAuthClientError, TimeoutError } from \"./errors.js\";\nimport { FlashApiClient } from \"./flash-api.js\";\nimport type { ExtractResult, Progress } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\nimport { parseZip } from \"./zip.js\";\n\nconst MODEL_MAP: Record<string, string> = {\n pipeline: \"pipeline\",\n vlm: \"vlm\",\n html: \"MinerU-HTML\",\n};\n\nconst HTML_EXTENSIONS = new Set([\".html\", \".htm\"]);\n\nconst DEFAULT_SOURCE = \"open-api-sdk-js\";\n\n/** Default total business timeouts for extraction tasks (in seconds). */\nconst DEFAULT_TIMEOUT_POLL_SINGLE = 300;\nconst DEFAULT_TIMEOUT_POLL_BATCH = 1800;\n\nfunction isUrl(source: string): boolean {\n return source.startsWith(\"http://\") || source.startsWith(\"https://\");\n}\n\nfunction getExtension(source: string): string {\n if (isUrl(source)) {\n const path = source.split(\"?\")[0]!.split(\"#\")[0]!;\n const dot = path.lastIndexOf(\".\");\n return dot === -1 ? \"\" : path.slice(dot).toLowerCase();\n }\n return extname(source).toLowerCase();\n}\n\nfunction inferModel(source: string): string {\n return HTML_EXTENSIONS.has(getExtension(source)) ? \"MinerU-HTML\" : \"vlm\";\n}\n\nfunction resolveModel(model: string | undefined, source: string): string {\n if (model != null) {\n return MODEL_MAP[model] ?? model;\n }\n return inferModel(source);\n}\n\nexport interface ExtractOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n pages?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\nexport interface BatchOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for all tasks (polling). */\n timeout?: number;\n}\n\nexport interface FlashExtractOptions {\n language?: string;\n pageRange?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\n/** Per-file parameter overrides for batch methods. */\nexport interface FileParam {\n /** Override page_ranges for this file (e.g. \"1-10,15\"). */\n pages?: string;\n /** Override is_ocr for this file. */\n ocr?: boolean;\n /** Set data_id for this file. */\n dataId?: string;\n}\n\n/** Only includes fields the user explicitly set. Never assumes API defaults. */\nfunction buildApiOptions(\n modelVersion: string,\n opts: ExtractOptions | BatchOptions,\n): Record<string, unknown> {\n const o: Record<string, unknown> = { model_version: modelVersion };\n if (opts.formula !== undefined) o[\"enable_formula\"] = opts.formula;\n if (opts.table !== undefined) o[\"enable_table\"] = opts.table;\n if (opts.language !== undefined) o[\"language\"] = opts.language;\n if (opts.extraFormats?.length) {\n o[\"extra_formats\"] = opts.extraFormats;\n }\n return o;\n}\n\n/** Adds per-file fields (is_ocr, page_ranges, data_id) to a file entry. */\nfunction applyFileFields(\n entry: Record<string, unknown>,\n key: string,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n): void {\n const fp = fileParams?.[key];\n\n // OCR: per-file overrides global\n const effectiveOcr = fp?.ocr !== undefined ? fp.ocr : ocr;\n if (effectiveOcr !== undefined) entry[\"is_ocr\"] = effectiveOcr;\n\n // Pages: per-file overrides global\n const effectivePages = fp?.pages || pages;\n if (effectivePages) entry[\"page_ranges\"] = effectivePages;\n\n // DataID: per-file only\n if (fp?.dataId) entry[\"data_id\"] = fp.dataId;\n}\n\nfunction parseTaskResult(data: Record<string, unknown>): ExtractResult {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n result.filename = (data[\"file_name\"] as string) ?? null;\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n result.zipUrl = (data[\"full_zip_url\"] as string) ?? null;\n\n const ep = data[\"extract_progress\"] as Record<string, unknown> | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n } satisfies Progress;\n }\n return result;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * MinerU API client. Turn documents into Markdown with one method call.\n */\nexport class MinerU {\n private readonly api: ApiClient | null;\n private readonly flashApi: FlashApiClient;\n\n /**\n * @param token - API token.\n * @param baseUrl - API base URL.\n * @param flashBaseUrl - Flash API base URL.\n */\n constructor(\n token?: string,\n baseUrl = DEFAULT_BASE_URL,\n flashBaseUrl?: string,\n ) {\n const resolved = token ?? process.env[\"MINERU_TOKEN\"];\n if (resolved) {\n // ApiClient should ideally use DEFAULT_TIMEOUT_REQUEST internally\n this.api = new ApiClient(resolved, baseUrl, DEFAULT_SOURCE);\n } else {\n this.api = null; // flash-only mode\n }\n this.flashApi = new FlashApiClient(flashBaseUrl, DEFAULT_SOURCE);\n }\n\n setSource(source: string): void {\n if (this.api !== null) {\n this.api.setSource(source);\n }\n this.flashApi.setSource(source);\n }\n\n private requireAuth(): ApiClient {\n if (this.api === null) {\n throw new NoAuthClientError();\n }\n return this.api;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Synchronous (blocking) methods\n // ══════════════════════════════════════════════════════════════════\n\n async extract(\n source: string,\n options: ExtractOptions = {},\n ): Promise<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_SINGLE, ...opts } = options;\n const modelVersion = resolveModel(opts.model, source);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n let batchId: string;\n if (isUrl(source)) {\n batchId = await this.submitUrlsBatch([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n } else {\n batchId = await this.uploadAndSubmit([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n }\n const results = await this.waitBatch(batchId, timeout);\n return results[0]!;\n }\n\n async *extractBatch(\n sources: string[],\n options: BatchOptions = {},\n ): AsyncGenerator<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_BATCH, ...opts } = options;\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(opts.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n const batchIds: string[] = [];\n if (urls.length > 0) {\n batchIds.push(await this.submitUrlsBatch(urls, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n if (files.length > 0) {\n batchIds.push(await this.uploadAndSubmit(files, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n\n yield* this.yieldBatch(batchIds, sources.length, timeout);\n }\n\n async crawl(\n url: string,\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): Promise<ExtractResult> {\n return this.extract(url, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_SINGLE, ...options });\n }\n\n async *crawlBatch(\n urls: string[],\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): AsyncGenerator<ExtractResult> {\n yield* this.extractBatch(urls, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_BATCH, ...options });\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Async primitives (no polling, no waiting)\n // ══════════════════════════════════════════════════════════════════\n\n async submit(\n source: string,\n options: Omit<ExtractOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const modelVersion = resolveModel(options.model, source);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n if (isUrl(source)) {\n return this.submitUrlsBatch([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n return this.uploadAndSubmit([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n\n async submitBatch(\n sources: string[],\n options: Omit<BatchOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(options.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n if (urls.length === 0 && files.length === 0) {\n throw new Error(\"No sources provided.\");\n }\n if (urls.length > 0 && files.length > 0) {\n throw new Error(\n \"submitBatch() does not support mixing URLs and local files in one call. \" +\n \"Please submit them separately or use extractBatch() instead.\",\n );\n }\n\n if (urls.length > 0) {\n return this.submitUrlsBatch(urls, apiOpts, options.ocr, undefined, options.fileParams);\n }\n return this.uploadAndSubmit(files, apiOpts, options.ocr, undefined, options.fileParams);\n }\n\n async getTask(taskId: string): Promise<ExtractResult> {\n const api = this.requireAuth();\n const body = await api.get(`/extract/task/${taskId}`);\n const result = parseTaskResult(body.data);\n if (result.state === \"done\" && result.zipUrl) {\n return this.downloadAndParse(result);\n }\n return result;\n }\n\n async getBatch(batchId: string): Promise<ExtractResult[]> {\n const api = this.requireAuth();\n const body = await api.get(`/extract-results/batch/${batchId}`);\n const items = (body.data[\"extract_result\"] as Record<string, unknown>[]) ?? [];\n const results: ExtractResult[] = [];\n for (const item of items) {\n let r = parseTaskResult(item);\n if (r.state === \"done\" && r.zipUrl) {\n r = await this.downloadAndParse(r);\n }\n results.push(r);\n }\n return results;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Internal helpers\n // ══════════════════════════════════════════════════════════════════\n\n private async submitUrlsBatch(\n urls: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const files = urls.map((u) => {\n const entry: Record<string, unknown> = { url: u };\n applyFileFields(entry, u, ocr, pages, fileParams);\n return entry;\n });\n const body = await this.requireAuth().post(\"/extract/task/batch\", {\n files,\n ...opts,\n });\n return body.data[\"batch_id\"] as string;\n }\n\n private async uploadAndSubmit(\n filePaths: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const api = this.requireAuth();\n const filesMeta = filePaths.map((p) => {\n const entry: Record<string, unknown> = { name: basename(p) };\n applyFileFields(entry, p, ocr, pages, fileParams);\n return entry;\n });\n const body = await api.post(\"/file-urls/batch\", {\n files: filesMeta,\n ...opts,\n });\n const batchId = body.data[\"batch_id\"] as string;\n const uploadUrls = body.data[\"file_urls\"] as string[];\n\n for (let i = 0; i < filePaths.length; i++) {\n const data = await readFile(filePaths[i]!);\n await api.putFile(uploadUrls[i]!, new Uint8Array(data));\n }\n\n return batchId;\n }\n\n private async downloadAndParse(\n result: ExtractResult,\n ): Promise<ExtractResult> {\n const zipBytes = await this.requireAuth().download(result.zipUrl!);\n const parsed = parseZip(zipBytes, result.taskId, result.filename);\n parsed.zipUrl = result.zipUrl;\n return parsed;\n }\n\n private async waitBatch(\n batchId: string,\n timeout: number,\n ): Promise<ExtractResult[]> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const results = await this.getBatch(batchId);\n if (results.every((r) => r.state === \"done\" || r.state === \"failed\")) {\n return results;\n }\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchId);\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async *yieldBatch(\n batchIds: string[],\n total: number,\n timeout: number,\n ): AsyncGenerator<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n const yielded = new Set<string>();\n let interval = 2000;\n\n while (yielded.size < total) {\n for (const bid of batchIds) {\n const results = await this.getBatch(bid);\n for (let idx = 0; idx < results.length; idx++) {\n const key = `${bid}:${idx}`;\n const r = results[idx]!;\n if (!yielded.has(key) && (r.state === \"done\" || r.state === \"failed\")) {\n yielded.add(key);\n yield r;\n }\n }\n }\n\n if (yielded.size >= total) break;\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchIds.join(\",\"));\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Flash (agent) mode\n // ══════════════════════════════════════════════════════════════════\n\n async flashExtract(\n source: string,\n options: FlashExtractOptions = {},\n ): Promise<ExtractResult> {\n const { language = \"ch\", pageRange, ocr, formula, table, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;\n\n let taskId: string;\n if (isUrl(source)) {\n taskId = await this.flashSubmitUrl(source, language, pageRange, ocr, formula, table);\n } else {\n taskId = await this.flashSubmitFile(source, language, pageRange, ocr, formula, table);\n }\n\n return this.flashWait(taskId, timeout);\n }\n\n // ── Flash internal helpers ──\n\n private async flashSubmitUrl(\n url: string,\n language: string,\n pageRange?: string,\n ocr?: boolean,\n formula?: boolean,\n table?: boolean,\n ): Promise<string> {\n const payload: Record<string, unknown> = { url, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n if (ocr != null) payload[\"is_ocr\"] = ocr;\n if (formula != null) payload[\"enable_formula\"] = formula;\n if (table != null) payload[\"enable_table\"] = table;\n const body = await this.flashApi.post(\"/parse/url\", payload);\n return body.data[\"task_id\"] as string;\n }\n\n private async flashSubmitFile(\n filePath: string,\n language: string,\n pageRange?: string,\n ocr?: boolean,\n formula?: boolean,\n table?: boolean,\n ): Promise<string> {\n const fileName = basename(filePath);\n const payload: Record<string, unknown> = { file_name: fileName, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n if (ocr != null) payload[\"is_ocr\"] = ocr;\n if (formula != null) payload[\"enable_formula\"] = formula;\n if (table != null) payload[\"enable_table\"] = table;\n const body = await this.flashApi.post(\"/parse/file\", payload);\n const taskId = body.data[\"task_id\"] as string;\n const fileUrl = body.data[\"file_url\"] as string;\n\n const data = await readFile(filePath);\n await this.flashApi.putFile(fileUrl, new Uint8Array(data));\n return taskId;\n }\n\n private async flashWait(\n taskId: string,\n timeout: number,\n ): Promise<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const result = await this.flashGetTask(taskId);\n if (result.state === \"done\" || result.state === \"failed\") return result;\n if (Date.now() > deadline) throw new TimeoutError(timeout, taskId);\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async flashGetTask(taskId: string): Promise<ExtractResult> {\n const body = await this.flashApi.get(`/parse/${taskId}`);\n return this.parseFlashTask(body.data);\n }\n\n private async parseFlashTask(\n data: Record<string, unknown>,\n ): Promise<ExtractResult> {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n\n const ep = data[\"extract_progress\"] as\n | Record<string, unknown>\n | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n };\n }\n\n if (result.state === \"done\" && data[\"markdown_url\"]) {\n result.markdown = await this.flashApi.downloadText(\n data[\"markdown_url\"] as string,\n );\n }\n\n return result;\n }\n}\n","export class MinerUError extends Error {\n readonly code: string;\n readonly traceId: string;\n\n constructor(code: string | number, message: string, traceId = \"\") {\n const tag = traceId ? ` (trace: ${traceId})` : \"\";\n super(`[${code}] ${message}${tag}`);\n this.name = \"MinerUError\";\n this.code = String(code);\n this.traceId = traceId;\n }\n}\n\nexport class AuthError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"AuthError\";\n }\n}\n\nexport class ParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ParamError\";\n }\n}\n\nexport class FileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FileTooLargeError\";\n }\n}\n\nexport class PageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"PageLimitError\";\n }\n}\n\nexport class TaskNotFoundError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"TaskNotFoundError\";\n }\n}\n\nexport class ExtractFailedError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ExtractFailedError\";\n }\n}\n\nexport class TimeoutError extends MinerUError {\n readonly timeout: number;\n readonly taskId: string;\n\n constructor(timeout: number, taskId: string) {\n super(\"TIMEOUT\", `Task ${taskId} did not complete within ${timeout}s`);\n this.name = \"TimeoutError\";\n this.timeout = timeout;\n this.taskId = taskId;\n }\n}\n\nexport class QuotaExceededError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"QuotaExceededError\";\n }\n}\n\n// Flash API specific errors\n\nexport class FlashFileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashFileTooLargeError\";\n }\n}\n\nexport class FlashUnsupportedTypeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashUnsupportedTypeError\";\n }\n}\n\nexport class FlashPageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashPageLimitError\";\n }\n}\n\nexport class FlashParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashParamError\";\n }\n}\n\nexport class NoAuthClientError extends MinerUError {\n constructor() {\n super(\n \"-1\",\n \"This operation requires an authenticated client; pass token to MinerU() or set MINERU_TOKEN env var.\",\n );\n this.name = \"NoAuthClientError\";\n }\n}\n\nconst CODE_TO_ERROR: Record<string, typeof MinerUError> = {\n A0202: AuthError,\n A0211: AuthError,\n \"-500\": ParamError,\n \"-10002\": ParamError,\n \"-60005\": FileTooLargeError,\n \"-60006\": PageLimitError,\n \"-60010\": ExtractFailedError,\n \"-60012\": TaskNotFoundError,\n \"-60013\": MinerUError,\n \"-60018\": QuotaExceededError,\n \"-60019\": QuotaExceededError,\n \"-30001\": FlashFileTooLargeError,\n \"-30002\": FlashUnsupportedTypeError,\n \"-30003\": FlashPageLimitError,\n \"-30004\": FlashParamError,\n};\n\nexport function raiseForCode(\n code: number | string,\n msg: string,\n traceId = \"\",\n): never {\n const ErrorClass = CODE_TO_ERROR[String(code)] ?? MinerUError;\n throw new ErrorClass(code, msg, traceId);\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { UPLOAD_TIMEOUT_MS } from \"./constants.js\";\n\ninterface ApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(token: string, baseUrl: string, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<ApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<ApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n headers: this.headers,\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, {\n method: \"PUT\",\n body: data,\n signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS),\n });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async download(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return new Uint8Array(await resp.arrayBuffer());\n }\n\n private async handle(resp: Response): Promise<ApiResponse> {\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as ApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { DEFAULT_FLASH_BASE_URL, UPLOAD_TIMEOUT_MS } from \"./constants.js\";\n\ninterface FlashApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class FlashApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(baseUrl: string = DEFAULT_FLASH_BASE_URL, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = { \"Content-Type\": \"application/json\" };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<FlashApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<FlashApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, { method: \"PUT\", body: data, signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS) });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async downloadText(url: string): Promise<string> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return resp.text();\n }\n\n private async handle(resp: Response): Promise<FlashApiResponse> {\n if (resp.status === 429) {\n raiseForCode(\n \"RATE_LIMITED\",\n \"flash API rate limit exceeded; try again later\",\n );\n }\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as FlashApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface Image {\n name: string;\n data: Uint8Array;\n path: string;\n}\n\nexport interface Progress {\n extractedPages: number;\n totalPages: number;\n startTime: string;\n}\n\nexport function progressPercent(p: Progress): number {\n if (p.totalPages === 0) return 0;\n return (p.extractedPages / p.totalPages) * 100;\n}\n\nexport function progressToString(p: Progress): string {\n return `${p.extractedPages}/${p.totalPages} (${progressPercent(p).toFixed(0)}%)`;\n}\n\nexport interface ExtractResult {\n taskId: string;\n state: string;\n filename: string | null;\n errCode: string;\n error: string | null;\n zipUrl: string | null;\n\n progress: Progress | null;\n\n markdown: string | null;\n contentList: Record<string, unknown>[] | null;\n images: Image[];\n\n docx: Uint8Array | null;\n html: string | null;\n latex: string | null;\n\n /** @internal */\n _zipBytes: Uint8Array | null;\n}\n\nexport function createEmptyResult(\n taskId: string,\n state: string,\n): ExtractResult {\n return {\n taskId,\n state,\n filename: null,\n errCode: \"\",\n error: null,\n zipUrl: null,\n progress: null,\n markdown: null,\n contentList: null,\n images: [],\n docx: null,\n html: null,\n latex: null,\n _zipBytes: null,\n };\n}\n\nasync function ensureDir(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n\nexport async function saveMarkdown(\n result: ExtractResult,\n path: string,\n withImages = true,\n): Promise<void> {\n if (result.markdown == null) {\n throw new Error(\"No markdown content available (state != done)\");\n }\n await ensureDir(path);\n await writeFile(path, result.markdown, \"utf-8\");\n if (withImages && result.images.length > 0) {\n const imgDir = join(dirname(path), \"images\");\n await mkdir(imgDir, { recursive: true });\n for (const img of result.images) {\n await writeFile(join(imgDir, img.name), img.data);\n }\n }\n}\n\nexport async function saveDocx(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.docx == null) {\n throw new Error(\n \"No docx content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.docx);\n}\n\nexport async function saveHtml(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.html == null) {\n throw new Error(\n \"No html content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.html, \"utf-8\");\n}\n\nexport async function saveLatex(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.latex == null) {\n throw new Error(\n \"No latex content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.latex, \"utf-8\");\n}\n\nexport async function saveAll(\n result: ExtractResult,\n dir: string,\n): Promise<void> {\n if (result._zipBytes == null) {\n throw new Error(\"No zip data available (state != done)\");\n }\n const { unzipSync } = await import(\"fflate\");\n const entries = unzipSync(new Uint8Array(result._zipBytes));\n await mkdir(dir, { recursive: true });\n for (const [relativePath, content] of Object.entries(entries)) {\n if (relativePath.endsWith(\"/\")) continue;\n const fullPath = join(dir, relativePath);\n await ensureDir(fullPath);\n await writeFile(fullPath, content);\n }\n}\n","import { unzipSync } from \"fflate\";\nimport type { ExtractResult, Image } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\n\nconst IMAGE_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".svg\", \".webp\",\n]);\n\nfunction extname(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot === -1 ? \"\" : filename.slice(dot).toLowerCase();\n}\n\nfunction basename(filepath: string): string {\n const parts = filepath.replace(/\\\\/g, \"/\").split(\"/\");\n return parts[parts.length - 1] ?? \"\";\n}\n\nexport function parseZip(\n zipBytes: Uint8Array,\n taskId: string,\n filename: string | null = null,\n): ExtractResult {\n const result = createEmptyResult(taskId, \"done\");\n result.filename = filename;\n result._zipBytes = zipBytes;\n\n const entries = unzipSync(zipBytes);\n const images: Image[] = [];\n let contentList: Record<string, unknown>[] | null = null;\n\n for (const [relPath, data] of Object.entries(entries)) {\n if (relPath.endsWith(\"/\")) continue;\n\n const name = basename(relPath);\n const ext = extname(name);\n const text = () => new TextDecoder().decode(data);\n\n if (ext === \".md\") {\n result.markdown = text();\n } else if (\n name.endsWith(\"_content_list.json\") ||\n name === \"content_list.json\"\n ) {\n contentList = JSON.parse(text()) as Record<string, unknown>[];\n } else if (ext === \".json\" && contentList == null) {\n try {\n const parsed: unknown = JSON.parse(text());\n if (Array.isArray(parsed)) {\n contentList = parsed as Record<string, unknown>[];\n }\n } catch {\n // not a valid JSON array — skip\n }\n } else if (IMAGE_EXTENSIONS.has(ext)) {\n images.push({ name, data: new Uint8Array(data), path: relPath });\n } else if (ext === \".docx\") {\n result.docx = new Uint8Array(data);\n } else if (ext === \".html\" || ext === \".htm\") {\n result.html = text();\n } else if (ext === \".tex\") {\n result.latex = text();\n }\n }\n\n result.contentList = contentList;\n result.images = images;\n return result;\n}\n"],"mappings":"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","names":["basename","extname","unzipSync","extname","basename"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/client.ts","../src/errors.ts","../src/api.ts","../src/flash-api.ts","../src/models.ts","../src/zip.ts"],"sourcesContent":["export const DEFAULT_BASE_URL = \"https://mineru.net/api/v4\";\n\nexport const DEFAULT_FLASH_BASE_URL = \"https://mineru.net/api/v1/agent\";\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\n\nimport { ApiClient } from \"./api.js\";\nimport { DEFAULT_BASE_URL } from \"./constants.js\";\nimport { NoAuthClientError, TimeoutError } from \"./errors.js\";\nimport { FlashApiClient } from \"./flash-api.js\";\nimport type { ExtractResult, Progress } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\nimport { parseZip } from \"./zip.js\";\n\nconst MODEL_MAP: Record<string, string> = {\n pipeline: \"pipeline\",\n vlm: \"vlm\",\n html: \"MinerU-HTML\",\n};\n\nconst HTML_EXTENSIONS = new Set([\".html\", \".htm\"]);\n\nconst DEFAULT_SOURCE = \"open-api-sdk-js\";\n\n/** Default total business timeouts for extraction tasks (in seconds). */\nconst DEFAULT_TIMEOUT_POLL_SINGLE = 300;\nconst DEFAULT_TIMEOUT_POLL_BATCH = 1800;\n\nfunction isUrl(source: string): boolean {\n return source.startsWith(\"http://\") || source.startsWith(\"https://\");\n}\n\nfunction getExtension(source: string): string {\n if (isUrl(source)) {\n const path = source.split(\"?\")[0]!.split(\"#\")[0]!;\n const dot = path.lastIndexOf(\".\");\n return dot === -1 ? \"\" : path.slice(dot).toLowerCase();\n }\n return extname(source).toLowerCase();\n}\n\nfunction inferModel(source: string): string {\n return HTML_EXTENSIONS.has(getExtension(source)) ? \"MinerU-HTML\" : \"vlm\";\n}\n\nfunction resolveModel(model: string | undefined, source: string): string {\n if (model != null) {\n return MODEL_MAP[model] ?? model;\n }\n return inferModel(source);\n}\n\nexport interface ExtractOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n pages?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\nexport interface BatchOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for all tasks (polling). */\n timeout?: number;\n}\n\nexport interface FlashExtractOptions {\n language?: string;\n pageRange?: string;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\n/** Per-file parameter overrides for batch methods. */\nexport interface FileParam {\n /** Override page_ranges for this file (e.g. \"1-10,15\"). */\n pages?: string;\n /** Override is_ocr for this file. */\n ocr?: boolean;\n /** Set data_id for this file. */\n dataId?: string;\n}\n\n/** Only includes fields the user explicitly set. Never assumes API defaults. */\nfunction buildApiOptions(\n modelVersion: string,\n opts: ExtractOptions | BatchOptions,\n): Record<string, unknown> {\n const o: Record<string, unknown> = { model_version: modelVersion };\n if (opts.formula !== undefined) o[\"enable_formula\"] = opts.formula;\n if (opts.table !== undefined) o[\"enable_table\"] = opts.table;\n if (opts.language !== undefined) o[\"language\"] = opts.language;\n if (opts.extraFormats?.length) {\n o[\"extra_formats\"] = opts.extraFormats;\n }\n return o;\n}\n\n/** Adds per-file fields (is_ocr, page_ranges, data_id) to a file entry. */\nfunction applyFileFields(\n entry: Record<string, unknown>,\n key: string,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n): void {\n const fp = fileParams?.[key];\n\n // OCR: per-file overrides global\n const effectiveOcr = fp?.ocr !== undefined ? fp.ocr : ocr;\n if (effectiveOcr !== undefined) entry[\"is_ocr\"] = effectiveOcr;\n\n // Pages: per-file overrides global\n const effectivePages = fp?.pages || pages;\n if (effectivePages) entry[\"page_ranges\"] = effectivePages;\n\n // DataID: per-file only\n if (fp?.dataId) entry[\"data_id\"] = fp.dataId;\n}\n\nfunction parseTaskResult(data: Record<string, unknown>): ExtractResult {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n result.filename = (data[\"file_name\"] as string) ?? null;\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n result.zipUrl = (data[\"full_zip_url\"] as string) ?? null;\n\n const ep = data[\"extract_progress\"] as Record<string, unknown> | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n } satisfies Progress;\n }\n return result;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * MinerU API client. Turn documents into Markdown with one method call.\n */\nexport class MinerU {\n private readonly api: ApiClient | null;\n private readonly flashApi: FlashApiClient;\n\n /**\n * @param token - API token.\n * @param baseUrl - API base URL.\n * @param flashBaseUrl - Flash API base URL.\n */\n constructor(\n token?: string,\n baseUrl = DEFAULT_BASE_URL,\n flashBaseUrl?: string,\n ) {\n const resolved = token ?? process.env[\"MINERU_TOKEN\"];\n if (resolved) {\n // ApiClient should ideally use DEFAULT_TIMEOUT_REQUEST internally\n this.api = new ApiClient(resolved, baseUrl, DEFAULT_SOURCE);\n } else {\n this.api = null; // flash-only mode\n }\n this.flashApi = new FlashApiClient(flashBaseUrl, DEFAULT_SOURCE);\n }\n\n setSource(source: string): void {\n if (this.api !== null) {\n this.api.setSource(source);\n }\n this.flashApi.setSource(source);\n }\n\n private requireAuth(): ApiClient {\n if (this.api === null) {\n throw new NoAuthClientError();\n }\n return this.api;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Synchronous (blocking) methods\n // ══════════════════════════════════════════════════════════════════\n\n async extract(\n source: string,\n options: ExtractOptions = {},\n ): Promise<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_SINGLE, ...opts } = options;\n const modelVersion = resolveModel(opts.model, source);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n let batchId: string;\n if (isUrl(source)) {\n batchId = await this.submitUrlsBatch([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n } else {\n batchId = await this.uploadAndSubmit([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n }\n const results = await this.waitBatch(batchId, timeout);\n return results[0]!;\n }\n\n async *extractBatch(\n sources: string[],\n options: BatchOptions = {},\n ): AsyncGenerator<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_BATCH, ...opts } = options;\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(opts.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n const batchIds: string[] = [];\n if (urls.length > 0) {\n batchIds.push(await this.submitUrlsBatch(urls, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n if (files.length > 0) {\n batchIds.push(await this.uploadAndSubmit(files, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n\n yield* this.yieldBatch(batchIds, sources.length, timeout);\n }\n\n async crawl(\n url: string,\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): Promise<ExtractResult> {\n return this.extract(url, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_SINGLE, ...options });\n }\n\n async *crawlBatch(\n urls: string[],\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): AsyncGenerator<ExtractResult> {\n yield* this.extractBatch(urls, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_BATCH, ...options });\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Async primitives (no polling, no waiting)\n // ══════════════════════════════════════════════════════════════════\n\n async submit(\n source: string,\n options: Omit<ExtractOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const modelVersion = resolveModel(options.model, source);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n if (isUrl(source)) {\n return this.submitUrlsBatch([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n return this.uploadAndSubmit([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n\n async submitBatch(\n sources: string[],\n options: Omit<BatchOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(options.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n if (urls.length === 0 && files.length === 0) {\n throw new Error(\"No sources provided.\");\n }\n if (urls.length > 0 && files.length > 0) {\n throw new Error(\n \"submitBatch() does not support mixing URLs and local files in one call. \" +\n \"Please submit them separately or use extractBatch() instead.\",\n );\n }\n\n if (urls.length > 0) {\n return this.submitUrlsBatch(urls, apiOpts, options.ocr, undefined, options.fileParams);\n }\n return this.uploadAndSubmit(files, apiOpts, options.ocr, undefined, options.fileParams);\n }\n\n async getTask(taskId: string): Promise<ExtractResult> {\n const api = this.requireAuth();\n const body = await api.get(`/extract/task/${taskId}`);\n const result = parseTaskResult(body.data);\n if (result.state === \"done\" && result.zipUrl) {\n return this.downloadAndParse(result);\n }\n return result;\n }\n\n async getBatch(batchId: string): Promise<ExtractResult[]> {\n const api = this.requireAuth();\n const body = await api.get(`/extract-results/batch/${batchId}`);\n const items = (body.data[\"extract_result\"] as Record<string, unknown>[]) ?? [];\n const results: ExtractResult[] = [];\n for (const item of items) {\n let r = parseTaskResult(item);\n if (r.state === \"done\" && r.zipUrl) {\n r = await this.downloadAndParse(r);\n }\n results.push(r);\n }\n return results;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Internal helpers\n // ══════════════════════════════════════════════════════════════════\n\n private async submitUrlsBatch(\n urls: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const files = urls.map((u) => {\n const entry: Record<string, unknown> = { url: u };\n applyFileFields(entry, u, ocr, pages, fileParams);\n return entry;\n });\n const body = await this.requireAuth().post(\"/extract/task/batch\", {\n files,\n ...opts,\n });\n return body.data[\"batch_id\"] as string;\n }\n\n private async uploadAndSubmit(\n filePaths: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const api = this.requireAuth();\n const filesMeta = filePaths.map((p) => {\n const entry: Record<string, unknown> = { name: basename(p) };\n applyFileFields(entry, p, ocr, pages, fileParams);\n return entry;\n });\n const body = await api.post(\"/file-urls/batch\", {\n files: filesMeta,\n ...opts,\n });\n const batchId = body.data[\"batch_id\"] as string;\n const uploadUrls = body.data[\"file_urls\"] as string[];\n\n for (let i = 0; i < filePaths.length; i++) {\n const data = await readFile(filePaths[i]!);\n await api.putFile(uploadUrls[i]!, new Uint8Array(data));\n }\n\n return batchId;\n }\n\n private async downloadAndParse(\n result: ExtractResult,\n ): Promise<ExtractResult> {\n const zipBytes = await this.requireAuth().download(result.zipUrl!);\n const parsed = parseZip(zipBytes, result.taskId, result.filename);\n parsed.zipUrl = result.zipUrl;\n return parsed;\n }\n\n private async waitBatch(\n batchId: string,\n timeout: number,\n ): Promise<ExtractResult[]> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const results = await this.getBatch(batchId);\n if (results.every((r) => r.state === \"done\" || r.state === \"failed\")) {\n return results;\n }\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchId);\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async *yieldBatch(\n batchIds: string[],\n total: number,\n timeout: number,\n ): AsyncGenerator<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n const yielded = new Set<string>();\n let interval = 2000;\n\n while (yielded.size < total) {\n for (const bid of batchIds) {\n const results = await this.getBatch(bid);\n for (let idx = 0; idx < results.length; idx++) {\n const key = `${bid}:${idx}`;\n const r = results[idx]!;\n if (!yielded.has(key) && (r.state === \"done\" || r.state === \"failed\")) {\n yielded.add(key);\n yield r;\n }\n }\n }\n\n if (yielded.size >= total) break;\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchIds.join(\",\"));\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Flash (agent) mode\n // ══════════════════════════════════════════════════════════════════\n\n async flashExtract(\n source: string,\n options: FlashExtractOptions = {},\n ): Promise<ExtractResult> {\n const { language = \"ch\", pageRange, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;\n\n let taskId: string;\n if (isUrl(source)) {\n taskId = await this.flashSubmitUrl(source, language, pageRange);\n } else {\n taskId = await this.flashSubmitFile(source, language, pageRange);\n }\n\n return this.flashWait(taskId, timeout);\n }\n\n // ── Flash internal helpers ──\n\n private async flashSubmitUrl(\n url: string,\n language: string,\n pageRange?: string,\n ): Promise<string> {\n const payload: Record<string, unknown> = { url, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n const body = await this.flashApi.post(\"/parse/url\", payload);\n return body.data[\"task_id\"] as string;\n }\n\n private async flashSubmitFile(\n filePath: string,\n language: string,\n pageRange?: string,\n ): Promise<string> {\n const fileName = basename(filePath);\n const payload: Record<string, unknown> = { file_name: fileName, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n const body = await this.flashApi.post(\"/parse/file\", payload);\n const taskId = body.data[\"task_id\"] as string;\n const fileUrl = body.data[\"file_url\"] as string;\n\n const data = await readFile(filePath);\n await this.flashApi.putFile(fileUrl, new Uint8Array(data));\n return taskId;\n }\n\n private async flashWait(\n taskId: string,\n timeout: number,\n ): Promise<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const result = await this.flashGetTask(taskId);\n if (result.state === \"done\" || result.state === \"failed\") return result;\n if (Date.now() > deadline) throw new TimeoutError(timeout, taskId);\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async flashGetTask(taskId: string): Promise<ExtractResult> {\n const body = await this.flashApi.get(`/parse/${taskId}`);\n return this.parseFlashTask(body.data);\n }\n\n private async parseFlashTask(\n data: Record<string, unknown>,\n ): Promise<ExtractResult> {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n\n const ep = data[\"extract_progress\"] as\n | Record<string, unknown>\n | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n };\n }\n\n if (result.state === \"done\" && data[\"markdown_url\"]) {\n result.markdown = await this.flashApi.downloadText(\n data[\"markdown_url\"] as string,\n );\n }\n\n return result;\n }\n}\n","export class MinerUError extends Error {\n readonly code: string;\n readonly traceId: string;\n\n constructor(code: string | number, message: string, traceId = \"\") {\n const tag = traceId ? ` (trace: ${traceId})` : \"\";\n super(`[${code}] ${message}${tag}`);\n this.name = \"MinerUError\";\n this.code = String(code);\n this.traceId = traceId;\n }\n}\n\nexport class AuthError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"AuthError\";\n }\n}\n\nexport class ParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ParamError\";\n }\n}\n\nexport class FileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FileTooLargeError\";\n }\n}\n\nexport class PageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"PageLimitError\";\n }\n}\n\nexport class TaskNotFoundError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"TaskNotFoundError\";\n }\n}\n\nexport class ExtractFailedError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ExtractFailedError\";\n }\n}\n\nexport class TimeoutError extends MinerUError {\n readonly timeout: number;\n readonly taskId: string;\n\n constructor(timeout: number, taskId: string) {\n super(\"TIMEOUT\", `Task ${taskId} did not complete within ${timeout}s`);\n this.name = \"TimeoutError\";\n this.timeout = timeout;\n this.taskId = taskId;\n }\n}\n\nexport class QuotaExceededError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"QuotaExceededError\";\n }\n}\n\n// Flash API specific errors\n\nexport class FlashFileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashFileTooLargeError\";\n }\n}\n\nexport class FlashUnsupportedTypeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashUnsupportedTypeError\";\n }\n}\n\nexport class FlashPageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashPageLimitError\";\n }\n}\n\nexport class FlashParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashParamError\";\n }\n}\n\nexport class NoAuthClientError extends MinerUError {\n constructor() {\n super(\n \"-1\",\n \"This operation requires an authenticated client; pass token to MinerU() or set MINERU_TOKEN env var.\",\n );\n this.name = \"NoAuthClientError\";\n }\n}\n\nconst CODE_TO_ERROR: Record<string, typeof MinerUError> = {\n A0202: AuthError,\n A0211: AuthError,\n \"-500\": ParamError,\n \"-10002\": ParamError,\n \"-60005\": FileTooLargeError,\n \"-60006\": PageLimitError,\n \"-60010\": ExtractFailedError,\n \"-60012\": TaskNotFoundError,\n \"-60013\": MinerUError,\n \"-60018\": QuotaExceededError,\n \"-60019\": QuotaExceededError,\n \"-30001\": FlashFileTooLargeError,\n \"-30002\": FlashUnsupportedTypeError,\n \"-30003\": FlashPageLimitError,\n \"-30004\": FlashParamError,\n};\n\nexport function raiseForCode(\n code: number | string,\n msg: string,\n traceId = \"\",\n): never {\n const ErrorClass = CODE_TO_ERROR[String(code)] ?? MinerUError;\n throw new ErrorClass(code, msg, traceId);\n}\n","import { raiseForCode } from \"./errors.js\";\n\ninterface ApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(token: string, baseUrl: string, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<ApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<ApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n headers: this.headers,\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, {\n method: \"PUT\",\n body: data,\n });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async download(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return new Uint8Array(await resp.arrayBuffer());\n }\n\n private async handle(resp: Response): Promise<ApiResponse> {\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as ApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { DEFAULT_FLASH_BASE_URL } from \"./constants.js\";\n\ninterface FlashApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class FlashApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(baseUrl: string = DEFAULT_FLASH_BASE_URL, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = { \"Content-Type\": \"application/json\" };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<FlashApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<FlashApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, { method: \"PUT\", body: data });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async downloadText(url: string): Promise<string> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return resp.text();\n }\n\n private async handle(resp: Response): Promise<FlashApiResponse> {\n if (resp.status === 429) {\n raiseForCode(\n \"RATE_LIMITED\",\n \"flash API rate limit exceeded; try again later\",\n );\n }\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as FlashApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface Image {\n name: string;\n data: Uint8Array;\n path: string;\n}\n\nexport interface Progress {\n extractedPages: number;\n totalPages: number;\n startTime: string;\n}\n\nexport function progressPercent(p: Progress): number {\n if (p.totalPages === 0) return 0;\n return (p.extractedPages / p.totalPages) * 100;\n}\n\nexport function progressToString(p: Progress): string {\n return `${p.extractedPages}/${p.totalPages} (${progressPercent(p).toFixed(0)}%)`;\n}\n\nexport interface ExtractResult {\n taskId: string;\n state: string;\n filename: string | null;\n errCode: string;\n error: string | null;\n zipUrl: string | null;\n\n progress: Progress | null;\n\n markdown: string | null;\n contentList: Record<string, unknown>[] | null;\n images: Image[];\n\n docx: Uint8Array | null;\n html: string | null;\n latex: string | null;\n\n /** @internal */\n _zipBytes: Uint8Array | null;\n}\n\nexport function createEmptyResult(\n taskId: string,\n state: string,\n): ExtractResult {\n return {\n taskId,\n state,\n filename: null,\n errCode: \"\",\n error: null,\n zipUrl: null,\n progress: null,\n markdown: null,\n contentList: null,\n images: [],\n docx: null,\n html: null,\n latex: null,\n _zipBytes: null,\n };\n}\n\nasync function ensureDir(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n\nexport async function saveMarkdown(\n result: ExtractResult,\n path: string,\n withImages = true,\n): Promise<void> {\n if (result.markdown == null) {\n throw new Error(\"No markdown content available (state != done)\");\n }\n await ensureDir(path);\n await writeFile(path, result.markdown, \"utf-8\");\n if (withImages && result.images.length > 0) {\n const imgDir = join(dirname(path), \"images\");\n await mkdir(imgDir, { recursive: true });\n for (const img of result.images) {\n await writeFile(join(imgDir, img.name), img.data);\n }\n }\n}\n\nexport async function saveDocx(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.docx == null) {\n throw new Error(\n \"No docx content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.docx);\n}\n\nexport async function saveHtml(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.html == null) {\n throw new Error(\n \"No html content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.html, \"utf-8\");\n}\n\nexport async function saveLatex(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.latex == null) {\n throw new Error(\n \"No latex content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.latex, \"utf-8\");\n}\n\nexport async function saveAll(\n result: ExtractResult,\n dir: string,\n): Promise<void> {\n if (result._zipBytes == null) {\n throw new Error(\"No zip data available (state != done)\");\n }\n const { unzipSync } = await import(\"fflate\");\n const entries = unzipSync(new Uint8Array(result._zipBytes));\n await mkdir(dir, { recursive: true });\n for (const [relativePath, content] of Object.entries(entries)) {\n if (relativePath.endsWith(\"/\")) continue;\n const fullPath = join(dir, relativePath);\n await ensureDir(fullPath);\n await writeFile(fullPath, content);\n }\n}\n","import { unzipSync } from \"fflate\";\nimport type { ExtractResult, Image } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\n\nconst IMAGE_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".svg\", \".webp\",\n]);\n\nfunction extname(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot === -1 ? \"\" : filename.slice(dot).toLowerCase();\n}\n\nfunction basename(filepath: string): string {\n const parts = filepath.replace(/\\\\/g, \"/\").split(\"/\");\n return parts[parts.length - 1] ?? \"\";\n}\n\nexport function parseZip(\n zipBytes: Uint8Array,\n taskId: string,\n filename: string | null = null,\n): ExtractResult {\n const result = createEmptyResult(taskId, \"done\");\n result.filename = filename;\n result._zipBytes = zipBytes;\n\n const entries = unzipSync(zipBytes);\n const images: Image[] = [];\n let contentList: Record<string, unknown>[] | null = null;\n\n for (const [relPath, data] of Object.entries(entries)) {\n if (relPath.endsWith(\"/\")) continue;\n\n const name = basename(relPath);\n const ext = extname(name);\n const text = () => new TextDecoder().decode(data);\n\n if (ext === \".md\") {\n result.markdown = text();\n } else if (\n name.endsWith(\"_content_list.json\") ||\n name === \"content_list.json\"\n ) {\n contentList = JSON.parse(text()) as Record<string, unknown>[];\n } else if (ext === \".json\" && contentList == null) {\n try {\n const parsed: unknown = JSON.parse(text());\n if (Array.isArray(parsed)) {\n contentList = parsed as Record<string, unknown>[];\n }\n } catch {\n // not a valid JSON array — skip\n }\n } else if (IMAGE_EXTENSIONS.has(ext)) {\n images.push({ name, data: new Uint8Array(data), path: relPath });\n } else if (ext === \".docx\") {\n result.docx = new Uint8Array(data);\n } else if (ext === \".html\" || ext === \".htm\") {\n result.html = text();\n } else if (ext === \".tex\") {\n result.latex = text();\n }\n }\n\n result.contentList = contentList;\n result.images = images;\n return result;\n}\n"],"mappings":"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","names":["basename","extname","unzipSync","extname","basename"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mineru-open-sdk",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "MinerU API SDK — one line to turn documents into Markdown",
5
5
  "license": "Apache-2.0",
6
6
  "author": "yangqi",