@docmana/sdk 0.3.4 → 0.3.5

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 CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.5
4
+ - Add `runFlowWithCallback(flowId, input)`: starts a flow and returns `{ executionResultId, fileIds }` **without polling**, registering a `callback_url` so docmana-api POSTs a completion notification when the run finishes. Call `getResult(executionResultId)` on receipt to fetch the mapped result. Works with both `run_flow` and `run_once_flow` (via `input.once`).
5
+ - New `RunFlowWithCallbackInput` type carries the required `callbackUrl` (wire: `callback_url`). It is intentionally separate from `RunFlowInput`: the polling `runFlow`/`runFlowAsync` remain callback-free, so a callback run never polls or fetches the result inline.
6
+
3
7
  ## 0.3.3
4
8
  - Add `RunFlowInput.context` (business `json_context`): when provided, `runFlow`/`runFlowAsync` include `json_context` in the request body for both `run_flow` and `run_once_flow`. The context is passed through as-is — filtering against the flow's *Start* node properties is performed server-side by docmana-api.
5
9
 
package/README.md CHANGED
@@ -137,6 +137,50 @@ console.log(result.status, result.results);
137
137
 
138
138
  Unlike `runFlow`, `getResult` does not throw on a failed execution — inspect `result.status` and `result.errors` yourself.
139
139
 
140
+ ## Webhook callbacks
141
+
142
+ When you don't want to poll, use `runFlowWithCallback`. It starts the flow with a `callbackUrl` and returns immediately — docmana-api POSTs a completion notification to that URL when the run finishes, so your server never polls.
143
+
144
+ - `runFlowWithCallback(flowId, input)` → `{ executionResultId, fileIds }` — uploads the file(s) and starts the flow with the callback registered. It does **not** poll and does **not** fetch the result.
145
+
146
+ `input` is a `RunFlowWithCallbackInput`:
147
+
148
+ | Field | Type | Required | Description |
149
+ | ------------- | ------------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------- |
150
+ | `callbackUrl` | `string` | Yes | URL docmana-api POSTs the completion notification to (wire: `callback_url`). |
151
+ | `file` | `string \| { path: string } \| Buffer \| NodeJS.ReadableStream` | — | A single document. |
152
+ | `files` | `(string \| { path: string } \| Buffer \| NodeJS.ReadableStream)[]` | — | Multiple documents for a multi-document flow. |
153
+ | `fileName` | `string` | — | Required when passing a `Buffer`/stream with no derivable name. |
154
+ | `once` | `boolean` | — | Use the ad-hoc `run_once_flow` endpoint instead of `run_flow`. |
155
+ | `context` | `Record<string, unknown>` | — | Business `json_context` passed through to the flow. |
156
+ | `signal` | `AbortSignal` | — | Cancels the upload/start. |
157
+
158
+ `callbackUrl` lives only on this input — `RunFlowInput` (used by `runFlow`/`runFlowAsync`) has no callback field, so a polling run never registers one.
159
+
160
+ The notification payload docmana-api sends is a small JSON object, e.g.:
161
+
162
+ ```json
163
+ {
164
+ "execution_id": "faad872c-…",
165
+ "status": "Success",
166
+ "timestamp": "2026-06-08T21:45:28.415402+00:00",
167
+ "flow_id": "f87bb991-…"
168
+ }
169
+ ```
170
+
171
+ It is a notification only — it does not carry the result. On receipt, fetch and map the full result with `getResult`:
172
+
173
+ ```ts
174
+ const { executionResultId } = await docmana.runFlowWithCallback("<flow-id>", {
175
+ file: "./contract.pdf",
176
+ callbackUrl: "https://your-service.example.com/webhooks/docmana/executions",
177
+ });
178
+
179
+ // …later, in your webhook handler, keyed by the notification's execution_id:
180
+ const result = await docmana.getResult(execution_id);
181
+ console.log(result.status, result.results);
182
+ ```
183
+
140
184
  ## CLI
141
185
 
142
186
  The package also installs a `docmana` command for simple terminal usage:
