@okrapdf/runtime 0.1.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 ADDED
@@ -0,0 +1,34 @@
1
+ # @okrapdf/runtime
2
+
3
+ Minimal OkraPDF runtime client:
4
+
5
+ - `upload()`
6
+ - `status()`
7
+ - `wait()`
8
+ - `structuredOutput()`
9
+
10
+ ```ts
11
+ import { OkraPDF } from '@okrapdf/runtime';
12
+ import { z } from 'zod';
13
+
14
+ const okra = new OkraPDF({
15
+ baseUrl: 'https://agent-session.steventsao.workers.dev',
16
+ apiKey: process.env.OKRA_API_KEY,
17
+ });
18
+
19
+ const doc = await okra.upload('https://example.com/invoice.pdf');
20
+ await okra.wait(doc.id);
21
+
22
+ const InvoiceSchema = z.object({
23
+ vendor: z.string(),
24
+ invoiceNumber: z.string(),
25
+ total: z.number(),
26
+ });
27
+
28
+ const result = await okra.structuredOutput(doc.id, InvoiceSchema, {
29
+ query: 'Extract invoice fields',
30
+ });
31
+
32
+ console.log(result.data.vendor);
33
+ ```
34
+
@@ -0,0 +1,17 @@
1
+ import type { DocumentStatus, OkraPDFOptions, StructuredOutputOptions, StructuredOutputResult, StructuredSchema, UploadOptions, UploadResult, WaitOptions } from './types.js';
2
+ export declare class OkraPDF {
3
+ private readonly baseUrl;
4
+ private readonly apiKey?;
5
+ private readonly sharedSecret?;
6
+ private readonly fetchImpl;
7
+ constructor(options: OkraPDFOptions);
8
+ upload(input: string | ArrayBuffer | Uint8Array, options?: UploadOptions): Promise<UploadResult>;
9
+ status(documentId: string, signal?: AbortSignal): Promise<DocumentStatus>;
10
+ wait(documentId: string, options?: WaitOptions): Promise<DocumentStatus>;
11
+ structuredOutput<T>(documentId: string, schema: StructuredSchema<T>, options: StructuredOutputOptions): Promise<StructuredOutputResult<T>>;
12
+ structuredOutputMany<T>(documentIds: string[], schema: StructuredSchema<T>, options: StructuredOutputOptions): Promise<Array<StructuredOutputResult<T>>>;
13
+ private authHeaders;
14
+ private requestJson;
15
+ private parseBody;
16
+ }
17
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EAEd,cAAc,EAGd,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AA6EpB,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;gBAExC,OAAO,EAAE,cAAc;IAe7B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IAkDpG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IAOzE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IAmC5E,gBAAgB,CAAC,CAAC,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAC3B,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAoC/B,oBAAoB,CAAC,CAAC,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAC3B,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;IAI5C,OAAO,CAAC,WAAW;YAML,WAAW;IA4CzB,OAAO,CAAC,SAAS;CASlB"}
package/dist/client.js ADDED
@@ -0,0 +1,212 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { basename } from 'node:path';
3
+ import { z } from 'zod';
4
+ import { OkraRuntimeError, StructuredOutputError } from './errors.js';
5
+ const DEFAULT_BASE_URL = 'https://api.okrapdf.com';
6
+ const DEFAULT_WAIT_TIMEOUT_MS = 5 * 60_000;
7
+ const DEFAULT_WAIT_POLL_MS = 1_500;
8
+ const COMPLETE_PHASES = new Set(['complete', 'awaiting_review']);
9
+ const TERMINAL_ERROR_PHASES = new Set(['error']);
10
+ const STRUCTURED_CODES = new Set([
11
+ 'SCHEMA_VALIDATION_FAILED',
12
+ 'EXTRACTION_FAILED',
13
+ 'TIMEOUT',
14
+ 'DOCUMENT_NOT_FOUND',
15
+ ]);
16
+ function sleep(ms) {
17
+ return new Promise((resolve) => setTimeout(resolve, ms));
18
+ }
19
+ function isHttpUrl(value) {
20
+ return /^https?:\/\//i.test(value);
21
+ }
22
+ function normalizeBaseUrl(baseUrl) {
23
+ return baseUrl.replace(/\/+$/, '');
24
+ }
25
+ function makeDocId() {
26
+ if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
27
+ return `ocr-${crypto.randomUUID().replace(/-/g, '').slice(0, 20)}`;
28
+ }
29
+ const rand = Math.random().toString(36).slice(2, 22);
30
+ return `ocr-${rand}`;
31
+ }
32
+ function toUint8Array(input) {
33
+ if (input instanceof Uint8Array)
34
+ return input;
35
+ return new Uint8Array(input);
36
+ }
37
+ function normalizeSchema(schema) {
38
+ const maybeZod = schema;
39
+ const hasSafeParse = typeof maybeZod.safeParse === 'function';
40
+ if (hasSafeParse) {
41
+ return {
42
+ jsonSchema: z.toJSONSchema(maybeZod, { target: 'draft-2020-12' }),
43
+ parser: maybeZod,
44
+ };
45
+ }
46
+ return { jsonSchema: schema };
47
+ }
48
+ function isStructuredCode(code) {
49
+ return !!code && STRUCTURED_CODES.has(code);
50
+ }
51
+ export class OkraPDF {
52
+ baseUrl;
53
+ apiKey;
54
+ sharedSecret;
55
+ fetchImpl;
56
+ constructor(options) {
57
+ this.baseUrl = normalizeBaseUrl(options.baseUrl || DEFAULT_BASE_URL);
58
+ this.apiKey = options.apiKey;
59
+ this.sharedSecret = options.sharedSecret;
60
+ this.fetchImpl = options.fetch || globalThis.fetch;
61
+ if (!this.apiKey && !this.sharedSecret) {
62
+ throw new OkraRuntimeError('UNAUTHORIZED', 'OkraPDF requires either apiKey or sharedSecret', 401);
63
+ }
64
+ }
65
+ async upload(input, options = {}) {
66
+ const documentId = options.documentId || makeDocId();
67
+ const path = `/document/${encodeURIComponent(documentId)}`;
68
+ if (typeof input === 'string' && isHttpUrl(input)) {
69
+ const response = await this.requestJson(`${path}/upload-url`, {
70
+ method: 'POST',
71
+ headers: { 'Content-Type': 'application/json' },
72
+ body: JSON.stringify({
73
+ url: input,
74
+ capabilities: options.capabilities,
75
+ }),
76
+ });
77
+ return {
78
+ id: documentId,
79
+ url: `${this.baseUrl}${path}`,
80
+ status: response.phase || 'uploading',
81
+ };
82
+ }
83
+ let bytes;
84
+ let fileName = options.fileName || 'document.pdf';
85
+ if (typeof input === 'string') {
86
+ bytes = await readFile(input);
87
+ if (!options.fileName)
88
+ fileName = basename(input);
89
+ }
90
+ else {
91
+ bytes = toUint8Array(input);
92
+ }
93
+ const headers = {
94
+ 'Content-Type': 'application/pdf',
95
+ 'X-File-Name': fileName,
96
+ };
97
+ if (options.capabilities) {
98
+ headers['X-Capabilities'] = JSON.stringify(options.capabilities);
99
+ }
100
+ const response = await this.requestJson(`${path}/upload`, {
101
+ method: 'POST',
102
+ headers,
103
+ body: bytes,
104
+ });
105
+ return {
106
+ id: documentId,
107
+ url: `${this.baseUrl}${path}`,
108
+ status: response.phase || 'uploading',
109
+ };
110
+ }
111
+ async status(documentId, signal) {
112
+ return this.requestJson(`/document/${encodeURIComponent(documentId)}/status`, { method: 'GET', signal });
113
+ }
114
+ async wait(documentId, options = {}) {
115
+ const startedAt = Date.now();
116
+ const timeoutMs = options.timeoutMs ?? DEFAULT_WAIT_TIMEOUT_MS;
117
+ const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_WAIT_POLL_MS;
118
+ while (true) {
119
+ if (options.signal?.aborted) {
120
+ throw new OkraRuntimeError('TIMEOUT', 'Wait aborted', 499);
121
+ }
122
+ const current = await this.status(documentId, options.signal);
123
+ if (COMPLETE_PHASES.has(current.phase))
124
+ return current;
125
+ if (TERMINAL_ERROR_PHASES.has(current.phase)) {
126
+ throw new OkraRuntimeError('EXTRACTION_FAILED', `Document entered terminal error phase (${current.phase})`, 500, current);
127
+ }
128
+ const elapsed = Date.now() - startedAt;
129
+ if (elapsed >= timeoutMs) {
130
+ throw new OkraRuntimeError('TIMEOUT', `Timed out waiting for document ${documentId} after ${timeoutMs}ms`, 504, current);
131
+ }
132
+ await sleep(pollIntervalMs);
133
+ }
134
+ }
135
+ async structuredOutput(documentId, schema, options) {
136
+ if (!options?.query || options.query.trim() === '') {
137
+ throw new OkraRuntimeError('INVALID_REQUEST', 'structuredOutput requires a non-empty query', 400);
138
+ }
139
+ const normalized = normalizeSchema(schema);
140
+ const body = await this.requestJson(`/document/${encodeURIComponent(documentId)}/structured-output`, {
141
+ method: 'POST',
142
+ headers: { 'Content-Type': 'application/json' },
143
+ body: JSON.stringify({
144
+ query: options.query,
145
+ schema: normalized.jsonSchema,
146
+ ...(options.timeoutMs ? { timeoutMs: options.timeoutMs } : {}),
147
+ }),
148
+ signal: options.signal,
149
+ });
150
+ if (normalized.parser) {
151
+ const parsed = normalized.parser.safeParse(body.data);
152
+ if (!parsed.success) {
153
+ throw new StructuredOutputError('SCHEMA_VALIDATION_FAILED', 'Client-side schema validation failed for structured output response', 422, parsed.error.issues);
154
+ }
155
+ return { data: parsed.data, meta: body.meta };
156
+ }
157
+ return body;
158
+ }
159
+ async structuredOutputMany(documentIds, schema, options) {
160
+ return Promise.all(documentIds.map((id) => this.structuredOutput(id, schema, options)));
161
+ }
162
+ authHeaders() {
163
+ if (this.apiKey)
164
+ return { Authorization: `Bearer ${this.apiKey}` };
165
+ if (this.sharedSecret)
166
+ return { 'x-document-agent-secret': this.sharedSecret };
167
+ return {};
168
+ }
169
+ async requestJson(path, init) {
170
+ const headers = new Headers(init.headers);
171
+ for (const [key, value] of Object.entries(this.authHeaders())) {
172
+ if (!headers.has(key))
173
+ headers.set(key, value);
174
+ }
175
+ let response;
176
+ try {
177
+ response = await this.fetchImpl(`${this.baseUrl}${path}`, { ...init, headers });
178
+ }
179
+ catch (err) {
180
+ throw new OkraRuntimeError('HTTP_ERROR', err instanceof Error ? err.message : String(err), 502);
181
+ }
182
+ const text = await response.text();
183
+ const parsed = this.parseBody(text);
184
+ if (!response.ok) {
185
+ const envelope = parsed;
186
+ const code = envelope?.code;
187
+ const message = envelope?.message || envelope?.error || `Request failed with status ${response.status}`;
188
+ const details = envelope?.details ?? parsed ?? text;
189
+ if (isStructuredCode(code)) {
190
+ throw new StructuredOutputError(code, message, response.status, details);
191
+ }
192
+ const runtimeCode = response.status === 401 ? 'UNAUTHORIZED' : 'HTTP_ERROR';
193
+ throw new OkraRuntimeError(runtimeCode, message, response.status, details);
194
+ }
195
+ if (parsed === null) {
196
+ throw new OkraRuntimeError('INVALID_RESPONSE', `Expected JSON response for ${path}`, response.status, text);
197
+ }
198
+ return parsed;
199
+ }
200
+ parseBody(text) {
201
+ const trimmed = text.trim();
202
+ if (!trimmed)
203
+ return null;
204
+ try {
205
+ return JSON.parse(trimmed);
206
+ }
207
+ catch {
208
+ return null;
209
+ }
210
+ }
211
+ }
212
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { RuntimeErrorCode, StructuredOutputErrorCode } from './types.js';
2
+ export declare class OkraRuntimeError extends Error {
3
+ readonly code: RuntimeErrorCode;
4
+ readonly status: number;
5
+ readonly details?: unknown;
6
+ constructor(code: RuntimeErrorCode, message: string, status?: number, details?: unknown);
7
+ }
8
+ export declare class StructuredOutputError extends OkraRuntimeError {
9
+ readonly code: StructuredOutputErrorCode;
10
+ constructor(code: StructuredOutputErrorCode, message: string, status: number, details?: unknown);
11
+ }
12
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE9E,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;gBAEf,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAOrF;AAED,qBAAa,qBAAsB,SAAQ,gBAAgB;IACzD,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;gBAE7B,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAKhG"}
package/dist/errors.js ADDED
@@ -0,0 +1,21 @@
1
+ export class OkraRuntimeError extends Error {
2
+ code;
3
+ status;
4
+ details;
5
+ constructor(code, message, status = 500, details) {
6
+ super(message);
7
+ this.name = 'OkraRuntimeError';
8
+ this.code = code;
9
+ this.status = status;
10
+ this.details = details;
11
+ }
12
+ }
13
+ export class StructuredOutputError extends OkraRuntimeError {
14
+ code;
15
+ constructor(code, message, status, details) {
16
+ super(code, message, status, details);
17
+ this.name = 'StructuredOutputError';
18
+ this.code = code;
19
+ }
20
+ }
21
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,CAAmB;IACvB,MAAM,CAAS;IACf,OAAO,CAAW;IAE3B,YAAY,IAAsB,EAAE,OAAe,EAAE,MAAM,GAAG,GAAG,EAAE,OAAiB;QAClF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,gBAAgB;IAChD,IAAI,CAA4B;IAEzC,YAAY,IAA+B,EAAE,OAAe,EAAE,MAAc,EAAE,OAAiB;QAC7F,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export { OkraPDF } from './client.js';
2
+ export { OkraRuntimeError, StructuredOutputError } from './errors.js';
3
+ export type { JsonSchema, RuntimeErrorCode, StructuredOutputErrorCode, OkraPDFOptions, UploadOptions, UploadResult, DocumentStatus, WaitOptions, StructuredOutputMeta, StructuredOutputOptions, StructuredOutputResult, StructuredSchema, } from './types.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,yBAAyB,EACzB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,cAAc,EACd,WAAW,EACX,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { OkraPDF } from './client.js';
2
+ export { OkraRuntimeError, StructuredOutputError } from './errors.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,64 @@
1
+ import type { ZodType } from 'zod';
2
+ export type JsonSchema = Record<string, unknown>;
3
+ export type StructuredOutputErrorCode = 'SCHEMA_VALIDATION_FAILED' | 'EXTRACTION_FAILED' | 'TIMEOUT' | 'DOCUMENT_NOT_FOUND';
4
+ export type RuntimeErrorCode = StructuredOutputErrorCode | 'INVALID_REQUEST' | 'UNAUTHORIZED' | 'HTTP_ERROR' | 'INVALID_RESPONSE';
5
+ export interface OkraPDFOptions {
6
+ /** Hosted default points at api.okrapdf.com. */
7
+ baseUrl?: string;
8
+ /** Bearer API key (okra_...). */
9
+ apiKey?: string;
10
+ /** Alternative auth header for private deployments. */
11
+ sharedSecret?: string;
12
+ /** Inject custom fetch implementation for tests or runtime overrides. */
13
+ fetch?: typeof globalThis.fetch;
14
+ }
15
+ export interface UploadOptions {
16
+ /** Provide your own document ID. Default: auto-generated `ocr-*`. */
17
+ documentId?: string;
18
+ /** Optional filename hint for binary uploads. */
19
+ fileName?: string;
20
+ /** Processing capability hints forwarded to the worker. */
21
+ capabilities?: Record<string, unknown>;
22
+ }
23
+ export interface UploadResult {
24
+ id: string;
25
+ url: string;
26
+ status: string;
27
+ }
28
+ export interface DocumentStatus {
29
+ phase: string;
30
+ pagesTotal?: number;
31
+ pagesCompleted?: number;
32
+ totalNodes?: number;
33
+ verifiedNodes?: number;
34
+ failedNodes?: number;
35
+ pendingNodes?: number;
36
+ [key: string]: unknown;
37
+ }
38
+ export interface WaitOptions {
39
+ timeoutMs?: number;
40
+ pollIntervalMs?: number;
41
+ signal?: AbortSignal;
42
+ }
43
+ export interface StructuredOutputMeta {
44
+ confidence: number;
45
+ model: string;
46
+ durationMs: number;
47
+ citations?: Array<{
48
+ page: number;
49
+ text: string;
50
+ }>;
51
+ }
52
+ export interface StructuredOutputResult<T> {
53
+ data: T;
54
+ meta: StructuredOutputMeta;
55
+ }
56
+ export interface StructuredOutputOptions {
57
+ /** Natural-language extraction request. */
58
+ query: string;
59
+ /** Optional timeout forwarded to the worker. */
60
+ timeoutMs?: number;
61
+ signal?: AbortSignal;
62
+ }
63
+ export type StructuredSchema<T> = JsonSchema | ZodType<T>;
64
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAEnC,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,MAAM,MAAM,yBAAyB,GACjC,0BAA0B,GAC1B,mBAAmB,GACnB,SAAS,GACT,oBAAoB,CAAC;AAEzB,MAAM,MAAM,gBAAgB,GACxB,yBAAyB,GACzB,iBAAiB,GACjB,cAAc,GACd,YAAY,GACZ,kBAAkB,CAAC;AAEvB,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,EAAE,oBAAoB,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@okrapdf/runtime",
3
+ "version": "0.1.0",
4
+ "description": "Tiny runtime client for upload, status, wait, and structured output",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "test": "vitest run",
14
+ "test:watch": "vitest"
15
+ },
16
+ "dependencies": {
17
+ "zod": "^4.3.6"
18
+ },
19
+ "devDependencies": {
20
+ "@types/node": "^20.14.0",
21
+ "typescript": "^5.5.0",
22
+ "vitest": "^2.0.0"
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "README.md"
27
+ ]
28
+ }