okrapdf 0.12.0 → 0.13.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/README.md +1 -1
- package/dist/browser.d.ts +1 -1
- package/dist/{chunk-XM4MS5WV.js → chunk-2VKGPLAA.js} +233 -5
- package/dist/chunk-2VKGPLAA.js.map +1 -0
- package/dist/{chunk-YY44NPDZ.js → chunk-F3LECDPP.js} +191 -12
- package/dist/chunk-F3LECDPP.js.map +1 -0
- package/dist/chunk-KJMV6TN2.js +155 -0
- package/dist/chunk-KJMV6TN2.js.map +1 -0
- package/dist/cli/bin.js +270 -10
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/index.d.ts +16 -4
- package/dist/cli/index.js +7 -1
- package/dist/{client-CdCU6Div.d.ts → client-DMEw0oK3.d.ts} +12 -1
- package/dist/index.d.ts +20 -4
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/react/index.d.ts +3 -3
- package/dist/react/index.js +2 -2
- package/dist/{types-58dvD4Yj.d.ts → types-D2JaySEg.d.ts} +140 -2
- package/dist/url.d.ts +1 -1
- package/package.json +3 -1
- package/dist/chunk-ADVWUO22.js +0 -84
- package/dist/chunk-ADVWUO22.js.map +0 -1
- package/dist/chunk-XM4MS5WV.js.map +0 -1
- package/dist/chunk-YY44NPDZ.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { b as UploadInput, S as SessionCreateOptions, O as OkraSession, c as SessionAttachOptions, C as CollectionSummary, d as Collection, e as CollectionQueryOptions, f as CollectionQueryStream, g as
|
|
1
|
+
import { b as UploadInput, S as SessionCreateOptions, O as OkraSession, c as SessionAttachOptions, C as CollectionSummary, d as Collection, e as CollectionQueryOptions, f as CollectionQueryStream, g as CollectionExportOptions, h as CollectionMarkdownExport, i as OkraClientOptions, j as UploadOptions, k as DocumentConfigUpdate, l as DocumentConfigResult, R as ReparseOptions, m as ReparseResult, A as ApplyWorkflowOptions, n as ApplyWorkflowResult, o as ApiKeyWorkflowConfigResponse, p as DocumentStatus, W as WaitOptions, P as Page, E as EntitiesResponse, Q as QueryResult, L as LogsOptions, q as LogEntry, r as CompletionOptions, s as CompletionEvent, G as GenerateOptions, t as GenerateResult, u as StructuredSchema, v as DocumentListItem, w as DeleteDocumentResult, x as ReadDocumentOptions, y as ReadDocumentResult, z as PublishResult, B as ShareLinkOptions, F as ShareLinkResult } from './types-D2JaySEg.js';
|
|
2
2
|
|
|
3
3
|
declare class OkraClient {
|
|
4
4
|
private readonly baseUrl;
|
|
@@ -13,12 +13,20 @@ declare class OkraClient {
|
|
|
13
13
|
list: (signal?: AbortSignal) => Promise<CollectionSummary[]>;
|
|
14
14
|
get: (collectionId: string, signal?: AbortSignal) => Promise<Collection>;
|
|
15
15
|
query: <T = undefined>(collectionId: string, prompt: string, options?: CollectionQueryOptions<T>) => CollectionQueryStream<T>;
|
|
16
|
+
exportMarkdown: (collectionId: string, options?: AbortSignal | CollectionExportOptions) => Promise<CollectionMarkdownExport | Uint8Array>;
|
|
16
17
|
};
|
|
17
18
|
constructor(options: OkraClientOptions);
|
|
18
19
|
private collectionList;
|
|
19
20
|
private collectionGet;
|
|
20
21
|
private collectionQuery;
|
|
22
|
+
private collectionExportPath;
|
|
23
|
+
private collectionExportMarkdown;
|
|
21
24
|
upload(input: UploadInput, options?: UploadOptions): Promise<OkraSession>;
|
|
25
|
+
updateConfig(documentId: string, update: DocumentConfigUpdate, signal?: AbortSignal): Promise<DocumentConfigResult>;
|
|
26
|
+
reparse(documentId: string, options?: ReparseOptions): Promise<ReparseResult>;
|
|
27
|
+
applyWorkflow(documentId: string, options: ApplyWorkflowOptions): Promise<ApplyWorkflowResult>;
|
|
28
|
+
getKeyWorkflow(signal?: AbortSignal): Promise<ApiKeyWorkflowConfigResponse>;
|
|
29
|
+
setKeyWorkflow(defaultCapabilities: ApiKeyWorkflowConfigResponse['default_capabilities'], signal?: AbortSignal): Promise<ApiKeyWorkflowConfigResponse>;
|
|
22
30
|
status(documentId: string, signal?: AbortSignal): Promise<DocumentStatus>;
|
|
23
31
|
wait(documentId: string, options?: WaitOptions): Promise<DocumentStatus>;
|
|
24
32
|
pages(documentId: string, options?: {
|
|
@@ -43,6 +51,9 @@ declare class OkraClient {
|
|
|
43
51
|
schema: StructuredSchema<T>;
|
|
44
52
|
}): Promise<GenerateResult<T>>;
|
|
45
53
|
private generateStructured;
|
|
54
|
+
listDocuments(signal?: AbortSignal): Promise<DocumentListItem[]>;
|
|
55
|
+
deleteDocument(documentId: string, signal?: AbortSignal): Promise<DeleteDocumentResult>;
|
|
56
|
+
read(documentId: string, options?: ReadDocumentOptions): Promise<ReadDocumentResult>;
|
|
46
57
|
modelEndpoint(documentId: string): string;
|
|
47
58
|
publish(documentId: string, signal?: AbortSignal): Promise<PublishResult>;
|
|
48
59
|
shareLink(documentId: string, options?: ShareLinkOptions): Promise<ShareLinkResult>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
|
-
import { O as OkraClient } from './client-
|
|
2
|
-
import {
|
|
3
|
-
export { d as Collection,
|
|
1
|
+
import { O as OkraClient } from './client-DMEw0oK3.js';
|
|
2
|
+
import { H as ProcessingCapabilities, i as OkraClientOptions, O as OkraSession, r as CompletionOptions, s as CompletionEvent, I as SessionState, p as DocumentStatus, W as WaitOptions, P as Page, E as EntitiesResponse, Q as QueryResult, L as LogsOptions, q as LogEntry, z as PublishResult, B as ShareLinkOptions, F as ShareLinkResult, G as GenerateOptions, t as GenerateResult, u as StructuredSchema, J as RuntimeErrorCode, K as StructuredOutputErrorCode } from './types-D2JaySEg.js';
|
|
3
|
+
export { o as ApiKeyWorkflowConfigResponse, A as ApplyWorkflowOptions, n as ApplyWorkflowResult, d as Collection, M as CollectionDocument, N as CollectionExportEvent, T as CollectionExportFormat, g as CollectionExportOptions, h as CollectionMarkdownExport, V as CollectionQueryEvent, e as CollectionQueryOptions, X as CollectionQueryResult, f as CollectionQueryStream, C as CollectionSummary, w as DeleteDocumentResult, D as DocUrlOptions, Y as DocumentAnswer, l as DocumentConfigResult, k as DocumentConfigUpdate, v as DocumentListItem, Z as DocumentListResponse, _ as DocumentMarkdownExport, $ as Entity, a0 as JsonSchema, a1 as MarkdownPage, a2 as OkraCollections, a3 as PageBlock, a4 as PageEntity, x as ReadDocumentOptions, y as ReadDocumentResult, R as ReparseOptions, m as ReparseResult, c as SessionAttachOptions, S as SessionCreateOptions, a5 as ShareLinkCapabilities, a6 as ShareLinkLinks, a7 as StructuredOutputMeta, b as UploadInput, j as UploadOptions, a8 as UploadRedactOptions, a9 as UploadRedactPiiOptions, U as UrlBuilderOptions, aa as WorkflowPhase, ab as WorkflowPhaseConfig, ac as WorkflowTier } from './types-D2JaySEg.js';
|
|
4
4
|
export { doc } from './url.js';
|
|
5
5
|
import 'zod';
|
|
6
6
|
|
|
7
|
+
type WorkflowPresetName = 'default' | 'llamaparse_ocr' | 'parse_proxy_ocr' | 'docling_ocr';
|
|
8
|
+
declare const DEFAULT_WORKFLOW_CAPABILITIES: ProcessingCapabilities;
|
|
9
|
+
declare const WORKFLOW_PRESETS: Record<WorkflowPresetName, ProcessingCapabilities>;
|
|
10
|
+
/**
|
|
11
|
+
* Returns immutable capabilities for a named workflow preset.
|
|
12
|
+
* Optional overrides are deep-merged on top for per-app tuning.
|
|
13
|
+
*/
|
|
14
|
+
declare function workflowPreset(name: WorkflowPresetName, overrides?: ProcessingCapabilities): ProcessingCapabilities;
|
|
15
|
+
|
|
7
16
|
type ExtractionPhase = 'ocr' | 'enhance' | 'metadata' | 'verify';
|
|
8
17
|
interface OkraProvider {
|
|
9
18
|
name: string;
|
|
@@ -17,7 +26,14 @@ interface CreateOkraOptions extends OkraClientOptions {
|
|
|
17
26
|
providers?: Record<string, OkraProvider>;
|
|
18
27
|
extraction?: Partial<Record<ExtractionPhase, string>>;
|
|
19
28
|
middleware?: OkraMiddleware[];
|
|
29
|
+
/** Legacy default BYOK keys (prefer `workflow.vendorKeys`). */
|
|
20
30
|
vendorKeys?: Record<string, string>;
|
|
31
|
+
/** General workflow defaults for all uploads from this client. */
|
|
32
|
+
workflow?: {
|
|
33
|
+
preset?: WorkflowPresetName;
|
|
34
|
+
capabilities?: ProcessingCapabilities;
|
|
35
|
+
vendorKeys?: Record<string, string>;
|
|
36
|
+
};
|
|
21
37
|
}
|
|
22
38
|
/**
|
|
23
39
|
* Factory function — AI SDK-style provider abstraction.
|
|
@@ -120,4 +136,4 @@ declare class StructuredOutputError extends OkraRuntimeError {
|
|
|
120
136
|
constructor(code: StructuredOutputErrorCode, message: string, status: number, details?: unknown);
|
|
121
137
|
}
|
|
122
138
|
|
|
123
|
-
export { type ChatStreamServerEvent, CompletionEvent, CompletionOptions, type CreateOkraOptions, DocumentStatus, EntitiesResponse, type ExtractionPhase, GenerateOptions, GenerateResult, LogEntry, LogsOptions, OkraClient, OkraClientOptions, type OkraMiddleware, type OkraProvider, OkraClient as OkraRuntime, OkraRuntimeError, OkraSession, Page, PublishResult, QueryResult, RuntimeErrorCode, SessionState, ShareLinkOptions, ShareLinkResult, StructuredOutputError, StructuredOutputErrorCode, StructuredSchema, WaitOptions, type WsSendFn, WsSession, type WsSessionOptions, type WsSubscribeFn, createOkra, withCache, withQualityScore, withSecret };
|
|
139
|
+
export { type ChatStreamServerEvent, CompletionEvent, CompletionOptions, type CreateOkraOptions, DEFAULT_WORKFLOW_CAPABILITIES, DocumentStatus, EntitiesResponse, type ExtractionPhase, GenerateOptions, GenerateResult, LogEntry, LogsOptions, OkraClient, OkraClientOptions, type OkraMiddleware, type OkraProvider, OkraClient as OkraRuntime, OkraRuntimeError, OkraSession, Page, ProcessingCapabilities, PublishResult, QueryResult, RuntimeErrorCode, SessionState, ShareLinkOptions, ShareLinkResult, StructuredOutputError, StructuredOutputErrorCode, StructuredSchema, WORKFLOW_PRESETS, WaitOptions, type WorkflowPresetName, type WsSendFn, WsSession, type WsSessionOptions, type WsSubscribeFn, createOkra, withCache, withQualityScore, withSecret, workflowPreset };
|
package/dist/index.js
CHANGED
|
@@ -2,14 +2,17 @@ import {
|
|
|
2
2
|
doc
|
|
3
3
|
} from "./chunk-QKII53VN.js";
|
|
4
4
|
import {
|
|
5
|
+
DEFAULT_WORKFLOW_CAPABILITIES,
|
|
6
|
+
WORKFLOW_PRESETS,
|
|
5
7
|
createOkra,
|
|
6
8
|
withCache,
|
|
7
9
|
withQualityScore,
|
|
8
|
-
withSecret
|
|
9
|
-
|
|
10
|
+
withSecret,
|
|
11
|
+
workflowPreset
|
|
12
|
+
} from "./chunk-KJMV6TN2.js";
|
|
10
13
|
import {
|
|
11
14
|
OkraClient
|
|
12
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-2VKGPLAA.js";
|
|
13
16
|
import {
|
|
14
17
|
OkraRuntimeError,
|
|
15
18
|
StructuredOutputError
|
|
@@ -145,15 +148,18 @@ var WsSession = class {
|
|
|
145
148
|
}
|
|
146
149
|
};
|
|
147
150
|
export {
|
|
151
|
+
DEFAULT_WORKFLOW_CAPABILITIES,
|
|
148
152
|
OkraClient,
|
|
149
153
|
OkraClient as OkraRuntime,
|
|
150
154
|
OkraRuntimeError,
|
|
151
155
|
StructuredOutputError,
|
|
156
|
+
WORKFLOW_PRESETS,
|
|
152
157
|
WsSession,
|
|
153
158
|
createOkra,
|
|
154
159
|
doc,
|
|
155
160
|
withCache,
|
|
156
161
|
withQualityScore,
|
|
157
|
-
withSecret
|
|
162
|
+
withSecret,
|
|
163
|
+
workflowPreset
|
|
158
164
|
};
|
|
159
165
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ws-session.ts"],"sourcesContent":["/**\n * WsSession — OkraSession adapter that routes `stream()` over an existing\n * WebSocket connection instead of HTTP SSE.\n *\n * All non-streaming methods delegate to the inner HTTP-backed session.\n * Only `stream()` is overridden to send CHAT_COMPLETION over WS and yield\n * CompletionEvents from CHAT_STREAM_* responses.\n *\n * Usage:\n * const wsSession = new WsSession(httpSession, { send, subscribe });\n * const chat = useChat({ session: wsSession });\n */\n\nimport type {\n OkraSession,\n CompletionEvent,\n CompletionOptions,\n DocumentStatus,\n WaitOptions,\n Page,\n EntitiesResponse,\n QueryResult,\n PublishResult,\n ShareLinkOptions,\n ShareLinkResult,\n GenerateOptions,\n GenerateResult,\n SessionState,\n StructuredSchema,\n} from './types';\n\n// Chat stream event types — mirrors @okrapdf/schemas ChatStreamServerEvent\n// Inlined to avoid adding @okrapdf/schemas as a dependency of the published SDK.\n\nexport type ChatStreamServerEvent =\n | { type: 'CHAT_STREAM_START'; requestId: string }\n | { type: 'CHAT_STREAM_DELTA'; requestId: string; delta: string }\n | { type: 'CHAT_STREAM_DONE'; requestId: string; usage?: { inputTokens: number; outputTokens: number; costUsd: number }; model?: string }\n | { type: 'CHAT_STREAM_ERROR'; requestId: string; error: string };\n\n/** Function that sends a JSON string over the WebSocket. Returns false if WS is closed. */\nexport type WsSendFn = (message: string) => boolean;\n\n/** Subscribe to chat stream events. Returns unsubscribe function. */\nexport type WsSubscribeFn = (\n requestId: string,\n handler: (event: ChatStreamServerEvent) => void,\n) => () => void;\n\nexport interface WsSessionOptions {\n /** Send JSON string over the existing WebSocket connection */\n send: WsSendFn;\n /** Subscribe to CHAT_STREAM_* events for a given requestId */\n subscribe: WsSubscribeFn;\n}\n\nfunction uuid(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport class WsSession implements OkraSession {\n readonly id: string;\n readonly modelEndpoint: string;\n readonly model?: string;\n\n #inner: OkraSession;\n #opts: WsSessionOptions;\n\n constructor(inner: OkraSession, opts: WsSessionOptions) {\n this.#inner = inner;\n this.#opts = opts;\n this.id = inner.id;\n this.modelEndpoint = inner.modelEndpoint;\n this.model = inner.model;\n }\n\n // ── Overridden: stream via WebSocket ──────────────────────────────────────\n\n async *stream(\n query: string,\n options?: CompletionOptions,\n ): AsyncGenerator<CompletionEvent> {\n const requestId = uuid();\n\n // Build message history (single user message for now — matches HTTP path)\n const messages = [{ role: 'user', content: query }];\n\n const sent = this.#opts.send(JSON.stringify({\n type: 'CHAT_COMPLETION',\n requestId,\n messages,\n }));\n\n if (!sent) {\n yield { type: 'error', message: 'WebSocket not connected' };\n return;\n }\n\n // Create a promise-based event queue\n type QueueItem =\n | { done: false; event: ChatStreamServerEvent }\n | { done: true };\n\n const queue: QueueItem[] = [];\n let resolve: (() => void) | null = null;\n let finished = false;\n\n const unsubscribe = this.#opts.subscribe(requestId, (event) => {\n if (finished) return;\n queue.push({ done: false, event });\n resolve?.();\n });\n\n const cleanup = () => {\n finished = true;\n unsubscribe();\n };\n\n // Handle abort signal\n if (options?.signal) {\n options.signal.addEventListener('abort', () => {\n cleanup();\n queue.push({ done: true });\n resolve?.();\n }, { once: true });\n }\n\n try {\n let fullText = '';\n\n while (true) {\n if (queue.length === 0) {\n await new Promise<void>((r) => { resolve = r; });\n resolve = null;\n }\n\n const item = queue.shift();\n if (!item || item.done) break;\n\n const evt = item.event;\n\n switch (evt.type) {\n case 'CHAT_STREAM_START':\n // No CompletionEvent for start — just skip\n break;\n\n case 'CHAT_STREAM_DELTA':\n fullText += evt.delta;\n yield { type: 'text_delta', text: evt.delta };\n break;\n\n case 'CHAT_STREAM_DONE':\n yield { type: 'done', answer: fullText };\n cleanup();\n return;\n\n case 'CHAT_STREAM_ERROR':\n yield { type: 'error', message: evt.error };\n cleanup();\n return;\n }\n }\n } finally {\n cleanup();\n }\n }\n\n // ── Delegated to inner HTTP session ───────────────────────────────────────\n\n state(): SessionState { return this.#inner.state(); }\n setModel(model: string): Promise<void> { return this.#inner.setModel(model); }\n status(signal?: AbortSignal): Promise<DocumentStatus> { return this.#inner.status(signal); }\n wait(options?: WaitOptions): Promise<DocumentStatus> { return this.#inner.wait(options); }\n pages(options?: { range?: string; signal?: AbortSignal }): Promise<Page[]> { return this.#inner.pages(options); }\n page(pageNumber: number, signal?: AbortSignal): Promise<Page> { return this.#inner.page(pageNumber, signal); }\n entities(options?: { type?: string; limit?: number; offset?: number; signal?: AbortSignal }): Promise<EntitiesResponse> { return this.#inner.entities(options); }\n downloadUrl(): string { return this.#inner.downloadUrl(); }\n query(sql: string, signal?: AbortSignal): Promise<QueryResult> { return this.#inner.query(sql, signal); }\n logs(options?: import('./types').LogsOptions): Promise<import('./types').LogEntry[]> { return this.#inner.logs(options); }\n publish(signal?: AbortSignal): Promise<PublishResult> { return this.#inner.publish(signal); }\n shareLink(options?: ShareLinkOptions): Promise<ShareLinkResult> { return this.#inner.shareLink(options); }\n\n prompt(query: string, options?: GenerateOptions & { schema?: undefined }): Promise<GenerateResult>;\n prompt<T>(query: string, options: GenerateOptions & { schema: StructuredSchema<T> }): Promise<GenerateResult<T>>;\n prompt<T = undefined>(query: string, options?: GenerateOptions): Promise<GenerateResult<T>> {\n if (options?.schema !== undefined) {\n return this.#inner.prompt(query, options as GenerateOptions & { schema: StructuredSchema<unknown> }) as Promise<GenerateResult<T>>;\n }\n return this.#inner.prompt(query, options as GenerateOptions & { schema?: undefined }) as Promise<GenerateResult<T>>;\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/ws-session.ts"],"sourcesContent":["/**\n * WsSession — OkraSession adapter that routes `stream()` over an existing\n * WebSocket connection instead of HTTP SSE.\n *\n * All non-streaming methods delegate to the inner HTTP-backed session.\n * Only `stream()` is overridden to send CHAT_COMPLETION over WS and yield\n * CompletionEvents from CHAT_STREAM_* responses.\n *\n * Usage:\n * const wsSession = new WsSession(httpSession, { send, subscribe });\n * const chat = useChat({ session: wsSession });\n */\n\nimport type {\n OkraSession,\n CompletionEvent,\n CompletionOptions,\n DocumentStatus,\n WaitOptions,\n Page,\n EntitiesResponse,\n QueryResult,\n PublishResult,\n ShareLinkOptions,\n ShareLinkResult,\n GenerateOptions,\n GenerateResult,\n SessionState,\n StructuredSchema,\n} from './types';\n\n// Chat stream event types — mirrors @okrapdf/schemas ChatStreamServerEvent\n// Inlined to avoid adding @okrapdf/schemas as a dependency of the published SDK.\n\nexport type ChatStreamServerEvent =\n | { type: 'CHAT_STREAM_START'; requestId: string }\n | { type: 'CHAT_STREAM_DELTA'; requestId: string; delta: string }\n | { type: 'CHAT_STREAM_DONE'; requestId: string; usage?: { inputTokens: number; outputTokens: number; costUsd: number }; model?: string }\n | { type: 'CHAT_STREAM_ERROR'; requestId: string; error: string };\n\n/** Function that sends a JSON string over the WebSocket. Returns false if WS is closed. */\nexport type WsSendFn = (message: string) => boolean;\n\n/** Subscribe to chat stream events. Returns unsubscribe function. */\nexport type WsSubscribeFn = (\n requestId: string,\n handler: (event: ChatStreamServerEvent) => void,\n) => () => void;\n\nexport interface WsSessionOptions {\n /** Send JSON string over the existing WebSocket connection */\n send: WsSendFn;\n /** Subscribe to CHAT_STREAM_* events for a given requestId */\n subscribe: WsSubscribeFn;\n}\n\nfunction uuid(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport class WsSession implements OkraSession {\n readonly id: string;\n readonly modelEndpoint: string;\n readonly model?: string;\n\n #inner: OkraSession;\n #opts: WsSessionOptions;\n\n constructor(inner: OkraSession, opts: WsSessionOptions) {\n this.#inner = inner;\n this.#opts = opts;\n this.id = inner.id;\n this.modelEndpoint = inner.modelEndpoint;\n this.model = inner.model;\n }\n\n // ── Overridden: stream via WebSocket ──────────────────────────────────────\n\n async *stream(\n query: string,\n options?: CompletionOptions,\n ): AsyncGenerator<CompletionEvent> {\n const requestId = uuid();\n\n // Build message history (single user message for now — matches HTTP path)\n const messages = [{ role: 'user', content: query }];\n\n const sent = this.#opts.send(JSON.stringify({\n type: 'CHAT_COMPLETION',\n requestId,\n messages,\n }));\n\n if (!sent) {\n yield { type: 'error', message: 'WebSocket not connected' };\n return;\n }\n\n // Create a promise-based event queue\n type QueueItem =\n | { done: false; event: ChatStreamServerEvent }\n | { done: true };\n\n const queue: QueueItem[] = [];\n let resolve: (() => void) | null = null;\n let finished = false;\n\n const unsubscribe = this.#opts.subscribe(requestId, (event) => {\n if (finished) return;\n queue.push({ done: false, event });\n resolve?.();\n });\n\n const cleanup = () => {\n finished = true;\n unsubscribe();\n };\n\n // Handle abort signal\n if (options?.signal) {\n options.signal.addEventListener('abort', () => {\n cleanup();\n queue.push({ done: true });\n resolve?.();\n }, { once: true });\n }\n\n try {\n let fullText = '';\n\n while (true) {\n if (queue.length === 0) {\n await new Promise<void>((r) => { resolve = r; });\n resolve = null;\n }\n\n const item = queue.shift();\n if (!item || item.done) break;\n\n const evt = item.event;\n\n switch (evt.type) {\n case 'CHAT_STREAM_START':\n // No CompletionEvent for start — just skip\n break;\n\n case 'CHAT_STREAM_DELTA':\n fullText += evt.delta;\n yield { type: 'text_delta', text: evt.delta };\n break;\n\n case 'CHAT_STREAM_DONE':\n yield { type: 'done', answer: fullText };\n cleanup();\n return;\n\n case 'CHAT_STREAM_ERROR':\n yield { type: 'error', message: evt.error };\n cleanup();\n return;\n }\n }\n } finally {\n cleanup();\n }\n }\n\n // ── Delegated to inner HTTP session ───────────────────────────────────────\n\n state(): SessionState { return this.#inner.state(); }\n setModel(model: string): Promise<void> { return this.#inner.setModel(model); }\n status(signal?: AbortSignal): Promise<DocumentStatus> { return this.#inner.status(signal); }\n wait(options?: WaitOptions): Promise<DocumentStatus> { return this.#inner.wait(options); }\n pages(options?: { range?: string; signal?: AbortSignal }): Promise<Page[]> { return this.#inner.pages(options); }\n page(pageNumber: number, signal?: AbortSignal): Promise<Page> { return this.#inner.page(pageNumber, signal); }\n entities(options?: { type?: string; limit?: number; offset?: number; signal?: AbortSignal }): Promise<EntitiesResponse> { return this.#inner.entities(options); }\n downloadUrl(): string { return this.#inner.downloadUrl(); }\n query(sql: string, signal?: AbortSignal): Promise<QueryResult> { return this.#inner.query(sql, signal); }\n logs(options?: import('./types').LogsOptions): Promise<import('./types').LogEntry[]> { return this.#inner.logs(options); }\n publish(signal?: AbortSignal): Promise<PublishResult> { return this.#inner.publish(signal); }\n shareLink(options?: ShareLinkOptions): Promise<ShareLinkResult> { return this.#inner.shareLink(options); }\n\n prompt(query: string, options?: GenerateOptions & { schema?: undefined }): Promise<GenerateResult>;\n prompt<T>(query: string, options: GenerateOptions & { schema: StructuredSchema<T> }): Promise<GenerateResult<T>>;\n prompt<T = undefined>(query: string, options?: GenerateOptions): Promise<GenerateResult<T>> {\n if (options?.schema !== undefined) {\n return this.#inner.prompt(query, options as GenerateOptions & { schema: StructuredSchema<unknown> }) as Promise<GenerateResult<T>>;\n }\n return this.#inner.prompt(query, options as GenerateOptions & { schema?: undefined }) as Promise<GenerateResult<T>>;\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import { O as OkraClient } from '../client-
|
|
3
|
-
import { O as OkraSession,
|
|
4
|
-
export {
|
|
2
|
+
import { O as OkraClient } from '../client-DMEw0oK3.js';
|
|
3
|
+
import { O as OkraSession, p as DocumentStatus, P as Page, u as StructuredSchema, t as GenerateResult } from '../types-D2JaySEg.js';
|
|
4
|
+
export { s as CompletionEvent } from '../types-D2JaySEg.js';
|
|
5
5
|
import 'zod';
|
|
6
6
|
|
|
7
7
|
interface OkraContextValue {
|
package/dist/react/index.js
CHANGED
|
@@ -32,7 +32,7 @@ interface UploadOptions {
|
|
|
32
32
|
/** Optional filename hint for binary uploads. */
|
|
33
33
|
fileName?: string;
|
|
34
34
|
/** Processing capability hints forwarded to the worker. */
|
|
35
|
-
capabilities?:
|
|
35
|
+
capabilities?: ProcessingCapabilities;
|
|
36
36
|
/** Document visibility. 'private' (default) requires auth; 'public' auto-publishes on completion. */
|
|
37
37
|
visibility?: 'public' | 'private';
|
|
38
38
|
/** BYOK vendor keys passed through to extraction (e.g. { llamaparse: 'llx-...' }). Stateless — never stored. */
|
|
@@ -40,6 +40,66 @@ interface UploadOptions {
|
|
|
40
40
|
/** OpenRedact policy forwarded to upload and enforced at read/query/completion surfaces. */
|
|
41
41
|
redact?: UploadRedactOptions;
|
|
42
42
|
}
|
|
43
|
+
type WorkflowPhase = 'ocr' | 'enhance' | 'metadata' | 'verify';
|
|
44
|
+
type WorkflowTier = 'fast' | 'standard' | 'premium';
|
|
45
|
+
interface WorkflowPhaseConfig {
|
|
46
|
+
vendor?: string;
|
|
47
|
+
tier?: WorkflowTier;
|
|
48
|
+
enabled?: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Processing capability shape used by upload/config/key-workflow surfaces.
|
|
52
|
+
* Includes well-known flags and allows forward-compatible custom keys.
|
|
53
|
+
*/
|
|
54
|
+
interface ProcessingCapabilities {
|
|
55
|
+
vlm_qwen?: boolean;
|
|
56
|
+
structural_check?: boolean;
|
|
57
|
+
sandbox_verify?: boolean;
|
|
58
|
+
search?: boolean;
|
|
59
|
+
phases?: Partial<Record<WorkflowPhase, WorkflowPhaseConfig>>;
|
|
60
|
+
middleware?: Array<{
|
|
61
|
+
name: string;
|
|
62
|
+
[key: string]: unknown;
|
|
63
|
+
}>;
|
|
64
|
+
[key: string]: unknown;
|
|
65
|
+
}
|
|
66
|
+
interface DocumentConfigUpdate {
|
|
67
|
+
capabilities?: ProcessingCapabilities;
|
|
68
|
+
[key: string]: unknown;
|
|
69
|
+
}
|
|
70
|
+
interface DocumentConfigResult {
|
|
71
|
+
settings?: Record<string, unknown>;
|
|
72
|
+
previous?: Record<string, unknown>;
|
|
73
|
+
maxPass?: number;
|
|
74
|
+
phase?: string;
|
|
75
|
+
[key: string]: unknown;
|
|
76
|
+
}
|
|
77
|
+
interface ReparseOptions {
|
|
78
|
+
strategy?: 'auto' | 'textlayer';
|
|
79
|
+
signal?: AbortSignal;
|
|
80
|
+
}
|
|
81
|
+
interface ReparseResult extends DocumentStatus {
|
|
82
|
+
message?: string;
|
|
83
|
+
workflowId?: string;
|
|
84
|
+
strategy?: string;
|
|
85
|
+
}
|
|
86
|
+
interface ApplyWorkflowOptions {
|
|
87
|
+
capabilities: ProcessingCapabilities;
|
|
88
|
+
reparse?: boolean;
|
|
89
|
+
strategy?: ReparseOptions['strategy'];
|
|
90
|
+
signal?: AbortSignal;
|
|
91
|
+
}
|
|
92
|
+
interface ApplyWorkflowResult {
|
|
93
|
+
config: DocumentConfigResult;
|
|
94
|
+
reparse?: ReparseResult;
|
|
95
|
+
}
|
|
96
|
+
interface ApiKeyWorkflowConfigResponse {
|
|
97
|
+
key_id: string;
|
|
98
|
+
user_id: string;
|
|
99
|
+
default_capabilities: ProcessingCapabilities | null;
|
|
100
|
+
created_at: string | null;
|
|
101
|
+
updated_at: string | null;
|
|
102
|
+
}
|
|
43
103
|
type UploadInput = string | ArrayBuffer | Uint8Array | Blob;
|
|
44
104
|
interface DocumentStatus {
|
|
45
105
|
phase: string;
|
|
@@ -361,6 +421,49 @@ interface CollectionSummary {
|
|
|
361
421
|
description: string | null;
|
|
362
422
|
document_count: number;
|
|
363
423
|
}
|
|
424
|
+
interface MarkdownPage {
|
|
425
|
+
pageNumber: number;
|
|
426
|
+
content: string;
|
|
427
|
+
vendor: string;
|
|
428
|
+
}
|
|
429
|
+
interface DocumentMarkdownExport {
|
|
430
|
+
docId: string;
|
|
431
|
+
fileName: string | null;
|
|
432
|
+
pageCount: number;
|
|
433
|
+
pages: MarkdownPage[];
|
|
434
|
+
}
|
|
435
|
+
type CollectionExportEvent = {
|
|
436
|
+
type: 'start';
|
|
437
|
+
doc_count: number;
|
|
438
|
+
format: string;
|
|
439
|
+
} | {
|
|
440
|
+
type: 'result';
|
|
441
|
+
doc_id: string;
|
|
442
|
+
file_name: string;
|
|
443
|
+
page_count: number;
|
|
444
|
+
pages: MarkdownPage[];
|
|
445
|
+
} | {
|
|
446
|
+
type: 'done';
|
|
447
|
+
completed: number;
|
|
448
|
+
failed: number;
|
|
449
|
+
total_pages: number;
|
|
450
|
+
} | {
|
|
451
|
+
type: 'error';
|
|
452
|
+
error: string;
|
|
453
|
+
};
|
|
454
|
+
type CollectionExportFormat = 'markdown' | 'zip';
|
|
455
|
+
interface CollectionExportOptions {
|
|
456
|
+
format?: CollectionExportFormat;
|
|
457
|
+
signal?: AbortSignal;
|
|
458
|
+
}
|
|
459
|
+
interface CollectionMarkdownExport {
|
|
460
|
+
collectionId: string;
|
|
461
|
+
collectionName: string;
|
|
462
|
+
documents: DocumentMarkdownExport[];
|
|
463
|
+
totalDocuments: number;
|
|
464
|
+
totalPages: number;
|
|
465
|
+
exportedAt: string;
|
|
466
|
+
}
|
|
364
467
|
interface OkraCollections {
|
|
365
468
|
/** List all collections for the authenticated user. */
|
|
366
469
|
list(signal?: AbortSignal): Promise<CollectionSummary[]>;
|
|
@@ -384,6 +487,15 @@ interface OkraCollections {
|
|
|
384
487
|
prompt<T>(collectionId: string, query: string, options: GenerateOptions & {
|
|
385
488
|
schema: StructuredSchema<T>;
|
|
386
489
|
}): Promise<GenerateResult<T>>;
|
|
490
|
+
/** Export pre-computed markdown for all documents in the collection (NDJSON parsed to JSON). */
|
|
491
|
+
exportMarkdown(collectionId: string, signal?: AbortSignal): Promise<CollectionMarkdownExport>;
|
|
492
|
+
/** Export with declarative format options (`markdown` or `zip`). */
|
|
493
|
+
exportMarkdown(collectionId: string, options: CollectionExportOptions & {
|
|
494
|
+
format: 'zip';
|
|
495
|
+
}): Promise<Uint8Array>;
|
|
496
|
+
exportMarkdown(collectionId: string, options: CollectionExportOptions & {
|
|
497
|
+
format?: 'markdown';
|
|
498
|
+
}): Promise<CollectionMarkdownExport>;
|
|
387
499
|
}
|
|
388
500
|
/** Delivery transform options for image resizing/processing (maps to CF Image Resizing). */
|
|
389
501
|
interface DeliveryTransform {
|
|
@@ -415,6 +527,32 @@ interface UrlBuilderOptions {
|
|
|
415
527
|
/** Delivery transform for image resizing/processing. */
|
|
416
528
|
transform?: DeliveryTransform;
|
|
417
529
|
}
|
|
530
|
+
/** A document summary returned by `client.listDocuments()`. */
|
|
531
|
+
interface DocumentListItem {
|
|
532
|
+
id: string;
|
|
533
|
+
file_name: string | null;
|
|
534
|
+
phase: string;
|
|
535
|
+
pages_total: number | null;
|
|
536
|
+
total_nodes: number | null;
|
|
537
|
+
visibility: 'public' | 'private';
|
|
538
|
+
created_at: string;
|
|
539
|
+
}
|
|
540
|
+
interface DocumentListResponse {
|
|
541
|
+
documents: DocumentListItem[];
|
|
542
|
+
}
|
|
543
|
+
interface ReadDocumentOptions {
|
|
544
|
+
/** Page range in "1-5" format. Omit for full document. */
|
|
545
|
+
pages?: string;
|
|
546
|
+
signal?: AbortSignal;
|
|
547
|
+
}
|
|
548
|
+
interface ReadDocumentResult {
|
|
549
|
+
documentId: string;
|
|
550
|
+
markdown: string;
|
|
551
|
+
}
|
|
552
|
+
interface DeleteDocumentResult {
|
|
553
|
+
deleted: boolean;
|
|
554
|
+
documentId: string;
|
|
555
|
+
}
|
|
418
556
|
interface DocUrlOptions {
|
|
419
557
|
/**
|
|
420
558
|
* Original source filename used to build friendly artifact URLs, e.g.
|
|
@@ -440,4 +578,4 @@ interface DocUrlOptions {
|
|
|
440
578
|
output?: string;
|
|
441
579
|
}
|
|
442
580
|
|
|
443
|
-
export type {
|
|
581
|
+
export type { Entity as $, ApplyWorkflowOptions as A, ShareLinkOptions as B, CollectionSummary as C, DocUrlOptions as D, EntitiesResponse as E, ShareLinkResult as F, GenerateOptions as G, ProcessingCapabilities as H, SessionState as I, RuntimeErrorCode as J, StructuredOutputErrorCode as K, LogsOptions as L, CollectionDocument as M, CollectionExportEvent as N, OkraSession as O, Page as P, QueryResult as Q, ReparseOptions as R, SessionCreateOptions as S, CollectionExportFormat as T, UrlBuilderOptions as U, CollectionQueryEvent as V, WaitOptions as W, CollectionQueryResult as X, DocumentAnswer as Y, DocumentListResponse as Z, DocumentMarkdownExport as _, DeliveryTransform as a, JsonSchema as a0, MarkdownPage as a1, OkraCollections as a2, PageBlock as a3, PageEntity as a4, ShareLinkCapabilities as a5, ShareLinkLinks as a6, StructuredOutputMeta as a7, UploadRedactOptions as a8, UploadRedactPiiOptions as a9, WorkflowPhase as aa, WorkflowPhaseConfig as ab, WorkflowTier as ac, UploadInput as b, SessionAttachOptions as c, Collection as d, CollectionQueryOptions as e, CollectionQueryStream as f, CollectionExportOptions as g, CollectionMarkdownExport as h, OkraClientOptions as i, UploadOptions as j, DocumentConfigUpdate as k, DocumentConfigResult as l, ReparseResult as m, ApplyWorkflowResult as n, ApiKeyWorkflowConfigResponse as o, DocumentStatus as p, LogEntry as q, CompletionOptions as r, CompletionEvent as s, GenerateResult as t, StructuredSchema as u, DocumentListItem as v, DeleteDocumentResult as w, ReadDocumentOptions as x, ReadDocumentResult as y, PublishResult as z };
|
package/dist/url.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "okrapdf",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "OkraPDF — upload a PDF, get an API. Runtime client, React hooks, and CLI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -49,6 +49,8 @@
|
|
|
49
49
|
],
|
|
50
50
|
"scripts": {
|
|
51
51
|
"build": "tsup",
|
|
52
|
+
"docs:cli": "node ./scripts/generate-cli-docs.mjs",
|
|
53
|
+
"docs:cli:check": "node ./scripts/generate-cli-docs.mjs --check",
|
|
52
54
|
"test": "vitest run",
|
|
53
55
|
"test:watch": "vitest",
|
|
54
56
|
"typecheck": "tsc --noEmit"
|
package/dist/chunk-ADVWUO22.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
OkraClient
|
|
3
|
-
} from "./chunk-XM4MS5WV.js";
|
|
4
|
-
|
|
5
|
-
// src/providers.ts
|
|
6
|
-
function isPlainObject(value) {
|
|
7
|
-
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
8
|
-
}
|
|
9
|
-
function deepMerge(base, override) {
|
|
10
|
-
const merged = { ...base };
|
|
11
|
-
for (const [key, value] of Object.entries(override)) {
|
|
12
|
-
const existing = merged[key];
|
|
13
|
-
if (isPlainObject(existing) && isPlainObject(value)) {
|
|
14
|
-
merged[key] = deepMerge(existing, value);
|
|
15
|
-
} else {
|
|
16
|
-
merged[key] = value;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return merged;
|
|
20
|
-
}
|
|
21
|
-
function createOkra(options) {
|
|
22
|
-
if (options.extraction && options.providers) {
|
|
23
|
-
for (const [phase, providerName] of Object.entries(options.extraction)) {
|
|
24
|
-
if (!options.providers[providerName]) {
|
|
25
|
-
throw new Error(
|
|
26
|
-
`Extraction phase '${phase}' references provider '${providerName}' which is not registered. Available: ${Object.keys(options.providers).join(", ")}`
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
const capabilities = {};
|
|
32
|
-
if (options.extraction) {
|
|
33
|
-
capabilities.phases = {};
|
|
34
|
-
for (const [phase, providerName] of Object.entries(options.extraction)) {
|
|
35
|
-
capabilities.phases[phase] = {
|
|
36
|
-
vendor: providerName,
|
|
37
|
-
enabled: true
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
if (options.middleware) {
|
|
42
|
-
capabilities.middleware = options.middleware.map((m) => ({
|
|
43
|
-
name: m.name,
|
|
44
|
-
...m.config
|
|
45
|
-
}));
|
|
46
|
-
}
|
|
47
|
-
const client = new OkraClient({
|
|
48
|
-
baseUrl: options.baseUrl,
|
|
49
|
-
apiKey: options.apiKey,
|
|
50
|
-
sharedSecret: options.sharedSecret,
|
|
51
|
-
fetch: options.fetch
|
|
52
|
-
});
|
|
53
|
-
const hasDefaults = Object.keys(capabilities).length > 0 || options.vendorKeys;
|
|
54
|
-
if (hasDefaults) {
|
|
55
|
-
const upload = client.upload.bind(client);
|
|
56
|
-
const defaultVendorKeys = options.vendorKeys;
|
|
57
|
-
client.upload = ((input, uploadOptions = {}) => upload(input, {
|
|
58
|
-
...uploadOptions,
|
|
59
|
-
capabilities: uploadOptions.capabilities ? deepMerge(capabilities, uploadOptions.capabilities) : Object.keys(capabilities).length > 0 ? capabilities : uploadOptions.capabilities,
|
|
60
|
-
vendorKeys: uploadOptions.vendorKeys ? { ...defaultVendorKeys, ...uploadOptions.vendorKeys } : defaultVendorKeys
|
|
61
|
-
}));
|
|
62
|
-
}
|
|
63
|
-
return client;
|
|
64
|
-
}
|
|
65
|
-
function withCache(opts) {
|
|
66
|
-
return { name: "cache", config: { strategy: opts.by } };
|
|
67
|
-
}
|
|
68
|
-
function withQualityScore(opts) {
|
|
69
|
-
return { name: "quality-score", config: { threshold: opts.threshold } };
|
|
70
|
-
}
|
|
71
|
-
function withSecret(namespace, opts) {
|
|
72
|
-
return {
|
|
73
|
-
name: "secret",
|
|
74
|
-
config: { namespace, required: opts?.required !== false }
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export {
|
|
79
|
-
createOkra,
|
|
80
|
-
withCache,
|
|
81
|
-
withQualityScore,
|
|
82
|
-
withSecret
|
|
83
|
-
};
|
|
84
|
-
//# sourceMappingURL=chunk-ADVWUO22.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers.ts"],"sourcesContent":["import type { OkraClientOptions } from './types';\nimport { OkraClient } from './client';\n\nexport type ExtractionPhase = 'ocr' | 'enhance' | 'metadata' | 'verify';\n\nexport interface OkraProvider {\n name: string;\n supportedPhases: ExtractionPhase[];\n}\n\nexport interface OkraMiddleware {\n name: string;\n config: Record<string, unknown>;\n}\n\nexport interface CreateOkraOptions extends OkraClientOptions {\n providers?: Record<string, OkraProvider>;\n extraction?: Partial<Record<ExtractionPhase, string>>;\n middleware?: OkraMiddleware[];\n vendorKeys?: Record<string, string>;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction deepMerge(base: Record<string, unknown>, override: Record<string, unknown>): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const existing = merged[key];\n if (isPlainObject(existing) && isPlainObject(value)) {\n merged[key] = deepMerge(existing, value);\n } else {\n merged[key] = value;\n }\n }\n return merged;\n}\n\n/**\n * Factory function — AI SDK-style provider abstraction.\n *\n * ```ts\n * import { createOkra } from 'okrapdf';\n *\n * const okra = createOkra({\n * apiKey: 'okra_...',\n * providers: { azureDocAI },\n * extraction: { ocr: 'azureDocAI' },\n * });\n * ```\n */\nexport function createOkra(options: CreateOkraOptions): OkraClient {\n if (options.extraction && options.providers) {\n for (const [phase, providerName] of Object.entries(options.extraction)) {\n if (!options.providers[providerName]) {\n throw new Error(\n `Extraction phase '${phase}' references provider '${providerName}' which is not registered. ` +\n `Available: ${Object.keys(options.providers).join(', ')}`,\n );\n }\n }\n }\n\n const capabilities: Record<string, unknown> = {};\n if (options.extraction) {\n capabilities.phases = {};\n for (const [phase, providerName] of Object.entries(options.extraction)) {\n (capabilities.phases as Record<string, unknown>)[phase] = {\n vendor: providerName,\n enabled: true,\n };\n }\n }\n\n if (options.middleware) {\n capabilities.middleware = options.middleware.map((m) => ({\n name: m.name,\n ...m.config,\n }));\n }\n\n const client = new OkraClient({\n baseUrl: options.baseUrl,\n apiKey: options.apiKey,\n sharedSecret: options.sharedSecret,\n fetch: options.fetch,\n });\n\n const hasDefaults = Object.keys(capabilities).length > 0 || options.vendorKeys;\n if (hasDefaults) {\n const upload = client.upload.bind(client);\n const defaultVendorKeys = options.vendorKeys;\n client.upload = ((input: Parameters<OkraClient['upload']>[0], uploadOptions: Parameters<OkraClient['upload']>[1] = {}) =>\n upload(input, {\n ...uploadOptions,\n capabilities: uploadOptions.capabilities\n ? deepMerge(capabilities, uploadOptions.capabilities)\n : Object.keys(capabilities).length > 0\n ? capabilities\n : uploadOptions.capabilities,\n vendorKeys: uploadOptions.vendorKeys\n ? { ...defaultVendorKeys, ...uploadOptions.vendorKeys }\n : defaultVendorKeys,\n })) as OkraClient['upload'];\n }\n\n return client;\n}\n\n// ─── Built-in middleware constructors ──────────────────────────────────────\n\nexport function withCache(opts: { by: 'pdf-hash' | 'content-hash' }): OkraMiddleware {\n return { name: 'cache', config: { strategy: opts.by } };\n}\n\nexport function withQualityScore(opts: { threshold: number }): OkraMiddleware {\n return { name: 'quality-score', config: { threshold: opts.threshold } };\n}\n\nexport function withSecret(namespace: string, opts?: { required?: boolean }): OkraMiddleware {\n return {\n name: 'secret',\n config: { namespace, required: opts?.required !== false },\n };\n}\n"],"mappings":";;;;;AAsBA,SAAS,cAAc,OAAkD;AACvE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAEA,SAAS,UAAU,MAA+B,UAA4D;AAC5G,QAAM,SAAkC,EAAE,GAAG,KAAK;AAClD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,UAAM,WAAW,OAAO,GAAG;AAC3B,QAAI,cAAc,QAAQ,KAAK,cAAc,KAAK,GAAG;AACnD,aAAO,GAAG,IAAI,UAAU,UAAU,KAAK;AAAA,IACzC,OAAO;AACL,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAeO,SAAS,WAAW,SAAwC;AACjE,MAAI,QAAQ,cAAc,QAAQ,WAAW;AAC3C,eAAW,CAAC,OAAO,YAAY,KAAK,OAAO,QAAQ,QAAQ,UAAU,GAAG;AACtE,UAAI,CAAC,QAAQ,UAAU,YAAY,GAAG;AACpC,cAAM,IAAI;AAAA,UACR,qBAAqB,KAAK,0BAA0B,YAAY,yCAClD,OAAO,KAAK,QAAQ,SAAS,EAAE,KAAK,IAAI,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAwC,CAAC;AAC/C,MAAI,QAAQ,YAAY;AACtB,iBAAa,SAAS,CAAC;AACvB,eAAW,CAAC,OAAO,YAAY,KAAK,OAAO,QAAQ,QAAQ,UAAU,GAAG;AACtE,MAAC,aAAa,OAAmC,KAAK,IAAI;AAAA,QACxD,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,YAAY;AACtB,iBAAa,aAAa,QAAQ,WAAW,IAAI,CAAC,OAAO;AAAA,MACvD,MAAM,EAAE;AAAA,MACR,GAAG,EAAE;AAAA,IACP,EAAE;AAAA,EACJ;AAEA,QAAM,SAAS,IAAI,WAAW;AAAA,IAC5B,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,cAAc,QAAQ;AAAA,IACtB,OAAO,QAAQ;AAAA,EACjB,CAAC;AAED,QAAM,cAAc,OAAO,KAAK,YAAY,EAAE,SAAS,KAAK,QAAQ;AACpE,MAAI,aAAa;AACf,UAAM,SAAS,OAAO,OAAO,KAAK,MAAM;AACxC,UAAM,oBAAoB,QAAQ;AAClC,WAAO,UAAU,CAAC,OAA4C,gBAAqD,CAAC,MAClH,OAAO,OAAO;AAAA,MACZ,GAAG;AAAA,MACH,cAAc,cAAc,eACxB,UAAU,cAAc,cAAc,YAAY,IAClD,OAAO,KAAK,YAAY,EAAE,SAAS,IACjC,eACA,cAAc;AAAA,MACpB,YAAY,cAAc,aACtB,EAAE,GAAG,mBAAmB,GAAG,cAAc,WAAW,IACpD;AAAA,IACN,CAAC;AAAA,EACL;AAEA,SAAO;AACT;AAIO,SAAS,UAAU,MAA2D;AACnF,SAAO,EAAE,MAAM,SAAS,QAAQ,EAAE,UAAU,KAAK,GAAG,EAAE;AACxD;AAEO,SAAS,iBAAiB,MAA6C;AAC5E,SAAO,EAAE,MAAM,iBAAiB,QAAQ,EAAE,WAAW,KAAK,UAAU,EAAE;AACxE;AAEO,SAAS,WAAW,WAAmB,MAA+C;AAC3F,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,EAAE,WAAW,UAAU,MAAM,aAAa,MAAM;AAAA,EAC1D;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["import { z, type ZodType } from 'zod';\nimport { OkraRuntimeError, StructuredOutputError } from './errors';\nimport type {\n OkraClientOptions,\n Collection,\n CollectionQueryEvent,\n CollectionQueryOptions,\n CollectionQueryResult,\n CollectionQueryStream,\n CollectionSummary,\n CompletionEvent,\n CompletionOptions,\n DocumentAnswer,\n DocumentStatus,\n EntitiesResponse,\n GenerateOptions,\n GenerateResult,\n JsonSchema,\n LogEntry,\n LogsOptions,\n Page,\n PublishResult,\n QueryResult,\n RuntimeErrorCode,\n ShareLinkOptions,\n ShareLinkResult,\n SessionAttachOptions,\n SessionCreateOptions,\n SessionState,\n OkraSession,\n StructuredOutputErrorCode,\n StructuredSchema,\n UploadInput,\n UploadOptions,\n WaitOptions,\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.okrapdf.com';\nconst DEFAULT_WAIT_TIMEOUT_MS = 5 * 60_000;\nconst DEFAULT_WAIT_POLL_MS = 1_500;\nconst COMPLETE_PHASES = new Set(['complete', 'awaiting_review']);\nconst TERMINAL_ERROR_PHASES = new Set(['error']);\nconst STRUCTURED_CODES = new Set<StructuredOutputErrorCode>([\n 'SCHEMA_VALIDATION_FAILED',\n 'EXTRACTION_FAILED',\n 'TIMEOUT',\n 'DOCUMENT_NOT_FOUND',\n]);\nconst NODE_FS_PROMISES_SPECIFIER = `node:${'fs/promises'}`;\nconst NODE_PATH_SPECIFIER = `node:${'path'}`;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isHttpUrl(value: string): boolean {\n return /^https?:\\/\\//i.test(value);\n}\n\nfunction isDocumentId(value: string): boolean {\n return /^(?:ocr|doc)-[A-Za-z0-9_-]+$/.test(value);\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, '');\n}\n\nfunction makeDocId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return `doc-${crypto.randomUUID().replace(/-/g, '').slice(0, 20)}`;\n }\n const rand = Math.random().toString(36).slice(2, 22);\n return `doc-${rand}`;\n}\n\nfunction toUint8Array(input: ArrayBuffer | Uint8Array): Uint8Array {\n if (input instanceof Uint8Array) return input;\n return new Uint8Array(input);\n}\n\ninterface NodeFsModule {\n readFile(path: string): Promise<ArrayBuffer | Uint8Array>;\n}\n\ninterface NodePathModule {\n basename(path: string): string;\n}\n\ninterface NamedBlob extends Blob {\n name?: string;\n}\n\nfunction isBlobLike(input: unknown): input is Blob {\n if (typeof Blob !== 'undefined' && input instanceof Blob) return true;\n return !!input\n && typeof input === 'object'\n && typeof (input as { arrayBuffer?: unknown }).arrayBuffer === 'function';\n}\n\nfunction inferBlobName(input: Blob, fallback: string): string {\n const named = input as NamedBlob;\n if (typeof named.name === 'string' && named.name.trim() !== '') {\n return named.name;\n }\n return fallback;\n}\n\nasync function readLocalFileFromNode(inputPath: string): Promise<{ bytes: Uint8Array; fileName: string }> {\n try {\n const [fsModule, pathModule] = await Promise.all([\n import(NODE_FS_PROMISES_SPECIFIER) as Promise<NodeFsModule>,\n import(NODE_PATH_SPECIFIER) as Promise<NodePathModule>,\n ]);\n const raw = await fsModule.readFile(inputPath);\n return {\n bytes: toUint8Array(raw),\n fileName: pathModule.basename(inputPath),\n };\n } catch (error) {\n throw new OkraRuntimeError(\n 'INVALID_REQUEST',\n 'Local file path uploads are only supported in Node.js. In browser runtimes, pass File/Blob, ArrayBuffer, Uint8Array, or URL.',\n 400,\n error,\n );\n }\n}\n\ninterface StructuredErrorEnvelope {\n code?: string;\n message?: string;\n details?: unknown;\n error?: string;\n}\n\ninterface NormalizedSchema<T> {\n jsonSchema: JsonSchema;\n parser?: ZodType<T>;\n}\n\nfunction normalizeSchema<T>(schema: StructuredSchema<T>): NormalizedSchema<T> {\n const maybeZod = schema as ZodType<T>;\n const hasSafeParse = typeof (maybeZod as { safeParse?: unknown }).safeParse === 'function';\n if (hasSafeParse) {\n return {\n jsonSchema: z.toJSONSchema(maybeZod, { target: 'draft-2020-12' }) as JsonSchema,\n parser: maybeZod,\n };\n }\n return { jsonSchema: schema as JsonSchema };\n}\n\nfunction isStructuredCode(code: string | undefined): code is StructuredOutputErrorCode {\n return !!code && STRUCTURED_CODES.has(code as StructuredOutputErrorCode);\n}\n\n// ─── Session Handle ──────────────────────────────────────────────────────────\n\nclass OkraSessionHandle implements OkraSession {\n readonly id: string;\n readonly modelEndpoint: string;\n #model?: string;\n #client: OkraClient;\n\n constructor(client: OkraClient, documentId: string, model?: string) {\n this.#client = client;\n this.id = documentId;\n this.modelEndpoint = client.modelEndpoint(documentId);\n this.#model = model;\n }\n\n get model(): string | undefined {\n return this.#model;\n }\n\n state(): SessionState {\n return {\n id: this.id,\n model: this.#model,\n modelEndpoint: this.modelEndpoint,\n };\n }\n\n async setModel(model: string): Promise<void> {\n const normalized = model.trim();\n if (!normalized) {\n throw new OkraRuntimeError('INVALID_REQUEST', 'session.setModel requires a non-empty model', 400);\n }\n this.#model = normalized;\n }\n\n status(signal?: AbortSignal): Promise<DocumentStatus> {\n return this.#client.status(this.id, signal);\n }\n\n wait(options?: WaitOptions): Promise<DocumentStatus> {\n return this.#client.wait(this.id, options);\n }\n\n pages(options?: { range?: string; signal?: AbortSignal }): Promise<Page[]> {\n return this.#client.pages(this.id, options);\n }\n\n page(pageNumber: number, signal?: AbortSignal): Promise<Page> {\n return this.#client.page(this.id, pageNumber, signal);\n }\n\n entities(options?: { type?: string; limit?: number; offset?: number; signal?: AbortSignal }): Promise<EntitiesResponse> {\n return this.#client.entities(this.id, options);\n }\n\n downloadUrl(): string {\n return this.#client.downloadUrl(this.id);\n }\n\n query(sql: string, signal?: AbortSignal): Promise<QueryResult> {\n return this.#client.query(this.id, sql, signal);\n }\n\n logs(options?: LogsOptions): Promise<LogEntry[]> {\n return this.#client.logs(this.id, options);\n }\n\n publish(signal?: AbortSignal): Promise<PublishResult> {\n return this.#client.publish(this.id, signal);\n }\n\n shareLink(options?: ShareLinkOptions): Promise<ShareLinkResult> {\n return this.#client.shareLink(this.id, options);\n }\n\n prompt(\n query: string,\n options?: GenerateOptions & { schema?: undefined },\n ): Promise<GenerateResult>;\n prompt<T>(\n query: string,\n options: GenerateOptions & { schema: StructuredSchema<T> },\n ): Promise<GenerateResult<T>>;\n prompt<T = undefined>(\n query: string,\n options?: GenerateOptions,\n ): Promise<GenerateResult<T>> {\n const model = options?.model ?? this.#model;\n const merged = model ? { ...options, model } : options;\n if (merged?.schema !== undefined) {\n return this.#client.generate(\n this.id,\n query,\n merged as GenerateOptions & { schema: StructuredSchema<unknown> },\n ) as Promise<GenerateResult<T>>;\n }\n return this.#client.generate(\n this.id,\n query,\n merged as GenerateOptions & { schema?: undefined },\n ) as Promise<GenerateResult<T>>;\n }\n\n stream(\n query: string,\n options?: CompletionOptions,\n ): AsyncGenerator<CompletionEvent> {\n const model = options?.model ?? this.#model;\n const merged = model ? { ...options, model } : options;\n return this.#client.stream(this.id, query, merged);\n }\n}\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport class OkraClient {\n private readonly baseUrl: string;\n private readonly apiKey?: string;\n private readonly sharedSecret?: string;\n private readonly fetchImpl: typeof globalThis.fetch;\n readonly sessions: {\n create: (sourceOrDocId: UploadInput, options?: SessionCreateOptions) => Promise<OkraSession>;\n from: (documentId: string, options?: SessionAttachOptions) => OkraSession;\n };\n readonly collections: {\n list: (signal?: AbortSignal) => Promise<CollectionSummary[]>;\n get: (collectionId: string, signal?: AbortSignal) => Promise<Collection>;\n query: <T = undefined>(\n collectionId: string,\n prompt: string,\n options?: CollectionQueryOptions<T>,\n ) => CollectionQueryStream<T>;\n };\n constructor(options: OkraClientOptions) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl || DEFAULT_BASE_URL);\n this.apiKey = options.apiKey;\n this.sharedSecret = options.sharedSecret;\n this.fetchImpl = options.fetch || globalThis.fetch.bind(globalThis);\n\n if (!this.apiKey && !this.sharedSecret) {\n throw new OkraRuntimeError(\n 'UNAUTHORIZED',\n 'OkraClient requires either apiKey or sharedSecret',\n 401,\n );\n }\n\n if (\n typeof globalThis !== 'undefined' && 'window' in globalThis\n && this.apiKey\n && !this.apiKey.startsWith('okra_pk_')\n ) {\n console.warn(\n '[OkraPDF] Secret API key detected in browser. Use a publishable key (okra_pk_...) for client-side usage. ' +\n 'See https://docs.okrapdf.dev/api-keys#publishable-keys',\n );\n }\n\n this.sessions = {\n create: async (sourceOrDocId, sessionOptions = {}) => {\n let documentId: string;\n if (typeof sourceOrDocId === 'string' && isDocumentId(sourceOrDocId.trim())) {\n documentId = sourceOrDocId.trim();\n } else {\n const session = await this.upload(sourceOrDocId, sessionOptions.upload);\n documentId = session.id;\n }\n\n const session = this.sessions.from(documentId, { model: sessionOptions.model });\n if (sessionOptions.wait ?? true) {\n await session.wait(sessionOptions.waitOptions);\n }\n return session;\n },\n from: (documentId, sessionOptions = {}) => {\n const normalized = documentId.trim();\n if (!normalized) {\n throw new OkraRuntimeError(\n 'INVALID_REQUEST',\n 'sessions.from requires a non-empty documentId',\n 400,\n );\n }\n\n return new OkraSessionHandle(\n this,\n normalized,\n sessionOptions.model?.trim() || undefined,\n );\n },\n };\n\n this.collections = {\n list: (signal) => this.collectionList(signal),\n get: (collectionId, signal) => this.collectionGet(collectionId, signal),\n query: <T = undefined>(collectionId: string, prompt: string, options?: CollectionQueryOptions<T>) =>\n this.collectionQuery<T>(collectionId, prompt, options),\n };\n }\n\n // ─── Collections ────────────────────────────────────────────────────────\n\n private async collectionList(signal?: AbortSignal): Promise<CollectionSummary[]> {\n const res = await this.requestJson<{ collections: CollectionSummary[] }>(\n '/v1/collections',\n { method: 'GET', signal },\n );\n return res.collections;\n }\n\n private async collectionGet(collectionId: string, signal?: AbortSignal): Promise<Collection> {\n return this.requestJson<Collection>(\n `/v1/collections/${encodeURIComponent(collectionId)}`,\n { method: 'GET', signal },\n );\n }\n\n private collectionQuery<T = undefined>(\n collectionId: string,\n prompt: string,\n options?: CollectionQueryOptions<T>,\n ): CollectionQueryStream<T> {\n const ac = new AbortController();\n if (options?.signal) {\n options.signal.addEventListener('abort', () => ac.abort(), { once: true });\n }\n\n const body: Record<string, unknown> = { prompt, stream: true };\n if (options?.schema) {\n const normalized = normalizeSchema(options.schema);\n body.response_format = {\n type: 'json_schema',\n json_schema: { name: 'result', schema: normalized.jsonSchema },\n };\n }\n if (options?.docIds) {\n body.doc_ids = options.docIds;\n }\n\n const responsePromise = this.rawRequest(\n `/v1/collections/${encodeURIComponent(collectionId)}/query`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: ac.signal,\n },\n );\n\n async function* iterateNdjson(): AsyncGenerator<CollectionQueryEvent> {\n const response = await responsePromise;\n if (!response.ok) {\n const text = await response.text();\n throw new OkraRuntimeError('HTTP_ERROR', `Collection query failed: ${text}`, response.status);\n }\n if (!response.body) {\n throw new OkraRuntimeError('INVALID_RESPONSE', 'No response body for collection query', 500);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n yield JSON.parse(trimmed) as CollectionQueryEvent;\n } catch {\n // skip malformed lines\n }\n }\n }\n\n // flush remaining buffer\n const remaining = buffer.trim();\n if (remaining) {\n try {\n yield JSON.parse(remaining) as CollectionQueryEvent;\n } catch {\n // skip\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // Tee the generator so gather() and iteration don't conflict\n let iteratorInstance: AsyncGenerator<CollectionQueryEvent> | null = null;\n function getIterator(): AsyncGenerator<CollectionQueryEvent> {\n if (!iteratorInstance) iteratorInstance = iterateNdjson();\n return iteratorInstance;\n }\n\n const stream: CollectionQueryStream<T> = {\n [Symbol.asyncIterator]() {\n return getIterator();\n },\n\n async gather(): Promise<CollectionQueryResult<T>> {\n const startTime = Date.now();\n const answers = new Map<string, DocumentAnswer<T>>();\n let queryId = '';\n let queryPrompt = prompt;\n let totalCostUsd = 0;\n let completed = 0;\n let failed = 0;\n\n for await (const event of getIterator()) {\n if (event.type === 'start') {\n queryId = event.query_id;\n queryPrompt = event.prompt;\n } else if (event.type === 'result') {\n answers.set(event.doc_id, {\n docId: event.doc_id,\n status: event.status,\n answer: event.answer,\n data: event.data as T | undefined,\n costUsd: event.usage?.cost_usd ?? 0,\n durationMs: event.duration_ms,\n error: event.error,\n });\n } else if (event.type === 'done') {\n totalCostUsd = event.total_cost_usd;\n completed = event.completed;\n failed = event.failed;\n } else if (event.type === 'error') {\n throw new OkraRuntimeError('HTTP_ERROR', event.error, 500);\n }\n }\n\n return {\n queryId,\n prompt: queryPrompt,\n answers,\n totalCostUsd,\n durationMs: Date.now() - startTime,\n completed,\n failed,\n };\n },\n\n abort() {\n ac.abort();\n },\n\n toReadableStream(): ReadableStream<Uint8Array> {\n // Return raw body — lazy, only fetched if called before iteration\n const encoder = new TextEncoder();\n const iter = getIterator();\n return new ReadableStream({\n async pull(controller) {\n const { done, value } = await iter.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(encoder.encode(JSON.stringify(value) + '\\n'));\n }\n },\n cancel() {\n ac.abort();\n },\n });\n },\n };\n\n return stream;\n }\n\n // ─── Upload ──────────────────────────────────────────────────────────────\n\n async upload(input: UploadInput, options: UploadOptions = {}): Promise<OkraSession> {\n const documentId = options.documentId || makeDocId();\n const path = `/document/${encodeURIComponent(documentId)}`;\n const visibility = options.visibility || 'private';\n\n if (typeof input === 'string' && isHttpUrl(input)) {\n const urlHeaders: Record<string, string> = { 'Content-Type': 'application/json' };\n if (options.vendorKeys) {\n urlHeaders['X-Vendor-Keys'] = JSON.stringify(options.vendorKeys);\n }\n await this.requestJson<{ phase?: string }>(`${path}/upload-url`, {\n method: 'POST',\n headers: urlHeaders,\n body: JSON.stringify({\n url: input,\n capabilities: options.capabilities,\n visibility,\n redact: options.redact,\n }),\n });\n return this.sessions.from(documentId);\n }\n\n let bytes: Uint8Array;\n let fileName = options.fileName || 'document.pdf';\n if (typeof input === 'string') {\n const local = await readLocalFileFromNode(input);\n bytes = local.bytes;\n if (!options.fileName) fileName = local.fileName;\n } else if (isBlobLike(input)) {\n bytes = toUint8Array(await input.arrayBuffer());\n if (!options.fileName) {\n fileName = inferBlobName(input, fileName);\n }\n } else {\n bytes = toUint8Array(input);\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/pdf',\n 'X-File-Name': fileName,\n };\n if (options.capabilities) {\n headers['X-Capabilities'] = JSON.stringify(options.capabilities);\n }\n if (options.vendorKeys) {\n headers['X-Vendor-Keys'] = JSON.stringify(options.vendorKeys);\n }\n if (options.redact) {\n headers['X-Redact'] = JSON.stringify(options.redact);\n }\n if (visibility === 'public') {\n headers['X-Visibility'] = 'public';\n }\n\n await this.requestJson<{ phase?: string }>(`${path}/upload`, {\n method: 'POST',\n headers,\n body: bytes as unknown as BodyInit,\n });\n\n return this.sessions.from(documentId);\n }\n\n // ─── Status / Wait ───────────────────────────────────────────────────────\n\n async status(documentId: string, signal?: AbortSignal): Promise<DocumentStatus> {\n return this.requestJson<DocumentStatus>(\n `/document/${encodeURIComponent(documentId)}/status`,\n { method: 'GET', signal },\n );\n }\n\n async wait(documentId: string, options: WaitOptions = {}): Promise<DocumentStatus> {\n const startedAt = Date.now();\n const timeoutMs = options.timeoutMs ?? DEFAULT_WAIT_TIMEOUT_MS;\n const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_WAIT_POLL_MS;\n\n while (true) {\n if (options.signal?.aborted) {\n throw new OkraRuntimeError('TIMEOUT', 'Wait aborted', 499);\n }\n\n const current = await this.status(documentId, options.signal);\n if (COMPLETE_PHASES.has(current.phase)) {\n return current;\n }\n if (TERMINAL_ERROR_PHASES.has(current.phase)) {\n throw new OkraRuntimeError(\n 'EXTRACTION_FAILED',\n `Document entered terminal error phase (${current.phase})`,\n 500,\n current,\n );\n }\n\n const elapsed = Date.now() - startedAt;\n if (elapsed >= timeoutMs) {\n throw new OkraRuntimeError(\n 'TIMEOUT',\n `Timed out waiting for document ${documentId} after ${timeoutMs}ms`,\n 504,\n current,\n );\n }\n\n await sleep(pollIntervalMs);\n }\n }\n\n // ─── Pages ───────────────────────────────────────────────────────────────\n\n async pages(documentId: string, options?: { range?: string; signal?: AbortSignal }): Promise<Page[]> {\n const params = options?.range ? `?range=${encodeURIComponent(options.range)}` : '';\n return this.requestJson<Page[]>(\n `/document/${encodeURIComponent(documentId)}/pages${params}`,\n { method: 'GET', signal: options?.signal },\n );\n }\n\n async page(documentId: string, pageNumber: number, signal?: AbortSignal): Promise<Page> {\n return this.requestJson<Page>(\n `/document/${encodeURIComponent(documentId)}/page/${pageNumber}`,\n { method: 'GET', signal },\n );\n }\n\n // ─── Download ──────────────────────────────────────────────────────────\n\n downloadUrl(documentId: string): string {\n return `${this.baseUrl}/document/${encodeURIComponent(documentId)}/download`;\n }\n\n // ─── Entities ────────────────────────────────────────────────────────────\n\n async entities(\n documentId: string,\n options?: { type?: string; limit?: number; offset?: number; signal?: AbortSignal },\n ): Promise<EntitiesResponse> {\n const params = new URLSearchParams();\n if (options?.type) params.set('type', options.type);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n const qs = params.toString();\n return this.requestJson<EntitiesResponse>(\n `/document/${encodeURIComponent(documentId)}/nodes${qs ? `?${qs}` : ''}`,\n { method: 'GET', signal: options?.signal },\n );\n }\n\n // ─── Query (SQL) ─────────────────────────────────────────────────────────\n\n async query(documentId: string, sql: string, signal?: AbortSignal): Promise<QueryResult> {\n return this.requestJson<QueryResult>(\n `/document/${encodeURIComponent(documentId)}/query?select=${encodeURIComponent(sql)}`,\n { method: 'GET', signal },\n );\n }\n\n // ─── Logs ───────────────────────────────────────────────────────────────\n\n async logs(documentId: string, options?: LogsOptions): Promise<LogEntry[]> {\n const limit = options?.limit ?? 100;\n const res = await this.requestJson<{ entries: LogEntry[] }>(\n `/document/${encodeURIComponent(documentId)}/log?limit=${limit}`,\n { method: 'GET', signal: options?.signal },\n );\n return res.entries;\n }\n\n // ─── Stream (streaming completion via OpenAI SSE) ────────────────────────\n\n async *stream(\n documentId: string,\n query: string,\n options?: CompletionOptions,\n ): AsyncGenerator<CompletionEvent> {\n const response = await this.rawRequest(\n `/document/${encodeURIComponent(documentId)}/chat/completions`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n messages: [{ role: 'user', content: query }],\n stream: options?.stream !== false,\n ...(options?.model ? { model: options.model } : {}),\n }),\n signal: options?.signal,\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new OkraRuntimeError('HTTP_ERROR', `Completion failed: ${text}`, response.status);\n }\n\n if (!response.body) {\n throw new OkraRuntimeError('INVALID_RESPONSE', 'No response body for completion stream', 500);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let fullText = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === 'data: [DONE]') continue;\n if (!trimmed.startsWith('data: ')) continue;\n const json = trimmed.slice(6);\n try {\n const chunk = JSON.parse(json) as {\n choices?: Array<{ delta?: { content?: string }; finish_reason?: string | null }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number };\n error?: { message?: string };\n };\n\n if (chunk.error) {\n yield { type: 'error', message: chunk.error.message || 'Stream error' };\n continue;\n }\n\n const delta = chunk.choices?.[0]?.delta?.content;\n if (delta) {\n fullText += delta;\n yield { type: 'text_delta', text: delta };\n }\n\n if (chunk.choices?.[0]?.finish_reason === 'stop') {\n yield { type: 'done', answer: fullText };\n }\n } catch {\n // skip malformed lines\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // ─── Generate (non-streaming AI) ─────────────────────────────────────────\n\n async generate(\n documentId: string,\n query: string,\n options?: GenerateOptions & { schema?: undefined },\n ): Promise<GenerateResult>;\n async generate<T>(\n documentId: string,\n query: string,\n options: GenerateOptions & { schema: StructuredSchema<T> },\n ): Promise<GenerateResult<T>>;\n async generate<T = undefined>(\n documentId: string,\n query: string,\n options?: GenerateOptions,\n ): Promise<GenerateResult<T>> {\n if (options?.schema) {\n return this.generateStructured<T>(documentId, query, options);\n }\n\n const result = await this.requestJson<{\n id: string;\n choices: Array<{ message: { content: string } }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number };\n }>(\n `/document/${encodeURIComponent(documentId)}/chat/completions`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n messages: [{ role: 'user', content: query }],\n ...(options?.model ? { model: options.model } : {}),\n }),\n signal: options?.signal,\n },\n );\n\n return {\n answer: result.choices?.[0]?.message?.content || '',\n };\n }\n\n private async generateStructured<T>(\n documentId: string,\n query: string,\n options: GenerateOptions,\n ): Promise<GenerateResult<T>> {\n if (!query || query.trim() === '') {\n throw new OkraRuntimeError('INVALID_REQUEST', 'generate with schema requires a non-empty query', 400);\n }\n\n const normalized = normalizeSchema(options.schema as StructuredSchema<T>);\n const result = await this.requestJson<{\n id: string;\n choices: Array<{ message: { content: string } }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number };\n }>(\n `/document/${encodeURIComponent(documentId)}/chat/completions`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n messages: [{ role: 'user', content: query }],\n response_format: {\n type: 'json_schema',\n json_schema: { name: 'result', schema: normalized.jsonSchema },\n },\n ...(options.model ? { model: options.model } : {}),\n }),\n signal: options.signal,\n },\n );\n\n const raw = result.choices?.[0]?.message?.content;\n if (!raw) {\n throw new OkraRuntimeError('INVALID_RESPONSE', 'No content in structured output response', 500);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new OkraRuntimeError('INVALID_RESPONSE', 'Structured output response is not valid JSON', 500);\n }\n\n let data: T;\n if (normalized.parser) {\n const zodResult = normalized.parser.safeParse(parsed);\n if (!zodResult.success) {\n throw new StructuredOutputError(\n 'SCHEMA_VALIDATION_FAILED',\n 'Client-side schema validation failed for structured output response',\n 422,\n zodResult.error.issues,\n );\n }\n data = zodResult.data;\n } else {\n data = parsed as T;\n }\n\n return {\n answer: '',\n data,\n };\n }\n\n // ─── Model Endpoint ──────────────────────────────────────────────────────\n\n modelEndpoint(documentId: string): string {\n return `${this.baseUrl}/v1/documents/${encodeURIComponent(documentId)}`;\n }\n\n // ─── Publish / Share ────────────────────────────────────────────────────\n\n async publish(documentId: string, signal?: AbortSignal): Promise<PublishResult> {\n const result = await this.requestJson<Omit<PublishResult, 'url'>>(\n `/document/${encodeURIComponent(documentId)}/publish`,\n { method: 'POST', signal },\n );\n return {\n ...result,\n url: `${this.baseUrl}/v1/documents/${encodeURIComponent(documentId)}`,\n };\n }\n\n async shareLink(documentId: string, options?: ShareLinkOptions): Promise<ShareLinkResult> {\n return this.requestJson<ShareLinkResult>(\n `/document/${encodeURIComponent(documentId)}/share-link`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n role: options?.role,\n label: options?.label,\n expiresInMs: options?.expiresInMs,\n maxViews: options?.maxViews,\n }),\n signal: options?.signal,\n },\n );\n }\n\n // ─── Public HTTP ─────────────────────────────────────────────────────────\n\n async request<T>(path: string, init: RequestInit = {}): Promise<T> {\n return this.requestJson<T>(path, init);\n }\n\n get url(): string {\n return this.baseUrl;\n }\n\n // ─── Internal HTTP ───────────────────────────────────────────────────────\n\n private authHeaders(): Record<string, string> {\n if (this.apiKey) return { Authorization: `Bearer ${this.apiKey}` };\n if (this.sharedSecret) return { 'x-document-agent-secret': this.sharedSecret };\n return {};\n }\n\n private async rawRequest(path: string, init: RequestInit): Promise<Response> {\n const headers = new Headers(init.headers);\n for (const [key, value] of Object.entries(this.authHeaders())) {\n if (!headers.has(key)) headers.set(key, value);\n }\n\n try {\n return await this.fetchImpl(`${this.baseUrl}${path}`, { ...init, headers });\n } catch (err) {\n throw new OkraRuntimeError(\n 'HTTP_ERROR',\n err instanceof Error ? err.message : String(err),\n 502,\n );\n }\n }\n\n private async requestJson<T>(path: string, init: RequestInit): Promise<T> {\n const response = await this.rawRequest(path, init);\n const text = await response.text();\n const parsed = this.parseBody(text);\n\n if (!response.ok) {\n const envelope = parsed as StructuredErrorEnvelope | null;\n const code = envelope?.code;\n const message = envelope?.message || envelope?.error || `Request failed with status ${response.status}`;\n const details = envelope?.details ?? parsed ?? text;\n if (isStructuredCode(code)) {\n throw new StructuredOutputError(code, message, response.status, details);\n }\n const runtimeCode: RuntimeErrorCode = response.status === 401 ? 'UNAUTHORIZED' : 'HTTP_ERROR';\n throw new OkraRuntimeError(runtimeCode, message, response.status, details);\n }\n\n if (parsed === null) {\n throw new OkraRuntimeError(\n 'INVALID_RESPONSE',\n `Expected JSON response for ${path}`,\n response.status,\n text,\n );\n }\n\n return parsed as T;\n }\n\n private parseBody(text: string): unknown | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n try {\n return JSON.parse(trimmed);\n } catch {\n return null;\n }\n }\n}\n"],"mappings":"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","names":["session","options"]}
|