okrapdf 0.13.0 → 0.14.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 +29 -4
- package/dist/browser.d.ts +1 -1
- package/dist/browser.js +1 -1
- package/dist/{chunk-KJMV6TN2.js → chunk-7BAEYVWG.js} +2 -2
- package/dist/{chunk-F3LECDPP.js → chunk-ETARIBOV.js} +293 -35
- package/dist/chunk-ETARIBOV.js.map +1 -0
- package/dist/{chunk-QKII53VN.js → chunk-HPTXRSWK.js} +2 -2
- package/dist/chunk-HPTXRSWK.js.map +1 -0
- package/dist/chunk-MSZQPLMQ.js +497 -0
- package/dist/chunk-MSZQPLMQ.js.map +1 -0
- package/dist/{chunk-2VKGPLAA.js → chunk-YGIBZV5J.js} +174 -92
- package/dist/chunk-YGIBZV5J.js.map +1 -0
- package/dist/cli/bin.d.ts +39 -0
- package/dist/cli/bin.js +440 -56
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.js +2 -1
- package/dist/{client-DMEw0oK3.d.ts → client-D4A0dQ4h.d.ts} +2 -1
- package/dist/index.d.ts +146 -4
- package/dist/index.js +19 -3
- 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-D2JaySEg.d.ts → types-SYOi8k1l.d.ts} +12 -4
- package/dist/url.d.ts +1 -1
- package/dist/url.js +1 -1
- package/package.json +4 -2
- package/dist/chunk-2VKGPLAA.js.map +0 -1
- package/dist/chunk-F3LECDPP.js.map +0 -1
- package/dist/chunk-QKII53VN.js.map +0 -1
- /package/dist/{chunk-KJMV6TN2.js.map → chunk-7BAEYVWG.js.map} +0 -0
|
@@ -39,6 +39,12 @@ interface UploadOptions {
|
|
|
39
39
|
vendorKeys?: Record<string, string>;
|
|
40
40
|
/** OpenRedact policy forwarded to upload and enforced at read/query/completion surfaces. */
|
|
41
41
|
redact?: UploadRedactOptions;
|
|
42
|
+
/**
|
|
43
|
+
* Vendor-specific options passed through to the parsing vendor API.
|
|
44
|
+
* Follows the AI SDK providerOptions pattern — keys are vendor API fields.
|
|
45
|
+
* @example { model: 'gemini-3.1-pro', parse_mode: 'parse_page_with_agent' }
|
|
46
|
+
*/
|
|
47
|
+
vendorOptions?: Record<string, unknown>;
|
|
42
48
|
}
|
|
43
49
|
type WorkflowPhase = 'ocr' | 'enhance' | 'metadata' | 'verify';
|
|
44
50
|
type WorkflowTier = 'fast' | 'standard' | 'premium';
|
|
@@ -349,8 +355,9 @@ type CollectionQueryEvent = {
|
|
|
349
355
|
};
|
|
350
356
|
/** Options for `client.collections.query()` — the map-reduce fan-out path. */
|
|
351
357
|
interface CollectionQueryOptions<T = undefined> {
|
|
352
|
-
/** JSON Schema or Zod schema for structured extraction per document.
|
|
353
|
-
* When provided, each result includes a typed `data` field.
|
|
358
|
+
/** Experimental: JSON Schema or Zod schema for structured extraction per document.
|
|
359
|
+
* When provided, each result includes a typed `data` field.
|
|
360
|
+
* Structured collection fan-out is not part of the stable v0.14 surface. */
|
|
354
361
|
schema?: StructuredSchema<T>;
|
|
355
362
|
/** Subset of document IDs to query. Omit to query all docs in collection. */
|
|
356
363
|
docIds?: string[];
|
|
@@ -471,7 +478,8 @@ interface OkraCollections {
|
|
|
471
478
|
get(collectionId: string, signal?: AbortSignal): Promise<Collection>;
|
|
472
479
|
/** Unstructured fan-out — each doc answers independently via NDJSON stream. */
|
|
473
480
|
query(collectionId: string, prompt: string, options?: CollectionQueryOptions): CollectionQueryStream;
|
|
474
|
-
/**
|
|
481
|
+
/** Experimental structured fan-out — each doc extracts typed data matching the schema.
|
|
482
|
+
* This schema-based collection path is not part of the stable v0.14 surface. */
|
|
475
483
|
query<T>(collectionId: string, prompt: string, options: CollectionQueryOptions<T> & {
|
|
476
484
|
schema: StructuredSchema<T>;
|
|
477
485
|
}): CollectionQueryStream<T>;
|
|
@@ -578,4 +586,4 @@ interface DocUrlOptions {
|
|
|
578
586
|
output?: string;
|
|
579
587
|
}
|
|
580
588
|
|
|
581
|
-
export type {
|
|
589
|
+
export type { SessionAttachOptions as $, ApiKeyWorkflowConfigResponse as A, DocumentConfigResult as B, CompletionOptions as C, DocumentStatus as D, EntitiesResponse as E, DocumentConfigUpdate as F, GenerateOptions as G, DocumentListItem as H, DocumentListResponse as I, DocumentMarkdownExport as J, Entity as K, LogsOptions as L, JsonSchema as M, MarkdownPage as N, OkraClientOptions as O, ProcessingCapabilities as P, QueryResult as Q, RuntimeErrorCode as R, SessionState as S, OkraCollections as T, PageBlock as U, PageEntity as V, WaitOptions as W, ReadDocumentOptions as X, ReadDocumentResult as Y, ReparseOptions as Z, ReparseResult as _, OkraSession as a, SessionCreateOptions as a0, ShareLinkCapabilities as a1, ShareLinkLinks as a2, StructuredOutputMeta as a3, UploadInput as a4, UploadOptions as a5, UploadRedactOptions as a6, UploadRedactPiiOptions as a7, UrlBuilderOptions as a8, WorkflowPhase as a9, WorkflowPhaseConfig as aa, WorkflowTier as ab, DeliveryTransform as ac, CompletionEvent as b, Page as c, LogEntry as d, PublishResult as e, ShareLinkOptions as f, ShareLinkResult as g, GenerateResult as h, StructuredSchema as i, StructuredOutputErrorCode as j, ApplyWorkflowOptions as k, ApplyWorkflowResult as l, Collection as m, CollectionDocument as n, CollectionExportEvent as o, CollectionExportFormat as p, CollectionExportOptions as q, CollectionMarkdownExport as r, CollectionQueryEvent as s, CollectionQueryOptions as t, CollectionQueryResult as u, CollectionQueryStream as v, CollectionSummary as w, DeleteDocumentResult as x, DocUrlOptions as y, DocumentAnswer as z };
|
package/dist/url.d.ts
CHANGED
package/dist/url.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "okrapdf",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
|
+
"okraApi": "^1.14.0",
|
|
4
5
|
"description": "OkraPDF — upload a PDF, get an API. Runtime client, React hooks, and CLI.",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"exports": {
|
|
@@ -51,7 +52,8 @@
|
|
|
51
52
|
"build": "tsup",
|
|
52
53
|
"docs:cli": "node ./scripts/generate-cli-docs.mjs",
|
|
53
54
|
"docs:cli:check": "node ./scripts/generate-cli-docs.mjs --check",
|
|
54
|
-
"test": "vitest run",
|
|
55
|
+
"test": "vitest run --exclude '**/**.e2e.test.ts'",
|
|
56
|
+
"test:e2e": "vitest run src/client.e2e.test.ts",
|
|
55
57
|
"test:watch": "vitest",
|
|
56
58
|
"typecheck": "tsc --noEmit"
|
|
57
59
|
},
|
|
@@ -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 CollectionExportFormat,\n CollectionExportOptions,\n CollectionExportEvent,\n CollectionMarkdownExport,\n CollectionQueryEvent,\n CollectionQueryOptions,\n CollectionQueryResult,\n CollectionQueryStream,\n CollectionSummary,\n CompletionEvent,\n CompletionOptions,\n DeleteDocumentResult,\n DocumentAnswer,\n DocumentConfigResult,\n DocumentConfigUpdate,\n DocumentListItem,\n DocumentListResponse,\n DocumentMarkdownExport,\n DocumentStatus,\n EntitiesResponse,\n GenerateOptions,\n GenerateResult,\n JsonSchema,\n LogEntry,\n LogsOptions,\n MarkdownPage,\n Page,\n PublishResult,\n QueryResult,\n ReadDocumentOptions,\n ReadDocumentResult,\n ReparseOptions,\n ReparseResult,\n RuntimeErrorCode,\n ShareLinkOptions,\n ShareLinkResult,\n SessionAttachOptions,\n SessionCreateOptions,\n SessionState,\n OkraSession,\n StructuredOutputErrorCode,\n StructuredSchema,\n ApiKeyWorkflowConfigResponse,\n ApplyWorkflowOptions,\n ApplyWorkflowResult,\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\nfunction toHeaderSafeFileName(fileName: string): string {\n const leaf = fileName.split(/[\\\\/]/).pop() || fileName;\n const cleaned = leaf.replace(/[\\r\\n]/g, ' ').trim();\n\n if (/^[\\x20-\\x7E]+$/.test(cleaned)) {\n return cleaned;\n }\n\n const extMatch = cleaned.match(/(\\.[A-Za-z0-9]{1,10})$/);\n const extension = extMatch?.[1].toLowerCase() ?? '';\n const base = extension ? cleaned.slice(0, -extension.length) : cleaned;\n\n const asciiBase = base\n .normalize('NFKD')\n .replace(/[^\\x20-\\x7E]/g, '')\n .replace(/[^A-Za-z0-9._ -]/g, '_')\n .replace(/\\s+/g, '_')\n .replace(/_+/g, '_')\n .replace(/^[._-]+|[._-]+$/g, '');\n\n return `${asciiBase || 'document'}${extension || '.pdf'}`;\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 const code = typeof error === 'object' && error && 'code' in error\n ? String((error as { code?: unknown }).code)\n : undefined;\n const msg = error instanceof Error ? error.message : String(error);\n\n if (code === 'ENOENT') {\n throw new OkraRuntimeError(\n 'INVALID_REQUEST',\n `Local file not found: ${inputPath}`,\n 400,\n error,\n );\n }\n\n if (code === 'EACCES' || code === 'EPERM') {\n throw new OkraRuntimeError(\n 'INVALID_REQUEST',\n `Cannot read local file (${code}): ${inputPath}`,\n 400,\n error,\n );\n }\n\n if (code === 'ERR_MODULE_NOT_FOUND' || code === 'ERR_UNKNOWN_BUILTIN_MODULE') {\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 throw new OkraRuntimeError(\n 'INVALID_REQUEST',\n `Failed to read local file \"${inputPath}\": ${msg}`,\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 exportMarkdown: (\n collectionId: string,\n options?: AbortSignal | CollectionExportOptions,\n ) => Promise<CollectionMarkdownExport | Uint8Array>;\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.com/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 exportMarkdown: (collectionId, options?) => this.collectionExportMarkdown(collectionId, 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 // ─── Collection Export (markdown from R2) ────────────────────────────────\n\n private collectionExportPath(collectionId: string, format: CollectionExportFormat): string {\n return `/v1/collections/${encodeURIComponent(collectionId)}/export?format=${encodeURIComponent(format)}`;\n }\n\n private async collectionExportMarkdown(\n collectionId: string,\n options?: AbortSignal | CollectionExportOptions,\n ): Promise<CollectionMarkdownExport | Uint8Array> {\n let format: CollectionExportFormat = 'markdown';\n let signal: AbortSignal | undefined;\n\n if (options && typeof options === 'object' && 'aborted' in options) {\n signal = options as AbortSignal;\n } else if (options) {\n format = options.format ?? 'markdown';\n signal = options.signal;\n }\n\n const response = await this.rawRequest(\n this.collectionExportPath(collectionId, format),\n { method: 'GET', signal },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new OkraRuntimeError('HTTP_ERROR', `Collection export failed: ${text}`, response.status);\n }\n\n if (format === 'zip') {\n const body = await response.arrayBuffer();\n return new Uint8Array(body);\n }\n\n if (!response.body) {\n throw new OkraRuntimeError('INVALID_RESPONSE', 'No response body for collection export', 500);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n const documents: DocumentMarkdownExport[] = [];\n let totalPages = 0;\n let collectionName = '';\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 const event = JSON.parse(trimmed) as CollectionExportEvent;\n if (event.type === 'result') {\n documents.push({\n docId: event.doc_id,\n fileName: event.file_name,\n pageCount: event.page_count,\n pages: event.pages,\n });\n totalPages += event.page_count;\n }\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 const event = JSON.parse(remaining) as CollectionExportEvent;\n if (event.type === 'result') {\n documents.push({\n docId: event.doc_id,\n fileName: event.file_name,\n pageCount: event.page_count,\n pages: event.pages,\n });\n totalPages += event.page_count;\n }\n } catch {\n // skip\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n // Try to get collection name from metadata\n try {\n const col = await this.collectionGet(collectionId);\n collectionName = col.name;\n } catch {\n collectionName = collectionId;\n }\n\n return {\n collectionId,\n collectionName,\n documents,\n totalDocuments: documents.length,\n totalPages,\n exportedAt: new Date().toISOString(),\n };\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': toHeaderSafeFileName(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 // ─── Workflow Config / Reparse ───────────────────────────────────────────\n\n async updateConfig(\n documentId: string,\n update: DocumentConfigUpdate,\n signal?: AbortSignal,\n ): Promise<DocumentConfigResult> {\n if (!documentId.trim()) {\n throw new OkraRuntimeError('INVALID_REQUEST', 'updateConfig requires a non-empty documentId', 400);\n }\n return this.requestJson<DocumentConfigResult>(\n `/v1/documents/${encodeURIComponent(documentId)}/config`,\n {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(update),\n signal,\n },\n );\n }\n\n async reparse(\n documentId: string,\n options: ReparseOptions = {},\n ): Promise<ReparseResult> {\n if (!documentId.trim()) {\n throw new OkraRuntimeError('INVALID_REQUEST', 'reparse requires a non-empty documentId', 400);\n }\n const strategy = options.strategy && options.strategy !== 'auto'\n ? `?strategy=${encodeURIComponent(options.strategy)}`\n : '';\n return this.requestJson<ReparseResult>(\n `/v1/documents/${encodeURIComponent(documentId)}/reparse${strategy}`,\n { method: 'POST', signal: options.signal },\n );\n }\n\n async applyWorkflow(\n documentId: string,\n options: ApplyWorkflowOptions,\n ): Promise<ApplyWorkflowResult> {\n if (!options?.capabilities) {\n throw new OkraRuntimeError('INVALID_REQUEST', 'applyWorkflow requires capabilities', 400);\n }\n\n const config = await this.updateConfig(\n documentId,\n { capabilities: options.capabilities },\n options.signal,\n );\n\n if (options.reparse === false) {\n return { config };\n }\n\n const reparse = await this.reparse(documentId, {\n strategy: options.strategy,\n signal: options.signal,\n });\n return { config, reparse };\n }\n\n async getKeyWorkflow(signal?: AbortSignal): Promise<ApiKeyWorkflowConfigResponse> {\n return this.requestJson<ApiKeyWorkflowConfigResponse>(\n '/v1/key-workflow',\n { method: 'GET', signal },\n );\n }\n\n async setKeyWorkflow(\n defaultCapabilities: ApiKeyWorkflowConfigResponse['default_capabilities'],\n signal?: AbortSignal,\n ): Promise<ApiKeyWorkflowConfigResponse> {\n return this.requestJson<ApiKeyWorkflowConfigResponse>(\n '/v1/key-workflow',\n {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ default_capabilities: defaultCapabilities }),\n signal,\n },\n );\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 // ─── List Documents ─────────────────────────────────────────────────────\n\n async listDocuments(signal?: AbortSignal): Promise<DocumentListItem[]> {\n const res = await this.requestJson<DocumentListResponse>(\n '/v1/documents',\n { method: 'GET', signal },\n );\n return res.documents;\n }\n\n // ─── Delete Document ──────────────────────────────────────────────────\n\n async deleteDocument(documentId: string, signal?: AbortSignal): Promise<DeleteDocumentResult> {\n if (!documentId.trim()) {\n throw new OkraRuntimeError('INVALID_REQUEST', 'deleteDocument requires a non-empty documentId', 400);\n }\n await this.requestJson<{ ok: boolean }>(\n `/document/${encodeURIComponent(documentId)}`,\n { method: 'DELETE', signal },\n );\n return { deleted: true, documentId };\n }\n\n // ─── Read Document (full markdown) ────────────────────────────────────\n\n async read(documentId: string, options?: ReadDocumentOptions): Promise<ReadDocumentResult> {\n if (!documentId.trim()) {\n throw new OkraRuntimeError('INVALID_REQUEST', 'read requires a non-empty documentId', 400);\n }\n const params = options?.pages ? `?pages=${encodeURIComponent(options.pages)}` : '';\n const response = await this.rawRequest(\n `/v1/documents/${encodeURIComponent(documentId)}/full.md${params}`,\n { method: 'GET', signal: options?.signal },\n );\n if (!response.ok) {\n const text = await response.text();\n throw new OkraRuntimeError('HTTP_ERROR', `Read failed: ${text}`, response.status);\n }\n const markdown = await response.text();\n return { documentId, markdown };\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/commands/tree.ts","../src/cli/query-engine.ts","../src/cli/commands/find.ts","../src/cli/commands/page.ts","../src/cli/commands/search.ts","../src/cli/commands/tables.ts","../src/cli/commands/history.ts","../src/cli/commands/toc.ts","../src/cli/config.ts","../src/cli/commands/auth.ts","../src/cli/output.ts","../src/cli/commands/upload.ts","../src/cli/commands/list.ts","../src/cli/commands/delete.ts","../src/cli/commands/read.ts","../src/cli/commands/collection.ts"],"sourcesContent":["/**\n * okra tree - Document verification tree command\n *\n * Maps to: Left panel of review page\n * Shows page-level verification status and entity counts.\n *\n * Usage:\n * okra tree <jobId>\n * okra tree <jobId> --status pending\n * okra tree <jobId> --entity table\n * okra tree <jobId> --format json\n */\n\nimport type { OkraClient } from '../../client';\nimport type {\n VerificationPageStatus,\n EntityType,\n} from '../types';\n\n// Re-export VerificationTree types from CLI types\nexport type { VerificationTree as VerificationTreeResponse } from '../types';\n\nexport interface TreeOptions {\n status?: VerificationPageStatus;\n entity?: EntityType;\n format?: 'text' | 'json' | 'markdown';\n}\n\nexport interface TreeResult {\n tree: any; // Will use VerificationTree from types\n filteredPages: number[];\n}\n\n/**\n * Get the verification tree for a job.\n */\nexport async function tree(\n client: OkraClient,\n jobId: string,\n options: TreeOptions = {}\n): Promise<TreeResult> {\n const treeData = await client.request<any>(`/document/${jobId}/verification-tree`);\n\n // Filter pages if status filter specified\n let filteredPages = treeData.pages.map((p: any) => p.page);\n\n if (options.status) {\n filteredPages = treeData.pages\n .filter((p: any) => p.status === options.status)\n .map((p: any) => p.page);\n }\n\n // If entity filter specified, we need to fetch entities and filter\n if (options.entity) {\n const entitiesData = await client.request<any>(`/document/${jobId}/nodes?type=${options.entity}`);\n const pagesWithEntity = new Set(entitiesData.entities.map((e: any) => e.page));\n filteredPages = filteredPages.filter((p: number) => pagesWithEntity.has(p));\n }\n\n return { tree: treeData, filteredPages };\n}\n\n/**\n * Format tree result for output.\n */\nexport function formatTreeOutput(\n result: TreeResult,\n format: 'text' | 'json' | 'markdown' = 'text'\n): string {\n if (format === 'json') {\n return JSON.stringify(result, null, 2);\n }\n\n const { tree: treeData, filteredPages } = result;\n const lines: string[] = [];\n\n if (format === 'markdown') {\n lines.push(`# Verification Tree: ${treeData.jobId}`);\n lines.push('');\n lines.push(`**Total Pages:** ${treeData.totalPages}`);\n lines.push('');\n lines.push('## Summary');\n lines.push('| Status | Count |');\n lines.push('|--------|-------|');\n lines.push(`| Complete | ${treeData.summary.complete} |`);\n lines.push(`| Partial | ${treeData.summary.partial} |`);\n lines.push(`| Pending | ${treeData.summary.pending} |`);\n lines.push(`| Flagged | ${treeData.summary.flagged} |`);\n lines.push(`| Empty | ${treeData.summary.empty} |`);\n lines.push(`| Gap | ${treeData.summary.gap} |`);\n lines.push('');\n lines.push('## Pages');\n lines.push('| Page | Status | Total | Verified | Pending | Flagged |');\n lines.push('|------|--------|-------|----------|---------|---------|');\n\n for (const page of treeData.pages) {\n if (filteredPages.includes(page.page)) {\n lines.push(\n `| ${page.page} | ${page.status} | ${page.total} | ${page.verified} | ${page.pending} | ${page.flagged} |`\n );\n }\n }\n } else {\n // Text format\n lines.push(`Verification Tree: ${treeData.jobId}`);\n lines.push(`Total Pages: ${treeData.totalPages}`);\n lines.push('');\n lines.push('Summary:');\n lines.push(` Complete: ${treeData.summary.complete}`);\n lines.push(` Partial: ${treeData.summary.partial}`);\n lines.push(` Pending: ${treeData.summary.pending}`);\n lines.push(` Flagged: ${treeData.summary.flagged}`);\n lines.push(` Empty: ${treeData.summary.empty}`);\n lines.push(` Gap: ${treeData.summary.gap}`);\n lines.push('');\n lines.push('Pages:');\n\n for (const page of treeData.pages) {\n if (filteredPages.includes(page.page)) {\n const statusIcon = getStatusIcon(page.status);\n const counts = `[${page.verified}/${page.total}]`;\n const flags = page.flagged > 0 ? ` (${page.flagged} flagged)` : '';\n const gaps = page.hasCoverageGaps ? ' [GAP]' : '';\n lines.push(` ${statusIcon} p${page.page.toString().padStart(3)} ${counts}${flags}${gaps}`);\n }\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction getStatusIcon(status: VerificationPageStatus): string {\n switch (status) {\n case 'complete':\n return '✓';\n case 'partial':\n return '◐';\n case 'pending':\n return '○';\n case 'flagged':\n return '⚑';\n case 'empty':\n return '·';\n case 'gap':\n return '!';\n case 'error':\n return '✗';\n default:\n return '?';\n }\n}\n","/**\n * Query Engine - jQuery-like entity selector\n *\n * Inspired by okra-jquery from ~/dev/okrapdf/lib/okra-jquery\n * Supports selectors like:\n * - Type: .table, .figure, .footnote\n * - ID: #entity_123\n * - Attributes: [confidence>0.9], [verified=true]\n * - Page: :page(5), :pages(1-10)\n * - Combinators: .table[confidence>0.9], .table, .figure\n */\n\nimport type { Entity, EntityType } from './types';\n\nexport interface SelectorParts {\n types: EntityType[];\n id?: string;\n pageFilter?: { type: 'single' | 'range'; value: number | [number, number] };\n confidenceFilter?: { op: '>' | '<' | '>=' | '<='; value: number };\n verificationFilter?: 'pending' | 'verified' | 'flagged' | 'rejected';\n textContains?: string;\n}\n\n/**\n * Parse a jQuery-like selector string into parts.\n *\n * Examples:\n * - \".table\" -> { types: ['table'] }\n * - \".table, .figure\" -> { types: ['table', 'figure'] }\n * - \".table:page(5)\" -> { types: ['table'], pageFilter: { type: 'single', value: 5 } }\n * - \"[confidence>0.9]\" -> { confidenceFilter: { op: '>', value: 0.9 } }\n * - \".table[confidence>=0.8]:page(1-10)\" -> complex filter\n */\nexport function parseSelector(selector: string): SelectorParts {\n const parts: SelectorParts = { types: [] };\n\n // Handle OR combinator first (comma-separated)\n if (selector.includes(',') && !selector.includes('[')) {\n const segments = selector.split(',').map((s) => s.trim());\n for (const seg of segments) {\n const subParts = parseSelector(seg);\n parts.types.push(...subParts.types);\n }\n return parts;\n }\n\n // Extract type selectors (.table, .figure, etc)\n // Must start with letter (not number) to avoid matching .8 in [confidence>=0.8]\n const typeMatches = selector.match(/\\.([a-zA-Z][a-zA-Z0-9_]*)/g);\n if (typeMatches) {\n parts.types = typeMatches.map((m) => m.slice(1) as EntityType);\n }\n\n // Extract ID selector (#entity_123)\n const idMatch = selector.match(/#([\\w-]+)/);\n if (idMatch) {\n parts.id = idMatch[1];\n }\n\n // Extract page filter (:page(5) or :pages(1-10))\n const pageMatch = selector.match(/:pages?\\((\\d+)(?:-(\\d+))?\\)/);\n if (pageMatch) {\n if (pageMatch[2]) {\n parts.pageFilter = {\n type: 'range',\n value: [parseInt(pageMatch[1], 10), parseInt(pageMatch[2], 10)],\n };\n } else {\n parts.pageFilter = {\n type: 'single',\n value: parseInt(pageMatch[1], 10),\n };\n }\n }\n\n // Extract confidence filter ([confidence>0.9])\n const confMatch = selector.match(/\\[confidence(>=?|<=?|>|<)(\\d+\\.?\\d*)\\]/);\n if (confMatch) {\n parts.confidenceFilter = {\n op: confMatch[1] as '>' | '<' | '>=' | '<=',\n value: parseFloat(confMatch[2]),\n };\n }\n\n // Extract verification filter ([verified=true], [status=pending])\n const verifyMatch = selector.match(/\\[(?:verified|status)=(\\w+)\\]/);\n if (verifyMatch) {\n const val = verifyMatch[1].toLowerCase();\n if (val === 'true') {\n parts.verificationFilter = 'verified';\n } else if (['pending', 'verified', 'flagged', 'rejected'].includes(val)) {\n parts.verificationFilter = val as typeof parts.verificationFilter;\n }\n }\n\n // Extract text contains filter (:contains(text))\n const containsMatch = selector.match(/:contains\\(([^)]+)\\)/);\n if (containsMatch) {\n parts.textContains = containsMatch[1];\n }\n\n // If no types specified and selector is \"*\", match all\n if (parts.types.length === 0 && selector.includes('*')) {\n parts.types = ['table', 'figure', 'footnote', 'summary', 'signature', 'paragraph'];\n }\n\n return parts;\n}\n\n/**\n * Filter entities based on parsed selector parts.\n */\nexport function filterEntities(entities: Entity[], parts: SelectorParts): Entity[] {\n return entities.filter((entity) => {\n // Type filter - only apply if types are specified\n if (parts.types.length > 0 && !parts.types.includes(entity.type)) {\n return false;\n }\n\n // ID filter\n if (parts.id && entity.id !== parts.id) {\n return false;\n }\n\n // Page filter\n if (parts.pageFilter) {\n if (parts.pageFilter.type === 'single') {\n if (entity.page !== parts.pageFilter.value) return false;\n } else {\n const [start, end] = parts.pageFilter.value as [number, number];\n if (entity.page < start || entity.page > end) return false;\n }\n }\n\n // Confidence filter\n if (parts.confidenceFilter && entity.confidence !== undefined) {\n const { op, value } = parts.confidenceFilter;\n switch (op) {\n case '>':\n if (!(entity.confidence > value)) return false;\n break;\n case '>=':\n if (!(entity.confidence >= value)) return false;\n break;\n case '<':\n if (!(entity.confidence < value)) return false;\n break;\n case '<=':\n if (!(entity.confidence <= value)) return false;\n break;\n }\n }\n\n // Verification filter\n if (parts.verificationFilter && entity.verificationStatus !== parts.verificationFilter) {\n return false;\n }\n\n // Text contains filter\n if (parts.textContains && entity.title) {\n if (!entity.title.toLowerCase().includes(parts.textContains.toLowerCase())) {\n return false;\n }\n }\n\n return true;\n });\n}\n\nexport interface QueryOptions {\n topK?: number;\n minConfidence?: number;\n pageRange?: [number, number];\n sortBy?: 'confidence' | 'page' | 'type';\n}\n\nexport interface QueryStats {\n total: number;\n byType: Record<string, number>;\n byPage: Record<number, number>;\n avgConfidence: number;\n minConfidence: number;\n maxConfidence: number;\n}\n\nexport interface QueryResult {\n entities: Entity[];\n total: number;\n stats: QueryStats;\n}\n\n/**\n * Execute a query against entities.\n */\nexport function executeQuery(\n entities: Entity[],\n selector: string,\n options: QueryOptions = {}\n): QueryResult {\n const parts = parseSelector(selector);\n\n // Apply min confidence if specified\n if (options.minConfidence !== undefined) {\n parts.confidenceFilter = { op: '>=', value: options.minConfidence };\n }\n\n // Apply page range if specified\n if (options.pageRange) {\n parts.pageFilter = { type: 'range', value: options.pageRange };\n }\n\n let results = filterEntities(entities, parts);\n\n // Sort\n if (options.sortBy) {\n results = [...results].sort((a, b) => {\n switch (options.sortBy) {\n case 'confidence':\n return (b.confidence ?? 0) - (a.confidence ?? 0);\n case 'page':\n return a.page - b.page;\n case 'type':\n return a.type.localeCompare(b.type);\n default:\n return 0;\n }\n });\n }\n\n // Calculate stats\n const stats = calculateStats(results);\n\n // Apply top-k limit\n if (options.topK && options.topK > 0) {\n results = results.slice(0, options.topK);\n }\n\n return {\n entities: results,\n total: results.length,\n stats,\n };\n}\n\n/**\n * Calculate aggregate statistics for entities.\n */\nexport function calculateStats(entities: Entity[]): QueryStats {\n const byType: Record<string, number> = {};\n const byPage: Record<number, number> = {};\n let totalConfidence = 0;\n let minConfidence = Infinity;\n let maxConfidence = -Infinity;\n let confidenceCount = 0;\n\n for (const entity of entities) {\n // Count by type\n byType[entity.type] = (byType[entity.type] || 0) + 1;\n\n // Count by page\n byPage[entity.page] = (byPage[entity.page] || 0) + 1;\n\n // Confidence stats\n if (entity.confidence !== undefined) {\n totalConfidence += entity.confidence;\n confidenceCount++;\n if (entity.confidence < minConfidence) minConfidence = entity.confidence;\n if (entity.confidence > maxConfidence) maxConfidence = entity.confidence;\n }\n }\n\n return {\n total: entities.length,\n byType,\n byPage,\n avgConfidence: confidenceCount > 0 ? totalConfidence / confidenceCount : 0,\n minConfidence: minConfidence === Infinity ? 0 : minConfidence,\n maxConfidence: maxConfidence === -Infinity ? 0 : maxConfidence,\n };\n}\n","/**\n * okra find - Entity search with jQuery-like selectors\n *\n * Maps to: Middle panel of review page (entity overlays)\n * Find entities using CSS-like selectors.\n *\n * Usage:\n * okra find <jobId> \".table\" # Find all tables\n * okra find <jobId> \".figure:page(5)\" # Figures on page 5\n * okra find <jobId> \"[confidence>0.9]\" # High confidence entities\n * okra find <jobId> \".table, .figure\" # Tables OR figures\n * okra find <jobId> \"*\" --stats # All entities with stats\n * okra find <jobId> \".table\" --top-k 10 # Top 10 tables\n */\n\nimport type { OkraClient } from '../../client';\nimport type { Entity } from '../types';\nimport { executeQuery, QueryOptions, QueryResult, QueryStats } from '../query-engine';\n\nexport interface FindOptions extends QueryOptions {\n stats?: boolean;\n format?: 'text' | 'json' | 'entities' | 'ids';\n}\n\n/**\n * Find entities matching a selector.\n */\nexport async function find(\n client: OkraClient,\n jobId: string,\n selector: string,\n options: FindOptions = {}\n): Promise<QueryResult> {\n const entitiesData = await client.request<{ entities: Entity[] }>(`/document/${jobId}/nodes`);\n return executeQuery(entitiesData.entities, selector, options);\n}\n\n/**\n * Format find result for output.\n */\nexport function formatFindOutput(\n result: QueryResult,\n format: 'text' | 'json' | 'entities' | 'ids' = 'text',\n showStats = false\n): string {\n if (format === 'json') {\n return JSON.stringify(showStats ? result : result.entities, null, 2);\n }\n\n if (format === 'ids') {\n return result.entities.map((e) => e.id).join('\\n');\n }\n\n if (format === 'entities') {\n return result.entities\n .map((e) => `${e.type}\\t${e.page}\\t${e.id}\\t${e.title || ''}`)\n .join('\\n');\n }\n\n // Text format\n const lines: string[] = [];\n lines.push(`Found ${result.total} entities`);\n lines.push('');\n\n if (showStats) {\n lines.push('Stats:');\n lines.push(` By Type:`);\n for (const [type, count] of Object.entries(result.stats.byType)) {\n lines.push(` ${type}: ${count}`);\n }\n lines.push(` Confidence: avg=${result.stats.avgConfidence.toFixed(2)}, min=${result.stats.minConfidence.toFixed(2)}, max=${result.stats.maxConfidence.toFixed(2)}`);\n lines.push(` Pages: ${Object.keys(result.stats.byPage).length}`);\n lines.push('');\n }\n\n lines.push('Entities:');\n for (const entity of result.entities) {\n const conf = entity.confidence !== undefined ? ` (${(entity.confidence * 100).toFixed(0)}%)` : '';\n const title = entity.title ? ` \"${entity.title.slice(0, 40)}${entity.title.length > 40 ? '...' : ''}\"` : '';\n lines.push(` [p${entity.page}] ${entity.type}${title}${conf}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format stats only.\n */\nexport function formatStats(stats: QueryStats): string {\n const lines: string[] = [];\n lines.push(`Total: ${stats.total}`);\n lines.push('');\n lines.push('By Type:');\n for (const [type, count] of Object.entries(stats.byType)) {\n const pct = ((count / stats.total) * 100).toFixed(1);\n lines.push(` ${type.padEnd(12)} ${count.toString().padStart(4)} (${pct}%)`);\n }\n lines.push('');\n lines.push('By Page:');\n const pageCounts = Object.entries(stats.byPage)\n .sort((a, b) => parseInt(a[0]) - parseInt(b[0]))\n .slice(0, 20); // Show first 20 pages\n for (const [page, count] of pageCounts) {\n lines.push(` p${page.padStart(3)}: ${'█'.repeat(Math.min(count, 40))} ${count}`);\n }\n if (Object.keys(stats.byPage).length > 20) {\n lines.push(` ... and ${Object.keys(stats.byPage).length - 20} more pages`);\n }\n lines.push('');\n lines.push('Confidence:');\n lines.push(` Average: ${(stats.avgConfidence * 100).toFixed(1)}%`);\n lines.push(` Min: ${(stats.minConfidence * 100).toFixed(1)}%`);\n lines.push(` Max: ${(stats.maxConfidence * 100).toFixed(1)}%`);\n\n return lines.join('\\n');\n}\n","/**\n * okra page - Page content operations\n *\n * Maps to: Right panel of review page (markdown editor)\n * Get, edit, and resolve page content.\n *\n * Usage:\n * okra page get <jobId> <pageNum> # Get page markdown\n * okra page get <jobId> <pageNum> --version 2 # Get specific version\n * okra page edit <jobId> <pageNum> <content> # Edit page content\n * okra page resolve <jobId> <pageNum> reviewed # Mark as reviewed\n * okra page versions <jobId> <pageNum> # List versions\n */\n\nimport type { OkraClient } from '../../client';\nimport type { PageContent, PageVersionsResponse } from '../types';\n\nexport type PageContentResponse = PageContent;\n\nexport interface PageGetOptions {\n version?: number;\n format?: 'text' | 'json' | 'markdown';\n}\n\nexport interface PageResolveOptions {\n resolution: string;\n classification?: string;\n reason?: string;\n}\n\n/**\n * Get page content.\n */\nexport async function pageGet(\n client: OkraClient,\n jobId: string,\n pageNum: number,\n options: PageGetOptions = {}\n): Promise<PageContentResponse> {\n if (options.version) {\n return client.request<PageContentResponse>(`/document/${jobId}/pages/${pageNum}/versions/${options.version}`);\n }\n return client.request<PageContentResponse>(`/document/${jobId}/pages/${pageNum}`);\n}\n\n/**\n * Edit page content.\n */\nexport async function pageEdit(\n client: OkraClient,\n jobId: string,\n pageNum: number,\n content: string\n): Promise<{ success: boolean; version: number }> {\n const result = await client.request<{ success: boolean; version: number }>(\n `/document/${jobId}/pages/${pageNum}`,\n {\n method: 'POST',\n body: JSON.stringify({ content }),\n headers: { 'Content-Type': 'application/json' },\n }\n );\n return { success: result.success, version: result.version };\n}\n\n/**\n * Resolve page verification status.\n */\nexport async function pageResolve(\n client: OkraClient,\n jobId: string,\n pageNum: number,\n options: PageResolveOptions\n): Promise<{ success: boolean }> {\n return client.request<{ success: boolean }>(\n `/document/${jobId}/pages/${pageNum}/resolve`,\n {\n method: 'POST',\n body: JSON.stringify(options),\n headers: { 'Content-Type': 'application/json' },\n }\n );\n}\n\n/**\n * List page versions.\n */\nexport async function pageVersions(\n client: OkraClient,\n jobId: string,\n pageNum: number\n): Promise<PageVersionsResponse> {\n return client.request<PageVersionsResponse>(`/document/${jobId}/pages/${pageNum}/versions`);\n}\n\n/**\n * Format page content for output.\n */\nexport function formatPageOutput(\n content: PageContentResponse,\n format: 'text' | 'json' | 'markdown' = 'markdown'\n): string {\n if (format === 'json') {\n return JSON.stringify(content, null, 2);\n }\n\n if (format === 'markdown') {\n return content.content;\n }\n\n // Text format with metadata\n const lines: string[] = [];\n lines.push(`Page ${content.page}`);\n if (content.version) {\n lines.push(`Version: ${content.version}`);\n }\n lines.push(`Length: ${content.content.length} chars`);\n lines.push('');\n lines.push('---');\n lines.push(content.content);\n\n return lines.join('\\n');\n}\n\n/**\n * Format versions list for output.\n */\nexport function formatVersionsOutput(\n versions: PageVersionsResponse,\n format: 'text' | 'json' = 'text'\n): string {\n if (format === 'json') {\n return JSON.stringify(versions, null, 2);\n }\n\n const lines: string[] = [];\n lines.push(`Page ${versions.page} - ${versions.versions.length} versions`);\n lines.push(`Current: v${versions.currentVersion}`);\n lines.push('');\n\n for (const v of versions.versions) {\n const current = v.version === versions.currentVersion ? ' *' : '';\n const date = v.createdAt ? new Date(v.createdAt).toLocaleString() : 'unknown';\n lines.push(` v${v.version}${current} [${v.editSource}] ${date}`);\n if (v.preview) {\n lines.push(` \"${v.preview.slice(0, 60)}${v.preview.length > 60 ? '...' : ''}\"`);\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * okra search - Full-text search command\n *\n * Search page content across all pages.\n *\n * Usage:\n * okra search <jobId> \"revenue\"\n * okra search <jobId> \"total\" --format json\n */\n\nimport type { OkraClient } from '../../client';\nimport type { SearchResponse } from '../types';\n\nexport interface SearchOptions {\n format?: 'text' | 'json';\n limit?: number;\n}\n\n/**\n * Search page content.\n */\nexport async function search(\n client: OkraClient,\n jobId: string,\n query: string\n): Promise<SearchResponse> {\n return client.request<SearchResponse>(`/document/${jobId}/search?q=${encodeURIComponent(query)}`);\n}\n\n/**\n * Format search results for output.\n */\nexport function formatSearchOutput(\n result: SearchResponse,\n format: 'text' | 'json' = 'text'\n): string {\n if (format === 'json') {\n return JSON.stringify(result, null, 2);\n }\n\n const lines: string[] = [];\n lines.push(`Search: \"${result.query}\"`);\n lines.push(`Found ${result.totalMatches} matches in ${result.results.length} pages`);\n lines.push('');\n\n for (const r of result.results) {\n const source = r.matchSource ? ` [${r.matchSource}]` : '';\n lines.push(`p${r.page.toString().padStart(3)} (${r.matchCount} matches)${source}`);\n if (r.snippet) {\n lines.push(` \"${r.snippet.slice(0, 80)}${r.snippet.length > 80 ? '...' : ''}\"`);\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * okra tables - List and filter tables\n *\n * Usage:\n * okra tables <jobId>\n * okra tables <jobId> --page 5\n * okra tables <jobId> --status pending\n * okra tables <jobId> --format json\n */\n\nimport type { OkraClient } from '../../client';\nimport type { TablesResponse, Table } from '../types';\n\nexport interface TablesOptions {\n page?: number;\n status?: 'pending' | 'verified' | 'flagged' | 'rejected';\n format?: 'text' | 'json' | 'markdown';\n}\n\n/**\n * Get tables for a job.\n */\nexport async function tables(\n client: OkraClient,\n jobId: string,\n options: TablesOptions = {}\n): Promise<TablesResponse> {\n const url = options.page\n ? `/document/${jobId}/tables?page=${options.page}`\n : `/document/${jobId}/tables`;\n const result = await client.request<TablesResponse>(url);\n\n // Filter by status if specified\n if (options.status) {\n result.tables = result.tables.filter((t) => t.verificationStatus === options.status);\n }\n\n return result;\n}\n\n/**\n * Format tables for output.\n */\nexport function formatTablesOutput(\n result: TablesResponse,\n format: 'text' | 'json' | 'markdown' = 'text'\n): string {\n if (format === 'json') {\n return JSON.stringify(result, null, 2);\n }\n\n if (format === 'markdown') {\n // Output each table's markdown\n return result.tables.map((t) => {\n return `## Table (p${t.pageNumber})\\n\\n${t.markdown}`;\n }).join('\\n\\n---\\n\\n');\n }\n\n // Text format\n const lines: string[] = [];\n lines.push(`Tables: ${result.tables.length}`);\n lines.push('');\n\n // Group by page\n const byPage = new Map<number, Table[]>();\n for (const t of result.tables) {\n const pageGroup = byPage.get(t.pageNumber) || [];\n pageGroup.push(t);\n byPage.set(t.pageNumber, pageGroup);\n }\n\n for (const [page, pageTables] of [...byPage.entries()].sort((a, b) => a[0] - b[0])) {\n lines.push(`Page ${page}:`);\n for (const t of pageTables) {\n const status = getStatusIcon(t.verificationStatus);\n const conf = t.confidence !== null ? ` (${(t.confidence * 100).toFixed(0)}%)` : '';\n const preview = t.markdown.split('\\n')[0].slice(0, 50);\n lines.push(` ${status} ${t.id}${conf}`);\n lines.push(` ${preview}${t.markdown.length > 50 ? '...' : ''}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction getStatusIcon(status: string): string {\n switch (status) {\n case 'verified':\n return '✓';\n case 'pending':\n return '○';\n case 'flagged':\n return '⚑';\n case 'rejected':\n return '✗';\n default:\n return '?';\n }\n}\n","/**\n * okra history - Verification audit trail\n *\n * Usage:\n * okra history <jobId>\n * okra history <jobId> --limit 20\n * okra history <jobId> --format json\n */\n\nimport type { OkraClient } from '../../client';\nimport type { HistoryResponse } from '../types';\n\nexport interface HistoryOptions {\n limit?: number;\n format?: 'text' | 'json';\n}\n\n/**\n * Get verification history.\n */\nexport async function history(\n client: OkraClient,\n jobId: string,\n options: HistoryOptions = {}\n): Promise<HistoryResponse> {\n const limit = options.limit || 50;\n return client.request<HistoryResponse>(`/document/${jobId}/history?limit=${limit}`);\n}\n\n/**\n * Format history for output.\n */\nexport function formatHistoryOutput(\n result: HistoryResponse,\n format: 'text' | 'json' = 'text'\n): string {\n if (format === 'json') {\n return JSON.stringify(result, null, 2);\n }\n\n const lines: string[] = [];\n lines.push(`History: ${result.history.length} entries`);\n lines.push('');\n\n for (const entry of result.history) {\n const date = new Date(entry.createdAt).toLocaleString();\n const page = entry.pageNum !== null ? ` p${entry.pageNum}` : '';\n const transition = entry.transitionName || `${entry.previousState || '?'} -> ${entry.state}`;\n const by = entry.triggeredByName || entry.triggeredBy || 'system';\n\n lines.push(`[${date}] ${entry.entityType}${page}`);\n lines.push(` ${transition} by ${by}`);\n if (entry.reason) {\n lines.push(` Reason: ${entry.reason}`);\n }\n if (entry.resolution) {\n lines.push(` Resolution: ${entry.resolution}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","/**\n * okra toc - Extract table of contents from a PDF\n *\n * Usage:\n * okra toc <jobId>\n * okra toc <jobId> --max-depth 3\n * okra toc <jobId> --format json\n * okra toc <jobId> --format markdown\n */\n\nimport type { OkraClient } from '../../client';\nimport WebSocket from 'ws';\n\nexport interface TocEntry {\n level: number;\n title: string;\n page: number;\n}\n\nexport interface TocResult {\n file_name: string;\n strategy: string;\n total_entries: number;\n total_pages: number;\n elapsed_ms: number;\n total_elapsed_ms: number;\n toc: TocEntry[];\n _replay?: {\n sessionId: string;\n replayUrl: string;\n };\n}\n\nexport interface TocOptions {\n maxDepth?: number;\n format?: 'text' | 'json' | 'markdown';\n watch?: boolean;\n}\n\n/**\n * Extract table of contents from a document.\n */\nexport async function toc(\n client: OkraClient,\n jobId: string,\n options: TocOptions = {}\n): Promise<TocResult> {\n const params = options.maxDepth ? `?maxDepth=${options.maxDepth}` : '';\n const result = await client.request<TocResult>(`/document/${jobId}/toc${params}`);\n\n // Watch live events if requested\n if (options.watch && result._replay) {\n console.log(`\\n📼 Watching live events for session ${result._replay.sessionId}...\\n`);\n await watchLiveEvents(result._replay.replayUrl);\n }\n\n return result;\n}\n\n/**\n * Connect to WebSocket and watch live TOC extraction events.\n */\nasync function watchLiveEvents(wsUrl: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl);\n let hasSeenEvents = false;\n\n ws.on('open', () => {\n // Request event history (JOIN_SESSION)\n ws.send(JSON.stringify({ type: 'JOIN_SESSION' }));\n });\n\n ws.on('message', (data: WebSocket.Data) => {\n try {\n const event = JSON.parse(data.toString());\n\n // Handle event batch (history replay)\n if (event.type === 'EVENTS_BATCH') {\n for (const evt of event.events) {\n printEvent(evt);\n hasSeenEvents = true;\n }\n }\n // Handle individual events\n else if (event.type && event.type.startsWith('TOC_')) {\n printEvent(event);\n hasSeenEvents = true;\n }\n // Track completion\n else if (event.type === 'TOC_RESPONSE_READY') {\n printEvent(event);\n hasSeenEvents = true;\n // Close after seeing final event\n setTimeout(() => {\n ws.close();\n resolve();\n }, 500);\n }\n } catch (err) {\n console.error('Failed to parse event:', err);\n }\n });\n\n ws.on('error', (error: Error) => {\n console.error('WebSocket error:', error.message);\n reject(error);\n });\n\n ws.on('close', () => {\n if (!hasSeenEvents) {\n console.log('No events received (session may have completed).');\n }\n resolve();\n });\n\n // Timeout after 10 seconds\n setTimeout(() => {\n ws.close();\n resolve();\n }, 10000);\n });\n}\n\n/**\n * Print a single event in a readable format.\n */\nfunction printEvent(event: any): void {\n const timestamp = event.eventTimestamp\n ? new Date(event.eventTimestamp).toISOString().slice(11, 23)\n : '';\n\n const duration = event.cost?.duration_ms\n ? ` (${event.cost.duration_ms}ms)`\n : '';\n\n // Format event type for display\n const eventType = event.type.replace('TOC_', '').replace(/_/g, ' ').toLowerCase();\n\n console.log(`[${timestamp}] ${eventType}${duration}`);\n\n // Print relevant data fields\n if (event.data && Object.keys(event.data).length > 0) {\n const dataStr = formatEventData(event.data);\n if (dataStr) {\n console.log(` ${dataStr}`);\n }\n }\n}\n\n/**\n * Format event data for display.\n */\nfunction formatEventData(data: Record<string, any>): string {\n const relevant: string[] = [];\n\n if (data.fileName) relevant.push(`file: ${data.fileName}`);\n if (data.gcsPath) relevant.push(`path: ${data.gcsPath}`);\n if (data.sizeBytes) relevant.push(`size: ${(data.sizeBytes / 1024 / 1024).toFixed(2)}MB`);\n if (data.sandboxId) relevant.push(`sandbox: ${data.sandboxId.slice(0, 12)}...`);\n if (data.template) relevant.push(`template: ${data.template}`);\n if (data.strategy) relevant.push(`strategy: ${data.strategy}`);\n if (data.totalEntries !== undefined) relevant.push(`entries: ${data.totalEntries}`);\n if (data.exitCode !== undefined) relevant.push(`exit: ${data.exitCode}`);\n if (data.totalElapsedMs) relevant.push(`total: ${data.totalElapsedMs}ms`);\n\n return relevant.join(', ');\n}\n\n/**\n * Format TOC for output.\n */\nexport function formatTocOutput(\n result: TocResult,\n format: 'text' | 'json' | 'markdown' = 'text'\n): string {\n if (format === 'json') {\n return JSON.stringify(result, null, 2);\n }\n\n if (format === 'markdown') {\n const lines: string[] = [];\n lines.push(`# Table of Contents\\n`);\n lines.push(`_${result.file_name}_\\n`);\n lines.push(`Strategy: ${result.strategy} | Pages: ${result.total_pages} | Entries: ${result.total_entries}\\n`);\n\n for (const entry of result.toc) {\n const hashes = '#'.repeat(entry.level + 1);\n lines.push(`${hashes} ${entry.title} (p. ${entry.page})`);\n }\n\n return lines.join('\\n');\n }\n\n // Text format\n const lines: string[] = [];\n lines.push(`File: ${result.file_name}`);\n lines.push(`Strategy: ${result.strategy}`);\n lines.push(`Entries: ${result.total_entries}`);\n lines.push(`Pages: ${result.total_pages}`);\n lines.push(`Elapsed: ${result.elapsed_ms}ms (total: ${result.total_elapsed_ms}ms)`);\n lines.push('');\n\n if (result.total_entries === 0) {\n lines.push('No table of contents found.');\n if (result.strategy === 'none') {\n lines.push('This PDF may not have bookmarks or a printed TOC page.');\n }\n } else {\n lines.push('Table of Contents:');\n lines.push('');\n\n for (const entry of result.toc) {\n const indent = ' '.repeat(entry.level - 1);\n const dots = '.'.repeat(Math.max(1, 60 - indent.length - entry.title.length));\n lines.push(`${indent}${entry.title} ${dots} ${entry.page}`);\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * Configuration management for okra CLI\n *\n * Priority order (highest to lowest):\n * 1. Environment variable: OKRA_API_KEY\n * 2. Project config: .okrarc or .okra.json in current directory\n * 3. Global config: ~/.okra/config.json\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nexport interface OkraConfig {\n apiKey?: string;\n baseUrl?: string;\n}\n\n/**\n * Get the global config directory path.\n * Supports XDG_CONFIG_HOME convention.\n */\nexport function getGlobalConfigDir(): string {\n const xdgConfigHome = process.env.XDG_CONFIG_HOME;\n if (xdgConfigHome) {\n return join(xdgConfigHome, 'okra');\n }\n return join(homedir(), '.okra');\n}\n\n/**\n * Get the global config file path.\n */\nexport function getGlobalConfigPath(): string {\n return join(getGlobalConfigDir(), 'config.json');\n}\n\n/**\n * Read global config from ~/.okra/config.json\n */\nexport function readGlobalConfig(): OkraConfig | null {\n try {\n const configPath = getGlobalConfigPath();\n if (!existsSync(configPath)) {\n return null;\n }\n const content = readFileSync(configPath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n // Silently fail and return null\n return null;\n }\n}\n\n/**\n * Write global config to ~/.okra/config.json\n */\nexport function writeGlobalConfig(config: OkraConfig): void {\n const configDir = getGlobalConfigDir();\n const configPath = getGlobalConfigPath();\n\n // Create directory if it doesn't exist\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');\n}\n\n/**\n * Find and read project config from current directory.\n * Checks for .okrarc and .okra.json\n */\nexport function readProjectConfig(): OkraConfig | null {\n const projectFiles = ['.okrarc', '.okra.json'];\n\n for (const filename of projectFiles) {\n try {\n const path = join(process.cwd(), filename);\n if (existsSync(path)) {\n const content = readFileSync(path, 'utf-8');\n return JSON.parse(content);\n }\n } catch (error) {\n // Continue to next file\n continue;\n }\n }\n\n return null;\n}\n\n/**\n * Get API key from all sources with proper priority.\n *\n * Priority order:\n * 1. Environment variable: OKRA_API_KEY\n * 2. Project config: .okrarc or .okra.json\n * 3. Global config: ~/.okra/config.json\n */\nexport function getApiKey(): string | undefined {\n // 1. Check environment variable\n if (process.env.OKRA_API_KEY) {\n return process.env.OKRA_API_KEY;\n }\n\n // 2. Check project config\n const projectConfig = readProjectConfig();\n if (projectConfig?.apiKey) {\n return projectConfig.apiKey;\n }\n\n // 3. Check global config\n const globalConfig = readGlobalConfig();\n if (globalConfig?.apiKey) {\n return globalConfig.apiKey;\n }\n\n return undefined;\n}\n\n/**\n * Get base URL from all sources with proper priority.\n */\nexport function getBaseUrl(): string | undefined {\n // 1. Check environment variable\n if (process.env.OKRA_BASE_URL) {\n return process.env.OKRA_BASE_URL;\n }\n\n // 2. Check project config\n const projectConfig = readProjectConfig();\n if (projectConfig?.baseUrl) {\n return projectConfig.baseUrl;\n }\n\n // 3. Check global config\n const globalConfig = readGlobalConfig();\n if (globalConfig?.baseUrl) {\n return globalConfig.baseUrl;\n }\n\n return 'https://api.okrapdf.com';\n}\n\n/**\n * Get source of API key for debugging.\n */\nexport function getApiKeySource(): string {\n if (process.env.OKRA_API_KEY) {\n return 'environment variable (OKRA_API_KEY)';\n }\n\n const projectConfig = readProjectConfig();\n if (projectConfig?.apiKey) {\n const files = ['.okrarc', '.okra.json'];\n for (const f of files) {\n if (existsSync(join(process.cwd(), f))) {\n return `project config (${f})`;\n }\n }\n }\n\n const globalConfig = readGlobalConfig();\n if (globalConfig?.apiKey) {\n return `global config (${getGlobalConfigPath()})`;\n }\n\n return 'not found';\n}\n","/**\n * okra auth - Manage authentication\n *\n * Usage:\n * okra auth login # Set API key in global config\n * okra auth status # Show current auth status\n * okra auth logout # Remove API key from global config\n */\n\nimport { readGlobalConfig, writeGlobalConfig, getApiKey, getApiKeySource, getGlobalConfigPath } from '../config';\nimport * as readline from 'readline';\n\nfunction isLikelyApiKey(value: string): boolean {\n return value.startsWith('okra_');\n}\n\nfunction maskApiKey(apiKey: string): string {\n if (apiKey.length <= 8) return apiKey;\n return apiKey.slice(0, 10) + '...' + apiKey.slice(-4);\n}\n\nfunction persistApiKey(apiKey: string): void {\n // Read existing config or create new one\n const config = readGlobalConfig() || {};\n config.apiKey = apiKey;\n\n // Write to global config\n writeGlobalConfig(config);\n}\n\n/**\n * Prompt user for input.\n */\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\n/**\n * Login command - set API key in global config.\n */\nexport async function authLogin(providedApiKey?: string): Promise<void> {\n if (providedApiKey) {\n await authSetKey(providedApiKey);\n return;\n }\n\n console.log('okra CLI Authentication');\n console.log('');\n console.log('Get your API key from: https://app.okrapdf.com/settings');\n console.log('');\n\n const apiKey = await prompt('Enter your API key: ');\n\n if (!apiKey) {\n console.error('Error: API key cannot be empty');\n process.exit(1);\n }\n\n if (!isLikelyApiKey(apiKey)) {\n console.warn('Warning: API key should start with \"okra_\"');\n }\n\n persistApiKey(apiKey);\n\n console.log('');\n console.log(`✓ API key saved to ${getGlobalConfigPath()}`);\n console.log('');\n console.log('You can now use okra commands without setting OKRA_API_KEY');\n}\n\n/**\n * Set API key non-interactively.\n */\nexport async function authSetKey(apiKey: string): Promise<void> {\n const trimmed = apiKey.trim();\n if (!trimmed) {\n console.error('Error: API key cannot be empty');\n process.exit(1);\n }\n\n if (!isLikelyApiKey(trimmed)) {\n console.warn('Warning: API key should start with \"okra_\"');\n }\n\n persistApiKey(trimmed);\n console.log(`✓ API key saved to ${getGlobalConfigPath()}`);\n}\n\n/**\n * Status command - show current auth status.\n */\nexport async function authStatus(): Promise<void> {\n const apiKey = getApiKey();\n const source = getApiKeySource();\n\n console.log('okra CLI Authentication Status');\n console.log('');\n\n if (apiKey) {\n const maskedKey = maskApiKey(apiKey);\n console.log(`✓ Authenticated: ${maskedKey}`);\n console.log(` Source: ${source}`);\n } else {\n console.log('✗ Not authenticated');\n console.log('');\n console.log('Set API key via:');\n console.log(' okra auth login');\n console.log(' export OKRA_API_KEY=\"okra_xxx\"');\n }\n\n console.log('');\n}\n\n/**\n * Print active API key to stdout (for piping).\n */\nexport async function authToken(): Promise<void> {\n const apiKey = getApiKey();\n if (!apiKey) {\n console.error('Error: No API key configured');\n process.exit(1);\n }\n console.log(apiKey);\n}\n\n/**\n * WhoAmI command - currently aliases auth status.\n */\nexport async function authWhoAmI(): Promise<void> {\n await authStatus();\n}\n\n/**\n * Logout command - remove API key from global config.\n */\nexport async function authLogout(): Promise<void> {\n const config = readGlobalConfig();\n\n if (!config || !config.apiKey) {\n console.log('No API key found in global config');\n return;\n }\n\n // Remove API key but keep other config\n delete config.apiKey;\n writeGlobalConfig(config);\n\n console.log(`✓ API key removed from ${getGlobalConfigPath()}`);\n console.log('');\n console.log('Note: Environment variables and project configs are not affected');\n}\n","/**\n * Shared output helpers for agent-friendly CLI.\n *\n * Conventions:\n * - Human text → stderr (progress, messages)\n * - Machine data → stdout (JSON, CSV, doc IDs)\n * - Exit codes: 0 = success, 1 = client/auth error, 2 = server error\n */\n\nimport { writeFileSync } from 'fs';\nimport { OkraRuntimeError } from '../errors';\n\n/** Global flags propagated from program.opts(). */\nexport interface GlobalFlags {\n json?: boolean;\n quiet?: boolean;\n output?: string;\n}\n\n/** Write data to stdout or --output file. */\nexport function writeOutput(data: string, outputPath?: string): void {\n if (outputPath) {\n writeFileSync(outputPath, data);\n process.stderr.write(`Wrote → ${outputPath}\\n`);\n } else {\n process.stdout.write(data + '\\n');\n }\n}\n\n/** Progress message to stderr (suppressed by --quiet). */\nexport function progress(msg: string, quiet?: boolean): void {\n if (!quiet) process.stderr.write(msg + '\\n');\n}\n\n/** Escape a value for CSV — wraps in quotes if it contains comma, quote, or newline. */\nexport function csvEscape(value: string | number | null | undefined): string {\n const str = String(value ?? '');\n if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n}\n\n/** Structured error handler — JSON to stderr when --json, exit with meaningful code. */\nexport function handleError(error: unknown, json?: boolean): never {\n const msg = error instanceof Error ? error.message : String(error);\n const status =\n error instanceof OkraRuntimeError ? error.status : 1;\n\n if (json) {\n process.stderr.write(JSON.stringify({ error: msg, code: status }) + '\\n');\n } else {\n process.stderr.write(`Error: ${msg}\\n`);\n }\n\n process.exit(status >= 500 ? 2 : 1);\n}\n","/**\n * okra upload — Upload a PDF and optionally wait for processing.\n *\n * Usage:\n * okra upload invoice.pdf # local file\n * okra upload https://sec.gov/filing.pdf # URL\n * okra upload invoice.pdf --no-wait # fire-and-forget\n * okra upload invoice.pdf --json # {\"id\":\"doc-xxx\",\"phase\":\"complete\",\"pages\":42}\n */\n\nimport type { OkraClient } from '../../client';\nimport type { GlobalFlags } from '../output';\nimport { progress } from '../output';\n\nexport interface UploadOpts extends GlobalFlags {\n noWait?: boolean;\n}\n\nexport interface UploadResult {\n id: string;\n phase: string;\n pages?: number;\n urls?: {\n full_md: string;\n page_png: string;\n page_md: string;\n completion: string;\n original: string;\n };\n}\n\nexport async function upload(\n client: OkraClient,\n source: string,\n opts: UploadOpts,\n): Promise<UploadResult> {\n progress(`Uploading ${source}…`, opts.quiet);\n\n const session = await client.upload(source);\n const docId = session.id;\n\n progress(`Document ID: ${docId}`, opts.quiet);\n\n if (opts.noWait) {\n return { id: docId, phase: 'uploading' };\n }\n\n progress('Waiting for processing…', opts.quiet);\n\n const status = await client.wait(docId, {\n pollIntervalMs: 2_000,\n });\n\n const base = `https://api.okrapdf.com/v1/documents/${docId}`;\n const urls = {\n full_md: `${base}/full.md`,\n page_png: `${base}/d_shimmer/pg_{N}.png`,\n page_md: `${base}/pg_{N}.md`,\n completion: `https://api.okrapdf.com/document/${docId}/completion`,\n original: `${base}/original.pdf`,\n };\n\n return {\n id: docId,\n phase: status.phase,\n pages: status.pagesTotal,\n urls,\n };\n}\n","/**\n * okra list — List all documents for the authenticated user.\n *\n * Usage:\n * okra list # table format\n * okra list --json # JSON array\n */\n\nimport type { OkraClient } from '../../client';\nimport type { DocumentListItem } from '../../types';\nimport type { GlobalFlags } from '../output';\n\nexport interface ListResult {\n documents: DocumentListItem[];\n}\n\nexport async function listDocuments(\n client: OkraClient,\n _opts: GlobalFlags,\n): Promise<ListResult> {\n const documents = await client.listDocuments();\n return { documents };\n}\n\nexport function formatDocumentList(documents: DocumentListItem[], json?: boolean): string {\n if (json) {\n return JSON.stringify(documents);\n }\n\n if (documents.length === 0) {\n return 'No documents found.';\n }\n\n const lines: string[] = [];\n const header = ['ID', 'File', 'Phase', 'Pages', 'Created'];\n lines.push(header.join('\\t'));\n lines.push(header.map(h => '-'.repeat(h.length)).join('\\t'));\n\n for (const doc of documents) {\n lines.push([\n doc.id,\n doc.file_name ?? '—',\n doc.phase,\n doc.pages_total != null ? String(doc.pages_total) : '—',\n doc.created_at ? new Date(doc.created_at).toLocaleDateString() : '—',\n ].join('\\t'));\n }\n\n return lines.join('\\n');\n}\n","/**\n * okra delete — Delete a document.\n *\n * Usage:\n * okra delete <docId>\n * okra delete <docId> --json\n */\n\nimport type { OkraClient } from '../../client';\nimport type { DeleteDocumentResult } from '../../types';\nimport type { GlobalFlags } from '../output';\n\nexport async function deleteDocument(\n client: OkraClient,\n documentId: string,\n _opts: GlobalFlags,\n): Promise<DeleteDocumentResult> {\n return client.deleteDocument(documentId);\n}\n","/**\n * okra read — Read full document markdown with optional page ranges.\n *\n * Usage:\n * okra read <docId> # full document\n * okra read <docId> --pages 1-5 # pages 1 through 5\n * okra read <docId> --pages 10-15 -j # JSON output\n */\n\nimport type { OkraClient } from '../../client';\nimport type { ReadDocumentResult } from '../../types';\nimport type { GlobalFlags } from '../output';\n\nexport interface ReadOpts extends GlobalFlags {\n pages?: string;\n}\n\nexport async function readDocument(\n client: OkraClient,\n documentId: string,\n opts: ReadOpts,\n): Promise<ReadDocumentResult> {\n return client.read(documentId, { pages: opts.pages });\n}\n","/**\n * okra collection — List collections and run fan-out queries.\n *\n * Usage:\n * okra collection list # table\n * okra collection list --json # JSON array\n * okra collection query mag7-10k \"What was total revenue?\" # table\n * okra collection query mag7-10k \"What was total revenue?\" -o /tmp/rev.csv\n * okra collection query mag7-10k \"Revenue?\" --json # raw JSONL\n */\n\nimport type { OkraClient } from '../../client';\nimport type { CollectionMarkdownExport } from '../../types';\nimport type { GlobalFlags } from '../output';\nimport { progress, csvEscape } from '../output';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface CollectionRow {\n id: string;\n name: string;\n description?: string | null;\n document_count: number;\n}\n\nexport interface QueryResultRow {\n doc_id: string;\n status: string;\n answer: string;\n cost_usd: number;\n duration_ms: number;\n error?: string;\n /** Structured data when query included a schema. */\n data?: Record<string, unknown>;\n}\n\nexport interface QuerySummary {\n completed: number;\n failed: number;\n total_cost_usd: number;\n}\n\nexport interface CollectionListOpts extends GlobalFlags {}\n\nexport interface CollectionQueryOpts extends GlobalFlags {\n /** File path to a JSON Schema, or a pre-parsed schema object. */\n schema?: string | Record<string, unknown>;\n}\n\n// ─── List ────────────────────────────────────────────────────────────────────\n\nexport async function collectionList(\n client: OkraClient,\n _opts: CollectionListOpts,\n): Promise<CollectionRow[]> {\n return client.collections.list() as Promise<CollectionRow[]>;\n}\n\nexport function formatCollectionList(rows: CollectionRow[], json?: boolean): string {\n if (json) return JSON.stringify(rows);\n if (rows.length === 0) return 'No collections found.';\n\n const header = 'ID\\tNAME\\tDOCS';\n const lines = rows.map(\n (r) => `${r.id}\\t${r.name}\\t${r.document_count}`,\n );\n return [header, ...lines].join('\\n');\n}\n\n// ─── Publish / Unpublish ─────────────────────────────────────────────────────\n\nexport async function collectionSetVisibility(\n client: OkraClient,\n nameOrId: string,\n visibility: 'public' | 'private',\n): Promise<{ ok: boolean }> {\n return client.request<{ ok: boolean }>(\n `/v1/collections/${encodeURIComponent(nameOrId)}`,\n {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ visibility }),\n },\n );\n}\n\n// ─── Query ───────────────────────────────────────────────────────────────────\n\n/**\n * Fan-out query using the SDK's streaming NDJSON parser.\n * Called directly from bin.ts.\n */\nexport async function collectionQueryRaw(\n client: OkraClient,\n nameOrId: string,\n question: string,\n opts: CollectionQueryOpts,\n): Promise<{ results: QueryResultRow[]; summary: QuerySummary }> {\n progress(`Querying collection \"${nameOrId}\"…`, opts.quiet);\n\n let schema: Record<string, unknown> | undefined;\n if (opts.schema) {\n if (typeof opts.schema === 'object') {\n schema = opts.schema;\n } else {\n const { readFileSync } = await import('fs');\n const filePath: string = opts.schema;\n schema = JSON.parse(readFileSync(filePath, 'utf8'));\n }\n }\n\n const stream = client.collections.query(nameOrId, question, {\n ...(schema ? { schema } : {}),\n });\n\n const results: QueryResultRow[] = [];\n\n for await (const event of stream) {\n if (event.type === 'start') {\n progress(` ${event.doc_count} documents`, opts.quiet);\n } else if (event.type === 'result') {\n results.push({\n doc_id: event.doc_id,\n status: event.status,\n answer: event.answer ?? '',\n cost_usd: event.usage?.cost_usd ?? 0,\n duration_ms: event.duration_ms ?? 0,\n error: event.error,\n data: event.data as Record<string, unknown> | undefined,\n });\n progress(\n ` ${event.status === 'fulfilled' ? '+' : '!'} ${event.doc_id} (${event.duration_ms}ms)`,\n opts.quiet,\n );\n } else if (event.type === 'done') {\n return {\n results,\n summary: {\n completed: event.completed,\n failed: event.failed,\n total_cost_usd: event.total_cost_usd,\n },\n };\n } else if (event.type === 'error') {\n throw new Error(event.error || 'Collection query error');\n }\n }\n\n // Stream ended without 'done' event — return what we have\n return {\n results,\n summary: { completed: results.length, failed: 0, total_cost_usd: 0 },\n };\n}\n\n// ─── Formatters ──────────────────────────────────────────────────────────────\n\nexport function formatCollectionCsv(results: QueryResultRow[]): string {\n const header = 'doc_id,status,answer,cost_usd,duration_ms';\n const rows = results.map((r) =>\n [\n r.doc_id,\n r.status,\n csvEscape(r.answer),\n r.cost_usd,\n r.duration_ms,\n ].join(','),\n );\n return [header, ...rows].join('\\n');\n}\n\nexport function formatCollectionTable(results: QueryResultRow[]): string {\n if (results.length === 0) return 'No results.';\n const header = 'DOC_ID\\tSTATUS\\tANSWER\\tCOST\\tDUR_MS';\n const rows = results.map(\n (r) =>\n `${r.doc_id}\\t${r.status}\\t${r.answer.slice(0, 80)}${r.answer.length > 80 ? '…' : ''}\\t$${r.cost_usd.toFixed(4)}\\t${r.duration_ms}`,\n );\n return [header, ...rows].join('\\n');\n}\n\nexport function formatQueryJsonl(results: QueryResultRow[]): string {\n return results.map((r) => JSON.stringify(r)).join('\\n');\n}\n\n// ─── Structured Extract Formatters ───────────────────────────────────────────\n\n/**\n * Collect all unique data keys across results for column headers.\n * Preserves insertion order from the first result that has each key.\n */\nfunction collectDataKeys(results: QueryResultRow[]): string[] {\n const seen = new Set<string>();\n const keys: string[] = [];\n for (const r of results) {\n if (!r.data) continue;\n for (const k of Object.keys(r.data)) {\n if (!seen.has(k)) {\n seen.add(k);\n keys.push(k);\n }\n }\n }\n return keys;\n}\n\n/** Format structured extraction results as CSV with flattened data columns. */\nexport function formatExtractCsv(results: QueryResultRow[]): string {\n const dataKeys = collectDataKeys(results);\n const header = ['doc_id', ...dataKeys, 'cost_usd', 'duration_ms'].join(',');\n const rows = results\n .filter((r) => r.status === 'fulfilled')\n .map((r) => {\n const dataCols = dataKeys.map((k) => {\n const v = r.data?.[k];\n if (v == null) return '';\n if (typeof v === 'string') return csvEscape(v);\n return String(v);\n });\n return [r.doc_id, ...dataCols, r.cost_usd, r.duration_ms].join(',');\n });\n return [header, ...rows].join('\\n');\n}\n\n/** Format structured extraction results as a human-readable table. */\nexport function formatExtractTable(results: QueryResultRow[]): string {\n const fulfilled = results.filter((r) => r.status === 'fulfilled' && r.data);\n if (fulfilled.length === 0) return 'No results with structured data.';\n\n const dataKeys = collectDataKeys(fulfilled);\n // Build column widths\n const colHeaders = dataKeys.map((k) => k.toUpperCase());\n const colWidths = colHeaders.map((h, i) => {\n const key = dataKeys[i];\n const maxData = fulfilled.reduce((max, r) => {\n const v = r.data?.[key];\n const len = v == null ? 0 : String(v).length;\n return Math.max(max, len);\n }, 0);\n return Math.max(h.length, Math.min(maxData, 40));\n });\n\n const pad = (s: string, w: number) => s.length > w ? s.slice(0, w - 1) + '\\u2026' : s.padEnd(w);\n\n const headerLine = colHeaders.map((h, i) => pad(h, colWidths[i])).join(' ');\n const rows = fulfilled.map((r) =>\n dataKeys.map((k, i) => {\n const v = r.data?.[k];\n const s = v == null ? '' : String(v);\n return pad(s, colWidths[i]);\n }).join(' '),\n );\n return [headerLine, ...rows].join('\\n');\n}\n\n/** Format structured extraction results as JSON array. */\nexport function formatExtractJson(results: QueryResultRow[]): string {\n const items = results\n .filter((r) => r.status === 'fulfilled')\n .map((r) => ({ doc_id: r.doc_id, data: r.data ?? {} }));\n return JSON.stringify(items, null, 2);\n}\n\n// ─── Export ─────────────────────────────────────────────────────────────────\n\nexport interface CollectionExportOpts extends GlobalFlags {\n flat?: boolean;\n zip?: boolean;\n}\n\nexport async function collectionExport(\n client: OkraClient,\n nameOrId: string,\n opts: CollectionExportOpts & { zip: true },\n): Promise<Uint8Array>;\nexport async function collectionExport(\n client: OkraClient,\n nameOrId: string,\n opts: CollectionExportOpts & { zip?: false | undefined },\n): Promise<CollectionMarkdownExport>;\nexport async function collectionExport(\n client: OkraClient,\n nameOrId: string,\n opts: CollectionExportOpts,\n): Promise<CollectionMarkdownExport | Uint8Array> {\n if (opts.zip) {\n progress(`Exporting markdown zip from \"${nameOrId}\"…`, opts.quiet);\n const bytes = await client.collections.exportMarkdown(nameOrId, { format: 'zip' }) as Uint8Array;\n progress(` ${bytes.byteLength} bytes`, opts.quiet);\n return bytes;\n }\n\n progress(`Exporting markdown from \"${nameOrId}\"…`, opts.quiet);\n const result = await client.collections.exportMarkdown(nameOrId) as CollectionMarkdownExport;\n progress(\n ` ${result.totalDocuments} documents, ${result.totalPages} pages`,\n opts.quiet,\n );\n return result;\n}\n\nexport function formatCollectionExportFlat(result: CollectionMarkdownExport): string {\n const parts: string[] = [];\n for (const doc of result.documents) {\n parts.push(`# ${doc.fileName || doc.docId}`);\n parts.push('');\n for (const page of doc.pages) {\n parts.push(page.content);\n parts.push('');\n }\n parts.push('===');\n parts.push('');\n }\n return parts.join('\\n');\n}\n"],"mappings":"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","names":["getStatusIcon","lines","writeFileSync","writeFileSync","readFileSync"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/url.ts"],"sourcesContent":["import type { DeliveryTransform, DocUrlOptions, UrlBuilderOptions } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.okrapdf.com';\n\n// ── Delivery transform key ordering (matches @okrapdf/schemas DELIVERY_KEYS) ──\n\nconst DELIVERY_KEY_ORDER = [\n 'w', 'h', 'dpr', 'q', 'f', 'md', 'c', 'g', 'zm',\n 'bl', 'sh', 'br', 'co', 'sa', 'r', 'fl', 'bg', 'anim', 'seg',\n] as const;\n\nconst VALID_FORMATS = new Set(['auto', 'webp', 'avif', 'jpeg', 'png']);\nconst VALID_CROPS = new Set(['scale-down', 'contain', 'cover', 'crop', 'pad', 'squeeze']);\nconst VALID_GRAVITIES = new Set(['auto', 'face', 'left', 'right', 'top', 'bottom', 'center']);\nconst VALID_FLIPS = new Set(['h', 'v', 'hv']);\nconst VALID_ROTATIONS = new Set([0, 90, 180, 270]);\n\nfunction validateTransform(t: DeliveryTransform): void {\n if (t.w !== undefined && (!Number.isInteger(t.w) || t.w <= 0)) throw new Error('Invalid delivery transform: w must be a positive integer');\n if (t.h !== undefined && (!Number.isInteger(t.h) || t.h <= 0)) throw new Error('Invalid delivery transform: h must be a positive integer');\n if (t.dpr !== undefined && t.dpr <= 0) throw new Error('Invalid delivery transform: dpr must be positive');\n if (t.q !== undefined && (!Number.isInteger(t.q) || t.q < 1 || t.q > 100)) throw new Error('Invalid delivery transform: q must be 1-100');\n if (t.f !== undefined && !VALID_FORMATS.has(t.f)) throw new Error(`Invalid delivery transform: f must be one of ${[...VALID_FORMATS].join(', ')}`);\n if (t.c !== undefined && !VALID_CROPS.has(t.c)) throw new Error(`Invalid delivery transform: c must be one of ${[...VALID_CROPS].join(', ')}`);\n if (t.g !== undefined && !VALID_GRAVITIES.has(t.g)) throw new Error(`Invalid delivery transform: g must be one of ${[...VALID_GRAVITIES].join(', ')}`);\n if (t.zm !== undefined && (t.zm < 0 || t.zm > 1)) throw new Error('Invalid delivery transform: zm must be 0-1');\n if (t.bl !== undefined && (!Number.isInteger(t.bl) || t.bl < 1 || t.bl > 250)) throw new Error('Invalid delivery transform: bl must be 1-250');\n if (t.sh !== undefined && (t.sh < 0 || t.sh > 10)) throw new Error('Invalid delivery transform: sh must be 0-10');\n if (t.r !== undefined && !VALID_ROTATIONS.has(t.r)) throw new Error('Invalid delivery transform: r must be 0, 90, 180, or 270');\n if (t.fl !== undefined && !VALID_FLIPS.has(t.fl)) throw new Error(`Invalid delivery transform: fl must be one of ${[...VALID_FLIPS].join(', ')}`);\n}\n\n/** Serialize delivery transform to a single URL segment: \"w_200,h_300,q_80\" */\nfunction serializeTransform(t: DeliveryTransform): string {\n const tokens: string[] = [];\n const rec = t as Record<string, unknown>;\n for (const k of DELIVERY_KEY_ORDER) {\n if (rec[k] !== undefined) tokens.push(`${k}_${rec[k]}`);\n }\n return tokens.join(',');\n}\n\n// ── Modifier segment builder (inlined from @okrapdf/schemas/document-url) ──\n\ninterface Modifiers {\n variant?: string;\n default?: string;\n output?: string;\n transform?: DeliveryTransform;\n}\n\nfunction buildModifierSegments(mods: Modifiers): string[] {\n const parts: string[] = [];\n if (mods.variant) parts.push(`t_${mods.variant}`);\n if (mods.default) parts.push(`d_${mods.default}`);\n if (mods.output) parts.push(`o_${mods.output}`);\n if (mods.transform) {\n const seg = serializeTransform(mods.transform);\n if (seg) parts.push(seg);\n }\n return parts;\n}\n\n// ── Interfaces ──────────────────────────────────────────────────────────────\n\ninterface PgPage {\n png: (opts?: { placeholder?: string; transform?: DeliveryTransform }) => string;\n md: (opts?: { transform?: DeliveryTransform }) => string;\n json: (opts?: { transform?: DeliveryTransform }) => string;\n}\n\ninterface PgPageRange {\n md: (opts?: { transform?: DeliveryTransform }) => string;\n json: (opts?: { transform?: DeliveryTransform }) => string;\n}\n\ninterface PgProxy {\n [index: number]: PgPage;\n range: (start: number, end: number) => PgPageRange;\n list: (...pages: number[]) => PgPageRange;\n}\n\ninterface DocumentUrl {\n /** Base document URL */\n url: (opts?: UrlBuilderOptions) => string;\n /** Thumbnail image URL (pg_1.png) */\n thumbnail: { url: (opts?: { transform?: DeliveryTransform }) => string };\n /** Full document markdown */\n full: { md: () => string };\n /** Original PDF download (auth required) */\n download: () => string;\n /** Page access: d.pg[1].png(), d.pg[1].md(), d.pg[1].json() */\n pg: PgProxy;\n /** Entity-level access */\n entities: EntitiesProxy;\n /** Output schema — returns a new DocumentUrl scoped to o_{schema} */\n output: (schema: string) => DocumentUrl;\n}\n\ninterface EntitiesProxy {\n tables: EntityCollectionProxy;\n figures: EntityCollectionProxy;\n}\n\ninterface EntityCollectionProxy {\n [index: number]: {\n url: (opts?: { format?: 'json' | 'csv' | 'html' }) => string;\n };\n url: (opts?: UrlBuilderOptions) => string;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nconst FORMAT_TO_EXT: Record<NonNullable<UrlBuilderOptions['format']>, string> = {\n json: 'json',\n csv: 'csv',\n html: 'html',\n markdown: 'md',\n png: 'png',\n};\n\nfunction slugifyFileStem(fileName: string): string {\n const leaf = fileName.split('/').pop() || fileName;\n const noExt = leaf.replace(/\\.[A-Za-z0-9]{1,8}$/, '');\n const slug = noExt\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 48);\n return slug || 'document';\n}\n\nfunction extensionFor(format: string | undefined, fallback: string): string {\n if (!format) return fallback;\n const lower = format.toLowerCase();\n if (lower === 'markdown') return 'md';\n return FORMAT_TO_EXT[lower as keyof typeof FORMAT_TO_EXT] || lower;\n}\n\n/**\n * Build-time URL builder — Cloudinary for documents.\n *\n * ```tsx\n * import { doc } from 'okrapdf';\n * const d = doc('doc_7fK3x');\n * <Image src={d.thumbnail.url()} />\n * <a href={d.entities.tables[0].url({ format: 'csv' })}>CSV</a>\n * ```\n */\nexport function doc(\n documentId: string,\n baseUrlOrOptions: string | DocUrlOptions = DEFAULT_BASE_URL,\n maybeOptions: DocUrlOptions = {},\n): DocumentUrl {\n const baseUrl = typeof baseUrlOrOptions === 'string' ? baseUrlOrOptions : DEFAULT_BASE_URL;\n const options = typeof baseUrlOrOptions === 'string' ? maybeOptions : baseUrlOrOptions;\n\n const base = baseUrl.replace(/\\/+$/, '');\n const defaultProvider = options.provider;\n const defaultImage = options.placeholder || options.defaultImage;\n const defaultOutput = options.output;\n const docBase = `${base}/v1/documents/${encodeURIComponent(documentId)}`;\n const artifactBase = options.fileName\n ? slugifyFileStem(options.fileName)\n : 'document';\n\n const formatParams = (opts?: UrlBuilderOptions) => {\n const params = new URLSearchParams();\n if (opts?.format) params.set('format', opts.format);\n if (opts?.include?.length) params.set('include', opts.include.join(','));\n const qs = params.toString();\n return qs ? `?${qs}` : '';\n };\n\n /** Single path for all modifier → URL serialization. */\n const buildUrl = (\n resource: string,\n opts?: {\n placeholder?: string;\n provider?: string;\n output?: string;\n transform?: DeliveryTransform;\n artifact?: { stem: string; ext: string };\n qs?: string;\n },\n ): string => {\n const mods: Modifiers = {};\n\n const prov = opts?.provider || defaultProvider;\n if (prov) mods.variant = prov;\n\n const ph = opts?.placeholder || defaultImage;\n if (ph) mods.default = ph;\n\n const out = opts?.output || defaultOutput;\n if (out) mods.output = out;\n\n if (opts?.transform) {\n validateTransform(opts.transform);\n mods.transform = opts.transform;\n }\n\n const segs = buildModifierSegments(mods);\n const modPath = segs.length > 0 ? `/${segs.join('/')}` : '';\n const resourcePart = resource ? `/${resource}` : '';\n const artifactSuffix = opts?.artifact ? `/${opts.artifact.stem}.${opts.artifact.ext}` : '';\n const qs = opts?.qs || '';\n return `${docBase}${modPath}${resourcePart}${artifactSuffix}${qs}`;\n };\n\n const makeEntityCollection = (type: string): EntityCollectionProxy => {\n return new Proxy({} as EntityCollectionProxy, {\n get(_target, prop) {\n if (prop === 'url') {\n return (opts?: UrlBuilderOptions) =>\n buildUrl(`entities/${type}`, {\n provider: opts?.provider,\n transform: opts?.transform,\n artifact: { stem: artifactBase, ext: extensionFor(opts?.format, 'json') },\n qs: formatParams(opts),\n });\n }\n const index = typeof prop === 'string' ? parseInt(prop, 10) : NaN;\n if (!isNaN(index)) {\n return {\n url: (opts?: { format?: string; provider?: string }) =>\n buildUrl(`entities/${type}/${index}`, {\n provider: opts?.provider,\n artifact: { stem: artifactBase, ext: extensionFor(opts?.format, 'json') },\n qs: opts?.format ? `?format=${opts.format}` : '',\n }),\n };\n }\n return undefined;\n },\n });\n };\n\n const makePgPage = (pageNum: number): PgPage => ({\n png: (opts?: { placeholder?: string; transform?: DeliveryTransform }) =>\n buildUrl(`pg_${pageNum}.png`, { placeholder: opts?.placeholder, transform: opts?.transform }),\n md: (opts?: { transform?: DeliveryTransform }) =>\n buildUrl(`pg_${pageNum}.md`, { transform: opts?.transform }),\n json: (opts?: { transform?: DeliveryTransform }) =>\n buildUrl(`pg_${pageNum}.json`, { transform: opts?.transform }),\n });\n\n const makePgRange = (segment: string): PgPageRange => ({\n md: (opts?: { transform?: DeliveryTransform }) =>\n buildUrl(`pg_${segment}.md`, { transform: opts?.transform }),\n json: (opts?: { transform?: DeliveryTransform }) =>\n buildUrl(`pg_${segment}.json`, { transform: opts?.transform }),\n });\n\n const pg: PgProxy = new Proxy({} as PgProxy, {\n get(_target, prop) {\n if (prop === 'range') {\n return (start: number, end: number) => makePgRange(`${start}-${end}`);\n }\n if (prop === 'list') {\n return (...pages: number[]) => makePgRange(pages.join(','));\n }\n const pageNum = typeof prop === 'string' ? parseInt(prop, 10) : NaN;\n if (!isNaN(pageNum)) {\n return makePgPage(pageNum);\n }\n return undefined;\n },\n });\n\n const buildDocumentUrl = (outputOverride?: string): DocumentUrl => ({\n url: (opts?: UrlBuilderOptions) =>\n buildUrl('', {\n provider: opts?.provider,\n output: outputOverride,\n transform: opts?.transform,\n artifact: { stem: artifactBase, ext: extensionFor(opts?.format, 'json') },\n qs: formatParams(opts),\n }),\n thumbnail: {\n url: (opts?: { transform?: DeliveryTransform }) =>\n buildUrl('pg_1.png', { transform: opts?.transform }),\n },\n full: {\n md: () => `${docBase}/full.md`,\n },\n download: () => `${base}/document/${encodeURIComponent(documentId)}/download`,\n pg,\n entities: {\n tables: makeEntityCollection('tables'),\n figures: makeEntityCollection('figures'),\n },\n output: (schema: string) => {\n // Return a new builder with the output schema baked in.\n // We create a new doc() call with the output option set.\n return doc(documentId, baseUrl, { ...options, output: schema });\n },\n });\n\n return buildDocumentUrl();\n}\n"],"mappings":"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","names":[]}
|
|
File without changes
|