@docmana/sdk 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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/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 { DocmanaConfig, ExecutionResult, RunFlowInput, TokenCache } 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<ExecutionResult>;\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\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}\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 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 .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 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(\"Missing client secret. Use --client-secret or DOCMANA_CLIENT_SECRET.\");\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, { files: files.map((path) => ({ path })) });\n\n if (options.json) {\n io.stdout(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n io.stdout(formatHumanResult(result));\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: ExecutionResult): string {\n const lines = [\"Docmana flow completed\", `Status: ${String(result.status ?? \"Unknown\")}`];\n const executionId = result.execution_id ?? result.executionResultId ?? result.execution_result_id;\n if (executionId) lines.push(`Execution id: ${String(executionId)}`);\n if (Array.isArray(result.results)) lines.push(`Results: ${result.results.length}`);\n if (Array.isArray(result.errors)) lines.push(`Errors: ${result.errors.length}`);\n const preview = formatResultsPreview(result.results);\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 (!Array.isArray(results) || results.length === 0) return undefined;\n const preview = JSON.stringify(results.slice(0, 3), 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 if (err instanceof DocmanaExecutionError) {\n const details = err.errors.length > 0 ? ` (${err.errors.length} error(s))` : \"\";\n return `${err.message}${details}`;\n }\n if (err instanceof DocmanaError) return err.message;\n if (err instanceof Error) return err.message;\n return \"Unexpected error\";\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","export 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 constructor(message: string, errors: unknown[] = []) {\n super(message, { code: \"execution_failed\" });\n this.errors = errors;\n }\n}\n\nexport class DocmanaTimeoutError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"timeout\" });\n }\n}\n\nexport class DocmanaAbortError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"aborted\" });\n }\n}\n\nexport function errorFromResponse(\n status: number,\n message: string,\n requestId?: string,\n): DocmanaError {\n const opts = { status, requestId };\n switch (status) {\n case 400:\n return new DocmanaRequestError(message, opts);\n case 401:\n return new DocmanaAuthError(message, opts);\n case 403:\n return new DocmanaPermissionError(message, opts);\n case 404:\n return new DocmanaNotFoundError(message, opts);\n default:\n return new DocmanaError(message, opts);\n }\n}\n","import { DocmanaAuthError } from \"../errors.js\";\nimport type { TokenCache, TokenCacheEntry } from \"../types.js\";\n\nconst SAFETY_MARGIN_MS = 60_000;\n\nexport interface TokenManagerOptions {\n clientId: string;\n clientSecret: string;\n tokenEndpoint: string;\n scope: string;\n fetchImpl: typeof fetch;\n tokenCache?: TokenCache;\n}\n\nexport class TokenManager {\n private token: string | null = null;\n private expiresAt = 0;\n private inflight: Promise<string> | null = null;\n\n constructor(private readonly opts: TokenManagerOptions) {}\n\n invalidate(): void {\n this.token = null;\n this.expiresAt = 0;\n void this.opts.tokenCache?.clear().catch(() => undefined);\n }\n\n async getToken(): Promise<string> {\n if (this.token && Date.now() < this.expiresAt) return this.token;\n const cached = await this.readCachedToken();\n if (cached) return cached;\n if (this.inflight) return this.inflight;\n this.inflight = this.acquire().finally(() => {\n this.inflight = null;\n });\n return this.inflight;\n }\n\n private async acquire(): Promise<string> {\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.opts.clientId,\n client_secret: this.opts.clientSecret,\n scope: this.opts.scope,\n });\n const res = await this.opts.fetchImpl(this.opts.tokenEndpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n if (!res.ok) {\n // Do NOT include the response body verbatim — avoid leaking secrets/echoes.\n throw new DocmanaAuthError(\"Failed to acquire Docmana access token\", { status: res.status });\n }\n const json = (await res.json()) as Partial<{ access_token: string; expires_in: number }>;\n if (\n typeof json.access_token !== \"string\" ||\n json.access_token.length === 0 ||\n typeof json.expires_in !== \"number\" ||\n !Number.isFinite(json.expires_in)\n ) {\n throw new DocmanaAuthError(\"Malformed token response from Docmana CIAM\", {\n status: res.status,\n });\n }\n this.token = json.access_token;\n this.expiresAt = Date.now() + json.expires_in * 1000 - SAFETY_MARGIN_MS;\n await this.writeCachedToken().catch(() => undefined);\n return this.token;\n }\n\n private async readCachedToken(): Promise<string | null> {\n if (!this.opts.tokenCache) return null;\n let entry: TokenCacheEntry | null;\n try {\n entry = await this.opts.tokenCache.read();\n } catch {\n return null;\n }\n if (!entry) return null;\n if (\n entry.clientId !== this.opts.clientId ||\n entry.tokenEndpoint !== this.opts.tokenEndpoint ||\n entry.scope !== this.opts.scope ||\n Date.now() >= entry.expiresAt\n ) {\n await this.opts.tokenCache.clear().catch(() => undefined);\n return null;\n }\n this.token = entry.accessToken;\n this.expiresAt = entry.expiresAt;\n return this.token;\n }\n\n private async writeCachedToken(): Promise<void> {\n if (!this.opts.tokenCache || !this.token) return;\n await this.opts.tokenCache.write({\n accessToken: this.token,\n expiresAt: this.expiresAt,\n clientId: this.opts.clientId,\n tokenEndpoint: this.opts.tokenEndpoint,\n scope: this.opts.scope,\n });\n }\n}\n","import type { DocmanaConfig } from \"./types.js\";\nimport type { TokenCache } from \"./types.js\";\n\nexport const DEFAULTS = {\n apiBaseUrl: \"https://api.docmana.ai\",\n tokenEndpoint:\n \"https://4fe70f5b-e013-4f65-9fa7-3109a33beba5.ciamlogin.com/4fe70f5b-e013-4f65-9fa7-3109a33beba5/oauth2/v2.0/token\",\n scope: \"api://d781e6ba-cc08-4618-8099-ad968abd2b9e/.default\",\n timeoutMs: 300_000,\n pollIntervalMs: 2_000,\n} as const;\n\nexport interface ResolvedConfig {\n clientId: string;\n clientSecret: string;\n apiBaseUrl: string;\n tokenEndpoint: string;\n scope: string;\n timeoutMs: number;\n pollIntervalMs: number;\n fetchImpl: typeof fetch;\n headers: Record<string, string>;\n tokenCache?: TokenCache;\n}\n\nexport function resolveConfig(config: DocmanaConfig): ResolvedConfig {\n if (!config.clientId) throw new Error(\"DocmanaConfig.clientId is required\");\n if (!config.clientSecret) throw new Error(\"DocmanaConfig.clientSecret is required\");\n const apiBaseUrl = (config.apiBaseUrl ?? DEFAULTS.apiBaseUrl).replace(/\\/+$/, \"\");\n return {\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n apiBaseUrl,\n tokenEndpoint: config.tokenEndpoint ?? DEFAULTS.tokenEndpoint,\n scope: config.scope ?? DEFAULTS.scope,\n timeoutMs: config.timeoutMs ?? DEFAULTS.timeoutMs,\n pollIntervalMs: config.pollIntervalMs ?? DEFAULTS.pollIntervalMs,\n fetchImpl: config.fetch ?? fetch,\n headers: config.headers ?? {},\n tokenCache: config.tokenCache,\n };\n}\n","import type { TokenManager } from \"../auth/token-manager.js\";\nimport { DocmanaError, DocmanaAbortError, errorFromResponse } from \"../errors.js\";\n\nexport interface HttpClientOptions {\n apiBaseUrl: string;\n fetchImpl: typeof fetch;\n tokenManager: TokenManager;\n headers?: Record<string, string>;\n}\n\ntype FetchBody = NonNullable<Parameters<typeof fetch>[1]>[\"body\"];\n\nexport interface RequestOptions {\n query?: Record<string, string>;\n body?: FetchBody;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport class HttpClient {\n constructor(private readonly opts: HttpClientOptions) {}\n\n async requestJson<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const res = await this.requestRaw(method, path, options);\n const text = await res.text();\n if (!text) return {} as T;\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new DocmanaError(\"Invalid JSON response from Docmana\", { status: res.status });\n }\n }\n\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n let res = await this.send(method, path, options);\n if (res.status === 401) {\n this.opts.tokenManager.invalidate();\n res = await this.send(method, path, options);\n }\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const message = await this.extractMessage(res);\n throw errorFromResponse(res.status, message, requestId);\n }\n return res;\n }\n\n private async send(method: string, path: string, options: RequestOptions): Promise<Response> {\n const token = await this.opts.tokenManager.getToken();\n const url = new URL(this.opts.apiBaseUrl + path);\n for (const [k, v] of Object.entries(options.query ?? {})) url.searchParams.set(k, v);\n const headers: Record<string, string> = {\n ...(this.opts.headers ?? {}),\n authorization: `Bearer ${token}`,\n ...(options.headers ?? {}),\n };\n try {\n return await this.opts.fetchImpl(url, {\n method,\n headers,\n body: options.body,\n signal: options.signal,\n });\n } catch (err) {\n if (options.signal?.aborted || (err instanceof Error && err.name === \"AbortError\")) {\n throw new DocmanaAbortError(\"Request aborted\");\n }\n throw err;\n }\n }\n\n private async extractMessage(res: Response): Promise<string> {\n try {\n const data = (await res.clone().json()) as { message?: string; error?: string };\n return data.message ?? data.error ?? res.statusText ?? `HTTP ${res.status}`;\n } catch {\n return res.statusText ?? `HTTP ${res.status}`;\n }\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport type { FileInput, RunFlowInput } from \"../types.js\";\n\nexport interface ResolvedPart {\n data: Blob;\n filename: string;\n contentType: string;\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".tif\": \"image/tiff\",\n \".tiff\": \"image/tiff\",\n \".txt\": \"text/plain\",\n \".json\": \"application/json\",\n};\n\nfunction contentTypeFor(name: string): string {\n const dot = name.lastIndexOf(\".\");\n if (dot < 0) return \"application/octet-stream\";\n const ext = name.slice(dot).toLowerCase();\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction isReadable(x: unknown): x is Readable {\n return typeof x === \"object\" && x !== null && typeof (x as Readable).pipe === \"function\";\n}\n\nfunction isPathInput(x: unknown): x is { path: string } {\n return typeof x === \"object\" && x !== null && typeof (x as { path?: unknown }).path === \"string\";\n}\n\nasync function streamToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) chunks.push(Buffer.from(chunk));\n return Buffer.concat(chunks);\n}\n\nasync function resolveOne(input: FileInput, fallbackName: string): Promise<ResolvedPart> {\n if (typeof input === \"string\" || isPathInput(input)) {\n const path = typeof input === \"string\" ? input : input.path;\n const data = await readFile(path);\n const filename = basename(path);\n return { data: new Blob([data]), filename, contentType: contentTypeFor(filename) };\n }\n if (input instanceof Uint8Array) {\n return {\n data: new Blob([input]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n if (isReadable(input)) {\n const buf = await streamToBuffer(input);\n return {\n data: new Blob([buf]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n throw new Error(\"Unsupported file input type\");\n}\n\nexport async function resolveInputs(input: RunFlowInput): Promise<ResolvedPart[]> {\n const list: FileInput[] = input.files ?? (input.file !== undefined ? [input.file] : []);\n if (list.length === 0) throw new Error(\"runFlow requires `file` or `files`\");\n const fallback = input.fileName ?? \"upload.bin\";\n return Promise.all(list.map((item) => resolveOne(item, fallback)));\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ResolvedPart } from \"../files/resolve-input.js\";\n\nexport async function uploadFiles(\n http: HttpClient,\n parts: ResolvedPart[],\n signal?: AbortSignal,\n): Promise<string[]> {\n const ids: string[] = [];\n for (const part of parts) {\n const form = new FormData();\n form.append(\"files\", new File([part.data], part.filename, { type: part.contentType }));\n const res = await http.requestJson<{ id: string }>(\"POST\", \"/upload\", { body: form, signal });\n ids.push(res.id);\n }\n return ids;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\n\nexport async function runFlow(\n http: HttpClient,\n flowId: string,\n uuidFiles: string[],\n signal?: AbortSignal,\n once = false,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const res = await http.requestJson<{ execution_result_id: string }>(\"POST\", path, {\n query: { async_mode: \"true\" },\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ uuid_files: uuidFiles }),\n signal,\n });\n return res.execution_result_id;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ExecutionStatus } from \"../types.js\";\n\nexport async function getStatus(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<{ status: ExecutionStatus | string }> {\n return http.requestJson(\"GET\", `/flows/execution-status/${executionResultId}`, { signal });\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ExecutionResult } from \"../types.js\";\n\nexport async function getResult(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<ExecutionResult> {\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 { resolveConfig } from \"./config.js\";\nimport type { ResolvedConfig } from \"./config.js\";\nimport type { DocmanaConfig, ExecutionResult, ExecutionStatus, RunFlowInput } 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\";\n\nexport class Docmana {\n private readonly config: ResolvedConfig;\n private readonly http: HttpClient;\n\n constructor(config: DocmanaConfig) {\n this.config = resolveConfig(config);\n const tokenManager = new TokenManager({\n clientId: this.config.clientId,\n clientSecret: this.config.clientSecret,\n tokenEndpoint: this.config.tokenEndpoint,\n scope: this.config.scope,\n fetchImpl: this.config.fetchImpl,\n tokenCache: this.config.tokenCache,\n });\n this.http = new HttpClient({\n apiBaseUrl: this.config.apiBaseUrl,\n fetchImpl: this.config.fetchImpl,\n tokenManager,\n headers: this.config.headers,\n });\n }\n\n async runFlowAsync(\n flowId: string,\n input: RunFlowInput,\n ): Promise<{ executionResultId: string; fileIds: string[] }> {\n const parts = await resolveInputs(input);\n const fileIds = await uploadFiles(this.http, parts, input.signal);\n const executionResultId = await runFlowApi(\n this.http,\n flowId,\n fileIds,\n input.signal,\n input.once ?? false,\n );\n return { executionResultId, fileIds };\n }\n\n async getStatus(\n executionResultId: string,\n signal?: AbortSignal,\n ): Promise<{ status: ExecutionStatus | string }> {\n return getStatusApi(this.http, executionResultId, signal);\n }\n\n async getResult(executionResultId: string, signal?: AbortSignal): Promise<ExecutionResult> {\n return getResultApi(this.http, executionResultId, signal);\n }\n\n async runFlow(flowId: string, input: RunFlowInput): Promise<ExecutionResult> {\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);\n if (result.status === \"Failed\") {\n throw new DocmanaExecutionError(`Flow ${flowId} execution failed`, result.errors ?? []);\n }\n return result;\n }\n}\n"],"mappings":"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","names":["readFile","readFile"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/errors.ts","../src/auth/token-manager.ts","../src/config.ts","../src/http/http-client.ts","../src/files/resolve-input.ts","../src/api/upload.ts","../src/api/run-flow.ts","../src/api/execution-status.ts","../src/api/execution-result.ts","../src/polling/poll.ts","../src/mappers/mapper.ts","../src/client.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { existsSync, realpathSync } from \"node:fs\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command, CommanderError } from \"commander\";\nimport { TokenManager } from \"./auth/token-manager.js\";\nimport { Docmana } from \"./client.js\";\nimport { DEFAULTS } from \"./config.js\";\nimport { DocmanaError, DocmanaExecutionError } from \"./errors.js\";\nimport type {\n DocmanaConfig,\n DocmanaExecutionResult,\n RunFlowInput,\n TokenCache,\n DocmanaDocumentResult,\n DocmanaNodeResult,\n} from \"./types.js\";\n\ntype Env = Record<string, string | undefined>;\ntype Write = (text: string) => void;\n\nexport interface CliIO {\n stdout: Write;\n stderr: Write;\n}\n\nexport interface DocmanaClient {\n runFlow(flowId: string, input: RunFlowInput): Promise<DocmanaExecutionResult>;\n}\n\nexport type DocmanaClientFactory = (config: DocmanaConfig) => DocmanaClient;\n\nexport interface DocmanaCliConfig {\n apiBaseUrl?: string;\n tokenEndpoint?: string;\n scope?: string;\n organisation?: string;\n clientId?: string;\n clientSecret?: string;\n}\n\ninterface CliPromptOptions {\n defaultValue?: string;\n secret?: boolean;\n}\n\nexport type CliPrompt = (label: string, options?: CliPromptOptions) => Promise<string>;\n\nexport interface CliDeps {\n cwd?: string;\n prompt?: CliPrompt;\n fetch?: typeof fetch;\n}\n\nclass CliUsageError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CliUsageError\";\n }\n}\n\nclass CliSilentError extends Error {\n readonly exitCode: number;\n constructor(exitCode = 1) {\n super();\n this.name = \"CliSilentError\";\n this.exitCode = exitCode;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\ninterface RunOptions {\n files?: string;\n clientId?: string;\n clientSecret?: string;\n apiUrl?: string;\n tokenUrl?: string;\n scope?: string;\n organisation?: string;\n config?: string;\n tokenCache?: string;\n json?: boolean;\n language?: string;\n}\n\ninterface ConfigInitOptions {\n config?: string;\n}\n\ninterface LoginOptions {\n clientId?: string;\n clientSecret?: string;\n tokenUrl?: string;\n scope?: string;\n config?: string;\n tokenCache?: string;\n}\n\nconst HELP = {\n root: \"Run Docmana document-analysis flows.\",\n flow: \"Manage and run Docmana flows.\",\n config: \"Manage Docmana CLI configuration.\",\n configInit: \"Create or update a local Docmana CLI config file.\",\n login: \"Acquire and cache a Docmana OAuth2 access token.\",\n run: \"Upload documents, run a Docmana flow, wait for completion, and print the result.\",\n};\n\nconst DEFAULT_CONFIG_FILE = \"docmana.config.json\";\nconst DEFAULT_TOKEN_CACHE_FILE = \"docmana.token.json\";\n\nexport async function runCli(\n argv: string[] = process.argv.slice(2),\n env: Env = process.env,\n io: CliIO = {\n stdout: (text) => process.stdout.write(text),\n stderr: (text) => process.stderr.write(text),\n },\n clientFactory: DocmanaClientFactory = (config) => new Docmana(config),\n deps: CliDeps = {},\n): Promise<number> {\n const program = buildProgram(env, io, clientFactory, deps);\n if (argv.length === 0) {\n io.stdout(program.helpInformation());\n return 0;\n }\n\n try {\n await program.parseAsync(argv, { from: \"user\" });\n return 0;\n } catch (err) {\n if (err instanceof CliSilentError) {\n return err.exitCode;\n }\n if (err instanceof CliUsageError) {\n io.stderr(`Error: ${err.message}\\n`);\n return 2;\n }\n if (err instanceof CommanderError) {\n return err.exitCode === 0 ? 0 : 2;\n }\n io.stderr(`${formatRuntimeError(err)}\\n`);\n return 1;\n }\n}\n\nfunction buildProgram(\n env: Env,\n io: CliIO,\n clientFactory: DocmanaClientFactory,\n deps: CliDeps,\n): Command {\n const program = new Command();\n program\n .name(\"docmana\")\n .description(HELP.root)\n .showHelpAfterError()\n .configureOutput({\n writeOut: io.stdout,\n writeErr: io.stderr,\n outputError: (str, write) => write(str),\n })\n .exitOverride();\n\n program\n .command(\"login\")\n .description(HELP.login)\n .option(\"--client-id <id>\", \"OAuth2 client id; defaults to DOCMANA_CLIENT_ID\")\n .option(\"--client-secret <secret>\", \"OAuth2 client secret; defaults to DOCMANA_CLIENT_SECRET\")\n .option(\"--token-url <url>\", \"OAuth2 token endpoint; defaults to DOCMANA_TOKEN_URL\")\n .option(\"--scope <scope>\", \"OAuth2 scope; defaults to DOCMANA_SCOPE\")\n .option(\"--config <path>\", `Config file path; defaults to ./${DEFAULT_CONFIG_FILE}`)\n .option(\"--token-cache <path>\", `Token cache path; defaults to ./${DEFAULT_TOKEN_CACHE_FILE}`)\n .action(async (options: LoginOptions) => {\n await loginCommand(options, env, io, deps);\n });\n\n const flow = program\n .command(\"flow\")\n .description(HELP.flow)\n .action(() => {\n io.stdout(flow.helpInformation());\n });\n\n flow\n .command(\"run\")\n .description(HELP.run)\n .argument(\"<flow-id>\", \"Docmana flow id\")\n .requiredOption(\"--files <csv>\", \"Comma-separated file paths to upload\")\n .option(\"--client-id <id>\", \"OAuth2 client id; defaults to DOCMANA_CLIENT_ID\")\n .option(\"--client-secret <secret>\", \"OAuth2 client secret; defaults to DOCMANA_CLIENT_SECRET\")\n .option(\"--api-url <url>\", \"Docmana API base URL; defaults to DOCMANA_API_URL\")\n .option(\"--token-url <url>\", \"OAuth2 token endpoint; defaults to DOCMANA_TOKEN_URL\")\n .option(\"--scope <scope>\", \"OAuth2 scope; defaults to DOCMANA_SCOPE\")\n .option(\"--organisation <id>\", \"Docmana organisation id; defaults to DOCMANA_ORGANISATION\")\n .option(\"--config <path>\", `Config file path; defaults to ./${DEFAULT_CONFIG_FILE}`)\n .option(\"--token-cache <path>\", `Token cache path; defaults to ./${DEFAULT_TOKEN_CACHE_FILE}`)\n .option(\"--json\", \"Print the raw JSON result\")\n .option(\"--language <lang>\", \"Translate output to specified language\")\n .action(async (flowId: string, options: RunOptions) => {\n await runFlowCommand(flowId, options, env, io, clientFactory, deps);\n });\n\n const config = program\n .command(\"config\")\n .description(HELP.config)\n .action(() => {\n io.stdout(config.helpInformation());\n });\n\n config\n .command(\"init\")\n .description(HELP.configInit)\n .option(\"--config <path>\", `Config file path; defaults to ./${DEFAULT_CONFIG_FILE}`)\n .action(async (options: ConfigInitOptions) => {\n await configInitCommand(options, io, deps);\n });\n\n return program;\n}\n\nasync function runFlowCommand(\n flowId: string,\n options: RunOptions,\n env: Env,\n io: CliIO,\n clientFactory: DocmanaClientFactory,\n deps: CliDeps,\n): Promise<void> {\n try {\n const files = parseFiles(options.files);\n const cliConfig = await loadCliConfig(options.config, getCwd(deps), Boolean(options.config));\n const clientId = firstNonEmpty(options.clientId, env.DOCMANA_CLIENT_ID, cliConfig.clientId);\n const clientSecret = firstNonEmpty(\n options.clientSecret,\n env.DOCMANA_CLIENT_SECRET,\n cliConfig.clientSecret,\n );\n const organisation = firstNonEmpty(\n options.organisation,\n env.DOCMANA_ORGANISATION,\n cliConfig.organisation,\n );\n const apiBaseUrl = firstNonEmpty(options.apiUrl, env.DOCMANA_API_URL, cliConfig.apiBaseUrl);\n const tokenEndpoint = firstNonEmpty(\n options.tokenUrl,\n env.DOCMANA_TOKEN_URL,\n cliConfig.tokenEndpoint,\n );\n const scope = firstNonEmpty(options.scope, env.DOCMANA_SCOPE, cliConfig.scope);\n\n if (!clientId)\n throw new CliUsageError(\"Missing client id. Use --client-id or DOCMANA_CLIENT_ID.\");\n if (!clientSecret) {\n throw new CliUsageError(\n \"Missing client secret. Use --client-secret or DOCMANA_CLIENT_SECRET.\",\n );\n }\n if (!organisation) {\n throw new CliUsageError(\"Missing organisation. Use --organisation or DOCMANA_ORGANISATION.\");\n }\n\n const client = clientFactory({\n clientId,\n clientSecret,\n apiBaseUrl,\n tokenEndpoint,\n scope,\n headers: { \"X-Selected-Organization\": organisation },\n tokenCache: createFileTokenCache(resolveTokenCachePath(options.tokenCache, getCwd(deps))),\n });\n const result = await client.runFlow(flowId, {\n files: files.map((path) => ({ path })),\n language: options.language,\n });\n\n if (options.json) {\n io.stdout(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n io.stdout(formatHumanResult(result));\n } catch (err) {\n if (options.json) {\n if (err instanceof DocmanaExecutionError && err.result) {\n io.stdout(`${JSON.stringify(err.result, null, 2)}\\n`);\n } else {\n const errorPayload: Record<string, unknown> = {\n error: err instanceof Error ? err.message : String(err),\n };\n if (err instanceof DocmanaError) {\n errorPayload.code = err.code;\n if (err.status !== undefined) errorPayload.status = err.status;\n if (err.requestId !== undefined) errorPayload.requestId = err.requestId;\n }\n io.stdout(`${JSON.stringify(errorPayload, null, 2)}\\n`);\n }\n throw new CliSilentError(err instanceof CliUsageError ? 2 : 1);\n }\n throw err;\n }\n}\n\nasync function loginCommand(\n options: LoginOptions,\n env: Env,\n io: CliIO,\n deps: CliDeps,\n): Promise<void> {\n const auth = await resolveAuthConfig(options, env, deps);\n const tokenCachePath = resolveTokenCachePath(options.tokenCache, getCwd(deps));\n const tokenCache = createFileTokenCache(tokenCachePath);\n const tokenManager = new TokenManager({\n clientId: auth.clientId,\n clientSecret: auth.clientSecret,\n tokenEndpoint: auth.tokenEndpoint,\n scope: auth.scope,\n fetchImpl: deps.fetch ?? fetch,\n tokenCache,\n });\n\n await tokenManager.getToken();\n const cached = await tokenCache.read();\n io.stdout(`Logged in. Token cached at ${tokenCachePath}\\n`);\n if (cached) io.stdout(formatTokenExpiry(cached.expiresAt));\n}\n\nfunction formatTokenExpiry(expiresAt: number): string {\n const expiresAtDate = new Date(expiresAt);\n return (\n [\n `Token expires at local time ${expiresAtDate.toLocaleString()}`,\n `Token expires at UTC ${expiresAtDate.toISOString()}`,\n ].join(\"\\n\") + \"\\n\"\n );\n}\n\nasync function resolveAuthConfig(\n options: LoginOptions,\n env: Env,\n deps: CliDeps,\n): Promise<{ clientId: string; clientSecret: string; tokenEndpoint: string; scope: string }> {\n const cliConfig = await loadCliConfig(options.config, getCwd(deps), Boolean(options.config));\n const clientId = firstNonEmpty(options.clientId, env.DOCMANA_CLIENT_ID, cliConfig.clientId);\n const clientSecret = firstNonEmpty(\n options.clientSecret,\n env.DOCMANA_CLIENT_SECRET,\n cliConfig.clientSecret,\n );\n const tokenEndpoint =\n firstNonEmpty(options.tokenUrl, env.DOCMANA_TOKEN_URL, cliConfig.tokenEndpoint) ??\n DEFAULTS.tokenEndpoint;\n const scope = firstNonEmpty(options.scope, env.DOCMANA_SCOPE, cliConfig.scope) ?? DEFAULTS.scope;\n\n if (!clientId)\n throw new CliUsageError(\"Missing client id. Use --client-id or DOCMANA_CLIENT_ID.\");\n if (!clientSecret) {\n throw new CliUsageError(\"Missing client secret. Use --client-secret or DOCMANA_CLIENT_SECRET.\");\n }\n\n return { clientId, clientSecret, tokenEndpoint, scope };\n}\n\nasync function configInitCommand(\n options: ConfigInitOptions,\n io: CliIO,\n deps: CliDeps,\n): Promise<void> {\n const cwd = getCwd(deps);\n const configPath = resolveConfigPath(options.config, cwd);\n const existing = await loadCliConfig(options.config, cwd, false);\n const defaultPrompt = deps.prompt ? undefined : createDefaultPrompt();\n const prompt = deps.prompt ?? defaultPrompt?.prompt;\n if (!prompt) throw new CliUsageError(\"Unable to initialize interactive prompt\");\n\n try {\n const config: DocmanaCliConfig = {\n apiBaseUrl: await prompt(\"API base URL\", {\n defaultValue: existing.apiBaseUrl ?? DEFAULTS.apiBaseUrl,\n }),\n tokenEndpoint: await prompt(\"OAuth2 token endpoint\", {\n defaultValue: existing.tokenEndpoint ?? DEFAULTS.tokenEndpoint,\n }),\n scope: await prompt(\"OAuth2 scope\", {\n defaultValue: existing.scope ?? DEFAULTS.scope,\n }),\n organisation: await prompt(\"Organisation\", {\n defaultValue: existing.organisation,\n }),\n clientId: await prompt(\"Client id\", {\n defaultValue: existing.clientId,\n }),\n clientSecret: await prompt(\"Client secret\", {\n defaultValue: existing.clientSecret,\n secret: true,\n }),\n };\n\n await mkdir(dirname(configPath), { recursive: true });\n await writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, \"utf8\");\n io.stdout(`Wrote ${configPath}\\n`);\n io.stdout(\n `Warning: ${DEFAULT_CONFIG_FILE} contains credentials and should stay ignored by Git.\\n`,\n );\n } finally {\n defaultPrompt?.close();\n }\n}\n\nasync function loadCliConfig(\n configPathOption: string | undefined,\n cwd: string,\n requireExisting: boolean,\n): Promise<DocmanaCliConfig> {\n const configPath = resolveConfigPath(configPathOption, cwd);\n if (!existsSync(configPath)) {\n if (requireExisting) throw new CliUsageError(`Config file not found: ${configPath}`);\n return {};\n }\n let raw: string;\n try {\n raw = await readFile(configPath, \"utf8\");\n } catch {\n throw new CliUsageError(`Unable to read config file: ${configPath}`);\n }\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Config must be a JSON object\");\n }\n return normalizeCliConfig(parsed as Record<string, unknown>);\n } catch {\n throw new CliUsageError(`Invalid config file: ${configPath}`);\n }\n}\n\nfunction normalizeCliConfig(config: Record<string, unknown>): DocmanaCliConfig {\n return {\n apiBaseUrl: stringValue(config.apiBaseUrl),\n tokenEndpoint: stringValue(config.tokenEndpoint),\n scope: stringValue(config.scope),\n organisation: stringValue(config.organisation),\n clientId: stringValue(config.clientId),\n clientSecret: stringValue(config.clientSecret),\n };\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction resolveConfigPath(configPathOption: string | undefined, cwd: string): string {\n return resolve(cwd, configPathOption ?? DEFAULT_CONFIG_FILE);\n}\n\nfunction resolveTokenCachePath(tokenCachePathOption: string | undefined, cwd: string): string {\n return resolve(cwd, tokenCachePathOption ?? DEFAULT_TOKEN_CACHE_FILE);\n}\n\nfunction getCwd(deps: CliDeps): string {\n return deps.cwd ?? process.cwd();\n}\n\nfunction createFileTokenCache(path: string): TokenCache {\n return {\n async read() {\n if (!existsSync(path)) return null;\n try {\n const parsed = JSON.parse(await readFile(path, \"utf8\")) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return null;\n const value = parsed as Record<string, unknown>;\n if (\n typeof value.accessToken !== \"string\" ||\n typeof value.expiresAt !== \"number\" ||\n typeof value.clientId !== \"string\" ||\n typeof value.tokenEndpoint !== \"string\" ||\n typeof value.scope !== \"string\"\n ) {\n return null;\n }\n return {\n accessToken: value.accessToken,\n expiresAt: value.expiresAt,\n clientId: value.clientId,\n tokenEndpoint: value.tokenEndpoint,\n scope: value.scope,\n };\n } catch {\n return null;\n }\n },\n async write(entry) {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(entry, null, 2)}\\n`, \"utf8\");\n },\n async clear() {\n await rm(path, { force: true });\n },\n };\n}\n\nfunction createDefaultPrompt(): { prompt: CliPrompt; close: () => void } {\n if (!process.stdin.isTTY) {\n let index = 0;\n const linesPromise = readStdinLines();\n return {\n prompt: async (label, options = {}) => {\n process.stdout.write(formatPrompt(label, options));\n const lines = await linesPromise;\n const answer = lines[index++] ?? \"\";\n return firstNonEmpty(answer, options.defaultValue) ?? \"\";\n },\n close: () => undefined,\n };\n }\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return {\n prompt: async (label, options = {}) => {\n const answer = await rl.question(formatPrompt(label, options));\n return firstNonEmpty(answer, options.defaultValue) ?? \"\";\n },\n close: () => rl.close(),\n };\n}\n\nfunction formatPrompt(label: string, options: CliPromptOptions): string {\n const defaultHint =\n options.defaultValue && !options.secret\n ? ` [${options.defaultValue}]`\n : options.defaultValue && options.secret\n ? \" [current value hidden]\"\n : \"\";\n return `${label}${defaultHint}: `;\n}\n\nasync function readStdinLines(): Promise<string[]> {\n let input = \"\";\n for await (const chunk of process.stdin) input += String(chunk);\n return input.split(/\\r?\\n/);\n}\n\nfunction parseFiles(filesCsv: string | undefined): string[] {\n const files =\n filesCsv\n ?.split(\",\")\n .map((file) => file.trim())\n .filter(Boolean) ?? [];\n if (files.length === 0) throw new CliUsageError(\"Missing files. Use --files <path[,path]>.\");\n return files;\n}\n\nfunction firstNonEmpty(...values: Array<string | undefined>): string | undefined {\n return values.map((value) => value?.trim()).find(Boolean);\n}\n\nfunction formatHumanResult(result: DocmanaExecutionResult): string {\n const lines = [\"Docmana flow completed\", `Status: ${String(result.status ?? \"Unknown\")}`];\n const executionId = result.executionId;\n if (executionId) lines.push(`Execution id: ${String(executionId)}`);\n if (result.documents && result.documents.mappings) {\n lines.push(`Results: ${result.documents.mappings.length}`);\n }\n if (result.errors && result.errors.length > 0) {\n lines.push(`Errors: ${result.errors.length}`);\n }\n\n const previewData: Record<string, unknown> = {};\n if (result.documents && result.documents.mappings) {\n for (const mapping of result.documents.mappings.slice(0, 3)) {\n const docKey = mapping.reference;\n previewData[mapping.name] = result.documents[docKey];\n }\n }\n\n const preview = formatResultsPreview(previewData);\n if (preview) lines.push(\"\", \"Result preview:\", preview);\n lines.push(\"\", \"Use --json to print the complete result payload.\");\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction formatResultsPreview(results: unknown): string | undefined {\n if (!results) return undefined;\n const preview = JSON.stringify(results, null, 2);\n if (!preview) return undefined;\n return preview.length > 2_000 ? `${preview.slice(0, 2_000)}\\n...` : preview;\n}\n\nfunction formatRuntimeError(err: unknown): string {\n return formatHumanError(err);\n}\n\nfunction formatHumanError(err: unknown): string {\n if (err instanceof DocmanaExecutionError) {\n const lines = [`Error: ${err.message}`];\n\n if (err.errors && err.errors.length > 0) {\n lines.push(\"Global errors:\");\n for (const e of err.errors) {\n lines.push(` - ${formatSingleError(e)}`);\n }\n }\n\n const result = err.result;\n if (result) {\n if (result.documents && result.documents.mappings && result.documents.mappings.length > 0) {\n lines.push(\"Document execution results:\");\n for (const mapping of result.documents.mappings) {\n const docKey = mapping.reference;\n const docName = mapping.name;\n const docResult = result.documents[docKey] as DocmanaDocumentResult | undefined;\n\n if (docResult) {\n const status = docResult.status || \"Unknown\";\n\n const nodes: DocmanaNodeResult[] = [];\n if (docResult.classifications) nodes.push(...Object.values(docResult.classifications));\n if (docResult.metadataExtraction) nodes.push(docResult.metadataExtraction);\n if (docResult.extractions) nodes.push(...Object.values(docResult.extractions));\n if (docResult.validations) nodes.push(...Object.values(docResult.validations));\n\n const hasNodeFailures = nodes.some(\n (n) => n.status === \"Failed\" || (n.errors && n.errors.length > 0),\n );\n\n if (docResult.status === \"Failed\" || hasNodeFailures) {\n lines.push(` - Document: ${docName} (Status: ${status})`);\n if (docResult.classifications) {\n for (const [nodeName, node] of Object.entries(docResult.classifications)) {\n if (node.errors && node.errors.length > 0) {\n lines.push(` Classification: ${nodeName} (Status: ${node.status})`);\n for (const nodeErr of node.errors) {\n lines.push(` - ${nodeErr}`);\n }\n }\n }\n }\n if (\n docResult.metadataExtraction?.errors &&\n docResult.metadataExtraction.errors.length > 0\n ) {\n lines.push(\n ` MetadataExtraction: (Status: ${docResult.metadataExtraction.status})`,\n );\n for (const nodeErr of docResult.metadataExtraction.errors) {\n lines.push(` - ${nodeErr}`);\n }\n }\n if (docResult.extractions) {\n for (const [nodeName, node] of Object.entries(docResult.extractions)) {\n if (node.status === \"Failed\" || (node.errors && node.errors.length > 0)) {\n lines.push(` Extraction: ${nodeName} (Status: ${node.status})`);\n if (node.errors) {\n for (const nodeErr of node.errors) {\n lines.push(` - ${nodeErr}`);\n }\n }\n }\n }\n }\n if (docResult.validations) {\n for (const [nodeName, node] of Object.entries(docResult.validations)) {\n if (node.status === \"Failed\" || (node.errors && node.errors.length > 0)) {\n lines.push(` Validation: ${nodeName} (Status: ${node.status})`);\n if (node.errors) {\n for (const nodeErr of node.errors) {\n lines.push(` - ${nodeErr}`);\n }\n }\n }\n }\n }\n } else {\n lines.push(` - Document: ${docName} (Status: ${status})`);\n }\n } else {\n lines.push(` - Document: ${docName} (Status: Unknown)`);\n }\n }\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n if (err instanceof DocmanaError) {\n return `Error: ${err.message} (Code: ${err.code})`;\n }\n\n if (err instanceof Error) {\n return `Error: ${err.message}`;\n }\n\n return `Error: ${String(err)}`;\n}\n\nfunction formatSingleError(e: unknown): string {\n if (typeof e === \"string\") return e;\n if (e && typeof e === \"object\") {\n const obj = e as Record<string, unknown>;\n if (typeof obj.msg === \"string\") return obj.msg;\n if (typeof obj.message === \"string\") return obj.message;\n if (typeof obj.error === \"string\") return obj.error;\n try {\n return JSON.stringify(e);\n } catch {\n return String(e);\n }\n }\n return String(e);\n}\n\nfunction isDirectRun(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n try {\n return realpathSync(resolve(entry)) === realpathSync(fileURLToPath(import.meta.url));\n } catch {\n return false;\n }\n}\n\nif (isDirectRun()) {\n runCli().then((code) => {\n process.exitCode = code;\n });\n}\n","import type { DocmanaExecutionResult } from \"./models/docmana-execution-result.model.js\";\n\nexport class DocmanaError extends Error {\n readonly status?: number;\n readonly requestId?: string;\n readonly code: string;\n constructor(message: string, opts: { status?: number; requestId?: string; code?: string } = {}) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.requestId = opts.requestId;\n this.code = opts.code ?? \"docmana_error\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class DocmanaAuthError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"auth_error\" });\n }\n}\n\nexport class DocmanaPermissionError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"permission_error\" });\n }\n}\n\nexport class DocmanaNotFoundError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"not_found\" });\n }\n}\n\nexport class DocmanaRequestError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"bad_request\" });\n }\n}\n\nexport class DocmanaExecutionError extends DocmanaError {\n readonly errors: unknown[];\n readonly result?: DocmanaExecutionResult;\n constructor(message: string, errors: unknown[] = [], result?: DocmanaExecutionResult) {\n super(message, { code: \"execution_failed\" });\n this.errors = errors;\n this.result = result;\n }\n}\n\nexport class DocmanaTimeoutError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"timeout\" });\n }\n}\n\nexport class DocmanaAbortError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"aborted\" });\n }\n}\n\nexport function errorFromResponse(\n status: number,\n message: string,\n requestId?: string,\n): DocmanaError {\n const opts = { status, requestId };\n switch (status) {\n case 400:\n return new DocmanaRequestError(message, opts);\n case 401:\n return new DocmanaAuthError(message, opts);\n case 403:\n return new DocmanaPermissionError(message, opts);\n case 404:\n return new DocmanaNotFoundError(message, opts);\n default:\n return new DocmanaError(message, opts);\n }\n}\n","import { DocmanaAuthError } from \"../errors.js\";\nimport type { TokenCache, TokenCacheEntry } from \"../types.js\";\n\nconst SAFETY_MARGIN_MS = 60_000;\n\nexport interface TokenManagerOptions {\n clientId: string;\n clientSecret: string;\n tokenEndpoint: string;\n scope: string;\n fetchImpl: typeof fetch;\n tokenCache?: TokenCache;\n}\n\nexport class TokenManager {\n private token: string | null = null;\n private expiresAt = 0;\n private inflight: Promise<string> | null = null;\n\n constructor(private readonly opts: TokenManagerOptions) {}\n\n invalidate(): void {\n this.token = null;\n this.expiresAt = 0;\n void this.opts.tokenCache?.clear().catch(() => undefined);\n }\n\n async getToken(): Promise<string> {\n if (this.token && Date.now() < this.expiresAt) return this.token;\n const cached = await this.readCachedToken();\n if (cached) return cached;\n if (this.inflight) return this.inflight;\n this.inflight = this.acquire().finally(() => {\n this.inflight = null;\n });\n return this.inflight;\n }\n\n private async acquire(): Promise<string> {\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.opts.clientId,\n client_secret: this.opts.clientSecret,\n scope: this.opts.scope,\n });\n const res = await this.opts.fetchImpl(this.opts.tokenEndpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n if (!res.ok) {\n // Do NOT include the response body verbatim — avoid leaking secrets/echoes.\n throw new DocmanaAuthError(\"Failed to acquire Docmana access token\", { status: res.status });\n }\n const json = (await res.json()) as Partial<{ access_token: string; expires_in: number }>;\n if (\n typeof json.access_token !== \"string\" ||\n json.access_token.length === 0 ||\n typeof json.expires_in !== \"number\" ||\n !Number.isFinite(json.expires_in)\n ) {\n throw new DocmanaAuthError(\"Malformed token response from Docmana CIAM\", {\n status: res.status,\n });\n }\n this.token = json.access_token;\n this.expiresAt = Date.now() + json.expires_in * 1000 - SAFETY_MARGIN_MS;\n await this.writeCachedToken().catch(() => undefined);\n return this.token;\n }\n\n private async readCachedToken(): Promise<string | null> {\n if (!this.opts.tokenCache) return null;\n let entry: TokenCacheEntry | null;\n try {\n entry = await this.opts.tokenCache.read();\n } catch {\n return null;\n }\n if (!entry) return null;\n if (\n entry.clientId !== this.opts.clientId ||\n entry.tokenEndpoint !== this.opts.tokenEndpoint ||\n entry.scope !== this.opts.scope ||\n Date.now() >= entry.expiresAt\n ) {\n await this.opts.tokenCache.clear().catch(() => undefined);\n return null;\n }\n this.token = entry.accessToken;\n this.expiresAt = entry.expiresAt;\n return this.token;\n }\n\n private async writeCachedToken(): Promise<void> {\n if (!this.opts.tokenCache || !this.token) return;\n await this.opts.tokenCache.write({\n accessToken: this.token,\n expiresAt: this.expiresAt,\n clientId: this.opts.clientId,\n tokenEndpoint: this.opts.tokenEndpoint,\n scope: this.opts.scope,\n });\n }\n}\n","import type { DocmanaConfig } from \"./types.js\";\nimport type { TokenCache } from \"./types.js\";\n\nexport const DEFAULTS = {\n apiBaseUrl: \"https://api.docmana.ai\",\n tokenEndpoint:\n \"https://4fe70f5b-e013-4f65-9fa7-3109a33beba5.ciamlogin.com/4fe70f5b-e013-4f65-9fa7-3109a33beba5/oauth2/v2.0/token\",\n scope: \"api://d781e6ba-cc08-4618-8099-ad968abd2b9e/.default\",\n timeoutMs: 300_000,\n pollIntervalMs: 2_000,\n} as const;\n\nexport interface ResolvedConfig {\n clientId: string;\n clientSecret: string;\n apiBaseUrl: string;\n tokenEndpoint: string;\n scope: string;\n timeoutMs: number;\n pollIntervalMs: number;\n fetchImpl: typeof fetch;\n headers: Record<string, string>;\n tokenCache?: TokenCache;\n}\n\nexport function resolveConfig(config: DocmanaConfig): ResolvedConfig {\n if (!config.clientId) throw new Error(\"DocmanaConfig.clientId is required\");\n if (!config.clientSecret) throw new Error(\"DocmanaConfig.clientSecret is required\");\n const apiBaseUrl = (config.apiBaseUrl ?? DEFAULTS.apiBaseUrl).replace(/\\/+$/, \"\");\n return {\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n apiBaseUrl,\n tokenEndpoint: config.tokenEndpoint ?? DEFAULTS.tokenEndpoint,\n scope: config.scope ?? DEFAULTS.scope,\n timeoutMs: config.timeoutMs ?? DEFAULTS.timeoutMs,\n pollIntervalMs: config.pollIntervalMs ?? DEFAULTS.pollIntervalMs,\n fetchImpl: config.fetch ?? fetch,\n headers: config.headers ?? {},\n tokenCache: config.tokenCache,\n };\n}\n","import type { TokenManager } from \"../auth/token-manager.js\";\nimport { DocmanaError, DocmanaAbortError, errorFromResponse } from \"../errors.js\";\n\nexport interface HttpClientOptions {\n apiBaseUrl: string;\n fetchImpl: typeof fetch;\n tokenManager: TokenManager;\n headers?: Record<string, string>;\n}\n\ntype FetchBody = NonNullable<Parameters<typeof fetch>[1]>[\"body\"];\n\nexport interface RequestOptions {\n query?: Record<string, string>;\n body?: FetchBody;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport class HttpClient {\n constructor(private readonly opts: HttpClientOptions) {}\n\n async requestJson<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const res = await this.requestRaw(method, path, options);\n const text = await res.text();\n if (!text) return {} as T;\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new DocmanaError(\"Invalid JSON response from Docmana\", { status: res.status });\n }\n }\n\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n let res = await this.send(method, path, options);\n if (res.status === 401) {\n this.opts.tokenManager.invalidate();\n res = await this.send(method, path, options);\n }\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const message = await this.extractMessage(res);\n throw errorFromResponse(res.status, message, requestId);\n }\n return res;\n }\n\n private async send(method: string, path: string, options: RequestOptions): Promise<Response> {\n const token = await this.opts.tokenManager.getToken();\n const url = new URL(this.opts.apiBaseUrl + path);\n for (const [k, v] of Object.entries(options.query ?? {})) url.searchParams.set(k, v);\n const headers: Record<string, string> = {\n ...(this.opts.headers ?? {}),\n authorization: `Bearer ${token}`,\n ...(options.headers ?? {}),\n };\n try {\n return await this.opts.fetchImpl(url, {\n method,\n headers,\n body: options.body,\n signal: options.signal,\n });\n } catch (err) {\n if (options.signal?.aborted || (err instanceof Error && err.name === \"AbortError\")) {\n throw new DocmanaAbortError(\"Request aborted\");\n }\n throw err;\n }\n }\n\n private async extractMessage(res: Response): Promise<string> {\n try {\n const data = (await res.clone().json()) as { message?: string; error?: string };\n return data.message ?? data.error ?? res.statusText ?? `HTTP ${res.status}`;\n } catch {\n return res.statusText ?? `HTTP ${res.status}`;\n }\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport type { FileInput, RunFlowInput } from \"../types.js\";\n\nexport interface ResolvedPart {\n data: Blob;\n filename: string;\n contentType: string;\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".tif\": \"image/tiff\",\n \".tiff\": \"image/tiff\",\n \".txt\": \"text/plain\",\n \".json\": \"application/json\",\n};\n\nfunction contentTypeFor(name: string): string {\n const dot = name.lastIndexOf(\".\");\n if (dot < 0) return \"application/octet-stream\";\n const ext = name.slice(dot).toLowerCase();\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction isReadable(x: unknown): x is Readable {\n return typeof x === \"object\" && x !== null && typeof (x as Readable).pipe === \"function\";\n}\n\nfunction isPathInput(x: unknown): x is { path: string } {\n return typeof x === \"object\" && x !== null && typeof (x as { path?: unknown }).path === \"string\";\n}\n\nasync function streamToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) chunks.push(Buffer.from(chunk));\n return Buffer.concat(chunks);\n}\n\nasync function resolveOne(input: FileInput, fallbackName: string): Promise<ResolvedPart> {\n if (typeof input === \"string\" || isPathInput(input)) {\n const path = typeof input === \"string\" ? input : input.path;\n const data = await readFile(path);\n const filename = basename(path);\n return { data: new Blob([data]), filename, contentType: contentTypeFor(filename) };\n }\n if (input instanceof Uint8Array) {\n return {\n data: new Blob([input]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n if (isReadable(input)) {\n const buf = await streamToBuffer(input);\n return {\n data: new Blob([buf]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n throw new Error(\"Unsupported file input type\");\n}\n\nexport async function resolveInputs(input: RunFlowInput): Promise<ResolvedPart[]> {\n const list: FileInput[] = input.files ?? (input.file !== undefined ? [input.file] : []);\n if (list.length === 0) throw new Error(\"runFlow requires `file` or `files`\");\n const fallback = input.fileName ?? \"upload.bin\";\n return Promise.all(list.map((item) => resolveOne(item, fallback)));\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ResolvedPart } from \"../files/resolve-input.js\";\n\nexport async function uploadFiles(\n http: HttpClient,\n parts: ResolvedPart[],\n signal?: AbortSignal,\n): Promise<string[]> {\n const ids: string[] = [];\n for (const part of parts) {\n const form = new FormData();\n form.append(\"files\", new File([part.data], part.filename, { type: part.contentType }));\n const res = await http.requestJson<{ id: string }>(\"POST\", \"/upload\", { body: form, signal });\n ids.push(res.id);\n }\n return ids;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\n\nexport async function runFlow(\n http: HttpClient,\n flowId: string,\n uuidFiles: string[],\n signal?: AbortSignal,\n once = false,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const res = await http.requestJson<{ execution_result_id: string }>(\"POST\", path, {\n query: { async_mode: \"true\" },\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ uuid_files: uuidFiles }),\n signal,\n });\n return res.execution_result_id;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ExecutionStatus } from \"../types.js\";\n\nexport async function getStatus(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<{ status: ExecutionStatus | string }> {\n return http.requestJson(\"GET\", `/flows/execution-status/${executionResultId}`, { signal });\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\n\nexport async function getResult(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<DocmanaApiExecutionResult> {\n return http.requestJson(\"GET\", `/flows/execution-result/${executionResultId}`, { signal });\n}\n","import { DocmanaTimeoutError, DocmanaAbortError } from \"../errors.js\";\n\nconst TERMINAL = new Set([\"Completed\", \"Failed\"]);\n\nexport interface PollOptions {\n check: () => Promise<string>;\n intervalMs: number;\n timeoutMs: number;\n sleep?: (ms: number) => Promise<void>;\n elapsed?: () => number;\n signal?: AbortSignal;\n}\n\nconst defaultSleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\nexport async function pollUntilTerminal(opts: PollOptions): Promise<string> {\n const sleep = opts.sleep ?? defaultSleep;\n const start = Date.now();\n const elapsed = opts.elapsed ?? (() => Date.now() - start);\n for (;;) {\n if (opts.signal?.aborted) throw new DocmanaAbortError(\"Polling aborted\");\n const status = await opts.check();\n if (TERMINAL.has(status)) return status;\n if (elapsed() >= opts.timeoutMs) {\n throw new DocmanaTimeoutError(`Execution did not finish within ${opts.timeoutMs}ms`);\n }\n await sleep(opts.intervalMs);\n }\n}\n","import { DocmanaError } from \"../errors.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\nimport type { DocmanaApiNodeResult } from \"../models/docmana-api-node-result.model.js\";\nimport type { DocmanaExecutionResult } from \"../models/docmana-execution-result.model.js\";\nimport type { DocmanaDocumentResult } from \"../models/docmana-document-result.model.js\";\nimport type { DocmanaNodeResult } from \"../models/docmana-node-result.model.js\";\nimport type { DocmanaScoreNodeResult } from \"../models/docmana-score-node-result.model.js\";\nimport type { DocmanaCrossValidationResult } from \"../models/docmana-cross-validation-result.model.js\";\nimport type { DocmanaConclusionResult } from \"../models/docmana-conclusion-result.model.js\";\n\nfunction extractNodeFields(\n rawNode: DocmanaApiNodeResult,\n targetLanguage?: string,\n): DocmanaNodeResult {\n const metadataFields = new Set([\n \"node_id\",\n \"node_name\",\n \"node_type\",\n \"feature_name\",\n \"running_time\",\n \"status\",\n \"score\",\n \"feedback\",\n \"translations\",\n \"tokens\",\n \"input_tokens\",\n \"output_tokens\",\n \"errors\",\n \"mana\",\n \"model\",\n \"tool_calls\",\n \"prompt_id\",\n \"prompt\",\n \"prompt_name\",\n \"label\",\n \"scoreDescription\",\n \"score_description\",\n \"result\",\n \"documentType\",\n ]);\n\n let sourceObj: Record<string, unknown> = rawNode;\n if (targetLanguage) {\n const translations = rawNode.translations;\n if (!translations || !translations[targetLanguage]) {\n throw new DocmanaError(\n `Translation for language '${targetLanguage}' is missing on node '${rawNode.node_name || rawNode.node_id}'`,\n { code: \"translation_missing\", status: 400 },\n );\n }\n sourceObj = translations[targetLanguage] as Record<string, unknown>;\n }\n\n const dynamicFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(sourceObj)) {\n if (!metadataFields.has(key)) {\n dynamicFields[key] = value;\n }\n }\n\n const sdkNode: DocmanaScoreNodeResult = {\n status: rawNode.status || \"Unknown\",\n };\n\n if (rawNode.errors && rawNode.errors.length > 0) {\n sdkNode.errors = rawNode.errors;\n }\n\n const nodeType = rawNode.node_type || \"\";\n const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion)$/i.test(nodeType);\n if (isScoreNode) {\n if (rawNode.score !== undefined && rawNode.score !== null) {\n sdkNode.score = rawNode.score;\n }\n if (rawNode.feedback !== undefined && rawNode.feedback !== null) {\n sdkNode.feedback = rawNode.feedback;\n }\n }\n\n if (Object.keys(dynamicFields).length > 0) {\n sdkNode.data = dynamicFields;\n }\n\n return sdkNode;\n}\n\nexport function mapExecutionResult(\n raw: DocmanaApiExecutionResult,\n targetLanguage?: string,\n): DocmanaExecutionResult {\n const sdkResult: DocmanaExecutionResult = {\n status: raw.status || \"Unknown\",\n executionId: String(raw.execution_id || raw.executionResultId || raw.execution_result_id || \"\"),\n documents: {\n mappings: [],\n },\n };\n\n if (raw.errors && raw.errors.length > 0) {\n sdkResult.errors = raw.errors;\n }\n\n const results = raw.results || [];\n\n for (const item of results) {\n const isDocSpecific = !!item.document;\n\n if (isDocSpecific && item.document) {\n const docReq = item.document;\n const docKey = docReq.doc_key || \"unknown_doc\";\n const docName = docReq.name || \"\";\n\n sdkResult.documents.mappings.push({\n name: docName,\n reference: docKey,\n });\n\n const docResult: DocmanaDocumentResult = {\n status: item.status || docReq.status || \"Unknown\",\n extractions: {},\n validations: {},\n };\n\n const nodeResults = item.node_results || [];\n\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^Classification$/i.test(nodeType)) {\n const mappedNode = extractNodeFields(node, targetLanguage);\n if (!docResult.classifications) {\n docResult.classifications = {};\n }\n docResult.classifications[nodeName] = mappedNode;\n } else if (/^MetadataExtraction$/i.test(nodeType)) {\n docResult.metadataExtraction = extractNodeFields(node, targetLanguage);\n } else if (/^Extraction$/i.test(nodeType)) {\n if (docResult.extractions) {\n docResult.extractions[nodeName] = extractNodeFields(node, targetLanguage);\n }\n } else if (/^Validation$/i.test(nodeType)) {\n if (docResult.validations) {\n docResult.validations[nodeName] = extractNodeFields(node, targetLanguage);\n }\n }\n }\n\n if (docResult.extractions && Object.keys(docResult.extractions).length === 0) {\n delete docResult.extractions;\n }\n if (docResult.validations && Object.keys(docResult.validations).length === 0) {\n delete docResult.validations;\n }\n\n sdkResult.documents[docKey] = docResult;\n } else {\n const nodeResults = item.node_results || [];\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^CrossValidation$/i.test(nodeType)) {\n if (!sdkResult.crossValidations) {\n sdkResult.crossValidations = {};\n }\n sdkResult.crossValidations[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaCrossValidationResult;\n } else if (/^(Conclusion|Finish)$/i.test(nodeType)) {\n if (!sdkResult.conclusions) {\n sdkResult.conclusions = {};\n }\n sdkResult.conclusions[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaConclusionResult;\n }\n }\n }\n }\n\n return sdkResult;\n}\n","import { resolveConfig } from \"./config.js\";\nimport type { ResolvedConfig } from \"./config.js\";\nimport type {\n DocmanaConfig,\n DocmanaExecutionResult,\n ExecutionStatus,\n RunFlowInput,\n} from \"./types.js\";\nimport { TokenManager } from \"./auth/token-manager.js\";\nimport { HttpClient } from \"./http/http-client.js\";\nimport { resolveInputs } from \"./files/resolve-input.js\";\nimport { uploadFiles } from \"./api/upload.js\";\nimport { runFlow as runFlowApi } from \"./api/run-flow.js\";\nimport { getStatus as getStatusApi } from \"./api/execution-status.js\";\nimport { getResult as getResultApi } from \"./api/execution-result.js\";\nimport { pollUntilTerminal } from \"./polling/poll.js\";\nimport { DocmanaExecutionError } from \"./errors.js\";\nimport { mapExecutionResult } from \"./mappers/index.js\";\n\nexport class Docmana {\n private readonly config: ResolvedConfig;\n private readonly http: HttpClient;\n\n constructor(config: DocmanaConfig) {\n this.config = resolveConfig(config);\n const tokenManager = new TokenManager({\n clientId: this.config.clientId,\n clientSecret: this.config.clientSecret,\n tokenEndpoint: this.config.tokenEndpoint,\n scope: this.config.scope,\n fetchImpl: this.config.fetchImpl,\n tokenCache: this.config.tokenCache,\n });\n this.http = new HttpClient({\n apiBaseUrl: this.config.apiBaseUrl,\n fetchImpl: this.config.fetchImpl,\n tokenManager,\n headers: this.config.headers,\n });\n }\n\n async runFlowAsync(\n flowId: string,\n input: RunFlowInput,\n ): Promise<{ executionResultId: string; fileIds: string[] }> {\n const parts = await resolveInputs(input);\n const fileIds = await uploadFiles(this.http, parts, input.signal);\n const executionResultId = await runFlowApi(\n this.http,\n flowId,\n fileIds,\n input.signal,\n input.once ?? false,\n );\n return { executionResultId, fileIds };\n }\n\n async getStatus(\n executionResultId: string,\n signal?: AbortSignal,\n ): Promise<{ status: ExecutionStatus | string }> {\n return getStatusApi(this.http, executionResultId, signal);\n }\n\n async getResult(\n executionResultId: string,\n signal?: AbortSignal,\n language?: string,\n ): Promise<DocmanaExecutionResult> {\n const rawResult = await getResultApi(this.http, executionResultId, signal);\n return mapExecutionResult(rawResult, language);\n }\n\n async runFlow(flowId: string, input: RunFlowInput): Promise<DocmanaExecutionResult> {\n const { executionResultId } = await this.runFlowAsync(flowId, input);\n await pollUntilTerminal({\n check: async () => (await this.getStatus(executionResultId, input.signal)).status,\n intervalMs: input.pollIntervalMs ?? this.config.pollIntervalMs,\n timeoutMs: input.timeoutMs ?? this.config.timeoutMs,\n signal: input.signal,\n });\n const result = await this.getResult(executionResultId, input.signal, input.language);\n if (result.status === \"Failed\") {\n throw new DocmanaExecutionError(\n `Flow ${flowId} execution failed`,\n result.errors ?? [],\n result,\n );\n }\n return result;\n }\n}\n"],"mappings":"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","names":["readFile","readFile"]}
package/dist/index.d.cts CHANGED
@@ -1,3 +1,59 @@
1
+ interface DocmanaDocumentMapping {
2
+ name: string;
3
+ reference: string;
4
+ }
5
+
6
+ interface DocmanaNodeResult {
7
+ status: string;
8
+ errors?: string[];
9
+ data?: Record<string, unknown>;
10
+ }
11
+
12
+ interface DocmanaScoreNodeResult extends DocmanaNodeResult {
13
+ score?: number;
14
+ feedback?: string;
15
+ }
16
+
17
+ interface DocmanaClassificationResult extends DocmanaScoreNodeResult {
18
+ }
19
+
20
+ interface DocmanaMetadataExtractionResult extends DocmanaNodeResult {
21
+ }
22
+
23
+ interface DocmanaExtractionResult extends DocmanaNodeResult {
24
+ }
25
+
26
+ interface DocmanaValidationResult extends DocmanaScoreNodeResult {
27
+ }
28
+
29
+ interface DocmanaDocumentResult {
30
+ status: string;
31
+ classifications?: Record<string, DocmanaClassificationResult>;
32
+ metadataExtraction?: DocmanaMetadataExtractionResult;
33
+ extractions?: Record<string, DocmanaExtractionResult>;
34
+ validations?: Record<string, DocmanaValidationResult>;
35
+ }
36
+
37
+ interface DocmanaCrossValidationResult extends DocmanaScoreNodeResult {
38
+ }
39
+
40
+ interface DocmanaConclusionResult extends DocmanaScoreNodeResult {
41
+ }
42
+
43
+ interface DocmanaExecutionResult {
44
+ status: string;
45
+ executionId: string;
46
+ errors?: string[];
47
+ documents: {
48
+ mappings: DocmanaDocumentMapping[];
49
+ [docKey: string]: DocmanaDocumentResult | DocmanaDocumentMapping[];
50
+ };
51
+ crossValidations?: Record<string, DocmanaCrossValidationResult>;
52
+ conclusions?: Record<string, DocmanaConclusionResult>;
53
+ }
54
+
55
+ type ExecutionStatus = "Pending" | "Running" | "Incompleted" | "Completed" | "Failed";
56
+
1
57
  interface DocmanaConfig {
2
58
  clientId: string;
3
59
  clientSecret: string;
@@ -34,14 +90,7 @@ interface RunFlowInput {
34
90
  timeoutMs?: number;
35
91
  pollIntervalMs?: number;
36
92
  once?: boolean;
37
- }
38
- type ExecutionStatus = "Pending" | "Running" | "Incompleted" | "Completed" | "Failed";
39
- interface ExecutionResult {
40
- status: ExecutionStatus | string;
41
- execution_id?: string;
42
- results?: unknown[];
43
- errors?: unknown[];
44
- [key: string]: unknown;
93
+ language?: string;
45
94
  }
46
95
 
47
96
  declare class Docmana {
@@ -55,8 +104,8 @@ declare class Docmana {
55
104
  getStatus(executionResultId: string, signal?: AbortSignal): Promise<{
56
105
  status: ExecutionStatus | string;
57
106
  }>;
58
- getResult(executionResultId: string, signal?: AbortSignal): Promise<ExecutionResult>;
59
- runFlow(flowId: string, input: RunFlowInput): Promise<ExecutionResult>;
107
+ getResult(executionResultId: string, signal?: AbortSignal, language?: string): Promise<DocmanaExecutionResult>;
108
+ runFlow(flowId: string, input: RunFlowInput): Promise<DocmanaExecutionResult>;
60
109
  }
61
110
 
62
111
  declare class DocmanaError extends Error {
@@ -95,7 +144,8 @@ declare class DocmanaRequestError extends DocmanaError {
95
144
  }
96
145
  declare class DocmanaExecutionError extends DocmanaError {
97
146
  readonly errors: unknown[];
98
- constructor(message: string, errors?: unknown[]);
147
+ readonly result?: DocmanaExecutionResult;
148
+ constructor(message: string, errors?: unknown[], result?: DocmanaExecutionResult);
99
149
  }
100
150
  declare class DocmanaTimeoutError extends DocmanaError {
101
151
  constructor(message: string);
@@ -104,4 +154,179 @@ declare class DocmanaAbortError extends DocmanaError {
104
154
  constructor(message: string);
105
155
  }
106
156
 
107
- export { Docmana, DocmanaAbortError, DocmanaAuthError, type DocmanaConfig, DocmanaError, DocmanaExecutionError, DocmanaNotFoundError, DocmanaPermissionError, DocmanaRequestError, DocmanaTimeoutError, type ExecutionResult, type ExecutionStatus, type FileInput, type RunFlowInput };
157
+ interface PhysicalDocument {
158
+ physical_document_name: string;
159
+ physical_document_id: string;
160
+ physical_document_path?: string;
161
+ page_from: number;
162
+ page_to: number;
163
+ physical_document_url?: string;
164
+ metadata?: Record<string, unknown>;
165
+ }
166
+
167
+ interface DocumentContent {
168
+ coordinates_unit?: string;
169
+ pages?: Array<Array<Record<string, unknown>>>;
170
+ }
171
+
172
+ interface VirtualDocument {
173
+ source: PhysicalDocument;
174
+ virtual_document_name: string;
175
+ virtual_document_id: string;
176
+ is_translated: boolean;
177
+ document_types?: string[];
178
+ content?: DocumentContent;
179
+ }
180
+
181
+ type FlowNodeType = "Start" | "Finish" | "DataMapping" | "Classification" | "Extraction" | "Validation" | "CrossValidation" | "MetadataExtraction";
182
+
183
+ interface FlowConfigs {
184
+ description?: string | null;
185
+ useIntelligentSplitting: boolean;
186
+ useSplittingAsContextOnly: boolean;
187
+ useDetectAndClassifyPII: boolean;
188
+ enableChatFeature: boolean;
189
+ defaultLanguage?: string | null;
190
+ additionalLanguages?: string[] | null;
191
+ enableDocumentPersistenceForViewing: boolean;
192
+ preClassificationAggregatorPrompt?: string | null;
193
+ preClassificationSummarizerPrompt?: string | null;
194
+ enforceSingleClassificationPerDocument?: boolean | null;
195
+ useFraudDetection: boolean;
196
+ fraudDetectionThreshold: number;
197
+ useMetadataExtraction: boolean;
198
+ }
199
+
200
+ interface FlowNodePromptMessage {
201
+ role: string;
202
+ content: string;
203
+ type?: string | null;
204
+ }
205
+ interface FlowNodePromptOutputStructure {
206
+ output_structure: Record<string, {
207
+ type: string;
208
+ description?: string | null;
209
+ items?: Record<string, unknown> | null;
210
+ properties?: Record<string, unknown> | null;
211
+ context?: string | null;
212
+ }>;
213
+ }
214
+ interface FlowNode {
215
+ node_id: string;
216
+ label: string;
217
+ unique_name?: string | null;
218
+ type: FlowNodeType;
219
+ has_single_document_type: boolean;
220
+ prompt_id?: string | null;
221
+ commit?: string | null;
222
+ target_language?: string | null;
223
+ mock_results?: Record<string, unknown> | null;
224
+ enabled?: boolean;
225
+ model?: string | null;
226
+ classification_priority?: number;
227
+ prompt_messages?: {
228
+ messages: FlowNodePromptMessage[];
229
+ } | null;
230
+ prompt_output_structure?: FlowNodePromptOutputStructure | null;
231
+ }
232
+
233
+ interface FlowEdge {
234
+ source: string;
235
+ target: string;
236
+ }
237
+
238
+ interface Flow {
239
+ flow_id: string;
240
+ name: string;
241
+ version: number;
242
+ configs: FlowConfigs;
243
+ nodes: FlowNode[];
244
+ edges: FlowEdge[];
245
+ }
246
+
247
+ interface NodeTranslationResult {
248
+ status?: string;
249
+ running_time?: number | null;
250
+ feedback?: string | null;
251
+ score?: number | null;
252
+ [key: string]: unknown;
253
+ }
254
+
255
+ interface ExecutionProgress {
256
+ status: string;
257
+ errors?: string[];
258
+ }
259
+
260
+ interface DocmanaApiDocumentRequest {
261
+ name: string;
262
+ file_extension: string;
263
+ sas_url: string;
264
+ blob_name: string;
265
+ uuid_file: string;
266
+ physical_document_id?: string | null;
267
+ doc_key: string | null;
268
+ status?: string | null;
269
+ error_message?: string | null;
270
+ message?: string | null;
271
+ message_code?: string | null;
272
+ metadata?: Record<string, unknown> | null;
273
+ is_temporary_upload?: boolean;
274
+ }
275
+
276
+ interface DocmanaApiNodeResult {
277
+ node_id?: string;
278
+ node_name?: string | null;
279
+ node_type?: string | null;
280
+ feature_name?: string | null;
281
+ running_time?: number | null;
282
+ status?: string;
283
+ score?: number | null;
284
+ feedback?: string | null;
285
+ translations?: Record<string, NodeTranslationResult> | null;
286
+ tokens?: number | null;
287
+ input_tokens?: number | null;
288
+ output_tokens?: number | null;
289
+ errors?: string[];
290
+ mana?: number | null;
291
+ model?: string | null;
292
+ tool_calls?: Record<string, unknown>[] | null;
293
+ prompt_id?: string | null;
294
+ prompt?: string | null;
295
+ prompt_name?: string | null;
296
+ label?: string | null;
297
+ scoreDescription?: string | null;
298
+ score_description?: string | null;
299
+ result?: unknown;
300
+ documentType?: string | null;
301
+ [key: string]: unknown;
302
+ }
303
+
304
+ interface DocmanaApiDocumentExecutionResult {
305
+ document?: DocmanaApiDocumentRequest;
306
+ node_results?: DocmanaApiNodeResult[];
307
+ status?: string;
308
+ error?: string | null;
309
+ [key: string]: unknown;
310
+ }
311
+
312
+ interface DocmanaApiExecutionResult {
313
+ status: ExecutionStatus | string;
314
+ error?: string;
315
+ errors?: string[];
316
+ document_requests?: DocmanaApiDocumentRequest[];
317
+ flow?: Flow | null;
318
+ results?: DocmanaApiDocumentExecutionResult[];
319
+ restructured_documents?: VirtualDocument[];
320
+ execution_id?: string;
321
+ total_running_time?: number;
322
+ total_running_time_node?: number;
323
+ total_tokens?: number;
324
+ total_input_tokens?: number;
325
+ total_output_tokens?: number;
326
+ total_documents?: number;
327
+ total_pages?: number;
328
+ event_timestamp?: string;
329
+ [key: string]: unknown;
330
+ }
331
+
332
+ 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 };