@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/CHANGELOG.md +11 -0
- package/dist/cli.mjs +365 -59
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.cts +237 -12
- package/dist/index.d.ts +237 -12
- package/dist/index.js +162 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +162 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -60,9 +60,11 @@ var DocmanaRequestError = class extends DocmanaError {
|
|
|
60
60
|
};
|
|
61
61
|
var DocmanaExecutionError = class extends DocmanaError {
|
|
62
62
|
errors;
|
|
63
|
-
|
|
63
|
+
result;
|
|
64
|
+
constructor(message, errors = [], result) {
|
|
64
65
|
super(message, { code: "execution_failed" });
|
|
65
66
|
this.errors = errors;
|
|
67
|
+
this.result = result;
|
|
66
68
|
}
|
|
67
69
|
};
|
|
68
70
|
var DocmanaTimeoutError = class extends DocmanaError {
|
|
@@ -346,6 +348,156 @@ async function pollUntilTerminal(opts) {
|
|
|
346
348
|
}
|
|
347
349
|
}
|
|
348
350
|
|
|
351
|
+
// src/mappers/mapper.ts
|
|
352
|
+
function extractNodeFields(rawNode, targetLanguage) {
|
|
353
|
+
const metadataFields = /* @__PURE__ */ new Set([
|
|
354
|
+
"node_id",
|
|
355
|
+
"node_name",
|
|
356
|
+
"node_type",
|
|
357
|
+
"feature_name",
|
|
358
|
+
"running_time",
|
|
359
|
+
"status",
|
|
360
|
+
"score",
|
|
361
|
+
"feedback",
|
|
362
|
+
"translations",
|
|
363
|
+
"tokens",
|
|
364
|
+
"input_tokens",
|
|
365
|
+
"output_tokens",
|
|
366
|
+
"errors",
|
|
367
|
+
"mana",
|
|
368
|
+
"model",
|
|
369
|
+
"tool_calls",
|
|
370
|
+
"prompt_id",
|
|
371
|
+
"prompt",
|
|
372
|
+
"prompt_name",
|
|
373
|
+
"label",
|
|
374
|
+
"scoreDescription",
|
|
375
|
+
"score_description",
|
|
376
|
+
"result",
|
|
377
|
+
"documentType"
|
|
378
|
+
]);
|
|
379
|
+
let sourceObj = rawNode;
|
|
380
|
+
if (targetLanguage) {
|
|
381
|
+
const translations = rawNode.translations;
|
|
382
|
+
if (!translations || !translations[targetLanguage]) {
|
|
383
|
+
throw new DocmanaError(
|
|
384
|
+
`Translation for language '${targetLanguage}' is missing on node '${rawNode.node_name || rawNode.node_id}'`,
|
|
385
|
+
{ code: "translation_missing", status: 400 }
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
sourceObj = translations[targetLanguage];
|
|
389
|
+
}
|
|
390
|
+
const dynamicFields = {};
|
|
391
|
+
for (const [key, value] of Object.entries(sourceObj)) {
|
|
392
|
+
if (!metadataFields.has(key)) {
|
|
393
|
+
dynamicFields[key] = value;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
const sdkNode = {
|
|
397
|
+
status: rawNode.status || "Unknown"
|
|
398
|
+
};
|
|
399
|
+
if (rawNode.errors && rawNode.errors.length > 0) {
|
|
400
|
+
sdkNode.errors = rawNode.errors;
|
|
401
|
+
}
|
|
402
|
+
const nodeType = rawNode.node_type || "";
|
|
403
|
+
const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion)$/i.test(nodeType);
|
|
404
|
+
if (isScoreNode) {
|
|
405
|
+
if (rawNode.score !== void 0 && rawNode.score !== null) {
|
|
406
|
+
sdkNode.score = rawNode.score;
|
|
407
|
+
}
|
|
408
|
+
if (rawNode.feedback !== void 0 && rawNode.feedback !== null) {
|
|
409
|
+
sdkNode.feedback = rawNode.feedback;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
if (Object.keys(dynamicFields).length > 0) {
|
|
413
|
+
sdkNode.data = dynamicFields;
|
|
414
|
+
}
|
|
415
|
+
return sdkNode;
|
|
416
|
+
}
|
|
417
|
+
function mapExecutionResult(raw, targetLanguage) {
|
|
418
|
+
const sdkResult = {
|
|
419
|
+
status: raw.status || "Unknown",
|
|
420
|
+
executionId: String(raw.execution_id || raw.executionResultId || raw.execution_result_id || ""),
|
|
421
|
+
documents: {
|
|
422
|
+
mappings: []
|
|
423
|
+
}
|
|
424
|
+
};
|
|
425
|
+
if (raw.errors && raw.errors.length > 0) {
|
|
426
|
+
sdkResult.errors = raw.errors;
|
|
427
|
+
}
|
|
428
|
+
const results = raw.results || [];
|
|
429
|
+
for (const item of results) {
|
|
430
|
+
const isDocSpecific = !!item.document;
|
|
431
|
+
if (isDocSpecific && item.document) {
|
|
432
|
+
const docReq = item.document;
|
|
433
|
+
const docKey = docReq.doc_key || "unknown_doc";
|
|
434
|
+
const docName = docReq.name || "";
|
|
435
|
+
sdkResult.documents.mappings.push({
|
|
436
|
+
name: docName,
|
|
437
|
+
reference: docKey
|
|
438
|
+
});
|
|
439
|
+
const docResult = {
|
|
440
|
+
status: item.status || docReq.status || "Unknown",
|
|
441
|
+
extractions: {},
|
|
442
|
+
validations: {}
|
|
443
|
+
};
|
|
444
|
+
const nodeResults = item.node_results || [];
|
|
445
|
+
for (const node of nodeResults) {
|
|
446
|
+
const nodeType = node.node_type || "";
|
|
447
|
+
const nodeName = node.node_name || node.node_id || "unknown_node";
|
|
448
|
+
if (/^Classification$/i.test(nodeType)) {
|
|
449
|
+
const mappedNode = extractNodeFields(node, targetLanguage);
|
|
450
|
+
if (!docResult.classifications) {
|
|
451
|
+
docResult.classifications = {};
|
|
452
|
+
}
|
|
453
|
+
docResult.classifications[nodeName] = mappedNode;
|
|
454
|
+
} else if (/^MetadataExtraction$/i.test(nodeType)) {
|
|
455
|
+
docResult.metadataExtraction = extractNodeFields(node, targetLanguage);
|
|
456
|
+
} else if (/^Extraction$/i.test(nodeType)) {
|
|
457
|
+
if (docResult.extractions) {
|
|
458
|
+
docResult.extractions[nodeName] = extractNodeFields(node, targetLanguage);
|
|
459
|
+
}
|
|
460
|
+
} else if (/^Validation$/i.test(nodeType)) {
|
|
461
|
+
if (docResult.validations) {
|
|
462
|
+
docResult.validations[nodeName] = extractNodeFields(node, targetLanguage);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
if (docResult.extractions && Object.keys(docResult.extractions).length === 0) {
|
|
467
|
+
delete docResult.extractions;
|
|
468
|
+
}
|
|
469
|
+
if (docResult.validations && Object.keys(docResult.validations).length === 0) {
|
|
470
|
+
delete docResult.validations;
|
|
471
|
+
}
|
|
472
|
+
sdkResult.documents[docKey] = docResult;
|
|
473
|
+
} else {
|
|
474
|
+
const nodeResults = item.node_results || [];
|
|
475
|
+
for (const node of nodeResults) {
|
|
476
|
+
const nodeType = node.node_type || "";
|
|
477
|
+
const nodeName = node.node_name || node.node_id || "unknown_node";
|
|
478
|
+
if (/^CrossValidation$/i.test(nodeType)) {
|
|
479
|
+
if (!sdkResult.crossValidations) {
|
|
480
|
+
sdkResult.crossValidations = {};
|
|
481
|
+
}
|
|
482
|
+
sdkResult.crossValidations[nodeName] = extractNodeFields(
|
|
483
|
+
node,
|
|
484
|
+
targetLanguage
|
|
485
|
+
);
|
|
486
|
+
} else if (/^(Conclusion|Finish)$/i.test(nodeType)) {
|
|
487
|
+
if (!sdkResult.conclusions) {
|
|
488
|
+
sdkResult.conclusions = {};
|
|
489
|
+
}
|
|
490
|
+
sdkResult.conclusions[nodeName] = extractNodeFields(
|
|
491
|
+
node,
|
|
492
|
+
targetLanguage
|
|
493
|
+
);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
return sdkResult;
|
|
499
|
+
}
|
|
500
|
+
|
|
349
501
|
// src/client.ts
|
|
350
502
|
var Docmana = class {
|
|
351
503
|
config;
|
|
@@ -382,8 +534,9 @@ var Docmana = class {
|
|
|
382
534
|
async getStatus(executionResultId, signal) {
|
|
383
535
|
return getStatus(this.http, executionResultId, signal);
|
|
384
536
|
}
|
|
385
|
-
async getResult(executionResultId, signal) {
|
|
386
|
-
|
|
537
|
+
async getResult(executionResultId, signal, language) {
|
|
538
|
+
const rawResult = await getResult(this.http, executionResultId, signal);
|
|
539
|
+
return mapExecutionResult(rawResult, language);
|
|
387
540
|
}
|
|
388
541
|
async runFlow(flowId, input) {
|
|
389
542
|
const { executionResultId } = await this.runFlowAsync(flowId, input);
|
|
@@ -393,9 +546,13 @@ var Docmana = class {
|
|
|
393
546
|
timeoutMs: input.timeoutMs ?? this.config.timeoutMs,
|
|
394
547
|
signal: input.signal
|
|
395
548
|
});
|
|
396
|
-
const result = await this.getResult(executionResultId, input.signal);
|
|
549
|
+
const result = await this.getResult(executionResultId, input.signal, input.language);
|
|
397
550
|
if (result.status === "Failed") {
|
|
398
|
-
throw new DocmanaExecutionError(
|
|
551
|
+
throw new DocmanaExecutionError(
|
|
552
|
+
`Flow ${flowId} execution failed`,
|
|
553
|
+
result.errors ?? [],
|
|
554
|
+
result
|
|
555
|
+
);
|
|
399
556
|
}
|
|
400
557
|
return result;
|
|
401
558
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/auth/token-manager.ts","../src/http/http-client.ts","../src/files/resolve-input.ts","../src/api/upload.ts","../src/api/run-flow.ts","../src/api/execution-status.ts","../src/api/execution-result.ts","../src/polling/poll.ts","../src/client.ts"],"sourcesContent":["import type { DocmanaConfig } from \"./types.js\";\nimport type { TokenCache } from \"./types.js\";\n\nexport const DEFAULTS = {\n apiBaseUrl: \"https://api.docmana.ai\",\n tokenEndpoint:\n \"https://4fe70f5b-e013-4f65-9fa7-3109a33beba5.ciamlogin.com/4fe70f5b-e013-4f65-9fa7-3109a33beba5/oauth2/v2.0/token\",\n scope: \"api://d781e6ba-cc08-4618-8099-ad968abd2b9e/.default\",\n timeoutMs: 300_000,\n pollIntervalMs: 2_000,\n} as const;\n\nexport interface ResolvedConfig {\n clientId: string;\n clientSecret: string;\n apiBaseUrl: string;\n tokenEndpoint: string;\n scope: string;\n timeoutMs: number;\n pollIntervalMs: number;\n fetchImpl: typeof fetch;\n headers: Record<string, string>;\n tokenCache?: TokenCache;\n}\n\nexport function resolveConfig(config: DocmanaConfig): ResolvedConfig {\n if (!config.clientId) throw new Error(\"DocmanaConfig.clientId is required\");\n if (!config.clientSecret) throw new Error(\"DocmanaConfig.clientSecret is required\");\n const apiBaseUrl = (config.apiBaseUrl ?? DEFAULTS.apiBaseUrl).replace(/\\/+$/, \"\");\n return {\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n apiBaseUrl,\n tokenEndpoint: config.tokenEndpoint ?? DEFAULTS.tokenEndpoint,\n scope: config.scope ?? DEFAULTS.scope,\n timeoutMs: config.timeoutMs ?? DEFAULTS.timeoutMs,\n pollIntervalMs: config.pollIntervalMs ?? DEFAULTS.pollIntervalMs,\n fetchImpl: config.fetch ?? fetch,\n headers: config.headers ?? {},\n tokenCache: config.tokenCache,\n };\n}\n","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 { 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":[]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/auth/token-manager.ts","../src/http/http-client.ts","../src/files/resolve-input.ts","../src/api/upload.ts","../src/api/run-flow.ts","../src/api/execution-status.ts","../src/api/execution-result.ts","../src/polling/poll.ts","../src/mappers/mapper.ts","../src/client.ts"],"sourcesContent":["import type { DocmanaConfig } from \"./types.js\";\nimport type { TokenCache } from \"./types.js\";\n\nexport const DEFAULTS = {\n apiBaseUrl: \"https://api.docmana.ai\",\n tokenEndpoint:\n \"https://4fe70f5b-e013-4f65-9fa7-3109a33beba5.ciamlogin.com/4fe70f5b-e013-4f65-9fa7-3109a33beba5/oauth2/v2.0/token\",\n scope: \"api://d781e6ba-cc08-4618-8099-ad968abd2b9e/.default\",\n timeoutMs: 300_000,\n pollIntervalMs: 2_000,\n} as const;\n\nexport interface ResolvedConfig {\n clientId: string;\n clientSecret: string;\n apiBaseUrl: string;\n tokenEndpoint: string;\n scope: string;\n timeoutMs: number;\n pollIntervalMs: number;\n fetchImpl: typeof fetch;\n headers: Record<string, string>;\n tokenCache?: TokenCache;\n}\n\nexport function resolveConfig(config: DocmanaConfig): ResolvedConfig {\n if (!config.clientId) throw new Error(\"DocmanaConfig.clientId is required\");\n if (!config.clientSecret) throw new Error(\"DocmanaConfig.clientSecret is required\");\n const apiBaseUrl = (config.apiBaseUrl ?? DEFAULTS.apiBaseUrl).replace(/\\/+$/, \"\");\n return {\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n apiBaseUrl,\n tokenEndpoint: config.tokenEndpoint ?? DEFAULTS.tokenEndpoint,\n scope: config.scope ?? DEFAULTS.scope,\n timeoutMs: config.timeoutMs ?? DEFAULTS.timeoutMs,\n pollIntervalMs: config.pollIntervalMs ?? DEFAULTS.pollIntervalMs,\n fetchImpl: config.fetch ?? fetch,\n headers: config.headers ?? {},\n tokenCache: config.tokenCache,\n };\n}\n","import type { DocmanaExecutionResult } from \"./models/docmana-execution-result.model.js\";\n\nexport class DocmanaError extends Error {\n readonly status?: number;\n readonly requestId?: string;\n readonly code: string;\n constructor(message: string, opts: { status?: number; requestId?: string; code?: string } = {}) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.requestId = opts.requestId;\n this.code = opts.code ?? \"docmana_error\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class DocmanaAuthError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"auth_error\" });\n }\n}\n\nexport class DocmanaPermissionError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"permission_error\" });\n }\n}\n\nexport class DocmanaNotFoundError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"not_found\" });\n }\n}\n\nexport class DocmanaRequestError extends DocmanaError {\n constructor(message: string, opts: { status?: number; requestId?: string } = {}) {\n super(message, { ...opts, code: \"bad_request\" });\n }\n}\n\nexport class DocmanaExecutionError extends DocmanaError {\n readonly errors: unknown[];\n readonly result?: DocmanaExecutionResult;\n constructor(message: string, errors: unknown[] = [], result?: DocmanaExecutionResult) {\n super(message, { code: \"execution_failed\" });\n this.errors = errors;\n this.result = result;\n }\n}\n\nexport class DocmanaTimeoutError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"timeout\" });\n }\n}\n\nexport class DocmanaAbortError extends DocmanaError {\n constructor(message: string) {\n super(message, { code: \"aborted\" });\n }\n}\n\nexport function errorFromResponse(\n status: number,\n message: string,\n requestId?: string,\n): DocmanaError {\n const opts = { status, requestId };\n switch (status) {\n case 400:\n return new DocmanaRequestError(message, opts);\n case 401:\n return new DocmanaAuthError(message, opts);\n case 403:\n return new DocmanaPermissionError(message, opts);\n case 404:\n return new DocmanaNotFoundError(message, opts);\n default:\n return new DocmanaError(message, opts);\n }\n}\n","import { DocmanaAuthError } from \"../errors.js\";\nimport type { TokenCache, TokenCacheEntry } from \"../types.js\";\n\nconst SAFETY_MARGIN_MS = 60_000;\n\nexport interface TokenManagerOptions {\n clientId: string;\n clientSecret: string;\n tokenEndpoint: string;\n scope: string;\n fetchImpl: typeof fetch;\n tokenCache?: TokenCache;\n}\n\nexport class TokenManager {\n private token: string | null = null;\n private expiresAt = 0;\n private inflight: Promise<string> | null = null;\n\n constructor(private readonly opts: TokenManagerOptions) {}\n\n invalidate(): void {\n this.token = null;\n this.expiresAt = 0;\n void this.opts.tokenCache?.clear().catch(() => undefined);\n }\n\n async getToken(): Promise<string> {\n if (this.token && Date.now() < this.expiresAt) return this.token;\n const cached = await this.readCachedToken();\n if (cached) return cached;\n if (this.inflight) return this.inflight;\n this.inflight = this.acquire().finally(() => {\n this.inflight = null;\n });\n return this.inflight;\n }\n\n private async acquire(): Promise<string> {\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.opts.clientId,\n client_secret: this.opts.clientSecret,\n scope: this.opts.scope,\n });\n const res = await this.opts.fetchImpl(this.opts.tokenEndpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n if (!res.ok) {\n // Do NOT include the response body verbatim — avoid leaking secrets/echoes.\n throw new DocmanaAuthError(\"Failed to acquire Docmana access token\", { status: res.status });\n }\n const json = (await res.json()) as Partial<{ access_token: string; expires_in: number }>;\n if (\n typeof json.access_token !== \"string\" ||\n json.access_token.length === 0 ||\n typeof json.expires_in !== \"number\" ||\n !Number.isFinite(json.expires_in)\n ) {\n throw new DocmanaAuthError(\"Malformed token response from Docmana CIAM\", {\n status: res.status,\n });\n }\n this.token = json.access_token;\n this.expiresAt = Date.now() + json.expires_in * 1000 - SAFETY_MARGIN_MS;\n await this.writeCachedToken().catch(() => undefined);\n return this.token;\n }\n\n private async readCachedToken(): Promise<string | null> {\n if (!this.opts.tokenCache) return null;\n let entry: TokenCacheEntry | null;\n try {\n entry = await this.opts.tokenCache.read();\n } catch {\n return null;\n }\n if (!entry) return null;\n if (\n entry.clientId !== this.opts.clientId ||\n entry.tokenEndpoint !== this.opts.tokenEndpoint ||\n entry.scope !== this.opts.scope ||\n Date.now() >= entry.expiresAt\n ) {\n await this.opts.tokenCache.clear().catch(() => undefined);\n return null;\n }\n this.token = entry.accessToken;\n this.expiresAt = entry.expiresAt;\n return this.token;\n }\n\n private async writeCachedToken(): Promise<void> {\n if (!this.opts.tokenCache || !this.token) return;\n await this.opts.tokenCache.write({\n accessToken: this.token,\n expiresAt: this.expiresAt,\n clientId: this.opts.clientId,\n tokenEndpoint: this.opts.tokenEndpoint,\n scope: this.opts.scope,\n });\n }\n}\n","import type { TokenManager } from \"../auth/token-manager.js\";\nimport { DocmanaError, DocmanaAbortError, errorFromResponse } from \"../errors.js\";\n\nexport interface HttpClientOptions {\n apiBaseUrl: string;\n fetchImpl: typeof fetch;\n tokenManager: TokenManager;\n headers?: Record<string, string>;\n}\n\ntype FetchBody = NonNullable<Parameters<typeof fetch>[1]>[\"body\"];\n\nexport interface RequestOptions {\n query?: Record<string, string>;\n body?: FetchBody;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport class HttpClient {\n constructor(private readonly opts: HttpClientOptions) {}\n\n async requestJson<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const res = await this.requestRaw(method, path, options);\n const text = await res.text();\n if (!text) return {} as T;\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new DocmanaError(\"Invalid JSON response from Docmana\", { status: res.status });\n }\n }\n\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n let res = await this.send(method, path, options);\n if (res.status === 401) {\n this.opts.tokenManager.invalidate();\n res = await this.send(method, path, options);\n }\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const message = await this.extractMessage(res);\n throw errorFromResponse(res.status, message, requestId);\n }\n return res;\n }\n\n private async send(method: string, path: string, options: RequestOptions): Promise<Response> {\n const token = await this.opts.tokenManager.getToken();\n const url = new URL(this.opts.apiBaseUrl + path);\n for (const [k, v] of Object.entries(options.query ?? {})) url.searchParams.set(k, v);\n const headers: Record<string, string> = {\n ...(this.opts.headers ?? {}),\n authorization: `Bearer ${token}`,\n ...(options.headers ?? {}),\n };\n try {\n return await this.opts.fetchImpl(url, {\n method,\n headers,\n body: options.body,\n signal: options.signal,\n });\n } catch (err) {\n if (options.signal?.aborted || (err instanceof Error && err.name === \"AbortError\")) {\n throw new DocmanaAbortError(\"Request aborted\");\n }\n throw err;\n }\n }\n\n private async extractMessage(res: Response): Promise<string> {\n try {\n const data = (await res.clone().json()) as { message?: string; error?: string };\n return data.message ?? data.error ?? res.statusText ?? `HTTP ${res.status}`;\n } catch {\n return res.statusText ?? `HTTP ${res.status}`;\n }\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport type { FileInput, RunFlowInput } from \"../types.js\";\n\nexport interface ResolvedPart {\n data: Blob;\n filename: string;\n contentType: string;\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".tif\": \"image/tiff\",\n \".tiff\": \"image/tiff\",\n \".txt\": \"text/plain\",\n \".json\": \"application/json\",\n};\n\nfunction contentTypeFor(name: string): string {\n const dot = name.lastIndexOf(\".\");\n if (dot < 0) return \"application/octet-stream\";\n const ext = name.slice(dot).toLowerCase();\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction isReadable(x: unknown): x is Readable {\n return typeof x === \"object\" && x !== null && typeof (x as Readable).pipe === \"function\";\n}\n\nfunction isPathInput(x: unknown): x is { path: string } {\n return typeof x === \"object\" && x !== null && typeof (x as { path?: unknown }).path === \"string\";\n}\n\nasync function streamToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) chunks.push(Buffer.from(chunk));\n return Buffer.concat(chunks);\n}\n\nasync function resolveOne(input: FileInput, fallbackName: string): Promise<ResolvedPart> {\n if (typeof input === \"string\" || isPathInput(input)) {\n const path = typeof input === \"string\" ? input : input.path;\n const data = await readFile(path);\n const filename = basename(path);\n return { data: new Blob([data]), filename, contentType: contentTypeFor(filename) };\n }\n if (input instanceof Uint8Array) {\n return {\n data: new Blob([input]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n if (isReadable(input)) {\n const buf = await streamToBuffer(input);\n return {\n data: new Blob([buf]),\n filename: fallbackName,\n contentType: contentTypeFor(fallbackName),\n };\n }\n throw new Error(\"Unsupported file input type\");\n}\n\nexport async function resolveInputs(input: RunFlowInput): Promise<ResolvedPart[]> {\n const list: FileInput[] = input.files ?? (input.file !== undefined ? [input.file] : []);\n if (list.length === 0) throw new Error(\"runFlow requires `file` or `files`\");\n const fallback = input.fileName ?? \"upload.bin\";\n return Promise.all(list.map((item) => resolveOne(item, fallback)));\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ResolvedPart } from \"../files/resolve-input.js\";\n\nexport async function uploadFiles(\n http: HttpClient,\n parts: ResolvedPart[],\n signal?: AbortSignal,\n): Promise<string[]> {\n const ids: string[] = [];\n for (const part of parts) {\n const form = new FormData();\n form.append(\"files\", new File([part.data], part.filename, { type: part.contentType }));\n const res = await http.requestJson<{ id: string }>(\"POST\", \"/upload\", { body: form, signal });\n ids.push(res.id);\n }\n return ids;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\n\nexport async function runFlow(\n http: HttpClient,\n flowId: string,\n uuidFiles: string[],\n signal?: AbortSignal,\n once = false,\n): Promise<string> {\n const path = once ? `/flows/run_once_flow/${flowId}` : `/flows/run_flow/${flowId}`;\n const res = await http.requestJson<{ execution_result_id: string }>(\"POST\", path, {\n query: { async_mode: \"true\" },\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ uuid_files: uuidFiles }),\n signal,\n });\n return res.execution_result_id;\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { ExecutionStatus } from \"../types.js\";\n\nexport async function getStatus(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<{ status: ExecutionStatus | string }> {\n return http.requestJson(\"GET\", `/flows/execution-status/${executionResultId}`, { signal });\n}\n","import type { HttpClient } from \"../http/http-client.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\n\nexport async function getResult(\n http: HttpClient,\n executionResultId: string,\n signal?: AbortSignal,\n): Promise<DocmanaApiExecutionResult> {\n return http.requestJson(\"GET\", `/flows/execution-result/${executionResultId}`, { signal });\n}\n","import { DocmanaTimeoutError, DocmanaAbortError } from \"../errors.js\";\n\nconst TERMINAL = new Set([\"Completed\", \"Failed\"]);\n\nexport interface PollOptions {\n check: () => Promise<string>;\n intervalMs: number;\n timeoutMs: number;\n sleep?: (ms: number) => Promise<void>;\n elapsed?: () => number;\n signal?: AbortSignal;\n}\n\nconst defaultSleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\nexport async function pollUntilTerminal(opts: PollOptions): Promise<string> {\n const sleep = opts.sleep ?? defaultSleep;\n const start = Date.now();\n const elapsed = opts.elapsed ?? (() => Date.now() - start);\n for (;;) {\n if (opts.signal?.aborted) throw new DocmanaAbortError(\"Polling aborted\");\n const status = await opts.check();\n if (TERMINAL.has(status)) return status;\n if (elapsed() >= opts.timeoutMs) {\n throw new DocmanaTimeoutError(`Execution did not finish within ${opts.timeoutMs}ms`);\n }\n await sleep(opts.intervalMs);\n }\n}\n","import { DocmanaError } from \"../errors.js\";\nimport type { DocmanaApiExecutionResult } from \"../models/docmana-api-execution-result.model.js\";\nimport type { DocmanaApiNodeResult } from \"../models/docmana-api-node-result.model.js\";\nimport type { DocmanaExecutionResult } from \"../models/docmana-execution-result.model.js\";\nimport type { DocmanaDocumentResult } from \"../models/docmana-document-result.model.js\";\nimport type { DocmanaNodeResult } from \"../models/docmana-node-result.model.js\";\nimport type { DocmanaScoreNodeResult } from \"../models/docmana-score-node-result.model.js\";\nimport type { DocmanaCrossValidationResult } from \"../models/docmana-cross-validation-result.model.js\";\nimport type { DocmanaConclusionResult } from \"../models/docmana-conclusion-result.model.js\";\n\nfunction extractNodeFields(\n rawNode: DocmanaApiNodeResult,\n targetLanguage?: string,\n): DocmanaNodeResult {\n const metadataFields = new Set([\n \"node_id\",\n \"node_name\",\n \"node_type\",\n \"feature_name\",\n \"running_time\",\n \"status\",\n \"score\",\n \"feedback\",\n \"translations\",\n \"tokens\",\n \"input_tokens\",\n \"output_tokens\",\n \"errors\",\n \"mana\",\n \"model\",\n \"tool_calls\",\n \"prompt_id\",\n \"prompt\",\n \"prompt_name\",\n \"label\",\n \"scoreDescription\",\n \"score_description\",\n \"result\",\n \"documentType\",\n ]);\n\n let sourceObj: Record<string, unknown> = rawNode;\n if (targetLanguage) {\n const translations = rawNode.translations;\n if (!translations || !translations[targetLanguage]) {\n throw new DocmanaError(\n `Translation for language '${targetLanguage}' is missing on node '${rawNode.node_name || rawNode.node_id}'`,\n { code: \"translation_missing\", status: 400 },\n );\n }\n sourceObj = translations[targetLanguage] as Record<string, unknown>;\n }\n\n const dynamicFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(sourceObj)) {\n if (!metadataFields.has(key)) {\n dynamicFields[key] = value;\n }\n }\n\n const sdkNode: DocmanaScoreNodeResult = {\n status: rawNode.status || \"Unknown\",\n };\n\n if (rawNode.errors && rawNode.errors.length > 0) {\n sdkNode.errors = rawNode.errors;\n }\n\n const nodeType = rawNode.node_type || \"\";\n const isScoreNode = /^(Validation|Classification|CrossValidation|Conclusion)$/i.test(nodeType);\n if (isScoreNode) {\n if (rawNode.score !== undefined && rawNode.score !== null) {\n sdkNode.score = rawNode.score;\n }\n if (rawNode.feedback !== undefined && rawNode.feedback !== null) {\n sdkNode.feedback = rawNode.feedback;\n }\n }\n\n if (Object.keys(dynamicFields).length > 0) {\n sdkNode.data = dynamicFields;\n }\n\n return sdkNode;\n}\n\nexport function mapExecutionResult(\n raw: DocmanaApiExecutionResult,\n targetLanguage?: string,\n): DocmanaExecutionResult {\n const sdkResult: DocmanaExecutionResult = {\n status: raw.status || \"Unknown\",\n executionId: String(raw.execution_id || raw.executionResultId || raw.execution_result_id || \"\"),\n documents: {\n mappings: [],\n },\n };\n\n if (raw.errors && raw.errors.length > 0) {\n sdkResult.errors = raw.errors;\n }\n\n const results = raw.results || [];\n\n for (const item of results) {\n const isDocSpecific = !!item.document;\n\n if (isDocSpecific && item.document) {\n const docReq = item.document;\n const docKey = docReq.doc_key || \"unknown_doc\";\n const docName = docReq.name || \"\";\n\n sdkResult.documents.mappings.push({\n name: docName,\n reference: docKey,\n });\n\n const docResult: DocmanaDocumentResult = {\n status: item.status || docReq.status || \"Unknown\",\n extractions: {},\n validations: {},\n };\n\n const nodeResults = item.node_results || [];\n\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^Classification$/i.test(nodeType)) {\n const mappedNode = extractNodeFields(node, targetLanguage);\n if (!docResult.classifications) {\n docResult.classifications = {};\n }\n docResult.classifications[nodeName] = mappedNode;\n } else if (/^MetadataExtraction$/i.test(nodeType)) {\n docResult.metadataExtraction = extractNodeFields(node, targetLanguage);\n } else if (/^Extraction$/i.test(nodeType)) {\n if (docResult.extractions) {\n docResult.extractions[nodeName] = extractNodeFields(node, targetLanguage);\n }\n } else if (/^Validation$/i.test(nodeType)) {\n if (docResult.validations) {\n docResult.validations[nodeName] = extractNodeFields(node, targetLanguage);\n }\n }\n }\n\n if (docResult.extractions && Object.keys(docResult.extractions).length === 0) {\n delete docResult.extractions;\n }\n if (docResult.validations && Object.keys(docResult.validations).length === 0) {\n delete docResult.validations;\n }\n\n sdkResult.documents[docKey] = docResult;\n } else {\n const nodeResults = item.node_results || [];\n for (const node of nodeResults) {\n const nodeType = node.node_type || \"\";\n const nodeName = node.node_name || node.node_id || \"unknown_node\";\n\n if (/^CrossValidation$/i.test(nodeType)) {\n if (!sdkResult.crossValidations) {\n sdkResult.crossValidations = {};\n }\n sdkResult.crossValidations[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaCrossValidationResult;\n } else if (/^(Conclusion|Finish)$/i.test(nodeType)) {\n if (!sdkResult.conclusions) {\n sdkResult.conclusions = {};\n }\n sdkResult.conclusions[nodeName] = extractNodeFields(\n node,\n targetLanguage,\n ) as DocmanaConclusionResult;\n }\n }\n }\n }\n\n return sdkResult;\n}\n","import { resolveConfig } from \"./config.js\";\nimport type { ResolvedConfig } from \"./config.js\";\nimport type {\n DocmanaConfig,\n DocmanaExecutionResult,\n ExecutionStatus,\n RunFlowInput,\n} from \"./types.js\";\nimport { TokenManager } from \"./auth/token-manager.js\";\nimport { HttpClient } from \"./http/http-client.js\";\nimport { resolveInputs } from \"./files/resolve-input.js\";\nimport { uploadFiles } from \"./api/upload.js\";\nimport { runFlow as runFlowApi } from \"./api/run-flow.js\";\nimport { getStatus as getStatusApi } from \"./api/execution-status.js\";\nimport { getResult as getResultApi } from \"./api/execution-result.js\";\nimport { pollUntilTerminal } from \"./polling/poll.js\";\nimport { DocmanaExecutionError } from \"./errors.js\";\nimport { mapExecutionResult } from \"./mappers/index.js\";\n\nexport class Docmana {\n private readonly config: ResolvedConfig;\n private readonly http: HttpClient;\n\n constructor(config: DocmanaConfig) {\n this.config = resolveConfig(config);\n const tokenManager = new TokenManager({\n clientId: this.config.clientId,\n clientSecret: this.config.clientSecret,\n tokenEndpoint: this.config.tokenEndpoint,\n scope: this.config.scope,\n fetchImpl: this.config.fetchImpl,\n tokenCache: this.config.tokenCache,\n });\n this.http = new HttpClient({\n apiBaseUrl: this.config.apiBaseUrl,\n fetchImpl: this.config.fetchImpl,\n tokenManager,\n headers: this.config.headers,\n });\n }\n\n async runFlowAsync(\n flowId: string,\n input: RunFlowInput,\n ): Promise<{ executionResultId: string; fileIds: string[] }> {\n const parts = await resolveInputs(input);\n const fileIds = await uploadFiles(this.http, parts, input.signal);\n const executionResultId = await runFlowApi(\n this.http,\n flowId,\n fileIds,\n input.signal,\n input.once ?? false,\n );\n return { executionResultId, fileIds };\n }\n\n async getStatus(\n executionResultId: string,\n signal?: AbortSignal,\n ): Promise<{ status: ExecutionStatus | string }> {\n return getStatusApi(this.http, executionResultId, signal);\n }\n\n async getResult(\n executionResultId: string,\n signal?: AbortSignal,\n language?: string,\n ): Promise<DocmanaExecutionResult> {\n const rawResult = await getResultApi(this.http, executionResultId, signal);\n return mapExecutionResult(rawResult, language);\n }\n\n async runFlow(flowId: string, input: RunFlowInput): Promise<DocmanaExecutionResult> {\n const { executionResultId } = await this.runFlowAsync(flowId, input);\n await pollUntilTerminal({\n check: async () => (await this.getStatus(executionResultId, input.signal)).status,\n intervalMs: input.pollIntervalMs ?? this.config.pollIntervalMs,\n timeoutMs: input.timeoutMs ?? this.config.timeoutMs,\n signal: input.signal,\n });\n const result = await this.getResult(executionResultId, input.signal, input.language);\n if (result.status === \"Failed\") {\n throw new DocmanaExecutionError(\n `Flow ${flowId} execution failed`,\n result.errors ?? [],\n result,\n );\n }\n return result;\n }\n}\n"],"mappings":"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","names":[]}
|