@docmana/sdk 0.3.0 → 0.3.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/CHANGELOG.md +3 -0
- package/dist/cli.mjs +3 -5
- package/dist/cli.mjs.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.1
|
|
4
|
+
- Fix: upload all files in a single `/upload` call (one folder UUID) instead of one call per file. Sending each file separately made Docmana treat them as distinct documents, which breaks multi-document flows ("Node already present" when the same flow node is built per document).
|
|
5
|
+
|
|
3
6
|
## 0.3.0
|
|
4
7
|
- Relocated mapper logic and tests to `src/mappers/`.
|
|
5
8
|
- Renamed SDK models to `DocmanaX` and API models to `DocmanaApiX` to distinguish raw backend types from clean public SDK types.
|
package/dist/cli.mjs
CHANGED
|
@@ -308,14 +308,12 @@ async function resolveInputs(input) {
|
|
|
308
308
|
|
|
309
309
|
// src/api/upload.ts
|
|
310
310
|
async function uploadFiles(http, parts, signal) {
|
|
311
|
-
const
|
|
311
|
+
const form = new FormData();
|
|
312
312
|
for (const part of parts) {
|
|
313
|
-
const form = new FormData();
|
|
314
313
|
form.append("files", new File([part.data], part.filename, { type: part.contentType }));
|
|
315
|
-
const res = await http.requestJson("POST", "/upload", { body: form, signal });
|
|
316
|
-
ids.push(res.id);
|
|
317
314
|
}
|
|
318
|
-
|
|
315
|
+
const res = await http.requestJson("POST", "/upload", { body: form, signal });
|
|
316
|
+
return [res.id];
|
|
319
317
|
}
|
|
320
318
|
|
|
321
319
|
// src/api/run-flow.ts
|
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/errors.ts","../src/auth/token-manager.ts","../src/config.ts","../src/http/http-client.ts","../src/files/resolve-input.ts","../src/api/upload.ts","../src/api/run-flow.ts","../src/api/execution-status.ts","../src/api/execution-result.ts","../src/polling/poll.ts","../src/mappers/mapper.ts","../src/client.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { existsSync, realpathSync } from \"node:fs\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command, CommanderError } from \"commander\";\nimport { TokenManager } from \"./auth/token-manager.js\";\nimport { Docmana } from \"./client.js\";\nimport { DEFAULTS } from \"./config.js\";\nimport { DocmanaError, DocmanaExecutionError } from \"./errors.js\";\nimport type {\n DocmanaConfig,\n DocmanaExecutionResult,\n RunFlowInput,\n TokenCache,\n DocmanaDocumentResult,\n DocmanaNodeResult,\n} from \"./types.js\";\n\ntype Env = Record<string, string | undefined>;\ntype Write = (text: string) => void;\n\nexport interface CliIO {\n stdout: Write;\n stderr: Write;\n}\n\nexport interface DocmanaClient {\n runFlow(flowId: string, input: RunFlowInput): Promise<DocmanaExecutionResult>;\n}\n\nexport type DocmanaClientFactory = (config: DocmanaConfig) => DocmanaClient;\n\nexport interface DocmanaCliConfig {\n apiBaseUrl?: string;\n tokenEndpoint?: string;\n scope?: string;\n organisation?: string;\n clientId?: string;\n clientSecret?: string;\n}\n\ninterface CliPromptOptions {\n defaultValue?: string;\n secret?: boolean;\n}\n\nexport type CliPrompt = (label: string, options?: CliPromptOptions) => Promise<string>;\n\nexport interface CliDeps {\n cwd?: string;\n prompt?: CliPrompt;\n fetch?: typeof fetch;\n}\n\nclass CliUsageError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CliUsageError\";\n }\n}\n\nclass CliSilentError extends Error {\n readonly exitCode: number;\n constructor(exitCode = 1) {\n super();\n this.name = \"CliSilentError\";\n this.exitCode = exitCode;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\ninterface RunOptions {\n files?: string;\n clientId?: string;\n clientSecret?: string;\n apiUrl?: string;\n tokenUrl?: string;\n scope?: string;\n organisation?: string;\n config?: string;\n tokenCache?: string;\n json?: boolean;\n language?: string;\n}\n\ninterface ConfigInitOptions {\n config?: string;\n}\n\ninterface LoginOptions {\n clientId?: string;\n clientSecret?: string;\n tokenUrl?: string;\n scope?: string;\n config?: string;\n tokenCache?: string;\n}\n\nconst HELP = {\n root: \"Run Docmana document-analysis flows.\",\n flow: \"Manage and run Docmana flows.\",\n config: \"Manage Docmana CLI configuration.\",\n configInit: \"Create or update a local Docmana CLI config file.\",\n login: \"Acquire and cache a Docmana OAuth2 access token.\",\n run: \"Upload documents, run a Docmana flow, wait for completion, and print the result.\",\n};\n\nconst DEFAULT_CONFIG_FILE = \"docmana.config.json\";\nconst DEFAULT_TOKEN_CACHE_FILE = \"docmana.token.json\";\n\nexport async function runCli(\n argv: string[] = process.argv.slice(2),\n env: Env = process.env,\n io: CliIO = {\n stdout: (text) => process.stdout.write(text),\n stderr: (text) => process.stderr.write(text),\n },\n clientFactory: DocmanaClientFactory = (config) => new Docmana(config),\n deps: CliDeps = {},\n): Promise<number> {\n const program = buildProgram(env, io, clientFactory, deps);\n if (argv.length === 0) {\n io.stdout(program.helpInformation());\n return 0;\n }\n\n try {\n await program.parseAsync(argv, { from: \"user\" });\n return 0;\n } catch (err) {\n if (err instanceof CliSilentError) {\n return err.exitCode;\n }\n if (err instanceof CliUsageError) {\n io.stderr(`Error: ${err.message}\\n`);\n return 2;\n }\n if (err instanceof CommanderError) {\n return err.exitCode === 0 ? 0 : 2;\n }\n io.stderr(`${formatRuntimeError(err)}\\n`);\n return 1;\n }\n}\n\nfunction buildProgram(\n env: Env,\n io: CliIO,\n clientFactory: DocmanaClientFactory,\n deps: CliDeps,\n): Command {\n const program = new Command();\n program\n .name(\"docmana\")\n .description(HELP.root)\n .showHelpAfterError()\n .configureOutput({\n writeOut: io.stdout,\n writeErr: io.stderr,\n outputError: (str, write) => write(str),\n })\n .exitOverride();\n\n program\n .command(\"login\")\n .description(HELP.login)\n .option(\"--client-id <id>\", \"OAuth2 client id; defaults to DOCMANA_CLIENT_ID\")\n .option(\"--client-secret <secret>\", \"OAuth2 client secret; defaults to DOCMANA_CLIENT_SECRET\")\n .option(\"--token-url <url>\", \"OAuth2 token endpoint; defaults to DOCMANA_TOKEN_URL\")\n .option(\"--scope <scope>\", \"OAuth2 scope; defaults to DOCMANA_SCOPE\")\n .option(\"--config <path>\", `Config file path; defaults to ./${DEFAULT_CONFIG_FILE}`)\n .option(\"--token-cache <path>\", `Token cache path; defaults to ./${DEFAULT_TOKEN_CACHE_FILE}`)\n .action(async (options: LoginOptions) => {\n await loginCommand(options, env, io, deps);\n });\n\n const flow = program\n .command(\"flow\")\n .description(HELP.flow)\n .action(() => {\n io.stdout(flow.helpInformation());\n });\n\n flow\n .command(\"run\")\n .description(HELP.run)\n .argument(\"<flow-id>\", \"Docmana flow id\")\n .requiredOption(\"--files <csv>\", \"Comma-separated file paths to upload\")\n .option(\"--client-id <id>\", \"OAuth2 client id; defaults to DOCMANA_CLIENT_ID\")\n .option(\"--client-secret <secret>\", \"OAuth2 client secret; defaults to DOCMANA_CLIENT_SECRET\")\n .option(\"--api-url <url>\", \"Docmana API base URL; defaults to DOCMANA_API_URL\")\n .option(\"--token-url <url>\", \"OAuth2 token endpoint; defaults to DOCMANA_TOKEN_URL\")\n .option(\"--scope <scope>\", \"OAuth2 scope; defaults to DOCMANA_SCOPE\")\n .option(\"--organisation <id>\", \"Docmana organisation id; defaults to DOCMANA_ORGANISATION\")\n .option(\"--config <path>\", `Config file path; defaults to ./${DEFAULT_CONFIG_FILE}`)\n .option(\"--token-cache <path>\", `Token cache path; defaults to ./${DEFAULT_TOKEN_CACHE_FILE}`)\n .option(\"--json\", \"Print the raw JSON result\")\n .option(\"--language <lang>\", \"Translate output to specified language\")\n .action(async (flowId: string, options: RunOptions) => {\n await runFlowCommand(flowId, options, env, io, clientFactory, deps);\n });\n\n const config = program\n .command(\"config\")\n .description(HELP.config)\n .action(() => {\n io.stdout(config.helpInformation());\n });\n\n config\n .command(\"init\")\n .description(HELP.configInit)\n .option(\"--config <path>\", `Config file path; defaults to ./${DEFAULT_CONFIG_FILE}`)\n .action(async (options: ConfigInitOptions) => {\n await configInitCommand(options, io, deps);\n });\n\n return program;\n}\n\nasync function runFlowCommand(\n flowId: string,\n options: RunOptions,\n env: Env,\n io: CliIO,\n clientFactory: DocmanaClientFactory,\n deps: CliDeps,\n): Promise<void> {\n try {\n const files = parseFiles(options.files);\n const cliConfig = await loadCliConfig(options.config, getCwd(deps), Boolean(options.config));\n const clientId = firstNonEmpty(options.clientId, env.DOCMANA_CLIENT_ID, cliConfig.clientId);\n const clientSecret = firstNonEmpty(\n options.clientSecret,\n env.DOCMANA_CLIENT_SECRET,\n cliConfig.clientSecret,\n );\n const organisation = firstNonEmpty(\n options.organisation,\n env.DOCMANA_ORGANISATION,\n cliConfig.organisation,\n );\n const apiBaseUrl = firstNonEmpty(options.apiUrl, env.DOCMANA_API_URL, cliConfig.apiBaseUrl);\n const tokenEndpoint = firstNonEmpty(\n options.tokenUrl,\n env.DOCMANA_TOKEN_URL,\n cliConfig.tokenEndpoint,\n );\n const scope = firstNonEmpty(options.scope, env.DOCMANA_SCOPE, cliConfig.scope);\n\n if (!clientId)\n throw new CliUsageError(\"Missing client id. Use --client-id or DOCMANA_CLIENT_ID.\");\n if (!clientSecret) {\n throw new CliUsageError(\n \"Missing client secret. Use --client-secret or DOCMANA_CLIENT_SECRET.\",\n );\n }\n if (!organisation) {\n throw new CliUsageError(\"Missing organisation. Use --organisation or DOCMANA_ORGANISATION.\");\n }\n\n const client = clientFactory({\n clientId,\n clientSecret,\n apiBaseUrl,\n tokenEndpoint,\n scope,\n headers: { \"X-Selected-Organization\": organisation },\n tokenCache: createFileTokenCache(resolveTokenCachePath(options.tokenCache, getCwd(deps))),\n });\n const result = await client.runFlow(flowId, {\n files: files.map((path) => ({ path })),\n language: options.language,\n });\n\n if (options.json) {\n io.stdout(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n io.stdout(formatHumanResult(result));\n } catch (err) {\n if (options.json) {\n if (err instanceof DocmanaExecutionError && err.result) {\n io.stdout(`${JSON.stringify(err.result, null, 2)}\\n`);\n } else {\n const errorPayload: Record<string, unknown> = {\n error: err instanceof Error ? err.message : String(err),\n };\n if (err instanceof DocmanaError) {\n errorPayload.code = err.code;\n if (err.status !== undefined) errorPayload.status = err.status;\n if (err.requestId !== undefined) errorPayload.requestId = err.requestId;\n }\n io.stdout(`${JSON.stringify(errorPayload, null, 2)}\\n`);\n }\n throw new CliSilentError(err instanceof CliUsageError ? 2 : 1);\n }\n throw err;\n }\n}\n\nasync function loginCommand(\n options: LoginOptions,\n env: Env,\n io: CliIO,\n deps: CliDeps,\n): Promise<void> {\n const auth = await resolveAuthConfig(options, env, deps);\n const tokenCachePath = resolveTokenCachePath(options.tokenCache, getCwd(deps));\n const tokenCache = createFileTokenCache(tokenCachePath);\n const tokenManager = new TokenManager({\n clientId: auth.clientId,\n clientSecret: auth.clientSecret,\n tokenEndpoint: auth.tokenEndpoint,\n scope: auth.scope,\n fetchImpl: deps.fetch ?? fetch,\n tokenCache,\n });\n\n await tokenManager.getToken();\n const cached = await tokenCache.read();\n io.stdout(`Logged in. Token cached at ${tokenCachePath}\\n`);\n if (cached) io.stdout(formatTokenExpiry(cached.expiresAt));\n}\n\nfunction formatTokenExpiry(expiresAt: number): string {\n const expiresAtDate = new Date(expiresAt);\n return (\n [\n `Token expires at local time ${expiresAtDate.toLocaleString()}`,\n `Token expires at UTC ${expiresAtDate.toISOString()}`,\n ].join(\"\\n\") + \"\\n\"\n );\n}\n\nasync function resolveAuthConfig(\n options: LoginOptions,\n env: Env,\n deps: CliDeps,\n): Promise<{ clientId: string; clientSecret: string; tokenEndpoint: string; scope: string }> {\n const cliConfig = await loadCliConfig(options.config, getCwd(deps), Boolean(options.config));\n const clientId = firstNonEmpty(options.clientId, env.DOCMANA_CLIENT_ID, cliConfig.clientId);\n const clientSecret = firstNonEmpty(\n options.clientSecret,\n env.DOCMANA_CLIENT_SECRET,\n cliConfig.clientSecret,\n );\n const tokenEndpoint =\n firstNonEmpty(options.tokenUrl, env.DOCMANA_TOKEN_URL, cliConfig.tokenEndpoint) ??\n DEFAULTS.tokenEndpoint;\n const scope = firstNonEmpty(options.scope, env.DOCMANA_SCOPE, cliConfig.scope) ?? DEFAULTS.scope;\n\n if (!clientId)\n throw new CliUsageError(\"Missing client id. Use --client-id or DOCMANA_CLIENT_ID.\");\n if (!clientSecret) {\n throw new CliUsageError(\"Missing client secret. Use --client-secret or DOCMANA_CLIENT_SECRET.\");\n }\n\n return { clientId, clientSecret, tokenEndpoint, scope };\n}\n\nasync function configInitCommand(\n options: ConfigInitOptions,\n io: CliIO,\n deps: CliDeps,\n): Promise<void> {\n const cwd = getCwd(deps);\n const configPath = resolveConfigPath(options.config, cwd);\n const existing = await loadCliConfig(options.config, cwd, false);\n const defaultPrompt = deps.prompt ? undefined : createDefaultPrompt();\n const prompt = deps.prompt ?? defaultPrompt?.prompt;\n if (!prompt) throw new CliUsageError(\"Unable to initialize interactive prompt\");\n\n try {\n const config: DocmanaCliConfig = {\n apiBaseUrl: await prompt(\"API base URL\", {\n defaultValue: existing.apiBaseUrl ?? DEFAULTS.apiBaseUrl,\n }),\n tokenEndpoint: await prompt(\"OAuth2 token endpoint\", {\n defaultValue: existing.tokenEndpoint ?? DEFAULTS.tokenEndpoint,\n }),\n scope: await prompt(\"OAuth2 scope\", {\n defaultValue: existing.scope ?? DEFAULTS.scope,\n }),\n organisation: await prompt(\"Organisation\", {\n defaultValue: existing.organisation,\n }),\n clientId: await prompt(\"Client id\", {\n defaultValue: existing.clientId,\n }),\n clientSecret: await prompt(\"Client secret\", {\n defaultValue: existing.clientSecret,\n secret: true,\n }),\n };\n\n await mkdir(dirname(configPath), { recursive: true });\n await writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, \"utf8\");\n io.stdout(`Wrote ${configPath}\\n`);\n io.stdout(\n `Warning: ${DEFAULT_CONFIG_FILE} contains credentials and should stay ignored by Git.\\n`,\n );\n } finally {\n defaultPrompt?.close();\n }\n}\n\nasync function loadCliConfig(\n configPathOption: string | undefined,\n cwd: string,\n requireExisting: boolean,\n): Promise<DocmanaCliConfig> {\n const configPath = resolveConfigPath(configPathOption, cwd);\n if (!existsSync(configPath)) {\n if (requireExisting) throw new CliUsageError(`Config file not found: ${configPath}`);\n return {};\n }\n let raw: string;\n try {\n raw = await readFile(configPath, \"utf8\");\n } catch {\n throw new CliUsageError(`Unable to read config file: ${configPath}`);\n }\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Config must be a JSON object\");\n }\n return normalizeCliConfig(parsed as Record<string, unknown>);\n } catch {\n throw new CliUsageError(`Invalid config file: ${configPath}`);\n }\n}\n\nfunction normalizeCliConfig(config: Record<string, unknown>): DocmanaCliConfig {\n return {\n apiBaseUrl: stringValue(config.apiBaseUrl),\n tokenEndpoint: stringValue(config.tokenEndpoint),\n scope: stringValue(config.scope),\n organisation: stringValue(config.organisation),\n clientId: stringValue(config.clientId),\n clientSecret: stringValue(config.clientSecret),\n };\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction resolveConfigPath(configPathOption: string | undefined, cwd: string): string {\n return resolve(cwd, configPathOption ?? DEFAULT_CONFIG_FILE);\n}\n\nfunction resolveTokenCachePath(tokenCachePathOption: string | undefined, cwd: string): string {\n return resolve(cwd, tokenCachePathOption ?? DEFAULT_TOKEN_CACHE_FILE);\n}\n\nfunction getCwd(deps: CliDeps): string {\n return deps.cwd ?? process.cwd();\n}\n\nfunction createFileTokenCache(path: string): TokenCache {\n return {\n async read() {\n if (!existsSync(path)) return null;\n try {\n const parsed = JSON.parse(await readFile(path, \"utf8\")) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return null;\n const value = parsed as Record<string, unknown>;\n if (\n typeof value.accessToken !== \"string\" ||\n typeof value.expiresAt !== \"number\" ||\n typeof value.clientId !== \"string\" ||\n typeof value.tokenEndpoint !== \"string\" ||\n typeof value.scope !== \"string\"\n ) {\n return null;\n }\n return {\n accessToken: value.accessToken,\n expiresAt: value.expiresAt,\n clientId: value.clientId,\n tokenEndpoint: value.tokenEndpoint,\n scope: value.scope,\n };\n } catch {\n return null;\n }\n },\n async write(entry) {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(entry, null, 2)}\\n`, \"utf8\");\n },\n async clear() {\n await rm(path, { force: true });\n },\n };\n}\n\nfunction createDefaultPrompt(): { prompt: CliPrompt; close: () => void } {\n if (!process.stdin.isTTY) {\n let index = 0;\n const linesPromise = readStdinLines();\n return {\n prompt: async (label, options = {}) => {\n process.stdout.write(formatPrompt(label, options));\n const lines = await linesPromise;\n const answer = lines[index++] ?? \"\";\n return firstNonEmpty(answer, options.defaultValue) ?? \"\";\n },\n close: () => undefined,\n };\n }\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return {\n prompt: async (label, options = {}) => {\n const answer = await rl.question(formatPrompt(label, options));\n return firstNonEmpty(answer, options.defaultValue) ?? \"\";\n },\n close: () => rl.close(),\n };\n}\n\nfunction formatPrompt(label: string, options: CliPromptOptions): string {\n const defaultHint =\n options.defaultValue && !options.secret\n ? ` [${options.defaultValue}]`\n : options.defaultValue && options.secret\n ? \" [current value hidden]\"\n : \"\";\n return `${label}${defaultHint}: `;\n}\n\nasync function readStdinLines(): Promise<string[]> {\n let input = \"\";\n for await (const chunk of process.stdin) input += String(chunk);\n return input.split(/\\r?\\n/);\n}\n\nfunction parseFiles(filesCsv: string | undefined): string[] {\n const files =\n filesCsv\n ?.split(\",\")\n .map((file) => file.trim())\n .filter(Boolean) ?? [];\n if (files.length === 0) throw new CliUsageError(\"Missing files. Use --files <path[,path]>.\");\n return files;\n}\n\nfunction firstNonEmpty(...values: Array<string | undefined>): string | undefined {\n return values.map((value) => value?.trim()).find(Boolean);\n}\n\nfunction formatHumanResult(result: DocmanaExecutionResult): string {\n const lines = [\"Docmana flow completed\", `Status: ${String(result.status ?? \"Unknown\")}`];\n const executionId = result.executionId;\n if (executionId) lines.push(`Execution id: ${String(executionId)}`);\n if (result.documents && result.documents.mappings) {\n lines.push(`Results: ${result.documents.mappings.length}`);\n }\n if (result.errors && result.errors.length > 0) {\n lines.push(`Errors: ${result.errors.length}`);\n }\n\n const previewData: Record<string, unknown> = {};\n if (result.documents && result.documents.mappings) {\n for (const mapping of result.documents.mappings.slice(0, 3)) {\n const docKey = mapping.reference;\n previewData[mapping.name] = result.documents[docKey];\n }\n }\n\n const preview = formatResultsPreview(previewData);\n if (preview) lines.push(\"\", \"Result preview:\", preview);\n lines.push(\"\", \"Use --json to print the complete result payload.\");\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction formatResultsPreview(results: unknown): string | undefined {\n if (!results) return undefined;\n const preview = JSON.stringify(results, null, 2);\n if (!preview) return undefined;\n return preview.length > 2_000 ? `${preview.slice(0, 2_000)}\\n...` : preview;\n}\n\nfunction formatRuntimeError(err: unknown): string {\n return formatHumanError(err);\n}\n\nfunction formatHumanError(err: unknown): string {\n if (err instanceof DocmanaExecutionError) {\n const lines = [`Error: ${err.message}`];\n\n if (err.errors && err.errors.length > 0) {\n lines.push(\"Global errors:\");\n for (const e of err.errors) {\n lines.push(` - ${formatSingleError(e)}`);\n }\n }\n\n const result = err.result;\n if (result) {\n if (result.documents && result.documents.mappings && result.documents.mappings.length > 0) {\n lines.push(\"Document execution results:\");\n for (const mapping of result.documents.mappings) {\n const docKey = mapping.reference;\n const docName = mapping.name;\n const docResult = result.documents[docKey] as DocmanaDocumentResult | undefined;\n\n if (docResult) {\n const status = docResult.status || \"Unknown\";\n\n const nodes: DocmanaNodeResult[] = [];\n if (docResult.classifications) nodes.push(...Object.values(docResult.classifications));\n if (docResult.metadataExtraction) nodes.push(docResult.metadataExtraction);\n if (docResult.extractions) nodes.push(...Object.values(docResult.extractions));\n if (docResult.validations) nodes.push(...Object.values(docResult.validations));\n\n const hasNodeFailures = nodes.some(\n (n) => n.status === \"Failed\" || (n.errors && n.errors.length > 0),\n );\n\n if (docResult.status === \"Failed\" || hasNodeFailures) {\n lines.push(` - Document: ${docName} (Status: ${status})`);\n if (docResult.classifications) {\n for (const [nodeName, node] of Object.entries(docResult.classifications)) {\n if (node.errors && node.errors.length > 0) {\n lines.push(` Classification: ${nodeName} (Status: ${node.status})`);\n for (const nodeErr of node.errors) {\n lines.push(` - ${nodeErr}`);\n }\n }\n }\n }\n if (\n docResult.metadataExtraction?.errors &&\n docResult.metadataExtraction.errors.length > 0\n ) {\n lines.push(\n ` MetadataExtraction: (Status: ${docResult.metadataExtraction.status})`,\n );\n for (const nodeErr of docResult.metadataExtraction.errors) {\n lines.push(` - ${nodeErr}`);\n }\n }\n if (docResult.extractions) {\n for (const [nodeName, node] of Object.entries(docResult.extractions)) {\n if (node.status === \"Failed\" || (node.errors && node.errors.length > 0)) {\n lines.push(` Extraction: ${nodeName} (Status: ${node.status})`);\n if (node.errors) {\n for (const nodeErr of node.errors) {\n lines.push(` - ${nodeErr}`);\n }\n }\n }\n }\n }\n if (docResult.validations) {\n for (const [nodeName, node] of Object.entries(docResult.validations)) {\n if (node.status === \"Failed\" || (node.errors && node.errors.length > 0)) {\n lines.push(` Validation: ${nodeName} (Status: ${node.status})`);\n if (node.errors) {\n for (const nodeErr of node.errors) {\n lines.push(` - ${nodeErr}`);\n }\n }\n }\n }\n }\n } else {\n lines.push(` - Document: ${docName} (Status: ${status})`);\n }\n } else {\n lines.push(` - Document: ${docName} (Status: Unknown)`);\n }\n }\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n if (err instanceof DocmanaError) {\n return `Error: ${err.message} (Code: ${err.code})`;\n }\n\n if (err instanceof Error) {\n return `Error: ${err.message}`;\n }\n\n return `Error: ${String(err)}`;\n}\n\nfunction formatSingleError(e: unknown): string {\n if (typeof e === \"string\") return e;\n if (e && typeof e === \"object\") {\n const obj = e as Record<string, unknown>;\n if (typeof obj.msg === \"string\") return obj.msg;\n if (typeof obj.message === \"string\") return obj.message;\n if (typeof obj.error === \"string\") return obj.error;\n try {\n return JSON.stringify(e);\n } catch {\n return String(e);\n }\n }\n return String(e);\n}\n\nfunction isDirectRun(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n try {\n return realpathSync(resolve(entry)) === realpathSync(fileURLToPath(import.meta.url));\n } catch {\n return false;\n }\n}\n\nif (isDirectRun()) {\n runCli().then((code) => {\n process.exitCode = code;\n });\n}\n","import type { DocmanaExecutionResult } from \"./models/docmana-execution-result.model.js\";\n\nexport class DocmanaError extends Error {\n readonly status?: number;\n readonly requestId?: string;\n readonly code: string;\n constructor(message: string, opts: { status?: number; requestId?: string; code?: string } = {}) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.requestId = opts.requestId;\n this.code = opts.code ?? \"docmana_error\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class DocmanaAuthError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"auth_error\" });\n }\n}\n\nexport class DocmanaPermissionError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"permission_error\" });\n }\n}\n\nexport class DocmanaNotFoundError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"not_found\" });\n }\n}\n\nexport class DocmanaRequestError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"bad_request\" });\n }\n}\n\nexport class DocmanaExecutionError extends DocmanaError {\n readonly errors: unknown[];\n readonly result?: DocmanaExecutionResult;\n constructor(message: string, errors: unknown[] = [], result?: DocmanaExecutionResult) {\n super(message, { code: \"execution_failed\" });\n this.errors = errors;\n this.result = result;\n }\n}\n\nexport class DocmanaTimeoutError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"timeout\" });\n }\n}\n\nexport class DocmanaAbortError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"aborted\" });\n }\n}\n\nexport function errorFromResponse(\n status: number,\n message: string,\n requestId?: string,\n): DocmanaError {\n const opts = { status, requestId };\n switch (status) {\n case 400:\n return new DocmanaRequestError(message, opts);\n case 401:\n return new DocmanaAuthError(message, opts);\n case 403:\n return new DocmanaPermissionError(message, opts);\n case 404:\n return new DocmanaNotFoundError(message, opts);\n default:\n return new DocmanaError(message, opts);\n }\n}\n","import { DocmanaAuthError } from \"../errors.js\";\nimport type { TokenCache, TokenCacheEntry } from \"../types.js\";\n\nconst SAFETY_MARGIN_MS = 60_000;\n\nexport interface TokenManagerOptions {\n clientId: string;\n clientSecret: string;\n tokenEndpoint: string;\n scope: string;\n fetchImpl: typeof fetch;\n tokenCache?: TokenCache;\n}\n\nexport class TokenManager {\n private token: string | null = null;\n private expiresAt = 0;\n private inflight: Promise<string> | null = null;\n\n constructor(private readonly opts: TokenManagerOptions) {}\n\n invalidate(): void {\n this.token = null;\n this.expiresAt = 0;\n void this.opts.tokenCache?.clear().catch(() => undefined);\n }\n\n async getToken(): Promise<string> {\n if (this.token && Date.now() < this.expiresAt) return this.token;\n const cached = await this.readCachedToken();\n if (cached) return cached;\n if (this.inflight) return this.inflight;\n this.inflight = this.acquire().finally(() => {\n this.inflight = null;\n });\n return this.inflight;\n }\n\n private async acquire(): Promise<string> {\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.opts.clientId,\n client_secret: this.opts.clientSecret,\n scope: this.opts.scope,\n });\n const res = await this.opts.fetchImpl(this.opts.tokenEndpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n if (!res.ok) {\n // Do NOT include the response body verbatim — avoid leaking secrets/echoes.\n throw new DocmanaAuthError(\"Failed to acquire Docmana access token\", { status: res.status });\n }\n const json = (await res.json()) as Partial<{ access_token: string; expires_in: number }>;\n if (\n typeof json.access_token !== \"string\" ||\n json.access_token.length === 0 ||\n typeof json.expires_in !== \"number\" ||\n !Number.isFinite(json.expires_in)\n ) {\n throw new DocmanaAuthError(\"Malformed token response from Docmana CIAM\", {\n status: res.status,\n });\n }\n this.token = json.access_token;\n this.expiresAt = Date.now() + json.expires_in * 1000 - SAFETY_MARGIN_MS;\n await this.writeCachedToken().catch(() => undefined);\n return this.token;\n }\n\n private async readCachedToken(): Promise<string | null> {\n if (!this.opts.tokenCache) return null;\n let entry: TokenCacheEntry | null;\n try {\n entry = await this.opts.tokenCache.read();\n } catch {\n return null;\n }\n if (!entry) return null;\n if (\n entry.clientId !== this.opts.clientId ||\n entry.tokenEndpoint !== this.opts.tokenEndpoint ||\n entry.scope !== this.opts.scope ||\n Date.now() >= entry.expiresAt\n ) {\n await this.opts.tokenCache.clear().catch(() => undefined);\n return null;\n }\n this.token = entry.accessToken;\n this.expiresAt = entry.expiresAt;\n return this.token;\n }\n\n private async writeCachedToken(): Promise<void> {\n if (!this.opts.tokenCache || !this.token) return;\n await this.opts.tokenCache.write({\n accessToken: this.token,\n expiresAt: this.expiresAt,\n clientId: this.opts.clientId,\n tokenEndpoint: this.opts.tokenEndpoint,\n scope: this.opts.scope,\n });\n }\n}\n","import type { DocmanaConfig } from \"./types.js\";\nimport type { TokenCache } from \"./types.js\";\n\nexport const DEFAULTS = {\n apiBaseUrl: \"https://api.docmana.ai\",\n tokenEndpoint:\n \"https://4fe70f5b-e013-4f65-9fa7-3109a33beba5.ciamlogin.com/4fe70f5b-e013-4f65-9fa7-3109a33beba5/oauth2/v2.0/token\",\n scope: \"api://d781e6ba-cc08-4618-8099-ad968abd2b9e/.default\",\n timeoutMs: 300_000,\n pollIntervalMs: 2_000,\n} as const;\n\nexport interface ResolvedConfig {\n clientId: string;\n clientSecret: string;\n apiBaseUrl: string;\n tokenEndpoint: string;\n scope: string;\n timeoutMs: number;\n pollIntervalMs: number;\n fetchImpl: typeof fetch;\n headers: Record<string, string>;\n tokenCache?: TokenCache;\n}\n\nexport function resolveConfig(config: DocmanaConfig): ResolvedConfig {\n if (!config.clientId) throw new Error(\"DocmanaConfig.clientId is required\");\n if (!config.clientSecret) throw new Error(\"DocmanaConfig.clientSecret is required\");\n const apiBaseUrl = (config.apiBaseUrl ?? DEFAULTS.apiBaseUrl).replace(/\\/+$/, \"\");\n return {\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n apiBaseUrl,\n tokenEndpoint: config.tokenEndpoint ?? DEFAULTS.tokenEndpoint,\n scope: config.scope ?? DEFAULTS.scope,\n timeoutMs: config.timeoutMs ?? DEFAULTS.timeoutMs,\n pollIntervalMs: config.pollIntervalMs ?? DEFAULTS.pollIntervalMs,\n fetchImpl: config.fetch ?? fetch,\n headers: config.headers ?? {},\n tokenCache: config.tokenCache,\n };\n}\n","import type { TokenManager } from \"../auth/token-manager.js\";\nimport { DocmanaError, DocmanaAbortError, errorFromResponse } from \"../errors.js\";\n\nexport interface HttpClientOptions {\n apiBaseUrl: string;\n fetchImpl: typeof fetch;\n tokenManager: TokenManager;\n headers?: Record<string, string>;\n}\n\ntype FetchBody = NonNullable<Parameters<typeof fetch>[1]>[\"body\"];\n\nexport interface RequestOptions {\n query?: Record<string, string>;\n body?: FetchBody;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport class HttpClient {\n constructor(private readonly opts: HttpClientOptions) {}\n\n async requestJson<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const res = await this.requestRaw(method, path, options);\n const text = await res.text();\n if (!text) return {} as T;\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new DocmanaError(\"Invalid JSON response from Docmana\", { status: res.status });\n }\n }\n\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n let res = await this.send(method, path, options);\n if (res.status === 401) {\n this.opts.tokenManager.invalidate();\n res = await this.send(method, path, options);\n }\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const message = await this.extractMessage(res);\n throw errorFromResponse(res.status, message, requestId);\n }\n return res;\n }\n\n private async send(method: string, path: string, options: RequestOptions): Promise<Response> {\n const token = await this.opts.tokenManager.getToken();\n const url = new URL(this.opts.apiBaseUrl + path);\n for (const [k, v] of Object.entries(options.query ?? {})) url.searchParams.set(k, v);\n const headers: Record<string, string> = {\n ...(this.opts.headers ?? {}),\n authorization: `Bearer ${token}`,\n ...(options.headers ?? {}),\n };\n try {\n return await this.opts.fetchImpl(url, {\n method,\n headers,\n body: options.body,\n signal: options.signal,\n });\n } catch (err) {\n if (options.signal?.aborted || (err instanceof Error && err.name === \"AbortError\")) {\n throw new DocmanaAbortError(\"Request aborted\");\n }\n throw err;\n }\n }\n\n private async extractMessage(res: Response): Promise<string> {\n try {\n const data = (await res.clone().json()) as { message?: string; error?: string };\n return data.message ?? data.error ?? res.statusText ?? `HTTP ${res.status}`;\n } catch {\n return res.statusText ?? `HTTP ${res.status}`;\n }\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport type { FileInput, RunFlowInput } from \"../types.js\";\n\nexport interface ResolvedPart {\n data: Blob;\n filename: string;\n contentType: string;\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".tif\": \"image/tiff\",\n \".tiff\": \"image/tiff\",\n \".txt\": \"text/plain\",\n \".json\": \"application/json\",\n};\n\nfunction contentTypeFor(name: string): string {\n const dot = name.lastIndexOf(\".\");\n if (dot < 0) return \"application/octet-stream\";\n const ext = name.slice(dot).toLowerCase();\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction isReadable(x: unknown): x is Readable {\n return typeof x === \"object\" && x !== null && typeof (x as Readable).pipe === \"function\";\n}\n\nfunction isPathInput(x: unknown): x is { path: string } {\n return typeof x === \"object\" && x !== null && typeof (x as { path?: unknown }).path === \"string\";\n}\n\nasync function streamToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) chunks.push(Buffer.from(chunk));\n return Buffer.concat(chunks);\n}\n\nasync function resolveOne(input: FileInput, fallbackName: string): Promise<ResolvedPart> {\n if (typeof input === \"string\" || isPathInput(input)) {\n const path = typeof input === \"string\" ? input : input.path;\n const data = await readFile(path);\n const filename = basename(path);\n return { data: new Blob([data]), filename, contentType: contentTypeFor(filename) };\n }\n if (input instanceof Uint8Array) {\n return {\n data: new Blob([input]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n if (isReadable(input)) {\n const buf = await streamToBuffer(input);\n return {\n data: new Blob([buf]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n throw new Error(\"Unsupported file input type\");\n}\n\nexport async function resolveInputs(input: RunFlowInput): Promise<ResolvedPart[]> {\n const list: FileInput[] = input.files ?? (input.file !== undefined ? [input.file] : []);\n if (list.length === 0) throw new Error(\"runFlow requires `file` or `files`\");\n const fallback = input.fileName ?? \"upload.bin\";\n return Promise.all(list.map((item) => resolveOne(item, fallback)));\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ResolvedPart } from \"../files/resolve-input.js\";\n\nexport async function uploadFiles(\n http: HttpClient,\n parts: ResolvedPart[],\n signal?: AbortSignal,\n): Promise<string[]> {\n const ids: string[] = [];\n for (const part of parts) {\n const form = new FormData();\n form.append(\"files\", new File([part.data], part.filename, { type: part.contentType }));\n const res = await http.requestJson<{ id: string }>(\"POST\", \"/upload\", { body: form, signal });\n ids.push(res.id);\n }\n return ids;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\n\nexport async function runFlow(\n http: HttpClient,\n flowId: string,\n uuidFiles: string[],\n signal?: AbortSignal,\n once = false,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const res = await http.requestJson<{ execution_result_id: string }>(\"POST\", path, {\n query: { async_mode: \"true\" },\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ uuid_files: uuidFiles }),\n signal,\n });\n return res.execution_result_id;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ExecutionStatus } from \"../types.js\";\n\nexport async function getStatus(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<{ status: ExecutionStatus | string }> {\n return http.requestJson(\"GET\", `/flows/execution-status/${executionResultId}`, { signal });\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\n\nexport async function getResult(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<DocmanaApiExecutionResult> {\n return http.requestJson(\"GET\", `/flows/execution-result/${executionResultId}`, { signal });\n}\n","import { DocmanaTimeoutError, DocmanaAbortError } from \"../errors.js\";\n\nconst TERMINAL = new Set([\"Completed\", \"Failed\"]);\n\nexport interface PollOptions {\n check: () => Promise<string>;\n intervalMs: number;\n timeoutMs: number;\n sleep?: (ms: number) => Promise<void>;\n elapsed?: () => number;\n signal?: AbortSignal;\n}\n\nconst defaultSleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\nexport async function pollUntilTerminal(opts: PollOptions): Promise<string> {\n const sleep = opts.sleep ?? defaultSleep;\n const start = Date.now();\n const elapsed = opts.elapsed ?? (() => Date.now() - start);\n for (;;) {\n if (opts.signal?.aborted) throw new DocmanaAbortError(\"Polling aborted\");\n const status = await opts.check();\n if (TERMINAL.has(status)) return status;\n if (elapsed() >= opts.timeoutMs) {\n throw new DocmanaTimeoutError(`Execution did not finish within ${opts.timeoutMs}ms`);\n }\n await sleep(opts.intervalMs);\n }\n}\n","import { DocmanaError } from \"../errors.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\nimport type { DocmanaApiNodeResult } from \"../models/docmana-api-node-result.model.js\";\nimport type { DocmanaExecutionResult } from \"../models/docmana-execution-result.model.js\";\nimport type { DocmanaDocumentResult } from \"../models/docmana-document-result.model.js\";\nimport type { DocmanaNodeResult } from \"../models/docmana-node-result.model.js\";\nimport type { DocmanaScoreNodeResult } from \"../models/docmana-score-node-result.model.js\";\nimport type { DocmanaCrossValidationResult } from \"../models/docmana-cross-validation-result.model.js\";\nimport type { DocmanaConclusionResult } from \"../models/docmana-conclusion-result.model.js\";\n\nfunction extractNodeFields(\n rawNode: DocmanaApiNodeResult,\n targetLanguage?: string,\n): DocmanaNodeResult {\n const metadataFields = new Set([\n \"node_id\",\n \"node_name\",\n \"node_type\",\n \"feature_name\",\n \"running_time\",\n \"status\",\n \"score\",\n \"feedback\",\n \"translations\",\n \"tokens\",\n \"input_tokens\",\n \"output_tokens\",\n \"errors\",\n \"mana\",\n \"model\",\n \"tool_calls\",\n \"prompt_id\",\n \"prompt\",\n \"prompt_name\",\n \"label\",\n \"scoreDescription\",\n \"score_description\",\n \"result\",\n \"documentType\",\n ]);\n\n let sourceObj: Record<string, unknown> = rawNode;\n if (targetLanguage) {\n const translations = rawNode.translations;\n if (!translations || !translations[targetLanguage]) {\n throw new DocmanaError(\n `Translation for language '${targetLanguage}' is missing on node '${rawNode.node_name || rawNode.node_id}'`,\n { code: \"translation_missing\", status: 400 },\n );\n }\n sourceObj = translations[targetLanguage] as Record<string, unknown>;\n }\n\n const dynamicFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(sourceObj)) {\n if (!metadataFields.has(key)) {\n dynamicFields[key] = value;\n }\n }\n\n const sdkNode: DocmanaScoreNodeResult = {\n status: rawNode.status || \"Unknown\",\n };\n\n if (rawNode.errors && rawNode.errors.length > 0) {\n sdkNode.errors = rawNode.errors;\n }\n\n const nodeType = rawNode.node_type || \"\";\n const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion)$/i.test(nodeType);\n if (isScoreNode) {\n if (rawNode.score !== undefined && rawNode.score !== null) {\n sdkNode.score = rawNode.score;\n }\n if (rawNode.feedback !== undefined && rawNode.feedback !== null) {\n sdkNode.feedback = rawNode.feedback;\n }\n }\n\n if (Object.keys(dynamicFields).length > 0) {\n sdkNode.data = dynamicFields;\n }\n\n return sdkNode;\n}\n\nexport function mapExecutionResult(\n raw: DocmanaApiExecutionResult,\n targetLanguage?: string,\n): DocmanaExecutionResult {\n const sdkResult: DocmanaExecutionResult = {\n status: raw.status || \"Unknown\",\n executionId: String(raw.execution_id || raw.executionResultId || raw.execution_result_id || \"\"),\n documents: {\n mappings: [],\n },\n };\n\n if (raw.errors && raw.errors.length > 0) {\n sdkResult.errors = raw.errors;\n }\n\n const results = raw.results || [];\n\n for (const item of results) {\n const isDocSpecific = !!item.document;\n\n if (isDocSpecific && item.document) {\n const docReq = item.document;\n const docKey = docReq.doc_key || \"unknown_doc\";\n const docName = docReq.name || \"\";\n\n sdkResult.documents.mappings.push({\n name: docName,\n reference: docKey,\n });\n\n const docResult: DocmanaDocumentResult = {\n status: item.status || docReq.status || \"Unknown\",\n extractions: {},\n validations: {},\n };\n\n const nodeResults = item.node_results || [];\n\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^Classification$/i.test(nodeType)) {\n const mappedNode = extractNodeFields(node, targetLanguage);\n if (!docResult.classifications) {\n docResult.classifications = {};\n }\n docResult.classifications[nodeName] = mappedNode;\n } else if (/^MetadataExtraction$/i.test(nodeType)) {\n docResult.metadataExtraction = extractNodeFields(node, targetLanguage);\n } else if (/^Extraction$/i.test(nodeType)) {\n if (docResult.extractions) {\n docResult.extractions[nodeName] = extractNodeFields(node, targetLanguage);\n }\n } else if (/^Validation$/i.test(nodeType)) {\n if (docResult.validations) {\n docResult.validations[nodeName] = extractNodeFields(node, targetLanguage);\n }\n }\n }\n\n if (docResult.extractions && Object.keys(docResult.extractions).length === 0) {\n delete docResult.extractions;\n }\n if (docResult.validations && Object.keys(docResult.validations).length === 0) {\n delete docResult.validations;\n }\n\n sdkResult.documents[docKey] = docResult;\n } else {\n const nodeResults = item.node_results || [];\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^CrossValidation$/i.test(nodeType)) {\n if (!sdkResult.crossValidations) {\n sdkResult.crossValidations = {};\n }\n sdkResult.crossValidations[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaCrossValidationResult;\n } else if (/^(Conclusion|Finish)$/i.test(nodeType)) {\n if (!sdkResult.conclusions) {\n sdkResult.conclusions = {};\n }\n sdkResult.conclusions[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaConclusionResult;\n }\n }\n }\n }\n\n return sdkResult;\n}\n","import { resolveConfig } from \"./config.js\";\nimport type { ResolvedConfig } from \"./config.js\";\nimport type {\n DocmanaConfig,\n DocmanaExecutionResult,\n ExecutionStatus,\n RunFlowInput,\n} from \"./types.js\";\nimport { TokenManager } from \"./auth/token-manager.js\";\nimport { HttpClient } from \"./http/http-client.js\";\nimport { resolveInputs } from \"./files/resolve-input.js\";\nimport { uploadFiles } from \"./api/upload.js\";\nimport { runFlow as runFlowApi } from \"./api/run-flow.js\";\nimport { getStatus as getStatusApi } from \"./api/execution-status.js\";\nimport { getResult as getResultApi } from \"./api/execution-result.js\";\nimport { pollUntilTerminal } from \"./polling/poll.js\";\nimport { DocmanaExecutionError } from \"./errors.js\";\nimport { mapExecutionResult } from \"./mappers/index.js\";\n\nexport class Docmana {\n private readonly config: ResolvedConfig;\n private readonly http: HttpClient;\n\n constructor(config: DocmanaConfig) {\n this.config = resolveConfig(config);\n const tokenManager = new TokenManager({\n clientId: this.config.clientId,\n clientSecret: this.config.clientSecret,\n tokenEndpoint: this.config.tokenEndpoint,\n scope: this.config.scope,\n fetchImpl: this.config.fetchImpl,\n tokenCache: this.config.tokenCache,\n });\n this.http = new HttpClient({\n apiBaseUrl: this.config.apiBaseUrl,\n fetchImpl: this.config.fetchImpl,\n tokenManager,\n headers: this.config.headers,\n });\n }\n\n async runFlowAsync(\n flowId: string,\n input: RunFlowInput,\n ): Promise<{ executionResultId: string; fileIds: string[] }> {\n const parts = await resolveInputs(input);\n const fileIds = await uploadFiles(this.http, parts, input.signal);\n const executionResultId = await runFlowApi(\n this.http,\n flowId,\n fileIds,\n input.signal,\n input.once ?? false,\n );\n return { executionResultId, fileIds };\n }\n\n async getStatus(\n executionResultId: string,\n signal?: AbortSignal,\n ): Promise<{ status: ExecutionStatus | string }> {\n return getStatusApi(this.http, executionResultId, signal);\n }\n\n async getResult(\n executionResultId: string,\n signal?: AbortSignal,\n language?: string,\n ): Promise<DocmanaExecutionResult> {\n const rawResult = await getResultApi(this.http, executionResultId, signal);\n return mapExecutionResult(rawResult, language);\n }\n\n async runFlow(flowId: string, input: RunFlowInput): Promise<DocmanaExecutionResult> {\n const { executionResultId } = await this.runFlowAsync(flowId, input);\n await pollUntilTerminal({\n check: async () => (await this.getStatus(executionResultId, input.signal)).status,\n intervalMs: input.pollIntervalMs ?? this.config.pollIntervalMs,\n timeoutMs: input.timeoutMs ?? this.config.timeoutMs,\n signal: input.signal,\n });\n const result = await this.getResult(executionResultId, input.signal, input.language);\n if (result.status === \"Failed\") {\n throw new DocmanaExecutionError(\n `Flow ${flowId} execution failed`,\n result.errors ?? [],\n result,\n );\n }\n return result;\n }\n}\n"],"mappings":"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","names":["readFile","readFile"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/errors.ts","../src/auth/token-manager.ts","../src/config.ts","../src/http/http-client.ts","../src/files/resolve-input.ts","../src/api/upload.ts","../src/api/run-flow.ts","../src/api/execution-status.ts","../src/api/execution-result.ts","../src/polling/poll.ts","../src/mappers/mapper.ts","../src/client.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { existsSync, realpathSync } from \"node:fs\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command, CommanderError } from \"commander\";\nimport { TokenManager } from \"./auth/token-manager.js\";\nimport { Docmana } from \"./client.js\";\nimport { DEFAULTS } from \"./config.js\";\nimport { DocmanaError, DocmanaExecutionError } from \"./errors.js\";\nimport type {\n DocmanaConfig,\n DocmanaExecutionResult,\n RunFlowInput,\n TokenCache,\n DocmanaDocumentResult,\n DocmanaNodeResult,\n} from \"./types.js\";\n\ntype Env = Record<string, string | undefined>;\ntype Write = (text: string) => void;\n\nexport interface CliIO {\n stdout: Write;\n stderr: Write;\n}\n\nexport interface DocmanaClient {\n runFlow(flowId: string, input: RunFlowInput): Promise<DocmanaExecutionResult>;\n}\n\nexport type DocmanaClientFactory = (config: DocmanaConfig) => DocmanaClient;\n\nexport interface DocmanaCliConfig {\n apiBaseUrl?: string;\n tokenEndpoint?: string;\n scope?: string;\n organisation?: string;\n clientId?: string;\n clientSecret?: string;\n}\n\ninterface CliPromptOptions {\n defaultValue?: string;\n secret?: boolean;\n}\n\nexport type CliPrompt = (label: string, options?: CliPromptOptions) => Promise<string>;\n\nexport interface CliDeps {\n cwd?: string;\n prompt?: CliPrompt;\n fetch?: typeof fetch;\n}\n\nclass CliUsageError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CliUsageError\";\n }\n}\n\nclass CliSilentError extends Error {\n readonly exitCode: number;\n constructor(exitCode = 1) {\n super();\n this.name = \"CliSilentError\";\n this.exitCode = exitCode;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\ninterface RunOptions {\n files?: string;\n clientId?: string;\n clientSecret?: string;\n apiUrl?: string;\n tokenUrl?: string;\n scope?: string;\n organisation?: string;\n config?: string;\n tokenCache?: string;\n json?: boolean;\n language?: string;\n}\n\ninterface ConfigInitOptions {\n config?: string;\n}\n\ninterface LoginOptions {\n clientId?: string;\n clientSecret?: string;\n tokenUrl?: string;\n scope?: string;\n config?: string;\n tokenCache?: string;\n}\n\nconst HELP = {\n root: \"Run Docmana document-analysis flows.\",\n flow: \"Manage and run Docmana flows.\",\n config: \"Manage Docmana CLI configuration.\",\n configInit: \"Create or update a local Docmana CLI config file.\",\n login: \"Acquire and cache a Docmana OAuth2 access token.\",\n run: \"Upload documents, run a Docmana flow, wait for completion, and print the result.\",\n};\n\nconst DEFAULT_CONFIG_FILE = \"docmana.config.json\";\nconst DEFAULT_TOKEN_CACHE_FILE = \"docmana.token.json\";\n\nexport async function runCli(\n argv: string[] = process.argv.slice(2),\n env: Env = process.env,\n io: CliIO = {\n stdout: (text) => process.stdout.write(text),\n stderr: (text) => process.stderr.write(text),\n },\n clientFactory: DocmanaClientFactory = (config) => new Docmana(config),\n deps: CliDeps = {},\n): Promise<number> {\n const program = buildProgram(env, io, clientFactory, deps);\n if (argv.length === 0) {\n io.stdout(program.helpInformation());\n return 0;\n }\n\n try {\n await program.parseAsync(argv, { from: \"user\" });\n return 0;\n } catch (err) {\n if (err instanceof CliSilentError) {\n return err.exitCode;\n }\n if (err instanceof CliUsageError) {\n io.stderr(`Error: ${err.message}\\n`);\n return 2;\n }\n if (err instanceof CommanderError) {\n return err.exitCode === 0 ? 0 : 2;\n }\n io.stderr(`${formatRuntimeError(err)}\\n`);\n return 1;\n }\n}\n\nfunction buildProgram(\n env: Env,\n io: CliIO,\n clientFactory: DocmanaClientFactory,\n deps: CliDeps,\n): Command {\n const program = new Command();\n program\n .name(\"docmana\")\n .description(HELP.root)\n .showHelpAfterError()\n .configureOutput({\n writeOut: io.stdout,\n writeErr: io.stderr,\n outputError: (str, write) => write(str),\n })\n .exitOverride();\n\n program\n .command(\"login\")\n .description(HELP.login)\n .option(\"--client-id <id>\", \"OAuth2 client id; defaults to DOCMANA_CLIENT_ID\")\n .option(\"--client-secret <secret>\", \"OAuth2 client secret; defaults to DOCMANA_CLIENT_SECRET\")\n .option(\"--token-url <url>\", \"OAuth2 token endpoint; defaults to DOCMANA_TOKEN_URL\")\n .option(\"--scope <scope>\", \"OAuth2 scope; defaults to DOCMANA_SCOPE\")\n .option(\"--config <path>\", `Config file path; defaults to ./${DEFAULT_CONFIG_FILE}`)\n .option(\"--token-cache <path>\", `Token cache path; defaults to ./${DEFAULT_TOKEN_CACHE_FILE}`)\n .action(async (options: LoginOptions) => {\n await loginCommand(options, env, io, deps);\n });\n\n const flow = program\n .command(\"flow\")\n .description(HELP.flow)\n .action(() => {\n io.stdout(flow.helpInformation());\n });\n\n flow\n .command(\"run\")\n .description(HELP.run)\n .argument(\"<flow-id>\", \"Docmana flow id\")\n .requiredOption(\"--files <csv>\", \"Comma-separated file paths to upload\")\n .option(\"--client-id <id>\", \"OAuth2 client id; defaults to DOCMANA_CLIENT_ID\")\n .option(\"--client-secret <secret>\", \"OAuth2 client secret; defaults to DOCMANA_CLIENT_SECRET\")\n .option(\"--api-url <url>\", \"Docmana API base URL; defaults to DOCMANA_API_URL\")\n .option(\"--token-url <url>\", \"OAuth2 token endpoint; defaults to DOCMANA_TOKEN_URL\")\n .option(\"--scope <scope>\", \"OAuth2 scope; defaults to DOCMANA_SCOPE\")\n .option(\"--organisation <id>\", \"Docmana organisation id; defaults to DOCMANA_ORGANISATION\")\n .option(\"--config <path>\", `Config file path; defaults to ./${DEFAULT_CONFIG_FILE}`)\n .option(\"--token-cache <path>\", `Token cache path; defaults to ./${DEFAULT_TOKEN_CACHE_FILE}`)\n .option(\"--json\", \"Print the raw JSON result\")\n .option(\"--language <lang>\", \"Translate output to specified language\")\n .action(async (flowId: string, options: RunOptions) => {\n await runFlowCommand(flowId, options, env, io, clientFactory, deps);\n });\n\n const config = program\n .command(\"config\")\n .description(HELP.config)\n .action(() => {\n io.stdout(config.helpInformation());\n });\n\n config\n .command(\"init\")\n .description(HELP.configInit)\n .option(\"--config <path>\", `Config file path; defaults to ./${DEFAULT_CONFIG_FILE}`)\n .action(async (options: ConfigInitOptions) => {\n await configInitCommand(options, io, deps);\n });\n\n return program;\n}\n\nasync function runFlowCommand(\n flowId: string,\n options: RunOptions,\n env: Env,\n io: CliIO,\n clientFactory: DocmanaClientFactory,\n deps: CliDeps,\n): Promise<void> {\n try {\n const files = parseFiles(options.files);\n const cliConfig = await loadCliConfig(options.config, getCwd(deps), Boolean(options.config));\n const clientId = firstNonEmpty(options.clientId, env.DOCMANA_CLIENT_ID, cliConfig.clientId);\n const clientSecret = firstNonEmpty(\n options.clientSecret,\n env.DOCMANA_CLIENT_SECRET,\n cliConfig.clientSecret,\n );\n const organisation = firstNonEmpty(\n options.organisation,\n env.DOCMANA_ORGANISATION,\n cliConfig.organisation,\n );\n const apiBaseUrl = firstNonEmpty(options.apiUrl, env.DOCMANA_API_URL, cliConfig.apiBaseUrl);\n const tokenEndpoint = firstNonEmpty(\n options.tokenUrl,\n env.DOCMANA_TOKEN_URL,\n cliConfig.tokenEndpoint,\n );\n const scope = firstNonEmpty(options.scope, env.DOCMANA_SCOPE, cliConfig.scope);\n\n if (!clientId)\n throw new CliUsageError(\"Missing client id. Use --client-id or DOCMANA_CLIENT_ID.\");\n if (!clientSecret) {\n throw new CliUsageError(\n \"Missing client secret. Use --client-secret or DOCMANA_CLIENT_SECRET.\",\n );\n }\n if (!organisation) {\n throw new CliUsageError(\"Missing organisation. Use --organisation or DOCMANA_ORGANISATION.\");\n }\n\n const client = clientFactory({\n clientId,\n clientSecret,\n apiBaseUrl,\n tokenEndpoint,\n scope,\n headers: { \"X-Selected-Organization\": organisation },\n tokenCache: createFileTokenCache(resolveTokenCachePath(options.tokenCache, getCwd(deps))),\n });\n const result = await client.runFlow(flowId, {\n files: files.map((path) => ({ path })),\n language: options.language,\n });\n\n if (options.json) {\n io.stdout(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n io.stdout(formatHumanResult(result));\n } catch (err) {\n if (options.json) {\n if (err instanceof DocmanaExecutionError && err.result) {\n io.stdout(`${JSON.stringify(err.result, null, 2)}\\n`);\n } else {\n const errorPayload: Record<string, unknown> = {\n error: err instanceof Error ? err.message : String(err),\n };\n if (err instanceof DocmanaError) {\n errorPayload.code = err.code;\n if (err.status !== undefined) errorPayload.status = err.status;\n if (err.requestId !== undefined) errorPayload.requestId = err.requestId;\n }\n io.stdout(`${JSON.stringify(errorPayload, null, 2)}\\n`);\n }\n throw new CliSilentError(err instanceof CliUsageError ? 2 : 1);\n }\n throw err;\n }\n}\n\nasync function loginCommand(\n options: LoginOptions,\n env: Env,\n io: CliIO,\n deps: CliDeps,\n): Promise<void> {\n const auth = await resolveAuthConfig(options, env, deps);\n const tokenCachePath = resolveTokenCachePath(options.tokenCache, getCwd(deps));\n const tokenCache = createFileTokenCache(tokenCachePath);\n const tokenManager = new TokenManager({\n clientId: auth.clientId,\n clientSecret: auth.clientSecret,\n tokenEndpoint: auth.tokenEndpoint,\n scope: auth.scope,\n fetchImpl: deps.fetch ?? fetch,\n tokenCache,\n });\n\n await tokenManager.getToken();\n const cached = await tokenCache.read();\n io.stdout(`Logged in. Token cached at ${tokenCachePath}\\n`);\n if (cached) io.stdout(formatTokenExpiry(cached.expiresAt));\n}\n\nfunction formatTokenExpiry(expiresAt: number): string {\n const expiresAtDate = new Date(expiresAt);\n return (\n [\n `Token expires at local time ${expiresAtDate.toLocaleString()}`,\n `Token expires at UTC ${expiresAtDate.toISOString()}`,\n ].join(\"\\n\") + \"\\n\"\n );\n}\n\nasync function resolveAuthConfig(\n options: LoginOptions,\n env: Env,\n deps: CliDeps,\n): Promise<{ clientId: string; clientSecret: string; tokenEndpoint: string; scope: string }> {\n const cliConfig = await loadCliConfig(options.config, getCwd(deps), Boolean(options.config));\n const clientId = firstNonEmpty(options.clientId, env.DOCMANA_CLIENT_ID, cliConfig.clientId);\n const clientSecret = firstNonEmpty(\n options.clientSecret,\n env.DOCMANA_CLIENT_SECRET,\n cliConfig.clientSecret,\n );\n const tokenEndpoint =\n firstNonEmpty(options.tokenUrl, env.DOCMANA_TOKEN_URL, cliConfig.tokenEndpoint) ??\n DEFAULTS.tokenEndpoint;\n const scope = firstNonEmpty(options.scope, env.DOCMANA_SCOPE, cliConfig.scope) ?? DEFAULTS.scope;\n\n if (!clientId)\n throw new CliUsageError(\"Missing client id. Use --client-id or DOCMANA_CLIENT_ID.\");\n if (!clientSecret) {\n throw new CliUsageError(\"Missing client secret. Use --client-secret or DOCMANA_CLIENT_SECRET.\");\n }\n\n return { clientId, clientSecret, tokenEndpoint, scope };\n}\n\nasync function configInitCommand(\n options: ConfigInitOptions,\n io: CliIO,\n deps: CliDeps,\n): Promise<void> {\n const cwd = getCwd(deps);\n const configPath = resolveConfigPath(options.config, cwd);\n const existing = await loadCliConfig(options.config, cwd, false);\n const defaultPrompt = deps.prompt ? undefined : createDefaultPrompt();\n const prompt = deps.prompt ?? defaultPrompt?.prompt;\n if (!prompt) throw new CliUsageError(\"Unable to initialize interactive prompt\");\n\n try {\n const config: DocmanaCliConfig = {\n apiBaseUrl: await prompt(\"API base URL\", {\n defaultValue: existing.apiBaseUrl ?? DEFAULTS.apiBaseUrl,\n }),\n tokenEndpoint: await prompt(\"OAuth2 token endpoint\", {\n defaultValue: existing.tokenEndpoint ?? DEFAULTS.tokenEndpoint,\n }),\n scope: await prompt(\"OAuth2 scope\", {\n defaultValue: existing.scope ?? DEFAULTS.scope,\n }),\n organisation: await prompt(\"Organisation\", {\n defaultValue: existing.organisation,\n }),\n clientId: await prompt(\"Client id\", {\n defaultValue: existing.clientId,\n }),\n clientSecret: await prompt(\"Client secret\", {\n defaultValue: existing.clientSecret,\n secret: true,\n }),\n };\n\n await mkdir(dirname(configPath), { recursive: true });\n await writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, \"utf8\");\n io.stdout(`Wrote ${configPath}\\n`);\n io.stdout(\n `Warning: ${DEFAULT_CONFIG_FILE} contains credentials and should stay ignored by Git.\\n`,\n );\n } finally {\n defaultPrompt?.close();\n }\n}\n\nasync function loadCliConfig(\n configPathOption: string | undefined,\n cwd: string,\n requireExisting: boolean,\n): Promise<DocmanaCliConfig> {\n const configPath = resolveConfigPath(configPathOption, cwd);\n if (!existsSync(configPath)) {\n if (requireExisting) throw new CliUsageError(`Config file not found: ${configPath}`);\n return {};\n }\n let raw: string;\n try {\n raw = await readFile(configPath, \"utf8\");\n } catch {\n throw new CliUsageError(`Unable to read config file: ${configPath}`);\n }\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Config must be a JSON object\");\n }\n return normalizeCliConfig(parsed as Record<string, unknown>);\n } catch {\n throw new CliUsageError(`Invalid config file: ${configPath}`);\n }\n}\n\nfunction normalizeCliConfig(config: Record<string, unknown>): DocmanaCliConfig {\n return {\n apiBaseUrl: stringValue(config.apiBaseUrl),\n tokenEndpoint: stringValue(config.tokenEndpoint),\n scope: stringValue(config.scope),\n organisation: stringValue(config.organisation),\n clientId: stringValue(config.clientId),\n clientSecret: stringValue(config.clientSecret),\n };\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction resolveConfigPath(configPathOption: string | undefined, cwd: string): string {\n return resolve(cwd, configPathOption ?? DEFAULT_CONFIG_FILE);\n}\n\nfunction resolveTokenCachePath(tokenCachePathOption: string | undefined, cwd: string): string {\n return resolve(cwd, tokenCachePathOption ?? DEFAULT_TOKEN_CACHE_FILE);\n}\n\nfunction getCwd(deps: CliDeps): string {\n return deps.cwd ?? process.cwd();\n}\n\nfunction createFileTokenCache(path: string): TokenCache {\n return {\n async read() {\n if (!existsSync(path)) return null;\n try {\n const parsed = JSON.parse(await readFile(path, \"utf8\")) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return null;\n const value = parsed as Record<string, unknown>;\n if (\n typeof value.accessToken !== \"string\" ||\n typeof value.expiresAt !== \"number\" ||\n typeof value.clientId !== \"string\" ||\n typeof value.tokenEndpoint !== \"string\" ||\n typeof value.scope !== \"string\"\n ) {\n return null;\n }\n return {\n accessToken: value.accessToken,\n expiresAt: value.expiresAt,\n clientId: value.clientId,\n tokenEndpoint: value.tokenEndpoint,\n scope: value.scope,\n };\n } catch {\n return null;\n }\n },\n async write(entry) {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(entry, null, 2)}\\n`, \"utf8\");\n },\n async clear() {\n await rm(path, { force: true });\n },\n };\n}\n\nfunction createDefaultPrompt(): { prompt: CliPrompt; close: () => void } {\n if (!process.stdin.isTTY) {\n let index = 0;\n const linesPromise = readStdinLines();\n return {\n prompt: async (label, options = {}) => {\n process.stdout.write(formatPrompt(label, options));\n const lines = await linesPromise;\n const answer = lines[index++] ?? \"\";\n return firstNonEmpty(answer, options.defaultValue) ?? \"\";\n },\n close: () => undefined,\n };\n }\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return {\n prompt: async (label, options = {}) => {\n const answer = await rl.question(formatPrompt(label, options));\n return firstNonEmpty(answer, options.defaultValue) ?? \"\";\n },\n close: () => rl.close(),\n };\n}\n\nfunction formatPrompt(label: string, options: CliPromptOptions): string {\n const defaultHint =\n options.defaultValue && !options.secret\n ? ` [${options.defaultValue}]`\n : options.defaultValue && options.secret\n ? \" [current value hidden]\"\n : \"\";\n return `${label}${defaultHint}: `;\n}\n\nasync function readStdinLines(): Promise<string[]> {\n let input = \"\";\n for await (const chunk of process.stdin) input += String(chunk);\n return input.split(/\\r?\\n/);\n}\n\nfunction parseFiles(filesCsv: string | undefined): string[] {\n const files =\n filesCsv\n ?.split(\",\")\n .map((file) => file.trim())\n .filter(Boolean) ?? [];\n if (files.length === 0) throw new CliUsageError(\"Missing files. Use --files <path[,path]>.\");\n return files;\n}\n\nfunction firstNonEmpty(...values: Array<string | undefined>): string | undefined {\n return values.map((value) => value?.trim()).find(Boolean);\n}\n\nfunction formatHumanResult(result: DocmanaExecutionResult): string {\n const lines = [\"Docmana flow completed\", `Status: ${String(result.status ?? \"Unknown\")}`];\n const executionId = result.executionId;\n if (executionId) lines.push(`Execution id: ${String(executionId)}`);\n if (result.documents && result.documents.mappings) {\n lines.push(`Results: ${result.documents.mappings.length}`);\n }\n if (result.errors && result.errors.length > 0) {\n lines.push(`Errors: ${result.errors.length}`);\n }\n\n const previewData: Record<string, unknown> = {};\n if (result.documents && result.documents.mappings) {\n for (const mapping of result.documents.mappings.slice(0, 3)) {\n const docKey = mapping.reference;\n previewData[mapping.name] = result.documents[docKey];\n }\n }\n\n const preview = formatResultsPreview(previewData);\n if (preview) lines.push(\"\", \"Result preview:\", preview);\n lines.push(\"\", \"Use --json to print the complete result payload.\");\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction formatResultsPreview(results: unknown): string | undefined {\n if (!results) return undefined;\n const preview = JSON.stringify(results, null, 2);\n if (!preview) return undefined;\n return preview.length > 2_000 ? `${preview.slice(0, 2_000)}\\n...` : preview;\n}\n\nfunction formatRuntimeError(err: unknown): string {\n return formatHumanError(err);\n}\n\nfunction formatHumanError(err: unknown): string {\n if (err instanceof DocmanaExecutionError) {\n const lines = [`Error: ${err.message}`];\n\n if (err.errors && err.errors.length > 0) {\n lines.push(\"Global errors:\");\n for (const e of err.errors) {\n lines.push(` - ${formatSingleError(e)}`);\n }\n }\n\n const result = err.result;\n if (result) {\n if (result.documents && result.documents.mappings && result.documents.mappings.length > 0) {\n lines.push(\"Document execution results:\");\n for (const mapping of result.documents.mappings) {\n const docKey = mapping.reference;\n const docName = mapping.name;\n const docResult = result.documents[docKey] as DocmanaDocumentResult | undefined;\n\n if (docResult) {\n const status = docResult.status || \"Unknown\";\n\n const nodes: DocmanaNodeResult[] = [];\n if (docResult.classifications) nodes.push(...Object.values(docResult.classifications));\n if (docResult.metadataExtraction) nodes.push(docResult.metadataExtraction);\n if (docResult.extractions) nodes.push(...Object.values(docResult.extractions));\n if (docResult.validations) nodes.push(...Object.values(docResult.validations));\n\n const hasNodeFailures = nodes.some(\n (n) => n.status === \"Failed\" || (n.errors && n.errors.length > 0),\n );\n\n if (docResult.status === \"Failed\" || hasNodeFailures) {\n lines.push(` - Document: ${docName} (Status: ${status})`);\n if (docResult.classifications) {\n for (const [nodeName, node] of Object.entries(docResult.classifications)) {\n if (node.errors && node.errors.length > 0) {\n lines.push(` Classification: ${nodeName} (Status: ${node.status})`);\n for (const nodeErr of node.errors) {\n lines.push(` - ${nodeErr}`);\n }\n }\n }\n }\n if (\n docResult.metadataExtraction?.errors &&\n docResult.metadataExtraction.errors.length > 0\n ) {\n lines.push(\n ` MetadataExtraction: (Status: ${docResult.metadataExtraction.status})`,\n );\n for (const nodeErr of docResult.metadataExtraction.errors) {\n lines.push(` - ${nodeErr}`);\n }\n }\n if (docResult.extractions) {\n for (const [nodeName, node] of Object.entries(docResult.extractions)) {\n if (node.status === \"Failed\" || (node.errors && node.errors.length > 0)) {\n lines.push(` Extraction: ${nodeName} (Status: ${node.status})`);\n if (node.errors) {\n for (const nodeErr of node.errors) {\n lines.push(` - ${nodeErr}`);\n }\n }\n }\n }\n }\n if (docResult.validations) {\n for (const [nodeName, node] of Object.entries(docResult.validations)) {\n if (node.status === \"Failed\" || (node.errors && node.errors.length > 0)) {\n lines.push(` Validation: ${nodeName} (Status: ${node.status})`);\n if (node.errors) {\n for (const nodeErr of node.errors) {\n lines.push(` - ${nodeErr}`);\n }\n }\n }\n }\n }\n } else {\n lines.push(` - Document: ${docName} (Status: ${status})`);\n }\n } else {\n lines.push(` - Document: ${docName} (Status: Unknown)`);\n }\n }\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n if (err instanceof DocmanaError) {\n return `Error: ${err.message} (Code: ${err.code})`;\n }\n\n if (err instanceof Error) {\n return `Error: ${err.message}`;\n }\n\n return `Error: ${String(err)}`;\n}\n\nfunction formatSingleError(e: unknown): string {\n if (typeof e === \"string\") return e;\n if (e && typeof e === \"object\") {\n const obj = e as Record<string, unknown>;\n if (typeof obj.msg === \"string\") return obj.msg;\n if (typeof obj.message === \"string\") return obj.message;\n if (typeof obj.error === \"string\") return obj.error;\n try {\n return JSON.stringify(e);\n } catch {\n return String(e);\n }\n }\n return String(e);\n}\n\nfunction isDirectRun(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n try {\n return realpathSync(resolve(entry)) === realpathSync(fileURLToPath(import.meta.url));\n } catch {\n return false;\n }\n}\n\nif (isDirectRun()) {\n runCli().then((code) => {\n process.exitCode = code;\n });\n}\n","import type { DocmanaExecutionResult } from \"./models/docmana-execution-result.model.js\";\n\nexport class DocmanaError extends Error {\n readonly status?: number;\n readonly requestId?: string;\n readonly code: string;\n constructor(message: string, opts: { status?: number; requestId?: string; code?: string } = {}) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.requestId = opts.requestId;\n this.code = opts.code ?? \"docmana_error\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class DocmanaAuthError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"auth_error\" });\n }\n}\n\nexport class DocmanaPermissionError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"permission_error\" });\n }\n}\n\nexport class DocmanaNotFoundError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"not_found\" });\n }\n}\n\nexport class DocmanaRequestError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"bad_request\" });\n }\n}\n\nexport class DocmanaExecutionError extends DocmanaError {\n readonly errors: unknown[];\n readonly result?: DocmanaExecutionResult;\n constructor(message: string, errors: unknown[] = [], result?: DocmanaExecutionResult) {\n super(message, { code: \"execution_failed\" });\n this.errors = errors;\n this.result = result;\n }\n}\n\nexport class DocmanaTimeoutError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"timeout\" });\n }\n}\n\nexport class DocmanaAbortError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"aborted\" });\n }\n}\n\nexport function errorFromResponse(\n status: number,\n message: string,\n requestId?: string,\n): DocmanaError {\n const opts = { status, requestId };\n switch (status) {\n case 400:\n return new DocmanaRequestError(message, opts);\n case 401:\n return new DocmanaAuthError(message, opts);\n case 403:\n return new DocmanaPermissionError(message, opts);\n case 404:\n return new DocmanaNotFoundError(message, opts);\n default:\n return new DocmanaError(message, opts);\n }\n}\n","import { DocmanaAuthError } from \"../errors.js\";\nimport type { TokenCache, TokenCacheEntry } from \"../types.js\";\n\nconst SAFETY_MARGIN_MS = 60_000;\n\nexport interface TokenManagerOptions {\n clientId: string;\n clientSecret: string;\n tokenEndpoint: string;\n scope: string;\n fetchImpl: typeof fetch;\n tokenCache?: TokenCache;\n}\n\nexport class TokenManager {\n private token: string | null = null;\n private expiresAt = 0;\n private inflight: Promise<string> | null = null;\n\n constructor(private readonly opts: TokenManagerOptions) {}\n\n invalidate(): void {\n this.token = null;\n this.expiresAt = 0;\n void this.opts.tokenCache?.clear().catch(() => undefined);\n }\n\n async getToken(): Promise<string> {\n if (this.token && Date.now() < this.expiresAt) return this.token;\n const cached = await this.readCachedToken();\n if (cached) return cached;\n if (this.inflight) return this.inflight;\n this.inflight = this.acquire().finally(() => {\n this.inflight = null;\n });\n return this.inflight;\n }\n\n private async acquire(): Promise<string> {\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.opts.clientId,\n client_secret: this.opts.clientSecret,\n scope: this.opts.scope,\n });\n const res = await this.opts.fetchImpl(this.opts.tokenEndpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n if (!res.ok) {\n // Do NOT include the response body verbatim — avoid leaking secrets/echoes.\n throw new DocmanaAuthError(\"Failed to acquire Docmana access token\", { status: res.status });\n }\n const json = (await res.json()) as Partial<{ access_token: string; expires_in: number }>;\n if (\n typeof json.access_token !== \"string\" ||\n json.access_token.length === 0 ||\n typeof json.expires_in !== \"number\" ||\n !Number.isFinite(json.expires_in)\n ) {\n throw new DocmanaAuthError(\"Malformed token response from Docmana CIAM\", {\n status: res.status,\n });\n }\n this.token = json.access_token;\n this.expiresAt = Date.now() + json.expires_in * 1000 - SAFETY_MARGIN_MS;\n await this.writeCachedToken().catch(() => undefined);\n return this.token;\n }\n\n private async readCachedToken(): Promise<string | null> {\n if (!this.opts.tokenCache) return null;\n let entry: TokenCacheEntry | null;\n try {\n entry = await this.opts.tokenCache.read();\n } catch {\n return null;\n }\n if (!entry) return null;\n if (\n entry.clientId !== this.opts.clientId ||\n entry.tokenEndpoint !== this.opts.tokenEndpoint ||\n entry.scope !== this.opts.scope ||\n Date.now() >= entry.expiresAt\n ) {\n await this.opts.tokenCache.clear().catch(() => undefined);\n return null;\n }\n this.token = entry.accessToken;\n this.expiresAt = entry.expiresAt;\n return this.token;\n }\n\n private async writeCachedToken(): Promise<void> {\n if (!this.opts.tokenCache || !this.token) return;\n await this.opts.tokenCache.write({\n accessToken: this.token,\n expiresAt: this.expiresAt,\n clientId: this.opts.clientId,\n tokenEndpoint: this.opts.tokenEndpoint,\n scope: this.opts.scope,\n });\n }\n}\n","import type { DocmanaConfig } from \"./types.js\";\nimport type { TokenCache } from \"./types.js\";\n\nexport const DEFAULTS = {\n apiBaseUrl: \"https://api.docmana.ai\",\n tokenEndpoint:\n \"https://4fe70f5b-e013-4f65-9fa7-3109a33beba5.ciamlogin.com/4fe70f5b-e013-4f65-9fa7-3109a33beba5/oauth2/v2.0/token\",\n scope: \"api://d781e6ba-cc08-4618-8099-ad968abd2b9e/.default\",\n timeoutMs: 300_000,\n pollIntervalMs: 2_000,\n} as const;\n\nexport interface ResolvedConfig {\n clientId: string;\n clientSecret: string;\n apiBaseUrl: string;\n tokenEndpoint: string;\n scope: string;\n timeoutMs: number;\n pollIntervalMs: number;\n fetchImpl: typeof fetch;\n headers: Record<string, string>;\n tokenCache?: TokenCache;\n}\n\nexport function resolveConfig(config: DocmanaConfig): ResolvedConfig {\n if (!config.clientId) throw new Error(\"DocmanaConfig.clientId is required\");\n if (!config.clientSecret) throw new Error(\"DocmanaConfig.clientSecret is required\");\n const apiBaseUrl = (config.apiBaseUrl ?? DEFAULTS.apiBaseUrl).replace(/\\/+$/, \"\");\n return {\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n apiBaseUrl,\n tokenEndpoint: config.tokenEndpoint ?? DEFAULTS.tokenEndpoint,\n scope: config.scope ?? DEFAULTS.scope,\n timeoutMs: config.timeoutMs ?? DEFAULTS.timeoutMs,\n pollIntervalMs: config.pollIntervalMs ?? DEFAULTS.pollIntervalMs,\n fetchImpl: config.fetch ?? fetch,\n headers: config.headers ?? {},\n tokenCache: config.tokenCache,\n };\n}\n","import type { TokenManager } from \"../auth/token-manager.js\";\nimport { DocmanaError, DocmanaAbortError, errorFromResponse } from \"../errors.js\";\n\nexport interface HttpClientOptions {\n apiBaseUrl: string;\n fetchImpl: typeof fetch;\n tokenManager: TokenManager;\n headers?: Record<string, string>;\n}\n\ntype FetchBody = NonNullable<Parameters<typeof fetch>[1]>[\"body\"];\n\nexport interface RequestOptions {\n query?: Record<string, string>;\n body?: FetchBody;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport class HttpClient {\n constructor(private readonly opts: HttpClientOptions) {}\n\n async requestJson<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const res = await this.requestRaw(method, path, options);\n const text = await res.text();\n if (!text) return {} as T;\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new DocmanaError(\"Invalid JSON response from Docmana\", { status: res.status });\n }\n }\n\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n let res = await this.send(method, path, options);\n if (res.status === 401) {\n this.opts.tokenManager.invalidate();\n res = await this.send(method, path, options);\n }\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const message = await this.extractMessage(res);\n throw errorFromResponse(res.status, message, requestId);\n }\n return res;\n }\n\n private async send(method: string, path: string, options: RequestOptions): Promise<Response> {\n const token = await this.opts.tokenManager.getToken();\n const url = new URL(this.opts.apiBaseUrl + path);\n for (const [k, v] of Object.entries(options.query ?? {})) url.searchParams.set(k, v);\n const headers: Record<string, string> = {\n ...(this.opts.headers ?? {}),\n authorization: `Bearer ${token}`,\n ...(options.headers ?? {}),\n };\n try {\n return await this.opts.fetchImpl(url, {\n method,\n headers,\n body: options.body,\n signal: options.signal,\n });\n } catch (err) {\n if (options.signal?.aborted || (err instanceof Error && err.name === \"AbortError\")) {\n throw new DocmanaAbortError(\"Request aborted\");\n }\n throw err;\n }\n }\n\n private async extractMessage(res: Response): Promise<string> {\n try {\n const data = (await res.clone().json()) as { message?: string; error?: string };\n return data.message ?? data.error ?? res.statusText ?? `HTTP ${res.status}`;\n } catch {\n return res.statusText ?? `HTTP ${res.status}`;\n }\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport type { FileInput, RunFlowInput } from \"../types.js\";\n\nexport interface ResolvedPart {\n data: Blob;\n filename: string;\n contentType: string;\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".tif\": \"image/tiff\",\n \".tiff\": \"image/tiff\",\n \".txt\": \"text/plain\",\n \".json\": \"application/json\",\n};\n\nfunction contentTypeFor(name: string): string {\n const dot = name.lastIndexOf(\".\");\n if (dot < 0) return \"application/octet-stream\";\n const ext = name.slice(dot).toLowerCase();\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction isReadable(x: unknown): x is Readable {\n return typeof x === \"object\" && x !== null && typeof (x as Readable).pipe === \"function\";\n}\n\nfunction isPathInput(x: unknown): x is { path: string } {\n return typeof x === \"object\" && x !== null && typeof (x as { path?: unknown }).path === \"string\";\n}\n\nasync function streamToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) chunks.push(Buffer.from(chunk));\n return Buffer.concat(chunks);\n}\n\nasync function resolveOne(input: FileInput, fallbackName: string): Promise<ResolvedPart> {\n if (typeof input === \"string\" || isPathInput(input)) {\n const path = typeof input === \"string\" ? input : input.path;\n const data = await readFile(path);\n const filename = basename(path);\n return { data: new Blob([data]), filename, contentType: contentTypeFor(filename) };\n }\n if (input instanceof Uint8Array) {\n return {\n data: new Blob([input]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n if (isReadable(input)) {\n const buf = await streamToBuffer(input);\n return {\n data: new Blob([buf]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n throw new Error(\"Unsupported file input type\");\n}\n\nexport async function resolveInputs(input: RunFlowInput): Promise<ResolvedPart[]> {\n const list: FileInput[] = input.files ?? (input.file !== undefined ? [input.file] : []);\n if (list.length === 0) throw new Error(\"runFlow requires `file` or `files`\");\n const fallback = input.fileName ?? \"upload.bin\";\n return Promise.all(list.map((item) => resolveOne(item, fallback)));\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ResolvedPart } from \"../files/resolve-input.js\";\n\nexport async function uploadFiles(\n http: HttpClient,\n parts: ResolvedPart[],\n signal?: AbortSignal,\n): Promise<string[]> {\n // The /upload endpoint accepts multiple files in a SINGLE call and returns one\n // folder UUID holding all of them. Uploading every file in its own call would\n // make Docmana treat each file as a separate document, which breaks flows that\n // process several documents together (the graph builder reuses the same node per\n // document -> \"Node already present\"). So we send every part in one request.\n const form = new FormData();\n for (const part of parts) {\n form.append(\"files\", new File([part.data], part.filename, { type: part.contentType }));\n }\n const res = await http.requestJson<{ id: string }>(\"POST\", \"/upload\", { body: form, signal });\n return [res.id];\n}\n","import type { HttpClient } from \"../http/http-client.js\";\n\nexport async function runFlow(\n http: HttpClient,\n flowId: string,\n uuidFiles: string[],\n signal?: AbortSignal,\n once = false,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const res = await http.requestJson<{ execution_result_id: string }>(\"POST\", path, {\n query: { async_mode: \"true\" },\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ uuid_files: uuidFiles }),\n signal,\n });\n return res.execution_result_id;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ExecutionStatus } from \"../types.js\";\n\nexport async function getStatus(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<{ status: ExecutionStatus | string }> {\n return http.requestJson(\"GET\", `/flows/execution-status/${executionResultId}`, { signal });\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\n\nexport async function getResult(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<DocmanaApiExecutionResult> {\n return http.requestJson(\"GET\", `/flows/execution-result/${executionResultId}`, { signal });\n}\n","import { DocmanaTimeoutError, DocmanaAbortError } from \"../errors.js\";\n\nconst TERMINAL = new Set([\"Completed\", \"Failed\"]);\n\nexport interface PollOptions {\n check: () => Promise<string>;\n intervalMs: number;\n timeoutMs: number;\n sleep?: (ms: number) => Promise<void>;\n elapsed?: () => number;\n signal?: AbortSignal;\n}\n\nconst defaultSleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\nexport async function pollUntilTerminal(opts: PollOptions): Promise<string> {\n const sleep = opts.sleep ?? defaultSleep;\n const start = Date.now();\n const elapsed = opts.elapsed ?? (() => Date.now() - start);\n for (;;) {\n if (opts.signal?.aborted) throw new DocmanaAbortError(\"Polling aborted\");\n const status = await opts.check();\n if (TERMINAL.has(status)) return status;\n if (elapsed() >= opts.timeoutMs) {\n throw new DocmanaTimeoutError(`Execution did not finish within ${opts.timeoutMs}ms`);\n }\n await sleep(opts.intervalMs);\n }\n}\n","import { DocmanaError } from \"../errors.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\nimport type { DocmanaApiNodeResult } from \"../models/docmana-api-node-result.model.js\";\nimport type { DocmanaExecutionResult } from \"../models/docmana-execution-result.model.js\";\nimport type { DocmanaDocumentResult } from \"../models/docmana-document-result.model.js\";\nimport type { DocmanaNodeResult } from \"../models/docmana-node-result.model.js\";\nimport type { DocmanaScoreNodeResult } from \"../models/docmana-score-node-result.model.js\";\nimport type { DocmanaCrossValidationResult } from \"../models/docmana-cross-validation-result.model.js\";\nimport type { DocmanaConclusionResult } from \"../models/docmana-conclusion-result.model.js\";\n\nfunction extractNodeFields(\n rawNode: DocmanaApiNodeResult,\n targetLanguage?: string,\n): DocmanaNodeResult {\n const metadataFields = new Set([\n \"node_id\",\n \"node_name\",\n \"node_type\",\n \"feature_name\",\n \"running_time\",\n \"status\",\n \"score\",\n \"feedback\",\n \"translations\",\n \"tokens\",\n \"input_tokens\",\n \"output_tokens\",\n \"errors\",\n \"mana\",\n \"model\",\n \"tool_calls\",\n \"prompt_id\",\n \"prompt\",\n \"prompt_name\",\n \"label\",\n \"scoreDescription\",\n \"score_description\",\n \"result\",\n \"documentType\",\n ]);\n\n let sourceObj: Record<string, unknown> = rawNode;\n if (targetLanguage) {\n const translations = rawNode.translations;\n if (!translations || !translations[targetLanguage]) {\n throw new DocmanaError(\n `Translation for language '${targetLanguage}' is missing on node '${rawNode.node_name || rawNode.node_id}'`,\n { code: \"translation_missing\", status: 400 },\n );\n }\n sourceObj = translations[targetLanguage] as Record<string, unknown>;\n }\n\n const dynamicFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(sourceObj)) {\n if (!metadataFields.has(key)) {\n dynamicFields[key] = value;\n }\n }\n\n const sdkNode: DocmanaScoreNodeResult = {\n status: rawNode.status || \"Unknown\",\n };\n\n if (rawNode.errors && rawNode.errors.length > 0) {\n sdkNode.errors = rawNode.errors;\n }\n\n const nodeType = rawNode.node_type || \"\";\n const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion)$/i.test(nodeType);\n if (isScoreNode) {\n if (rawNode.score !== undefined && rawNode.score !== null) {\n sdkNode.score = rawNode.score;\n }\n if (rawNode.feedback !== undefined && rawNode.feedback !== null) {\n sdkNode.feedback = rawNode.feedback;\n }\n }\n\n if (Object.keys(dynamicFields).length > 0) {\n sdkNode.data = dynamicFields;\n }\n\n return sdkNode;\n}\n\nexport function mapExecutionResult(\n raw: DocmanaApiExecutionResult,\n targetLanguage?: string,\n): DocmanaExecutionResult {\n const sdkResult: DocmanaExecutionResult = {\n status: raw.status || \"Unknown\",\n executionId: String(raw.execution_id || raw.executionResultId || raw.execution_result_id || \"\"),\n documents: {\n mappings: [],\n },\n };\n\n if (raw.errors && raw.errors.length > 0) {\n sdkResult.errors = raw.errors;\n }\n\n const results = raw.results || [];\n\n for (const item of results) {\n const isDocSpecific = !!item.document;\n\n if (isDocSpecific && item.document) {\n const docReq = item.document;\n const docKey = docReq.doc_key || \"unknown_doc\";\n const docName = docReq.name || \"\";\n\n sdkResult.documents.mappings.push({\n name: docName,\n reference: docKey,\n });\n\n const docResult: DocmanaDocumentResult = {\n status: item.status || docReq.status || \"Unknown\",\n extractions: {},\n validations: {},\n };\n\n const nodeResults = item.node_results || [];\n\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^Classification$/i.test(nodeType)) {\n const mappedNode = extractNodeFields(node, targetLanguage);\n if (!docResult.classifications) {\n docResult.classifications = {};\n }\n docResult.classifications[nodeName] = mappedNode;\n } else if (/^MetadataExtraction$/i.test(nodeType)) {\n docResult.metadataExtraction = extractNodeFields(node, targetLanguage);\n } else if (/^Extraction$/i.test(nodeType)) {\n if (docResult.extractions) {\n docResult.extractions[nodeName] = extractNodeFields(node, targetLanguage);\n }\n } else if (/^Validation$/i.test(nodeType)) {\n if (docResult.validations) {\n docResult.validations[nodeName] = extractNodeFields(node, targetLanguage);\n }\n }\n }\n\n if (docResult.extractions && Object.keys(docResult.extractions).length === 0) {\n delete docResult.extractions;\n }\n if (docResult.validations && Object.keys(docResult.validations).length === 0) {\n delete docResult.validations;\n }\n\n sdkResult.documents[docKey] = docResult;\n } else {\n const nodeResults = item.node_results || [];\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^CrossValidation$/i.test(nodeType)) {\n if (!sdkResult.crossValidations) {\n sdkResult.crossValidations = {};\n }\n sdkResult.crossValidations[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaCrossValidationResult;\n } else if (/^(Conclusion|Finish)$/i.test(nodeType)) {\n if (!sdkResult.conclusions) {\n sdkResult.conclusions = {};\n }\n sdkResult.conclusions[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaConclusionResult;\n }\n }\n }\n }\n\n return sdkResult;\n}\n","import { resolveConfig } from \"./config.js\";\nimport type { ResolvedConfig } from \"./config.js\";\nimport type {\n DocmanaConfig,\n DocmanaExecutionResult,\n ExecutionStatus,\n RunFlowInput,\n} from \"./types.js\";\nimport { TokenManager } from \"./auth/token-manager.js\";\nimport { HttpClient } from \"./http/http-client.js\";\nimport { resolveInputs } from \"./files/resolve-input.js\";\nimport { uploadFiles } from \"./api/upload.js\";\nimport { runFlow as runFlowApi } from \"./api/run-flow.js\";\nimport { getStatus as getStatusApi } from \"./api/execution-status.js\";\nimport { getResult as getResultApi } from \"./api/execution-result.js\";\nimport { pollUntilTerminal } from \"./polling/poll.js\";\nimport { DocmanaExecutionError } from \"./errors.js\";\nimport { mapExecutionResult } from \"./mappers/index.js\";\n\nexport class Docmana {\n private readonly config: ResolvedConfig;\n private readonly http: HttpClient;\n\n constructor(config: DocmanaConfig) {\n this.config = resolveConfig(config);\n const tokenManager = new TokenManager({\n clientId: this.config.clientId,\n clientSecret: this.config.clientSecret,\n tokenEndpoint: this.config.tokenEndpoint,\n scope: this.config.scope,\n fetchImpl: this.config.fetchImpl,\n tokenCache: this.config.tokenCache,\n });\n this.http = new HttpClient({\n apiBaseUrl: this.config.apiBaseUrl,\n fetchImpl: this.config.fetchImpl,\n tokenManager,\n headers: this.config.headers,\n });\n }\n\n async runFlowAsync(\n flowId: string,\n input: RunFlowInput,\n ): Promise<{ executionResultId: string; fileIds: string[] }> {\n const parts = await resolveInputs(input);\n const fileIds = await uploadFiles(this.http, parts, input.signal);\n const executionResultId = await runFlowApi(\n this.http,\n flowId,\n fileIds,\n input.signal,\n input.once ?? false,\n );\n return { executionResultId, fileIds };\n }\n\n async getStatus(\n executionResultId: string,\n signal?: AbortSignal,\n ): Promise<{ status: ExecutionStatus | string }> {\n return getStatusApi(this.http, executionResultId, signal);\n }\n\n async getResult(\n executionResultId: string,\n signal?: AbortSignal,\n language?: string,\n ): Promise<DocmanaExecutionResult> {\n const rawResult = await getResultApi(this.http, executionResultId, signal);\n return mapExecutionResult(rawResult, language);\n }\n\n async runFlow(flowId: string, input: RunFlowInput): Promise<DocmanaExecutionResult> {\n const { executionResultId } = await this.runFlowAsync(flowId, input);\n await pollUntilTerminal({\n check: async () => (await this.getStatus(executionResultId, input.signal)).status,\n intervalMs: input.pollIntervalMs ?? this.config.pollIntervalMs,\n timeoutMs: input.timeoutMs ?? this.config.timeoutMs,\n signal: input.signal,\n });\n const result = await this.getResult(executionResultId, input.signal, input.language);\n if (result.status === \"Failed\") {\n throw new DocmanaExecutionError(\n `Flow ${flowId} execution failed`,\n result.errors ?? [],\n result,\n );\n }\n return result;\n }\n}\n"],"mappings":"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","names":["readFile","readFile"]}
|
package/dist/index.js
CHANGED
|
@@ -332,14 +332,12 @@ async function resolveInputs(input) {
|
|
|
332
332
|
|
|
333
333
|
// src/api/upload.ts
|
|
334
334
|
async function uploadFiles(http, parts, signal) {
|
|
335
|
-
const
|
|
335
|
+
const form = new FormData();
|
|
336
336
|
for (const part of parts) {
|
|
337
|
-
const form = new FormData();
|
|
338
337
|
form.append("files", new File([part.data], part.filename, { type: part.contentType }));
|
|
339
|
-
const res = await http.requestJson("POST", "/upload", { body: form, signal });
|
|
340
|
-
ids.push(res.id);
|
|
341
338
|
}
|
|
342
|
-
|
|
339
|
+
const res = await http.requestJson("POST", "/upload", { body: form, signal });
|
|
340
|
+
return [res.id];
|
|
343
341
|
}
|
|
344
342
|
|
|
345
343
|
// src/api/run-flow.ts
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/errors.ts","../src/auth/token-manager.ts","../src/http/http-client.ts","../src/files/resolve-input.ts","../src/api/upload.ts","../src/api/run-flow.ts","../src/api/execution-status.ts","../src/api/execution-result.ts","../src/polling/poll.ts","../src/mappers/mapper.ts","../src/client.ts"],"sourcesContent":["export { Docmana } from \"./client.js\";\nexport {\n DocmanaError,\n DocmanaAuthError,\n DocmanaRequestError,\n DocmanaPermissionError,\n DocmanaNotFoundError,\n DocmanaExecutionError,\n DocmanaTimeoutError,\n DocmanaAbortError,\n} from \"./errors.js\";\nexport type {\n DocmanaConfig,\n RunFlowInput,\n FileInput,\n DocmanaExecutionResult,\n ExecutionStatus,\n DocmanaDocumentMapping,\n DocmanaDocumentResult,\n DocmanaNodeResult,\n DocmanaScoreNodeResult,\n DocmanaCrossValidationResult,\n DocmanaConclusionResult,\n DocmanaClassificationResult,\n DocmanaMetadataExtractionResult,\n DocmanaExtractionResult,\n DocmanaValidationResult,\n} from \"./types.js\";\nexport type {\n ExecutionProgress,\n VirtualDocument,\n PhysicalDocument,\n DocumentContent,\n FlowNodeType,\n FlowConfigs,\n FlowNode,\n FlowEdge,\n Flow,\n NodeTranslationResult,\n DocmanaApiExecutionResult,\n DocmanaApiNodeResult,\n DocmanaApiDocumentExecutionResult,\n DocmanaApiDocumentRequest,\n} from \"./models/index.js\";\n","import type { DocmanaConfig } from \"./types.js\";\nimport type { TokenCache } from \"./types.js\";\n\nexport const DEFAULTS = {\n apiBaseUrl: \"https://api.docmana.ai\",\n tokenEndpoint:\n \"https://4fe70f5b-e013-4f65-9fa7-3109a33beba5.ciamlogin.com/4fe70f5b-e013-4f65-9fa7-3109a33beba5/oauth2/v2.0/token\",\n scope: \"api://d781e6ba-cc08-4618-8099-ad968abd2b9e/.default\",\n timeoutMs: 300_000,\n pollIntervalMs: 2_000,\n} as const;\n\nexport interface ResolvedConfig {\n clientId: string;\n clientSecret: string;\n apiBaseUrl: string;\n tokenEndpoint: string;\n scope: string;\n timeoutMs: number;\n pollIntervalMs: number;\n fetchImpl: typeof fetch;\n headers: Record<string, string>;\n tokenCache?: TokenCache;\n}\n\nexport function resolveConfig(config: DocmanaConfig): ResolvedConfig {\n if (!config.clientId) throw new Error(\"DocmanaConfig.clientId is required\");\n if (!config.clientSecret) throw new Error(\"DocmanaConfig.clientSecret is required\");\n const apiBaseUrl = (config.apiBaseUrl ?? DEFAULTS.apiBaseUrl).replace(/\\/+$/, \"\");\n return {\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n apiBaseUrl,\n tokenEndpoint: config.tokenEndpoint ?? DEFAULTS.tokenEndpoint,\n scope: config.scope ?? DEFAULTS.scope,\n timeoutMs: config.timeoutMs ?? DEFAULTS.timeoutMs,\n pollIntervalMs: config.pollIntervalMs ?? DEFAULTS.pollIntervalMs,\n fetchImpl: config.fetch ?? fetch,\n headers: config.headers ?? {},\n tokenCache: config.tokenCache,\n };\n}\n","import type { DocmanaExecutionResult } from \"./models/docmana-execution-result.model.js\";\n\nexport class DocmanaError extends Error {\n readonly status?: number;\n readonly requestId?: string;\n readonly code: string;\n constructor(message: string, opts: { status?: number; requestId?: string; code?: string } = {}) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.requestId = opts.requestId;\n this.code = opts.code ?? \"docmana_error\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class DocmanaAuthError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"auth_error\" });\n }\n}\n\nexport class DocmanaPermissionError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"permission_error\" });\n }\n}\n\nexport class DocmanaNotFoundError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"not_found\" });\n }\n}\n\nexport class DocmanaRequestError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"bad_request\" });\n }\n}\n\nexport class DocmanaExecutionError extends DocmanaError {\n readonly errors: unknown[];\n readonly result?: DocmanaExecutionResult;\n constructor(message: string, errors: unknown[] = [], result?: DocmanaExecutionResult) {\n super(message, { code: \"execution_failed\" });\n this.errors = errors;\n this.result = result;\n }\n}\n\nexport class DocmanaTimeoutError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"timeout\" });\n }\n}\n\nexport class DocmanaAbortError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"aborted\" });\n }\n}\n\nexport function errorFromResponse(\n status: number,\n message: string,\n requestId?: string,\n): DocmanaError {\n const opts = { status, requestId };\n switch (status) {\n case 400:\n return new DocmanaRequestError(message, opts);\n case 401:\n return new DocmanaAuthError(message, opts);\n case 403:\n return new DocmanaPermissionError(message, opts);\n case 404:\n return new DocmanaNotFoundError(message, opts);\n default:\n return new DocmanaError(message, opts);\n }\n}\n","import { DocmanaAuthError } from \"../errors.js\";\nimport type { TokenCache, TokenCacheEntry } from \"../types.js\";\n\nconst SAFETY_MARGIN_MS = 60_000;\n\nexport interface TokenManagerOptions {\n clientId: string;\n clientSecret: string;\n tokenEndpoint: string;\n scope: string;\n fetchImpl: typeof fetch;\n tokenCache?: TokenCache;\n}\n\nexport class TokenManager {\n private token: string | null = null;\n private expiresAt = 0;\n private inflight: Promise<string> | null = null;\n\n constructor(private readonly opts: TokenManagerOptions) {}\n\n invalidate(): void {\n this.token = null;\n this.expiresAt = 0;\n void this.opts.tokenCache?.clear().catch(() => undefined);\n }\n\n async getToken(): Promise<string> {\n if (this.token && Date.now() < this.expiresAt) return this.token;\n const cached = await this.readCachedToken();\n if (cached) return cached;\n if (this.inflight) return this.inflight;\n this.inflight = this.acquire().finally(() => {\n this.inflight = null;\n });\n return this.inflight;\n }\n\n private async acquire(): Promise<string> {\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.opts.clientId,\n client_secret: this.opts.clientSecret,\n scope: this.opts.scope,\n });\n const res = await this.opts.fetchImpl(this.opts.tokenEndpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n if (!res.ok) {\n // Do NOT include the response body verbatim — avoid leaking secrets/echoes.\n throw new DocmanaAuthError(\"Failed to acquire Docmana access token\", { status: res.status });\n }\n const json = (await res.json()) as Partial<{ access_token: string; expires_in: number }>;\n if (\n typeof json.access_token !== \"string\" ||\n json.access_token.length === 0 ||\n typeof json.expires_in !== \"number\" ||\n !Number.isFinite(json.expires_in)\n ) {\n throw new DocmanaAuthError(\"Malformed token response from Docmana CIAM\", {\n status: res.status,\n });\n }\n this.token = json.access_token;\n this.expiresAt = Date.now() + json.expires_in * 1000 - SAFETY_MARGIN_MS;\n await this.writeCachedToken().catch(() => undefined);\n return this.token;\n }\n\n private async readCachedToken(): Promise<string | null> {\n if (!this.opts.tokenCache) return null;\n let entry: TokenCacheEntry | null;\n try {\n entry = await this.opts.tokenCache.read();\n } catch {\n return null;\n }\n if (!entry) return null;\n if (\n entry.clientId !== this.opts.clientId ||\n entry.tokenEndpoint !== this.opts.tokenEndpoint ||\n entry.scope !== this.opts.scope ||\n Date.now() >= entry.expiresAt\n ) {\n await this.opts.tokenCache.clear().catch(() => undefined);\n return null;\n }\n this.token = entry.accessToken;\n this.expiresAt = entry.expiresAt;\n return this.token;\n }\n\n private async writeCachedToken(): Promise<void> {\n if (!this.opts.tokenCache || !this.token) return;\n await this.opts.tokenCache.write({\n accessToken: this.token,\n expiresAt: this.expiresAt,\n clientId: this.opts.clientId,\n tokenEndpoint: this.opts.tokenEndpoint,\n scope: this.opts.scope,\n });\n }\n}\n","import type { TokenManager } from \"../auth/token-manager.js\";\nimport { DocmanaError, DocmanaAbortError, errorFromResponse } from \"../errors.js\";\n\nexport interface HttpClientOptions {\n apiBaseUrl: string;\n fetchImpl: typeof fetch;\n tokenManager: TokenManager;\n headers?: Record<string, string>;\n}\n\ntype FetchBody = NonNullable<Parameters<typeof fetch>[1]>[\"body\"];\n\nexport interface RequestOptions {\n query?: Record<string, string>;\n body?: FetchBody;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport class HttpClient {\n constructor(private readonly opts: HttpClientOptions) {}\n\n async requestJson<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const res = await this.requestRaw(method, path, options);\n const text = await res.text();\n if (!text) return {} as T;\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new DocmanaError(\"Invalid JSON response from Docmana\", { status: res.status });\n }\n }\n\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n let res = await this.send(method, path, options);\n if (res.status === 401) {\n this.opts.tokenManager.invalidate();\n res = await this.send(method, path, options);\n }\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const message = await this.extractMessage(res);\n throw errorFromResponse(res.status, message, requestId);\n }\n return res;\n }\n\n private async send(method: string, path: string, options: RequestOptions): Promise<Response> {\n const token = await this.opts.tokenManager.getToken();\n const url = new URL(this.opts.apiBaseUrl + path);\n for (const [k, v] of Object.entries(options.query ?? {})) url.searchParams.set(k, v);\n const headers: Record<string, string> = {\n ...(this.opts.headers ?? {}),\n authorization: `Bearer ${token}`,\n ...(options.headers ?? {}),\n };\n try {\n return await this.opts.fetchImpl(url, {\n method,\n headers,\n body: options.body,\n signal: options.signal,\n });\n } catch (err) {\n if (options.signal?.aborted || (err instanceof Error && err.name === \"AbortError\")) {\n throw new DocmanaAbortError(\"Request aborted\");\n }\n throw err;\n }\n }\n\n private async extractMessage(res: Response): Promise<string> {\n try {\n const data = (await res.clone().json()) as { message?: string; error?: string };\n return data.message ?? data.error ?? res.statusText ?? `HTTP ${res.status}`;\n } catch {\n return res.statusText ?? `HTTP ${res.status}`;\n }\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport type { FileInput, RunFlowInput } from \"../types.js\";\n\nexport interface ResolvedPart {\n data: Blob;\n filename: string;\n contentType: string;\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".tif\": \"image/tiff\",\n \".tiff\": \"image/tiff\",\n \".txt\": \"text/plain\",\n \".json\": \"application/json\",\n};\n\nfunction contentTypeFor(name: string): string {\n const dot = name.lastIndexOf(\".\");\n if (dot < 0) return \"application/octet-stream\";\n const ext = name.slice(dot).toLowerCase();\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction isReadable(x: unknown): x is Readable {\n return typeof x === \"object\" && x !== null && typeof (x as Readable).pipe === \"function\";\n}\n\nfunction isPathInput(x: unknown): x is { path: string } {\n return typeof x === \"object\" && x !== null && typeof (x as { path?: unknown }).path === \"string\";\n}\n\nasync function streamToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) chunks.push(Buffer.from(chunk));\n return Buffer.concat(chunks);\n}\n\nasync function resolveOne(input: FileInput, fallbackName: string): Promise<ResolvedPart> {\n if (typeof input === \"string\" || isPathInput(input)) {\n const path = typeof input === \"string\" ? input : input.path;\n const data = await readFile(path);\n const filename = basename(path);\n return { data: new Blob([data]), filename, contentType: contentTypeFor(filename) };\n }\n if (input instanceof Uint8Array) {\n return {\n data: new Blob([input]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n if (isReadable(input)) {\n const buf = await streamToBuffer(input);\n return {\n data: new Blob([buf]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n throw new Error(\"Unsupported file input type\");\n}\n\nexport async function resolveInputs(input: RunFlowInput): Promise<ResolvedPart[]> {\n const list: FileInput[] = input.files ?? (input.file !== undefined ? [input.file] : []);\n if (list.length === 0) throw new Error(\"runFlow requires `file` or `files`\");\n const fallback = input.fileName ?? \"upload.bin\";\n return Promise.all(list.map((item) => resolveOne(item, fallback)));\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ResolvedPart } from \"../files/resolve-input.js\";\n\nexport async function uploadFiles(\n http: HttpClient,\n parts: ResolvedPart[],\n signal?: AbortSignal,\n): Promise<string[]> {\n const ids: string[] = [];\n for (const part of parts) {\n const form = new FormData();\n form.append(\"files\", new File([part.data], part.filename, { type: part.contentType }));\n const res = await http.requestJson<{ id: string }>(\"POST\", \"/upload\", { body: form, signal });\n ids.push(res.id);\n }\n return ids;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\n\nexport async function runFlow(\n http: HttpClient,\n flowId: string,\n uuidFiles: string[],\n signal?: AbortSignal,\n once = false,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const res = await http.requestJson<{ execution_result_id: string }>(\"POST\", path, {\n query: { async_mode: \"true\" },\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ uuid_files: uuidFiles }),\n signal,\n });\n return res.execution_result_id;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ExecutionStatus } from \"../types.js\";\n\nexport async function getStatus(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<{ status: ExecutionStatus | string }> {\n return http.requestJson(\"GET\", `/flows/execution-status/${executionResultId}`, { signal });\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\n\nexport async function getResult(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<DocmanaApiExecutionResult> {\n return http.requestJson(\"GET\", `/flows/execution-result/${executionResultId}`, { signal });\n}\n","import { DocmanaTimeoutError, DocmanaAbortError } from \"../errors.js\";\n\nconst TERMINAL = new Set([\"Completed\", \"Failed\"]);\n\nexport interface PollOptions {\n check: () => Promise<string>;\n intervalMs: number;\n timeoutMs: number;\n sleep?: (ms: number) => Promise<void>;\n elapsed?: () => number;\n signal?: AbortSignal;\n}\n\nconst defaultSleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\nexport async function pollUntilTerminal(opts: PollOptions): Promise<string> {\n const sleep = opts.sleep ?? defaultSleep;\n const start = Date.now();\n const elapsed = opts.elapsed ?? (() => Date.now() - start);\n for (;;) {\n if (opts.signal?.aborted) throw new DocmanaAbortError(\"Polling aborted\");\n const status = await opts.check();\n if (TERMINAL.has(status)) return status;\n if (elapsed() >= opts.timeoutMs) {\n throw new DocmanaTimeoutError(`Execution did not finish within ${opts.timeoutMs}ms`);\n }\n await sleep(opts.intervalMs);\n }\n}\n","import { DocmanaError } from \"../errors.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\nimport type { DocmanaApiNodeResult } from \"../models/docmana-api-node-result.model.js\";\nimport type { DocmanaExecutionResult } from \"../models/docmana-execution-result.model.js\";\nimport type { DocmanaDocumentResult } from \"../models/docmana-document-result.model.js\";\nimport type { DocmanaNodeResult } from \"../models/docmana-node-result.model.js\";\nimport type { DocmanaScoreNodeResult } from \"../models/docmana-score-node-result.model.js\";\nimport type { DocmanaCrossValidationResult } from \"../models/docmana-cross-validation-result.model.js\";\nimport type { DocmanaConclusionResult } from \"../models/docmana-conclusion-result.model.js\";\n\nfunction extractNodeFields(\n rawNode: DocmanaApiNodeResult,\n targetLanguage?: string,\n): DocmanaNodeResult {\n const metadataFields = new Set([\n \"node_id\",\n \"node_name\",\n \"node_type\",\n \"feature_name\",\n \"running_time\",\n \"status\",\n \"score\",\n \"feedback\",\n \"translations\",\n \"tokens\",\n \"input_tokens\",\n \"output_tokens\",\n \"errors\",\n \"mana\",\n \"model\",\n \"tool_calls\",\n \"prompt_id\",\n \"prompt\",\n \"prompt_name\",\n \"label\",\n \"scoreDescription\",\n \"score_description\",\n \"result\",\n \"documentType\",\n ]);\n\n let sourceObj: Record<string, unknown> = rawNode;\n if (targetLanguage) {\n const translations = rawNode.translations;\n if (!translations || !translations[targetLanguage]) {\n throw new DocmanaError(\n `Translation for language '${targetLanguage}' is missing on node '${rawNode.node_name || rawNode.node_id}'`,\n { code: \"translation_missing\", status: 400 },\n );\n }\n sourceObj = translations[targetLanguage] as Record<string, unknown>;\n }\n\n const dynamicFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(sourceObj)) {\n if (!metadataFields.has(key)) {\n dynamicFields[key] = value;\n }\n }\n\n const sdkNode: DocmanaScoreNodeResult = {\n status: rawNode.status || \"Unknown\",\n };\n\n if (rawNode.errors && rawNode.errors.length > 0) {\n sdkNode.errors = rawNode.errors;\n }\n\n const nodeType = rawNode.node_type || \"\";\n const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion)$/i.test(nodeType);\n if (isScoreNode) {\n if (rawNode.score !== undefined && rawNode.score !== null) {\n sdkNode.score = rawNode.score;\n }\n if (rawNode.feedback !== undefined && rawNode.feedback !== null) {\n sdkNode.feedback = rawNode.feedback;\n }\n }\n\n if (Object.keys(dynamicFields).length > 0) {\n sdkNode.data = dynamicFields;\n }\n\n return sdkNode;\n}\n\nexport function mapExecutionResult(\n raw: DocmanaApiExecutionResult,\n targetLanguage?: string,\n): DocmanaExecutionResult {\n const sdkResult: DocmanaExecutionResult = {\n status: raw.status || \"Unknown\",\n executionId: String(raw.execution_id || raw.executionResultId || raw.execution_result_id || \"\"),\n documents: {\n mappings: [],\n },\n };\n\n if (raw.errors && raw.errors.length > 0) {\n sdkResult.errors = raw.errors;\n }\n\n const results = raw.results || [];\n\n for (const item of results) {\n const isDocSpecific = !!item.document;\n\n if (isDocSpecific && item.document) {\n const docReq = item.document;\n const docKey = docReq.doc_key || \"unknown_doc\";\n const docName = docReq.name || \"\";\n\n sdkResult.documents.mappings.push({\n name: docName,\n reference: docKey,\n });\n\n const docResult: DocmanaDocumentResult = {\n status: item.status || docReq.status || \"Unknown\",\n extractions: {},\n validations: {},\n };\n\n const nodeResults = item.node_results || [];\n\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^Classification$/i.test(nodeType)) {\n const mappedNode = extractNodeFields(node, targetLanguage);\n if (!docResult.classifications) {\n docResult.classifications = {};\n }\n docResult.classifications[nodeName] = mappedNode;\n } else if (/^MetadataExtraction$/i.test(nodeType)) {\n docResult.metadataExtraction = extractNodeFields(node, targetLanguage);\n } else if (/^Extraction$/i.test(nodeType)) {\n if (docResult.extractions) {\n docResult.extractions[nodeName] = extractNodeFields(node, targetLanguage);\n }\n } else if (/^Validation$/i.test(nodeType)) {\n if (docResult.validations) {\n docResult.validations[nodeName] = extractNodeFields(node, targetLanguage);\n }\n }\n }\n\n if (docResult.extractions && Object.keys(docResult.extractions).length === 0) {\n delete docResult.extractions;\n }\n if (docResult.validations && Object.keys(docResult.validations).length === 0) {\n delete docResult.validations;\n }\n\n sdkResult.documents[docKey] = docResult;\n } else {\n const nodeResults = item.node_results || [];\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^CrossValidation$/i.test(nodeType)) {\n if (!sdkResult.crossValidations) {\n sdkResult.crossValidations = {};\n }\n sdkResult.crossValidations[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaCrossValidationResult;\n } else if (/^(Conclusion|Finish)$/i.test(nodeType)) {\n if (!sdkResult.conclusions) {\n sdkResult.conclusions = {};\n }\n sdkResult.conclusions[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaConclusionResult;\n }\n }\n }\n }\n\n return sdkResult;\n}\n","import { resolveConfig } from \"./config.js\";\nimport type { ResolvedConfig } from \"./config.js\";\nimport type {\n DocmanaConfig,\n DocmanaExecutionResult,\n ExecutionStatus,\n RunFlowInput,\n} from \"./types.js\";\nimport { TokenManager } from \"./auth/token-manager.js\";\nimport { HttpClient } from \"./http/http-client.js\";\nimport { resolveInputs } from \"./files/resolve-input.js\";\nimport { uploadFiles } from \"./api/upload.js\";\nimport { runFlow as runFlowApi } from \"./api/run-flow.js\";\nimport { getStatus as getStatusApi } from \"./api/execution-status.js\";\nimport { getResult as getResultApi } from \"./api/execution-result.js\";\nimport { pollUntilTerminal } from \"./polling/poll.js\";\nimport { DocmanaExecutionError } from \"./errors.js\";\nimport { mapExecutionResult } from \"./mappers/index.js\";\n\nexport class Docmana {\n private readonly config: ResolvedConfig;\n private readonly http: HttpClient;\n\n constructor(config: DocmanaConfig) {\n this.config = resolveConfig(config);\n const tokenManager = new TokenManager({\n clientId: this.config.clientId,\n clientSecret: this.config.clientSecret,\n tokenEndpoint: this.config.tokenEndpoint,\n scope: this.config.scope,\n fetchImpl: this.config.fetchImpl,\n tokenCache: this.config.tokenCache,\n });\n this.http = new HttpClient({\n apiBaseUrl: this.config.apiBaseUrl,\n fetchImpl: this.config.fetchImpl,\n tokenManager,\n headers: this.config.headers,\n });\n }\n\n async runFlowAsync(\n flowId: string,\n input: RunFlowInput,\n ): Promise<{ executionResultId: string; fileIds: string[] }> {\n const parts = await resolveInputs(input);\n const fileIds = await uploadFiles(this.http, parts, input.signal);\n const executionResultId = await runFlowApi(\n this.http,\n flowId,\n fileIds,\n input.signal,\n input.once ?? false,\n );\n return { executionResultId, fileIds };\n }\n\n async getStatus(\n executionResultId: string,\n signal?: AbortSignal,\n ): Promise<{ status: ExecutionStatus | string }> {\n return getStatusApi(this.http, executionResultId, signal);\n }\n\n async getResult(\n executionResultId: string,\n signal?: AbortSignal,\n language?: string,\n ): Promise<DocmanaExecutionResult> {\n const rawResult = await getResultApi(this.http, executionResultId, signal);\n return mapExecutionResult(rawResult, language);\n }\n\n async runFlow(flowId: string, input: RunFlowInput): Promise<DocmanaExecutionResult> {\n const { executionResultId } = await this.runFlowAsync(flowId, input);\n await pollUntilTerminal({\n check: async () => (await this.getStatus(executionResultId, input.signal)).status,\n intervalMs: input.pollIntervalMs ?? this.config.pollIntervalMs,\n timeoutMs: input.timeoutMs ?? this.config.timeoutMs,\n signal: input.signal,\n });\n const result = await this.getResult(executionResultId, input.signal, input.language);\n if (result.status === \"Failed\") {\n throw new DocmanaExecutionError(\n `Flow ${flowId} execution failed`,\n result.errors ?? [],\n result,\n );\n }\n return result;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGO,IAAM,WAAW;AAAA,EACtB,YAAY;AAAA,EACZ,eACE;AAAA,EACF,OAAO;AAAA,EACP,WAAW;AAAA,EACX,gBAAgB;AAClB;AAeO,SAAS,cAAc,QAAuC;AACnE,MAAI,CAAC,OAAO,SAAU,OAAM,IAAI,MAAM,oCAAoC;AAC1E,MAAI,CAAC,OAAO,aAAc,OAAM,IAAI,MAAM,wCAAwC;AAClF,QAAM,cAAc,OAAO,cAAc,SAAS,YAAY,QAAQ,QAAQ,EAAE;AAChF,SAAO;AAAA,IACL,UAAU,OAAO;AAAA,IACjB,cAAc,OAAO;AAAA,IACrB;AAAA,IACA,eAAe,OAAO,iBAAiB,SAAS;AAAA,IAChD,OAAO,OAAO,SAAS,SAAS;AAAA,IAChC,WAAW,OAAO,aAAa,SAAS;AAAA,IACxC,gBAAgB,OAAO,kBAAkB,SAAS;AAAA,IAClD,WAAW,OAAO,SAAS;AAAA,IAC3B,SAAS,OAAO,WAAW,CAAC;AAAA,IAC5B,YAAY,OAAO;AAAA,EACrB;AACF;;;ACvCO,IAAM,eAAN,cAA2B,MAAM;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACT,YAAY,SAAiB,OAA+D,CAAC,GAAG;AAC9F,UAAM,OAAO;AACb,SAAK,OAAO,WAAW;AACvB,SAAK,SAAS,KAAK;AACnB,SAAK,YAAY,KAAK;AACtB,SAAK,OAAO,KAAK,QAAQ;AACzB,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AACF;AAEO,IAAM,mBAAN,cAA+B,aAAa;AAAA,EACjD,YAAY,SAAiB,OAAgD,CAAC,GAAG;AAC/E,UAAM,SAAS,EAAE,GAAG,MAAM,MAAM,aAAa,CAAC;AAAA,EAChD;AACF;AAEO,IAAM,yBAAN,cAAqC,aAAa;AAAA,EACvD,YAAY,SAAiB,OAAgD,CAAC,GAAG;AAC/E,UAAM,SAAS,EAAE,GAAG,MAAM,MAAM,mBAAmB,CAAC;AAAA,EACtD;AACF;AAEO,IAAM,uBAAN,cAAmC,aAAa;AAAA,EACrD,YAAY,SAAiB,OAAgD,CAAC,GAAG;AAC/E,UAAM,SAAS,EAAE,GAAG,MAAM,MAAM,YAAY,CAAC;AAAA,EAC/C;AACF;AAEO,IAAM,sBAAN,cAAkC,aAAa;AAAA,EACpD,YAAY,SAAiB,OAAgD,CAAC,GAAG;AAC/E,UAAM,SAAS,EAAE,GAAG,MAAM,MAAM,cAAc,CAAC;AAAA,EACjD;AACF;AAEO,IAAM,wBAAN,cAAoC,aAAa;AAAA,EAC7C;AAAA,EACA;AAAA,EACT,YAAY,SAAiB,SAAoB,CAAC,GAAG,QAAiC;AACpF,UAAM,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC3C,SAAK,SAAS;AACd,SAAK,SAAS;AAAA,EAChB;AACF;AAEO,IAAM,sBAAN,cAAkC,aAAa;AAAA,EACpD,YAAY,SAAiB;AAC3B,UAAM,SAAS,EAAE,MAAM,UAAU,CAAC;AAAA,EACpC;AACF;AAEO,IAAM,oBAAN,cAAgC,aAAa;AAAA,EAClD,YAAY,SAAiB;AAC3B,UAAM,SAAS,EAAE,MAAM,UAAU,CAAC;AAAA,EACpC;AACF;AAEO,SAAS,kBACd,QACA,SACA,WACc;AACd,QAAM,OAAO,EAAE,QAAQ,UAAU;AACjC,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,IAAI,oBAAoB,SAAS,IAAI;AAAA,IAC9C,KAAK;AACH,aAAO,IAAI,iBAAiB,SAAS,IAAI;AAAA,IAC3C,KAAK;AACH,aAAO,IAAI,uBAAuB,SAAS,IAAI;AAAA,IACjD,KAAK;AACH,aAAO,IAAI,qBAAqB,SAAS,IAAI;AAAA,IAC/C;AACE,aAAO,IAAI,aAAa,SAAS,IAAI;AAAA,EACzC;AACF;;;AC7EA,IAAM,mBAAmB;AAWlB,IAAM,eAAN,MAAmB;AAAA,EAKxB,YAA6B,MAA2B;AAA3B;AAAA,EAA4B;AAAA,EAA5B;AAAA,EAJrB,QAAuB;AAAA,EACvB,YAAY;AAAA,EACZ,WAAmC;AAAA,EAI3C,aAAmB;AACjB,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,SAAK,KAAK,KAAK,YAAY,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,EAC1D;AAAA,EAEA,MAAM,WAA4B;AAChC,QAAI,KAAK,SAAS,KAAK,IAAI,IAAI,KAAK,UAAW,QAAO,KAAK;AAC3D,UAAM,SAAS,MAAM,KAAK,gBAAgB;AAC1C,QAAI,OAAQ,QAAO;AACnB,QAAI,KAAK,SAAU,QAAO,KAAK;AAC/B,SAAK,WAAW,KAAK,QAAQ,EAAE,QAAQ,MAAM;AAC3C,WAAK,WAAW;AAAA,IAClB,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,UAA2B;AACvC,UAAM,OAAO,IAAI,gBAAgB;AAAA,MAC/B,YAAY;AAAA,MACZ,WAAW,KAAK,KAAK;AAAA,MACrB,eAAe,KAAK,KAAK;AAAA,MACzB,OAAO,KAAK,KAAK;AAAA,IACnB,CAAC;AACD,UAAM,MAAM,MAAM,KAAK,KAAK,UAAU,KAAK,KAAK,eAAe;AAAA,MAC7D,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,MAC/D,MAAM,KAAK,SAAS;AAAA,IACtB,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AAEX,YAAM,IAAI,iBAAiB,0CAA0C,EAAE,QAAQ,IAAI,OAAO,CAAC;AAAA,IAC7F;AACA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,QACE,OAAO,KAAK,iBAAiB,YAC7B,KAAK,aAAa,WAAW,KAC7B,OAAO,KAAK,eAAe,YAC3B,CAAC,OAAO,SAAS,KAAK,UAAU,GAChC;AACA,YAAM,IAAI,iBAAiB,8CAA8C;AAAA,QACvE,QAAQ,IAAI;AAAA,MACd,CAAC;AAAA,IACH;AACA,SAAK,QAAQ,KAAK;AAClB,SAAK,YAAY,KAAK,IAAI,IAAI,KAAK,aAAa,MAAO;AACvD,UAAM,KAAK,iBAAiB,EAAE,MAAM,MAAM,MAAS;AACnD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,kBAA0C;AACtD,QAAI,CAAC,KAAK,KAAK,WAAY,QAAO;AAClC,QAAI;AACJ,QAAI;AACF,cAAQ,MAAM,KAAK,KAAK,WAAW,KAAK;AAAA,IAC1C,QAAQ;AACN,aAAO;AAAA,IACT;AACA,QAAI,CAAC,MAAO,QAAO;AACnB,QACE,MAAM,aAAa,KAAK,KAAK,YAC7B,MAAM,kBAAkB,KAAK,KAAK,iBAClC,MAAM,UAAU,KAAK,KAAK,SAC1B,KAAK,IAAI,KAAK,MAAM,WACpB;AACA,YAAM,KAAK,KAAK,WAAW,MAAM,EAAE,MAAM,MAAM,MAAS;AACxD,aAAO;AAAA,IACT;AACA,SAAK,QAAQ,MAAM;AACnB,SAAK,YAAY,MAAM;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,mBAAkC;AAC9C,QAAI,CAAC,KAAK,KAAK,cAAc,CAAC,KAAK,MAAO;AAC1C,UAAM,KAAK,KAAK,WAAW,MAAM;AAAA,MAC/B,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK,KAAK;AAAA,MACpB,eAAe,KAAK,KAAK;AAAA,MACzB,OAAO,KAAK,KAAK;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;ACrFO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,MAAyB;AAAzB;AAAA,EAA0B;AAAA,EAA1B;AAAA,EAE7B,MAAM,YAAe,QAAgB,MAAc,UAA0B,CAAC,GAAe;AAC3F,UAAM,MAAM,MAAM,KAAK,WAAW,QAAQ,MAAM,OAAO;AACvD,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI,CAAC,KAAM,QAAO,CAAC;AACnB,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AACN,YAAM,IAAI,aAAa,sCAAsC,EAAE,QAAQ,IAAI,OAAO,CAAC;AAAA,IACrF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAAgB,MAAc,UAA0B,CAAC,GAAsB;AAC9F,QAAI,MAAM,MAAM,KAAK,KAAK,QAAQ,MAAM,OAAO;AAC/C,QAAI,IAAI,WAAW,KAAK;AACtB,WAAK,KAAK,aAAa,WAAW;AAClC,YAAM,MAAM,KAAK,KAAK,QAAQ,MAAM,OAAO;AAAA,IAC7C;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,YAAY,IAAI,QAAQ,IAAI,cAAc,KAAK;AACrD,YAAM,UAAU,MAAM,KAAK,eAAe,GAAG;AAC7C,YAAM,kBAAkB,IAAI,QAAQ,SAAS,SAAS;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,KAAK,QAAgB,MAAc,SAA4C;AAC3F,UAAM,QAAQ,MAAM,KAAK,KAAK,aAAa,SAAS;AACpD,UAAM,MAAM,IAAI,IAAI,KAAK,KAAK,aAAa,IAAI;AAC/C,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,QAAQ,SAAS,CAAC,CAAC,EAAG,KAAI,aAAa,IAAI,GAAG,CAAC;AACnF,UAAM,UAAkC;AAAA,MACtC,GAAI,KAAK,KAAK,WAAW,CAAC;AAAA,MAC1B,eAAe,UAAU,KAAK;AAAA,MAC9B,GAAI,QAAQ,WAAW,CAAC;AAAA,IAC1B;AACA,QAAI;AACF,aAAO,MAAM,KAAK,KAAK,UAAU,KAAK;AAAA,QACpC;AAAA,QACA;AAAA,QACA,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,UAAI,QAAQ,QAAQ,WAAY,eAAe,SAAS,IAAI,SAAS,cAAe;AAClF,cAAM,IAAI,kBAAkB,iBAAiB;AAAA,MAC/C;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,eAAe,KAAgC;AAC3D,QAAI;AACF,YAAM,OAAQ,MAAM,IAAI,MAAM,EAAE,KAAK;AACrC,aAAO,KAAK,WAAW,KAAK,SAAS,IAAI,cAAc,QAAQ,IAAI,MAAM;AAAA,IAC3E,QAAQ;AACN,aAAO,IAAI,cAAc,QAAQ,IAAI,MAAM;AAAA,IAC7C;AAAA,EACF;AACF;;;AC/EA,sBAAyB;AACzB,uBAAyB;AAUzB,IAAM,gBAAwC;AAAA,EAC5C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AACX;AAEA,SAAS,eAAe,MAAsB;AAC5C,QAAM,MAAM,KAAK,YAAY,GAAG;AAChC,MAAI,MAAM,EAAG,QAAO;AACpB,QAAM,MAAM,KAAK,MAAM,GAAG,EAAE,YAAY;AACxC,SAAO,cAAc,GAAG,KAAK;AAC/B;AAEA,SAAS,WAAW,GAA2B;AAC7C,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,OAAQ,EAAe,SAAS;AAChF;AAEA,SAAS,YAAY,GAAmC;AACtD,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,OAAQ,EAAyB,SAAS;AAC1F;AAEA,eAAe,eAAe,QAAmC;AAC/D,QAAM,SAAmB,CAAC;AAC1B,mBAAiB,SAAS,OAAQ,QAAO,KAAK,OAAO,KAAK,KAAK,CAAC;AAChE,SAAO,OAAO,OAAO,MAAM;AAC7B;AAEA,eAAe,WAAW,OAAkB,cAA6C;AACvF,MAAI,OAAO,UAAU,YAAY,YAAY,KAAK,GAAG;AACnD,UAAM,OAAO,OAAO,UAAU,WAAW,QAAQ,MAAM;AACvD,UAAM,OAAO,UAAM,0BAAS,IAAI;AAChC,UAAM,eAAW,2BAAS,IAAI;AAC9B,WAAO,EAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,aAAa,eAAe,QAAQ,EAAE;AAAA,EACnF;AACA,MAAI,iBAAiB,YAAY;AAC/B,WAAO;AAAA,MACL,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC;AAAA,MACtB,UAAU;AAAA,MACV,aAAa,eAAe,YAAY;AAAA,IAC1C;AAAA,EACF;AACA,MAAI,WAAW,KAAK,GAAG;AACrB,UAAM,MAAM,MAAM,eAAe,KAAK;AACtC,WAAO;AAAA,MACL,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC;AAAA,MACpB,UAAU;AAAA,MACV,aAAa,eAAe,YAAY;AAAA,IAC1C;AAAA,EACF;AACA,QAAM,IAAI,MAAM,6BAA6B;AAC/C;AAEA,eAAsB,cAAc,OAA8C;AAChF,QAAM,OAAoB,MAAM,UAAU,MAAM,SAAS,SAAY,CAAC,MAAM,IAAI,IAAI,CAAC;AACrF,MAAI,KAAK,WAAW,EAAG,OAAM,IAAI,MAAM,oCAAoC;AAC3E,QAAM,WAAW,MAAM,YAAY;AACnC,SAAO,QAAQ,IAAI,KAAK,IAAI,CAAC,SAAS,WAAW,MAAM,QAAQ,CAAC,CAAC;AACnE;;;ACtEA,eAAsB,YACpB,MACA,OACA,QACmB;AACnB,QAAM,MAAgB,CAAC;AACvB,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,IAAI,SAAS;AAC1B,SAAK,OAAO,SAAS,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,KAAK,UAAU,EAAE,MAAM,KAAK,YAAY,CAAC,CAAC;AACrF,UAAM,MAAM,MAAM,KAAK,YAA4B,QAAQ,WAAW,EAAE,MAAM,MAAM,OAAO,CAAC;AAC5F,QAAI,KAAK,IAAI,EAAE;AAAA,EACjB;AACA,SAAO;AACT;;;ACdA,eAAsB,QACpB,MACA,QACA,WACA,QACA,OAAO,OACU;AACjB,QAAM,OAAO,OAAO,wBAAwB,MAAM,KAAK,mBAAmB,MAAM;AAChF,QAAM,MAAM,MAAM,KAAK,YAA6C,QAAQ,MAAM;AAAA,IAChF,OAAO,EAAE,YAAY,OAAO;AAAA,IAC5B,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,YAAY,UAAU,CAAC;AAAA,IAC9C;AAAA,EACF,CAAC;AACD,SAAO,IAAI;AACb;;;ACdA,eAAsB,UACpB,MACA,mBACA,QAC+C;AAC/C,SAAO,KAAK,YAAY,OAAO,2BAA2B,iBAAiB,IAAI,EAAE,OAAO,CAAC;AAC3F;;;ACNA,eAAsB,UACpB,MACA,mBACA,QACoC;AACpC,SAAO,KAAK,YAAY,OAAO,2BAA2B,iBAAiB,IAAI,EAAE,OAAO,CAAC;AAC3F;;;ACPA,IAAM,WAAW,oBAAI,IAAI,CAAC,aAAa,QAAQ,CAAC;AAWhD,IAAM,eAAe,CAAC,OAAe,IAAI,QAAc,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAE/E,eAAsB,kBAAkB,MAAoC;AAC1E,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,UAAU,KAAK,YAAY,MAAM,KAAK,IAAI,IAAI;AACpD,aAAS;AACP,QAAI,KAAK,QAAQ,QAAS,OAAM,IAAI,kBAAkB,iBAAiB;AACvE,UAAM,SAAS,MAAM,KAAK,MAAM;AAChC,QAAI,SAAS,IAAI,MAAM,EAAG,QAAO;AACjC,QAAI,QAAQ,KAAK,KAAK,WAAW;AAC/B,YAAM,IAAI,oBAAoB,mCAAmC,KAAK,SAAS,IAAI;AAAA,IACrF;AACA,UAAM,MAAM,KAAK,UAAU;AAAA,EAC7B;AACF;;;AClBA,SAAS,kBACP,SACA,gBACmB;AACnB,QAAM,iBAAiB,oBAAI,IAAI;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,YAAqC;AACzC,MAAI,gBAAgB;AAClB,UAAM,eAAe,QAAQ;AAC7B,QAAI,CAAC,gBAAgB,CAAC,aAAa,cAAc,GAAG;AAClD,YAAM,IAAI;AAAA,QACR,6BAA6B,cAAc,yBAAyB,QAAQ,aAAa,QAAQ,OAAO;AAAA,QACxG,EAAE,MAAM,uBAAuB,QAAQ,IAAI;AAAA,MAC7C;AAAA,IACF;AACA,gBAAY,aAAa,cAAc;AAAA,EACzC;AAEA,QAAM,gBAAyC,CAAC;AAChD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACpD,QAAI,CAAC,eAAe,IAAI,GAAG,GAAG;AAC5B,oBAAc,GAAG,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,UAAkC;AAAA,IACtC,QAAQ,QAAQ,UAAU;AAAA,EAC5B;AAEA,MAAI,QAAQ,UAAU,QAAQ,OAAO,SAAS,GAAG;AAC/C,YAAQ,SAAS,QAAQ;AAAA,EAC3B;AAEA,QAAM,WAAW,QAAQ,aAAa;AACtC,QAAM,cAAc,4DAA4D,KAAK,QAAQ;AAC7F,MAAI,aAAa;AACf,QAAI,QAAQ,UAAU,UAAa,QAAQ,UAAU,MAAM;AACzD,cAAQ,QAAQ,QAAQ;AAAA,IAC1B;AACA,QAAI,QAAQ,aAAa,UAAa,QAAQ,aAAa,MAAM;AAC/D,cAAQ,WAAW,QAAQ;AAAA,IAC7B;AAAA,EACF;AAEA,MAAI,OAAO,KAAK,aAAa,EAAE,SAAS,GAAG;AACzC,YAAQ,OAAO;AAAA,EACjB;AAEA,SAAO;AACT;AAEO,SAAS,mBACd,KACA,gBACwB;AACxB,QAAM,YAAoC;AAAA,IACxC,QAAQ,IAAI,UAAU;AAAA,IACtB,aAAa,OAAO,IAAI,gBAAgB,IAAI,qBAAqB,IAAI,uBAAuB,EAAE;AAAA,IAC9F,WAAW;AAAA,MACT,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,MAAI,IAAI,UAAU,IAAI,OAAO,SAAS,GAAG;AACvC,cAAU,SAAS,IAAI;AAAA,EACzB;AAEA,QAAM,UAAU,IAAI,WAAW,CAAC;AAEhC,aAAW,QAAQ,SAAS;AAC1B,UAAM,gBAAgB,CAAC,CAAC,KAAK;AAE7B,QAAI,iBAAiB,KAAK,UAAU;AAClC,YAAM,SAAS,KAAK;AACpB,YAAM,SAAS,OAAO,WAAW;AACjC,YAAM,UAAU,OAAO,QAAQ;AAE/B,gBAAU,UAAU,SAAS,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,WAAW;AAAA,MACb,CAAC;AAED,YAAM,YAAmC;AAAA,QACvC,QAAQ,KAAK,UAAU,OAAO,UAAU;AAAA,QACxC,aAAa,CAAC;AAAA,QACd,aAAa,CAAC;AAAA,MAChB;AAEA,YAAM,cAAc,KAAK,gBAAgB,CAAC;AAE1C,iBAAW,QAAQ,aAAa;AAC9B,cAAM,WAAW,KAAK,aAAa;AACnC,cAAM,WAAW,KAAK,aAAa,KAAK,WAAW;AAEnD,YAAI,oBAAoB,KAAK,QAAQ,GAAG;AACtC,gBAAM,aAAa,kBAAkB,MAAM,cAAc;AACzD,cAAI,CAAC,UAAU,iBAAiB;AAC9B,sBAAU,kBAAkB,CAAC;AAAA,UAC/B;AACA,oBAAU,gBAAgB,QAAQ,IAAI;AAAA,QACxC,WAAW,wBAAwB,KAAK,QAAQ,GAAG;AACjD,oBAAU,qBAAqB,kBAAkB,MAAM,cAAc;AAAA,QACvE,WAAW,gBAAgB,KAAK,QAAQ,GAAG;AACzC,cAAI,UAAU,aAAa;AACzB,sBAAU,YAAY,QAAQ,IAAI,kBAAkB,MAAM,cAAc;AAAA,UAC1E;AAAA,QACF,WAAW,gBAAgB,KAAK,QAAQ,GAAG;AACzC,cAAI,UAAU,aAAa;AACzB,sBAAU,YAAY,QAAQ,IAAI,kBAAkB,MAAM,cAAc;AAAA,UAC1E;AAAA,QACF;AAAA,MACF;AAEA,UAAI,UAAU,eAAe,OAAO,KAAK,UAAU,WAAW,EAAE,WAAW,GAAG;AAC5E,eAAO,UAAU;AAAA,MACnB;AACA,UAAI,UAAU,eAAe,OAAO,KAAK,UAAU,WAAW,EAAE,WAAW,GAAG;AAC5E,eAAO,UAAU;AAAA,MACnB;AAEA,gBAAU,UAAU,MAAM,IAAI;AAAA,IAChC,OAAO;AACL,YAAM,cAAc,KAAK,gBAAgB,CAAC;AAC1C,iBAAW,QAAQ,aAAa;AAC9B,cAAM,WAAW,KAAK,aAAa;AACnC,cAAM,WAAW,KAAK,aAAa,KAAK,WAAW;AAEnD,YAAI,qBAAqB,KAAK,QAAQ,GAAG;AACvC,cAAI,CAAC,UAAU,kBAAkB;AAC/B,sBAAU,mBAAmB,CAAC;AAAA,UAChC;AACA,oBAAU,iBAAiB,QAAQ,IAAI;AAAA,YACrC;AAAA,YACA;AAAA,UACF;AAAA,QACF,WAAW,yBAAyB,KAAK,QAAQ,GAAG;AAClD,cAAI,CAAC,UAAU,aAAa;AAC1B,sBAAU,cAAc,CAAC;AAAA,UAC3B;AACA,oBAAU,YAAY,QAAQ,IAAI;AAAA,YAChC;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACrKO,IAAM,UAAN,MAAc;AAAA,EACF;AAAA,EACA;AAAA,EAEjB,YAAY,QAAuB;AACjC,SAAK,SAAS,cAAc,MAAM;AAClC,UAAM,eAAe,IAAI,aAAa;AAAA,MACpC,UAAU,KAAK,OAAO;AAAA,MACtB,cAAc,KAAK,OAAO;AAAA,MAC1B,eAAe,KAAK,OAAO;AAAA,MAC3B,OAAO,KAAK,OAAO;AAAA,MACnB,WAAW,KAAK,OAAO;AAAA,MACvB,YAAY,KAAK,OAAO;AAAA,IAC1B,CAAC;AACD,SAAK,OAAO,IAAI,WAAW;AAAA,MACzB,YAAY,KAAK,OAAO;AAAA,MACxB,WAAW,KAAK,OAAO;AAAA,MACvB;AAAA,MACA,SAAS,KAAK,OAAO;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aACJ,QACA,OAC2D;AAC3D,UAAM,QAAQ,MAAM,cAAc,KAAK;AACvC,UAAM,UAAU,MAAM,YAAY,KAAK,MAAM,OAAO,MAAM,MAAM;AAChE,UAAM,oBAAoB,MAAM;AAAA,MAC9B,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM,QAAQ;AAAA,IAChB;AACA,WAAO,EAAE,mBAAmB,QAAQ;AAAA,EACtC;AAAA,EAEA,MAAM,UACJ,mBACA,QAC+C;AAC/C,WAAO,UAAa,KAAK,MAAM,mBAAmB,MAAM;AAAA,EAC1D;AAAA,EAEA,MAAM,UACJ,mBACA,QACA,UACiC;AACjC,UAAM,YAAY,MAAM,UAAa,KAAK,MAAM,mBAAmB,MAAM;AACzE,WAAO,mBAAmB,WAAW,QAAQ;AAAA,EAC/C;AAAA,EAEA,MAAM,QAAQ,QAAgB,OAAsD;AAClF,UAAM,EAAE,kBAAkB,IAAI,MAAM,KAAK,aAAa,QAAQ,KAAK;AACnE,UAAM,kBAAkB;AAAA,MACtB,OAAO,aAAa,MAAM,KAAK,UAAU,mBAAmB,MAAM,MAAM,GAAG;AAAA,MAC3E,YAAY,MAAM,kBAAkB,KAAK,OAAO;AAAA,MAChD,WAAW,MAAM,aAAa,KAAK,OAAO;AAAA,MAC1C,QAAQ,MAAM;AAAA,IAChB,CAAC;AACD,UAAM,SAAS,MAAM,KAAK,UAAU,mBAAmB,MAAM,QAAQ,MAAM,QAAQ;AACnF,QAAI,OAAO,WAAW,UAAU;AAC9B,YAAM,IAAI;AAAA,QACR,QAAQ,MAAM;AAAA,QACd,OAAO,UAAU,CAAC;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/errors.ts","../src/auth/token-manager.ts","../src/http/http-client.ts","../src/files/resolve-input.ts","../src/api/upload.ts","../src/api/run-flow.ts","../src/api/execution-status.ts","../src/api/execution-result.ts","../src/polling/poll.ts","../src/mappers/mapper.ts","../src/client.ts"],"sourcesContent":["export { Docmana } from \"./client.js\";\nexport {\n DocmanaError,\n DocmanaAuthError,\n DocmanaRequestError,\n DocmanaPermissionError,\n DocmanaNotFoundError,\n DocmanaExecutionError,\n DocmanaTimeoutError,\n DocmanaAbortError,\n} from \"./errors.js\";\nexport type {\n DocmanaConfig,\n RunFlowInput,\n FileInput,\n DocmanaExecutionResult,\n ExecutionStatus,\n DocmanaDocumentMapping,\n DocmanaDocumentResult,\n DocmanaNodeResult,\n DocmanaScoreNodeResult,\n DocmanaCrossValidationResult,\n DocmanaConclusionResult,\n DocmanaClassificationResult,\n DocmanaMetadataExtractionResult,\n DocmanaExtractionResult,\n DocmanaValidationResult,\n} from \"./types.js\";\nexport type {\n ExecutionProgress,\n VirtualDocument,\n PhysicalDocument,\n DocumentContent,\n FlowNodeType,\n FlowConfigs,\n FlowNode,\n FlowEdge,\n Flow,\n NodeTranslationResult,\n DocmanaApiExecutionResult,\n DocmanaApiNodeResult,\n DocmanaApiDocumentExecutionResult,\n DocmanaApiDocumentRequest,\n} from \"./models/index.js\";\n","import type { DocmanaConfig } from \"./types.js\";\nimport type { TokenCache } from \"./types.js\";\n\nexport const DEFAULTS = {\n apiBaseUrl: \"https://api.docmana.ai\",\n tokenEndpoint:\n \"https://4fe70f5b-e013-4f65-9fa7-3109a33beba5.ciamlogin.com/4fe70f5b-e013-4f65-9fa7-3109a33beba5/oauth2/v2.0/token\",\n scope: \"api://d781e6ba-cc08-4618-8099-ad968abd2b9e/.default\",\n timeoutMs: 300_000,\n pollIntervalMs: 2_000,\n} as const;\n\nexport interface ResolvedConfig {\n clientId: string;\n clientSecret: string;\n apiBaseUrl: string;\n tokenEndpoint: string;\n scope: string;\n timeoutMs: number;\n pollIntervalMs: number;\n fetchImpl: typeof fetch;\n headers: Record<string, string>;\n tokenCache?: TokenCache;\n}\n\nexport function resolveConfig(config: DocmanaConfig): ResolvedConfig {\n if (!config.clientId) throw new Error(\"DocmanaConfig.clientId is required\");\n if (!config.clientSecret) throw new Error(\"DocmanaConfig.clientSecret is required\");\n const apiBaseUrl = (config.apiBaseUrl ?? DEFAULTS.apiBaseUrl).replace(/\\/+$/, \"\");\n return {\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n apiBaseUrl,\n tokenEndpoint: config.tokenEndpoint ?? DEFAULTS.tokenEndpoint,\n scope: config.scope ?? DEFAULTS.scope,\n timeoutMs: config.timeoutMs ?? DEFAULTS.timeoutMs,\n pollIntervalMs: config.pollIntervalMs ?? DEFAULTS.pollIntervalMs,\n fetchImpl: config.fetch ?? fetch,\n headers: config.headers ?? {},\n tokenCache: config.tokenCache,\n };\n}\n","import type { DocmanaExecutionResult } from \"./models/docmana-execution-result.model.js\";\n\nexport class DocmanaError extends Error {\n readonly status?: number;\n readonly requestId?: string;\n readonly code: string;\n constructor(message: string, opts: { status?: number; requestId?: string; code?: string } = {}) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.requestId = opts.requestId;\n this.code = opts.code ?? \"docmana_error\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class DocmanaAuthError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"auth_error\" });\n }\n}\n\nexport class DocmanaPermissionError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"permission_error\" });\n }\n}\n\nexport class DocmanaNotFoundError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"not_found\" });\n }\n}\n\nexport class DocmanaRequestError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"bad_request\" });\n }\n}\n\nexport class DocmanaExecutionError extends DocmanaError {\n readonly errors: unknown[];\n readonly result?: DocmanaExecutionResult;\n constructor(message: string, errors: unknown[] = [], result?: DocmanaExecutionResult) {\n super(message, { code: \"execution_failed\" });\n this.errors = errors;\n this.result = result;\n }\n}\n\nexport class DocmanaTimeoutError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"timeout\" });\n }\n}\n\nexport class DocmanaAbortError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"aborted\" });\n }\n}\n\nexport function errorFromResponse(\n status: number,\n message: string,\n requestId?: string,\n): DocmanaError {\n const opts = { status, requestId };\n switch (status) {\n case 400:\n return new DocmanaRequestError(message, opts);\n case 401:\n return new DocmanaAuthError(message, opts);\n case 403:\n return new DocmanaPermissionError(message, opts);\n case 404:\n return new DocmanaNotFoundError(message, opts);\n default:\n return new DocmanaError(message, opts);\n }\n}\n","import { DocmanaAuthError } from \"../errors.js\";\nimport type { TokenCache, TokenCacheEntry } from \"../types.js\";\n\nconst SAFETY_MARGIN_MS = 60_000;\n\nexport interface TokenManagerOptions {\n clientId: string;\n clientSecret: string;\n tokenEndpoint: string;\n scope: string;\n fetchImpl: typeof fetch;\n tokenCache?: TokenCache;\n}\n\nexport class TokenManager {\n private token: string | null = null;\n private expiresAt = 0;\n private inflight: Promise<string> | null = null;\n\n constructor(private readonly opts: TokenManagerOptions) {}\n\n invalidate(): void {\n this.token = null;\n this.expiresAt = 0;\n void this.opts.tokenCache?.clear().catch(() => undefined);\n }\n\n async getToken(): Promise<string> {\n if (this.token && Date.now() < this.expiresAt) return this.token;\n const cached = await this.readCachedToken();\n if (cached) return cached;\n if (this.inflight) return this.inflight;\n this.inflight = this.acquire().finally(() => {\n this.inflight = null;\n });\n return this.inflight;\n }\n\n private async acquire(): Promise<string> {\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.opts.clientId,\n client_secret: this.opts.clientSecret,\n scope: this.opts.scope,\n });\n const res = await this.opts.fetchImpl(this.opts.tokenEndpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n if (!res.ok) {\n // Do NOT include the response body verbatim — avoid leaking secrets/echoes.\n throw new DocmanaAuthError(\"Failed to acquire Docmana access token\", { status: res.status });\n }\n const json = (await res.json()) as Partial<{ access_token: string; expires_in: number }>;\n if (\n typeof json.access_token !== \"string\" ||\n json.access_token.length === 0 ||\n typeof json.expires_in !== \"number\" ||\n !Number.isFinite(json.expires_in)\n ) {\n throw new DocmanaAuthError(\"Malformed token response from Docmana CIAM\", {\n status: res.status,\n });\n }\n this.token = json.access_token;\n this.expiresAt = Date.now() + json.expires_in * 1000 - SAFETY_MARGIN_MS;\n await this.writeCachedToken().catch(() => undefined);\n return this.token;\n }\n\n private async readCachedToken(): Promise<string | null> {\n if (!this.opts.tokenCache) return null;\n let entry: TokenCacheEntry | null;\n try {\n entry = await this.opts.tokenCache.read();\n } catch {\n return null;\n }\n if (!entry) return null;\n if (\n entry.clientId !== this.opts.clientId ||\n entry.tokenEndpoint !== this.opts.tokenEndpoint ||\n entry.scope !== this.opts.scope ||\n Date.now() >= entry.expiresAt\n ) {\n await this.opts.tokenCache.clear().catch(() => undefined);\n return null;\n }\n this.token = entry.accessToken;\n this.expiresAt = entry.expiresAt;\n return this.token;\n }\n\n private async writeCachedToken(): Promise<void> {\n if (!this.opts.tokenCache || !this.token) return;\n await this.opts.tokenCache.write({\n accessToken: this.token,\n expiresAt: this.expiresAt,\n clientId: this.opts.clientId,\n tokenEndpoint: this.opts.tokenEndpoint,\n scope: this.opts.scope,\n });\n }\n}\n","import type { TokenManager } from \"../auth/token-manager.js\";\nimport { DocmanaError, DocmanaAbortError, errorFromResponse } from \"../errors.js\";\n\nexport interface HttpClientOptions {\n apiBaseUrl: string;\n fetchImpl: typeof fetch;\n tokenManager: TokenManager;\n headers?: Record<string, string>;\n}\n\ntype FetchBody = NonNullable<Parameters<typeof fetch>[1]>[\"body\"];\n\nexport interface RequestOptions {\n query?: Record<string, string>;\n body?: FetchBody;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport class HttpClient {\n constructor(private readonly opts: HttpClientOptions) {}\n\n async requestJson<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const res = await this.requestRaw(method, path, options);\n const text = await res.text();\n if (!text) return {} as T;\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new DocmanaError(\"Invalid JSON response from Docmana\", { status: res.status });\n }\n }\n\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n let res = await this.send(method, path, options);\n if (res.status === 401) {\n this.opts.tokenManager.invalidate();\n res = await this.send(method, path, options);\n }\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const message = await this.extractMessage(res);\n throw errorFromResponse(res.status, message, requestId);\n }\n return res;\n }\n\n private async send(method: string, path: string, options: RequestOptions): Promise<Response> {\n const token = await this.opts.tokenManager.getToken();\n const url = new URL(this.opts.apiBaseUrl + path);\n for (const [k, v] of Object.entries(options.query ?? {})) url.searchParams.set(k, v);\n const headers: Record<string, string> = {\n ...(this.opts.headers ?? {}),\n authorization: `Bearer ${token}`,\n ...(options.headers ?? {}),\n };\n try {\n return await this.opts.fetchImpl(url, {\n method,\n headers,\n body: options.body,\n signal: options.signal,\n });\n } catch (err) {\n if (options.signal?.aborted || (err instanceof Error && err.name === \"AbortError\")) {\n throw new DocmanaAbortError(\"Request aborted\");\n }\n throw err;\n }\n }\n\n private async extractMessage(res: Response): Promise<string> {\n try {\n const data = (await res.clone().json()) as { message?: string; error?: string };\n return data.message ?? data.error ?? res.statusText ?? `HTTP ${res.status}`;\n } catch {\n return res.statusText ?? `HTTP ${res.status}`;\n }\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport type { FileInput, RunFlowInput } from \"../types.js\";\n\nexport interface ResolvedPart {\n data: Blob;\n filename: string;\n contentType: string;\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".tif\": \"image/tiff\",\n \".tiff\": \"image/tiff\",\n \".txt\": \"text/plain\",\n \".json\": \"application/json\",\n};\n\nfunction contentTypeFor(name: string): string {\n const dot = name.lastIndexOf(\".\");\n if (dot < 0) return \"application/octet-stream\";\n const ext = name.slice(dot).toLowerCase();\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction isReadable(x: unknown): x is Readable {\n return typeof x === \"object\" && x !== null && typeof (x as Readable).pipe === \"function\";\n}\n\nfunction isPathInput(x: unknown): x is { path: string } {\n return typeof x === \"object\" && x !== null && typeof (x as { path?: unknown }).path === \"string\";\n}\n\nasync function streamToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) chunks.push(Buffer.from(chunk));\n return Buffer.concat(chunks);\n}\n\nasync function resolveOne(input: FileInput, fallbackName: string): Promise<ResolvedPart> {\n if (typeof input === \"string\" || isPathInput(input)) {\n const path = typeof input === \"string\" ? input : input.path;\n const data = await readFile(path);\n const filename = basename(path);\n return { data: new Blob([data]), filename, contentType: contentTypeFor(filename) };\n }\n if (input instanceof Uint8Array) {\n return {\n data: new Blob([input]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n if (isReadable(input)) {\n const buf = await streamToBuffer(input);\n return {\n data: new Blob([buf]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n throw new Error(\"Unsupported file input type\");\n}\n\nexport async function resolveInputs(input: RunFlowInput): Promise<ResolvedPart[]> {\n const list: FileInput[] = input.files ?? (input.file !== undefined ? [input.file] : []);\n if (list.length === 0) throw new Error(\"runFlow requires `file` or `files`\");\n const fallback = input.fileName ?? \"upload.bin\";\n return Promise.all(list.map((item) => resolveOne(item, fallback)));\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ResolvedPart } from \"../files/resolve-input.js\";\n\nexport async function uploadFiles(\n http: HttpClient,\n parts: ResolvedPart[],\n signal?: AbortSignal,\n): Promise<string[]> {\n // The /upload endpoint accepts multiple files in a SINGLE call and returns one\n // folder UUID holding all of them. Uploading every file in its own call would\n // make Docmana treat each file as a separate document, which breaks flows that\n // process several documents together (the graph builder reuses the same node per\n // document -> \"Node already present\"). So we send every part in one request.\n const form = new FormData();\n for (const part of parts) {\n form.append(\"files\", new File([part.data], part.filename, { type: part.contentType }));\n }\n const res = await http.requestJson<{ id: string }>(\"POST\", \"/upload\", { body: form, signal });\n return [res.id];\n}\n","import type { HttpClient } from \"../http/http-client.js\";\n\nexport async function runFlow(\n http: HttpClient,\n flowId: string,\n uuidFiles: string[],\n signal?: AbortSignal,\n once = false,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const res = await http.requestJson<{ execution_result_id: string }>(\"POST\", path, {\n query: { async_mode: \"true\" },\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ uuid_files: uuidFiles }),\n signal,\n });\n return res.execution_result_id;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ExecutionStatus } from \"../types.js\";\n\nexport async function getStatus(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<{ status: ExecutionStatus | string }> {\n return http.requestJson(\"GET\", `/flows/execution-status/${executionResultId}`, { signal });\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\n\nexport async function getResult(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<DocmanaApiExecutionResult> {\n return http.requestJson(\"GET\", `/flows/execution-result/${executionResultId}`, { signal });\n}\n","import { DocmanaTimeoutError, DocmanaAbortError } from \"../errors.js\";\n\nconst TERMINAL = new Set([\"Completed\", \"Failed\"]);\n\nexport interface PollOptions {\n check: () => Promise<string>;\n intervalMs: number;\n timeoutMs: number;\n sleep?: (ms: number) => Promise<void>;\n elapsed?: () => number;\n signal?: AbortSignal;\n}\n\nconst defaultSleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\nexport async function pollUntilTerminal(opts: PollOptions): Promise<string> {\n const sleep = opts.sleep ?? defaultSleep;\n const start = Date.now();\n const elapsed = opts.elapsed ?? (() => Date.now() - start);\n for (;;) {\n if (opts.signal?.aborted) throw new DocmanaAbortError(\"Polling aborted\");\n const status = await opts.check();\n if (TERMINAL.has(status)) return status;\n if (elapsed() >= opts.timeoutMs) {\n throw new DocmanaTimeoutError(`Execution did not finish within ${opts.timeoutMs}ms`);\n }\n await sleep(opts.intervalMs);\n }\n}\n","import { DocmanaError } from \"../errors.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\nimport type { DocmanaApiNodeResult } from \"../models/docmana-api-node-result.model.js\";\nimport type { DocmanaExecutionResult } from \"../models/docmana-execution-result.model.js\";\nimport type { DocmanaDocumentResult } from \"../models/docmana-document-result.model.js\";\nimport type { DocmanaNodeResult } from \"../models/docmana-node-result.model.js\";\nimport type { DocmanaScoreNodeResult } from \"../models/docmana-score-node-result.model.js\";\nimport type { DocmanaCrossValidationResult } from \"../models/docmana-cross-validation-result.model.js\";\nimport type { DocmanaConclusionResult } from \"../models/docmana-conclusion-result.model.js\";\n\nfunction extractNodeFields(\n rawNode: DocmanaApiNodeResult,\n targetLanguage?: string,\n): DocmanaNodeResult {\n const metadataFields = new Set([\n \"node_id\",\n \"node_name\",\n \"node_type\",\n \"feature_name\",\n \"running_time\",\n \"status\",\n \"score\",\n \"feedback\",\n \"translations\",\n \"tokens\",\n \"input_tokens\",\n \"output_tokens\",\n \"errors\",\n \"mana\",\n \"model\",\n \"tool_calls\",\n \"prompt_id\",\n \"prompt\",\n \"prompt_name\",\n \"label\",\n \"scoreDescription\",\n \"score_description\",\n \"result\",\n \"documentType\",\n ]);\n\n let sourceObj: Record<string, unknown> = rawNode;\n if (targetLanguage) {\n const translations = rawNode.translations;\n if (!translations || !translations[targetLanguage]) {\n throw new DocmanaError(\n `Translation for language '${targetLanguage}' is missing on node '${rawNode.node_name || rawNode.node_id}'`,\n { code: \"translation_missing\", status: 400 },\n );\n }\n sourceObj = translations[targetLanguage] as Record<string, unknown>;\n }\n\n const dynamicFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(sourceObj)) {\n if (!metadataFields.has(key)) {\n dynamicFields[key] = value;\n }\n }\n\n const sdkNode: DocmanaScoreNodeResult = {\n status: rawNode.status || \"Unknown\",\n };\n\n if (rawNode.errors && rawNode.errors.length > 0) {\n sdkNode.errors = rawNode.errors;\n }\n\n const nodeType = rawNode.node_type || \"\";\n const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion)$/i.test(nodeType);\n if (isScoreNode) {\n if (rawNode.score !== undefined && rawNode.score !== null) {\n sdkNode.score = rawNode.score;\n }\n if (rawNode.feedback !== undefined && rawNode.feedback !== null) {\n sdkNode.feedback = rawNode.feedback;\n }\n }\n\n if (Object.keys(dynamicFields).length > 0) {\n sdkNode.data = dynamicFields;\n }\n\n return sdkNode;\n}\n\nexport function mapExecutionResult(\n raw: DocmanaApiExecutionResult,\n targetLanguage?: string,\n): DocmanaExecutionResult {\n const sdkResult: DocmanaExecutionResult = {\n status: raw.status || \"Unknown\",\n executionId: String(raw.execution_id || raw.executionResultId || raw.execution_result_id || \"\"),\n documents: {\n mappings: [],\n },\n };\n\n if (raw.errors && raw.errors.length > 0) {\n sdkResult.errors = raw.errors;\n }\n\n const results = raw.results || [];\n\n for (const item of results) {\n const isDocSpecific = !!item.document;\n\n if (isDocSpecific && item.document) {\n const docReq = item.document;\n const docKey = docReq.doc_key || \"unknown_doc\";\n const docName = docReq.name || \"\";\n\n sdkResult.documents.mappings.push({\n name: docName,\n reference: docKey,\n });\n\n const docResult: DocmanaDocumentResult = {\n status: item.status || docReq.status || \"Unknown\",\n extractions: {},\n validations: {},\n };\n\n const nodeResults = item.node_results || [];\n\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^Classification$/i.test(nodeType)) {\n const mappedNode = extractNodeFields(node, targetLanguage);\n if (!docResult.classifications) {\n docResult.classifications = {};\n }\n docResult.classifications[nodeName] = mappedNode;\n } else if (/^MetadataExtraction$/i.test(nodeType)) {\n docResult.metadataExtraction = extractNodeFields(node, targetLanguage);\n } else if (/^Extraction$/i.test(nodeType)) {\n if (docResult.extractions) {\n docResult.extractions[nodeName] = extractNodeFields(node, targetLanguage);\n }\n } else if (/^Validation$/i.test(nodeType)) {\n if (docResult.validations) {\n docResult.validations[nodeName] = extractNodeFields(node, targetLanguage);\n }\n }\n }\n\n if (docResult.extractions && Object.keys(docResult.extractions).length === 0) {\n delete docResult.extractions;\n }\n if (docResult.validations && Object.keys(docResult.validations).length === 0) {\n delete docResult.validations;\n }\n\n sdkResult.documents[docKey] = docResult;\n } else {\n const nodeResults = item.node_results || [];\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^CrossValidation$/i.test(nodeType)) {\n if (!sdkResult.crossValidations) {\n sdkResult.crossValidations = {};\n }\n sdkResult.crossValidations[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaCrossValidationResult;\n } else if (/^(Conclusion|Finish)$/i.test(nodeType)) {\n if (!sdkResult.conclusions) {\n sdkResult.conclusions = {};\n }\n sdkResult.conclusions[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaConclusionResult;\n }\n }\n }\n }\n\n return sdkResult;\n}\n","import { resolveConfig } from \"./config.js\";\nimport type { ResolvedConfig } from \"./config.js\";\nimport type {\n DocmanaConfig,\n DocmanaExecutionResult,\n ExecutionStatus,\n RunFlowInput,\n} from \"./types.js\";\nimport { TokenManager } from \"./auth/token-manager.js\";\nimport { HttpClient } from \"./http/http-client.js\";\nimport { resolveInputs } from \"./files/resolve-input.js\";\nimport { uploadFiles } from \"./api/upload.js\";\nimport { runFlow as runFlowApi } from \"./api/run-flow.js\";\nimport { getStatus as getStatusApi } from \"./api/execution-status.js\";\nimport { getResult as getResultApi } from \"./api/execution-result.js\";\nimport { pollUntilTerminal } from \"./polling/poll.js\";\nimport { DocmanaExecutionError } from \"./errors.js\";\nimport { mapExecutionResult } from \"./mappers/index.js\";\n\nexport class Docmana {\n private readonly config: ResolvedConfig;\n private readonly http: HttpClient;\n\n constructor(config: DocmanaConfig) {\n this.config = resolveConfig(config);\n const tokenManager = new TokenManager({\n clientId: this.config.clientId,\n clientSecret: this.config.clientSecret,\n tokenEndpoint: this.config.tokenEndpoint,\n scope: this.config.scope,\n fetchImpl: this.config.fetchImpl,\n tokenCache: this.config.tokenCache,\n });\n this.http = new HttpClient({\n apiBaseUrl: this.config.apiBaseUrl,\n fetchImpl: this.config.fetchImpl,\n tokenManager,\n headers: this.config.headers,\n });\n }\n\n async runFlowAsync(\n flowId: string,\n input: RunFlowInput,\n ): Promise<{ executionResultId: string; fileIds: string[] }> {\n const parts = await resolveInputs(input);\n const fileIds = await uploadFiles(this.http, parts, input.signal);\n const executionResultId = await runFlowApi(\n this.http,\n flowId,\n fileIds,\n input.signal,\n input.once ?? false,\n );\n return { executionResultId, fileIds };\n }\n\n async getStatus(\n executionResultId: string,\n signal?: AbortSignal,\n ): Promise<{ status: ExecutionStatus | string }> {\n return getStatusApi(this.http, executionResultId, signal);\n }\n\n async getResult(\n executionResultId: string,\n signal?: AbortSignal,\n language?: string,\n ): Promise<DocmanaExecutionResult> {\n const rawResult = await getResultApi(this.http, executionResultId, signal);\n return mapExecutionResult(rawResult, language);\n }\n\n async runFlow(flowId: string, input: RunFlowInput): Promise<DocmanaExecutionResult> {\n const { executionResultId } = await this.runFlowAsync(flowId, input);\n await pollUntilTerminal({\n check: async () => (await this.getStatus(executionResultId, input.signal)).status,\n intervalMs: input.pollIntervalMs ?? this.config.pollIntervalMs,\n timeoutMs: input.timeoutMs ?? this.config.timeoutMs,\n signal: input.signal,\n });\n const result = await this.getResult(executionResultId, input.signal, input.language);\n if (result.status === \"Failed\") {\n throw new DocmanaExecutionError(\n `Flow ${flowId} execution failed`,\n result.errors ?? [],\n result,\n );\n }\n return result;\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -298,14 +298,12 @@ async function resolveInputs(input) {
|
|
|
298
298
|
|
|
299
299
|
// src/api/upload.ts
|
|
300
300
|
async function uploadFiles(http, parts, signal) {
|
|
301
|
-
const
|
|
301
|
+
const form = new FormData();
|
|
302
302
|
for (const part of parts) {
|
|
303
|
-
const form = new FormData();
|
|
304
303
|
form.append("files", new File([part.data], part.filename, { type: part.contentType }));
|
|
305
|
-
const res = await http.requestJson("POST", "/upload", { body: form, signal });
|
|
306
|
-
ids.push(res.id);
|
|
307
304
|
}
|
|
308
|
-
|
|
305
|
+
const res = await http.requestJson("POST", "/upload", { body: form, signal });
|
|
306
|
+
return [res.id];
|
|
309
307
|
}
|
|
310
308
|
|
|
311
309
|
// src/api/run-flow.ts
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/auth/token-manager.ts","../src/http/http-client.ts","../src/files/resolve-input.ts","../src/api/upload.ts","../src/api/run-flow.ts","../src/api/execution-status.ts","../src/api/execution-result.ts","../src/polling/poll.ts","../src/mappers/mapper.ts","../src/client.ts"],"sourcesContent":["import type { DocmanaConfig } from \"./types.js\";\nimport type { TokenCache } from \"./types.js\";\n\nexport const DEFAULTS = {\n apiBaseUrl: \"https://api.docmana.ai\",\n tokenEndpoint:\n \"https://4fe70f5b-e013-4f65-9fa7-3109a33beba5.ciamlogin.com/4fe70f5b-e013-4f65-9fa7-3109a33beba5/oauth2/v2.0/token\",\n scope: \"api://d781e6ba-cc08-4618-8099-ad968abd2b9e/.default\",\n timeoutMs: 300_000,\n pollIntervalMs: 2_000,\n} as const;\n\nexport interface ResolvedConfig {\n clientId: string;\n clientSecret: string;\n apiBaseUrl: string;\n tokenEndpoint: string;\n scope: string;\n timeoutMs: number;\n pollIntervalMs: number;\n fetchImpl: typeof fetch;\n headers: Record<string, string>;\n tokenCache?: TokenCache;\n}\n\nexport function resolveConfig(config: DocmanaConfig): ResolvedConfig {\n if (!config.clientId) throw new Error(\"DocmanaConfig.clientId is required\");\n if (!config.clientSecret) throw new Error(\"DocmanaConfig.clientSecret is required\");\n const apiBaseUrl = (config.apiBaseUrl ?? DEFAULTS.apiBaseUrl).replace(/\\/+$/, \"\");\n return {\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n apiBaseUrl,\n tokenEndpoint: config.tokenEndpoint ?? DEFAULTS.tokenEndpoint,\n scope: config.scope ?? DEFAULTS.scope,\n timeoutMs: config.timeoutMs ?? DEFAULTS.timeoutMs,\n pollIntervalMs: config.pollIntervalMs ?? DEFAULTS.pollIntervalMs,\n fetchImpl: config.fetch ?? fetch,\n headers: config.headers ?? {},\n tokenCache: config.tokenCache,\n };\n}\n","import type { DocmanaExecutionResult } from \"./models/docmana-execution-result.model.js\";\n\nexport class DocmanaError extends Error {\n readonly status?: number;\n readonly requestId?: string;\n readonly code: string;\n constructor(message: string, opts: { status?: number; requestId?: string; code?: string } = {}) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.requestId = opts.requestId;\n this.code = opts.code ?? \"docmana_error\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class DocmanaAuthError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"auth_error\" });\n }\n}\n\nexport class DocmanaPermissionError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"permission_error\" });\n }\n}\n\nexport class DocmanaNotFoundError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"not_found\" });\n }\n}\n\nexport class DocmanaRequestError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"bad_request\" });\n }\n}\n\nexport class DocmanaExecutionError extends DocmanaError {\n readonly errors: unknown[];\n readonly result?: DocmanaExecutionResult;\n constructor(message: string, errors: unknown[] = [], result?: DocmanaExecutionResult) {\n super(message, { code: \"execution_failed\" });\n this.errors = errors;\n this.result = result;\n }\n}\n\nexport class DocmanaTimeoutError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"timeout\" });\n }\n}\n\nexport class DocmanaAbortError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"aborted\" });\n }\n}\n\nexport function errorFromResponse(\n status: number,\n message: string,\n requestId?: string,\n): DocmanaError {\n const opts = { status, requestId };\n switch (status) {\n case 400:\n return new DocmanaRequestError(message, opts);\n case 401:\n return new DocmanaAuthError(message, opts);\n case 403:\n return new DocmanaPermissionError(message, opts);\n case 404:\n return new DocmanaNotFoundError(message, opts);\n default:\n return new DocmanaError(message, opts);\n }\n}\n","import { DocmanaAuthError } from \"../errors.js\";\nimport type { TokenCache, TokenCacheEntry } from \"../types.js\";\n\nconst SAFETY_MARGIN_MS = 60_000;\n\nexport interface TokenManagerOptions {\n clientId: string;\n clientSecret: string;\n tokenEndpoint: string;\n scope: string;\n fetchImpl: typeof fetch;\n tokenCache?: TokenCache;\n}\n\nexport class TokenManager {\n private token: string | null = null;\n private expiresAt = 0;\n private inflight: Promise<string> | null = null;\n\n constructor(private readonly opts: TokenManagerOptions) {}\n\n invalidate(): void {\n this.token = null;\n this.expiresAt = 0;\n void this.opts.tokenCache?.clear().catch(() => undefined);\n }\n\n async getToken(): Promise<string> {\n if (this.token && Date.now() < this.expiresAt) return this.token;\n const cached = await this.readCachedToken();\n if (cached) return cached;\n if (this.inflight) return this.inflight;\n this.inflight = this.acquire().finally(() => {\n this.inflight = null;\n });\n return this.inflight;\n }\n\n private async acquire(): Promise<string> {\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.opts.clientId,\n client_secret: this.opts.clientSecret,\n scope: this.opts.scope,\n });\n const res = await this.opts.fetchImpl(this.opts.tokenEndpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n if (!res.ok) {\n // Do NOT include the response body verbatim — avoid leaking secrets/echoes.\n throw new DocmanaAuthError(\"Failed to acquire Docmana access token\", { status: res.status });\n }\n const json = (await res.json()) as Partial<{ access_token: string; expires_in: number }>;\n if (\n typeof json.access_token !== \"string\" ||\n json.access_token.length === 0 ||\n typeof json.expires_in !== \"number\" ||\n !Number.isFinite(json.expires_in)\n ) {\n throw new DocmanaAuthError(\"Malformed token response from Docmana CIAM\", {\n status: res.status,\n });\n }\n this.token = json.access_token;\n this.expiresAt = Date.now() + json.expires_in * 1000 - SAFETY_MARGIN_MS;\n await this.writeCachedToken().catch(() => undefined);\n return this.token;\n }\n\n private async readCachedToken(): Promise<string | null> {\n if (!this.opts.tokenCache) return null;\n let entry: TokenCacheEntry | null;\n try {\n entry = await this.opts.tokenCache.read();\n } catch {\n return null;\n }\n if (!entry) return null;\n if (\n entry.clientId !== this.opts.clientId ||\n entry.tokenEndpoint !== this.opts.tokenEndpoint ||\n entry.scope !== this.opts.scope ||\n Date.now() >= entry.expiresAt\n ) {\n await this.opts.tokenCache.clear().catch(() => undefined);\n return null;\n }\n this.token = entry.accessToken;\n this.expiresAt = entry.expiresAt;\n return this.token;\n }\n\n private async writeCachedToken(): Promise<void> {\n if (!this.opts.tokenCache || !this.token) return;\n await this.opts.tokenCache.write({\n accessToken: this.token,\n expiresAt: this.expiresAt,\n clientId: this.opts.clientId,\n tokenEndpoint: this.opts.tokenEndpoint,\n scope: this.opts.scope,\n });\n }\n}\n","import type { TokenManager } from \"../auth/token-manager.js\";\nimport { DocmanaError, DocmanaAbortError, errorFromResponse } from \"../errors.js\";\n\nexport interface HttpClientOptions {\n apiBaseUrl: string;\n fetchImpl: typeof fetch;\n tokenManager: TokenManager;\n headers?: Record<string, string>;\n}\n\ntype FetchBody = NonNullable<Parameters<typeof fetch>[1]>[\"body\"];\n\nexport interface RequestOptions {\n query?: Record<string, string>;\n body?: FetchBody;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport class HttpClient {\n constructor(private readonly opts: HttpClientOptions) {}\n\n async requestJson<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const res = await this.requestRaw(method, path, options);\n const text = await res.text();\n if (!text) return {} as T;\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new DocmanaError(\"Invalid JSON response from Docmana\", { status: res.status });\n }\n }\n\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n let res = await this.send(method, path, options);\n if (res.status === 401) {\n this.opts.tokenManager.invalidate();\n res = await this.send(method, path, options);\n }\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const message = await this.extractMessage(res);\n throw errorFromResponse(res.status, message, requestId);\n }\n return res;\n }\n\n private async send(method: string, path: string, options: RequestOptions): Promise<Response> {\n const token = await this.opts.tokenManager.getToken();\n const url = new URL(this.opts.apiBaseUrl + path);\n for (const [k, v] of Object.entries(options.query ?? {})) url.searchParams.set(k, v);\n const headers: Record<string, string> = {\n ...(this.opts.headers ?? {}),\n authorization: `Bearer ${token}`,\n ...(options.headers ?? {}),\n };\n try {\n return await this.opts.fetchImpl(url, {\n method,\n headers,\n body: options.body,\n signal: options.signal,\n });\n } catch (err) {\n if (options.signal?.aborted || (err instanceof Error && err.name === \"AbortError\")) {\n throw new DocmanaAbortError(\"Request aborted\");\n }\n throw err;\n }\n }\n\n private async extractMessage(res: Response): Promise<string> {\n try {\n const data = (await res.clone().json()) as { message?: string; error?: string };\n return data.message ?? data.error ?? res.statusText ?? `HTTP ${res.status}`;\n } catch {\n return res.statusText ?? `HTTP ${res.status}`;\n }\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport type { FileInput, RunFlowInput } from \"../types.js\";\n\nexport interface ResolvedPart {\n data: Blob;\n filename: string;\n contentType: string;\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".tif\": \"image/tiff\",\n \".tiff\": \"image/tiff\",\n \".txt\": \"text/plain\",\n \".json\": \"application/json\",\n};\n\nfunction contentTypeFor(name: string): string {\n const dot = name.lastIndexOf(\".\");\n if (dot < 0) return \"application/octet-stream\";\n const ext = name.slice(dot).toLowerCase();\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction isReadable(x: unknown): x is Readable {\n return typeof x === \"object\" && x !== null && typeof (x as Readable).pipe === \"function\";\n}\n\nfunction isPathInput(x: unknown): x is { path: string } {\n return typeof x === \"object\" && x !== null && typeof (x as { path?: unknown }).path === \"string\";\n}\n\nasync function streamToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) chunks.push(Buffer.from(chunk));\n return Buffer.concat(chunks);\n}\n\nasync function resolveOne(input: FileInput, fallbackName: string): Promise<ResolvedPart> {\n if (typeof input === \"string\" || isPathInput(input)) {\n const path = typeof input === \"string\" ? input : input.path;\n const data = await readFile(path);\n const filename = basename(path);\n return { data: new Blob([data]), filename, contentType: contentTypeFor(filename) };\n }\n if (input instanceof Uint8Array) {\n return {\n data: new Blob([input]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n if (isReadable(input)) {\n const buf = await streamToBuffer(input);\n return {\n data: new Blob([buf]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n throw new Error(\"Unsupported file input type\");\n}\n\nexport async function resolveInputs(input: RunFlowInput): Promise<ResolvedPart[]> {\n const list: FileInput[] = input.files ?? (input.file !== undefined ? [input.file] : []);\n if (list.length === 0) throw new Error(\"runFlow requires `file` or `files`\");\n const fallback = input.fileName ?? \"upload.bin\";\n return Promise.all(list.map((item) => resolveOne(item, fallback)));\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ResolvedPart } from \"../files/resolve-input.js\";\n\nexport async function uploadFiles(\n http: HttpClient,\n parts: ResolvedPart[],\n signal?: AbortSignal,\n): Promise<string[]> {\n const ids: string[] = [];\n for (const part of parts) {\n const form = new FormData();\n form.append(\"files\", new File([part.data], part.filename, { type: part.contentType }));\n const res = await http.requestJson<{ id: string }>(\"POST\", \"/upload\", { body: form, signal });\n ids.push(res.id);\n }\n return ids;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\n\nexport async function runFlow(\n http: HttpClient,\n flowId: string,\n uuidFiles: string[],\n signal?: AbortSignal,\n once = false,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const res = await http.requestJson<{ execution_result_id: string }>(\"POST\", path, {\n query: { async_mode: \"true\" },\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ uuid_files: uuidFiles }),\n signal,\n });\n return res.execution_result_id;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ExecutionStatus } from \"../types.js\";\n\nexport async function getStatus(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<{ status: ExecutionStatus | string }> {\n return http.requestJson(\"GET\", `/flows/execution-status/${executionResultId}`, { signal });\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\n\nexport async function getResult(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<DocmanaApiExecutionResult> {\n return http.requestJson(\"GET\", `/flows/execution-result/${executionResultId}`, { signal });\n}\n","import { DocmanaTimeoutError, DocmanaAbortError } from \"../errors.js\";\n\nconst TERMINAL = new Set([\"Completed\", \"Failed\"]);\n\nexport interface PollOptions {\n check: () => Promise<string>;\n intervalMs: number;\n timeoutMs: number;\n sleep?: (ms: number) => Promise<void>;\n elapsed?: () => number;\n signal?: AbortSignal;\n}\n\nconst defaultSleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\nexport async function pollUntilTerminal(opts: PollOptions): Promise<string> {\n const sleep = opts.sleep ?? defaultSleep;\n const start = Date.now();\n const elapsed = opts.elapsed ?? (() => Date.now() - start);\n for (;;) {\n if (opts.signal?.aborted) throw new DocmanaAbortError(\"Polling aborted\");\n const status = await opts.check();\n if (TERMINAL.has(status)) return status;\n if (elapsed() >= opts.timeoutMs) {\n throw new DocmanaTimeoutError(`Execution did not finish within ${opts.timeoutMs}ms`);\n }\n await sleep(opts.intervalMs);\n }\n}\n","import { DocmanaError } from \"../errors.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\nimport type { DocmanaApiNodeResult } from \"../models/docmana-api-node-result.model.js\";\nimport type { DocmanaExecutionResult } from \"../models/docmana-execution-result.model.js\";\nimport type { DocmanaDocumentResult } from \"../models/docmana-document-result.model.js\";\nimport type { DocmanaNodeResult } from \"../models/docmana-node-result.model.js\";\nimport type { DocmanaScoreNodeResult } from \"../models/docmana-score-node-result.model.js\";\nimport type { DocmanaCrossValidationResult } from \"../models/docmana-cross-validation-result.model.js\";\nimport type { DocmanaConclusionResult } from \"../models/docmana-conclusion-result.model.js\";\n\nfunction extractNodeFields(\n rawNode: DocmanaApiNodeResult,\n targetLanguage?: string,\n): DocmanaNodeResult {\n const metadataFields = new Set([\n \"node_id\",\n \"node_name\",\n \"node_type\",\n \"feature_name\",\n \"running_time\",\n \"status\",\n \"score\",\n \"feedback\",\n \"translations\",\n \"tokens\",\n \"input_tokens\",\n \"output_tokens\",\n \"errors\",\n \"mana\",\n \"model\",\n \"tool_calls\",\n \"prompt_id\",\n \"prompt\",\n \"prompt_name\",\n \"label\",\n \"scoreDescription\",\n \"score_description\",\n \"result\",\n \"documentType\",\n ]);\n\n let sourceObj: Record<string, unknown> = rawNode;\n if (targetLanguage) {\n const translations = rawNode.translations;\n if (!translations || !translations[targetLanguage]) {\n throw new DocmanaError(\n `Translation for language '${targetLanguage}' is missing on node '${rawNode.node_name || rawNode.node_id}'`,\n { code: \"translation_missing\", status: 400 },\n );\n }\n sourceObj = translations[targetLanguage] as Record<string, unknown>;\n }\n\n const dynamicFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(sourceObj)) {\n if (!metadataFields.has(key)) {\n dynamicFields[key] = value;\n }\n }\n\n const sdkNode: DocmanaScoreNodeResult = {\n status: rawNode.status || \"Unknown\",\n };\n\n if (rawNode.errors && rawNode.errors.length > 0) {\n sdkNode.errors = rawNode.errors;\n }\n\n const nodeType = rawNode.node_type || \"\";\n const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion)$/i.test(nodeType);\n if (isScoreNode) {\n if (rawNode.score !== undefined && rawNode.score !== null) {\n sdkNode.score = rawNode.score;\n }\n if (rawNode.feedback !== undefined && rawNode.feedback !== null) {\n sdkNode.feedback = rawNode.feedback;\n }\n }\n\n if (Object.keys(dynamicFields).length > 0) {\n sdkNode.data = dynamicFields;\n }\n\n return sdkNode;\n}\n\nexport function mapExecutionResult(\n raw: DocmanaApiExecutionResult,\n targetLanguage?: string,\n): DocmanaExecutionResult {\n const sdkResult: DocmanaExecutionResult = {\n status: raw.status || \"Unknown\",\n executionId: String(raw.execution_id || raw.executionResultId || raw.execution_result_id || \"\"),\n documents: {\n mappings: [],\n },\n };\n\n if (raw.errors && raw.errors.length > 0) {\n sdkResult.errors = raw.errors;\n }\n\n const results = raw.results || [];\n\n for (const item of results) {\n const isDocSpecific = !!item.document;\n\n if (isDocSpecific && item.document) {\n const docReq = item.document;\n const docKey = docReq.doc_key || \"unknown_doc\";\n const docName = docReq.name || \"\";\n\n sdkResult.documents.mappings.push({\n name: docName,\n reference: docKey,\n });\n\n const docResult: DocmanaDocumentResult = {\n status: item.status || docReq.status || \"Unknown\",\n extractions: {},\n validations: {},\n };\n\n const nodeResults = item.node_results || [];\n\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^Classification$/i.test(nodeType)) {\n const mappedNode = extractNodeFields(node, targetLanguage);\n if (!docResult.classifications) {\n docResult.classifications = {};\n }\n docResult.classifications[nodeName] = mappedNode;\n } else if (/^MetadataExtraction$/i.test(nodeType)) {\n docResult.metadataExtraction = extractNodeFields(node, targetLanguage);\n } else if (/^Extraction$/i.test(nodeType)) {\n if (docResult.extractions) {\n docResult.extractions[nodeName] = extractNodeFields(node, targetLanguage);\n }\n } else if (/^Validation$/i.test(nodeType)) {\n if (docResult.validations) {\n docResult.validations[nodeName] = extractNodeFields(node, targetLanguage);\n }\n }\n }\n\n if (docResult.extractions && Object.keys(docResult.extractions).length === 0) {\n delete docResult.extractions;\n }\n if (docResult.validations && Object.keys(docResult.validations).length === 0) {\n delete docResult.validations;\n }\n\n sdkResult.documents[docKey] = docResult;\n } else {\n const nodeResults = item.node_results || [];\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^CrossValidation$/i.test(nodeType)) {\n if (!sdkResult.crossValidations) {\n sdkResult.crossValidations = {};\n }\n sdkResult.crossValidations[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaCrossValidationResult;\n } else if (/^(Conclusion|Finish)$/i.test(nodeType)) {\n if (!sdkResult.conclusions) {\n sdkResult.conclusions = {};\n }\n sdkResult.conclusions[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaConclusionResult;\n }\n }\n }\n }\n\n return sdkResult;\n}\n","import { resolveConfig } from \"./config.js\";\nimport type { ResolvedConfig } from \"./config.js\";\nimport type {\n DocmanaConfig,\n DocmanaExecutionResult,\n ExecutionStatus,\n RunFlowInput,\n} from \"./types.js\";\nimport { TokenManager } from \"./auth/token-manager.js\";\nimport { HttpClient } from \"./http/http-client.js\";\nimport { resolveInputs } from \"./files/resolve-input.js\";\nimport { uploadFiles } from \"./api/upload.js\";\nimport { runFlow as runFlowApi } from \"./api/run-flow.js\";\nimport { getStatus as getStatusApi } from \"./api/execution-status.js\";\nimport { getResult as getResultApi } from \"./api/execution-result.js\";\nimport { pollUntilTerminal } from \"./polling/poll.js\";\nimport { DocmanaExecutionError } from \"./errors.js\";\nimport { mapExecutionResult } from \"./mappers/index.js\";\n\nexport class Docmana {\n private readonly config: ResolvedConfig;\n private readonly http: HttpClient;\n\n constructor(config: DocmanaConfig) {\n this.config = resolveConfig(config);\n const tokenManager = new TokenManager({\n clientId: this.config.clientId,\n clientSecret: this.config.clientSecret,\n tokenEndpoint: this.config.tokenEndpoint,\n scope: this.config.scope,\n fetchImpl: this.config.fetchImpl,\n tokenCache: this.config.tokenCache,\n });\n this.http = new HttpClient({\n apiBaseUrl: this.config.apiBaseUrl,\n fetchImpl: this.config.fetchImpl,\n tokenManager,\n headers: this.config.headers,\n });\n }\n\n async runFlowAsync(\n flowId: string,\n input: RunFlowInput,\n ): Promise<{ executionResultId: string; fileIds: string[] }> {\n const parts = await resolveInputs(input);\n const fileIds = await uploadFiles(this.http, parts, input.signal);\n const executionResultId = await runFlowApi(\n this.http,\n flowId,\n fileIds,\n input.signal,\n input.once ?? false,\n );\n return { executionResultId, fileIds };\n }\n\n async getStatus(\n executionResultId: string,\n signal?: AbortSignal,\n ): Promise<{ status: ExecutionStatus | string }> {\n return getStatusApi(this.http, executionResultId, signal);\n }\n\n async getResult(\n executionResultId: string,\n signal?: AbortSignal,\n language?: string,\n ): Promise<DocmanaExecutionResult> {\n const rawResult = await getResultApi(this.http, executionResultId, signal);\n return mapExecutionResult(rawResult, language);\n }\n\n async runFlow(flowId: string, input: RunFlowInput): Promise<DocmanaExecutionResult> {\n const { executionResultId } = await this.runFlowAsync(flowId, input);\n await pollUntilTerminal({\n check: async () => (await this.getStatus(executionResultId, input.signal)).status,\n intervalMs: input.pollIntervalMs ?? this.config.pollIntervalMs,\n timeoutMs: input.timeoutMs ?? this.config.timeoutMs,\n signal: input.signal,\n });\n const result = await this.getResult(executionResultId, input.signal, input.language);\n if (result.status === \"Failed\") {\n throw new DocmanaExecutionError(\n `Flow ${flowId} execution failed`,\n result.errors ?? [],\n result,\n );\n }\n return result;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/auth/token-manager.ts","../src/http/http-client.ts","../src/files/resolve-input.ts","../src/api/upload.ts","../src/api/run-flow.ts","../src/api/execution-status.ts","../src/api/execution-result.ts","../src/polling/poll.ts","../src/mappers/mapper.ts","../src/client.ts"],"sourcesContent":["import type { DocmanaConfig } from \"./types.js\";\nimport type { TokenCache } from \"./types.js\";\n\nexport const DEFAULTS = {\n apiBaseUrl: \"https://api.docmana.ai\",\n tokenEndpoint:\n \"https://4fe70f5b-e013-4f65-9fa7-3109a33beba5.ciamlogin.com/4fe70f5b-e013-4f65-9fa7-3109a33beba5/oauth2/v2.0/token\",\n scope: \"api://d781e6ba-cc08-4618-8099-ad968abd2b9e/.default\",\n timeoutMs: 300_000,\n pollIntervalMs: 2_000,\n} as const;\n\nexport interface ResolvedConfig {\n clientId: string;\n clientSecret: string;\n apiBaseUrl: string;\n tokenEndpoint: string;\n scope: string;\n timeoutMs: number;\n pollIntervalMs: number;\n fetchImpl: typeof fetch;\n headers: Record<string, string>;\n tokenCache?: TokenCache;\n}\n\nexport function resolveConfig(config: DocmanaConfig): ResolvedConfig {\n if (!config.clientId) throw new Error(\"DocmanaConfig.clientId is required\");\n if (!config.clientSecret) throw new Error(\"DocmanaConfig.clientSecret is required\");\n const apiBaseUrl = (config.apiBaseUrl ?? DEFAULTS.apiBaseUrl).replace(/\\/+$/, \"\");\n return {\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n apiBaseUrl,\n tokenEndpoint: config.tokenEndpoint ?? DEFAULTS.tokenEndpoint,\n scope: config.scope ?? DEFAULTS.scope,\n timeoutMs: config.timeoutMs ?? DEFAULTS.timeoutMs,\n pollIntervalMs: config.pollIntervalMs ?? DEFAULTS.pollIntervalMs,\n fetchImpl: config.fetch ?? fetch,\n headers: config.headers ?? {},\n tokenCache: config.tokenCache,\n };\n}\n","import type { DocmanaExecutionResult } from \"./models/docmana-execution-result.model.js\";\n\nexport class DocmanaError extends Error {\n readonly status?: number;\n readonly requestId?: string;\n readonly code: string;\n constructor(message: string, opts: { status?: number; requestId?: string; code?: string } = {}) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.requestId = opts.requestId;\n this.code = opts.code ?? \"docmana_error\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class DocmanaAuthError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"auth_error\" });\n }\n}\n\nexport class DocmanaPermissionError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"permission_error\" });\n }\n}\n\nexport class DocmanaNotFoundError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"not_found\" });\n }\n}\n\nexport class DocmanaRequestError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"bad_request\" });\n }\n}\n\nexport class DocmanaExecutionError extends DocmanaError {\n readonly errors: unknown[];\n readonly result?: DocmanaExecutionResult;\n constructor(message: string, errors: unknown[] = [], result?: DocmanaExecutionResult) {\n super(message, { code: \"execution_failed\" });\n this.errors = errors;\n this.result = result;\n }\n}\n\nexport class DocmanaTimeoutError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"timeout\" });\n }\n}\n\nexport class DocmanaAbortError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"aborted\" });\n }\n}\n\nexport function errorFromResponse(\n status: number,\n message: string,\n requestId?: string,\n): DocmanaError {\n const opts = { status, requestId };\n switch (status) {\n case 400:\n return new DocmanaRequestError(message, opts);\n case 401:\n return new DocmanaAuthError(message, opts);\n case 403:\n return new DocmanaPermissionError(message, opts);\n case 404:\n return new DocmanaNotFoundError(message, opts);\n default:\n return new DocmanaError(message, opts);\n }\n}\n","import { DocmanaAuthError } from \"../errors.js\";\nimport type { TokenCache, TokenCacheEntry } from \"../types.js\";\n\nconst SAFETY_MARGIN_MS = 60_000;\n\nexport interface TokenManagerOptions {\n clientId: string;\n clientSecret: string;\n tokenEndpoint: string;\n scope: string;\n fetchImpl: typeof fetch;\n tokenCache?: TokenCache;\n}\n\nexport class TokenManager {\n private token: string | null = null;\n private expiresAt = 0;\n private inflight: Promise<string> | null = null;\n\n constructor(private readonly opts: TokenManagerOptions) {}\n\n invalidate(): void {\n this.token = null;\n this.expiresAt = 0;\n void this.opts.tokenCache?.clear().catch(() => undefined);\n }\n\n async getToken(): Promise<string> {\n if (this.token && Date.now() < this.expiresAt) return this.token;\n const cached = await this.readCachedToken();\n if (cached) return cached;\n if (this.inflight) return this.inflight;\n this.inflight = this.acquire().finally(() => {\n this.inflight = null;\n });\n return this.inflight;\n }\n\n private async acquire(): Promise<string> {\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.opts.clientId,\n client_secret: this.opts.clientSecret,\n scope: this.opts.scope,\n });\n const res = await this.opts.fetchImpl(this.opts.tokenEndpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n if (!res.ok) {\n // Do NOT include the response body verbatim — avoid leaking secrets/echoes.\n throw new DocmanaAuthError(\"Failed to acquire Docmana access token\", { status: res.status });\n }\n const json = (await res.json()) as Partial<{ access_token: string; expires_in: number }>;\n if (\n typeof json.access_token !== \"string\" ||\n json.access_token.length === 0 ||\n typeof json.expires_in !== \"number\" ||\n !Number.isFinite(json.expires_in)\n ) {\n throw new DocmanaAuthError(\"Malformed token response from Docmana CIAM\", {\n status: res.status,\n });\n }\n this.token = json.access_token;\n this.expiresAt = Date.now() + json.expires_in * 1000 - SAFETY_MARGIN_MS;\n await this.writeCachedToken().catch(() => undefined);\n return this.token;\n }\n\n private async readCachedToken(): Promise<string | null> {\n if (!this.opts.tokenCache) return null;\n let entry: TokenCacheEntry | null;\n try {\n entry = await this.opts.tokenCache.read();\n } catch {\n return null;\n }\n if (!entry) return null;\n if (\n entry.clientId !== this.opts.clientId ||\n entry.tokenEndpoint !== this.opts.tokenEndpoint ||\n entry.scope !== this.opts.scope ||\n Date.now() >= entry.expiresAt\n ) {\n await this.opts.tokenCache.clear().catch(() => undefined);\n return null;\n }\n this.token = entry.accessToken;\n this.expiresAt = entry.expiresAt;\n return this.token;\n }\n\n private async writeCachedToken(): Promise<void> {\n if (!this.opts.tokenCache || !this.token) return;\n await this.opts.tokenCache.write({\n accessToken: this.token,\n expiresAt: this.expiresAt,\n clientId: this.opts.clientId,\n tokenEndpoint: this.opts.tokenEndpoint,\n scope: this.opts.scope,\n });\n }\n}\n","import type { TokenManager } from \"../auth/token-manager.js\";\nimport { DocmanaError, DocmanaAbortError, errorFromResponse } from \"../errors.js\";\n\nexport interface HttpClientOptions {\n apiBaseUrl: string;\n fetchImpl: typeof fetch;\n tokenManager: TokenManager;\n headers?: Record<string, string>;\n}\n\ntype FetchBody = NonNullable<Parameters<typeof fetch>[1]>[\"body\"];\n\nexport interface RequestOptions {\n query?: Record<string, string>;\n body?: FetchBody;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport class HttpClient {\n constructor(private readonly opts: HttpClientOptions) {}\n\n async requestJson<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const res = await this.requestRaw(method, path, options);\n const text = await res.text();\n if (!text) return {} as T;\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new DocmanaError(\"Invalid JSON response from Docmana\", { status: res.status });\n }\n }\n\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n let res = await this.send(method, path, options);\n if (res.status === 401) {\n this.opts.tokenManager.invalidate();\n res = await this.send(method, path, options);\n }\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const message = await this.extractMessage(res);\n throw errorFromResponse(res.status, message, requestId);\n }\n return res;\n }\n\n private async send(method: string, path: string, options: RequestOptions): Promise<Response> {\n const token = await this.opts.tokenManager.getToken();\n const url = new URL(this.opts.apiBaseUrl + path);\n for (const [k, v] of Object.entries(options.query ?? {})) url.searchParams.set(k, v);\n const headers: Record<string, string> = {\n ...(this.opts.headers ?? {}),\n authorization: `Bearer ${token}`,\n ...(options.headers ?? {}),\n };\n try {\n return await this.opts.fetchImpl(url, {\n method,\n headers,\n body: options.body,\n signal: options.signal,\n });\n } catch (err) {\n if (options.signal?.aborted || (err instanceof Error && err.name === \"AbortError\")) {\n throw new DocmanaAbortError(\"Request aborted\");\n }\n throw err;\n }\n }\n\n private async extractMessage(res: Response): Promise<string> {\n try {\n const data = (await res.clone().json()) as { message?: string; error?: string };\n return data.message ?? data.error ?? res.statusText ?? `HTTP ${res.status}`;\n } catch {\n return res.statusText ?? `HTTP ${res.status}`;\n }\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport type { FileInput, RunFlowInput } from \"../types.js\";\n\nexport interface ResolvedPart {\n data: Blob;\n filename: string;\n contentType: string;\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".tif\": \"image/tiff\",\n \".tiff\": \"image/tiff\",\n \".txt\": \"text/plain\",\n \".json\": \"application/json\",\n};\n\nfunction contentTypeFor(name: string): string {\n const dot = name.lastIndexOf(\".\");\n if (dot < 0) return \"application/octet-stream\";\n const ext = name.slice(dot).toLowerCase();\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction isReadable(x: unknown): x is Readable {\n return typeof x === \"object\" && x !== null && typeof (x as Readable).pipe === \"function\";\n}\n\nfunction isPathInput(x: unknown): x is { path: string } {\n return typeof x === \"object\" && x !== null && typeof (x as { path?: unknown }).path === \"string\";\n}\n\nasync function streamToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) chunks.push(Buffer.from(chunk));\n return Buffer.concat(chunks);\n}\n\nasync function resolveOne(input: FileInput, fallbackName: string): Promise<ResolvedPart> {\n if (typeof input === \"string\" || isPathInput(input)) {\n const path = typeof input === \"string\" ? input : input.path;\n const data = await readFile(path);\n const filename = basename(path);\n return { data: new Blob([data]), filename, contentType: contentTypeFor(filename) };\n }\n if (input instanceof Uint8Array) {\n return {\n data: new Blob([input]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n if (isReadable(input)) {\n const buf = await streamToBuffer(input);\n return {\n data: new Blob([buf]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n throw new Error(\"Unsupported file input type\");\n}\n\nexport async function resolveInputs(input: RunFlowInput): Promise<ResolvedPart[]> {\n const list: FileInput[] = input.files ?? (input.file !== undefined ? [input.file] : []);\n if (list.length === 0) throw new Error(\"runFlow requires `file` or `files`\");\n const fallback = input.fileName ?? \"upload.bin\";\n return Promise.all(list.map((item) => resolveOne(item, fallback)));\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ResolvedPart } from \"../files/resolve-input.js\";\n\nexport async function uploadFiles(\n http: HttpClient,\n parts: ResolvedPart[],\n signal?: AbortSignal,\n): Promise<string[]> {\n // The /upload endpoint accepts multiple files in a SINGLE call and returns one\n // folder UUID holding all of them. Uploading every file in its own call would\n // make Docmana treat each file as a separate document, which breaks flows that\n // process several documents together (the graph builder reuses the same node per\n // document -> \"Node already present\"). So we send every part in one request.\n const form = new FormData();\n for (const part of parts) {\n form.append(\"files\", new File([part.data], part.filename, { type: part.contentType }));\n }\n const res = await http.requestJson<{ id: string }>(\"POST\", \"/upload\", { body: form, signal });\n return [res.id];\n}\n","import type { HttpClient } from \"../http/http-client.js\";\n\nexport async function runFlow(\n http: HttpClient,\n flowId: string,\n uuidFiles: string[],\n signal?: AbortSignal,\n once = false,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const res = await http.requestJson<{ execution_result_id: string }>(\"POST\", path, {\n query: { async_mode: \"true\" },\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ uuid_files: uuidFiles }),\n signal,\n });\n return res.execution_result_id;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ExecutionStatus } from \"../types.js\";\n\nexport async function getStatus(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<{ status: ExecutionStatus | string }> {\n return http.requestJson(\"GET\", `/flows/execution-status/${executionResultId}`, { signal });\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\n\nexport async function getResult(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<DocmanaApiExecutionResult> {\n return http.requestJson(\"GET\", `/flows/execution-result/${executionResultId}`, { signal });\n}\n","import { DocmanaTimeoutError, DocmanaAbortError } from \"../errors.js\";\n\nconst TERMINAL = new Set([\"Completed\", \"Failed\"]);\n\nexport interface PollOptions {\n check: () => Promise<string>;\n intervalMs: number;\n timeoutMs: number;\n sleep?: (ms: number) => Promise<void>;\n elapsed?: () => number;\n signal?: AbortSignal;\n}\n\nconst defaultSleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\nexport async function pollUntilTerminal(opts: PollOptions): Promise<string> {\n const sleep = opts.sleep ?? defaultSleep;\n const start = Date.now();\n const elapsed = opts.elapsed ?? (() => Date.now() - start);\n for (;;) {\n if (opts.signal?.aborted) throw new DocmanaAbortError(\"Polling aborted\");\n const status = await opts.check();\n if (TERMINAL.has(status)) return status;\n if (elapsed() >= opts.timeoutMs) {\n throw new DocmanaTimeoutError(`Execution did not finish within ${opts.timeoutMs}ms`);\n }\n await sleep(opts.intervalMs);\n }\n}\n","import { DocmanaError } from \"../errors.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\nimport type { DocmanaApiNodeResult } from \"../models/docmana-api-node-result.model.js\";\nimport type { DocmanaExecutionResult } from \"../models/docmana-execution-result.model.js\";\nimport type { DocmanaDocumentResult } from \"../models/docmana-document-result.model.js\";\nimport type { DocmanaNodeResult } from \"../models/docmana-node-result.model.js\";\nimport type { DocmanaScoreNodeResult } from \"../models/docmana-score-node-result.model.js\";\nimport type { DocmanaCrossValidationResult } from \"../models/docmana-cross-validation-result.model.js\";\nimport type { DocmanaConclusionResult } from \"../models/docmana-conclusion-result.model.js\";\n\nfunction extractNodeFields(\n rawNode: DocmanaApiNodeResult,\n targetLanguage?: string,\n): DocmanaNodeResult {\n const metadataFields = new Set([\n \"node_id\",\n \"node_name\",\n \"node_type\",\n \"feature_name\",\n \"running_time\",\n \"status\",\n \"score\",\n \"feedback\",\n \"translations\",\n \"tokens\",\n \"input_tokens\",\n \"output_tokens\",\n \"errors\",\n \"mana\",\n \"model\",\n \"tool_calls\",\n \"prompt_id\",\n \"prompt\",\n \"prompt_name\",\n \"label\",\n \"scoreDescription\",\n \"score_description\",\n \"result\",\n \"documentType\",\n ]);\n\n let sourceObj: Record<string, unknown> = rawNode;\n if (targetLanguage) {\n const translations = rawNode.translations;\n if (!translations || !translations[targetLanguage]) {\n throw new DocmanaError(\n `Translation for language '${targetLanguage}' is missing on node '${rawNode.node_name || rawNode.node_id}'`,\n { code: \"translation_missing\", status: 400 },\n );\n }\n sourceObj = translations[targetLanguage] as Record<string, unknown>;\n }\n\n const dynamicFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(sourceObj)) {\n if (!metadataFields.has(key)) {\n dynamicFields[key] = value;\n }\n }\n\n const sdkNode: DocmanaScoreNodeResult = {\n status: rawNode.status || \"Unknown\",\n };\n\n if (rawNode.errors && rawNode.errors.length > 0) {\n sdkNode.errors = rawNode.errors;\n }\n\n const nodeType = rawNode.node_type || \"\";\n const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion)$/i.test(nodeType);\n if (isScoreNode) {\n if (rawNode.score !== undefined && rawNode.score !== null) {\n sdkNode.score = rawNode.score;\n }\n if (rawNode.feedback !== undefined && rawNode.feedback !== null) {\n sdkNode.feedback = rawNode.feedback;\n }\n }\n\n if (Object.keys(dynamicFields).length > 0) {\n sdkNode.data = dynamicFields;\n }\n\n return sdkNode;\n}\n\nexport function mapExecutionResult(\n raw: DocmanaApiExecutionResult,\n targetLanguage?: string,\n): DocmanaExecutionResult {\n const sdkResult: DocmanaExecutionResult = {\n status: raw.status || \"Unknown\",\n executionId: String(raw.execution_id || raw.executionResultId || raw.execution_result_id || \"\"),\n documents: {\n mappings: [],\n },\n };\n\n if (raw.errors && raw.errors.length > 0) {\n sdkResult.errors = raw.errors;\n }\n\n const results = raw.results || [];\n\n for (const item of results) {\n const isDocSpecific = !!item.document;\n\n if (isDocSpecific && item.document) {\n const docReq = item.document;\n const docKey = docReq.doc_key || \"unknown_doc\";\n const docName = docReq.name || \"\";\n\n sdkResult.documents.mappings.push({\n name: docName,\n reference: docKey,\n });\n\n const docResult: DocmanaDocumentResult = {\n status: item.status || docReq.status || \"Unknown\",\n extractions: {},\n validations: {},\n };\n\n const nodeResults = item.node_results || [];\n\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^Classification$/i.test(nodeType)) {\n const mappedNode = extractNodeFields(node, targetLanguage);\n if (!docResult.classifications) {\n docResult.classifications = {};\n }\n docResult.classifications[nodeName] = mappedNode;\n } else if (/^MetadataExtraction$/i.test(nodeType)) {\n docResult.metadataExtraction = extractNodeFields(node, targetLanguage);\n } else if (/^Extraction$/i.test(nodeType)) {\n if (docResult.extractions) {\n docResult.extractions[nodeName] = extractNodeFields(node, targetLanguage);\n }\n } else if (/^Validation$/i.test(nodeType)) {\n if (docResult.validations) {\n docResult.validations[nodeName] = extractNodeFields(node, targetLanguage);\n }\n }\n }\n\n if (docResult.extractions && Object.keys(docResult.extractions).length === 0) {\n delete docResult.extractions;\n }\n if (docResult.validations && Object.keys(docResult.validations).length === 0) {\n delete docResult.validations;\n }\n\n sdkResult.documents[docKey] = docResult;\n } else {\n const nodeResults = item.node_results || [];\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^CrossValidation$/i.test(nodeType)) {\n if (!sdkResult.crossValidations) {\n sdkResult.crossValidations = {};\n }\n sdkResult.crossValidations[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaCrossValidationResult;\n } else if (/^(Conclusion|Finish)$/i.test(nodeType)) {\n if (!sdkResult.conclusions) {\n sdkResult.conclusions = {};\n }\n sdkResult.conclusions[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaConclusionResult;\n }\n }\n }\n }\n\n return sdkResult;\n}\n","import { resolveConfig } from \"./config.js\";\nimport type { ResolvedConfig } from \"./config.js\";\nimport type {\n DocmanaConfig,\n DocmanaExecutionResult,\n ExecutionStatus,\n RunFlowInput,\n} from \"./types.js\";\nimport { TokenManager } from \"./auth/token-manager.js\";\nimport { HttpClient } from \"./http/http-client.js\";\nimport { resolveInputs } from \"./files/resolve-input.js\";\nimport { uploadFiles } from \"./api/upload.js\";\nimport { runFlow as runFlowApi } from \"./api/run-flow.js\";\nimport { getStatus as getStatusApi } from \"./api/execution-status.js\";\nimport { getResult as getResultApi } from \"./api/execution-result.js\";\nimport { pollUntilTerminal } from \"./polling/poll.js\";\nimport { DocmanaExecutionError } from \"./errors.js\";\nimport { mapExecutionResult } from \"./mappers/index.js\";\n\nexport class Docmana {\n private readonly config: ResolvedConfig;\n private readonly http: HttpClient;\n\n constructor(config: DocmanaConfig) {\n this.config = resolveConfig(config);\n const tokenManager = new TokenManager({\n clientId: this.config.clientId,\n clientSecret: this.config.clientSecret,\n tokenEndpoint: this.config.tokenEndpoint,\n scope: this.config.scope,\n fetchImpl: this.config.fetchImpl,\n tokenCache: this.config.tokenCache,\n });\n this.http = new HttpClient({\n apiBaseUrl: this.config.apiBaseUrl,\n fetchImpl: this.config.fetchImpl,\n tokenManager,\n headers: this.config.headers,\n });\n }\n\n async runFlowAsync(\n flowId: string,\n input: RunFlowInput,\n ): Promise<{ executionResultId: string; fileIds: string[] }> {\n const parts = await resolveInputs(input);\n const fileIds = await uploadFiles(this.http, parts, input.signal);\n const executionResultId = await runFlowApi(\n this.http,\n flowId,\n fileIds,\n input.signal,\n input.once ?? false,\n );\n return { executionResultId, fileIds };\n }\n\n async getStatus(\n executionResultId: string,\n signal?: AbortSignal,\n ): Promise<{ status: ExecutionStatus | string }> {\n return getStatusApi(this.http, executionResultId, signal);\n }\n\n async getResult(\n executionResultId: string,\n signal?: AbortSignal,\n language?: string,\n ): Promise<DocmanaExecutionResult> {\n const rawResult = await getResultApi(this.http, executionResultId, signal);\n return mapExecutionResult(rawResult, language);\n }\n\n async runFlow(flowId: string, input: RunFlowInput): Promise<DocmanaExecutionResult> {\n const { executionResultId } = await this.runFlowAsync(flowId, input);\n await pollUntilTerminal({\n check: async () => (await this.getStatus(executionResultId, input.signal)).status,\n intervalMs: input.pollIntervalMs ?? this.config.pollIntervalMs,\n timeoutMs: input.timeoutMs ?? this.config.timeoutMs,\n signal: input.signal,\n });\n const result = await this.getResult(executionResultId, input.signal, input.language);\n if (result.status === \"Failed\") {\n throw new DocmanaExecutionError(\n `Flow ${flowId} execution failed`,\n result.errors ?? [],\n result,\n );\n }\n return result;\n }\n}\n"],"mappings":";AAGO,IAAM,WAAW;AAAA,EACtB,YAAY;AAAA,EACZ,eACE;AAAA,EACF,OAAO;AAAA,EACP,WAAW;AAAA,EACX,gBAAgB;AAClB;AAeO,SAAS,cAAc,QAAuC;AACnE,MAAI,CAAC,OAAO,SAAU,OAAM,IAAI,MAAM,oCAAoC;AAC1E,MAAI,CAAC,OAAO,aAAc,OAAM,IAAI,MAAM,wCAAwC;AAClF,QAAM,cAAc,OAAO,cAAc,SAAS,YAAY,QAAQ,QAAQ,EAAE;AAChF,SAAO;AAAA,IACL,UAAU,OAAO;AAAA,IACjB,cAAc,OAAO;AAAA,IACrB;AAAA,IACA,eAAe,OAAO,iBAAiB,SAAS;AAAA,IAChD,OAAO,OAAO,SAAS,SAAS;AAAA,IAChC,WAAW,OAAO,aAAa,SAAS;AAAA,IACxC,gBAAgB,OAAO,kBAAkB,SAAS;AAAA,IAClD,WAAW,OAAO,SAAS;AAAA,IAC3B,SAAS,OAAO,WAAW,CAAC;AAAA,IAC5B,YAAY,OAAO;AAAA,EACrB;AACF;;;ACvCO,IAAM,eAAN,cAA2B,MAAM;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACT,YAAY,SAAiB,OAA+D,CAAC,GAAG;AAC9F,UAAM,OAAO;AACb,SAAK,OAAO,WAAW;AACvB,SAAK,SAAS,KAAK;AACnB,SAAK,YAAY,KAAK;AACtB,SAAK,OAAO,KAAK,QAAQ;AACzB,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AACF;AAEO,IAAM,mBAAN,cAA+B,aAAa;AAAA,EACjD,YAAY,SAAiB,OAAgD,CAAC,GAAG;AAC/E,UAAM,SAAS,EAAE,GAAG,MAAM,MAAM,aAAa,CAAC;AAAA,EAChD;AACF;AAEO,IAAM,yBAAN,cAAqC,aAAa;AAAA,EACvD,YAAY,SAAiB,OAAgD,CAAC,GAAG;AAC/E,UAAM,SAAS,EAAE,GAAG,MAAM,MAAM,mBAAmB,CAAC;AAAA,EACtD;AACF;AAEO,IAAM,uBAAN,cAAmC,aAAa;AAAA,EACrD,YAAY,SAAiB,OAAgD,CAAC,GAAG;AAC/E,UAAM,SAAS,EAAE,GAAG,MAAM,MAAM,YAAY,CAAC;AAAA,EAC/C;AACF;AAEO,IAAM,sBAAN,cAAkC,aAAa;AAAA,EACpD,YAAY,SAAiB,OAAgD,CAAC,GAAG;AAC/E,UAAM,SAAS,EAAE,GAAG,MAAM,MAAM,cAAc,CAAC;AAAA,EACjD;AACF;AAEO,IAAM,wBAAN,cAAoC,aAAa;AAAA,EAC7C;AAAA,EACA;AAAA,EACT,YAAY,SAAiB,SAAoB,CAAC,GAAG,QAAiC;AACpF,UAAM,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC3C,SAAK,SAAS;AACd,SAAK,SAAS;AAAA,EAChB;AACF;AAEO,IAAM,sBAAN,cAAkC,aAAa;AAAA,EACpD,YAAY,SAAiB;AAC3B,UAAM,SAAS,EAAE,MAAM,UAAU,CAAC;AAAA,EACpC;AACF;AAEO,IAAM,oBAAN,cAAgC,aAAa;AAAA,EAClD,YAAY,SAAiB;AAC3B,UAAM,SAAS,EAAE,MAAM,UAAU,CAAC;AAAA,EACpC;AACF;AAEO,SAAS,kBACd,QACA,SACA,WACc;AACd,QAAM,OAAO,EAAE,QAAQ,UAAU;AACjC,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,IAAI,oBAAoB,SAAS,IAAI;AAAA,IAC9C,KAAK;AACH,aAAO,IAAI,iBAAiB,SAAS,IAAI;AAAA,IAC3C,KAAK;AACH,aAAO,IAAI,uBAAuB,SAAS,IAAI;AAAA,IACjD,KAAK;AACH,aAAO,IAAI,qBAAqB,SAAS,IAAI;AAAA,IAC/C;AACE,aAAO,IAAI,aAAa,SAAS,IAAI;AAAA,EACzC;AACF;;;AC7EA,IAAM,mBAAmB;AAWlB,IAAM,eAAN,MAAmB;AAAA,EAKxB,YAA6B,MAA2B;AAA3B;AAAA,EAA4B;AAAA,EAA5B;AAAA,EAJrB,QAAuB;AAAA,EACvB,YAAY;AAAA,EACZ,WAAmC;AAAA,EAI3C,aAAmB;AACjB,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,SAAK,KAAK,KAAK,YAAY,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,EAC1D;AAAA,EAEA,MAAM,WAA4B;AAChC,QAAI,KAAK,SAAS,KAAK,IAAI,IAAI,KAAK,UAAW,QAAO,KAAK;AAC3D,UAAM,SAAS,MAAM,KAAK,gBAAgB;AAC1C,QAAI,OAAQ,QAAO;AACnB,QAAI,KAAK,SAAU,QAAO,KAAK;AAC/B,SAAK,WAAW,KAAK,QAAQ,EAAE,QAAQ,MAAM;AAC3C,WAAK,WAAW;AAAA,IAClB,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,UAA2B;AACvC,UAAM,OAAO,IAAI,gBAAgB;AAAA,MAC/B,YAAY;AAAA,MACZ,WAAW,KAAK,KAAK;AAAA,MACrB,eAAe,KAAK,KAAK;AAAA,MACzB,OAAO,KAAK,KAAK;AAAA,IACnB,CAAC;AACD,UAAM,MAAM,MAAM,KAAK,KAAK,UAAU,KAAK,KAAK,eAAe;AAAA,MAC7D,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,MAC/D,MAAM,KAAK,SAAS;AAAA,IACtB,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AAEX,YAAM,IAAI,iBAAiB,0CAA0C,EAAE,QAAQ,IAAI,OAAO,CAAC;AAAA,IAC7F;AACA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,QACE,OAAO,KAAK,iBAAiB,YAC7B,KAAK,aAAa,WAAW,KAC7B,OAAO,KAAK,eAAe,YAC3B,CAAC,OAAO,SAAS,KAAK,UAAU,GAChC;AACA,YAAM,IAAI,iBAAiB,8CAA8C;AAAA,QACvE,QAAQ,IAAI;AAAA,MACd,CAAC;AAAA,IACH;AACA,SAAK,QAAQ,KAAK;AAClB,SAAK,YAAY,KAAK,IAAI,IAAI,KAAK,aAAa,MAAO;AACvD,UAAM,KAAK,iBAAiB,EAAE,MAAM,MAAM,MAAS;AACnD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,kBAA0C;AACtD,QAAI,CAAC,KAAK,KAAK,WAAY,QAAO;AAClC,QAAI;AACJ,QAAI;AACF,cAAQ,MAAM,KAAK,KAAK,WAAW,KAAK;AAAA,IAC1C,QAAQ;AACN,aAAO;AAAA,IACT;AACA,QAAI,CAAC,MAAO,QAAO;AACnB,QACE,MAAM,aAAa,KAAK,KAAK,YAC7B,MAAM,kBAAkB,KAAK,KAAK,iBAClC,MAAM,UAAU,KAAK,KAAK,SAC1B,KAAK,IAAI,KAAK,MAAM,WACpB;AACA,YAAM,KAAK,KAAK,WAAW,MAAM,EAAE,MAAM,MAAM,MAAS;AACxD,aAAO;AAAA,IACT;AACA,SAAK,QAAQ,MAAM;AACnB,SAAK,YAAY,MAAM;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,mBAAkC;AAC9C,QAAI,CAAC,KAAK,KAAK,cAAc,CAAC,KAAK,MAAO;AAC1C,UAAM,KAAK,KAAK,WAAW,MAAM;AAAA,MAC/B,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK,KAAK;AAAA,MACpB,eAAe,KAAK,KAAK;AAAA,MACzB,OAAO,KAAK,KAAK;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;ACrFO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,MAAyB;AAAzB;AAAA,EAA0B;AAAA,EAA1B;AAAA,EAE7B,MAAM,YAAe,QAAgB,MAAc,UAA0B,CAAC,GAAe;AAC3F,UAAM,MAAM,MAAM,KAAK,WAAW,QAAQ,MAAM,OAAO;AACvD,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI,CAAC,KAAM,QAAO,CAAC;AACnB,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AACN,YAAM,IAAI,aAAa,sCAAsC,EAAE,QAAQ,IAAI,OAAO,CAAC;AAAA,IACrF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAAgB,MAAc,UAA0B,CAAC,GAAsB;AAC9F,QAAI,MAAM,MAAM,KAAK,KAAK,QAAQ,MAAM,OAAO;AAC/C,QAAI,IAAI,WAAW,KAAK;AACtB,WAAK,KAAK,aAAa,WAAW;AAClC,YAAM,MAAM,KAAK,KAAK,QAAQ,MAAM,OAAO;AAAA,IAC7C;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,YAAY,IAAI,QAAQ,IAAI,cAAc,KAAK;AACrD,YAAM,UAAU,MAAM,KAAK,eAAe,GAAG;AAC7C,YAAM,kBAAkB,IAAI,QAAQ,SAAS,SAAS;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,KAAK,QAAgB,MAAc,SAA4C;AAC3F,UAAM,QAAQ,MAAM,KAAK,KAAK,aAAa,SAAS;AACpD,UAAM,MAAM,IAAI,IAAI,KAAK,KAAK,aAAa,IAAI;AAC/C,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,QAAQ,SAAS,CAAC,CAAC,EAAG,KAAI,aAAa,IAAI,GAAG,CAAC;AACnF,UAAM,UAAkC;AAAA,MACtC,GAAI,KAAK,KAAK,WAAW,CAAC;AAAA,MAC1B,eAAe,UAAU,KAAK;AAAA,MAC9B,GAAI,QAAQ,WAAW,CAAC;AAAA,IAC1B;AACA,QAAI;AACF,aAAO,MAAM,KAAK,KAAK,UAAU,KAAK;AAAA,QACpC;AAAA,QACA;AAAA,QACA,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,UAAI,QAAQ,QAAQ,WAAY,eAAe,SAAS,IAAI,SAAS,cAAe;AAClF,cAAM,IAAI,kBAAkB,iBAAiB;AAAA,MAC/C;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,eAAe,KAAgC;AAC3D,QAAI;AACF,YAAM,OAAQ,MAAM,IAAI,MAAM,EAAE,KAAK;AACrC,aAAO,KAAK,WAAW,KAAK,SAAS,IAAI,cAAc,QAAQ,IAAI,MAAM;AAAA,IAC3E,QAAQ;AACN,aAAO,IAAI,cAAc,QAAQ,IAAI,MAAM;AAAA,IAC7C;AAAA,EACF;AACF;;;AC/EA,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AAUzB,IAAM,gBAAwC;AAAA,EAC5C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AACX;AAEA,SAAS,eAAe,MAAsB;AAC5C,QAAM,MAAM,KAAK,YAAY,GAAG;AAChC,MAAI,MAAM,EAAG,QAAO;AACpB,QAAM,MAAM,KAAK,MAAM,GAAG,EAAE,YAAY;AACxC,SAAO,cAAc,GAAG,KAAK;AAC/B;AAEA,SAAS,WAAW,GAA2B;AAC7C,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,OAAQ,EAAe,SAAS;AAChF;AAEA,SAAS,YAAY,GAAmC;AACtD,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,OAAQ,EAAyB,SAAS;AAC1F;AAEA,eAAe,eAAe,QAAmC;AAC/D,QAAM,SAAmB,CAAC;AAC1B,mBAAiB,SAAS,OAAQ,QAAO,KAAK,OAAO,KAAK,KAAK,CAAC;AAChE,SAAO,OAAO,OAAO,MAAM;AAC7B;AAEA,eAAe,WAAW,OAAkB,cAA6C;AACvF,MAAI,OAAO,UAAU,YAAY,YAAY,KAAK,GAAG;AACnD,UAAM,OAAO,OAAO,UAAU,WAAW,QAAQ,MAAM;AACvD,UAAM,OAAO,MAAM,SAAS,IAAI;AAChC,UAAM,WAAW,SAAS,IAAI;AAC9B,WAAO,EAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,aAAa,eAAe,QAAQ,EAAE;AAAA,EACnF;AACA,MAAI,iBAAiB,YAAY;AAC/B,WAAO;AAAA,MACL,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC;AAAA,MACtB,UAAU;AAAA,MACV,aAAa,eAAe,YAAY;AAAA,IAC1C;AAAA,EACF;AACA,MAAI,WAAW,KAAK,GAAG;AACrB,UAAM,MAAM,MAAM,eAAe,KAAK;AACtC,WAAO;AAAA,MACL,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC;AAAA,MACpB,UAAU;AAAA,MACV,aAAa,eAAe,YAAY;AAAA,IAC1C;AAAA,EACF;AACA,QAAM,IAAI,MAAM,6BAA6B;AAC/C;AAEA,eAAsB,cAAc,OAA8C;AAChF,QAAM,OAAoB,MAAM,UAAU,MAAM,SAAS,SAAY,CAAC,MAAM,IAAI,IAAI,CAAC;AACrF,MAAI,KAAK,WAAW,EAAG,OAAM,IAAI,MAAM,oCAAoC;AAC3E,QAAM,WAAW,MAAM,YAAY;AACnC,SAAO,QAAQ,IAAI,KAAK,IAAI,CAAC,SAAS,WAAW,MAAM,QAAQ,CAAC,CAAC;AACnE;;;ACtEA,eAAsB,YACpB,MACA,OACA,QACmB;AAMnB,QAAM,OAAO,IAAI,SAAS;AAC1B,aAAW,QAAQ,OAAO;AACxB,SAAK,OAAO,SAAS,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,KAAK,UAAU,EAAE,MAAM,KAAK,YAAY,CAAC,CAAC;AAAA,EACvF;AACA,QAAM,MAAM,MAAM,KAAK,YAA4B,QAAQ,WAAW,EAAE,MAAM,MAAM,OAAO,CAAC;AAC5F,SAAO,CAAC,IAAI,EAAE;AAChB;;;ACjBA,eAAsB,QACpB,MACA,QACA,WACA,QACA,OAAO,OACU;AACjB,QAAM,OAAO,OAAO,wBAAwB,MAAM,KAAK,mBAAmB,MAAM;AAChF,QAAM,MAAM,MAAM,KAAK,YAA6C,QAAQ,MAAM;AAAA,IAChF,OAAO,EAAE,YAAY,OAAO;AAAA,IAC5B,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,YAAY,UAAU,CAAC;AAAA,IAC9C;AAAA,EACF,CAAC;AACD,SAAO,IAAI;AACb;;;ACdA,eAAsB,UACpB,MACA,mBACA,QAC+C;AAC/C,SAAO,KAAK,YAAY,OAAO,2BAA2B,iBAAiB,IAAI,EAAE,OAAO,CAAC;AAC3F;;;ACNA,eAAsB,UACpB,MACA,mBACA,QACoC;AACpC,SAAO,KAAK,YAAY,OAAO,2BAA2B,iBAAiB,IAAI,EAAE,OAAO,CAAC;AAC3F;;;ACPA,IAAM,WAAW,oBAAI,IAAI,CAAC,aAAa,QAAQ,CAAC;AAWhD,IAAM,eAAe,CAAC,OAAe,IAAI,QAAc,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAE/E,eAAsB,kBAAkB,MAAoC;AAC1E,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,UAAU,KAAK,YAAY,MAAM,KAAK,IAAI,IAAI;AACpD,aAAS;AACP,QAAI,KAAK,QAAQ,QAAS,OAAM,IAAI,kBAAkB,iBAAiB;AACvE,UAAM,SAAS,MAAM,KAAK,MAAM;AAChC,QAAI,SAAS,IAAI,MAAM,EAAG,QAAO;AACjC,QAAI,QAAQ,KAAK,KAAK,WAAW;AAC/B,YAAM,IAAI,oBAAoB,mCAAmC,KAAK,SAAS,IAAI;AAAA,IACrF;AACA,UAAM,MAAM,KAAK,UAAU;AAAA,EAC7B;AACF;;;AClBA,SAAS,kBACP,SACA,gBACmB;AACnB,QAAM,iBAAiB,oBAAI,IAAI;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,YAAqC;AACzC,MAAI,gBAAgB;AAClB,UAAM,eAAe,QAAQ;AAC7B,QAAI,CAAC,gBAAgB,CAAC,aAAa,cAAc,GAAG;AAClD,YAAM,IAAI;AAAA,QACR,6BAA6B,cAAc,yBAAyB,QAAQ,aAAa,QAAQ,OAAO;AAAA,QACxG,EAAE,MAAM,uBAAuB,QAAQ,IAAI;AAAA,MAC7C;AAAA,IACF;AACA,gBAAY,aAAa,cAAc;AAAA,EACzC;AAEA,QAAM,gBAAyC,CAAC;AAChD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACpD,QAAI,CAAC,eAAe,IAAI,GAAG,GAAG;AAC5B,oBAAc,GAAG,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,UAAkC;AAAA,IACtC,QAAQ,QAAQ,UAAU;AAAA,EAC5B;AAEA,MAAI,QAAQ,UAAU,QAAQ,OAAO,SAAS,GAAG;AAC/C,YAAQ,SAAS,QAAQ;AAAA,EAC3B;AAEA,QAAM,WAAW,QAAQ,aAAa;AACtC,QAAM,cAAc,4DAA4D,KAAK,QAAQ;AAC7F,MAAI,aAAa;AACf,QAAI,QAAQ,UAAU,UAAa,QAAQ,UAAU,MAAM;AACzD,cAAQ,QAAQ,QAAQ;AAAA,IAC1B;AACA,QAAI,QAAQ,aAAa,UAAa,QAAQ,aAAa,MAAM;AAC/D,cAAQ,WAAW,QAAQ;AAAA,IAC7B;AAAA,EACF;AAEA,MAAI,OAAO,KAAK,aAAa,EAAE,SAAS,GAAG;AACzC,YAAQ,OAAO;AAAA,EACjB;AAEA,SAAO;AACT;AAEO,SAAS,mBACd,KACA,gBACwB;AACxB,QAAM,YAAoC;AAAA,IACxC,QAAQ,IAAI,UAAU;AAAA,IACtB,aAAa,OAAO,IAAI,gBAAgB,IAAI,qBAAqB,IAAI,uBAAuB,EAAE;AAAA,IAC9F,WAAW;AAAA,MACT,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,MAAI,IAAI,UAAU,IAAI,OAAO,SAAS,GAAG;AACvC,cAAU,SAAS,IAAI;AAAA,EACzB;AAEA,QAAM,UAAU,IAAI,WAAW,CAAC;AAEhC,aAAW,QAAQ,SAAS;AAC1B,UAAM,gBAAgB,CAAC,CAAC,KAAK;AAE7B,QAAI,iBAAiB,KAAK,UAAU;AAClC,YAAM,SAAS,KAAK;AACpB,YAAM,SAAS,OAAO,WAAW;AACjC,YAAM,UAAU,OAAO,QAAQ;AAE/B,gBAAU,UAAU,SAAS,KAAK;AAAA,QAChC,MAAM;AAAA,QACN,WAAW;AAAA,MACb,CAAC;AAED,YAAM,YAAmC;AAAA,QACvC,QAAQ,KAAK,UAAU,OAAO,UAAU;AAAA,QACxC,aAAa,CAAC;AAAA,QACd,aAAa,CAAC;AAAA,MAChB;AAEA,YAAM,cAAc,KAAK,gBAAgB,CAAC;AAE1C,iBAAW,QAAQ,aAAa;AAC9B,cAAM,WAAW,KAAK,aAAa;AACnC,cAAM,WAAW,KAAK,aAAa,KAAK,WAAW;AAEnD,YAAI,oBAAoB,KAAK,QAAQ,GAAG;AACtC,gBAAM,aAAa,kBAAkB,MAAM,cAAc;AACzD,cAAI,CAAC,UAAU,iBAAiB;AAC9B,sBAAU,kBAAkB,CAAC;AAAA,UAC/B;AACA,oBAAU,gBAAgB,QAAQ,IAAI;AAAA,QACxC,WAAW,wBAAwB,KAAK,QAAQ,GAAG;AACjD,oBAAU,qBAAqB,kBAAkB,MAAM,cAAc;AAAA,QACvE,WAAW,gBAAgB,KAAK,QAAQ,GAAG;AACzC,cAAI,UAAU,aAAa;AACzB,sBAAU,YAAY,QAAQ,IAAI,kBAAkB,MAAM,cAAc;AAAA,UAC1E;AAAA,QACF,WAAW,gBAAgB,KAAK,QAAQ,GAAG;AACzC,cAAI,UAAU,aAAa;AACzB,sBAAU,YAAY,QAAQ,IAAI,kBAAkB,MAAM,cAAc;AAAA,UAC1E;AAAA,QACF;AAAA,MACF;AAEA,UAAI,UAAU,eAAe,OAAO,KAAK,UAAU,WAAW,EAAE,WAAW,GAAG;AAC5E,eAAO,UAAU;AAAA,MACnB;AACA,UAAI,UAAU,eAAe,OAAO,KAAK,UAAU,WAAW,EAAE,WAAW,GAAG;AAC5E,eAAO,UAAU;AAAA,MACnB;AAEA,gBAAU,UAAU,MAAM,IAAI;AAAA,IAChC,OAAO;AACL,YAAM,cAAc,KAAK,gBAAgB,CAAC;AAC1C,iBAAW,QAAQ,aAAa;AAC9B,cAAM,WAAW,KAAK,aAAa;AACnC,cAAM,WAAW,KAAK,aAAa,KAAK,WAAW;AAEnD,YAAI,qBAAqB,KAAK,QAAQ,GAAG;AACvC,cAAI,CAAC,UAAU,kBAAkB;AAC/B,sBAAU,mBAAmB,CAAC;AAAA,UAChC;AACA,oBAAU,iBAAiB,QAAQ,IAAI;AAAA,YACrC;AAAA,YACA;AAAA,UACF;AAAA,QACF,WAAW,yBAAyB,KAAK,QAAQ,GAAG;AAClD,cAAI,CAAC,UAAU,aAAa;AAC1B,sBAAU,cAAc,CAAC;AAAA,UAC3B;AACA,oBAAU,YAAY,QAAQ,IAAI;AAAA,YAChC;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACrKO,IAAM,UAAN,MAAc;AAAA,EACF;AAAA,EACA;AAAA,EAEjB,YAAY,QAAuB;AACjC,SAAK,SAAS,cAAc,MAAM;AAClC,UAAM,eAAe,IAAI,aAAa;AAAA,MACpC,UAAU,KAAK,OAAO;AAAA,MACtB,cAAc,KAAK,OAAO;AAAA,MAC1B,eAAe,KAAK,OAAO;AAAA,MAC3B,OAAO,KAAK,OAAO;AAAA,MACnB,WAAW,KAAK,OAAO;AAAA,MACvB,YAAY,KAAK,OAAO;AAAA,IAC1B,CAAC;AACD,SAAK,OAAO,IAAI,WAAW;AAAA,MACzB,YAAY,KAAK,OAAO;AAAA,MACxB,WAAW,KAAK,OAAO;AAAA,MACvB;AAAA,MACA,SAAS,KAAK,OAAO;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aACJ,QACA,OAC2D;AAC3D,UAAM,QAAQ,MAAM,cAAc,KAAK;AACvC,UAAM,UAAU,MAAM,YAAY,KAAK,MAAM,OAAO,MAAM,MAAM;AAChE,UAAM,oBAAoB,MAAM;AAAA,MAC9B,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM,QAAQ;AAAA,IAChB;AACA,WAAO,EAAE,mBAAmB,QAAQ;AAAA,EACtC;AAAA,EAEA,MAAM,UACJ,mBACA,QAC+C;AAC/C,WAAO,UAAa,KAAK,MAAM,mBAAmB,MAAM;AAAA,EAC1D;AAAA,EAEA,MAAM,UACJ,mBACA,QACA,UACiC;AACjC,UAAM,YAAY,MAAM,UAAa,KAAK,MAAM,mBAAmB,MAAM;AACzE,WAAO,mBAAmB,WAAW,QAAQ;AAAA,EAC/C;AAAA,EAEA,MAAM,QAAQ,QAAgB,OAAsD;AAClF,UAAM,EAAE,kBAAkB,IAAI,MAAM,KAAK,aAAa,QAAQ,KAAK;AACnE,UAAM,kBAAkB;AAAA,MACtB,OAAO,aAAa,MAAM,KAAK,UAAU,mBAAmB,MAAM,MAAM,GAAG;AAAA,MAC3E,YAAY,MAAM,kBAAkB,KAAK,OAAO;AAAA,MAChD,WAAW,MAAM,aAAa,KAAK,OAAO;AAAA,MAC1C,QAAQ,MAAM;AAAA,IAChB,CAAC;AACD,UAAM,SAAS,MAAM,KAAK,UAAU,mBAAmB,MAAM,QAAQ,MAAM,QAAQ;AACnF,QAAI,OAAO,WAAW,UAAU;AAC9B,YAAM,IAAI;AAAA,QACR,QAAQ,MAAM;AAAA,QACd,OAAO,UAAU,CAAC;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;","names":[]}
|