import type { Api, AssistantMessage, Context, Model, ProviderStreamOptions, } from '@earendil-works/pi-ai'; export type PiModel = Model; export interface ModelRegistryView { getAvailable(): PiModel[]; isUsingOAuth(model: PiModel): boolean; getApiKeyAndHeaders(model: PiModel): Promise< | { ok: true; apiKey?: string; headers?: Record; env?: Record; } | { ok: false; error: string } >; } export type CompleteModel = ( model: PiModel, context: Context, options?: ProviderStreamOptions, ) => Promise; export type BboxOrder = 'xyxy' | 'yxyx'; export interface PromptProfile { id: string; version: number; displayName: string; bboxOrder: BboxOrder; system: string; user: string; modelIds: readonly string[]; estimatedInputTokensPerPage: number; estimatedOutputTokensPerPage: number; } export type AccessKind = 'subscription' | 'local' | 'metered' | 'unknown'; export interface ModelCandidate { model: PiModel; fullId: string; access: AccessKind; prompt?: PromptProfile; estimatedUsdPerPage?: number; } export interface OkraPiConfig { defaultModel?: string; aliases: Record; } export interface PageSelection { pages: number[]; description: string; } export interface ParsePlan { source: string; pageCount: number; selectedPages: PageSelection; selectedPageCount: number; model: string; provider: string; prompt: string; promptVersion: number; access: AccessKind; estimatedCostUsd?: number; costNote: string; } export interface RenderedPage { page: number; png: Uint8Array; width: number; height: number; } export interface LayoutBlock { label: string; bbox: [number, number, number, number]; text: string; page: number; } export interface UsageSummary { input: number; output: number; cacheRead: number; cacheWrite: number; reasoning: number; totalTokens: number; referenceCostUsd: number; } export interface PageParse { page: number; markdown: string; blocks: LayoutBlock[]; rawText: string; usage: UsageSummary; } export type ParseProgressPhase = | 'planning' | 'planned' | 'authenticating' | 'rendering' | 'requesting' | 'decoded' | 'writing' | 'complete' | 'failed'; export interface ParseProgress { phase: ParseProgressPhase; message: string; completedPages: number; totalPages?: number; currentPage?: number; blockCount: number; warningCount: number; model?: string; prompt?: string; } export interface ParseResult { markdown: string; blocks: LayoutBlock[]; pages: PageParse[]; usage: UsageSummary; meta: { parserId: 'layout-vlm'; provider: string; model: string; prompt: string; promptVersion: number; access: AccessKind; pageCount: number; durationMs: number; estimatedCostUsd?: number; costUsd?: number; referenceCostUsd?: number; warnings: string[]; }; } export interface ParseOptions { model?: string; pages?: string; dpi?: number; maxCostUsd?: number; config?: OkraPiConfig; signal?: AbortSignal; onProgress?: (progress: ParseProgress) => void; } export interface WrittenArtifacts { outputDir: string; markdownPath: string; blocksPath: string; manifestPath: string; rawDir: string; rawPaths: string[]; } export interface PdfSearchHit { page: number; bbox: [number, number, number, number]; text: string; label?: string; source: 'parsed-blocks' | 'pdf-text'; } export interface PdfScreenshotArtifact { page: number; width: number; height: number; path: string; bytes: number; }