@vostride/agent-qa-model 0.2.3 → 0.2.4
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/dist/index.cjs +5 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +0 -48
- package/dist/index.d.ts +0 -48
- package/dist/index.js +5 -8
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/adapters/anthropic.ts","../src/auth.ts","../src/adapters/gemini.ts","../src/adapters/openai.ts","../src/accounting/compact.ts","../src/capability/overflow-parse.ts","../src/accounting/degrade.ts","../src/accounting/token-accounting.ts","../src/capability/family-table.ts","../src/capability/override-store.ts","../src/capability/resolve.ts","../src/catalog/catalog.ts","../src/catalog/live.ts","../src/middleware.ts","../src/middleware/capability-update.ts","../src/middleware/debug-logging.ts","../src/middleware/drop-empty-messages.ts","../src/middleware/examples.ts","../src/middleware/extract-json.ts","../src/middleware/repair.ts","../src/middleware/retry.ts","../src/middleware/classify.ts","../src/middleware/strip-unsupported-params.ts","../src/providers/builtins.ts","../src/providers/registry.ts","../src/registry.ts","../src/validate.ts","../src/provider-call-report.ts","../src/vision/resolve-config.ts","../src/vision/resolve-gate.ts"],"sourcesContent":["export { anthropicCompatible, anthropicSubscription } from './adapters/anthropic'\nexport { getProviderOptions } from './adapters/index'\nexport type { AdapterBody } from './adapters/index'\nexport { gemini } from './adapters/gemini'\nexport { openaiCompatible, openaiSubscription } from './adapters/openai'\nexport { compactLogs } from './accounting/compact'\nexport { guardBlob, guardToolOutput } from './accounting/compact'\nexport type { LogEntry } from './accounting/compact'\nexport { isContextLengthOverflow } from './accounting/overflow'\nexport { createTokenAccounting } from './accounting/token-accounting'\nexport type {\n DegradeOptions,\n DegradeOutcome,\n TokenAccounting,\n TokenAccountingOptions,\n} from './accounting/types'\nexport { deriveTransport } from './auth'\nexport type { ResolvedModelAuth, Transport } from './auth'\nexport { FAMILIES, UNKNOWN_FLOOR, matchFamily } from './capability/family-table'\nexport { capabilityKey, getObservedWindow, overrideStore } from './capability/override-store'\nexport { isContextOverflow, parseRealWindow } from './capability/overflow-parse'\nexport { resolveCapabilities } from './capability/resolve'\nexport { MODEL_CATALOG, getModelCatalog } from './catalog/catalog'\nexport type { CatalogEntry } from './catalog/catalog'\nexport { fetchLiveModels, mergeCatalog } from './catalog/live'\nexport { toolSchemaMiddleware } from './middleware'\nexport { capabilityUpdateMiddleware } from './middleware/capability-update'\nexport { debugLoggingMiddleware } from './middleware/debug-logging'\nexport type { DebugLoggingOptions } from './middleware/debug-logging'\nexport { dropEmptyMessagesMiddleware } from './middleware/drop-empty-messages'\nexport { deriveExamplesMiddleware } from './middleware/examples'\nexport { extractJsonStrategy } from './middleware/extract-json'\nexport { repairMiddleware } from './middleware/repair'\nexport { retryMiddleware } from './middleware/retry'\nexport { stripUnsupportedParamsMiddleware } from './middleware/strip-unsupported-params'\nexport { clearProviderRegistry, getProvider, listProviders, registerProvider } from './providers/registry'\nexport type { ProviderAuthMode, ProviderDescriptor } from './providers/registry'\nexport { createModel } from './registry'\nexport type { ModelCallObservation, ModelProviderOverrides } from './registry'\nexport { MODEL_CALL_EVENT_KINDS, MODEL_CALL_REPORT_ORIGINS } from './provider-call-report'\nexport type { ModelCallEvent, ModelCallReport, ModelCallReportOrigin } from './provider-call-report'\nexport { validateProfile } from './validate'\nexport { resolveVisionConfig } from './vision/resolve-config'\nexport type { VisionSizingConfig } from './vision/resolve-config'\nexport { resolveVisionGate, visionFromConfig } from './vision/resolve-gate'\nexport type { VisionGate } from './vision/resolve-gate'\nexport type {\n ModelAuthDeclaration,\n ModelCapabilities,\n ModelProfile,\n ModelProviderId,\n} from '@vostride/agent-qa-schema'\n","import { createAnthropic } from '@ai-sdk/anthropic'\n\nimport type { LanguageModelV3 } from '@ai-sdk/provider'\n\nimport { applyProviderOptions } from '../auth.js'\nimport type { Transport } from '../auth.js'\n\nexport function anthropicCompatible(transport: Transport, modelId: string): LanguageModelV3 {\n return applyProviderOptions(\n createAnthropic({\n baseURL: transport.baseURL,\n headers: transport.headers,\n fetch: transport.fetch,\n ...(transport.authToken\n ? { authToken: transport.authToken }\n : { apiKey: transport.apiKey ?? 'anthropic-compatible' }),\n })(modelId),\n transport,\n )\n}\n\nexport function anthropicSubscription(transport: Transport, modelId: string): LanguageModelV3 {\n return applyProviderOptions(\n createAnthropic({\n apiKey: transport.apiKey ?? 'placeholder',\n fetch: transport.fetch,\n })(modelId),\n transport,\n )\n}\n","import { defaultSettingsMiddleware, wrapLanguageModel } from 'ai'\n\nimport type { LanguageModelV3, LanguageModelV3CallOptions } from '@ai-sdk/provider'\nimport type { ModelProfile } from '@vostride/agent-qa-schema'\n\nexport type ResolvedModelAuth =\n | { kind: 'api-key'; apiKey: string }\n | { kind: 'bearer-token'; token: string }\n | {\n kind: 'auth-fetch'\n modelAdapter: 'openai-responses' | 'anthropic-messages'\n fetch: typeof globalThis.fetch\n }\n | { kind: 'none' }\n\nexport interface Transport {\n baseURL?: string\n headers?: Record<string, string>\n apiKey?: string\n authToken?: string\n fetch?: typeof globalThis.fetch\n providerOptions?: ModelProfile['providerOptions']\n}\n\nexport function deriveTransport(profile: ModelProfile, auth: ResolvedModelAuth): Transport {\n const transport: Transport = {\n ...(profile.baseURL ? { baseURL: profile.baseURL } : {}),\n ...(profile.headers ? { headers: profile.headers } : {}),\n ...(profile.providerOptions ? { providerOptions: profile.providerOptions } : {}),\n }\n\n switch (auth.kind) {\n case 'api-key':\n return { ...transport, apiKey: auth.apiKey }\n case 'bearer-token':\n return { ...transport, authToken: auth.token }\n case 'auth-fetch':\n return { ...transport, apiKey: placeholderApiKey(profile.provider), fetch: auth.fetch }\n case 'none':\n return { ...transport, apiKey: placeholderApiKey(profile.provider) }\n }\n}\n\nexport function applyProviderOptions(model: LanguageModelV3, transport: Transport): LanguageModelV3 {\n if (!transport.providerOptions) return model\n\n return wrapLanguageModel({\n model,\n middleware: defaultSettingsMiddleware({\n settings: {\n providerOptions: transport.providerOptions as LanguageModelV3CallOptions['providerOptions'],\n },\n }),\n })\n}\n\nfunction placeholderApiKey(provider: string): string {\n switch (provider) {\n case 'openai-compatible':\n return 'openai-compatible'\n case 'anthropic-compatible':\n return 'anthropic-compatible'\n default:\n return 'placeholder'\n }\n}\n","import { createGoogleGenerativeAI } from '@ai-sdk/google'\n\nimport type { LanguageModelV3 } from '@ai-sdk/provider'\n\nimport { applyProviderOptions } from '../auth.js'\nimport type { Transport } from '../auth.js'\n\nexport function gemini(transport: Transport, modelId: string): LanguageModelV3 {\n return applyProviderOptions(\n createGoogleGenerativeAI({\n apiKey: transport.apiKey,\n fetch: transport.fetch,\n })(modelId),\n transport,\n )\n}\n","import { createOpenAI } from '@ai-sdk/openai'\n\nimport type { LanguageModelV3 } from '@ai-sdk/provider'\n\nimport { applyProviderOptions } from '../auth.js'\nimport type { Transport } from '../auth.js'\n\ntype JSONValue = string | number | boolean | null | JSONValue[] | { [key: string]: JSONValue | undefined }\n\nexport type ProviderOptions = Record<string, Record<string, JSONValue | undefined>> | undefined\n\nexport interface ProviderOptionsConfig {\n provider?: string\n modelAdapter?: 'openai-responses' | 'anthropic-messages'\n fetch?: typeof globalThis.fetch\n}\n\nexport function openaiCompatible(transport: Transport, modelId: string): LanguageModelV3 {\n return applyProviderOptions(\n createOpenAI({\n apiKey: transport.apiKey ?? 'openai-compatible',\n baseURL: transport.baseURL,\n fetch: transport.fetch,\n ...(transport.headers ? { headers: transport.headers } : {}),\n }).chat(modelId),\n transport,\n )\n}\n\nexport function openaiSubscription(transport: Transport, modelId: string): LanguageModelV3 {\n return applyProviderOptions(\n createOpenAI({\n apiKey: transport.apiKey ?? 'placeholder',\n fetch: transport.fetch,\n }).responses(modelId),\n transport,\n )\n}\n\nexport function getProviderOptions(config: ProviderOptionsConfig): ProviderOptions {\n if (\n config.fetch\n && (config.modelAdapter === 'openai-responses'\n || (!config.modelAdapter && config.provider === 'openai-subscription'))\n ) {\n return {\n openai: {\n instructions: 'You are a helpful assistant.',\n store: false,\n },\n }\n }\n return undefined\n}\n","// Deterministic pre-prompt compaction (CTXB-06). Two lanes, both pure (D-14):\n// compactLogs — log-shaped bursts: normalize variable tokens → group by\n// source::level::normalized_message → count + first-5 samples (D-13/D-15).\n// guardBlob — one-shot structured values: safe-stringify + a generous honest\n// size bound with the visible truncation marker; NEVER token-normalized (D-14).\n// Determinism is load-bearing (T-354-07): no clock, no randomness, sorted keys\n// before render so compacted output cannot smuggle run-to-run variance downstream.\n\nexport type LogEntry = { source: string; level?: string; message: string }\n\nconst DEFAULT_LEVEL = 'log'\nconst MAX_SAMPLES = 5\nconst SAMPLE_PREFIX = ' · '\nconst TRUNCATION_MARKER = '…[truncated to fit context budget]'\n\n// A single structured value is one thing, not a burst — so it earns a much more\n// generous bound than the v1 2000-char guillotine: 8000 chars (~2000 tokens, 4×)\n// keeps real signal while still capping an adversarial huge/repeating blob (T-354-05).\nconst BLOB_CEILING = 8000\n\n// Variable-token normalization, applied in this fixed precedence so a broader\n// pattern never chews a narrower one (UUID/timestamp/IP before bare hex/number).\n// `<*>` carries no digits, so a replaced token is never re-matched by a later rule.\nconst PLACEHOLDER = '<*>'\nconst NORMALIZERS: readonly RegExp[] = [\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, // UUID\n /\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:?\\d{2})?/g, // ISO timestamp\n /\\b(?:[0-9a-f]{1,4}:){2,}[0-9a-f]{0,4}\\b/gi, // IPv6-ish\n /\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b/g, // IPv4\n /\\b0x[0-9a-f]+\\b/gi, // hex literal\n /\\b[0-9a-f]{7,}\\b/gi, // long bare hex id\n /\\b\\d+(?:\\.\\d+)?\\b/g, // bare number (last)\n]\n\nfunction normalize(message: string): string {\n let out = message\n for (const pattern of NORMALIZERS) out = out.replace(pattern, PLACEHOLDER)\n return out\n}\n\ntype LogClass = { source: string; level: string; normalized: string; count: number; samples: string[] }\n\n/**\n * Compact a log-shaped burst into a deterministic, bounded string (D-13/D-15).\n * Groups typed `{source, level, message}` entries by `source::level::normalized`,\n * counts each class, and renders it with the first ≤5 raw samples seen (monotonic:\n * once a class has 5 samples, growing the burst never changes which 5 are shown;\n * the onset occurrence is always retained). Classes render in sorted-key order.\n */\nexport function compactLogs(entries: LogEntry[]): string {\n const classes = new Map<string, LogClass>()\n\n for (const entry of entries) {\n const level = entry.level ?? DEFAULT_LEVEL\n const normalized = normalize(entry.message)\n const key = `${entry.source}::${level}::${normalized}`\n const existing = classes.get(key)\n if (existing) {\n existing.count++\n if (existing.samples.length < MAX_SAMPLES) existing.samples.push(entry.message)\n } else {\n classes.set(key, { source: entry.source, level, normalized, count: 1, samples: [entry.message] })\n }\n }\n\n const sortedKeys = [...classes.keys()].sort()\n const blocks: string[] = []\n for (const key of sortedKeys) {\n const klass = classes.get(key)\n if (klass === undefined) continue\n const header = `[${klass.source}] ${klass.level} ×${klass.count}: ${klass.normalized}`\n const lines = klass.samples.map(sample => `${SAMPLE_PREFIX}${sample}`)\n blocks.push([header, ...lines].join('\\n'))\n }\n return blocks.join('\\n')\n}\n\n/**\n * Bound a single structured value for prompt inclusion (D-14). Safe-stringifies the\n * value verbatim (variable tokens preserved — the planner may need them exactly) and,\n * only if it exceeds `BLOB_CEILING`, slices and appends the visible truncation marker.\n * `undefined` in ⇒ `undefined` out. Never throws on cyclic input (V5).\n */\nexport function guardBlob(value: unknown): string | undefined {\n if (value === undefined) return undefined\n const str = safeStringify(value)\n if (str.length <= BLOB_CEILING) return str\n return str.slice(0, BLOB_CEILING) + TRUNCATION_MARKER\n}\n\ntype ConsoleShaped = { text?: unknown; message?: unknown; level?: unknown; source?: unknown }\ntype NetworkShaped = { url?: unknown; method?: unknown; status?: unknown }\n\nfunction asLogEntry(value: unknown): LogEntry | undefined {\n if (typeof value !== 'object' || value === null) return undefined\n const c = value as ConsoleShaped\n const text = typeof c.text === 'string' ? c.text : typeof c.message === 'string' ? c.message : undefined\n if (text !== undefined) {\n return {\n source: typeof c.source === 'string' ? c.source : 'console',\n level: typeof c.level === 'string' ? c.level : undefined,\n message: text,\n }\n }\n const n = value as NetworkShaped\n if (typeof n.url === 'string' && typeof n.method === 'string') {\n return {\n source: 'network',\n level: n.status === undefined ? undefined : String(n.status),\n message: `${n.method} ${n.url}`,\n }\n }\n return undefined\n}\n\n/**\n * The composed pre-prompt guard for one tool-output value (CTXB-06): a burst of\n * log-shaped entries (console `{level, text}` / network `{url, method, status}` /\n * generic `{source?, level?, message}`) routes through {@link compactLogs};\n * anything else through {@link guardBlob}. Compacted output is still bounded by\n * the blob ceiling so a burst of all-distinct classes cannot flood the prompt.\n */\nexport function guardToolOutput(value: unknown): string | undefined {\n if (Array.isArray(value) && value.length > 0) {\n const entries = value.map(asLogEntry)\n if (entries.every((e): e is LogEntry => e !== undefined)) {\n const compacted = compactLogs(entries)\n if (compacted.length <= BLOB_CEILING) return compacted\n return compacted.slice(0, BLOB_CEILING) + TRUNCATION_MARKER\n }\n }\n return guardBlob(value)\n}\n\n/** Cycle-safe stringify preserving key order (verbatim, D-14); never throws (V5). */\nfunction safeStringify(value: unknown): string {\n const seen = new WeakSet<object>()\n try {\n return (\n JSON.stringify(value, (_key, node) => {\n if (typeof node === 'object' && node !== null) {\n if (seen.has(node)) return '[Circular]'\n seen.add(node)\n }\n return node\n }) ?? 'undefined'\n )\n } catch {\n return '[unserializable]'\n }\n}\n","import { APICallError } from '@ai-sdk/provider'\n\nconst PATTERNS = [\n /maximum context length is (\\d+) tokens/i,\n />\\s*(\\d+)\\s*maximum/i,\n /maximum number of tokens allowed \\((\\d+)\\)/i,\n] as const\n\nconst MIN_WINDOW = 512\nconst MAX_WINDOW = 10_000_000\n\nexport function parseRealWindow(error: unknown): number | undefined {\n if (!APICallError.isInstance(error) || error.statusCode !== 400) return undefined\n\n const text = `${error.message ?? ''}\\n${error.responseBody ?? ''}`\n for (const pattern of PATTERNS) {\n const match = pattern.exec(text)\n if (!match) continue\n\n const parsed = Number.parseInt(match[1], 10)\n if (Number.isFinite(parsed) && parsed >= MIN_WINDOW && parsed <= MAX_WINDOW) {\n return parsed\n }\n }\n\n return undefined\n}\n\nexport function isContextOverflow(error: unknown): boolean {\n return parseRealWindow(error) !== undefined\n}\n","// The deterministic degrade pipeline over AI SDK `ModelMessage[]` (CTXB-05).\n// Hygiene always, damage on demand (D-08): the hygiene pass runs unconditionally every call\n// and is near-lossless; eviction/truncation (Task 3) run only while estimate > budget.\n// Determinism is load-bearing (D-08/T-354-03): no clock, no randomness, sorted keys before\n// iteration so nothing leaks nondeterminism into the downstream settle-hash signal.\n\nimport { pruneMessages, type ModelMessage, type ToolContent, type ToolResultPart } from 'ai'\n\nimport type { DegradeOptions, DegradeOutcome } from './types.js'\n\ntype ToolOutput = ToolResultPart['output']\ntype ToolPart = ToolContent[number]\n\nconst SCREENSHOT_OMITTED = '…[historical screenshot omitted]'\nconst DUPLICATE_ELIDED = '…[duplicate tool result elided]'\nconst TRUNCATION_MARKER = '…[truncated to fit context budget]'\n\n/**\n * The deterministic degrade pipeline (D-08/D-09/D-10): always-on hygiene, then — only while\n * the prompt exceeds `options.budget` — exchange-atomic eviction of the oldest unpinned tool\n * exchange followed by proportional truncation of the largest remaining unpinned message.\n * system messages, the final message, and any `options.pin`-matched message are never evicted\n * or truncated. If that protected content alone exceeds the budget, returns the structured\n * cannot-fit outcome (never throws, never violates a pin).\n */\nexport function degrade(messages: ModelMessage[], options: DegradeOptions): DegradeOutcome {\n const estimate = options.estimate ?? defaultEstimate\n let working = runHygiene(messages)\n\n // D-09 hard floor: protected (system + final + pinned) content alone exceeds the budget.\n if (estimate(protectedMessages(working, options)) > options.budget) {\n return { ok: false, reason: 'pinned-content-exceeds-budget', messages: working }\n }\n\n // Damage — eviction (D-10): remove the oldest unpinned tool exchange, re-estimate, repeat.\n while (estimate(working) > options.budget) {\n const evicted = evictOldestExchange(working, options)\n if (!evicted) break\n working = evicted\n }\n\n // Damage — proportional truncation of the largest remaining unpinned message.\n const exhausted = new Set<number>()\n while (estimate(working) > options.budget) {\n const isProtectedAt = makeIsProtected(working, options)\n let targetIndex = -1\n let targetLength = 0\n working.forEach((message, index) => {\n if (isProtectedAt(index) || exhausted.has(index)) return\n const length = messageTextLength(message)\n if (length > targetLength) {\n targetLength = length\n targetIndex = index\n }\n })\n if (targetIndex === -1 || targetLength === 0) break\n\n const overshootChars = Math.max(1, (estimate(working) - options.budget) * 4)\n const keepChars = Math.max(0, targetLength - overshootChars)\n const truncatedMessage = truncateMessage(working[targetIndex], keepChars)\n\n if (messageTextLength(truncatedMessage) >= messageTextLength(working[targetIndex])) {\n exhausted.add(targetIndex)\n continue\n }\n working = working.map((message, index) => (index === targetIndex ? truncatedMessage : message))\n if (keepChars === 0) exhausted.add(targetIndex)\n }\n\n return { ok: true, messages: working }\n}\n\n/** Fallback estimator (~chars/4) for standalone `degrade`; the factory passes its own. */\nfunction defaultEstimate(messages: ModelMessage[]): number {\n let chars = 0\n for (const message of messages) chars += messageTextLength(message)\n return Math.ceil(chars / 4)\n}\n\n/** system + final message + caller-pinned are the inviolable protected set (D-09). */\nfunction makeIsProtected(messages: ModelMessage[], options: DegradeOptions): (index: number) => boolean {\n const lastIndex = messages.length - 1\n return (index: number): boolean => {\n const message = messages[index]\n if (message.role === 'system') return true\n if (index === lastIndex) return true\n return options.pin ? options.pin(message, index) === true : false\n }\n}\n\nfunction protectedMessages(messages: ModelMessage[], options: DegradeOptions): ModelMessage[] {\n const isProtectedAt = makeIsProtected(messages, options)\n return messages.filter((_, index) => isProtectedAt(index))\n}\n\nfunction toolCallIdsOf(message: ModelMessage): string[] {\n if (message.role !== 'assistant' || !Array.isArray(message.content)) return []\n const ids: string[] = []\n for (const part of message.content) if (part.type === 'tool-call') ids.push(part.toolCallId)\n return ids\n}\n\nfunction resultIdsOf(message: ModelMessage): string[] {\n const ids: string[] = []\n if (message.role === 'tool') {\n for (const part of message.content) if (part.type === 'tool-result') ids.push(part.toolCallId)\n } else if (message.role === 'assistant' && Array.isArray(message.content)) {\n for (const part of message.content) if (part.type === 'tool-result') ids.push(part.toolCallId)\n }\n return ids\n}\n\n/**\n * Evict the oldest unpinned tool EXCHANGE atomically (D-10): the assistant tool-call message\n * plus every message that carries a `tool-result` for any of its `toolCallId`s (a following\n * `role:'tool'` message, or an assistant-embedded provider-executed result). An exchange\n * touching any protected message is skipped so no pin is ever violated and no reply orphaned.\n */\nfunction evictOldestExchange(messages: ModelMessage[], options: DegradeOptions): ModelMessage[] | undefined {\n const isProtectedAt = makeIsProtected(messages, options)\n for (let i = 0; i < messages.length; i++) {\n const callIds = toolCallIdsOf(messages[i])\n if (callIds.length === 0) continue\n const idSet = new Set(callIds)\n const exchange = new Set<number>([i])\n for (let j = 0; j < messages.length; j++) {\n if (j === i) continue\n if (resultIdsOf(messages[j]).some(id => idSet.has(id))) exchange.add(j)\n }\n let evictable = true\n for (const index of exchange) {\n if (isProtectedAt(index)) {\n evictable = false\n break\n }\n }\n if (!evictable) continue\n return messages.filter((_, index) => !exchange.has(index))\n }\n return undefined\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction messageTextLength(message: ModelMessage): number {\n const content = message.content\n if (typeof content === 'string') return content.length\n let total = 0\n for (const part of content as unknown[]) total += partTextLength(part)\n return total\n}\n\nfunction partTextLength(part: unknown): number {\n if (!isRecord(part)) return 0\n if (part.type === 'text' && typeof part.text === 'string') return part.text.length\n if (part.type === 'tool-result') return outputTextLength(part.output)\n return 0\n}\n\nfunction outputTextLength(output: unknown): number {\n if (!isRecord(output)) return 0\n if ((output.type === 'text' || output.type === 'error-text') && typeof output.value === 'string') {\n return output.value.length\n }\n if (output.type === 'content' && Array.isArray(output.value)) {\n let total = 0\n for (const item of output.value) {\n if (isRecord(item) && item.type === 'text' && typeof item.text === 'string') total += item.text.length\n }\n return total\n }\n return 0\n}\n\n/** Proportionally truncate a message's largest text-bearing part, appending the spec marker. */\nfunction truncateMessage(message: ModelMessage, keepChars: number): ModelMessage {\n const content = message.content\n if (typeof content === 'string') {\n return { ...message, content: sliceWithMarker(content, keepChars) } as ModelMessage\n }\n\n const parts = content as unknown[]\n let largestIndex = -1\n let largestLength = -1\n parts.forEach((part, index) => {\n const length = partTextLength(part)\n if (length > largestLength) {\n largestLength = length\n largestIndex = index\n }\n })\n if (largestIndex === -1 || largestLength <= 0) return message\n\n const removeTarget = Math.max(0, messageTextLength(message) - Math.max(0, keepChars))\n const partKeep = Math.max(0, largestLength - removeTarget)\n const newParts = parts.map((part, index) => (index === largestIndex ? truncatePart(part, partKeep) : part))\n return { ...message, content: newParts } as unknown as ModelMessage\n}\n\n/** Slice to `keep` chars + marker, first stripping any existing trailing marker so repeated\n * truncation of the same message converges monotonically instead of re-slicing the marker. */\nfunction sliceWithMarker(text: string, keep: number): string {\n const base = text.endsWith(TRUNCATION_MARKER) ? text.slice(0, text.length - TRUNCATION_MARKER.length) : text\n return base.slice(0, Math.max(0, keep)) + TRUNCATION_MARKER\n}\n\nfunction truncatePart(part: unknown, keep: number): unknown {\n if (!isRecord(part)) return part\n if (part.type === 'text' && typeof part.text === 'string') {\n return { ...part, text: sliceWithMarker(part.text, keep) }\n }\n if (part.type === 'tool-result') {\n return { ...part, output: truncateOutput(part.output, keep) }\n }\n return part\n}\n\nfunction truncateOutput(output: unknown, keep: number): unknown {\n if (!isRecord(output)) return output\n if ((output.type === 'text' || output.type === 'error-text') && typeof output.value === 'string') {\n return { ...output, value: sliceWithMarker(output.value, keep) }\n }\n return output\n}\n\n/**\n * Near-lossless hygiene: the SDK `pruneMessages` leg (reasoning strip keeping the last\n * message's reasoning + empty-message removal) followed by the custom tool-result clearing\n * lane. `pruneMessages` only removes parts; the clearing lane does the rewriting.\n */\nexport function runHygiene(messages: ModelMessage[]): ModelMessage[] {\n const pruned = pruneMessages({\n messages,\n reasoning: 'before-last-message',\n emptyMessages: 'remove',\n })\n return clearHistoricalToolResults(pruned)\n}\n\n/**\n * The clearing lane. The most recent tool message is preserved verbatim; every earlier\n * (historical) tool result has its screenshot base64 stripped and content-identical results\n * hash-deduped down to a one-liner. Rewrites parts, never removes them.\n */\nfunction clearHistoricalToolResults(messages: ModelMessage[]): ModelMessage[] {\n let lastToolIndex = -1\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === 'tool') {\n lastToolIndex = i\n break\n }\n }\n\n const seenHashes = new Set<string>()\n return messages.map((message, index) => {\n if (message.role !== 'tool' || index === lastToolIndex) return message\n const rewritten = message.content.map(part => rewriteHistoricalPart(part, seenHashes))\n return { ...message, content: rewritten }\n })\n}\n\nfunction rewriteHistoricalPart(part: ToolPart, seenHashes: Set<string>): ToolPart {\n if (part.type !== 'tool-result') return part\n\n const hash = contentHash(part.output)\n if (seenHashes.has(hash)) {\n return { ...part, output: { type: 'text', value: DUPLICATE_ELIDED } }\n }\n seenHashes.add(hash)\n\n const stripped = stripScreenshots(part.output)\n return stripped === part.output ? part : { ...part, output: stripped }\n}\n\n/** Replace historical `image-data`/`media` content parts with a text marker (drop the base64). */\nfunction stripScreenshots(output: ToolOutput): ToolOutput {\n if (output.type !== 'content') return output\n let changed = false\n const value = output.value.map(item => {\n if (item.type === 'image-data' || item.type === 'media') {\n changed = true\n return { type: 'text' as const, text: SCREENSHOT_OMITTED }\n }\n return item\n })\n return changed ? { type: 'content', value } : output\n}\n\n/**\n * Non-security content-identity hash (FNV-1a over a safe stringify). Identity only — NOT a\n * security control. Used solely to collapse content-identical historical tool results.\n */\nfunction contentHash(value: unknown): string {\n const str = safeStringify(value)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n return (hash >>> 0).toString(16)\n}\n\n/**\n * Cycle-safe, key-sorted stringify (V5): never throws on cyclic tool-result values, and\n * sorts object keys so identical content hashes identically regardless of key order.\n */\nfunction safeStringify(value: unknown): string {\n const ancestors: object[] = []\n const walk = (node: unknown): unknown => {\n if (node === null || typeof node !== 'object') return node\n if (ancestors.includes(node as object)) return '[Circular]'\n ancestors.push(node as object)\n let result: unknown\n if (Array.isArray(node)) {\n result = node.map(walk)\n } else {\n const sortedKeys = Object.keys(node as Record<string, unknown>).sort()\n const obj: Record<string, unknown> = {}\n for (const key of sortedKeys) obj[key] = walk((node as Record<string, unknown>)[key])\n result = obj\n }\n ancestors.pop()\n return result\n }\n try {\n return JSON.stringify(walk(value)) ?? 'undefined'\n } catch {\n return '[unserializable]'\n }\n}\n","// The conversation-scoped token-accounting instance (CTXB-03, D-01/D-02/D-04/D-07/D-12).\n// Closure-state factory: options in, closure-captured anchor\n// state, an object of methods out. Provider-neutral: operates only on AI SDK `ModelMessage[]`.\n\nimport type { ModelMessage } from 'ai'\n\nimport { degrade as pureDegrade } from './degrade.js'\nimport type { DegradeOptions, DegradeOutcome, TokenAccounting, TokenAccountingOptions } from './types.js'\n\n// Anthropic's large-image ceiling ≈ (1568×1568)/750 ≈ 1,533 tokens at v2 downscaled capture\n// sizes; 1,600 is the safe conservative over-estimate (RESEARCH Q8/D-12). Injectable, never\n// user-facing config. Over-charging degrades slightly early — the safe direction (T-354-10).\nconst DEFAULT_PER_IMAGE_TOKENS = 1600\n\ninterface Anchor {\n promptTokens: number\n prefixLength: number\n prefixDigest: string\n}\n\nexport function createTokenAccounting(options: TokenAccountingOptions): TokenAccounting {\n const perImageTokens = options.perImageTokens ?? DEFAULT_PER_IMAGE_TOKENS\n let anchor: Anchor | undefined\n\n function estimate(messages: ModelMessage[]): number {\n let chars = 0\n let images = 0\n for (const message of messages) {\n chars += messageTextChars(message)\n images += messageImageCount(message)\n }\n let textTokens = Math.ceil(chars / 4)\n if (anchor !== undefined && prefixMatches(messages, anchor)) {\n textTokens = Math.max(textTokens, anchor.promptTokens)\n }\n return textTokens + images * perImageTokens\n }\n\n function recordUsage(usage: { inputTokens?: number }, messages: ModelMessage[]): void {\n const inputTokens = usage.inputTokens\n if (inputTokens === undefined) return\n anchor = { promptTokens: inputTokens, prefixLength: messages.length, prefixDigest: digestPrefix(messages) }\n }\n\n function getCeilings(): { contextWindow: number; maxOutput: number } {\n const c = options.getCapabilities()\n return { contextWindow: c.contextWindow, maxOutput: c.maxOutput }\n }\n\n function degrade(messages: ModelMessage[], opts: DegradeOptions): DegradeOutcome {\n return pureDegrade(messages, { ...opts, estimate })\n }\n\n return { estimate, recordUsage, getCeilings, degrade }\n}\n\n/** The anchored prefix still matches when messages are ≥ the anchored length and the leading\n * `prefixLength` messages hash identically — an identity, never an array cursor (D-01/Pitfall 6). */\nfunction prefixMatches(messages: ModelMessage[], anchor: Anchor): boolean {\n if (messages.length < anchor.prefixLength) return false\n const prefix = messages.length === anchor.prefixLength ? messages : messages.slice(0, anchor.prefixLength)\n return digestPrefix(prefix) === anchor.prefixDigest\n}\n\nfunction messageTextChars(message: ModelMessage): number {\n const content = message.content\n if (typeof content === 'string') return content.length\n let total = 0\n for (const part of content as unknown[]) total += partTextChars(part)\n return total\n}\n\nfunction partTextChars(part: unknown): number {\n if (!isRecord(part)) return 0\n if (part.type === 'text' && typeof part.text === 'string') return part.text.length\n if (part.type === 'tool-result') return outputTextChars(part.output)\n return 0\n}\n\nfunction outputTextChars(output: unknown): number {\n if (!isRecord(output)) return 0\n if ((output.type === 'text' || output.type === 'error-text') && typeof output.value === 'string') {\n return output.value.length\n }\n if (output.type === 'content' && Array.isArray(output.value)) {\n let total = 0\n for (const item of output.value) {\n if (isRecord(item) && item.type === 'text' && typeof item.text === 'string') total += item.text.length\n }\n return total\n }\n return 0\n}\n\n/** One flat charge per image part — inline user `ImagePart`s and historical `ToolResultOutput\n * { type:'content' }` `image-data`/`media` parts alike; base64 length is never read (RESEARCH Q8). */\nfunction messageImageCount(message: ModelMessage): number {\n const content = message.content\n if (typeof content === 'string') return 0\n let count = 0\n for (const part of content as unknown[]) {\n if (!isRecord(part)) continue\n if (part.type === 'image') count += 1\n else if (part.type === 'tool-result') count += outputImageCount(part.output)\n }\n return count\n}\n\nfunction outputImageCount(output: unknown): number {\n if (!isRecord(output) || output.type !== 'content' || !Array.isArray(output.value)) return 0\n let count = 0\n for (const item of output.value) {\n if (isRecord(item) && (item.type === 'image-data' || item.type === 'media')) count += 1\n }\n return count\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\n/** FNV-1a over a cycle-safe, key-sorted stringify of the message prefix — a content identity,\n * not a security control; used solely to detect when the anchored prefix diverges. */\nfunction digestPrefix(messages: ModelMessage[]): string {\n const str = safeStringify(messages)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n return `${messages.length}:${(hash >>> 0).toString(16)}`\n}\n\nfunction safeStringify(value: unknown): string {\n const ancestors: object[] = []\n const walk = (node: unknown): unknown => {\n if (node === null || typeof node !== 'object') return node\n if (ancestors.includes(node as object)) return '[Circular]'\n ancestors.push(node as object)\n let result: unknown\n if (Array.isArray(node)) {\n result = node.map(walk)\n } else {\n const sortedKeys = Object.keys(node as Record<string, unknown>).sort()\n const obj: Record<string, unknown> = {}\n for (const key of sortedKeys) obj[key] = walk((node as Record<string, unknown>)[key])\n result = obj\n }\n ancestors.pop()\n return result\n }\n try {\n return JSON.stringify(walk(value)) ?? 'undefined'\n } catch {\n return '[unserializable]'\n }\n}\n","import type { ModelCapabilities } from '@vostride/agent-qa-schema'\n\nexport interface FamilyEntry {\n match: readonly string[]\n caps: ModelCapabilities\n}\n\nfunction caps(\n contextWindow: number,\n maxOutput: number,\n vision: boolean,\n visionToolMessages: boolean,\n): ModelCapabilities {\n return {\n text: true,\n vision,\n visionToolMessages,\n toolCalling: true,\n structuredOutput: true,\n streaming: true,\n contextWindow,\n maxOutput,\n }\n}\n\nexport const UNKNOWN_FLOOR: ModelCapabilities = caps(8192, 4096, false, false)\n\nexport const FAMILIES: readonly FamilyEntry[] = [\n { match: ['claude-3-5-haiku', 'claude-haiku'], caps: caps(200000, 8192, true, true) },\n { match: ['claude-opus', 'claude-sonnet', 'claude-'], caps: caps(200000, 32000, true, true) },\n { match: ['gpt-4o'], caps: caps(128000, 16384, true, false) },\n { match: ['gpt-4.1'], caps: caps(1047576, 32768, true, false) },\n { match: ['gpt-5'], caps: caps(400000, 128000, true, false) },\n { match: ['o1', 'o3', 'o4'], caps: caps(200000, 100000, true, false) },\n { match: ['gpt-4'], caps: caps(8192, 4096, false, false) },\n { match: ['gpt-3.5'], caps: caps(16385, 4096, false, false) },\n { match: ['gpt-'], caps: caps(128000, 16384, true, false) },\n { match: ['gemini-2.5', 'gemini-3', 'gemini-1.5', 'gemini-'], caps: caps(1048576, 65536, true, true) },\n { match: ['gemini-2.0-flash'], caps: caps(1048576, 8192, true, true) },\n { match: ['deepseek-chat', 'deepseek-r1', 'deepseek-'], caps: caps(65536, 8192, false, false) },\n { match: ['qwen2.5-vl', 'qwen-vl', 'qwen2-vl'], caps: caps(32768, 8192, true, false) },\n { match: ['qwen'], caps: caps(32768, 8192, false, false) },\n { match: ['llava'], caps: caps(8192, 4096, true, false) },\n { match: ['llama-3-vision', 'llama3.2-vision', 'vision'], caps: caps(128000, 8192, true, false) },\n { match: ['llama-3', 'llama3'], caps: caps(128000, 8192, false, false) },\n { match: ['llama'], caps: caps(8192, 4096, false, false) },\n { match: ['pixtral'], caps: caps(128000, 8192, true, false) },\n { match: ['mixtral', 'mistral'], caps: caps(32768, 8192, false, false) },\n]\n\nconst BOUNDARIES = new Set(['-', '_', '.', '/', ':'])\n\nfunction matchesAtBoundary(id: string, token: string): boolean {\n let from = 0\n for (;;) {\n const idx = id.indexOf(token, from)\n if (idx === -1) return false\n if (idx === 0 || BOUNDARIES.has(id[idx - 1])) return true\n from = idx + 1\n }\n}\n\nexport function matchFamily(model: string): ModelCapabilities | undefined {\n const id = model.toLowerCase()\n let best: { length: number; caps: ModelCapabilities } | undefined\n\n for (const family of FAMILIES) {\n for (const match of family.match) {\n const normalized = match.toLowerCase()\n if (!matchesAtBoundary(id, normalized)) continue\n if (!best || normalized.length > best.length) {\n best = { length: normalized.length, caps: family.caps }\n }\n }\n }\n\n return best?.caps\n}\n","export const overrideStore = new Map<string, number>()\n\nexport function capabilityKey(provider: string, model: string): string {\n return `${provider}:${model.toLowerCase().trim()}`\n}\n\nexport function getObservedWindow(key: string): number | undefined {\n return overrideStore.get(key)\n}\n","import type { ModelCapabilities, ModelProfile } from '@vostride/agent-qa-schema'\n\nimport { matchFamily, UNKNOWN_FLOOR } from './family-table.js'\nimport { capabilityKey, getObservedWindow } from './override-store.js'\n\nexport function resolveCapabilities(profile: ModelProfile): ModelCapabilities {\n const base = matchFamily(profile.model) ?? UNKNOWN_FLOOR\n const declared = { ...base, ...(profile.capabilities ?? {}) }\n const observed = getObservedWindow(capabilityKey(profile.provider, profile.model))\n\n if (observed !== undefined) {\n return { ...declared, contextWindow: observed }\n }\n\n return declared\n}\n","import type { ModelProviderId } from '@vostride/agent-qa-schema'\n\nimport { matchFamily } from '../capability/family-table.js'\n\ninterface AuthoredEntry {\n id: string\n label: string\n notes?: string\n vision?: boolean\n}\n\nexport interface CatalogEntry {\n id: string\n label: string\n vision: boolean\n notes?: string\n}\n\nexport function deriveVision(id: string, override?: boolean): boolean {\n return override ?? matchFamily(id)?.vision ?? false\n}\n\nfunction expose(entry: AuthoredEntry): CatalogEntry {\n return {\n id: entry.id,\n label: entry.label,\n vision: deriveVision(entry.id, entry.vision),\n ...(entry.notes ? { notes: entry.notes } : {}),\n }\n}\n\nconst CLAUDE: readonly AuthoredEntry[] = [\n { id: 'claude-opus-4-8', label: 'Claude Opus 4.8' },\n { id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6' },\n { id: 'claude-haiku-4-5', label: 'Claude Haiku 4.5' },\n]\n\nconst OPENAI_CLOUD: readonly AuthoredEntry[] = [\n { id: 'gpt-5.5', label: 'GPT-5.5' },\n { id: 'gpt-4.1', label: 'GPT-4.1' },\n { id: 'o3', label: 'o3' },\n { id: 'o4-mini', label: 'o4-mini' },\n]\n\nconst LOCAL_OPENAI_WIRE: readonly AuthoredEntry[] = [\n {\n id: 'deepseek-chat',\n label: 'DeepSeek Chat',\n notes: 'text-only model; use accessibility tree and DOM context.',\n },\n { id: 'deepseek-r1', label: 'DeepSeek R1', notes: 'Text-only reasoning model.' },\n { id: 'qwen2.5-vl', label: 'Qwen2.5 VL' },\n { id: 'llava', label: 'LLaVA' },\n { id: 'llama3.2-vision', label: 'Llama 3.2 Vision' },\n]\n\nconst GEMINI: readonly AuthoredEntry[] = [\n { id: 'gemini-3-flash-preview', label: 'Gemini 3 Flash Preview' },\n { id: 'gemini-2.5-pro', label: 'Gemini 2.5 Pro' },\n { id: 'gemini-2.5-flash', label: 'Gemini 2.5 Flash' },\n]\n\nconst AUTHORED: Record<ModelProviderId, readonly AuthoredEntry[]> = {\n 'openai-compatible': [...OPENAI_CLOUD, ...LOCAL_OPENAI_WIRE],\n 'anthropic-compatible': CLAUDE,\n 'openai-subscription': OPENAI_CLOUD,\n 'anthropic-subscription': CLAUDE,\n gemini: GEMINI,\n}\n\nfunction exposeCatalog(): Record<ModelProviderId, CatalogEntry[]> {\n return {\n 'openai-compatible': AUTHORED['openai-compatible'].map(expose),\n 'anthropic-compatible': AUTHORED['anthropic-compatible'].map(expose),\n 'openai-subscription': AUTHORED['openai-subscription'].map(expose),\n 'anthropic-subscription': AUTHORED['anthropic-subscription'].map(expose),\n gemini: AUTHORED.gemini.map(expose),\n }\n}\n\nexport const MODEL_CATALOG: Record<ModelProviderId, CatalogEntry[]> = exposeCatalog()\n\nexport function getModelCatalog(): Record<ModelProviderId, CatalogEntry[]> {\n return {\n 'openai-compatible': MODEL_CATALOG['openai-compatible'].map(entry => ({ ...entry })),\n 'anthropic-compatible': MODEL_CATALOG['anthropic-compatible'].map(entry => ({ ...entry })),\n 'openai-subscription': MODEL_CATALOG['openai-subscription'].map(entry => ({ ...entry })),\n 'anthropic-subscription': MODEL_CATALOG['anthropic-subscription'].map(entry => ({ ...entry })),\n gemini: MODEL_CATALOG.gemini.map(entry => ({ ...entry })),\n }\n}\n","import type { CatalogEntry } from './catalog.js'\nimport { matchFamily } from '../capability/family-table.js'\n\ninterface LiveCacheEntry {\n entries: CatalogEntry[]\n expiresAt: number\n}\n\nexport interface FetchLiveModelsOptions {\n baseURL: string\n headers?: Record<string, string>\n fetchImpl?: typeof globalThis.fetch\n timeoutMs?: number\n ttlMs?: number\n}\n\nconst liveCache = new Map<string, LiveCacheEntry>()\nconst DEFAULT_TIMEOUT_MS = 2500\nconst DEFAULT_TTL_MS = 60_000\nconst MAX_LIVE_MODELS = 1000\n\nfunction normalizeBaseURL(baseURL: string): string {\n return baseURL.trim().replace(/\\/+$/, '')\n}\n\nfunction cacheKey(baseURL: string): string {\n return normalizeBaseURL(baseURL).toLowerCase()\n}\n\nfunction liveEntry(id: string): CatalogEntry {\n return {\n id,\n label: id,\n vision: matchFamily(id)?.vision ?? false,\n }\n}\n\nfunction parseLiveBody(body: unknown): CatalogEntry[] {\n if (!body || typeof body !== 'object' || !Array.isArray((body as { data?: unknown }).data)) {\n return []\n }\n\n return (body as { data: unknown[] }).data\n .slice(0, MAX_LIVE_MODELS)\n .flatMap((model) => {\n if (!model || typeof model !== 'object') return []\n const id = (model as { id?: unknown }).id\n return typeof id === 'string' && id.trim() ? [liveEntry(id)] : []\n })\n}\n\nexport async function fetchLiveModels(opts: FetchLiveModelsOptions): Promise<CatalogEntry[]> {\n const normalized = normalizeBaseURL(opts.baseURL)\n if (!normalized) return []\n\n const now = Date.now()\n const key = cacheKey(normalized)\n const cached = liveCache.get(key)\n if (cached && cached.expiresAt > now) return cached.entries\n\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS)\n\n try {\n const doFetch = opts.fetchImpl ?? globalThis.fetch\n const res = await doFetch(`${normalized}/models`, {\n signal: controller.signal,\n ...(opts.headers ? { headers: opts.headers } : {}),\n })\n\n if (!res.ok) return []\n\n const entries = parseLiveBody(await res.json())\n liveCache.set(key, {\n entries,\n expiresAt: Date.now() + (opts.ttlMs ?? DEFAULT_TTL_MS),\n })\n return entries\n } catch {\n return []\n } finally {\n clearTimeout(timeout)\n }\n}\n\nexport function mergeCatalog(staticEntries: CatalogEntry[], live: CatalogEntry[]): CatalogEntry[] {\n const seen = new Set(staticEntries.map(entry => entry.id.toLowerCase()))\n return [...staticEntries, ...live.filter(entry => !seen.has(entry.id.toLowerCase()))]\n}\n","import type { LanguageModelMiddleware } from 'ai'\n\nexport const toolSchemaMiddleware: LanguageModelMiddleware = {\n specificationVersion: 'v3',\n\n transformParams: async ({ params }) => {\n if (!params.tools) return params\n\n return {\n ...params,\n tools: params.tools.map((t: any) => {\n if (t.type !== 'function') return t\n const schema = { ...t.inputSchema }\n if ('$schema' in schema) delete schema.$schema\n if (!schema.type) schema.type = 'object'\n return { ...t, inputSchema: schema }\n }),\n }\n },\n}\n","import type { LanguageModelMiddleware } from 'ai'\nimport type { ModelProfile } from '@vostride/agent-qa-schema'\n\nimport { capabilityKey, overrideStore } from '../capability/override-store.js'\nimport { parseRealWindow } from '../capability/overflow-parse.js'\n\nexport function capabilityUpdateMiddleware(profile: ModelProfile): LanguageModelMiddleware {\n const key = capabilityKey(profile.provider, profile.model)\n\n async function observe<T>(call: () => PromiseLike<T>): Promise<T> {\n try {\n return await call()\n } catch (error) {\n const observedWindow = parseRealWindow(error)\n if (observedWindow !== undefined) {\n overrideStore.set(key, observedWindow)\n }\n throw error\n }\n }\n\n return {\n specificationVersion: 'v3',\n wrapGenerate: ({ doGenerate }) => observe(doGenerate),\n wrapStream: ({ doStream }) => observe(doStream),\n }\n}\n","import type { LanguageModelMiddleware } from 'ai'\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Prompt,\n} from '@ai-sdk/provider'\n\n// RUNX-04. Flag-gated (AGENT_QA_DEBUG_LLM) debug surface: per model call it logs the request\n// shape and, on a provider failure, the error's structured fields, then re-throws the error\n// unchanged. Disabled, it is a pure passthrough.\n// 2026-10-14 (441-36, D-28): a line carries no header value, query string or provider free text.\n\nexport interface DebugLoggingOptions {\n /** Force enable/disable. When omitted, resolves from the `AGENT_QA_DEBUG_LLM` env flag. */\n enabled?: boolean\n /** Line sink. Defaults to stderr. Injected by tests as a spy. */\n sink?: (line: string) => void\n}\n\nconst REQUEST_PREFIX = '[agent-qa:llm] request'\nconst ERROR_PREFIX = '[agent-qa:llm] provider-error'\n\nfunction isEnvEnabled(): boolean {\n const raw = typeof process !== 'undefined' ? process.env?.AGENT_QA_DEBUG_LLM : undefined\n if (typeof raw !== 'string') return false\n const value = raw.trim().toLowerCase()\n return value !== '' && value !== '0' && value !== 'false' && value !== 'off' && value !== 'no'\n}\n\nfunction modelIdOf(model: LanguageModelV3 | undefined): string {\n if (model && typeof model === 'object' && 'modelId' in model) {\n const id = (model as { modelId?: unknown }).modelId\n if (typeof id === 'string' && id.length > 0) return id\n }\n return 'unknown'\n}\n\nfunction requestShapeLine(params: LanguageModelV3CallOptions, model: LanguageModelV3 | undefined): string {\n const record = params as unknown as Record<string, unknown>\n const prompt = record.prompt as LanguageModelV3Prompt | undefined\n const messages = Array.isArray(prompt) ? prompt : []\n const roles = messages.map((message) => (message as { role?: unknown }).role ?? '?').join(',')\n const toolCount = Array.isArray(record.tools) ? record.tools.length : 0\n // Param KEYS only (never values) — so `maxOutputTokens`/`temperature`/`toolChoice` are visible\n // but a secret carried in a param value never is.\n const paramKeys = Object.keys(record)\n .filter((key) => key !== 'prompt' && key !== 'tools')\n .join(',')\n return `${REQUEST_PREFIX} model=${modelIdOf(model)} messages=${messages.length} roles=[${roles}] tools=${toolCount} params=[${paramKeys}]`\n}\n\n// Compact, non-sensitive projection of the provider's requestBodyValues: model id + message\n// roles only, so the emitted tool-call shape context is visible without dumping the body.\nfunction compactRequestBodyValues(value: unknown): string | undefined {\n if (value === null || typeof value !== 'object') return undefined\n const record = value as Record<string, unknown>\n const model = typeof record.model === 'string' ? record.model : undefined\n const items = Array.isArray(record.input)\n ? record.input\n : Array.isArray(record.messages)\n ? record.messages\n : undefined\n const roles = items?.map((item) =>\n item && typeof item === 'object' && 'role' in item ? String((item as { role: unknown }).role) : '?',\n )\n const parts: string[] = []\n if (model) parts.push(`model=${model}`)\n if (roles) parts.push(`roles=[${roles.join(',')}]`)\n return parts.length > 0 ? `{${parts.join(',')}}` : undefined\n}\n\nfunction originAndPath(url: unknown): string | undefined {\n if (typeof url !== 'string') return undefined\n try {\n const parsed = new URL(url)\n return `${parsed.origin}${parsed.pathname}`\n } catch {\n return undefined\n }\n}\n\nfunction stringField(record: unknown, key: string): string | undefined {\n if (record === null || typeof record !== 'object') return undefined\n const value = (record as Record<string, unknown>)[key]\n return typeof value === 'string' ? value : undefined\n}\n\nfunction providerErrorLine(err: unknown): string {\n const e = (err ?? {}) as {\n name?: unknown\n statusCode?: unknown\n isRetryable?: unknown\n url?: unknown\n responseHeaders?: unknown\n responseBody?: unknown\n requestBodyValues?: unknown\n data?: unknown\n message?: unknown\n }\n const statusCode = typeof e.statusCode === 'number' ? e.statusCode : undefined\n const url = originAndPath(e.url)\n const responseBody = typeof e.responseBody === 'string' ? e.responseBody : undefined\n const request = compactRequestBodyValues(e.requestBodyValues)\n const nested = e.data !== null && typeof e.data === 'object'\n ? (e.data as Record<string, unknown>).error\n : undefined\n const type = stringField(nested, 'type') ?? stringField(e.data, 'type')\n const code = stringField(nested, 'code') ?? stringField(e.data, 'code')\n const headerNames = e.responseHeaders !== null && typeof e.responseHeaders === 'object'\n ? Object.keys(e.responseHeaders)\n : undefined\n\n const parts = [ERROR_PREFIX]\n if (statusCode !== undefined) parts.push(`statusCode=${statusCode}`)\n if (typeof e.name === 'string') parts.push(`name=${e.name}`)\n if (typeof e.isRetryable === 'boolean') parts.push(`isRetryable=${e.isRetryable}`)\n if (url !== undefined) parts.push(`url=${url}`)\n if (type !== undefined) parts.push(`type=${type}`)\n if (code !== undefined) parts.push(`code=${code}`)\n if (headerNames !== undefined) parts.push(`responseHeaders=[${headerNames.join(',')}]`)\n if (responseBody !== undefined) parts.push(`responseBodyLength=${responseBody.length}`)\n if (request !== undefined) parts.push(`request=${request}`)\n if (statusCode === undefined && responseBody === undefined) {\n const message = e.message !== undefined ? String(e.message) : String(err)\n parts.push(`messageLength=${message.length}`)\n }\n return parts.join(' ')\n}\n\nexport function debugLoggingMiddleware(options: DebugLoggingOptions = {}): LanguageModelMiddleware {\n const enabled = options.enabled ?? isEnvEnabled()\n\n // Disabled ⇒ a pure passthrough: no wrap hooks at all, so behavior + performance are byte-\n // identical and the sink is never touched.\n if (!enabled) {\n return { specificationVersion: 'v3' }\n }\n\n const sink = options.sink ?? ((line: string) => { process.stderr.write(`${line}\\n`) })\n const emit = (line: string): void => { sink(line) }\n\n return {\n specificationVersion: 'v3',\n\n wrapGenerate: async ({ doGenerate, params, model }) => {\n emit(requestShapeLine(params, model))\n try {\n return await doGenerate()\n } catch (err) {\n emit(providerErrorLine(err))\n throw err\n }\n },\n\n wrapStream: async ({ doStream, params, model }) => {\n emit(requestShapeLine(params, model))\n try {\n return await doStream()\n } catch (err) {\n emit(providerErrorLine(err))\n throw err\n }\n },\n }\n}\n","import type { LanguageModelMiddleware } from 'ai'\nimport type { LanguageModelV3Message, LanguageModelV3Prompt } from '@ai-sdk/provider'\n\n// RUNX-01 defense-in-depth (D2). Strips empty-content messages from `params.prompt` just\n// before the provider wire, so an empty message (e.g. a `{ role:'system', content:'' }`\n// tier a future caller reintroduces) can never reach the OpenAI Responses API — which\n// rejects empty message content with HTTP 400. The primary fix filters empty tiers at\n// planner assembly (runner); this is the second layer at the model egress. Pure\n// transformParams: it never drops a message that carries any non-empty text or any\n// non-text part (image/file/tool/reasoning), and it preserves order and every other\n// param field.\n\n// A message is \"empty\" when it contributes no content to the wire:\n// - system: its string content trims to empty\n// - user/assistant/tool: its content array has no part with non-empty text AND no\n// non-text part (a file/tool/reasoning part always keeps the message)\nfunction isEmptyMessage(message: LanguageModelV3Message): boolean {\n if (message.role === 'system') {\n return typeof message.content === 'string' && message.content.trim().length === 0\n }\n const parts = message.content\n if (!Array.isArray(parts) || parts.length === 0) return true\n for (const part of parts) {\n if (part.type === 'text' || part.type === 'reasoning') {\n if (typeof part.text === 'string' && part.text.trim().length > 0) return false\n } else {\n // Any non-text part (file/tool-call/tool-result/approval) is meaningful content.\n return false\n }\n }\n return true\n}\n\nexport function dropEmptyMessagesMiddleware(): LanguageModelMiddleware {\n return {\n specificationVersion: 'v3',\n\n transformParams: async ({ params }) => {\n const prompt = params.prompt as LanguageModelV3Prompt | undefined\n if (!prompt) return params\n const filtered = prompt.filter((message) => !isEmptyMessage(message))\n if (filtered.length === prompt.length) return params\n return { ...params, prompt: filtered }\n },\n }\n}\n","import type { LanguageModelMiddleware } from 'ai'\n\ntype JsonSchemaLike = {\n type?: string | string[]\n required?: string[]\n properties?: Record<string, JsonSchemaLike>\n}\n\ntype SampleInput = Record<string, unknown>\n\nexport function deriveExamplesMiddleware(): LanguageModelMiddleware {\n return {\n specificationVersion: 'v3',\n\n transformParams: async ({ params }) => {\n if (!params.tools) return params\n\n return {\n ...params,\n tools: params.tools.map((t: any) => {\n if (t.type !== 'function') return t\n if (t.inputExamples?.length) return t\n\n const input = sampleFromSchema(t.inputSchema)\n if (!input || Object.keys(input).length === 0) return t\n\n return { ...t, inputExamples: [{ input }] }\n }),\n }\n },\n }\n}\n\nexport function sampleFromSchema(inputSchema: JsonSchemaLike | undefined): SampleInput | undefined {\n const properties = inputSchema?.properties\n if (!properties || Object.keys(properties).length === 0) return undefined\n\n const fields =\n inputSchema?.required && inputSchema.required.length > 0\n ? inputSchema.required\n : Object.keys(properties)\n\n const input: SampleInput = {}\n for (const field of fields) {\n if (!properties[field]) continue\n input[field] = sampleValue(properties[field])\n }\n\n return Object.keys(input).length > 0 ? input : undefined\n}\n\nfunction sampleValue(schema: JsonSchemaLike): unknown {\n const type = Array.isArray(schema.type) ? schema.type[0] : schema.type\n\n switch (type) {\n case 'string':\n return ''\n case 'number':\n case 'integer':\n return 0\n case 'boolean':\n return false\n case 'array':\n return []\n case 'object':\n return {}\n default:\n return null\n }\n}\n","const MAX_SCAN_LENGTH = 200_000\n\nexport function extractJsonStrategy(text: string): string {\n const bounded = text.slice(0, MAX_SCAN_LENGTH)\n const fenced = bounded.match(/```(?:json)?[^\\S\\r\\n]*(?:\\r?\\n)?([\\s\\S]*?)```/i)\n if (fenced?.[1] !== undefined) return fenced[1].trim()\n\n const span = firstJsonSpan(bounded)\n if (span) return span.trim()\n\n return bounded.trim()\n}\n\nfunction firstJsonSpan(text: string): string | undefined {\n const start = firstJsonStart(text)\n if (start < 0) return undefined\n\n const opener = text[start]\n const closer = opener === '{' ? '}' : ']'\n let depth = 0\n let inString = false\n let escaped = false\n\n for (let index = start; index < text.length; index += 1) {\n const char = text[index]\n\n if (inString) {\n if (escaped) {\n escaped = false\n } else if (char === '\\\\') {\n escaped = true\n } else if (char === '\"') {\n inString = false\n }\n continue\n }\n\n if (char === '\"') {\n inString = true\n } else if (char === opener) {\n depth += 1\n } else if (char === closer) {\n depth -= 1\n if (depth === 0) return text.slice(start, index + 1)\n }\n }\n\n return undefined\n}\n\nfunction firstJsonStart(text: string): number {\n const objectStart = text.indexOf('{')\n const arrayStart = text.indexOf('[')\n if (objectStart < 0) return arrayStart\n if (arrayStart < 0) return objectStart\n return Math.min(objectStart, arrayStart)\n}\n","import { parsePartialJson, type LanguageModelMiddleware } from 'ai'\n\nexport function repairMiddleware(): LanguageModelMiddleware {\n return {\n specificationVersion: 'v3',\n\n async wrapGenerate({ doGenerate }) {\n const result = await doGenerate()\n const content = await Promise.all(\n result.content.map(async (part) => {\n if (part.type !== 'tool-call' || typeof part.input !== 'string') return part\n\n try {\n JSON.parse(part.input)\n return part\n } catch {\n const repaired = await parsePartialJson(part.input)\n if (\n (repaired.state === 'repaired-parse' || repaired.state === 'successful-parse') &&\n repaired.value !== undefined\n ) {\n return { ...part, input: JSON.stringify(repaired.value) }\n }\n\n return part\n }\n }),\n )\n\n return { ...result, content }\n },\n\n wrapStream({ doStream }) {\n // Tool-call JSON repair is load-bearing only for generated responses today.\n return doStream()\n },\n }\n}\n","import { APICallError } from '@ai-sdk/provider'\nimport type { LanguageModelMiddleware } from 'ai'\n\nimport { isTransientError } from './classify.js'\n\nexport interface RetryMiddlewareOptions {\n maxRetries?: number\n initialDelayInMs?: number\n backoffFactor?: number\n}\n\nexport function retryMiddleware({\n maxRetries = 2,\n initialDelayInMs = 1000,\n backoffFactor = 2,\n}: RetryMiddlewareOptions = {}): LanguageModelMiddleware {\n async function run<T>(call: () => PromiseLike<T>): Promise<T> {\n let delay = initialDelayInMs\n\n for (let attempt = 0; ; attempt += 1) {\n try {\n return await call()\n } catch (error) {\n if (isAbortError(error)) throw error\n if (!isTransientError(error) || attempt >= maxRetries) throw error\n\n const headerDelay = retryAfterMs(error, delay)\n await sleep(headerDelay ?? delay)\n delay *= backoffFactor\n }\n }\n }\n\n return {\n specificationVersion: 'v3',\n wrapGenerate: ({ doGenerate }) => run(doGenerate),\n wrapStream: ({ doStream }) => run(doStream),\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n return !!error && typeof error === 'object' && (error as { name?: unknown }).name === 'AbortError'\n}\n\nfunction retryAfterMs(error: unknown, delay: number): number | undefined {\n if (!APICallError.isInstance(error)) return undefined\n\n const headerMs = parseMs(error.responseHeaders?.['retry-after-ms'])\n if (headerMs !== undefined && shouldHonorRetryAfter(headerMs, delay)) return headerMs\n\n const retryAfter = error.responseHeaders?.['retry-after']\n const seconds = parseSeconds(retryAfter)\n if (seconds !== undefined && shouldHonorRetryAfter(seconds, delay)) return seconds\n\n return undefined\n}\n\nfunction parseMs(value: string | undefined): number | undefined {\n if (!value) return undefined\n\n const parsed = Number.parseInt(value, 10)\n return Number.isFinite(parsed) ? parsed : undefined\n}\n\nfunction parseSeconds(value: string | undefined): number | undefined {\n if (!value) return undefined\n\n const seconds = Number.parseFloat(value)\n if (Number.isFinite(seconds)) return Math.round(seconds * 1000)\n\n const date = Date.parse(value)\n if (Number.isNaN(date)) return undefined\n\n return date - Date.now()\n}\n\nfunction shouldHonorRetryAfter(ms: number, delay: number): boolean {\n return ms >= 0 && (ms < 60_000 || ms < delay)\n}\n\nfunction sleep(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve()\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { APICallError } from '@ai-sdk/provider'\n\nconst TRANSIENT_NETWORK_CODES = new Set(['ECONNRESET', 'ETIMEDOUT', 'ECONNREFUSED', 'EPIPE'])\n\nexport function isTransientError(error: unknown): boolean {\n return (\n (APICallError.isInstance(error) && error.isRetryable === true) ||\n isTransientNetworkError(error)\n )\n}\n\nexport function isTransientNetworkError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false\n\n const code = (error as { code?: unknown }).code\n if (typeof code === 'string' && TRANSIENT_NETWORK_CODES.has(code)) return true\n\n if (error instanceof TypeError) {\n return /fetch failed|network|ECONNRESET|ETIMEDOUT|ECONNREFUSED|EPIPE/i.test(error.message)\n }\n\n return false\n}\n","import type { LanguageModelMiddleware } from 'ai'\nimport type { LanguageModelV3CallOptions } from '@ai-sdk/provider'\n\n// RUNX-01 (real, live-captured 400). The codex/ChatGPT-subscription Responses backend\n// rejects certain SDK-level call params: it returns HTTP 400\n// `{\"detail\":\"Unsupported parameter: max_output_tokens\"}` when the openai-responses\n// adapter serializes `maxOutputTokens` to the wire `max_output_tokens`. This provider-\n// scoped, data-driven egress transform deletes exactly the params a provider declares as\n// unsupported (via `ProviderDescriptor.unsupportedParams`) just before the wire, so\n// Anthropic / standard OpenAI-compatible endpoints — which support the output cap — keep\n// it. A future surfaced-unsupported param is a one-line descriptor change.\n\nexport function stripUnsupportedParamsMiddleware(params: readonly string[]): LanguageModelMiddleware {\n return {\n specificationVersion: 'v3',\n\n transformParams: async ({ params: callOptions }) => {\n const present = params.filter((name) => name in (callOptions as Record<string, unknown>))\n if (present.length === 0) return callOptions\n const next = { ...(callOptions as Record<string, unknown>) }\n for (const name of present) {\n delete next[name]\n }\n return next as LanguageModelV3CallOptions\n },\n }\n}\n","import { anthropicCompatible, anthropicSubscription } from '../adapters/anthropic.js'\nimport { gemini } from '../adapters/gemini.js'\nimport { openaiCompatible, openaiSubscription } from '../adapters/openai.js'\n\nimport { registerProvider } from './registry.js'\n\nexport function seedBuiltins(): void {\n registerProvider({\n id: 'openai-compatible',\n label: 'OpenAI-compatible',\n adapter: openaiCompatible,\n needsBaseURL: true,\n authModes: ['api-key'],\n credentialOptional: true,\n modelAdapter: 'openai-responses',\n baseURLPlaceholder: 'https://openrouter.ai/api/v1',\n defaultModel: 'gpt-5.5',\n })\n registerProvider({\n id: 'anthropic-compatible',\n label: 'Anthropic-compatible',\n adapter: anthropicCompatible,\n needsBaseURL: true,\n authModes: ['api-key', 'bearer-token'],\n credentialOptional: true,\n modelAdapter: 'anthropic-messages',\n baseURLPlaceholder: 'https://anthropic-proxy.example/messages',\n defaultModel: 'claude-sonnet-4-6',\n })\n registerProvider({\n id: 'openai-subscription',\n label: 'OpenAI subscription',\n adapter: openaiSubscription,\n needsBaseURL: false,\n authModes: ['subscription'],\n subscription: true,\n modelAdapter: 'openai-responses',\n defaultModel: 'gpt-6.1-sol',\n // RUNX-01: the codex/ChatGPT-subscription Responses backend rejects the output cap\n // (`max_output_tokens`) with HTTP 400. Strip it at egress for this provider ONLY —\n // standard OpenAI-compatible `.chat()` endpoints and Anthropic support the cap.\n // 2026-10-20 (446-11, D-18): it also answers 400 \"Unsupported parameter: temperature\".\n unsupportedParams: ['maxOutputTokens', 'temperature'],\n })\n registerProvider({\n id: 'anthropic-subscription',\n label: 'Anthropic subscription',\n adapter: anthropicSubscription,\n needsBaseURL: false,\n authModes: ['subscription'],\n subscription: true,\n modelAdapter: 'anthropic-messages',\n defaultModel: 'claude-sonnet-5-5',\n })\n registerProvider({\n id: 'gemini',\n label: 'Gemini',\n adapter: gemini,\n needsBaseURL: false,\n authModes: ['api-key'],\n defaultModel: 'gemini-3-flash-preview',\n })\n}\n","import type { AdapterBody } from '../adapters/index.js'\n\nimport { seedBuiltins } from './builtins.js'\n\nexport type ProviderAuthMode = 'api-key' | 'bearer-token' | 'subscription' | 'none'\n\nexport interface ProviderDescriptor {\n id: string\n label: string\n adapter: AdapterBody\n needsBaseURL: boolean\n authModes: ProviderAuthMode[]\n subscription?: boolean\n credentialOptional?: boolean\n modelAdapter?: 'openai-responses' | 'anthropic-messages'\n baseURLPlaceholder?: string\n defaultModel?: string\n // SDK-level `LanguageModelV3CallOptions` param names this provider's backend rejects.\n // The model layer strips exactly these at egress (stripUnsupportedParamsMiddleware)\n // before the wire — e.g. openai-subscription rejects `maxOutputTokens` (RUNX-01).\n unsupportedParams?: readonly string[]\n}\n\nconst registry = new Map<string, ProviderDescriptor>()\n\nfunction validateDescriptor(descriptor: ProviderDescriptor): void {\n if (!descriptor.id?.trim()) {\n throw new Error('Provider descriptor id is required')\n }\n if (!descriptor.label?.trim()) {\n throw new Error(`Provider descriptor \"${descriptor.id}\" label is required`)\n }\n if (typeof descriptor.adapter !== 'function') {\n throw new Error(`Provider descriptor \"${descriptor.id}\" adapter is required`)\n }\n if (!Array.isArray(descriptor.authModes) || descriptor.authModes.length === 0) {\n throw new Error(`Provider descriptor \"${descriptor.id}\" authModes must be a non-empty array`)\n }\n}\n\nexport function registerProvider(descriptor: ProviderDescriptor): void {\n validateDescriptor(descriptor)\n registry.set(descriptor.id, descriptor)\n}\n\nexport function getProvider(id: string): ProviderDescriptor | undefined {\n return registry.get(id)\n}\n\nexport function listProviders(): ProviderDescriptor[] {\n return [...registry.values()]\n}\n\nexport function clearProviderRegistry(): void {\n registry.clear()\n seedBuiltins()\n}\n\nseedBuiltins()\n","import {\n addToolInputExamplesMiddleware,\n createProviderRegistry,\n customProvider,\n extractJsonMiddleware,\n wrapProvider,\n} from 'ai'\n\nimport type { LanguageModelMiddleware } from 'ai'\nimport type { LanguageModelV3, LanguageModelV3StreamPart, ProviderV3 } from '@ai-sdk/provider'\nimport type { MaskFn, ModelProfile } from '@vostride/agent-qa-schema'\nimport { createMaskingMiddleware } from '@vostride/agent-qa-safety'\n\nimport { deriveTransport } from './auth.js'\nimport type { ResolvedModelAuth } from './auth.js'\nimport { resolveCapabilities } from './capability/resolve.js'\nimport { capabilityUpdateMiddleware } from './middleware/capability-update.js'\nimport { debugLoggingMiddleware } from './middleware/debug-logging.js'\nimport { dropEmptyMessagesMiddleware } from './middleware/drop-empty-messages.js'\nimport { deriveExamplesMiddleware } from './middleware/examples.js'\nimport { extractJsonStrategy } from './middleware/extract-json.js'\nimport { repairMiddleware } from './middleware/repair.js'\nimport { retryMiddleware } from './middleware/retry.js'\nimport { stripUnsupportedParamsMiddleware } from './middleware/strip-unsupported-params.js'\nimport { toolSchemaMiddleware } from './middleware.js'\nimport { getProvider, listProviders } from './providers/registry.js'\nimport { validateProfile } from './validate.js'\nimport { openaiCompatible, openaiSubscription } from './adapters/openai.js'\nimport { anthropicCompatible, anthropicSubscription } from './adapters/anthropic.js'\nimport { gemini } from './adapters/gemini.js'\nimport { providerCallReport } from './provider-call-report.js'\nimport type { ModelCallEvent, ModelCallObservation, ModelCallReportOrigin } from './provider-call-report.js'\nexport type { ModelCallObservation } from './provider-call-report.js'\n\n// The per-call array createModel builds ends with the declared-secret mask after this array,\n// so it is the last transform before the wire (validate:safety (a)).\nconst MIDDLEWARE: LanguageModelMiddleware[] = [\n retryMiddleware(),\n repairMiddleware(),\n extractJsonMiddleware({ transform: extractJsonStrategy }),\n toolSchemaMiddleware,\n deriveExamplesMiddleware(),\n addToolInputExamplesMiddleware(),\n // RUNX-04: flag-gated debug logging (AGENT_QA_DEBUG_LLM); catches the raw APICallError first.\n debugLoggingMiddleware(),\n // RUNX-01: strip empty-content messages just before the wire.\n dropEmptyMessagesMiddleware(),\n]\n\nexport interface ModelProviderOverrides {\n languageModels?: Record<string, LanguageModelV3>\n /** Trusted custom/override adapter assertion; omitted means no cache/model authority. */\n providerReportOrigin?: ModelCallReportOrigin\n}\n\nexport function createModel(\n profile: ModelProfile,\n auth: ResolvedModelAuth,\n mask: MaskFn,\n overrides: ModelProviderOverrides = {},\n observation: ModelCallObservation = {},\n): LanguageModelV3 {\n validateProfile(profile)\n\n profile.capabilities ??= resolveCapabilities(profile)\n\n const transport = deriveTransport(profile, auth)\n const descriptor = getProvider(profile.provider as string)\n if (!descriptor) {\n throw new Error(\n `Unknown provider \"${profile.provider}\". Supported: ${listProviders().map(provider => provider.id).join(', ')}.`,\n )\n }\n\n const baseProvider = toProviderV3((modelId) => descriptor.adapter(transport, modelId))\n const provider: ProviderV3 = customProvider({\n languageModels: overrides.languageModels ?? {},\n fallbackProvider: baseProvider,\n })\n // Wrap BOTH explicit overrides and adapter fallbacks before the central middleware stack.\n // A retry reaches this boundary again; a safety refusal never does. The SDK calls the raw\n // model's methods with their receiver intact and leaves streaming results untouched.\n const onProviderCall = observation.onProviderCall\n const onCall = observation.onCall\n const origin = overrides.providerReportOrigin ?? (\n overrides.languageModels?.[profile.model] ? undefined\n : descriptor.adapter === openaiCompatible ? 'openai-chat'\n : descriptor.adapter === openaiSubscription ? 'openai-responses'\n : descriptor.adapter === anthropicCompatible || descriptor.adapter === anthropicSubscription\n ? 'anthropic-messages'\n : descriptor.adapter === gemini ? 'gemini' : undefined\n )\n const observe = (event: ModelCallEvent) => {\n try {\n Promise.resolve(onCall?.(event)).catch(() => {})\n } catch {\n // Observation cannot prevent a call or replace its original result/error.\n }\n }\n const start = () => {\n try {\n Promise.resolve(onProviderCall?.()).catch(() => {})\n } catch {\n // Legacy observation is isolated independently.\n }\n observe({ kind: 'start' })\n }\n const observedProvider = onProviderCall === undefined && onCall === undefined ? provider : wrapProvider({\n provider,\n languageModelMiddleware: {\n specificationVersion: 'v3',\n wrapGenerate: async ({ doGenerate }) => {\n start()\n try {\n const result = await doGenerate()\n // Reporting, including the mask, cannot replace a provider outcome.\n try {\n observe({ kind: 'success', report: providerCallReport(result, origin, mask) })\n } catch {\n observe({ kind: 'success', report: {} })\n }\n return result\n } catch (error) {\n observe({ kind: 'failure' })\n throw error\n }\n },\n wrapStream: async ({ doStream }) => {\n start()\n try {\n const result = await doStream()\n if (onCall === undefined) return result\n const reader = result.stream.getReader()\n let terminal = false\n let modelId: string | undefined\n const failure = () => {\n if (!terminal) {\n terminal = true\n observe({ kind: 'failure' })\n }\n }\n return {\n ...result,\n stream: new ReadableStream<LanguageModelV3StreamPart>({\n async pull(controller) {\n try {\n const next = await reader.read()\n if (next.done) {\n failure()\n controller.close()\n return\n }\n const part = next.value\n if (part.type === 'response-metadata') modelId = part.modelId\n if (part.type === 'error') failure()\n if (part.type === 'finish' && !terminal) {\n terminal = true\n try {\n observe({ kind: 'success', report: providerCallReport({\n usage: part.usage, response: { modelId },\n }, origin, mask) })\n } catch {\n observe({ kind: 'success', report: {} })\n }\n }\n controller.enqueue(part)\n } catch (error) {\n failure()\n controller.error(error)\n }\n },\n async cancel(reason) {\n failure()\n await reader.cancel(reason)\n },\n }, { highWaterMark: 0 }),\n }\n } catch (error) {\n observe({ kind: 'failure' })\n throw error\n }\n },\n },\n })\n // The masking middleware must stay last (validate:safety (a)).\n const middleware = [\n capabilityUpdateMiddleware(profile),\n ...(descriptor.unsupportedParams?.length\n ? [stripUnsupportedParamsMiddleware(descriptor.unsupportedParams)]\n : []),\n ...MIDDLEWARE,\n createMaskingMiddleware(mask),\n ]\n const registry = createProviderRegistry(\n { [profile.provider]: observedProvider },\n { languageModelMiddleware: middleware },\n )\n\n return registry.languageModel(`${profile.provider}:${profile.model}`)\n}\n\nfunction toProviderV3(build: (modelId: string) => LanguageModelV3): ProviderV3 {\n return {\n specificationVersion: 'v3',\n languageModel: build,\n embeddingModel(modelId) {\n throw new Error(`No embedding model for provider model \"${modelId}\"`)\n },\n imageModel(modelId) {\n throw new Error(`No image model for provider model \"${modelId}\"`)\n },\n }\n}\n","import type { ModelProfile } from '@vostride/agent-qa-schema'\n\nexport function validateProfile(profile: ModelProfile): void {\n if (profile.provider === 'openai-compatible' && !profile.baseURL?.trim()) {\n throw new Error('OpenAI-Compatible provider requires a baseURL')\n }\n\n if (profile.provider === 'anthropic-compatible' && !profile.baseURL?.trim()) {\n throw new Error('Anthropic-Compatible provider requires a baseURL')\n }\n\n if (\n profile.headers\n && profile.provider !== 'anthropic-compatible'\n && profile.provider !== 'openai-compatible'\n ) {\n throw new Error(\n `${displayProvider(profile.provider)} provider custom headers are only supported on anthropic-compatible`,\n )\n }\n}\n\nfunction displayProvider(provider: string): string {\n switch (provider) {\n case 'openai-compatible':\n return 'OpenAI-Compatible'\n case 'anthropic-compatible':\n return 'Anthropic-Compatible'\n case 'openai-subscription':\n return 'OpenAI Subscription'\n case 'anthropic-subscription':\n return 'Anthropic Subscription'\n case 'gemini':\n return 'Gemini'\n default:\n return provider\n }\n}\n","import type { LanguageModelV3GenerateResult, LanguageModelV3Usage } from '@ai-sdk/provider'\nimport type { MaskFn } from '@vostride/agent-qa-schema'\n\n/** Neutral facts for one completed provider dispatch. Missing facts are omitted. */\nexport interface ModelCallReport {\n inputTokens?: number\n outputTokens?: number\n cachedInputTokens?: number\n respondingModelId?: string\n}\n\nexport type ModelCallEvent =\n | { kind: 'start' }\n | { kind: 'success'; report: ModelCallReport }\n | { kind: 'failure' }\n\nexport const MODEL_CALL_EVENT_KINDS = [\n 'start', 'success', 'failure',\n] as const satisfies readonly ModelCallEvent['kind'][]\n\n/** An explicit assertion that raw usage and response metadata retain this wire origin. */\nexport type ModelCallReportOrigin =\n | 'openai-chat'\n | 'openai-responses'\n | 'anthropic-messages'\n | 'gemini'\n\nexport const MODEL_CALL_REPORT_ORIGINS = [\n 'openai-chat', 'openai-responses', 'anthropic-messages', 'gemini',\n] as const satisfies readonly ModelCallReportOrigin[]\n\nexport interface ModelCallObservation {\n /** Legacy notification, invoked once per dispatch, without provider data. */\n onProviderCall?: () => void\n /** No prompts, credentials, response bodies or error text cross this callback. */\n onCall?: (event: ModelCallEvent) => void\n}\n\nfunction count(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value)\n && Number.isInteger(value) && value >= 0 ? value : undefined\n}\n\nfunction object(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown> : undefined\n}\n\n/** Model-owner only: never infer origin from a model/provider name supplied by a custom model. */\nexport function providerCallReport(\n result: Pick<LanguageModelV3GenerateResult, 'usage' | 'response'>,\n origin: ModelCallReportOrigin | undefined,\n mask: MaskFn,\n): ModelCallReport {\n const inputTokens = count(result.usage.inputTokens.total)\n const outputTokens = count(result.usage.outputTokens.total)\n const cachedInputTokens = rawCacheCount(result.usage, origin)\n // Google 3.0.67 preserves modelVersion in the raw body but leaves modelId TODO.\n // This is still provider-origin metadata, never the requested model fallback.\n const modelId = origin === undefined ? undefined : result.response?.modelId\n ?? (origin === 'gemini' ? object(result.response?.body)?.modelVersion : undefined)\n const respondingModelId = typeof modelId === 'string' && modelId.length > 0\n ? mask(modelId) : undefined\n return {\n ...(inputTokens === undefined ? {} : { inputTokens }),\n ...(outputTokens === undefined ? {} : { outputTokens }),\n ...(cachedInputTokens === undefined ? {} : { cachedInputTokens }),\n ...(respondingModelId === undefined ? {} : { respondingModelId }),\n }\n}\n\nfunction rawCacheCount(usage: LanguageModelV3Usage, origin: ModelCallReportOrigin | undefined) {\n const raw = object(usage.raw)\n if (!raw) return undefined\n switch (origin) {\n case 'openai-chat': return count(object(raw.prompt_tokens_details)?.cached_tokens)\n case 'openai-responses': return count(object(raw.input_tokens_details)?.cached_tokens)\n case 'anthropic-messages': return count(raw.cache_read_input_tokens)\n case 'gemini': return count(raw.cachedContentTokenCount)\n case undefined: return undefined\n default: {\n const exhaustive: never = origin\n return exhaustive\n }\n }\n}\n","export interface VisionSizingConfig {\n screenshotSize?: number\n effectiveResolution?: number\n}\n\nexport function resolveVisionConfig(\n servicesVision: VisionSizingConfig | undefined,\n): VisionSizingConfig {\n return {\n screenshotSize: servicesVision?.screenshotSize,\n effectiveResolution: servicesVision?.effectiveResolution,\n }\n}\n","export interface VisionGate {\n attachImage: boolean\n captureMode: 'full' | 'textOnly'\n promptNote: string\n}\n\nconst TEXT_ONLY_PROMPT_NOTE = [\n 'Visual screenshot is unavailable for this step.',\n 'Rely on the accessibility tree and DOM context for element identification, including roles, names, values, refs, and URLs.',\n 'Verify functional state from the available structured context rather than purely visual appearance.',\n].join(' ')\n\n/** 439 D-19: the configured `vision` when set, otherwise what the capability table says. */\nexport function visionFromConfig(\n configured: boolean | undefined,\n capabilities: { vision: boolean },\n): boolean {\n return configured ?? capabilities.vision\n}\n\nexport function resolveVisionGate(model: { vision: boolean }): VisionGate {\n if (model.vision) {\n return {\n attachImage: true,\n captureMode: 'full',\n promptNote: '',\n }\n }\n\n return {\n attachImage: false,\n captureMode: 'textOnly',\n promptNote: TEXT_ONLY_PROMPT_NOTE,\n }\n}\n"],"mappings":"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","names":["import_ai","TRUNCATION_MARKER","safeStringify","degrade","isRecord","count","safeStringify","import_ai","import_provider","import_provider","import_ai","provider","registry"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/adapters/anthropic.ts","../src/auth.ts","../src/adapters/gemini.ts","../src/adapters/openai.ts","../src/accounting/compact.ts","../src/capability/overflow-parse.ts","../src/accounting/degrade.ts","../src/accounting/token-accounting.ts","../src/capability/family-table.ts","../src/capability/override-store.ts","../src/capability/resolve.ts","../src/catalog/catalog.ts","../src/catalog/live.ts","../src/middleware.ts","../src/middleware/capability-update.ts","../src/middleware/debug-logging.ts","../src/middleware/drop-empty-messages.ts","../src/middleware/examples.ts","../src/middleware/extract-json.ts","../src/middleware/repair.ts","../src/middleware/retry.ts","../src/middleware/classify.ts","../src/middleware/strip-unsupported-params.ts","../src/providers/builtins.ts","../src/providers/registry.ts","../src/registry.ts","../src/validate.ts","../src/provider-call-report.ts","../src/vision/resolve-config.ts","../src/vision/resolve-gate.ts"],"sourcesContent":["export { anthropicCompatible, anthropicSubscription } from './adapters/anthropic'\nexport { getProviderOptions } from './adapters/index'\nexport type { AdapterBody } from './adapters/index'\nexport { gemini } from './adapters/gemini'\nexport { openaiCompatible, openaiSubscription } from './adapters/openai'\nexport { compactLogs } from './accounting/compact'\nexport { guardBlob, guardToolOutput } from './accounting/compact'\nexport type { LogEntry } from './accounting/compact'\nexport { isContextLengthOverflow } from './accounting/overflow'\nexport { createTokenAccounting } from './accounting/token-accounting'\nexport type {\n DegradeOptions,\n DegradeOutcome,\n TokenAccounting,\n TokenAccountingOptions,\n} from './accounting/types'\nexport { deriveTransport } from './auth'\nexport type { ResolvedModelAuth, Transport } from './auth'\nexport { FAMILIES, UNKNOWN_FLOOR, matchFamily } from './capability/family-table'\nexport { capabilityKey, getObservedWindow, overrideStore } from './capability/override-store'\nexport { isContextOverflow, parseRealWindow } from './capability/overflow-parse'\nexport { resolveCapabilities } from './capability/resolve'\nexport { MODEL_CATALOG, getModelCatalog } from './catalog/catalog'\nexport type { CatalogEntry } from './catalog/catalog'\nexport { fetchLiveModels, mergeCatalog } from './catalog/live'\nexport { toolSchemaMiddleware } from './middleware'\nexport { capabilityUpdateMiddleware } from './middleware/capability-update'\nexport { debugLoggingMiddleware } from './middleware/debug-logging'\nexport type { DebugLoggingOptions } from './middleware/debug-logging'\nexport { dropEmptyMessagesMiddleware } from './middleware/drop-empty-messages'\nexport { deriveExamplesMiddleware } from './middleware/examples'\nexport { extractJsonStrategy } from './middleware/extract-json'\nexport { repairMiddleware } from './middleware/repair'\nexport { retryMiddleware } from './middleware/retry'\nexport { stripUnsupportedParamsMiddleware } from './middleware/strip-unsupported-params'\nexport { clearProviderRegistry, getProvider, listProviders, registerProvider } from './providers/registry'\nexport type { ProviderAuthMode, ProviderDescriptor } from './providers/registry'\nexport { createModel } from './registry'\nexport type { ModelCallObservation, ModelProviderOverrides } from './registry'\nexport { MODEL_CALL_EVENT_KINDS, MODEL_CALL_REPORT_ORIGINS } from './provider-call-report'\nexport type { ModelCallEvent, ModelCallReport, ModelCallReportOrigin } from './provider-call-report'\nexport { validateProfile } from './validate'\nexport { resolveVisionConfig } from './vision/resolve-config'\nexport type { VisionSizingConfig } from './vision/resolve-config'\nexport { resolveVisionGate, visionFromConfig } from './vision/resolve-gate'\nexport type { VisionGate } from './vision/resolve-gate'\nexport type {\n ModelAuthDeclaration,\n ModelCapabilities,\n ModelProfile,\n ModelProviderId,\n} from '@vostride/agent-qa-schema'\n","import { createAnthropic } from '@ai-sdk/anthropic'\n\nimport type { LanguageModelV3 } from '@ai-sdk/provider'\n\nimport { applyProviderOptions } from '../auth.js'\nimport type { Transport } from '../auth.js'\n\nexport function anthropicCompatible(transport: Transport, modelId: string): LanguageModelV3 {\n return applyProviderOptions(\n createAnthropic({\n baseURL: transport.baseURL,\n headers: transport.headers,\n fetch: transport.fetch,\n ...(transport.authToken\n ? { authToken: transport.authToken }\n : { apiKey: transport.apiKey ?? 'anthropic-compatible' }),\n })(modelId),\n transport,\n )\n}\n\nexport function anthropicSubscription(transport: Transport, modelId: string): LanguageModelV3 {\n return applyProviderOptions(\n createAnthropic({\n apiKey: transport.apiKey ?? 'placeholder',\n fetch: transport.fetch,\n })(modelId),\n transport,\n )\n}\n","import { defaultSettingsMiddleware, wrapLanguageModel } from 'ai'\n\nimport type { LanguageModelV3, LanguageModelV3CallOptions } from '@ai-sdk/provider'\nimport type { ModelProfile } from '@vostride/agent-qa-schema'\n\nexport type ResolvedModelAuth =\n | { kind: 'api-key'; apiKey: string }\n | { kind: 'bearer-token'; token: string }\n | {\n kind: 'auth-fetch'\n modelAdapter: 'openai-responses' | 'anthropic-messages'\n fetch: typeof globalThis.fetch\n }\n | { kind: 'none' }\n\nexport interface Transport {\n baseURL?: string\n headers?: Record<string, string>\n apiKey?: string\n authToken?: string\n fetch?: typeof globalThis.fetch\n providerOptions?: ModelProfile['providerOptions']\n}\n\nexport function deriveTransport(profile: ModelProfile, auth: ResolvedModelAuth): Transport {\n const transport: Transport = {\n ...(profile.baseURL ? { baseURL: profile.baseURL } : {}),\n ...(profile.headers ? { headers: profile.headers } : {}),\n ...(profile.providerOptions ? { providerOptions: profile.providerOptions } : {}),\n }\n\n switch (auth.kind) {\n case 'api-key':\n return { ...transport, apiKey: auth.apiKey }\n case 'bearer-token':\n return { ...transport, authToken: auth.token }\n case 'auth-fetch':\n return { ...transport, apiKey: placeholderApiKey(profile.provider), fetch: auth.fetch }\n case 'none':\n return { ...transport, apiKey: placeholderApiKey(profile.provider) }\n }\n}\n\nexport function applyProviderOptions(model: LanguageModelV3, transport: Transport): LanguageModelV3 {\n if (!transport.providerOptions) return model\n\n return wrapLanguageModel({\n model,\n middleware: defaultSettingsMiddleware({\n settings: {\n providerOptions: transport.providerOptions as LanguageModelV3CallOptions['providerOptions'],\n },\n }),\n })\n}\n\nfunction placeholderApiKey(provider: string): string {\n switch (provider) {\n case 'openai-compatible':\n return 'openai-compatible'\n case 'anthropic-compatible':\n return 'anthropic-compatible'\n default:\n return 'placeholder'\n }\n}\n","import { createGoogleGenerativeAI } from '@ai-sdk/google'\n\nimport type { LanguageModelV3 } from '@ai-sdk/provider'\n\nimport { applyProviderOptions } from '../auth.js'\nimport type { Transport } from '../auth.js'\n\nexport function gemini(transport: Transport, modelId: string): LanguageModelV3 {\n return applyProviderOptions(\n createGoogleGenerativeAI({\n apiKey: transport.apiKey,\n fetch: transport.fetch,\n })(modelId),\n transport,\n )\n}\n","import { createOpenAI } from '@ai-sdk/openai'\n\nimport type { LanguageModelV3 } from '@ai-sdk/provider'\n\nimport { applyProviderOptions } from '../auth.js'\nimport type { Transport } from '../auth.js'\n\ntype JSONValue = string | number | boolean | null | JSONValue[] | { [key: string]: JSONValue | undefined }\n\nexport type ProviderOptions = Record<string, Record<string, JSONValue | undefined>> | undefined\n\nexport interface ProviderOptionsConfig {\n provider?: string\n modelAdapter?: 'openai-responses' | 'anthropic-messages'\n fetch?: typeof globalThis.fetch\n}\n\nexport function openaiCompatible(transport: Transport, modelId: string): LanguageModelV3 {\n return applyProviderOptions(\n createOpenAI({\n apiKey: transport.apiKey ?? 'openai-compatible',\n baseURL: transport.baseURL,\n fetch: transport.fetch,\n ...(transport.headers ? { headers: transport.headers } : {}),\n }).chat(modelId),\n transport,\n )\n}\n\nexport function openaiSubscription(transport: Transport, modelId: string): LanguageModelV3 {\n return applyProviderOptions(\n createOpenAI({\n apiKey: transport.apiKey ?? 'placeholder',\n fetch: transport.fetch,\n }).responses(modelId),\n transport,\n )\n}\n\nexport function getProviderOptions(config: ProviderOptionsConfig): ProviderOptions {\n if (\n config.fetch\n && (config.modelAdapter === 'openai-responses'\n || (!config.modelAdapter && config.provider === 'openai-subscription'))\n ) {\n return {\n openai: {\n instructions: 'You are a helpful assistant.',\n store: false,\n },\n }\n }\n return undefined\n}\n","// Deterministic and pure: no clock, no randomness, sorted keys, so no run-to-run variance leaks.\n\nexport type LogEntry = { source: string; level?: string; message: string }\n\nconst DEFAULT_LEVEL = 'log'\nconst MAX_SAMPLES = 5\nconst SAMPLE_PREFIX = ' · '\nconst TRUNCATION_MARKER = '…[truncated to fit context budget]'\n\n// A single structured value is one thing, not a burst, so it gets a far larger bound.\nconst BLOB_CEILING = 8000\n\n// Variable-token normalization, applied in this fixed precedence so a broader\n// pattern never chews a narrower one (UUID/timestamp/IP before bare hex/number).\n// `<*>` carries no digits, so a replaced token is never re-matched by a later rule.\nconst PLACEHOLDER = '<*>'\nconst NORMALIZERS: readonly RegExp[] = [\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, // UUID\n /\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:?\\d{2})?/g, // ISO timestamp\n /\\b(?:[0-9a-f]{1,4}:){2,}[0-9a-f]{0,4}\\b/gi, // IPv6-ish\n /\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b/g, // IPv4\n /\\b0x[0-9a-f]+\\b/gi, // hex literal\n /\\b[0-9a-f]{7,}\\b/gi, // long bare hex id\n /\\b\\d+(?:\\.\\d+)?\\b/g, // bare number (last)\n]\n\nfunction normalize(message: string): string {\n let out = message\n for (const pattern of NORMALIZERS) out = out.replace(pattern, PLACEHOLDER)\n return out\n}\n\ntype LogClass = { source: string; level: string; normalized: string; count: number; samples: string[] }\n\n// Samples are the first five seen, so a growing burst never changes which are shown.\nexport function compactLogs(entries: LogEntry[]): string {\n const classes = new Map<string, LogClass>()\n\n for (const entry of entries) {\n const level = entry.level ?? DEFAULT_LEVEL\n const normalized = normalize(entry.message)\n const key = `${entry.source}::${level}::${normalized}`\n const existing = classes.get(key)\n if (existing) {\n existing.count++\n if (existing.samples.length < MAX_SAMPLES) existing.samples.push(entry.message)\n } else {\n classes.set(key, { source: entry.source, level, normalized, count: 1, samples: [entry.message] })\n }\n }\n\n const sortedKeys = [...classes.keys()].sort()\n const blocks: string[] = []\n for (const key of sortedKeys) {\n const klass = classes.get(key)\n if (klass === undefined) continue\n const header = `[${klass.source}] ${klass.level} ×${klass.count}: ${klass.normalized}`\n const lines = klass.samples.map(sample => `${SAMPLE_PREFIX}${sample}`)\n blocks.push([header, ...lines].join('\\n'))\n }\n return blocks.join('\\n')\n}\n\n// Variable tokens stay verbatim; never throws on cyclic input.\nexport function guardBlob(value: unknown): string | undefined {\n if (value === undefined) return undefined\n const str = safeStringify(value)\n if (str.length <= BLOB_CEILING) return str\n return str.slice(0, BLOB_CEILING) + TRUNCATION_MARKER\n}\n\ntype ConsoleShaped = { text?: unknown; message?: unknown; level?: unknown; source?: unknown }\ntype NetworkShaped = { url?: unknown; method?: unknown; status?: unknown }\n\nfunction asLogEntry(value: unknown): LogEntry | undefined {\n if (typeof value !== 'object' || value === null) return undefined\n const c = value as ConsoleShaped\n const text = typeof c.text === 'string' ? c.text : typeof c.message === 'string' ? c.message : undefined\n if (text !== undefined) {\n return {\n source: typeof c.source === 'string' ? c.source : 'console',\n level: typeof c.level === 'string' ? c.level : undefined,\n message: text,\n }\n }\n const n = value as NetworkShaped\n if (typeof n.url === 'string' && typeof n.method === 'string') {\n return {\n source: 'network',\n level: n.status === undefined ? undefined : String(n.status),\n message: `${n.method} ${n.url}`,\n }\n }\n return undefined\n}\n\n// Compacted output is still bounded by the blob ceiling, so distinct classes cannot flood it.\nexport function guardToolOutput(value: unknown): string | undefined {\n if (Array.isArray(value) && value.length > 0) {\n const entries = value.map(asLogEntry)\n if (entries.every((e): e is LogEntry => e !== undefined)) {\n const compacted = compactLogs(entries)\n if (compacted.length <= BLOB_CEILING) return compacted\n return compacted.slice(0, BLOB_CEILING) + TRUNCATION_MARKER\n }\n }\n return guardBlob(value)\n}\n\n// Cycle-safe stringify preserving key order; never throws.\nfunction safeStringify(value: unknown): string {\n const seen = new WeakSet<object>()\n try {\n return (\n JSON.stringify(value, (_key, node) => {\n if (typeof node === 'object' && node !== null) {\n if (seen.has(node)) return '[Circular]'\n seen.add(node)\n }\n return node\n }) ?? 'undefined'\n )\n } catch {\n return '[unserializable]'\n }\n}\n","import { APICallError } from '@ai-sdk/provider'\n\nconst PATTERNS = [\n /maximum context length is (\\d+) tokens/i,\n />\\s*(\\d+)\\s*maximum/i,\n /maximum number of tokens allowed \\((\\d+)\\)/i,\n] as const\n\nconst MIN_WINDOW = 512\nconst MAX_WINDOW = 10_000_000\n\nexport function parseRealWindow(error: unknown): number | undefined {\n if (!APICallError.isInstance(error) || error.statusCode !== 400) return undefined\n\n const text = `${error.message ?? ''}\\n${error.responseBody ?? ''}`\n for (const pattern of PATTERNS) {\n const match = pattern.exec(text)\n if (!match) continue\n\n const parsed = Number.parseInt(match[1], 10)\n if (Number.isFinite(parsed) && parsed >= MIN_WINDOW && parsed <= MAX_WINDOW) {\n return parsed\n }\n }\n\n return undefined\n}\n\nexport function isContextOverflow(error: unknown): boolean {\n return parseRealWindow(error) !== undefined\n}\n","// Hygiene runs every call; eviction and truncation only while the estimate exceeds the budget.\n\nimport { pruneMessages, type ModelMessage, type ToolContent, type ToolResultPart } from 'ai'\n\nimport type { DegradeOptions, DegradeOutcome } from './types.js'\n\ntype ToolOutput = ToolResultPart['output']\ntype ToolPart = ToolContent[number]\n\nconst SCREENSHOT_OMITTED = '…[historical screenshot omitted]'\nconst DUPLICATE_ELIDED = '…[duplicate tool result elided]'\nconst TRUNCATION_MARKER = '…[truncated to fit context budget]'\n\n// System, final and pinned messages are never evicted; if they alone overflow, cannot-fit.\nexport function degrade(messages: ModelMessage[], options: DegradeOptions): DegradeOutcome {\n const estimate = options.estimate ?? defaultEstimate\n let working = runHygiene(messages)\n\n // Hard floor: protected content alone exceeds the budget.\n if (estimate(protectedMessages(working, options)) > options.budget) {\n return { ok: false, reason: 'pinned-content-exceeds-budget', messages: working }\n }\n\n // Damage — eviction: remove the oldest unpinned tool exchange, re-estimate, repeat.\n while (estimate(working) > options.budget) {\n const evicted = evictOldestExchange(working, options)\n if (!evicted) break\n working = evicted\n }\n\n // Damage — proportional truncation of the largest remaining unpinned message.\n const exhausted = new Set<number>()\n while (estimate(working) > options.budget) {\n const isProtectedAt = makeIsProtected(working, options)\n let targetIndex = -1\n let targetLength = 0\n working.forEach((message, index) => {\n if (isProtectedAt(index) || exhausted.has(index)) return\n const length = messageTextLength(message)\n if (length > targetLength) {\n targetLength = length\n targetIndex = index\n }\n })\n if (targetIndex === -1 || targetLength === 0) break\n\n const overshootChars = Math.max(1, (estimate(working) - options.budget) * 4)\n const keepChars = Math.max(0, targetLength - overshootChars)\n const truncatedMessage = truncateMessage(working[targetIndex], keepChars)\n\n if (messageTextLength(truncatedMessage) >= messageTextLength(working[targetIndex])) {\n exhausted.add(targetIndex)\n continue\n }\n working = working.map((message, index) => (index === targetIndex ? truncatedMessage : message))\n if (keepChars === 0) exhausted.add(targetIndex)\n }\n\n return { ok: true, messages: working }\n}\n\n/** Fallback estimator (~chars/4) for standalone `degrade`; the factory passes its own. */\nfunction defaultEstimate(messages: ModelMessage[]): number {\n let chars = 0\n for (const message of messages) chars += messageTextLength(message)\n return Math.ceil(chars / 4)\n}\n\n// System, final and caller-pinned messages are the protected set.\nfunction makeIsProtected(messages: ModelMessage[], options: DegradeOptions): (index: number) => boolean {\n const lastIndex = messages.length - 1\n return (index: number): boolean => {\n const message = messages[index]\n if (message.role === 'system') return true\n if (index === lastIndex) return true\n return options.pin ? options.pin(message, index) === true : false\n }\n}\n\nfunction protectedMessages(messages: ModelMessage[], options: DegradeOptions): ModelMessage[] {\n const isProtectedAt = makeIsProtected(messages, options)\n return messages.filter((_, index) => isProtectedAt(index))\n}\n\nfunction toolCallIdsOf(message: ModelMessage): string[] {\n if (message.role !== 'assistant' || !Array.isArray(message.content)) return []\n const ids: string[] = []\n for (const part of message.content) if (part.type === 'tool-call') ids.push(part.toolCallId)\n return ids\n}\n\nfunction resultIdsOf(message: ModelMessage): string[] {\n const ids: string[] = []\n if (message.role === 'tool') {\n for (const part of message.content) if (part.type === 'tool-result') ids.push(part.toolCallId)\n } else if (message.role === 'assistant' && Array.isArray(message.content)) {\n for (const part of message.content) if (part.type === 'tool-result') ids.push(part.toolCallId)\n }\n return ids\n}\n\n// Evicts a tool call with all its results; an exchange touching protected content is skipped.\nfunction evictOldestExchange(messages: ModelMessage[], options: DegradeOptions): ModelMessage[] | undefined {\n const isProtectedAt = makeIsProtected(messages, options)\n for (let i = 0; i < messages.length; i++) {\n const callIds = toolCallIdsOf(messages[i])\n if (callIds.length === 0) continue\n const idSet = new Set(callIds)\n const exchange = new Set<number>([i])\n for (let j = 0; j < messages.length; j++) {\n if (j === i) continue\n if (resultIdsOf(messages[j]).some(id => idSet.has(id))) exchange.add(j)\n }\n let evictable = true\n for (const index of exchange) {\n if (isProtectedAt(index)) {\n evictable = false\n break\n }\n }\n if (!evictable) continue\n return messages.filter((_, index) => !exchange.has(index))\n }\n return undefined\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction messageTextLength(message: ModelMessage): number {\n const content = message.content\n if (typeof content === 'string') return content.length\n let total = 0\n for (const part of content as unknown[]) total += partTextLength(part)\n return total\n}\n\nfunction partTextLength(part: unknown): number {\n if (!isRecord(part)) return 0\n if (part.type === 'text' && typeof part.text === 'string') return part.text.length\n if (part.type === 'tool-result') return outputTextLength(part.output)\n return 0\n}\n\nfunction outputTextLength(output: unknown): number {\n if (!isRecord(output)) return 0\n if ((output.type === 'text' || output.type === 'error-text') && typeof output.value === 'string') {\n return output.value.length\n }\n if (output.type === 'content' && Array.isArray(output.value)) {\n let total = 0\n for (const item of output.value) {\n if (isRecord(item) && item.type === 'text' && typeof item.text === 'string') total += item.text.length\n }\n return total\n }\n return 0\n}\n\n/** Proportionally truncate a message's largest text-bearing part, appending the spec marker. */\nfunction truncateMessage(message: ModelMessage, keepChars: number): ModelMessage {\n const content = message.content\n if (typeof content === 'string') {\n return { ...message, content: sliceWithMarker(content, keepChars) } as ModelMessage\n }\n\n const parts = content as unknown[]\n let largestIndex = -1\n let largestLength = -1\n parts.forEach((part, index) => {\n const length = partTextLength(part)\n if (length > largestLength) {\n largestLength = length\n largestIndex = index\n }\n })\n if (largestIndex === -1 || largestLength <= 0) return message\n\n const removeTarget = Math.max(0, messageTextLength(message) - Math.max(0, keepChars))\n const partKeep = Math.max(0, largestLength - removeTarget)\n const newParts = parts.map((part, index) => (index === largestIndex ? truncatePart(part, partKeep) : part))\n return { ...message, content: newParts } as unknown as ModelMessage\n}\n\n/** Slice to `keep` chars + marker, first stripping any existing trailing marker so repeated\n * truncation of the same message converges monotonically instead of re-slicing the marker. */\nfunction sliceWithMarker(text: string, keep: number): string {\n const base = text.endsWith(TRUNCATION_MARKER) ? text.slice(0, text.length - TRUNCATION_MARKER.length) : text\n return base.slice(0, Math.max(0, keep)) + TRUNCATION_MARKER\n}\n\nfunction truncatePart(part: unknown, keep: number): unknown {\n if (!isRecord(part)) return part\n if (part.type === 'text' && typeof part.text === 'string') {\n return { ...part, text: sliceWithMarker(part.text, keep) }\n }\n if (part.type === 'tool-result') {\n return { ...part, output: truncateOutput(part.output, keep) }\n }\n return part\n}\n\nfunction truncateOutput(output: unknown, keep: number): unknown {\n if (!isRecord(output)) return output\n if ((output.type === 'text' || output.type === 'error-text') && typeof output.value === 'string') {\n return { ...output, value: sliceWithMarker(output.value, keep) }\n }\n return output\n}\n\n/**\n * Near-lossless hygiene: the SDK `pruneMessages` leg (reasoning strip keeping the last\n * message's reasoning + empty-message removal) followed by the custom tool-result clearing\n * lane. `pruneMessages` only removes parts; the clearing lane does the rewriting.\n */\nexport function runHygiene(messages: ModelMessage[]): ModelMessage[] {\n const pruned = pruneMessages({\n messages,\n reasoning: 'before-last-message',\n emptyMessages: 'remove',\n })\n return clearHistoricalToolResults(pruned)\n}\n\n/**\n * The clearing lane. The most recent tool message is preserved verbatim; every earlier\n * (historical) tool result has its screenshot base64 stripped and content-identical results\n * hash-deduped down to a one-liner. Rewrites parts, never removes them.\n */\nfunction clearHistoricalToolResults(messages: ModelMessage[]): ModelMessage[] {\n let lastToolIndex = -1\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === 'tool') {\n lastToolIndex = i\n break\n }\n }\n\n const seenHashes = new Set<string>()\n return messages.map((message, index) => {\n if (message.role !== 'tool' || index === lastToolIndex) return message\n const rewritten = message.content.map(part => rewriteHistoricalPart(part, seenHashes))\n return { ...message, content: rewritten }\n })\n}\n\nfunction rewriteHistoricalPart(part: ToolPart, seenHashes: Set<string>): ToolPart {\n if (part.type !== 'tool-result') return part\n\n const hash = contentHash(part.output)\n if (seenHashes.has(hash)) {\n return { ...part, output: { type: 'text', value: DUPLICATE_ELIDED } }\n }\n seenHashes.add(hash)\n\n const stripped = stripScreenshots(part.output)\n return stripped === part.output ? part : { ...part, output: stripped }\n}\n\n/** Replace historical `image-data`/`media` content parts with a text marker (drop the base64). */\nfunction stripScreenshots(output: ToolOutput): ToolOutput {\n if (output.type !== 'content') return output\n let changed = false\n const value = output.value.map(item => {\n if (item.type === 'image-data' || item.type === 'media') {\n changed = true\n return { type: 'text' as const, text: SCREENSHOT_OMITTED }\n }\n return item\n })\n return changed ? { type: 'content', value } : output\n}\n\n/**\n * Non-security content-identity hash (FNV-1a over a safe stringify). Identity only — NOT a\n * security control. Used solely to collapse content-identical historical tool results.\n */\nfunction contentHash(value: unknown): string {\n const str = safeStringify(value)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n return (hash >>> 0).toString(16)\n}\n\n// Never throws on cyclic values, and sorts keys so identical content hashes identically.\nfunction safeStringify(value: unknown): string {\n const ancestors: object[] = []\n const walk = (node: unknown): unknown => {\n if (node === null || typeof node !== 'object') return node\n if (ancestors.includes(node as object)) return '[Circular]'\n ancestors.push(node as object)\n let result: unknown\n if (Array.isArray(node)) {\n result = node.map(walk)\n } else {\n const sortedKeys = Object.keys(node as Record<string, unknown>).sort()\n const obj: Record<string, unknown> = {}\n for (const key of sortedKeys) obj[key] = walk((node as Record<string, unknown>)[key])\n result = obj\n }\n ancestors.pop()\n return result\n }\n try {\n return JSON.stringify(walk(value)) ?? 'undefined'\n } catch {\n return '[unserializable]'\n }\n}\n","// Closure-state factory over AI SDK `ModelMessage[]` only; provider-neutral.\n\nimport type { ModelMessage } from 'ai'\n\nimport { degrade as pureDegrade } from './degrade.js'\nimport type { DegradeOptions, DegradeOutcome, TokenAccounting, TokenAccountingOptions } from './types.js'\n\n// A conservative over-estimate of a large image; over-charging degrades early, the safe direction.\nconst DEFAULT_PER_IMAGE_TOKENS = 1600\n\ninterface Anchor {\n promptTokens: number\n prefixLength: number\n prefixDigest: string\n}\n\nexport function createTokenAccounting(options: TokenAccountingOptions): TokenAccounting {\n const perImageTokens = options.perImageTokens ?? DEFAULT_PER_IMAGE_TOKENS\n let anchor: Anchor | undefined\n\n function estimate(messages: ModelMessage[]): number {\n let chars = 0\n let images = 0\n for (const message of messages) {\n chars += messageTextChars(message)\n images += messageImageCount(message)\n }\n let textTokens = Math.ceil(chars / 4)\n if (anchor !== undefined && prefixMatches(messages, anchor)) {\n textTokens = Math.max(textTokens, anchor.promptTokens)\n }\n return textTokens + images * perImageTokens\n }\n\n function recordUsage(usage: { inputTokens?: number }, messages: ModelMessage[]): void {\n const inputTokens = usage.inputTokens\n if (inputTokens === undefined) return\n anchor = { promptTokens: inputTokens, prefixLength: messages.length, prefixDigest: digestPrefix(messages) }\n }\n\n function getCeilings(): { contextWindow: number; maxOutput: number } {\n const c = options.getCapabilities()\n return { contextWindow: c.contextWindow, maxOutput: c.maxOutput }\n }\n\n function degrade(messages: ModelMessage[], opts: DegradeOptions): DegradeOutcome {\n return pureDegrade(messages, { ...opts, estimate })\n }\n\n return { estimate, recordUsage, getCeilings, degrade }\n}\n\n// An identity match on the hashed prefix, never an array cursor.\nfunction prefixMatches(messages: ModelMessage[], anchor: Anchor): boolean {\n if (messages.length < anchor.prefixLength) return false\n const prefix = messages.length === anchor.prefixLength ? messages : messages.slice(0, anchor.prefixLength)\n return digestPrefix(prefix) === anchor.prefixDigest\n}\n\nfunction messageTextChars(message: ModelMessage): number {\n const content = message.content\n if (typeof content === 'string') return content.length\n let total = 0\n for (const part of content as unknown[]) total += partTextChars(part)\n return total\n}\n\nfunction partTextChars(part: unknown): number {\n if (!isRecord(part)) return 0\n if (part.type === 'text' && typeof part.text === 'string') return part.text.length\n if (part.type === 'tool-result') return outputTextChars(part.output)\n return 0\n}\n\nfunction outputTextChars(output: unknown): number {\n if (!isRecord(output)) return 0\n if ((output.type === 'text' || output.type === 'error-text') && typeof output.value === 'string') {\n return output.value.length\n }\n if (output.type === 'content' && Array.isArray(output.value)) {\n let total = 0\n for (const item of output.value) {\n if (isRecord(item) && item.type === 'text' && typeof item.text === 'string') total += item.text.length\n }\n return total\n }\n return 0\n}\n\n// One flat charge per image part, inline or in tool output; base64 length is never read.\nfunction messageImageCount(message: ModelMessage): number {\n const content = message.content\n if (typeof content === 'string') return 0\n let count = 0\n for (const part of content as unknown[]) {\n if (!isRecord(part)) continue\n if (part.type === 'image') count += 1\n else if (part.type === 'tool-result') count += outputImageCount(part.output)\n }\n return count\n}\n\nfunction outputImageCount(output: unknown): number {\n if (!isRecord(output) || output.type !== 'content' || !Array.isArray(output.value)) return 0\n let count = 0\n for (const item of output.value) {\n if (isRecord(item) && (item.type === 'image-data' || item.type === 'media')) count += 1\n }\n return count\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\n/** FNV-1a over a cycle-safe, key-sorted stringify of the message prefix — a content identity,\n * not a security control; used solely to detect when the anchored prefix diverges. */\nfunction digestPrefix(messages: ModelMessage[]): string {\n const str = safeStringify(messages)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n return `${messages.length}:${(hash >>> 0).toString(16)}`\n}\n\nfunction safeStringify(value: unknown): string {\n const ancestors: object[] = []\n const walk = (node: unknown): unknown => {\n if (node === null || typeof node !== 'object') return node\n if (ancestors.includes(node as object)) return '[Circular]'\n ancestors.push(node as object)\n let result: unknown\n if (Array.isArray(node)) {\n result = node.map(walk)\n } else {\n const sortedKeys = Object.keys(node as Record<string, unknown>).sort()\n const obj: Record<string, unknown> = {}\n for (const key of sortedKeys) obj[key] = walk((node as Record<string, unknown>)[key])\n result = obj\n }\n ancestors.pop()\n return result\n }\n try {\n return JSON.stringify(walk(value)) ?? 'undefined'\n } catch {\n return '[unserializable]'\n }\n}\n","import type { ModelCapabilities } from '@vostride/agent-qa-schema'\n\nexport interface FamilyEntry {\n match: readonly string[]\n caps: ModelCapabilities\n}\n\nfunction caps(\n contextWindow: number,\n maxOutput: number,\n vision: boolean,\n visionToolMessages: boolean,\n): ModelCapabilities {\n return {\n text: true,\n vision,\n visionToolMessages,\n toolCalling: true,\n structuredOutput: true,\n streaming: true,\n contextWindow,\n maxOutput,\n }\n}\n\nexport const UNKNOWN_FLOOR: ModelCapabilities = caps(8192, 4096, false, false)\n\nexport const FAMILIES: readonly FamilyEntry[] = [\n { match: ['claude-3-5-haiku', 'claude-haiku'], caps: caps(200000, 8192, true, true) },\n { match: ['claude-opus', 'claude-sonnet', 'claude-'], caps: caps(200000, 32000, true, true) },\n { match: ['gpt-4o'], caps: caps(128000, 16384, true, false) },\n { match: ['gpt-4.1'], caps: caps(1047576, 32768, true, false) },\n { match: ['gpt-5'], caps: caps(400000, 128000, true, false) },\n { match: ['o1', 'o3', 'o4'], caps: caps(200000, 100000, true, false) },\n { match: ['gpt-4'], caps: caps(8192, 4096, false, false) },\n { match: ['gpt-3.5'], caps: caps(16385, 4096, false, false) },\n { match: ['gpt-'], caps: caps(128000, 16384, true, false) },\n { match: ['gemini-2.5', 'gemini-3', 'gemini-1.5', 'gemini-'], caps: caps(1048576, 65536, true, true) },\n { match: ['gemini-2.0-flash'], caps: caps(1048576, 8192, true, true) },\n { match: ['deepseek-chat', 'deepseek-r1', 'deepseek-'], caps: caps(65536, 8192, false, false) },\n { match: ['qwen2.5-vl', 'qwen-vl', 'qwen2-vl'], caps: caps(32768, 8192, true, false) },\n { match: ['qwen'], caps: caps(32768, 8192, false, false) },\n { match: ['llava'], caps: caps(8192, 4096, true, false) },\n { match: ['llama-3-vision', 'llama3.2-vision', 'vision'], caps: caps(128000, 8192, true, false) },\n { match: ['llama-3', 'llama3'], caps: caps(128000, 8192, false, false) },\n { match: ['llama'], caps: caps(8192, 4096, false, false) },\n { match: ['pixtral'], caps: caps(128000, 8192, true, false) },\n { match: ['mixtral', 'mistral'], caps: caps(32768, 8192, false, false) },\n]\n\nconst BOUNDARIES = new Set(['-', '_', '.', '/', ':'])\n\nfunction matchesAtBoundary(id: string, token: string): boolean {\n let from = 0\n for (;;) {\n const idx = id.indexOf(token, from)\n if (idx === -1) return false\n if (idx === 0 || BOUNDARIES.has(id[idx - 1])) return true\n from = idx + 1\n }\n}\n\nexport function matchFamily(model: string): ModelCapabilities | undefined {\n const id = model.toLowerCase()\n let best: { length: number; caps: ModelCapabilities } | undefined\n\n for (const family of FAMILIES) {\n for (const match of family.match) {\n const normalized = match.toLowerCase()\n if (!matchesAtBoundary(id, normalized)) continue\n if (!best || normalized.length > best.length) {\n best = { length: normalized.length, caps: family.caps }\n }\n }\n }\n\n return best?.caps\n}\n","export const overrideStore = new Map<string, number>()\n\nexport function capabilityKey(provider: string, model: string): string {\n return `${provider}:${model.toLowerCase().trim()}`\n}\n\nexport function getObservedWindow(key: string): number | undefined {\n return overrideStore.get(key)\n}\n","import type { ModelCapabilities, ModelProfile } from '@vostride/agent-qa-schema'\n\nimport { matchFamily, UNKNOWN_FLOOR } from './family-table.js'\nimport { capabilityKey, getObservedWindow } from './override-store.js'\n\nexport function resolveCapabilities(profile: ModelProfile): ModelCapabilities {\n const base = matchFamily(profile.model) ?? UNKNOWN_FLOOR\n const declared = { ...base, ...(profile.capabilities ?? {}) }\n const observed = getObservedWindow(capabilityKey(profile.provider, profile.model))\n\n if (observed !== undefined) {\n return { ...declared, contextWindow: observed }\n }\n\n return declared\n}\n","import type { ModelProviderId } from '@vostride/agent-qa-schema'\n\nimport { matchFamily } from '../capability/family-table.js'\n\ninterface AuthoredEntry {\n id: string\n label: string\n notes?: string\n vision?: boolean\n}\n\nexport interface CatalogEntry {\n id: string\n label: string\n vision: boolean\n notes?: string\n}\n\nexport function deriveVision(id: string, override?: boolean): boolean {\n return override ?? matchFamily(id)?.vision ?? false\n}\n\nfunction expose(entry: AuthoredEntry): CatalogEntry {\n return {\n id: entry.id,\n label: entry.label,\n vision: deriveVision(entry.id, entry.vision),\n ...(entry.notes ? { notes: entry.notes } : {}),\n }\n}\n\nconst CLAUDE: readonly AuthoredEntry[] = [\n { id: 'claude-opus-4-8', label: 'Claude Opus 4.8' },\n { id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6' },\n { id: 'claude-haiku-4-5', label: 'Claude Haiku 4.5' },\n]\n\nconst OPENAI_CLOUD: readonly AuthoredEntry[] = [\n { id: 'gpt-5.5', label: 'GPT-5.5' },\n { id: 'gpt-4.1', label: 'GPT-4.1' },\n { id: 'o3', label: 'o3' },\n { id: 'o4-mini', label: 'o4-mini' },\n]\n\nconst LOCAL_OPENAI_WIRE: readonly AuthoredEntry[] = [\n {\n id: 'deepseek-chat',\n label: 'DeepSeek Chat',\n notes: 'Text-only model; use the accessibility tree.',\n },\n { id: 'deepseek-r1', label: 'DeepSeek R1', notes: 'Text-only reasoning model.' },\n { id: 'qwen2.5-vl', label: 'Qwen2.5 VL' },\n { id: 'llava', label: 'LLaVA' },\n { id: 'llama3.2-vision', label: 'Llama 3.2 Vision' },\n]\n\nconst GEMINI: readonly AuthoredEntry[] = [\n { id: 'gemini-3-flash-preview', label: 'Gemini 3 Flash Preview' },\n { id: 'gemini-2.5-pro', label: 'Gemini 2.5 Pro' },\n { id: 'gemini-2.5-flash', label: 'Gemini 2.5 Flash' },\n]\n\nconst AUTHORED: Record<ModelProviderId, readonly AuthoredEntry[]> = {\n 'openai-compatible': [...OPENAI_CLOUD, ...LOCAL_OPENAI_WIRE],\n 'anthropic-compatible': CLAUDE,\n 'openai-subscription': OPENAI_CLOUD,\n 'anthropic-subscription': CLAUDE,\n gemini: GEMINI,\n}\n\nfunction exposeCatalog(): Record<ModelProviderId, CatalogEntry[]> {\n return {\n 'openai-compatible': AUTHORED['openai-compatible'].map(expose),\n 'anthropic-compatible': AUTHORED['anthropic-compatible'].map(expose),\n 'openai-subscription': AUTHORED['openai-subscription'].map(expose),\n 'anthropic-subscription': AUTHORED['anthropic-subscription'].map(expose),\n gemini: AUTHORED.gemini.map(expose),\n }\n}\n\nexport const MODEL_CATALOG: Record<ModelProviderId, CatalogEntry[]> = exposeCatalog()\n\nexport function getModelCatalog(): Record<ModelProviderId, CatalogEntry[]> {\n return {\n 'openai-compatible': MODEL_CATALOG['openai-compatible'].map(entry => ({ ...entry })),\n 'anthropic-compatible': MODEL_CATALOG['anthropic-compatible'].map(entry => ({ ...entry })),\n 'openai-subscription': MODEL_CATALOG['openai-subscription'].map(entry => ({ ...entry })),\n 'anthropic-subscription': MODEL_CATALOG['anthropic-subscription'].map(entry => ({ ...entry })),\n gemini: MODEL_CATALOG.gemini.map(entry => ({ ...entry })),\n }\n}\n","import type { CatalogEntry } from './catalog.js'\nimport { matchFamily } from '../capability/family-table.js'\n\ninterface LiveCacheEntry {\n entries: CatalogEntry[]\n expiresAt: number\n}\n\nexport interface FetchLiveModelsOptions {\n baseURL: string\n headers?: Record<string, string>\n fetchImpl?: typeof globalThis.fetch\n timeoutMs?: number\n ttlMs?: number\n}\n\nconst liveCache = new Map<string, LiveCacheEntry>()\nconst DEFAULT_TIMEOUT_MS = 2500\nconst DEFAULT_TTL_MS = 60_000\nconst MAX_LIVE_MODELS = 1000\n\nfunction normalizeBaseURL(baseURL: string): string {\n return baseURL.trim().replace(/\\/+$/, '')\n}\n\nfunction cacheKey(baseURL: string): string {\n return normalizeBaseURL(baseURL).toLowerCase()\n}\n\nfunction liveEntry(id: string): CatalogEntry {\n return {\n id,\n label: id,\n vision: matchFamily(id)?.vision ?? false,\n }\n}\n\nfunction parseLiveBody(body: unknown): CatalogEntry[] {\n if (!body || typeof body !== 'object' || !Array.isArray((body as { data?: unknown }).data)) {\n return []\n }\n\n return (body as { data: unknown[] }).data\n .slice(0, MAX_LIVE_MODELS)\n .flatMap((model) => {\n if (!model || typeof model !== 'object') return []\n const id = (model as { id?: unknown }).id\n return typeof id === 'string' && id.trim() ? [liveEntry(id)] : []\n })\n}\n\nexport async function fetchLiveModels(opts: FetchLiveModelsOptions): Promise<CatalogEntry[]> {\n const normalized = normalizeBaseURL(opts.baseURL)\n if (!normalized) return []\n\n const now = Date.now()\n const key = cacheKey(normalized)\n const cached = liveCache.get(key)\n if (cached && cached.expiresAt > now) return cached.entries\n\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS)\n\n try {\n const doFetch = opts.fetchImpl ?? globalThis.fetch\n const res = await doFetch(`${normalized}/models`, {\n signal: controller.signal,\n ...(opts.headers ? { headers: opts.headers } : {}),\n })\n\n if (!res.ok) return []\n\n const entries = parseLiveBody(await res.json())\n liveCache.set(key, {\n entries,\n expiresAt: Date.now() + (opts.ttlMs ?? DEFAULT_TTL_MS),\n })\n return entries\n } catch {\n return []\n } finally {\n clearTimeout(timeout)\n }\n}\n\nexport function mergeCatalog(staticEntries: CatalogEntry[], live: CatalogEntry[]): CatalogEntry[] {\n const seen = new Set(staticEntries.map(entry => entry.id.toLowerCase()))\n return [...staticEntries, ...live.filter(entry => !seen.has(entry.id.toLowerCase()))]\n}\n","import type { LanguageModelMiddleware } from 'ai'\n\nexport const toolSchemaMiddleware: LanguageModelMiddleware = {\n specificationVersion: 'v3',\n\n transformParams: async ({ params }) => {\n if (!params.tools) return params\n\n return {\n ...params,\n tools: params.tools.map((t: any) => {\n if (t.type !== 'function') return t\n const schema = { ...t.inputSchema }\n if ('$schema' in schema) delete schema.$schema\n if (!schema.type) schema.type = 'object'\n return { ...t, inputSchema: schema }\n }),\n }\n },\n}\n","import type { LanguageModelMiddleware } from 'ai'\nimport type { ModelProfile } from '@vostride/agent-qa-schema'\n\nimport { capabilityKey, overrideStore } from '../capability/override-store.js'\nimport { parseRealWindow } from '../capability/overflow-parse.js'\n\nexport function capabilityUpdateMiddleware(profile: ModelProfile): LanguageModelMiddleware {\n const key = capabilityKey(profile.provider, profile.model)\n\n async function observe<T>(call: () => PromiseLike<T>): Promise<T> {\n try {\n return await call()\n } catch (error) {\n const observedWindow = parseRealWindow(error)\n if (observedWindow !== undefined) {\n overrideStore.set(key, observedWindow)\n }\n throw error\n }\n }\n\n return {\n specificationVersion: 'v3',\n wrapGenerate: ({ doGenerate }) => observe(doGenerate),\n wrapStream: ({ doStream }) => observe(doStream),\n }\n}\n","import type { LanguageModelMiddleware } from 'ai'\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Prompt,\n} from '@ai-sdk/provider'\n\n// Gated by `AGENT_QA_DEBUG_LLM`; a line carries no header value, query string or provider text.\n\nexport interface DebugLoggingOptions {\n /** Force enable/disable. When omitted, resolves from the `AGENT_QA_DEBUG_LLM` env flag. */\n enabled?: boolean\n /** Line sink. Defaults to stderr. Injected by tests as a spy. */\n sink?: (line: string) => void\n}\n\nconst REQUEST_PREFIX = '[agent-qa:llm] request'\nconst ERROR_PREFIX = '[agent-qa:llm] provider-error'\n\nfunction isEnvEnabled(): boolean {\n const raw = typeof process !== 'undefined' ? process.env?.AGENT_QA_DEBUG_LLM : undefined\n if (typeof raw !== 'string') return false\n const value = raw.trim().toLowerCase()\n return value !== '' && value !== '0' && value !== 'false' && value !== 'off' && value !== 'no'\n}\n\nfunction modelIdOf(model: LanguageModelV3 | undefined): string {\n if (model && typeof model === 'object' && 'modelId' in model) {\n const id = (model as { modelId?: unknown }).modelId\n if (typeof id === 'string' && id.length > 0) return id\n }\n return 'unknown'\n}\n\nfunction requestShapeLine(params: LanguageModelV3CallOptions, model: LanguageModelV3 | undefined): string {\n const record = params as unknown as Record<string, unknown>\n const prompt = record.prompt as LanguageModelV3Prompt | undefined\n const messages = Array.isArray(prompt) ? prompt : []\n const roles = messages.map((message) => (message as { role?: unknown }).role ?? '?').join(',')\n const toolCount = Array.isArray(record.tools) ? record.tools.length : 0\n // Param KEYS only (never values) — so `maxOutputTokens`/`temperature`/`toolChoice` are visible\n // but a secret carried in a param value never is.\n const paramKeys = Object.keys(record)\n .filter((key) => key !== 'prompt' && key !== 'tools')\n .join(',')\n return `${REQUEST_PREFIX} model=${modelIdOf(model)} messages=${messages.length} roles=[${roles}] tools=${toolCount} params=[${paramKeys}]`\n}\n\n// Compact, non-sensitive projection of the provider's requestBodyValues: model id + message\n// roles only, so the emitted tool-call shape context is visible without dumping the body.\nfunction compactRequestBodyValues(value: unknown): string | undefined {\n if (value === null || typeof value !== 'object') return undefined\n const record = value as Record<string, unknown>\n const model = typeof record.model === 'string' ? record.model : undefined\n const items = Array.isArray(record.input)\n ? record.input\n : Array.isArray(record.messages)\n ? record.messages\n : undefined\n const roles = items?.map((item) =>\n item && typeof item === 'object' && 'role' in item ? String((item as { role: unknown }).role) : '?',\n )\n const parts: string[] = []\n if (model) parts.push(`model=${model}`)\n if (roles) parts.push(`roles=[${roles.join(',')}]`)\n return parts.length > 0 ? `{${parts.join(',')}}` : undefined\n}\n\nfunction originAndPath(url: unknown): string | undefined {\n if (typeof url !== 'string') return undefined\n try {\n const parsed = new URL(url)\n return `${parsed.origin}${parsed.pathname}`\n } catch {\n return undefined\n }\n}\n\nfunction stringField(record: unknown, key: string): string | undefined {\n if (record === null || typeof record !== 'object') return undefined\n const value = (record as Record<string, unknown>)[key]\n return typeof value === 'string' ? value : undefined\n}\n\nfunction providerErrorLine(err: unknown): string {\n const e = (err ?? {}) as {\n name?: unknown\n statusCode?: unknown\n isRetryable?: unknown\n url?: unknown\n responseHeaders?: unknown\n responseBody?: unknown\n requestBodyValues?: unknown\n data?: unknown\n message?: unknown\n }\n const statusCode = typeof e.statusCode === 'number' ? e.statusCode : undefined\n const url = originAndPath(e.url)\n const responseBody = typeof e.responseBody === 'string' ? e.responseBody : undefined\n const request = compactRequestBodyValues(e.requestBodyValues)\n const nested = e.data !== null && typeof e.data === 'object'\n ? (e.data as Record<string, unknown>).error\n : undefined\n const type = stringField(nested, 'type') ?? stringField(e.data, 'type')\n const code = stringField(nested, 'code') ?? stringField(e.data, 'code')\n const headerNames = e.responseHeaders !== null && typeof e.responseHeaders === 'object'\n ? Object.keys(e.responseHeaders)\n : undefined\n\n const parts = [ERROR_PREFIX]\n if (statusCode !== undefined) parts.push(`statusCode=${statusCode}`)\n if (typeof e.name === 'string') parts.push(`name=${e.name}`)\n if (typeof e.isRetryable === 'boolean') parts.push(`isRetryable=${e.isRetryable}`)\n if (url !== undefined) parts.push(`url=${url}`)\n if (type !== undefined) parts.push(`type=${type}`)\n if (code !== undefined) parts.push(`code=${code}`)\n if (headerNames !== undefined) parts.push(`responseHeaders=[${headerNames.join(',')}]`)\n if (responseBody !== undefined) parts.push(`responseBodyLength=${responseBody.length}`)\n if (request !== undefined) parts.push(`request=${request}`)\n if (statusCode === undefined && responseBody === undefined) {\n const message = e.message !== undefined ? String(e.message) : String(err)\n parts.push(`messageLength=${message.length}`)\n }\n return parts.join(' ')\n}\n\nexport function debugLoggingMiddleware(options: DebugLoggingOptions = {}): LanguageModelMiddleware {\n const enabled = options.enabled ?? isEnvEnabled()\n\n // Disabled ⇒ a pure passthrough: no wrap hooks at all, so behavior + performance are byte-\n // identical and the sink is never touched.\n if (!enabled) {\n return { specificationVersion: 'v3' }\n }\n\n const sink = options.sink ?? ((line: string) => { process.stderr.write(`${line}\\n`) })\n const emit = (line: string): void => { sink(line) }\n\n return {\n specificationVersion: 'v3',\n\n wrapGenerate: async ({ doGenerate, params, model }) => {\n emit(requestShapeLine(params, model))\n try {\n return await doGenerate()\n } catch (err) {\n emit(providerErrorLine(err))\n throw err\n }\n },\n\n wrapStream: async ({ doStream, params, model }) => {\n emit(requestShapeLine(params, model))\n try {\n return await doStream()\n } catch (err) {\n emit(providerErrorLine(err))\n throw err\n }\n },\n }\n}\n","import type { LanguageModelMiddleware } from 'ai'\nimport type { LanguageModelV3Message, LanguageModelV3Prompt } from '@ai-sdk/provider'\n\n// A second layer at egress: the OpenAI Responses API rejects empty message content with HTTP 400.\n\n// A message is \"empty\" when it contributes no content to the wire:\n// - system: its string content trims to empty\n// - user/assistant/tool: its content array has no part with non-empty text AND no\n// non-text part (a file/tool/reasoning part always keeps the message)\nfunction isEmptyMessage(message: LanguageModelV3Message): boolean {\n if (message.role === 'system') {\n return typeof message.content === 'string' && message.content.trim().length === 0\n }\n const parts = message.content\n if (!Array.isArray(parts) || parts.length === 0) return true\n for (const part of parts) {\n if (part.type === 'text' || part.type === 'reasoning') {\n if (typeof part.text === 'string' && part.text.trim().length > 0) return false\n } else {\n // Any non-text part (file/tool-call/tool-result/approval) is meaningful content.\n return false\n }\n }\n return true\n}\n\nexport function dropEmptyMessagesMiddleware(): LanguageModelMiddleware {\n return {\n specificationVersion: 'v3',\n\n transformParams: async ({ params }) => {\n const prompt = params.prompt as LanguageModelV3Prompt | undefined\n if (!prompt) return params\n const filtered = prompt.filter((message) => !isEmptyMessage(message))\n if (filtered.length === prompt.length) return params\n return { ...params, prompt: filtered }\n },\n }\n}\n","import type { LanguageModelMiddleware } from 'ai'\n\ntype JsonSchemaLike = {\n type?: string | string[]\n required?: string[]\n properties?: Record<string, JsonSchemaLike>\n}\n\ntype SampleInput = Record<string, unknown>\n\nexport function deriveExamplesMiddleware(): LanguageModelMiddleware {\n return {\n specificationVersion: 'v3',\n\n transformParams: async ({ params }) => {\n if (!params.tools) return params\n\n return {\n ...params,\n tools: params.tools.map((t: any) => {\n if (t.type !== 'function') return t\n if (t.inputExamples?.length) return t\n\n const input = sampleFromSchema(t.inputSchema)\n if (!input || Object.keys(input).length === 0) return t\n\n return { ...t, inputExamples: [{ input }] }\n }),\n }\n },\n }\n}\n\nexport function sampleFromSchema(inputSchema: JsonSchemaLike | undefined): SampleInput | undefined {\n const properties = inputSchema?.properties\n if (!properties || Object.keys(properties).length === 0) return undefined\n\n const fields =\n inputSchema?.required && inputSchema.required.length > 0\n ? inputSchema.required\n : Object.keys(properties)\n\n const input: SampleInput = {}\n for (const field of fields) {\n if (!properties[field]) continue\n input[field] = sampleValue(properties[field])\n }\n\n return Object.keys(input).length > 0 ? input : undefined\n}\n\nfunction sampleValue(schema: JsonSchemaLike): unknown {\n const type = Array.isArray(schema.type) ? schema.type[0] : schema.type\n\n switch (type) {\n case 'string':\n return ''\n case 'number':\n case 'integer':\n return 0\n case 'boolean':\n return false\n case 'array':\n return []\n case 'object':\n return {}\n default:\n return null\n }\n}\n","const MAX_SCAN_LENGTH = 200_000\n\nexport function extractJsonStrategy(text: string): string {\n const bounded = text.slice(0, MAX_SCAN_LENGTH)\n const fenced = bounded.match(/```(?:json)?[^\\S\\r\\n]*(?:\\r?\\n)?([\\s\\S]*?)```/i)\n if (fenced?.[1] !== undefined) return fenced[1].trim()\n\n const span = firstJsonSpan(bounded)\n if (span) return span.trim()\n\n return bounded.trim()\n}\n\nfunction firstJsonSpan(text: string): string | undefined {\n const start = firstJsonStart(text)\n if (start < 0) return undefined\n\n const opener = text[start]\n const closer = opener === '{' ? '}' : ']'\n let depth = 0\n let inString = false\n let escaped = false\n\n for (let index = start; index < text.length; index += 1) {\n const char = text[index]\n\n if (inString) {\n if (escaped) {\n escaped = false\n } else if (char === '\\\\') {\n escaped = true\n } else if (char === '\"') {\n inString = false\n }\n continue\n }\n\n if (char === '\"') {\n inString = true\n } else if (char === opener) {\n depth += 1\n } else if (char === closer) {\n depth -= 1\n if (depth === 0) return text.slice(start, index + 1)\n }\n }\n\n return undefined\n}\n\nfunction firstJsonStart(text: string): number {\n const objectStart = text.indexOf('{')\n const arrayStart = text.indexOf('[')\n if (objectStart < 0) return arrayStart\n if (arrayStart < 0) return objectStart\n return Math.min(objectStart, arrayStart)\n}\n","import { parsePartialJson, type LanguageModelMiddleware } from 'ai'\n\nexport function repairMiddleware(): LanguageModelMiddleware {\n return {\n specificationVersion: 'v3',\n\n async wrapGenerate({ doGenerate }) {\n const result = await doGenerate()\n const content = await Promise.all(\n result.content.map(async (part) => {\n if (part.type !== 'tool-call' || typeof part.input !== 'string') return part\n\n try {\n JSON.parse(part.input)\n return part\n } catch {\n const repaired = await parsePartialJson(part.input)\n if (\n (repaired.state === 'repaired-parse' || repaired.state === 'successful-parse') &&\n repaired.value !== undefined\n ) {\n return { ...part, input: JSON.stringify(repaired.value) }\n }\n\n return part\n }\n }),\n )\n\n return { ...result, content }\n },\n\n wrapStream({ doStream }) {\n // Tool-call JSON repair is load-bearing only for generated responses today.\n return doStream()\n },\n }\n}\n","import { APICallError } from '@ai-sdk/provider'\nimport type { LanguageModelMiddleware } from 'ai'\n\nimport { isTransientError } from './classify.js'\n\nexport interface RetryMiddlewareOptions {\n maxRetries?: number\n initialDelayInMs?: number\n backoffFactor?: number\n}\n\nexport function retryMiddleware({\n maxRetries = 2,\n initialDelayInMs = 1000,\n backoffFactor = 2,\n}: RetryMiddlewareOptions = {}): LanguageModelMiddleware {\n async function run<T>(call: () => PromiseLike<T>): Promise<T> {\n let delay = initialDelayInMs\n\n for (let attempt = 0; ; attempt += 1) {\n try {\n return await call()\n } catch (error) {\n if (isAbortError(error)) throw error\n if (!isTransientError(error) || attempt >= maxRetries) throw error\n\n const headerDelay = retryAfterMs(error, delay)\n await sleep(headerDelay ?? delay)\n delay *= backoffFactor\n }\n }\n }\n\n return {\n specificationVersion: 'v3',\n wrapGenerate: ({ doGenerate }) => run(doGenerate),\n wrapStream: ({ doStream }) => run(doStream),\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n return !!error && typeof error === 'object' && (error as { name?: unknown }).name === 'AbortError'\n}\n\nfunction retryAfterMs(error: unknown, delay: number): number | undefined {\n if (!APICallError.isInstance(error)) return undefined\n\n const headerMs = parseMs(error.responseHeaders?.['retry-after-ms'])\n if (headerMs !== undefined && shouldHonorRetryAfter(headerMs, delay)) return headerMs\n\n const retryAfter = error.responseHeaders?.['retry-after']\n const seconds = parseSeconds(retryAfter)\n if (seconds !== undefined && shouldHonorRetryAfter(seconds, delay)) return seconds\n\n return undefined\n}\n\nfunction parseMs(value: string | undefined): number | undefined {\n if (!value) return undefined\n\n const parsed = Number.parseInt(value, 10)\n return Number.isFinite(parsed) ? parsed : undefined\n}\n\nfunction parseSeconds(value: string | undefined): number | undefined {\n if (!value) return undefined\n\n const seconds = Number.parseFloat(value)\n if (Number.isFinite(seconds)) return Math.round(seconds * 1000)\n\n const date = Date.parse(value)\n if (Number.isNaN(date)) return undefined\n\n return date - Date.now()\n}\n\nfunction shouldHonorRetryAfter(ms: number, delay: number): boolean {\n return ms >= 0 && (ms < 60_000 || ms < delay)\n}\n\nfunction sleep(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve()\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { APICallError } from '@ai-sdk/provider'\n\nconst TRANSIENT_NETWORK_CODES = new Set(['ECONNRESET', 'ETIMEDOUT', 'ECONNREFUSED', 'EPIPE'])\n\nexport function isTransientError(error: unknown): boolean {\n return (\n (APICallError.isInstance(error) && error.isRetryable === true) ||\n isTransientNetworkError(error)\n )\n}\n\nexport function isTransientNetworkError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false\n\n const code = (error as { code?: unknown }).code\n if (typeof code === 'string' && TRANSIENT_NETWORK_CODES.has(code)) return true\n\n if (error instanceof TypeError) {\n return /fetch failed|network|ECONNRESET|ETIMEDOUT|ECONNREFUSED|EPIPE/i.test(error.message)\n }\n\n return false\n}\n","import type { LanguageModelMiddleware } from 'ai'\nimport type { LanguageModelV3CallOptions } from '@ai-sdk/provider'\n\n// Deletes params the provider declares unsupported, just before the wire; others keep them.\n\nexport function stripUnsupportedParamsMiddleware(params: readonly string[]): LanguageModelMiddleware {\n return {\n specificationVersion: 'v3',\n\n transformParams: async ({ params: callOptions }) => {\n const present = params.filter((name) => name in (callOptions as Record<string, unknown>))\n if (present.length === 0) return callOptions\n const next = { ...(callOptions as Record<string, unknown>) }\n for (const name of present) {\n delete next[name]\n }\n return next as LanguageModelV3CallOptions\n },\n }\n}\n","import { anthropicCompatible, anthropicSubscription } from '../adapters/anthropic.js'\nimport { gemini } from '../adapters/gemini.js'\nimport { openaiCompatible, openaiSubscription } from '../adapters/openai.js'\n\nimport { registerProvider } from './registry.js'\n\nexport function seedBuiltins(): void {\n registerProvider({\n id: 'openai-compatible',\n label: 'OpenAI-compatible',\n adapter: openaiCompatible,\n needsBaseURL: true,\n authModes: ['api-key'],\n credentialOptional: true,\n modelAdapter: 'openai-responses',\n baseURLPlaceholder: 'https://openrouter.ai/api/v1',\n defaultModel: 'gpt-5.5',\n })\n registerProvider({\n id: 'anthropic-compatible',\n label: 'Anthropic-compatible',\n adapter: anthropicCompatible,\n needsBaseURL: true,\n authModes: ['api-key', 'bearer-token'],\n credentialOptional: true,\n modelAdapter: 'anthropic-messages',\n baseURLPlaceholder: 'https://anthropic-proxy.example/messages',\n defaultModel: 'claude-sonnet-4-6',\n })\n registerProvider({\n id: 'openai-subscription',\n label: 'OpenAI subscription',\n adapter: openaiSubscription,\n needsBaseURL: false,\n authModes: ['subscription'],\n subscription: true,\n modelAdapter: 'openai-responses',\n defaultModel: 'gpt-6.1-sol',\n // The subscription backend rejects `max_output_tokens` and `temperature` with HTTP 400.\n unsupportedParams: ['maxOutputTokens', 'temperature'],\n })\n registerProvider({\n id: 'anthropic-subscription',\n label: 'Anthropic subscription',\n adapter: anthropicSubscription,\n needsBaseURL: false,\n authModes: ['subscription'],\n subscription: true,\n modelAdapter: 'anthropic-messages',\n defaultModel: 'claude-sonnet-5-5',\n })\n registerProvider({\n id: 'gemini',\n label: 'Gemini',\n adapter: gemini,\n needsBaseURL: false,\n authModes: ['api-key'],\n defaultModel: 'gemini-3-flash-preview',\n })\n}\n","import type { AdapterBody } from '../adapters/index.js'\n\nimport { seedBuiltins } from './builtins.js'\n\nexport type ProviderAuthMode = 'api-key' | 'bearer-token' | 'subscription' | 'none'\n\nexport interface ProviderDescriptor {\n id: string\n label: string\n adapter: AdapterBody\n needsBaseURL: boolean\n authModes: ProviderAuthMode[]\n subscription?: boolean\n credentialOptional?: boolean\n modelAdapter?: 'openai-responses' | 'anthropic-messages'\n baseURLPlaceholder?: string\n defaultModel?: string\n // SDK-level call option names this provider's backend rejects; stripped at egress.\n unsupportedParams?: readonly string[]\n}\n\nconst registry = new Map<string, ProviderDescriptor>()\n\nfunction validateDescriptor(descriptor: ProviderDescriptor): void {\n if (!descriptor.id?.trim()) {\n throw new Error('Provider descriptor id is required')\n }\n if (!descriptor.label?.trim()) {\n throw new Error(`Provider descriptor \"${descriptor.id}\" label is required`)\n }\n if (typeof descriptor.adapter !== 'function') {\n throw new Error(`Provider descriptor \"${descriptor.id}\" adapter is required`)\n }\n if (!Array.isArray(descriptor.authModes) || descriptor.authModes.length === 0) {\n throw new Error(`Provider descriptor \"${descriptor.id}\" authModes must be a non-empty array`)\n }\n}\n\nexport function registerProvider(descriptor: ProviderDescriptor): void {\n validateDescriptor(descriptor)\n registry.set(descriptor.id, descriptor)\n}\n\nexport function getProvider(id: string): ProviderDescriptor | undefined {\n return registry.get(id)\n}\n\nexport function listProviders(): ProviderDescriptor[] {\n return [...registry.values()]\n}\n\nexport function clearProviderRegistry(): void {\n registry.clear()\n seedBuiltins()\n}\n\nseedBuiltins()\n","import {\n addToolInputExamplesMiddleware,\n createProviderRegistry,\n customProvider,\n extractJsonMiddleware,\n wrapProvider,\n} from 'ai'\n\nimport type { LanguageModelMiddleware } from 'ai'\nimport type { LanguageModelV3, LanguageModelV3StreamPart, ProviderV3 } from '@ai-sdk/provider'\nimport type { MaskFn, ModelProfile } from '@vostride/agent-qa-schema'\nimport { createMaskingMiddleware } from '@vostride/agent-qa-safety'\n\nimport { deriveTransport } from './auth.js'\nimport type { ResolvedModelAuth } from './auth.js'\nimport { resolveCapabilities } from './capability/resolve.js'\nimport { capabilityUpdateMiddleware } from './middleware/capability-update.js'\nimport { debugLoggingMiddleware } from './middleware/debug-logging.js'\nimport { dropEmptyMessagesMiddleware } from './middleware/drop-empty-messages.js'\nimport { deriveExamplesMiddleware } from './middleware/examples.js'\nimport { extractJsonStrategy } from './middleware/extract-json.js'\nimport { repairMiddleware } from './middleware/repair.js'\nimport { retryMiddleware } from './middleware/retry.js'\nimport { stripUnsupportedParamsMiddleware } from './middleware/strip-unsupported-params.js'\nimport { toolSchemaMiddleware } from './middleware.js'\nimport { getProvider, listProviders } from './providers/registry.js'\nimport { validateProfile } from './validate.js'\nimport { openaiCompatible, openaiSubscription } from './adapters/openai.js'\nimport { anthropicCompatible, anthropicSubscription } from './adapters/anthropic.js'\nimport { gemini } from './adapters/gemini.js'\nimport { providerCallReport } from './provider-call-report.js'\nimport type { ModelCallEvent, ModelCallObservation, ModelCallReportOrigin } from './provider-call-report.js'\nexport type { ModelCallObservation } from './provider-call-report.js'\n\n// The per-call array createModel builds ends with the declared-secret mask after this array,\n// so it is the last transform before the wire (the safety package tests check it).\nconst MIDDLEWARE: LanguageModelMiddleware[] = [\n retryMiddleware(),\n repairMiddleware(),\n extractJsonMiddleware({ transform: extractJsonStrategy }),\n toolSchemaMiddleware,\n deriveExamplesMiddleware(),\n addToolInputExamplesMiddleware(),\n // Flag-gated by `AGENT_QA_DEBUG_LLM`; first, so it catches the raw `APICallError`.\n debugLoggingMiddleware(),\n // Strips empty-content messages just before the wire.\n dropEmptyMessagesMiddleware(),\n]\n\nexport interface ModelProviderOverrides {\n languageModels?: Record<string, LanguageModelV3>\n /** Trusted custom/override adapter assertion; omitted means no cache/model authority. */\n providerReportOrigin?: ModelCallReportOrigin\n}\n\nexport function createModel(\n profile: ModelProfile,\n auth: ResolvedModelAuth,\n mask: MaskFn,\n overrides: ModelProviderOverrides = {},\n observation: ModelCallObservation = {},\n): LanguageModelV3 {\n validateProfile(profile)\n\n profile.capabilities ??= resolveCapabilities(profile)\n\n const transport = deriveTransport(profile, auth)\n const descriptor = getProvider(profile.provider as string)\n if (!descriptor) {\n throw new Error(\n `Unknown provider \"${profile.provider}\". Supported: ${listProviders().map(provider => provider.id).join(', ')}.`,\n )\n }\n\n const baseProvider = toProviderV3((modelId) => descriptor.adapter(transport, modelId))\n const provider: ProviderV3 = customProvider({\n languageModels: overrides.languageModels ?? {},\n fallbackProvider: baseProvider,\n })\n // Wrap BOTH explicit overrides and adapter fallbacks before the central middleware stack.\n // A retry reaches this boundary again; a safety refusal never does. The SDK calls the raw\n // model's methods with their receiver intact and leaves streaming results untouched.\n const onProviderCall = observation.onProviderCall\n const onCall = observation.onCall\n const origin = overrides.providerReportOrigin ?? (\n overrides.languageModels?.[profile.model] ? undefined\n : descriptor.adapter === openaiCompatible ? 'openai-chat'\n : descriptor.adapter === openaiSubscription ? 'openai-responses'\n : descriptor.adapter === anthropicCompatible || descriptor.adapter === anthropicSubscription\n ? 'anthropic-messages'\n : descriptor.adapter === gemini ? 'gemini' : undefined\n )\n const observe = (event: ModelCallEvent) => {\n try {\n Promise.resolve(onCall?.(event)).catch(() => {})\n } catch {\n // Observation cannot prevent a call or replace its original result/error.\n }\n }\n const start = () => {\n try {\n Promise.resolve(onProviderCall?.()).catch(() => {})\n } catch {\n // Legacy observation is isolated independently.\n }\n observe({ kind: 'start' })\n }\n const observedProvider = onProviderCall === undefined && onCall === undefined ? provider : wrapProvider({\n provider,\n languageModelMiddleware: {\n specificationVersion: 'v3',\n wrapGenerate: async ({ doGenerate }) => {\n start()\n try {\n const result = await doGenerate()\n // Reporting, including the mask, cannot replace a provider outcome.\n try {\n observe({ kind: 'success', report: providerCallReport(result, origin, mask) })\n } catch {\n observe({ kind: 'success', report: {} })\n }\n return result\n } catch (error) {\n observe({ kind: 'failure' })\n throw error\n }\n },\n wrapStream: async ({ doStream }) => {\n start()\n try {\n const result = await doStream()\n if (onCall === undefined) return result\n const reader = result.stream.getReader()\n let terminal = false\n let modelId: string | undefined\n const failure = () => {\n if (!terminal) {\n terminal = true\n observe({ kind: 'failure' })\n }\n }\n return {\n ...result,\n stream: new ReadableStream<LanguageModelV3StreamPart>({\n async pull(controller) {\n try {\n const next = await reader.read()\n if (next.done) {\n failure()\n controller.close()\n return\n }\n const part = next.value\n if (part.type === 'response-metadata') modelId = part.modelId\n if (part.type === 'error') failure()\n if (part.type === 'finish' && !terminal) {\n terminal = true\n try {\n observe({ kind: 'success', report: providerCallReport({\n usage: part.usage, response: { modelId },\n }, origin, mask) })\n } catch {\n observe({ kind: 'success', report: {} })\n }\n }\n controller.enqueue(part)\n } catch (error) {\n failure()\n controller.error(error)\n }\n },\n async cancel(reason) {\n failure()\n await reader.cancel(reason)\n },\n }, { highWaterMark: 0 }),\n }\n } catch (error) {\n observe({ kind: 'failure' })\n throw error\n }\n },\n },\n })\n // The masking middleware must stay last (the safety package tests check it).\n const middleware = [\n capabilityUpdateMiddleware(profile),\n ...(descriptor.unsupportedParams?.length\n ? [stripUnsupportedParamsMiddleware(descriptor.unsupportedParams)]\n : []),\n ...MIDDLEWARE,\n createMaskingMiddleware(mask),\n ]\n const registry = createProviderRegistry(\n { [profile.provider]: observedProvider },\n { languageModelMiddleware: middleware },\n )\n\n return registry.languageModel(`${profile.provider}:${profile.model}`)\n}\n\nfunction toProviderV3(build: (modelId: string) => LanguageModelV3): ProviderV3 {\n return {\n specificationVersion: 'v3',\n languageModel: build,\n embeddingModel(modelId) {\n throw new Error(`No embedding model for provider model \"${modelId}\"`)\n },\n imageModel(modelId) {\n throw new Error(`No image model for provider model \"${modelId}\"`)\n },\n }\n}\n","import type { ModelProfile } from '@vostride/agent-qa-schema'\n\nexport function validateProfile(profile: ModelProfile): void {\n if (profile.provider === 'openai-compatible' && !profile.baseURL?.trim()) {\n throw new Error('OpenAI-Compatible provider requires a baseURL')\n }\n\n if (profile.provider === 'anthropic-compatible' && !profile.baseURL?.trim()) {\n throw new Error('Anthropic-Compatible provider requires a baseURL')\n }\n\n if (\n profile.headers\n && profile.provider !== 'anthropic-compatible'\n && profile.provider !== 'openai-compatible'\n ) {\n throw new Error(\n `${displayProvider(profile.provider)} provider custom headers are only supported on anthropic-compatible`,\n )\n }\n}\n\nfunction displayProvider(provider: string): string {\n switch (provider) {\n case 'openai-compatible':\n return 'OpenAI-Compatible'\n case 'anthropic-compatible':\n return 'Anthropic-Compatible'\n case 'openai-subscription':\n return 'OpenAI Subscription'\n case 'anthropic-subscription':\n return 'Anthropic Subscription'\n case 'gemini':\n return 'Gemini'\n default:\n return provider\n }\n}\n","import type { LanguageModelV3GenerateResult, LanguageModelV3Usage } from '@ai-sdk/provider'\nimport type { MaskFn } from '@vostride/agent-qa-schema'\n\n/** Neutral facts for one completed provider dispatch. Missing facts are omitted. */\nexport interface ModelCallReport {\n inputTokens?: number\n outputTokens?: number\n cachedInputTokens?: number\n respondingModelId?: string\n}\n\nexport type ModelCallEvent =\n | { kind: 'start' }\n | { kind: 'success'; report: ModelCallReport }\n | { kind: 'failure' }\n\nexport const MODEL_CALL_EVENT_KINDS = [\n 'start', 'success', 'failure',\n] as const satisfies readonly ModelCallEvent['kind'][]\n\n/** An explicit assertion that raw usage and response metadata retain this wire origin. */\nexport type ModelCallReportOrigin =\n | 'openai-chat'\n | 'openai-responses'\n | 'anthropic-messages'\n | 'gemini'\n\nexport const MODEL_CALL_REPORT_ORIGINS = [\n 'openai-chat', 'openai-responses', 'anthropic-messages', 'gemini',\n] as const satisfies readonly ModelCallReportOrigin[]\n\nexport interface ModelCallObservation {\n /** Legacy notification, invoked once per dispatch, without provider data. */\n onProviderCall?: () => void\n /** No prompts, credentials, response bodies or error text cross this callback. */\n onCall?: (event: ModelCallEvent) => void\n}\n\nfunction count(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value)\n && Number.isInteger(value) && value >= 0 ? value : undefined\n}\n\nfunction object(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown> : undefined\n}\n\n/** Model-owner only: never infer origin from a model/provider name supplied by a custom model. */\nexport function providerCallReport(\n result: Pick<LanguageModelV3GenerateResult, 'usage' | 'response'>,\n origin: ModelCallReportOrigin | undefined,\n mask: MaskFn,\n): ModelCallReport {\n const inputTokens = count(result.usage.inputTokens.total)\n const outputTokens = count(result.usage.outputTokens.total)\n const cachedInputTokens = rawCacheCount(result.usage, origin)\n // Google 3.0.67 preserves modelVersion in the raw body but leaves modelId TODO.\n // This is still provider-origin metadata, never the requested model fallback.\n const modelId = origin === undefined ? undefined : result.response?.modelId\n ?? (origin === 'gemini' ? object(result.response?.body)?.modelVersion : undefined)\n const respondingModelId = typeof modelId === 'string' && modelId.length > 0\n ? mask(modelId) : undefined\n return {\n ...(inputTokens === undefined ? {} : { inputTokens }),\n ...(outputTokens === undefined ? {} : { outputTokens }),\n ...(cachedInputTokens === undefined ? {} : { cachedInputTokens }),\n ...(respondingModelId === undefined ? {} : { respondingModelId }),\n }\n}\n\nfunction rawCacheCount(usage: LanguageModelV3Usage, origin: ModelCallReportOrigin | undefined) {\n const raw = object(usage.raw)\n if (!raw) return undefined\n switch (origin) {\n case 'openai-chat': return count(object(raw.prompt_tokens_details)?.cached_tokens)\n case 'openai-responses': return count(object(raw.input_tokens_details)?.cached_tokens)\n case 'anthropic-messages': return count(raw.cache_read_input_tokens)\n case 'gemini': return count(raw.cachedContentTokenCount)\n case undefined: return undefined\n default: {\n const exhaustive: never = origin\n return exhaustive\n }\n }\n}\n","export interface VisionSizingConfig {\n screenshotSize?: number\n effectiveResolution?: number\n}\n\nexport function resolveVisionConfig(\n servicesVision: VisionSizingConfig | undefined,\n): VisionSizingConfig {\n return {\n screenshotSize: servicesVision?.screenshotSize,\n effectiveResolution: servicesVision?.effectiveResolution,\n }\n}\n","export interface VisionGate {\n attachImage: boolean\n captureMode: 'full' | 'textOnly'\n promptNote: string\n}\n\nconst TEXT_ONLY_PROMPT_NOTE = [\n 'Visual screenshot is unavailable for this step.',\n 'Rely on the accessibility tree for element identification, including roles, names, values, refs, and URLs.',\n 'Verify functional state from the available structured context rather than purely visual appearance.',\n].join(' ')\n\n// The configured `vision` when set, otherwise the capability table's answer.\nexport function visionFromConfig(\n configured: boolean | undefined,\n capabilities: { vision: boolean },\n): boolean {\n return configured ?? capabilities.vision\n}\n\nexport function resolveVisionGate(model: { vision: boolean }): VisionGate {\n if (model.vision) {\n return {\n attachImage: true,\n captureMode: 'full',\n promptNote: '',\n }\n }\n\n return {\n attachImage: false,\n captureMode: 'textOnly',\n promptNote: TEXT_ONLY_PROMPT_NOTE,\n }\n}\n"],"mappings":"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","names":["import_ai","TRUNCATION_MARKER","safeStringify","degrade","isRecord","count","safeStringify","import_ai","import_provider","import_provider","import_ai","provider","registry"]}
|