package/dist/cli.mjs CHANGED
@@ -317,10 +317,11 @@ async function uploadFiles(http, parts, signal) {
317
317
  }
318
318
 
319
319
  // src/api/run-flow.ts
320
- async function runFlow(http, flowId, uuidFiles, signal, once = false, context) {
320
+ async function runFlow(http, flowId, uuidFiles, signal, once = false, context, callbackUrl) {
321
321
  const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;
322
322
  const body = { uuid_files: uuidFiles };
323
323
  if (context !== void 0) body.json_context = context;
324
+ if (callbackUrl !== void 0) body.callback_url = callbackUrl;
324
325
  const res = await http.requestJson("POST", path, {
325
326
  query: { async_mode: "true" },
326
327
  headers: { "content-type": "application/json" },
@@ -543,6 +544,20 @@ var Docmana = class {
543
544
  );
544
545
  return { executionResultId, fileIds };
545
546
  }
547
+ async runFlowWithCallback(flowId, input) {
548
+ const parts = await resolveInputs(input);
549
+ const fileIds = await uploadFiles(this.http, parts, input.signal);
550
+ const executionResultId = await runFlow(
551
+ this.http,
552
+ flowId,
553
+ fileIds,
554
+ input.signal,
555
+ input.once ?? false,
556
+ input.context,
557
+ input.callbackUrl
558
+ );
559
+ return { executionResultId, fileIds };
560
+ }
546
561
  async getStatus(executionResultId, signal) {
547
562
  return getStatus(this.http, executionResultId, signal);
548
563
  }
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 // 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 context?: Record<string, unknown>,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const body: Record<string, unknown> = { uuid_files: uuidFiles };\n if (context !== undefined) body.json_context = context;\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(body),\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 // Score-bearing nodes — note \"Finish\" (the final conclusion node) carries a\n // score too and must be included, otherwise the conclusion score is dropped.\n const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion|Finish)$/i.test(\n nodeType,\n );\n if (isScoreNode && rawNode.score !== undefined && rawNode.score !== null) {\n // `score` is a numeric confidence value, identical across languages — it is\n // never \"translated\", so it always comes from the default node.\n sdkNode.score = rawNode.score;\n }\n\n // `feedback` is the human-readable rationale, returned for EVERY node. It is\n // language-specific, so read it from translations[lang] (sourceObj) when a\n // target language is requested, falling back to the default node. We do NOT\n // return `scoreDescription` — it is a duplicate of `feedback`.\n const feedback = (sourceObj as { feedback?: string }).feedback ?? rawNode.feedback;\n if (feedback !== undefined && feedback !== null) {\n sdkNode.feedback = feedback;\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 input.context,\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 } 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: {\n file?: FileInput;\n files?: FileInput[];\n fileName?: string;\n}): 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 context?: Record<string, unknown>,\n callbackUrl?: string,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const body: Record<string, unknown> = { uuid_files: uuidFiles };\n if (context !== undefined) body.json_context = context;\n if (callbackUrl !== undefined) body.callback_url = callbackUrl;\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(body),\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 // Score-bearing nodes — note \"Finish\" (the final conclusion node) carries a\n // score too and must be included, otherwise the conclusion score is dropped.\n const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion|Finish)$/i.test(\n nodeType,\n );\n if (isScoreNode && rawNode.score !== undefined && rawNode.score !== null) {\n // `score` is a numeric confidence value, identical across languages — it is\n // never \"translated\", so it always comes from the default node.\n sdkNode.score = rawNode.score;\n }\n\n // `feedback` is the human-readable rationale, returned for EVERY node. It is\n // language-specific, so read it from translations[lang] (sourceObj) when a\n // target language is requested, falling back to the default node. We do NOT\n // return `scoreDescription` — it is a duplicate of `feedback`.\n const feedback = (sourceObj as { feedback?: string }).feedback ?? rawNode.feedback;\n if (feedback !== undefined && feedback !== null) {\n sdkNode.feedback = feedback;\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 RunFlowWithCallbackInput,\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 input.context,\n );\n return { executionResultId, fileIds };\n }\n\n async runFlowWithCallback(\n flowId: string,\n input: RunFlowWithCallbackInput,\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 input.context,\n input.callbackUrl,\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.d.cts CHANGED
@@ -95,6 +95,16 @@ interface RunFlowInput {
95
95
  language?: string;
96
96
  context?: Record<string, unknown>;
97
97
  }
98
+ interface RunFlowWithCallbackInput {
99
+ file?: FileInput;
100
+ files?: FileInput[];
101
+ fileName?: string;
102
+ signal?: AbortSignal;
103
+ once?: boolean;
104
+ context?: Record<string, unknown>;
105
+ /** URL docmana-API will POST the completion notification to (wire: `callback_url`). */
106
+ callbackUrl: string;
107
+ }
98
108
 
99
109
  declare class Docmana {
100
110
  private readonly config;
@@ -104,6 +114,10 @@ declare class Docmana {
104
114
  executionResultId: string;
105
115
  fileIds: string[];
106
116
  }>;
117
+ runFlowWithCallback(flowId: string, input: RunFlowWithCallbackInput): Promise<{
118
+ executionResultId: string;
119
+ fileIds: string[];
120
+ }>;
107
121
  getStatus(executionResultId: string, signal?: AbortSignal): Promise<{
108
122
  status: ExecutionStatus | string;
109
123
  }>;
@@ -332,4 +346,4 @@ interface DocmanaApiExecutionResult {
332
346
  [key: string]: unknown;
333
347
  }
334
348
 
335
- export { Docmana, DocmanaAbortError, type DocmanaApiDocumentExecutionResult, type DocmanaApiDocumentRequest, type DocmanaApiExecutionResult, type DocmanaApiNodeResult, DocmanaAuthError, type DocmanaClassificationResult, type DocmanaConclusionResult, type DocmanaConfig, type DocmanaCrossValidationResult, type DocmanaDocumentMapping, type DocmanaDocumentResult, DocmanaError, DocmanaExecutionError, type DocmanaExecutionResult, type DocmanaExtractionResult, type DocmanaMetadataExtractionResult, type DocmanaNodeResult, DocmanaNotFoundError, DocmanaPermissionError, DocmanaRequestError, type DocmanaScoreNodeResult, DocmanaTimeoutError, type DocmanaValidationResult, type DocumentContent, type ExecutionProgress, type ExecutionStatus, type FileInput, type Flow, type FlowConfigs, type FlowEdge, type FlowNode, type FlowNodeType, type NodeTranslationResult, type PhysicalDocument, type RunFlowInput, type VirtualDocument };
349
+ export { Docmana, DocmanaAbortError, type DocmanaApiDocumentExecutionResult, type DocmanaApiDocumentRequest, type DocmanaApiExecutionResult, type DocmanaApiNodeResult, DocmanaAuthError, type DocmanaClassificationResult, type DocmanaConclusionResult, type DocmanaConfig, type DocmanaCrossValidationResult, type DocmanaDocumentMapping, type DocmanaDocumentResult, DocmanaError, DocmanaExecutionError, type DocmanaExecutionResult, type DocmanaExtractionResult, type DocmanaMetadataExtractionResult, type DocmanaNodeResult, DocmanaNotFoundError, DocmanaPermissionError, DocmanaRequestError, type DocmanaScoreNodeResult, DocmanaTimeoutError, type DocmanaValidationResult, type DocumentContent, type ExecutionProgress, type ExecutionStatus, type FileInput, type Flow, type FlowConfigs, type FlowEdge, type FlowNode, type FlowNodeType, type NodeTranslationResult, type PhysicalDocument, type RunFlowInput, type RunFlowWithCallbackInput, type VirtualDocument };
package/dist/index.d.ts CHANGED
@@ -95,6 +95,16 @@ interface RunFlowInput {
95
95
  language?: string;
96
96
  context?: Record<string, unknown>;
97
97
  }
98
+ interface RunFlowWithCallbackInput {
99
+ file?: FileInput;
100
+ files?: FileInput[];
101
+ fileName?: string;
102
+ signal?: AbortSignal;
103
+ once?: boolean;
104
+ context?: Record<string, unknown>;
105
+ /** URL docmana-API will POST the completion notification to (wire: `callback_url`). */
106
+ callbackUrl: string;
107
+ }
98
108
 
99
109
  declare class Docmana {
100
110
  private readonly config;
@@ -104,6 +114,10 @@ declare class Docmana {
104
114
  executionResultId: string;
105
115
  fileIds: string[];
106
116
  }>;
117
+ runFlowWithCallback(flowId: string, input: RunFlowWithCallbackInput): Promise<{
118
+ executionResultId: string;
119
+ fileIds: string[];
120
+ }>;
107
121
  getStatus(executionResultId: string, signal?: AbortSignal): Promise<{
108
122
  status: ExecutionStatus | string;
109
123
  }>;
@@ -332,4 +346,4 @@ interface DocmanaApiExecutionResult {
332
346
  [key: string]: unknown;
333
347
  }
334
348
 
335
- export { Docmana, DocmanaAbortError, type DocmanaApiDocumentExecutionResult, type DocmanaApiDocumentRequest, type DocmanaApiExecutionResult, type DocmanaApiNodeResult, DocmanaAuthError, type DocmanaClassificationResult, type DocmanaConclusionResult, type DocmanaConfig, type DocmanaCrossValidationResult, type DocmanaDocumentMapping, type DocmanaDocumentResult, DocmanaError, DocmanaExecutionError, type DocmanaExecutionResult, type DocmanaExtractionResult, type DocmanaMetadataExtractionResult, type DocmanaNodeResult, DocmanaNotFoundError, DocmanaPermissionError, DocmanaRequestError, type DocmanaScoreNodeResult, DocmanaTimeoutError, type DocmanaValidationResult, type DocumentContent, type ExecutionProgress, type ExecutionStatus, type FileInput, type Flow, type FlowConfigs, type FlowEdge, type FlowNode, type FlowNodeType, type NodeTranslationResult, type PhysicalDocument, type RunFlowInput, type VirtualDocument };
349
+ export { Docmana, DocmanaAbortError, type DocmanaApiDocumentExecutionResult, type DocmanaApiDocumentRequest, type DocmanaApiExecutionResult, type DocmanaApiNodeResult, DocmanaAuthError, type DocmanaClassificationResult, type DocmanaConclusionResult, type DocmanaConfig, type DocmanaCrossValidationResult, type DocmanaDocumentMapping, type DocmanaDocumentResult, DocmanaError, DocmanaExecutionError, type DocmanaExecutionResult, type DocmanaExtractionResult, type DocmanaMetadataExtractionResult, type DocmanaNodeResult, DocmanaNotFoundError, DocmanaPermissionError, DocmanaRequestError, type DocmanaScoreNodeResult, DocmanaTimeoutError, type DocmanaValidationResult, type DocumentContent, type ExecutionProgress, type ExecutionStatus, type FileInput, type Flow, type FlowConfigs, type FlowEdge, type FlowNode, type FlowNodeType, type NodeTranslationResult, type PhysicalDocument, type RunFlowInput, type RunFlowWithCallbackInput, type VirtualDocument };
package/dist/index.js CHANGED
@@ -341,10 +341,11 @@ async function uploadFiles(http, parts, signal) {
341
341
  }
342
342
 
343
343
  // src/api/run-flow.ts
344
- async function runFlow(http, flowId, uuidFiles, signal, once = false, context) {
344
+ async function runFlow(http, flowId, uuidFiles, signal, once = false, context, callbackUrl) {
345
345
  const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;
346
346
  const body = { uuid_files: uuidFiles };
347
347
  if (context !== void 0) body.json_context = context;
348
+ if (callbackUrl !== void 0) body.callback_url = callbackUrl;
348
349
  const res = await http.requestJson("POST", path, {
349
350
  query: { async_mode: "true" },
350
351
  headers: { "content-type": "application/json" },
@@ -567,6 +568,20 @@ var Docmana = class {
567
568
  );
568
569
  return { executionResultId, fileIds };
569
570
  }
571
+ async runFlowWithCallback(flowId, input) {
572
+ const parts = await resolveInputs(input);
573
+ const fileIds = await uploadFiles(this.http, parts, input.signal);
574
+ const executionResultId = await runFlow(
575
+ this.http,
576
+ flowId,
577
+ fileIds,
578
+ input.signal,
579
+ input.once ?? false,
580
+ input.context,
581
+ input.callbackUrl
582
+ );
583
+ return { executionResultId, fileIds };
584
+ }
570
585
  async getStatus(executionResultId, signal) {
571
586
  return getStatus(this.http, executionResultId, signal);
572
587
  }
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 // 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 context?: Record<string, unknown>,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const body: Record<string, unknown> = { uuid_files: uuidFiles };\n if (context !== undefined) body.json_context = context;\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(body),\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 // Score-bearing nodes — note \"Finish\" (the final conclusion node) carries a\n // score too and must be included, otherwise the conclusion score is dropped.\n const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion|Finish)$/i.test(\n nodeType,\n );\n if (isScoreNode && rawNode.score !== undefined && rawNode.score !== null) {\n // `score` is a numeric confidence value, identical across languages — it is\n // never \"translated\", so it always comes from the default node.\n sdkNode.score = rawNode.score;\n }\n\n // `feedback` is the human-readable rationale, returned for EVERY node. It is\n // language-specific, so read it from translations[lang] (sourceObj) when a\n // target language is requested, falling back to the default node. We do NOT\n // return `scoreDescription` — it is a duplicate of `feedback`.\n const feedback = (sourceObj as { feedback?: string }).feedback ?? rawNode.feedback;\n if (feedback !== undefined && feedback !== null) {\n sdkNode.feedback = feedback;\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 input.context,\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/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 RunFlowWithCallbackInput,\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 } 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: {\n file?: FileInput;\n files?: FileInput[];\n fileName?: string;\n}): 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 context?: Record<string, unknown>,\n callbackUrl?: string,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const body: Record<string, unknown> = { uuid_files: uuidFiles };\n if (context !== undefined) body.json_context = context;\n if (callbackUrl !== undefined) body.callback_url = callbackUrl;\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(body),\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 // Score-bearing nodes — note \"Finish\" (the final conclusion node) carries a\n // score too and must be included, otherwise the conclusion score is dropped.\n const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion|Finish)$/i.test(\n nodeType,\n );\n if (isScoreNode && rawNode.score !== undefined && rawNode.score !== null) {\n // `score` is a numeric confidence value, identical across languages — it is\n // never \"translated\", so it always comes from the default node.\n sdkNode.score = rawNode.score;\n }\n\n // `feedback` is the human-readable rationale, returned for EVERY node. It is\n // language-specific, so read it from translations[lang] (sourceObj) when a\n // target language is requested, falling back to the default node. We do NOT\n // return `scoreDescription` — it is a duplicate of `feedback`.\n const feedback = (sourceObj as { feedback?: string }).feedback ?? rawNode.feedback;\n if (feedback !== undefined && feedback !== null) {\n sdkNode.feedback = feedback;\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 RunFlowWithCallbackInput,\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 input.context,\n );\n return { executionResultId, fileIds };\n }\n\n async runFlowWithCallback(\n flowId: string,\n input: RunFlowWithCallbackInput,\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 input.context,\n input.callbackUrl,\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
@@ -307,10 +307,11 @@ async function uploadFiles(http, parts, signal) {
307
307
  }
308
308
 
309
309
  // src/api/run-flow.ts
310
- async function runFlow(http, flowId, uuidFiles, signal, once = false, context) {
310
+ async function runFlow(http, flowId, uuidFiles, signal, once = false, context, callbackUrl) {
311
311
  const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;
312
312
  const body = { uuid_files: uuidFiles };
313
313
  if (context !== void 0) body.json_context = context;
314
+ if (callbackUrl !== void 0) body.callback_url = callbackUrl;
314
315
  const res = await http.requestJson("POST", path, {
315
316
  query: { async_mode: "true" },
316
317
  headers: { "content-type": "application/json" },
@@ -533,6 +534,20 @@ var Docmana = class {
533
534
  );
534
535
  return { executionResultId, fileIds };
535
536
  }
537
+ async runFlowWithCallback(flowId, input) {
538
+ const parts = await resolveInputs(input);
539
+ const fileIds = await uploadFiles(this.http, parts, input.signal);
540
+ const executionResultId = await runFlow(
541
+ this.http,
542
+ flowId,
543
+ fileIds,
544
+ input.signal,
545
+ input.once ?? false,
546
+ input.context,
547
+ input.callbackUrl
548
+ );
549
+ return { executionResultId, fileIds };
550
+ }
536
551
  async getStatus(executionResultId, signal) {
537
552
  return getStatus(this.http, executionResultId, signal);
538
553
  }
@@ -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 // 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 context?: Record<string, unknown>,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const body: Record<string, unknown> = { uuid_files: uuidFiles };\n if (context !== undefined) body.json_context = context;\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(body),\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 // Score-bearing nodes — note \"Finish\" (the final conclusion node) carries a\n // score too and must be included, otherwise the conclusion score is dropped.\n const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion|Finish)$/i.test(\n nodeType,\n );\n if (isScoreNode && rawNode.score !== undefined && rawNode.score !== null) {\n // `score` is a numeric confidence value, identical across languages — it is\n // never \"translated\", so it always comes from the default node.\n sdkNode.score = rawNode.score;\n }\n\n // `feedback` is the human-readable rationale, returned for EVERY node. It is\n // language-specific, so read it from translations[lang] (sourceObj) when a\n // target language is requested, falling back to the default node. We do NOT\n // return `scoreDescription` — it is a duplicate of `feedback`.\n const feedback = (sourceObj as { feedback?: string }).feedback ?? rawNode.feedback;\n if (feedback !== undefined && feedback !== null) {\n sdkNode.feedback = feedback;\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 input.context,\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 } 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: {\n file?: FileInput;\n files?: FileInput[];\n fileName?: string;\n}): 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 context?: Record<string, unknown>,\n callbackUrl?: string,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const body: Record<string, unknown> = { uuid_files: uuidFiles };\n if (context !== undefined) body.json_context = context;\n if (callbackUrl !== undefined) body.callback_url = callbackUrl;\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(body),\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 // Score-bearing nodes — note \"Finish\" (the final conclusion node) carries a\n // score too and must be included, otherwise the conclusion score is dropped.\n const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion|Finish)$/i.test(\n nodeType,\n );\n if (isScoreNode && rawNode.score !== undefined && rawNode.score !== null) {\n // `score` is a numeric confidence value, identical across languages — it is\n // never \"translated\", so it always comes from the default node.\n sdkNode.score = rawNode.score;\n }\n\n // `feedback` is the human-readable rationale, returned for EVERY node. It is\n // language-specific, so read it from translations[lang] (sourceObj) when a\n // target language is requested, falling back to the default node. We do NOT\n // return `scoreDescription` — it is a duplicate of `feedback`.\n const feedback = (sourceObj as { feedback?: string }).feedback ?? rawNode.feedback;\n if (feedback !== undefined && feedback !== null) {\n sdkNode.feedback = feedback;\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 RunFlowWithCallbackInput,\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 input.context,\n );\n return { executionResultId, fileIds };\n }\n\n async runFlowWithCallback(\n flowId: string,\n input: RunFlowWithCallbackInput,\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 input.context,\n input.callbackUrl,\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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@docmana/sdk",
3
- "version": "0.3.4",
3
+ "version": "0.3.5",
4
4
  "description": "Official Docmana SDK — run document-analysis flows with a single call.",
5
5
  "license": "MIT",
6
6
  "type": "module",