From 434ba87ac1dd48576625973949498025e1997740 Mon Sep 17 00:00:00 2001 From: EmersonBraun Date: Tue, 6 Oct 2026 18:39:15 -0300 Subject: [PATCH 01/13] feat(adapters): serialize attachments and support gateway transports --- .changeset/quiet-adapters-images.md | 5 + docs/adapter-modalities.md | 8 + packages/adapters/src/catalog/dispatch.ts | 22 +- packages/adapters/src/cloudflare.ts | 35 +++ packages/adapters/src/content-parts.ts | 63 +++++ packages/adapters/src/index.ts | 7 + packages/adapters/src/ollama.ts | 17 +- packages/adapters/src/openai-compatible.ts | 10 +- packages/adapters/src/openai.ts | 51 +++-- packages/adapters/src/openrouter.ts | 8 +- packages/adapters/src/tool-history.ts | 23 +- packages/adapters/src/utils.ts | 13 +- .../adapters/tests/multimodal-http.test.ts | 216 ++++++++++++++++++ 13 files changed, 424 insertions(+), 54 deletions(-) create mode 100644 .changeset/quiet-adapters-images.md create mode 100644 docs/adapter-modalities.md create mode 100644 packages/adapters/src/cloudflare.ts create mode 100644 packages/adapters/src/content-parts.ts create mode 100644 packages/adapters/tests/multimodal-http.test.ts diff --git a/.changeset/quiet-adapters-images.md b/.changeset/quiet-adapters-images.md new file mode 100644 index 000000000..295f7ca4e --- /dev/null +++ b/.changeset/quiet-adapters-images.md @@ -0,0 +1,5 @@ +--- +"@agentskit/adapters": minor +--- + +Serialize supported image/file parts in OpenAI-compatible, Anthropic, Gemini/Vertex and Ollama requests. Reject unsupported modalities and sources with CAPABILITY_UNSUPPORTED instead of silently dropping attachments. Add configurable path, headers and fetch, optional Bearer authentication for compatible endpoints, OpenAI-compatible and Cloudflare REST presets, an OpenRouter alias, and explicit catalog URL variables. Existing text-only and default endpoint behavior is preserved. diff --git a/docs/adapter-modalities.md b/docs/adapter-modalities.md new file mode 100644 index 000000000..ffa7bbd81 --- /dev/null +++ b/docs/adapter-modalities.md @@ -0,0 +1,8 @@ +| Adapter | Image wire format | File wire format | Tested sources / limits | +| --- | --- | --- | --- | +| openai | image_url | file | image URL/data URL; file data URL/id | +| openai-compatible | image_url | file | same wire format; opt into model capability | +| anthropic | image | document | image URL/data URL; PDF URL/data URL; text data URL | +| gemini | inlineData/fileData | inlineData/fileData | data URL or provider URI with MIME type | +| vertex | inlineData/fileData | inlineData/fileData | data URL or provider URI with MIME type | +| ollama | images | image data URL only | image data URL only; vision model required; PDF rejected | diff --git a/packages/adapters/src/catalog/dispatch.ts b/packages/adapters/src/catalog/dispatch.ts index c895d7b57..86f2f4160 100644 --- a/packages/adapters/src/catalog/dispatch.ts +++ b/packages/adapters/src/catalog/dispatch.ts @@ -1,19 +1,19 @@ import type { AdapterFactory } from '@agentskit/core' -import { openai } from '../openai' -import type { RetryOptions } from '../utils' +import { openai, type OpenAIConfig } from '../openai' import { getProvider } from './loader' import type { CatalogProvider } from './types' /** * Provider, model, credentials, and optional transport settings for catalog-based dispatch. */ -export interface CatalogDispatchConfig { +export interface CatalogDispatchConfig extends OpenAIConfig { provider: string model: string apiKey: string /** Override the catalog base URL (e.g. proxy / self-hosted gateway). */ baseUrl?: string - retry?: RetryOptions + /** Explicit values for catalog URL placeholders; never reads process.env. */ + env?: Record } /** @@ -22,14 +22,14 @@ export interface CatalogDispatchConfig { export class CatalogDispatchError extends Error { constructor( message: string, - readonly code: 'UNKNOWN_PROVIDER' | 'NOT_OPENAI_COMPATIBLE' | 'NO_BASE_URL', + readonly code: 'UNKNOWN_PROVIDER' | 'NOT_OPENAI_COMPATIBLE' | 'NO_BASE_URL' | 'MISSING_URL_VARIABLE', ) { super(message) this.name = 'CatalogDispatchError' } } -function resolveBaseUrl(provider: CatalogProvider, override?: string): string { +function resolveBaseUrl(provider: CatalogProvider, override?: string, env: Record = {}): string { const baseUrl = override ?? provider.baseUrl if (!baseUrl) { throw new CatalogDispatchError( @@ -37,7 +37,11 @@ function resolveBaseUrl(provider: CatalogProvider, override?: string): string { 'NO_BASE_URL', ) } - return baseUrl + return baseUrl.replace(/\$\{([A-Z_][A-Z_0-9]*)\}/g, (_match, name: string) => { + const value = env[name] + if (!value) throw new CatalogDispatchError(`missing catalog URL variable ${name}`, 'MISSING_URL_VARIABLE') + return encodeURIComponent(value) + }) } /** @@ -63,9 +67,9 @@ export function dispatchFromCatalog(config: CatalogDispatchConfig): AdapterFacto ) } return openai({ - apiKey: config.apiKey, + ...config, model: config.model, - baseUrl: resolveBaseUrl(provider, config.baseUrl), + baseUrl: resolveBaseUrl(provider, config.baseUrl, config.env), retry: config.retry, }) } diff --git a/packages/adapters/src/cloudflare.ts b/packages/adapters/src/cloudflare.ts new file mode 100644 index 000000000..50d7cac33 --- /dev/null +++ b/packages/adapters/src/cloudflare.ts @@ -0,0 +1,35 @@ +import type { AdapterFactory } from '@agentskit/core' +import { openaiCompatible, type OpenAICompatibleConfig } from './openai-compatible' + +/** Cloudflare account and optional AI Gateway authentication. */ +export interface CloudflareAiGatewayConfig extends OpenAICompatibleConfig { + accountId: string + gatewayId: string + gatewayToken?: string +} + +/** OpenAI-compatible AI Gateway endpoint; supports gateway-only authentication. */ +export function cloudflareAiGateway(config: CloudflareAiGatewayConfig): AdapterFactory { + const headers = new Headers(config.headers) + if (config.gatewayToken) headers.set('cf-aig-authorization', `Bearer ${config.gatewayToken}`) + return openaiCompatible({ + ...config, + baseUrl: config.baseUrl ?? `https://gateway.ai.cloudflare.com/v1/${encodeURIComponent(config.accountId)}/${encodeURIComponent(config.gatewayId)}/compat`, + path: config.path ?? '/chat/completions', + headers, + }) +} + +/** Workers AI REST configuration; no Cloudflare runtime binding is required. */ +export interface WorkersAiConfig extends OpenAICompatibleConfig { + accountId: string +} + +/** Workers AI's OpenAI-compatible REST endpoint. */ +export function workersAi(config: WorkersAiConfig): AdapterFactory { + return openaiCompatible({ + ...config, + baseUrl: config.baseUrl ?? `https://api.cloudflare.com/client/v4/accounts/${encodeURIComponent(config.accountId)}/ai/v1`, + path: config.path ?? '/chat/completions', + }) +} diff --git a/packages/adapters/src/content-parts.ts b/packages/adapters/src/content-parts.ts new file mode 100644 index 000000000..16417b5c6 --- /dev/null +++ b/packages/adapters/src/content-parts.ts @@ -0,0 +1,63 @@ +import type { ContentPart, Message } from '@agentskit/core' + +type Provider = 'openai' | 'anthropic' | 'gemini' | 'ollama' + +/** A modality or source representation that the selected adapter cannot send. */ +export class CapabilityUnsupportedError extends Error { + readonly code = 'CAPABILITY_UNSUPPORTED' + constructor(readonly provider: string, readonly partType: ContentPart['type']) { + super(`${provider} cannot send this ${partType} part`) + this.name = 'CapabilityUnsupportedError' + } +} + +function unsupported(provider: Provider, part: ContentPart): never { + throw new CapabilityUnsupportedError(provider, part.type) +} + +function dataSource(part: Exclude, provider: Provider) { + if (!part.source.startsWith('data:')) return undefined + const match = /^data:([^;,]+);base64,([A-Za-z0-9+/]+={0,2})$/.exec(part.source) + if (!match || match[2]!.length % 4 !== 0 || (part.mimeType && part.mimeType !== match[1])) unsupported(provider, part) + return { mimeType: match[1]!, data: match[2]! } +} + +/** Serialize ordered parts; unsupported inputs fail instead of becoming text projections. */ +export function providerParts(message: Message, provider: Provider, multiModal = true): Array> | undefined { + if (!message.parts?.length) return undefined + return message.parts.map(part => { + if (part.type === 'text') return provider === 'gemini' ? { text: part.text } : { type: 'text', text: part.text } + if (!multiModal || (message.role !== 'user' && message.role !== 'assistant') || (part.type !== 'image' && part.type !== 'file')) unsupported(provider, part) + const inline = dataSource(part, provider) + const isUrl = /^https?:\/\//.test(part.source) + if (provider === 'openai') { + if (part.type === 'image') { + if ((!inline && !isUrl) || (inline && !inline.mimeType.startsWith('image/'))) unsupported(provider, part) + return { type: 'image_url', image_url: { url: part.source, ...(part.detail ? { detail: part.detail } : {}) } } + } + if (inline) return { type: 'file', file: { file_data: part.source, filename: part.filename ?? 'attachment' } } + if (/^file-[\w-]+$/.test(part.source)) return { type: 'file', file: { file_id: part.source } } + unsupported(provider, part) + } + if (provider === 'anthropic') { + if (part.type === 'image' && inline && !['image/png', 'image/jpeg', 'image/gif', 'image/webp'].includes(inline.mimeType)) unsupported(provider, part) + const mimeType = inline?.mimeType ?? part.mimeType + if (part.type === 'file' && mimeType !== 'application/pdf' && mimeType !== 'text/plain') unsupported(provider, part) + if (inline?.mimeType === 'text/plain' && part.type === 'file') { + const bytes = Uint8Array.from(atob(inline.data), c => c.charCodeAt(0)) + return { type: 'document', source: { type: 'text', media_type: 'text/plain', data: new TextDecoder('utf-8', { fatal: true }).decode(bytes) } } + } + if (!inline && !isUrl) unsupported(provider, part) + return { type: part.type === 'image' ? 'image' : 'document', source: inline + ? { type: 'base64', media_type: inline.mimeType, data: inline.data } + : { type: 'url', url: part.source } } + } + if (provider === 'gemini') { + if (inline) return { inlineData: inline } + if (!part.mimeType || (!isUrl && !part.source.startsWith('gs://'))) unsupported(provider, part) + return { fileData: { mimeType: part.mimeType, fileUri: part.source } } + } + if (!inline || !inline.mimeType.startsWith('image/')) unsupported(provider, part) + return { image: inline.data } + }) +} diff --git a/packages/adapters/src/index.ts b/packages/adapters/src/index.ts index 59c9f12d2..fea5e8815 100644 --- a/packages/adapters/src/index.ts +++ b/packages/adapters/src/index.ts @@ -124,3 +124,10 @@ export type { CredentialRefreshable, RotatingCredentials, } from './credential-rotation' + +export { openaiCompatible } from './openai-compatible' +export type { OpenAICompatibleConfig } from './openai-compatible' +export { openRouter } from './openrouter' +export { cloudflareAiGateway, workersAi } from './cloudflare' +export type { CloudflareAiGatewayConfig, WorkersAiConfig } from './cloudflare' +export { CapabilityUnsupportedError } from './content-parts' diff --git a/packages/adapters/src/ollama.ts b/packages/adapters/src/ollama.ts index 5d2d2af2e..9ba5540f3 100644 --- a/packages/adapters/src/ollama.ts +++ b/packages/adapters/src/ollama.ts @@ -1,5 +1,6 @@ import type { AdapterFactory, AdapterRequest, StreamSource } from '@agentskit/core' import { parseOllamaStream, type RetryOptions } from './utils' +import { providerParts } from './content-parts' import { createStreamSource } from './stream-source' /** @@ -8,6 +9,7 @@ import { createStreamSource } from './stream-source' export interface OllamaConfig { model: string baseUrl?: string + multiModal?: boolean retry?: RetryOptions } @@ -26,16 +28,21 @@ export function ollama(config: OllamaConfig): AdapterFactory { capabilities: { streaming: true, tools: false, // varies by model; default 'false' — enable via capabilities.extensions if your model supports it - multiModal: model.includes('llava') || model.includes('vision'), + multiModal: config.multiModal ?? (model.includes('llava') || model.includes('vision')), }, createSource: (request: AdapterRequest): StreamSource => { const body = { model, stream: true, - messages: request.messages.map(message => ({ - role: message.role, - content: message.content, - })), + messages: request.messages.map(message => { + const parts = providerParts(message, 'ollama', config.multiModal ?? (model.includes('llava') || model.includes('vision'))) + const images = parts?.filter(part => part.image !== undefined).map(part => part.image) + return { + role: message.role, + content: parts ? parts.filter(part => part.type === 'text').map(part => part.text).join('\n') : message.content, + ...(images?.length ? { images } : {}), + } + }), } return createStreamSource( diff --git a/packages/adapters/src/openai-compatible.ts b/packages/adapters/src/openai-compatible.ts index 7d406abba..0eeb41f56 100644 --- a/packages/adapters/src/openai-compatible.ts +++ b/packages/adapters/src/openai-compatible.ts @@ -1,13 +1,21 @@ import type { AdapterFactory } from '@agentskit/core' import { openai, type OpenAIConfig } from './openai' -export interface OpenAICompatibleConfig extends OpenAIConfig {} +export interface OpenAICompatibleConfig extends Omit { + apiKey?: string +} export function createOpenAICompatibleAdapter(defaultBaseUrl: string) { return function openAICompatibleAdapter(config: OpenAICompatibleConfig): AdapterFactory { return openai({ ...config, + apiKey: config.apiKey ?? '', baseUrl: config.baseUrl ?? defaultBaseUrl, }) } } + +/** An OpenAI-compatible endpoint with explicit transport configuration. */ +export function openaiCompatible(config: OpenAICompatibleConfig): AdapterFactory { + return openai({ ...config, apiKey: config.apiKey ?? '' }) +} diff --git a/packages/adapters/src/openai.ts b/packages/adapters/src/openai.ts index 92103ec0f..d6e4ef944 100644 --- a/packages/adapters/src/openai.ts +++ b/packages/adapters/src/openai.ts @@ -9,6 +9,9 @@ export interface OpenAIConfig { apiKey: string model: string baseUrl?: string + path?: string + headers?: HeadersInit + fetch?: typeof globalThis.fetch retry?: RetryOptions /** * Ask the provider to include token usage in the final stream chunk via @@ -34,9 +37,10 @@ export function openai(config: OpenAIConfig): AdapterFactory { const { apiKey, model, baseUrl = 'https://api.openai.com', retry } = config // Normalize: many compatible endpoints are declared WITH a trailing `/v1` // (together, mistral, fireworks, openrouter `/api/v1`, …) while others are - // declared without it. We always append `/v1/chat/completions`, so strip a + // declared without it. The default path appends `/v1/chat/completions`, so strip a // trailing `/v1` first to avoid a double `/v1/v1/...` (→ 404). - const apiRoot = baseUrl.replace(/\/v1\/?$/, '') + const apiRoot = config.path === undefined ? baseUrl.replace(/\/v1\/?$/, '') : baseUrl + const url = `${apiRoot.replace(/\/$/, '')}/${(config.path ?? '/v1/chat/completions').replace(/^\//, '')}` // Auto: on for canonical OpenAI, off for every other compatible endpoint // where the param is a known source of 4xx surprises. // Match the canonical OpenAI host exactly — a substring/prefix check @@ -50,21 +54,22 @@ export function openai(config: OpenAIConfig): AdapterFactory { })() const includeUsage = config.includeUsage ?? isCanonicalOpenAI + const capabilities: AdapterCapabilities = { + streaming: true, + tools: config.capabilities?.tools ?? true, + // o1 / o3 models emit reasoning; older models don't. Accurate per-model + // detection would need a model registry; 'true' is the safer default here. + reasoning: config.capabilities?.reasoning ?? (model.startsWith('o1') || model.startsWith('o3')), + multiModal: config.capabilities?.multiModal ?? (model.startsWith('gpt-4') || model.startsWith('gpt-5') || model.startsWith('o')), + usage: true, + ...config.capabilities, + } return { - capabilities: { - streaming: true, - tools: config.capabilities?.tools ?? true, - // o1 / o3 models emit reasoning; older models don't. Accurate per-model - // detection would need a model registry; 'true' is the safer default here. - reasoning: config.capabilities?.reasoning ?? (model.startsWith('o1') || model.startsWith('o3')), - multiModal: config.capabilities?.multiModal ?? (model.startsWith('gpt-4') || model.startsWith('o')), - usage: true, - ...config.capabilities, - }, + capabilities, createSource: (request: AdapterRequest): StreamSource => { const body: Record = { model, - messages: toProviderMessages(request.messages), + messages: toProviderMessages(request.messages, capabilities.multiModal), tools: request.context?.tools?.map(tool => ({ type: 'function', function: { @@ -80,15 +85,17 @@ export function openai(config: OpenAIConfig): AdapterFactory { if (includeUsage) body.stream_options = { include_usage: true } return createStreamSource( - (signal) => fetch(`${apiRoot}/v1/chat/completions`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${apiKey}`, - }, - body: JSON.stringify(body), - signal, - }), + (signal) => { + const headers = new Headers({ 'Content-Type': 'application/json' }) + if (apiKey) headers.set('Authorization', `Bearer ${apiKey}`) + new Headers(config.headers).forEach((value, name) => headers.set(name, value)) + return (config.fetch ?? globalThis.fetch)(url, { + method: 'POST', + headers: Object.fromEntries([...headers].map(([name, value]) => [name === 'authorization' ? 'Authorization' : name, value])), + body: JSON.stringify(body), + signal, + }) + }, parseOpenAIStream, 'OpenAI API', retry, diff --git a/packages/adapters/src/openrouter.ts b/packages/adapters/src/openrouter.ts index 7664f00f3..3acacc145 100644 --- a/packages/adapters/src/openrouter.ts +++ b/packages/adapters/src/openrouter.ts @@ -1,9 +1,10 @@ -import { createOpenAICompatibleAdapter, type OpenAICompatibleConfig } from './openai-compatible' +import { createOpenAICompatibleAdapter } from './openai-compatible' +import type { OpenAIConfig } from './openai' /** * Configuration options for the OpenRouter chat adapter. */ -export interface OpenRouterConfig extends OpenAICompatibleConfig {} +export interface OpenRouterConfig extends OpenAIConfig {} /** * OpenRouter — routes to 300+ provider models behind a single @@ -11,3 +12,6 @@ export interface OpenRouterConfig extends OpenAICompatibleConfig {} * `model`, e.g. `anthropic/claude-sonnet-4-6`. */ export const openrouter = createOpenAICompatibleAdapter('https://openrouter.ai/api/v1') + +/** Camel-case alias for the existing OpenRouter factory. */ +export const openRouter = openrouter diff --git a/packages/adapters/src/tool-history.ts b/packages/adapters/src/tool-history.ts index 153f21538..33a6a4646 100644 --- a/packages/adapters/src/tool-history.ts +++ b/packages/adapters/src/tool-history.ts @@ -1,4 +1,5 @@ import type { Message } from '@agentskit/core' +import { providerParts } from './content-parts' /** Normalize tool-call args for provider wire formats. */ function toolInput(args: unknown): Record { @@ -44,12 +45,13 @@ export function toAnthropicMessages( const output: Array<{ role: string; content: unknown }> = [] for (const message of messages) { + const parts = providerParts(message, 'anthropic') if (message.role === 'system') continue if (message.role === 'assistant' && message.toolCalls && message.toolCalls.length > 0) { for (const tc of message.toolCalls) knownNames.set(tc.id, tc.name) - const blocks: Array> = [] - if (message.content) { + const blocks: Array> = [...(parts ?? [])] + if (!parts && message.content) { blocks.push({ type: 'text', text: message.content }) } for (const tc of message.toolCalls) { @@ -87,16 +89,16 @@ export function toAnthropicMessages( continue } - if (message.role === 'assistant' && !message.content) continue + if (message.role === 'assistant' && !message.content && !parts) continue const previous = output[output.length - 1] if (message.role === 'user' && previous?.role === 'user') { const previousBlocks = Array.isArray(previous.content) ? previous.content : [{ type: 'text', text: previous.content }] - previous.content = [...previousBlocks, { type: 'text', text: message.content }] + previous.content = [...previousBlocks, ...(parts ?? [{ type: 'text', text: message.content }])] } else { - output.push({ role: message.role, content: message.content }) + output.push({ role: message.role, content: parts ?? message.content }) } } @@ -115,12 +117,13 @@ export function toGeminiContents( const output: Array<{ role: string; parts: Array> }> = [] for (const message of messages) { + const contentParts = providerParts(message, 'gemini') if (message.role === 'system') continue if (message.role === 'assistant' && message.toolCalls && message.toolCalls.length > 0) { for (const tc of message.toolCalls) knownNames.set(tc.id, tc.name) - const parts: Array> = [] - if (message.content) { + const parts: Array> = [...(contentParts ?? [])] + if (!contentParts && message.content) { parts.push({ text: message.content }) } for (const tc of message.toolCalls) { @@ -159,14 +162,14 @@ export function toGeminiContents( continue } - if (message.role === 'assistant' && !message.content) continue + if (message.role === 'assistant' && !message.content && !contentParts) continue const role = message.role === 'assistant' ? 'model' : 'user' const previous = output[output.length - 1] if (previous?.role === role) { - previous.parts.push({ text: message.content }) + previous.parts.push(...(contentParts ?? [{ text: message.content }])) } else { - output.push({ role, parts: [{ text: message.content }] }) + output.push({ role, parts: contentParts ?? [{ text: message.content }] }) } } diff --git a/packages/adapters/src/utils.ts b/packages/adapters/src/utils.ts index 713a9c24a..d7a0f481f 100644 --- a/packages/adapters/src/utils.ts +++ b/packages/adapters/src/utils.ts @@ -1,5 +1,6 @@ import { type Message, type StreamChunk, type StreamSource } from '@agentskit/core' import { parseSSE, sleep as netSleep } from '@agentskit/net' +import { providerParts } from './content-parts' import { fetchWithRetry, type RetryOptions } from './retry' import { readNDJSONLines } from './stream-lines' import { @@ -16,7 +17,7 @@ export { parseOpenAIStream } from './openai-stream' export { readNDJSONLines, readSSELines } from './stream-lines' export type { StreamParser } from './stream-types' -export function toProviderMessages(messages: Message[]) { +export function toProviderMessages(messages: Message[], multiModal = true) { // Track which tool_call ids were declared by preceding assistant turns so // we can drop orphan tool messages — the OpenAI Chat Completions API // rejects a tool message whose tool_call_id isn't bound to a previous @@ -25,13 +26,15 @@ export function toProviderMessages(messages: Message[]) { const output: Array> = [] for (const message of messages) { + const parts = providerParts(message, 'openai', multiModal) + const content = parts ?? message.content if (message.role === 'tool') { const id = message.toolCallId // Orphan (no id, or id not declared) — skip; it would 400 the API. if (!id || !knownToolCallIds.has(id)) continue output.push({ role: 'tool' as const, - content: message.content, + content, tool_call_id: id, }) continue @@ -41,7 +44,7 @@ export function toProviderMessages(messages: Message[]) { for (const tc of message.toolCalls) knownToolCallIds.add(tc.id) output.push({ role: 'assistant' as const, - content: message.content || null, + content: content || null, tool_calls: message.toolCalls.map(tc => ({ id: tc.id, type: 'function' as const, @@ -59,9 +62,9 @@ export function toProviderMessages(messages: Message[]) { // and the placeholder assistant message never received content — // sending `{role:'assistant', content:''}` back to the provider either // 400s or confuses the model into silence on the next turn. - if (message.role === 'assistant' && !message.content) continue + if (message.role === 'assistant' && !message.content && !parts) continue - output.push({ role: message.role, content: message.content }) + output.push({ role: message.role, content }) } return output diff --git a/packages/adapters/tests/multimodal-http.test.ts b/packages/adapters/tests/multimodal-http.test.ts new file mode 100644 index 000000000..1200c10f3 --- /dev/null +++ b/packages/adapters/tests/multimodal-http.test.ts @@ -0,0 +1,216 @@ +import { readFileSync } from 'node:fs' +import { createServer, type IncomingHttpHeaders } from 'node:http' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import type { AdapterFactory, ContentPart, Message } from '@agentskit/core' +import { openai } from '../src/openai' +import { openaiCompatible } from '../src/openai-compatible' +import { anthropic } from '../src/anthropic' +import { gemini } from '../src/gemini' +import { vertex } from '../src/vertex' +import { ollama } from '../src/ollama' +import { dispatchFromCatalog } from '../src/catalog/dispatch' +import { listProviders } from '../src/catalog/loader' + +export const multimodalCases = [ + { provider: 'openai', image: 'image_url', file: 'file', sources: 'image URL/data URL; file data URL/id' }, + { provider: 'openai-compatible', image: 'image_url', file: 'file', sources: 'same wire format; opt into model capability' }, + { provider: 'anthropic', image: 'image', file: 'document', sources: 'image URL/data URL; PDF URL/data URL; text data URL' }, + { provider: 'gemini', image: 'inlineData/fileData', file: 'inlineData/fileData', sources: 'data URL or provider URI with MIME type' }, + { provider: 'vertex', image: 'inlineData/fileData', file: 'inlineData/fileData', sources: 'data URL or provider URI with MIME type' }, + { provider: 'ollama', image: 'images', file: 'image data URL only', sources: 'image data URL only; vision model required; PDF rejected' }, +] as const + +const png = 'data:image/png;base64,aW1hZ2U=' +const pdf = 'data:application/pdf;base64,cGRm' +function message(parts: ContentPart[], role: Message['role'] = 'user'): Message { + return { id: 'synthetic', role, content: 'legacy projection', parts, status: 'complete', createdAt: new Date(0) } +} +let server: ReturnType +let baseUrl: string +let captured: { path: string; headers: IncomingHttpHeaders; body: Record }[] +beforeEach(async () => { + captured = [] + server = createServer(async (req, res) => { + let body = '' + for await (const chunk of req) body += chunk + captured.push({ path: req.url!, headers: req.headers, body: JSON.parse(body) }) + res.setHeader('Content-Type', 'text/event-stream') + if (req.url!.includes('/messages')) res.end('data: {"type":"message_stop"}\n\n') + else if (req.url!.includes('streamGenerateContent')) res.end('data: {"candidates":[{"finishReason":"STOP"}]}\n\n') + else if (req.url === '/api/chat') res.end('{"done":true}\n') + else res.end('data: {"choices":[{"delta":{"content":"ok"}}],"usage":{"prompt_tokens":2,"completion_tokens":1,"total_tokens":3}}\n\ndata: [DONE]\n\n') + }) + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) + const address = server.address() + if (!address || typeof address === 'string') throw new Error('No local address') + baseUrl = `http://127.0.0.1:${address.port}` +}) +afterEach(async () => { + vi.unstubAllGlobals() + await new Promise((resolve, reject) => server.close(err => err ? reject(err) : resolve())) +}) +async function send(adapter: AdapterFactory, parts: ContentPart[]) { + const source = adapter.createSource({ messages: [message(parts)] }) + const chunks = [] + for await (const chunk of source.stream()) chunks.push(chunk) + expect(chunks.at(-1)?.type).toBe('done') + return captured.at(-1)!.body +} + +describe('multimodal HTTP contract', () => { + it.each(['openai', 'openai-compatible'])('%s preserves ordered parts, detail and files', async provider => { + const body = await send((provider === 'openai' ? openai : openaiCompatible)({ apiKey: 'synthetic', model: provider === 'openai' ? 'gpt-4o' : 'custom', baseUrl, capabilities: { multiModal: true } }), [ + { type: 'text', text: 'inspect' }, { type: 'image', source: png, detail: 'high' }, + { type: 'file', source: pdf, filename: 'sample.pdf' }, + ]) + expect(body.messages).toEqual([{ role: 'user', content: [ + { type: 'text', text: 'inspect' }, { type: 'image_url', image_url: { url: png, detail: 'high' } }, + { type: 'file', file: { file_data: pdf, filename: 'sample.pdf' } }, + ] }]) + }) + it('Anthropic sends image and PDF blocks', async () => { + const body = await send(anthropic({ apiKey: 'synthetic', model: 'claude', baseUrl }), [ + { type: 'image', source: png }, { type: 'file', source: pdf }, + ]) + expect(body.messages).toEqual([{ role: 'user', content: [ + { type: 'image', source: { type: 'base64', media_type: 'image/png', data: 'aW1hZ2U=' } }, + { type: 'document', source: { type: 'base64', media_type: 'application/pdf', data: 'cGRm' } }, + ] }]) + }) + it.each(['gemini', 'vertex'])('%s sends inlineData and fileData', async provider => { + const nativeFetch = globalThis.fetch + if (provider === 'vertex') vi.stubGlobal('fetch', (input: Parameters[0], init: Parameters[1]) => nativeFetch(`${baseUrl}/streamGenerateContent`, init)) + const adapter = provider === 'gemini' + ? gemini({ apiKey: 'synthetic', model: 'gemini', baseUrl }) + : vertex({ project: 'synthetic', region: 'synthetic', model: 'gemini', accessToken: 'synthetic' }) + const body = await send(adapter, [{ type: 'image', source: png }, { type: 'file', source: 'gs://synthetic/sample.pdf', mimeType: 'application/pdf' }]) + expect(body.contents).toEqual([{ role: 'user', parts: [ + { inlineData: { mimeType: 'image/png', data: 'aW1hZ2U=' } }, + { fileData: { mimeType: 'application/pdf', fileUri: 'gs://synthetic/sample.pdf' } }, + ] }]) + }) + it('Ollama sends images without the data URL prefix', async () => { + const body = await send(ollama({ model: 'llava', baseUrl }), [{ type: 'text', text: 'inspect' }, { type: 'image', source: png }]) + expect(body.messages).toEqual([{ role: 'user', content: 'inspect', images: ['aW1hZ2U='] }]) + }) + it('rejects unsupported modalities before network I/O', () => { + for (const adapter of [openai({ apiKey: 'synthetic', model: 'gpt-3.5', baseUrl }), ollama({ model: 'llama3', baseUrl })]) { + expect(() => adapter.createSource({ messages: [message([{ type: 'image', source: png }])] })).toThrow(expect.objectContaining({ code: 'CAPABILITY_UNSUPPORTED' })) + } + expect(() => ollama({ model: 'llava', baseUrl }).createSource({ messages: [message([{ type: 'file', source: pdf }])] })).toThrow(expect.objectContaining({ code: 'CAPABILITY_UNSUPPORTED' })) + expect(captured).toHaveLength(0) + }) + it('custom gateway path/headers/fetch preserves streaming and usage without Bearer', async () => { + const transport = vi.fn(globalThis.fetch) + const config = { model: 'custom', baseUrl: `${baseUrl}/gateway`, path: '/compat/chat/completions', headers: { 'cf-aig-authorization': 'synthetic', 'X-Custom': 'present' }, fetch: transport, includeUsage: true } + const adapter = openaiCompatible(config) + const chunks = [] + for await (const chunk of adapter.createSource({ messages: [message([{ type: 'text', text: 'hello' }])] }).stream()) chunks.push(chunk) + expect(captured[0]?.path).toBe('/gateway/compat/chat/completions') + expect(captured[0]?.headers.authorization).toBeUndefined() + expect(captured[0]?.headers['cf-aig-authorization']).toBe('synthetic') + expect(captured[0]?.headers['x-custom']).toBe('present') + expect(transport).toHaveBeenCalledOnce() + expect(chunks).toContainEqual({ type: 'text', content: 'ok' }) + expect(chunks).toContainEqual(expect.objectContaining({ type: 'usage', usage: { promptTokens: 2, completionTokens: 1, totalTokens: 3 } })) + }) +}) + +// Presets still use a real HTTP server: only the destination host is redirected. +describe('OpenAI-compatible presets', () => { + it('routes OpenRouter, AI Gateway and Workers AI with documented headers', async () => { + const { openRouter, openrouter } = await import('../src/openrouter') + const { cloudflareAiGateway, workersAi } = await import('../src/cloudflare') + expect(openRouter).toBe(openrouter) + const nativeFetch = globalThis.fetch + const destinations: string[] = [] + const transport: typeof fetch = (input, init) => { + const url = String(input) + destinations.push(url) + return nativeFetch(`${baseUrl}${new URL(url).pathname}`, init) + } + await send(openRouter({ model: 'google/gemini-2.5-flash-lite', apiKey: 'synthetic', fetch: transport, headers: { 'HTTP-Referer': 'https://example.test', 'X-Title': 'Synthetic' } }), [{ type: 'text', text: 'hello' }]) + await send(cloudflareAiGateway({ accountId: 'account', gatewayId: 'gateway', gatewayToken: 'synthetic', model: 'openrouter/google/gemini-2.5-flash-lite', fetch: transport }), [{ type: 'text', text: 'hello' }]) + await send(workersAi({ accountId: 'account', apiKey: 'synthetic', model: '@cf/meta/model', fetch: transport }), [{ type: 'text', text: 'hello' }]) + expect(destinations).toEqual([ + 'https://openrouter.ai/api/v1/chat/completions', + 'https://gateway.ai.cloudflare.com/v1/account/gateway/compat/chat/completions', + 'https://api.cloudflare.com/client/v4/accounts/account/ai/v1/chat/completions', + ]) + expect(captured[0]?.headers).toMatchObject({ authorization: 'Bearer synthetic', 'http-referer': 'https://example.test', 'x-title': 'Synthetic' }) + expect(captured[1]?.headers['cf-aig-authorization']).toBe('Bearer synthetic') + expect(captured[1]?.headers.authorization).toBeUndefined() + expect(captured[2]?.headers.authorization).toBe('Bearer synthetic') + }) + it('catalog interpolates explicit Cloudflare account id and rejects missing variables', async () => { + const provider = listProviders().find(p => p.baseUrl?.includes('${CLOUDFLARE_ACCOUNT_ID}') && p.openaiCompatible)! + expect(provider).toBeDefined() + expect(() => dispatchFromCatalog({ provider: provider.id, model: 'custom', apiKey: 'synthetic' })).toThrow(expect.objectContaining({ code: 'MISSING_URL_VARIABLE' })) + const nativeFetch = globalThis.fetch + let destination = '' + const transport: typeof fetch = (input, init) => { + destination = String(input) + return nativeFetch(`${baseUrl}${new URL(destination).pathname}`, init) + } + await send(dispatchFromCatalog({ provider: provider.id, model: 'custom', apiKey: 'synthetic', env: { CLOUDFLARE_ACCOUNT_ID: 'synthetic-account' }, fetch: transport }), [{ type: 'text', text: 'hello' }]) + expect(destination).toBe('https://api.cloudflare.com/client/v4/accounts/synthetic-account/ai/v1/chat/completions') + }) +}) + +describe('multimodal boundaries and history', () => { + it('sends URL image sources and provider file identifiers', async () => { + expect((await send(openai({ apiKey: 'synthetic', model: 'gpt-4o', baseUrl }), [{ type: 'image', source: 'https://example.test/image.png' }, { type: 'file', source: 'file-synthetic' }])).messages).toEqual([{ role: 'user', content: [ + { type: 'image_url', image_url: { url: 'https://example.test/image.png' } }, { type: 'file', file: { file_id: 'file-synthetic' } }, + ] }]) + expect((await send(anthropic({ apiKey: 'synthetic', model: 'claude', baseUrl }), [{ type: 'image', source: 'https://example.test/image.png' }, { type: 'file', source: 'https://example.test/sample.pdf', mimeType: 'application/pdf' }])).messages).toEqual([{ role: 'user', content: [ + { type: 'image', source: { type: 'url', url: 'https://example.test/image.png' } }, { type: 'document', source: { type: 'url', url: 'https://example.test/sample.pdf' } }, + ] }]) + expect((await send(gemini({ apiKey: 'synthetic', model: 'gemini', baseUrl }), [{ type: 'file', source: pdf }])).contents).toEqual([{ role: 'user', parts: [{ inlineData: { mimeType: 'application/pdf', data: 'cGRm' } }] }]) + }) + it('rejects unknown sources, missing MIME types, and unsupported audio/video without sending', () => { + const adapters = [openai({ apiKey: 'synthetic', model: 'gpt-4o', baseUrl }), anthropic({ apiKey: 'synthetic', model: 'claude', baseUrl }), gemini({ apiKey: 'synthetic', model: 'gemini', baseUrl }), ollama({ model: 'llava', baseUrl })] + for (const adapter of adapters) for (const part of [ + { type: 'audio', source: 'https://example.test/audio.wav' }, + { type: 'video', source: 'https://example.test/video.mp4' }, + { type: 'image', source: 'data:image/png;base64,invalid!' }, + { type: 'image', source: 'unknown-reference' }, + ] as ContentPart[]) expect(() => adapter.createSource({ messages: [message([part])] })).toThrow(expect.objectContaining({ code: 'CAPABILITY_UNSUPPORTED' })) + expect(() => adapters[2]!.createSource({ messages: [message([{ type: 'file', source: 'gs://synthetic/no-mime' }])] })).toThrow(expect.objectContaining({ code: 'CAPABILITY_UNSUPPORTED' })) + expect(captured).toHaveLength(0) + }) + it('keeps parts on assistant tool calls and merged user turns', async () => { + const messages: Message[] = [ + message([{ type: 'image', source: png }]), + { ...message([{ type: 'text', text: 'checking' }], 'assistant'), id: 'assistant', toolCalls: [{ id: 'call', name: 'inspect', args: {}, status: 'complete' }] }, + { ...message([], 'tool'), id: 'tool', toolCallId: 'call', content: 'result' }, + { ...message([{ type: 'file', source: pdf }]), id: 'followup' }, + ] + for (const adapter of [openai({ apiKey: 'synthetic', model: 'gpt-4o', baseUrl }), anthropic({ apiKey: 'synthetic', model: 'claude', baseUrl }), gemini({ apiKey: 'synthetic', model: 'gemini', baseUrl })]) { + for await (const _chunk of adapter.createSource({ messages }).stream()) { /* drain */ } + const wire = JSON.stringify(captured.at(-1)!.body) + expect(wire).toContain('aW1hZ2U=') + expect(wire).toContain('cGRm') + expect(wire).toContain('checking') + expect(wire).toContain('result') + expect(wire).toContain('call') + expect(wire).not.toContain('legacy projection') + } + }) +}) + +const capabilityTable = [ + '| Adapter | Image wire format | File wire format | Tested sources / limits |', + '| --- | --- | --- | --- |', + ...multimodalCases.map(row => `| ${row.provider} | ${row.image} | ${row.file} | ${row.sources} |`), +].join('\n') + '\n' + +it('keeps the generated capability table and recipe aligned with HTTP cases', async () => { + await expect(capabilityTable).toMatchFileSnapshot('../../../docs/adapter-modalities.md') + const recipe = readFileSync(new URL('../../../apps/docs-next/content/docs/reference/recipes/multi-modal.mdx', import.meta.url), 'utf8') + expect(recipe).toContain(capabilityTable.trim()) +}) + +it('encodes inline text documents and Ollama image file parts', async () => { + expect((await send(anthropic({ apiKey: 'synthetic', model: 'claude', baseUrl }), [{ type: 'file', source: 'data:text/plain;base64,aGVsbG8=' }])).messages).toEqual([{ role: 'user', content: [{ type: 'document', source: { type: 'text', media_type: 'text/plain', data: 'hello' } }] }]) + expect((await send(ollama({ model: 'custom-vision-model', multiModal: true, baseUrl }), [{ type: 'file', source: png }])).messages).toEqual([{ role: 'user', content: '', images: ['aW1hZ2U='] }]) +}) From 93a022654ba0c6e936c282f6da6d9a48940045d1 Mon Sep 17 00:00:00 2001 From: EmersonBraun Date: Tue, 6 Oct 2026 18:41:52 -0300 Subject: [PATCH 02/13] fix(adapters): reject invalid media and document transport limits --- .../content/docs/data/providers/openai.mdx | 53 +++++++++++++- .../docs/reference/recipes/multi-modal.mdx | 72 +++++++++++-------- .../0041-adapter-content-serialization.md | 35 +++++++++ packages/adapters/README.md | 15 ++++ packages/adapters/src/content-parts.ts | 8 ++- .../adapters/tests/multimodal-http.test.ts | 2 + 6 files changed, 153 insertions(+), 32 deletions(-) create mode 100644 docs/architecture/adrs/0041-adapter-content-serialization.md diff --git a/apps/docs-next/content/docs/data/providers/openai.mdx b/apps/docs-next/content/docs/data/providers/openai.mdx index 6c325914d..daab21c63 100644 --- a/apps/docs-next/content/docs/data/providers/openai.mdx +++ b/apps/docs-next/content/docs/data/providers/openai.mdx @@ -16,9 +16,13 @@ const adapter = openai({ | Option | Type | Default | |---|---|---| -| `apiKey` | `string` | required | +| `apiKey` | `string` | required for `openai`; optional for `openaiCompatible` and Cloudflare presets | | `model` | `string` | required | | `baseUrl` | `string` | `https://api.openai.com` | +| `path` | `string` | `/v1/chat/completions`; custom path appended to `baseUrl` | +| `headers` | `HeadersInit` | additional headers; override defaults case-insensitively | +| `fetch` | `typeof fetch` | global fetch | +| `capabilities` | `Partial` | model-name defaults; override for compatible models | | `retry` | `RetryOptions` | package default | | `includeUsage` | `boolean` | `true` for the canonical OpenAI host | @@ -36,10 +40,55 @@ const adapter = openai({ - Streaming via SSE; emits `text` + `tool-call` + `done` chunks. - Parallel tool calling enabled by default. -- Multimodal: pass `{ type: 'image', url }` content parts. +- Images: pass `message.parts` entries `{ type: 'image', source }` (HTTPS/data URL), with optional `detail`. Files accept data URLs or uploaded `file-*` IDs. See the [tested modality matrix](/docs/reference/recipes/multi-modal). +- Unsupported modalities/sources raise `CAPABILITY_UNSUPPORTED`; `multiModal: false` rejects non-text parts. Custom vision models require `capabilities: { multiModal: true }`. +- `openaiCompatible()` uses the same transport, with optional `apiKey`; omitting it sends no automatic Bearer header. Existing `openrouter()` remains available, with `openRouter()` as an alias. +- With the default path, trailing `/v1` on `baseUrl` is normalized. With an explicit `path`, the base URL is preserved (apart from the trailing slash). - Azure OpenAI users should use [azureOpenAIAdapter](https://github.com/AgentsKit-io/agentskit/issues/428) — different routing. ## Related - [Providers overview](./) · [Hosted](./hosted) · [Embedders](./embedders) — `openaiEmbedder` - Recipe: [custom-adapter](/docs/reference/recipes/custom-adapter) + +## Gateway presets + +```ts +import { cloudflareAiGateway, workersAi, openRouter } from '@agentskit/adapters' + +const gateway = cloudflareAiGateway({ + accountId: 'your-account', gatewayId: 'your-gateway', + gatewayToken: process.env.CF_AIG_TOKEN, + model: 'openrouter/google/gemini-2.5-flash-lite', + capabilities: { multiModal: true }, +}) +const workers = workersAi({ + accountId: 'your-account', apiKey: process.env.CLOUDFLARE_API_TOKEN!, + model: '@cf/your-model', +}) +const router = openRouter({ + apiKey: process.env.OPENROUTER_API_KEY!, + model: 'google/gemini-2.5-flash-lite', + capabilities: { multiModal: true }, + headers: { 'HTTP-Referer': 'https://example.com', 'X-Title': 'Example' }, +}) +``` + +`cloudflareAiGateway()` targets +`https://gateway.ai.cloudflare.com/v1/{accountId}/{gatewayId}/compat/chat/completions` +and adds `cf-aig-authorization: Bearer {gatewayToken}` when supplied. +A provider `apiKey` is optional for gateway-managed keys. `workersAi()` targets +`https://api.cloudflare.com/client/v4/accounts/{accountId}/ai/v1/chat/completions` +with the supplied API token as Bearer, using REST without runtime bindings. +`openRouter()` targets `https://openrouter.ai/api/v1/chat/completions`. +All presets support `baseUrl`, `path`, `headers`, `fetch` and capability overrides. + +For catalog dispatch, pass URL variables explicitly: +`env: { CLOUDFLARE_ACCOUNT_ID: 'your-account' }`. Missing placeholders raise +`MISSING_URL_VARIABLE`; no environment variables are read implicitly. + +URL/header contracts were tested through local HTTP capture. Authenticated live +OpenRouter, AI Gateway and Workers AI calls remain pending and require separate authorization. +See [Cloudflare Unified API](https://developers.cloudflare.com/ai-gateway/usage/chat-completion/), +[Workers AI REST](https://developers.cloudflare.com/ai-gateway/get-started/), and +[OpenRouter API](https://openrouter.ai/docs/api_reference/overview). diff --git a/apps/docs-next/content/docs/reference/recipes/multi-modal.mdx b/apps/docs-next/content/docs/reference/recipes/multi-modal.mdx index 40d49f4a8..43003add2 100644 --- a/apps/docs-next/content/docs/reference/recipes/multi-modal.mdx +++ b/apps/docs-next/content/docs/reference/recipes/multi-modal.mdx @@ -1,14 +1,16 @@ --- title: Unified multi-modal -description: One API for text, image, audio, video, and file inputs — regardless of provider. +description: Provider-neutral parts with tested image and file serialization and explicit unsupported-input errors. --- Every provider has its own multi-modal shape. OpenAI wants `{ type: 'image_url', image_url: {...} }`, Anthropic wants `{ type: 'image', source: {...} }`, Gemini wants parts-with-inline- data. `@agentskit/core` provides a provider-neutral `ContentPart` -model — adapters that understand a modality read the parts, the rest -fall back to a text projection. +model. The adapters listed below serialize supported image/file parts and reject +unsupported inputs with `CapabilityUnsupportedError` (`code: CAPABILITY_UNSUPPORTED`) +from `createSource`, before network I/O. Audio/video builders exist in core; +these adapters do not yet send them. ## Install @@ -49,32 +51,44 @@ const message: Message = { | `imagePart(src, { mimeType?, detail? })` | `'image'` | Data URL, http(s), or provider-hosted id | | `audioPart(src, { durationSec? })` | `'audio'` | | | `videoPart(src, { durationSec? })` | `'video'` | | -| `filePart(src, { filename? })` | `'file'` | PDF, CSV, arbitrary binary | - -## In an adapter - -A vision-aware adapter reads `msg.parts` and maps each entry to its -provider's shape. A text-only adapter keeps reading `msg.content` and -sees a safe projection like `"caption\n[image: pic.png]"`. - -```ts -import { normalizeContent, filterParts } from '@agentskit/core' - -function toOpenAIMessage(m: Message) { - const { parts } = normalizeContent(m.content, m.parts) - return { - role: m.role, - content: parts.map(p => { - if (p.type === 'text') return { type: 'text', text: p.text } - if (p.type === 'image') return { type: 'image_url', image_url: { url: p.source, detail: p.detail } } - return { type: 'text', text: `[${p.type}]` } - }), - } -} - -// Quickly grab every attached image: -const images = filterParts(parts, 'image') -``` +| `filePart(src, { filename?, mimeType? })` | `'file'` | Support depends on the adapter and source format below | + +## Tested adapter capabilities + +This table is generated from `packages/adapters/tests/multimodal-http.test.ts` +and checked against its HTTP payload cases. It proves serialization to a local +server, not acceptance or inference quality on a live provider. + +| Adapter | Image wire format | File wire format | Tested sources / limits | +| --- | --- | --- | --- | +| openai | image_url | file | image URL/data URL; file data URL/id | +| openai-compatible | image_url | file | same wire format; opt into model capability | +| anthropic | image | document | image URL/data URL; PDF URL/data URL; text data URL | +| gemini | inlineData/fileData | inlineData/fileData | data URL or provider URI with MIME type | +| vertex | inlineData/fileData | inlineData/fileData | data URL or provider URI with MIME type | +| ollama | images | image data URL only | image data URL only; vision model required; PDF rejected | + +Parts replace the legacy `content` projection when present; their order is preserved. +Text-only messages keep the previous wire format. OpenAI-compatible custom models +must opt into `capabilities: { multiModal: true }`; transport compatibility alone +says nothing about the upstream model. Ollama accepts `multiModal: true` for +vision models whose names do not match the default `llava`/`vision` heuristic. +An Ollama file part containing an image data URL is sent in `images`; PDFs and +other files are rejected. Remote image URLs are not fetched by the adapter. + +Gemini/Vertex remote sources require `mimeType` and a provider-accessible URI +(`https://` or `gs://`); data URLs supply their own MIME type. Anthropic accepts +PDFs and inline UTF-8 text documents; other file MIME types are rejected. +OpenAI Chat Completions accepts file data URLs or uploaded `file-*` identifiers, +not remote file URLs. Uploading and resolving storage references is the caller's responsibility. +Provider-hosted image identifiers, audio and video are currently rejected. +Model-specific MIME/size/access limits still apply upstream. + +See the provider wire contracts: [OpenAI file inputs](https://developers.openai.com/api/docs/guides/file-inputs), +[Anthropic images](https://platform.claude.com/docs/en/build-with-claude/vision), +[Anthropic PDFs](https://platform.claude.com/docs/en/build-with-claude/pdf-support), +[Gemini parts](https://ai.google.dev/api/generate-content), and +[Ollama chat](https://docs.ollama.com/api/chat). ## See also diff --git a/docs/architecture/adrs/0041-adapter-content-serialization.md b/docs/architecture/adrs/0041-adapter-content-serialization.md new file mode 100644 index 000000000..d85f3b951 --- /dev/null +++ b/docs/architecture/adrs/0041-adapter-content-serialization.md @@ -0,0 +1,35 @@ +# 0041 — Serialize attachments at the provider boundary + +Status: proposed; implementation ready for maintainer review + +## Context + +The existing Message contract contains ordered ContentPart arrays alongside a +legacy string projection. Native provider serializers read only the projection, +so advertising image capability does not ensure that an image reaches the wire. +OpenAI-compatible gateways also need configurable authentication and endpoint paths. + +## Decision + +Reuse the existing adapter and message contracts. Serialize parts in the shared +provider history encoders, preserving order and tool-call correlation. Parts are +authoritative when present. Unsupported modalities, source formats or disabled +image capability raise an adapter-local CAPABILITY_UNSUPPORTED error before I/O. +No core types or contracts change; text-only wire behavior remains unchanged. + +Use the existing OpenAI stream transport for configurable path, headers and fetch +and for gateway presets. Authentication is optional and supplied headers override +defaults case-insensitively. Resolve catalog placeholders from explicit caller +values; never read environment credentials inside the library. No new dependency. + +## Consequences and evidence + +Model-level capability must be supplied explicitly for custom compatible models; +transport support is not a claim about provider/model inference. Ollama supports +inline image data only; unsupported PDFs/URLs fail explicitly. Provider MIME and +access restrictions still apply. Shared encoders also serve Azure and Bedrock; +existing tool-history suites must pass alongside the new HTTP payload tests. + +`packages/adapters/tests/multimodal-http.test.ts` exercises local HTTP capture, +stream/usage preservation, presets, source errors and tool history. Live provider +calls are a separate, currently pending evidence gate. No publication is authorized. diff --git a/packages/adapters/README.md b/packages/adapters/README.md index d1e0cb750..448a109ff 100644 --- a/packages/adapters/README.md +++ b/packages/adapters/README.md @@ -40,6 +40,21 @@ Docs: [package guide](https://www.agentskit.io/docs/reference/packages/adapters) - **CLI-backed agents** — `@agentskit/adapters/cli` normalizes text, JSON, and ACP-based local LLM CLIs - **LangChain bridge** — `@agentskit/adapters/langchain-bridge` turns any adapter into a LangChain `BaseChatModel` for `createAgent` +## Gateway and multimodal transport + +`openaiCompatible({ model, baseUrl, path, headers, fetch })` supports custom +OpenAI-compatible endpoints; `apiKey` is optional and headers override defaults. +`openRouter` aliases `openrouter`; `cloudflareAiGateway` and `workersAi` supply +Cloudflare REST URLs without runtime bindings. Catalog URL variables are supplied +explicitly through `env`, including `CLOUDFLARE_ACCOUNT_ID`. + +OpenAI-compatible, Anthropic, Gemini/Vertex and Ollama serializers read +`message.parts`. Unsupported sources/modalities raise `CapabilityUnsupportedError` +with `code: CAPABILITY_UNSUPPORTED`, rather than dropping attachments. +See the [tested modality matrix](../../docs/adapter-modalities.md) and +[configuration guide](../../apps/docs-next/content/docs/data/providers/openai.mdx). +These are local wire-format tests; live provider acceptance remains unverified. + ## Install diff --git a/packages/adapters/src/content-parts.ts b/packages/adapters/src/content-parts.ts index 16417b5c6..3fb71fb59 100644 --- a/packages/adapters/src/content-parts.ts +++ b/packages/adapters/src/content-parts.ts @@ -30,6 +30,7 @@ export function providerParts(message: Message, provider: Provider, multiModal = if (!multiModal || (message.role !== 'user' && message.role !== 'assistant') || (part.type !== 'image' && part.type !== 'file')) unsupported(provider, part) const inline = dataSource(part, provider) const isUrl = /^https?:\/\//.test(part.source) + if (part.type === 'image' && (inline?.mimeType ?? part.mimeType) && !(inline?.mimeType ?? part.mimeType)!.startsWith('image/')) unsupported(provider, part) if (provider === 'openai') { if (part.type === 'image') { if ((!inline && !isUrl) || (inline && !inline.mimeType.startsWith('image/'))) unsupported(provider, part) @@ -43,9 +44,14 @@ export function providerParts(message: Message, provider: Provider, multiModal = if (part.type === 'image' && inline && !['image/png', 'image/jpeg', 'image/gif', 'image/webp'].includes(inline.mimeType)) unsupported(provider, part) const mimeType = inline?.mimeType ?? part.mimeType if (part.type === 'file' && mimeType !== 'application/pdf' && mimeType !== 'text/plain') unsupported(provider, part) + if (part.type === 'file' && mimeType === 'text/plain' && !inline) unsupported(provider, part) if (inline?.mimeType === 'text/plain' && part.type === 'file') { const bytes = Uint8Array.from(atob(inline.data), c => c.charCodeAt(0)) - return { type: 'document', source: { type: 'text', media_type: 'text/plain', data: new TextDecoder('utf-8', { fatal: true }).decode(bytes) } } + try { + return { type: 'document', source: { type: 'text', media_type: 'text/plain', data: new TextDecoder('utf-8', { fatal: true }).decode(bytes) } } + } catch { + unsupported(provider, part) + } } if (!inline && !isUrl) unsupported(provider, part) return { type: part.type === 'image' ? 'image' : 'document', source: inline diff --git a/packages/adapters/tests/multimodal-http.test.ts b/packages/adapters/tests/multimodal-http.test.ts index 1200c10f3..e2da1059d 100644 --- a/packages/adapters/tests/multimodal-http.test.ts +++ b/packages/adapters/tests/multimodal-http.test.ts @@ -174,8 +174,10 @@ describe('multimodal boundaries and history', () => { { type: 'video', source: 'https://example.test/video.mp4' }, { type: 'image', source: 'data:image/png;base64,invalid!' }, { type: 'image', source: 'unknown-reference' }, + { type: 'image', source: pdf }, ] as ContentPart[]) expect(() => adapter.createSource({ messages: [message([part])] })).toThrow(expect.objectContaining({ code: 'CAPABILITY_UNSUPPORTED' })) expect(() => adapters[2]!.createSource({ messages: [message([{ type: 'file', source: 'gs://synthetic/no-mime' }])] })).toThrow(expect.objectContaining({ code: 'CAPABILITY_UNSUPPORTED' })) + expect(() => adapters[1]!.createSource({ messages: [message([{ type: 'file', source: 'data:text/plain;base64,/w==' }])] })).toThrow(expect.objectContaining({ code: 'CAPABILITY_UNSUPPORTED' })) expect(captured).toHaveLength(0) }) it('keeps parts on assistant tool calls and merged user turns', async () => { From e0cab7bc264ec3c5f20603160adb2256885a1fe2 Mon Sep 17 00:00:00 2001 From: EmersonBraun Date: Tue, 6 Oct 2026 18:44:09 -0300 Subject: [PATCH 03/13] fix(adapters): honor explicit gateway authentication headers --- packages/adapters/src/cloudflare.ts | 2 +- packages/adapters/tests/multimodal-http.test.ts | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/adapters/src/cloudflare.ts b/packages/adapters/src/cloudflare.ts index 50d7cac33..0e178bcf1 100644 --- a/packages/adapters/src/cloudflare.ts +++ b/packages/adapters/src/cloudflare.ts @@ -11,7 +11,7 @@ export interface CloudflareAiGatewayConfig extends OpenAICompatibleConfig { /** OpenAI-compatible AI Gateway endpoint; supports gateway-only authentication. */ export function cloudflareAiGateway(config: CloudflareAiGatewayConfig): AdapterFactory { const headers = new Headers(config.headers) - if (config.gatewayToken) headers.set('cf-aig-authorization', `Bearer ${config.gatewayToken}`) + if (config.gatewayToken && !headers.has('cf-aig-authorization')) headers.set('cf-aig-authorization', `Bearer ${config.gatewayToken}`) return openaiCompatible({ ...config, baseUrl: config.baseUrl ?? `https://gateway.ai.cloudflare.com/v1/${encodeURIComponent(config.accountId)}/${encodeURIComponent(config.gatewayId)}/compat`, diff --git a/packages/adapters/tests/multimodal-http.test.ts b/packages/adapters/tests/multimodal-http.test.ts index e2da1059d..ee0000787 100644 --- a/packages/adapters/tests/multimodal-http.test.ts +++ b/packages/adapters/tests/multimodal-http.test.ts @@ -216,3 +216,11 @@ it('encodes inline text documents and Ollama image file parts', async () => { expect((await send(anthropic({ apiKey: 'synthetic', model: 'claude', baseUrl }), [{ type: 'file', source: 'data:text/plain;base64,aGVsbG8=' }])).messages).toEqual([{ role: 'user', content: [{ type: 'document', source: { type: 'text', media_type: 'text/plain', data: 'hello' } }] }]) expect((await send(ollama({ model: 'custom-vision-model', multiModal: true, baseUrl }), [{ type: 'file', source: png }])).messages).toEqual([{ role: 'user', content: '', images: ['aW1hZ2U='] }]) }) + +it('honors case-insensitive caller authentication overrides', async () => { + const { cloudflareAiGateway } = await import('../src/cloudflare') + await send(openaiCompatible({ apiKey: 'synthetic', model: 'custom', baseUrl, headers: { authorization: 'Basic synthetic' } }), [{ type: 'text', text: 'hello' }]) + expect(captured[0]?.headers.authorization).toBe('Basic synthetic') + await send(cloudflareAiGateway({ accountId: 'synthetic', gatewayId: 'synthetic', gatewayToken: 'default-synthetic', model: 'custom', baseUrl, headers: { 'CF-AIG-Authorization': 'Bearer override-synthetic' } }), [{ type: 'text', text: 'hello' }]) + expect(captured[1]?.headers['cf-aig-authorization']).toBe('Bearer override-synthetic') +}) From f78b492b0345684c920c1ce2245248cccb21cc46 Mon Sep 17 00:00:00 2001 From: EmersonBraun Date: Tue, 6 Oct 2026 18:47:03 -0300 Subject: [PATCH 04/13] fix(adapters): preserve existing provider credential types --- .../content/docs/reference/recipes/multi-modal.mdx | 4 ++-- packages/adapters/src/cloudflare.ts | 6 +++--- packages/adapters/src/index.ts | 2 +- packages/adapters/src/openai-compatible.ts | 8 +++++--- packages/adapters/tests/gateway-types.test-d.ts | 13 +++++++++++++ 5 files changed, 24 insertions(+), 9 deletions(-) create mode 100644 packages/adapters/tests/gateway-types.test-d.ts diff --git a/apps/docs-next/content/docs/reference/recipes/multi-modal.mdx b/apps/docs-next/content/docs/reference/recipes/multi-modal.mdx index 43003add2..1afa2f6b5 100644 --- a/apps/docs-next/content/docs/reference/recipes/multi-modal.mdx +++ b/apps/docs-next/content/docs/reference/recipes/multi-modal.mdx @@ -68,8 +68,8 @@ server, not acceptance or inference quality on a live provider. | vertex | inlineData/fileData | inlineData/fileData | data URL or provider URI with MIME type | | ollama | images | image data URL only | image data URL only; vision model required; PDF rejected | -Parts replace the legacy `content` projection when present; their order is preserved. -Text-only messages keep the previous wire format. OpenAI-compatible custom models +For user/assistant messages, parts replace the legacy `content` projection when present; their order is preserved. +Messages without parts keep the previous wire format. OpenAI-compatible custom models must opt into `capabilities: { multiModal: true }`; transport compatibility alone says nothing about the upstream model. Ollama accepts `multiModal: true` for vision models whose names do not match the default `llava`/`vision` heuristic. diff --git a/packages/adapters/src/cloudflare.ts b/packages/adapters/src/cloudflare.ts index 0e178bcf1..da8c6520c 100644 --- a/packages/adapters/src/cloudflare.ts +++ b/packages/adapters/src/cloudflare.ts @@ -1,8 +1,8 @@ import type { AdapterFactory } from '@agentskit/core' -import { openaiCompatible, type OpenAICompatibleConfig } from './openai-compatible' +import { openaiCompatible, type OpenAICompatibleTransportConfig } from './openai-compatible' /** Cloudflare account and optional AI Gateway authentication. */ -export interface CloudflareAiGatewayConfig extends OpenAICompatibleConfig { +export interface CloudflareAiGatewayConfig extends OpenAICompatibleTransportConfig { accountId: string gatewayId: string gatewayToken?: string @@ -21,7 +21,7 @@ export function cloudflareAiGateway(config: CloudflareAiGatewayConfig): AdapterF } /** Workers AI REST configuration; no Cloudflare runtime binding is required. */ -export interface WorkersAiConfig extends OpenAICompatibleConfig { +export interface WorkersAiConfig extends OpenAICompatibleTransportConfig { accountId: string } diff --git a/packages/adapters/src/index.ts b/packages/adapters/src/index.ts index fea5e8815..207901d64 100644 --- a/packages/adapters/src/index.ts +++ b/packages/adapters/src/index.ts @@ -126,7 +126,7 @@ export type { } from './credential-rotation' export { openaiCompatible } from './openai-compatible' -export type { OpenAICompatibleConfig } from './openai-compatible' +export type { OpenAICompatibleConfig, OpenAICompatibleTransportConfig } from './openai-compatible' export { openRouter } from './openrouter' export { cloudflareAiGateway, workersAi } from './cloudflare' export type { CloudflareAiGatewayConfig, WorkersAiConfig } from './cloudflare' diff --git a/packages/adapters/src/openai-compatible.ts b/packages/adapters/src/openai-compatible.ts index 0eeb41f56..1ca52786a 100644 --- a/packages/adapters/src/openai-compatible.ts +++ b/packages/adapters/src/openai-compatible.ts @@ -1,7 +1,10 @@ import type { AdapterFactory } from '@agentskit/core' import { openai, type OpenAIConfig } from './openai' -export interface OpenAICompatibleConfig extends Omit { +export interface OpenAICompatibleConfig extends OpenAIConfig {} + +/** Transport configuration for endpoints with optional Bearer authentication. */ +export interface OpenAICompatibleTransportConfig extends Omit { apiKey?: string } @@ -9,13 +12,12 @@ export function createOpenAICompatibleAdapter(defaultBaseUrl: string) { return function openAICompatibleAdapter(config: OpenAICompatibleConfig): AdapterFactory { return openai({ ...config, - apiKey: config.apiKey ?? '', baseUrl: config.baseUrl ?? defaultBaseUrl, }) } } /** An OpenAI-compatible endpoint with explicit transport configuration. */ -export function openaiCompatible(config: OpenAICompatibleConfig): AdapterFactory { +export function openaiCompatible(config: OpenAICompatibleTransportConfig): AdapterFactory { return openai({ ...config, apiKey: config.apiKey ?? '' }) } diff --git a/packages/adapters/tests/gateway-types.test-d.ts b/packages/adapters/tests/gateway-types.test-d.ts new file mode 100644 index 000000000..55a1447ed --- /dev/null +++ b/packages/adapters/tests/gateway-types.test-d.ts @@ -0,0 +1,13 @@ +import { expectTypeOf } from 'vitest' +import { openaiCompatible, cloudflareAiGateway, workersAi } from '../src' +import type { DeepSeekConfig, OpenAIConfig, OpenRouterConfig } from '../src' +import type { OpenAICompatibleConfig } from '../src/openai-compatible' + +expectTypeOf().toEqualTypeOf() +expectTypeOf().toEqualTypeOf() +expectTypeOf().toEqualTypeOf() +expectTypeOf().toEqualTypeOf() + +openaiCompatible({ model: 'synthetic', headers: { 'X-Synthetic': 'present' }, path: '/custom' }) +cloudflareAiGateway({ model: 'synthetic', accountId: 'synthetic', gatewayId: 'synthetic' }) +workersAi({ model: 'synthetic', accountId: 'synthetic' }) From c6fe4871433836f733e912a84536a56a73ef0b40 Mon Sep 17 00:00:00 2001 From: EmersonBraun Date: Tue, 6 Oct 2026 18:53:42 -0300 Subject: [PATCH 05/13] docs(adapters): record local validation and blocked global gates --- .../adapters-multimodal-transport.json | 139 ++++++++++++++++++ .../evidence/adapters-multimodal-transport.md | 89 +++++++++++ 2 files changed, 228 insertions(+) create mode 100644 docs/evidence/adapters-multimodal-transport.json create mode 100644 docs/evidence/adapters-multimodal-transport.md diff --git a/docs/evidence/adapters-multimodal-transport.json b/docs/evidence/adapters-multimodal-transport.json new file mode 100644 index 000000000..2d284b2cd --- /dev/null +++ b/docs/evidence/adapters-multimodal-transport.json @@ -0,0 +1,139 @@ +{ + "sourceRevision": "f78b492b0345684c920c1ce2245248cccb21cc46", + "adapterTree": "e7eb02cdeaef97f042f7c7b81e288431d89c9855", + "scope": "local transport serialization; no live provider inference", + "http": { + "command": "pnpm --filter @agentskit/adapters exec vitest run tests/multimodal-http.test.ts --maxWorkers=2 --reporter=json", + "total": 16, + "passed": 16, + "failed": 0, + "tests": [ + { + "name": "multimodal HTTP contract openai preserves ordered parts, detail and files", + "status": "passed" + }, + { + "name": "multimodal HTTP contract openai-compatible preserves ordered parts, detail and files", + "status": "passed" + }, + { + "name": "multimodal HTTP contract Anthropic sends image and PDF blocks", + "status": "passed" + }, + { + "name": "multimodal HTTP contract gemini sends inlineData and fileData", + "status": "passed" + }, + { + "name": "multimodal HTTP contract vertex sends inlineData and fileData", + "status": "passed" + }, + { + "name": "multimodal HTTP contract Ollama sends images without the data URL prefix", + "status": "passed" + }, + { + "name": "multimodal HTTP contract rejects unsupported modalities before network I/O", + "status": "passed" + }, + { + "name": "multimodal HTTP contract custom gateway path/headers/fetch preserves streaming and usage without Bearer", + "status": "passed" + }, + { + "name": "OpenAI-compatible presets routes OpenRouter, AI Gateway and Workers AI with documented headers", + "status": "passed" + }, + { + "name": "OpenAI-compatible presets catalog interpolates explicit Cloudflare account id and rejects missing variables", + "status": "passed" + }, + { + "name": "multimodal boundaries and history sends URL image sources and provider file identifiers", + "status": "passed" + }, + { + "name": "multimodal boundaries and history rejects unknown sources, missing MIME types, and unsupported audio/video without sending", + "status": "passed" + }, + { + "name": "multimodal boundaries and history keeps parts on assistant tool calls and merged user turns", + "status": "passed" + }, + { + "name": "keeps the generated capability table and recipe aligned with HTTP cases", + "status": "passed" + }, + { + "name": "encodes inline text documents and Ollama image file parts", + "status": "passed" + }, + { + "name": "honors case-insensitive caller authentication overrides", + "status": "passed" + } + ] + }, + "runs": [ + { + "name": "regressions-original", + "command": "pnpm --filter @agentskit/adapters exec vitest run tests/multimodal-http.test.ts", + "result": "expected failure: 8/8 on original source", + "logSha256": "349d391a5c38a754122a82a038c72018f05d7dbd4b403f7f562797a785b1ea67" + }, + { + "name": "adapters-current", + "command": "pnpm --filter @agentskit/adapters exec vitest run --maxWorkers=2", + "result": "passed: 53 files, 584 tests", + "logSha256": "776211ae74ef31ebb4d87cb1a0d4a17aab88666c19f3e9050b7a482e8b0367f6" + }, + { + "name": "global-test-1", + "command": "pnpm test", + "result": "failed: integrations HTTP deadline assertion", + "logSha256": "a4270411fdb8d3af7bf772fa061d78ec9521ce1a835ecae600613d6a1628dc1a" + }, + { + "name": "global-test-2", + "command": "pnpm test", + "result": "failed: sandbox process exit assertion", + "logSha256": "67dc185aa3baa398a1c1a85b345a88bc3e494c016121879408be9cffa6224d13" + }, + { + "name": "global-test-3", + "command": "pnpm exec turbo run test --concurrency=1", + "result": "failed: eval bundler interop timeout 90000ms", + "logSha256": "8c49160fe54d4b9c75d1eafa081da4d7ef7e602187a133aeb07bfca14bafbd4e" + }, + { + "name": "mdx", + "command": "pnpm --filter @agentskit/docs-next lint:mdx", + "result": "passed: 417 files, 87 warnings", + "logSha256": "2e821e8dfa885f4b2b27148bcbab27ad3661e08e0ab56862206b95bc44671f42" + }, + { + "name": "handoff", + "command": "pnpm exec ak-docs query package adapters --agent", + "result": "blocked: index stale", + "logSha256": "05dfff1e17a1cc2f318c8a71eae16f3b00e8bf72aedcc37f5cf7114a67d899e2" + }, + { + "name": "package-build", + "command": "pnpm --filter @agentskit/adapters build", + "result": "passed: ESM, CJS and DTS", + "logSha256": "5a5caf33ec4cd92fa25e16d542a69d48770a1ae055c2c24bde70c048b9061161" + }, + { + "name": "package-lint", + "command": "pnpm --filter @agentskit/adapters lint", + "result": "passed: source and test typecheck, including required credential types", + "logSha256": "9fafd74610b7358c7a0059fe6127a94c3c761fd15f15b95ca7d7811832217fcd" + }, + { + "name": "built-api", + "command": "node built ESM/CJS export and deferred-I/O assertions", + "result": "passed", + "logSha256": "9277aa1c312e66758234daa2522a69fead1268b28ccd63e104a6084c7d9ed7ee" + } + ] +} diff --git a/docs/evidence/adapters-multimodal-transport.md b/docs/evidence/adapters-multimodal-transport.md new file mode 100644 index 000000000..e6018d6ae --- /dev/null +++ b/docs/evidence/adapters-multimodal-transport.md @@ -0,0 +1,89 @@ +# Adapter multimodal transport — local implementation report + +Status: **BLOCKED** at repository-wide validation; implementation available for maintainer review. No release, publication, deployment, push or PR was performed. + +## Contract and authorization + +Intent: implement configurable OpenAI-compatible transport and serialize image/file inputs in the named native adapter families, with synthetic HTTP regression tests, local changeset and commits. The coordinator confirmed RF-01, RF-02, RF-04, RF-05 and RF-06 as the worker criteria; RF-03 belongs to a separate starter and is outside this contract. No core contract changes, new dependencies or real provider credentials are authorized. + +Scope: `packages/adapters`, its catalog dispatch, corresponding provider/recipe documentation, an ADR, local changeset and this evidence. Other repositories, starter/protocol/storage/cost work, live accounts and UI implementation are outside scope. Intermediate implementation and local verification were authorized together. The dispatch task specification is the approved contract; no separate parent contract hash was supplied and no subagents were dispatched. + +Validation budget: local and cached dependencies only; no CI or real inference calls; three repository-wide test attempts, one repository-wide build attempt, scoped checks for changed revisions, and documented doc-bridge operations. Redundant/stale task-owned jobs were stopped after source changes and repeated global failures, rather than weakening their gates. Temporary logs are reduced to allowlisted durable metadata below and removed at settlement; ambiguous/pre-existing files are retained. + +## Source and implementation + +The source revision and adapter tree are recorded in [the evidence metadata](./adapters-multimodal-transport.json). Subsequent report-only commits do not change that adapter tree. + +Local implementation commits: + +- `434ba87a`: attachment serializers, configurable transport, Cloudflare presets, OpenRouter alias, catalog variables, regression suite and changeset. +- `93a02265`: media validation and documented source limits. +- `e0cab7bc`: explicit case-insensitive gateway authentication overrides. +- `f78b492b`: retain required credential types for existing providers; add static API compatibility checks. + +The existing OpenAI transport supplies `path`, `headers` and injected `fetch`. The new `openaiCompatible` and Cloudflare presets allow omitted Bearer authentication. Existing OpenAI and provider configuration types retain required `apiKey`; existing default `/v1` routing and text-only requests without parts remain compatible. + +Shared history serializers send OpenAI `image_url`/`file`, Anthropic `image`/`document`, Gemini/Vertex `inlineData`/`fileData`, and Ollama `images`. Unsupported sources/modalities fail with `CapabilityUnsupportedError.code === 'CAPABILITY_UNSUPPORTED'` before I/O. Ollama accepts inline images, including image file parts, and rejects PDFs and remote URLs. Catalog placeholders are resolved only from explicitly supplied `env` values. No Cloudflare runtime binding is imported. + +The [modality table](../adapter-modalities.md) is generated by a Vitest file snapshot from the HTTP test cases and checked against the recipe. Refreshing it uses the existing suite's `-u` option. [ADR 0041](../architecture/adrs/0041-adapter-content-serialization.md) records the implementation decision for maintainer review; it does not revise a core contract. + +## Criterion reconciliation + +| Criterion | Status | Current evidence and limit | +| --- | --- | --- | +| RF-01: configurable endpoint/path/headers/fetch, no implicit Bearer, streaming/usage | validated locally | HTTP capture asserts full configured path, custom headers, injected fetch invocation, absent Authorization, text stream and token usage; explicit caller authentication overrides also pass | +| RF-02: OpenRouter, AI Gateway, Workers AI presets and catalog account URL | validated locally | Captured requests assert all three official URLs and headers; missing catalog variables produce MISSING_URL_VARIABLE; library source contains no `cloudflare:` import | +| RF-03: starter default/fallback model and ledger | not applicable | Separate starter contract, explicitly excluded by coordinator | +| RF-04: image/file provider payloads | validated locally | Real loopback HTTP capture checks ordered data URL/URL/hosted-ID parts, Gemini/Vertex payloads, Anthropic PDF/text and Ollama images; shared tool-history tests also pass | +| RF-05: capability contract and explicit unsupported errors | validated locally | Named families preserve their asserted image payloads; disabled model capability, unsupported audio/video, invalid data URLs/MIME/source references, PDF on Ollama and invalid UTF-8 documents fail before network I/O | +| RF-06: truthful provider/recipe docs and generated capability table | validated for content | File-snapshot table and recipe equality check passes; semantic review matches documented limits to payload tests; MDX lint passed; rendered docs/browser behavior was not analyzed | +| Stage 0: green build/typecheck/test across repository | blocked | All three global test attempts failed in other packages; global build/typecheck runs were stopped when stale, so no current repository-wide green claim is made | +| Changeset, local commits, report and cleanup | implemented | Local minor changeset exists; four implementation commits recorded; no package versioning/publication; final cleanup/status recorded below | + +## Validated + +The current adapter suite passed **53 files / 584 tests** using `--maxWorkers=2`, without increasing test timeouts. It includes **16 HTTP/documentation checks**, existing stream contracts, shared tool-history encoders, Azure/Bedrock tests, provider routing and compatibility tests. The HTTP fixtures contain synthetic base64 strings and synthetic credentials; they validate payload structure rather than real PNG/PDF inference. + +Provider source formats were checked against public primary documentation: [Cloudflare Unified API](https://developers.cloudflare.com/ai-gateway/usage/chat-completion/), [Workers AI REST](https://developers.cloudflare.com/ai-gateway/get-started/), [OpenRouter](https://openrouter.ai/docs/api_reference/overview), [OpenAI files](https://developers.openai.com/api/docs/guides/file-inputs), [Anthropic vision](https://platform.claude.com/docs/en/build-with-claude/vision), [Anthropic PDFs](https://platform.claude.com/docs/en/build-with-claude/pdf-support), [Gemini parts](https://ai.google.dev/api/generate-content) and [Ollama chat](https://docs.ollama.com/api/chat). + +The original implementation failed all eight initial loopback regressions: six provider image/file payload cases, capability rejection and custom gateway transport. These were actual assertion failures after dependencies built, rather than missing-import failures. The first attempted run before dependency builds failed to load `@agentskit/net` and is not regression evidence. + +## Partially validated + +Global lint passed earlier (60 tasks) but predates the final type signatures. The repository build produced package outputs and progressed through docs generation; it was interrupted after 17m23s when its source became stale. Its 43 successful tasks are supporting evidence, not a green build. A later global lint was also stopped as stale; an interrupted command's zero wrapper exit status is not interpreted as success. + +The initially used pre-install doc-bridge tool rejected `analysis.areas`. After `pnpm install --frozen-lockfile`, the repository-local tool accepted the configuration and reported a stale index instead. The documented gate/index operations were attempted but stopped as stale during subsequent edits; freshness is not validated and no harness configuration was changed. `ORCA_PLAYBOOK.md` was absent from this worktree; no workers or terminal tasks were dispatched. + +## Blocked + +Repository-wide test attempts returned explicit failures: + +1. `pnpm test`: `packages/integrations/tests/http.test.ts:630`, deadline retry count was 0 instead of 1. The same HTTP file subsequently passed its 34 tests in isolation. +2. `pnpm test`: `packages/sandbox/tests/local-spawner.test.ts:27`, process exit assertion was false. +3. `pnpm exec turbo run test --concurrency=1`: `packages/eval/tests/bundler-interop.test.ts:5`, test exceeded its existing 90000ms timeout. + +A current adapter rerun under unrestricted workers also timed out in CLI deadline and LangChain bridge tests; the full current suite passed with two workers. These observations support resource contention as a possible cause, but do not prove the global failures are resolved. No unrelated package was changed and no timeout or harness gate was weakened. + +## Not analyzed + +Authenticated live OpenRouter, AI Gateway, Workers AI, OpenAI, Anthropic, Gemini/Vertex and Ollama inference; real image/document interpretation; provider MIME/size/quota/access acceptance; performance/latency claims; browser rendering and interaction of the docs; other adapters outside the named families beyond their existing regression tests. + +## Not applicable + +UI implementation, screenshots, visual approval, database persistence, upload/storage references, business-domain flows, starter model fallback, billing, release/versioning, external tracking systems, new dependencies and core size checks: none is part of this implementation contract. + +## Final gate and next action + +The coordinator must review the implementation and proposed ADR, restore/complete current doc-bridge evidence, and obtain passing current repository-wide checks before moving this work beyond BLOCKED. Live provider validation remains a separately authorized follow-up; this report does not claim enterprise readiness or parent-task completion. + +Current package checks passed on source `f78b492b0345684c920c1ce2245248cccb21cc46`: + +- `pnpm --filter @agentskit/adapters build`: ESM, CJS and declarations generated successfully. +- `pnpm --filter @agentskit/adapters lint`: both source and test typechecks passed, including required-key types for existing providers and optional-key construction for the new APIs. +- `pnpm --filter @agentskit/adapters exec vitest run --maxWorkers=2`: 53 files, 584 tests passed. +- Current JSON HTTP rerun: all 16 checks passed, with assertion-level statuses in the evidence metadata. +- Built ESM/CJS API smoke checks passed for all new exports and deferred I/O. + +Cleanup: prebuild-generated ecosystem/knowledge/API-route changes outside the implementation diff were restored to their initially clean state; the task-created generated knowledge blob was removed. Stale task-owned build/lint/doc-bridge processes were stopped. Compiler outputs and installed dependencies remain ignored and available locally; no environment data or credentials were created. Raw task-owned temporary logs are removed after extracting allowlisted metadata. The final commit is report-only; the adapter tree hash remains the one recorded in the evidence metadata. + +The final tracked diff contains only adapters, matching docs, proposed ADR, generated modality table, local changeset and the evidence report. The coordinator's next action is to review these artifacts and resolve the documented global/doc-bridge gates; this dispatch reports failure because Stage 0 is not green. From b895af6c9c272dbb5464a08a72830eaf15bbfed3 Mon Sep 17 00:00:00 2001 From: EmersonBraun Date: Tue, 6 Oct 2026 19:28:41 -0300 Subject: [PATCH 06/13] docs: regenerate doc index --- .doc-bridge/capabilities.json | 2 +- .doc-bridge/index.json | 4685 ++++++++++++++++++++++++--------- 2 files changed, 3398 insertions(+), 1289 deletions(-) diff --git a/.doc-bridge/capabilities.json b/.doc-bridge/capabilities.json index 12af83459..30b48c10f 100644 --- a/.doc-bridge/capabilities.json +++ b/.doc-bridge/capabilities.json @@ -7,7 +7,7 @@ "name": "AgentsKit", "root": "." }, - "contentHash": "83ce51ebe17ccc5b526c6bd48030e713115cb385218ed5c17de3e30e19756316", + "contentHash": "ffc68ea697f611ccfe61927c43c9466b6a864d38a02aab3778eaf7a14f8c1f35", "artifacts": { "index": ".doc-bridge/index.json", "llmsTxt": ".doc-bridge/llms.txt" diff --git a/.doc-bridge/index.json b/.doc-bridge/index.json index e11cdbe0e..083074165 100644 --- a/.doc-bridge/index.json +++ b/.doc-bridge/index.json @@ -1,8 +1,8 @@ { "schemaVersion": 1, - "contentHash": "83ce51ebe17ccc5b526c6bd48030e713115cb385218ed5c17de3e30e19756316", + "contentHash": "ffc68ea697f611ccfe61927c43c9466b6a864d38a02aab3778eaf7a14f8c1f35", "contentHashAlgo": "sha256-normalized-v1", - "generatedAt": "2026-10-03T12:37:59.882Z", + "generatedAt": "2026-10-06T22:27:27.055Z", "project": { "name": "AgentsKit", "root": "." @@ -2308,7 +2308,7 @@ "document", "human" ], - "contentHash": "8649f719440a37aca548f897790f465b8d79504d41e535e291d7346485917757" + "contentHash": "889bf47adcd4b58deb371ef42e54791b990954cde712b3c6a3939ec5cf379f14" }, { "id": "document:apps/docs-next/content/docs/data/providers/openrouter.mdx", @@ -3735,7 +3735,7 @@ "document", "human" ], - "contentHash": "722820fab334813e3ab9ae1382c87d9e2aaa27f874c0f24917427e98378dc99b" + "contentHash": "374df5fb9fe1af9d8511f5f078ea51fae5e2d590eefc531f3c5f4a888131ec76" }, { "id": "document:apps/docs-next/content/docs/reference/packages/eval-braintrust.mdx", @@ -4426,12 +4426,12 @@ "type": "document", "title": "multi-modal.mdx", "path": "apps/docs-next/content/docs/reference/recipes/multi-modal.mdx", - "description": "Every provider has its own multi-modal shape. OpenAI wants { type: 'image_url', image_url: {...} }, Anthropic wants { type: 'image', source: {...} }, Gemini wants parts-with-inline- data. @agentskit/core provides a provider-neutral ContentPart model — adapters that understand a modality read the parts, the rest fall back to a text projection.", + "description": "Every provider has its own multi-modal shape. OpenAI wants { type: 'image_url', image_url: {...} }, Anthropic wants { type: 'image', source: {...} }, Gemini wants parts-with-inline- data. @agentskit/core provides a provider-neutral ContentPart model.", "tags": [ "document", "human" ], - "contentHash": "cb2013f2d179b7f36db952432cea91745e92160c23db10325ec078b5ebf805b1" + "contentHash": "0616db8b4ee20936940f6211c9b70d2f8883188dbfd9c53d5a572fff26adedf5" }, { "id": "document:apps/docs-next/content/docs/reference/recipes/open-specs.mdx", @@ -5595,7 +5595,18 @@ "document", "project" ], - "contentHash": "1b1f0dcbfd4593f294031ab43c99b5af93e1ecbd3d0e4186cec50c39f83065cf" + "contentHash": "3077743f11a0f1247886eba780727275a818b99d1cb4abca3febaa84dfb031ca" + }, + { + "id": "document:docs/adapter-modalities.md", + "type": "document", + "title": "adapter-modalities.md", + "path": "docs/adapter-modalities.md", + "tags": [ + "document", + "human" + ], + "contentHash": "cecf0b22615d11742cb07d40791edd49ff4d4a4aab9b0789cecb72c64b14e2b9" }, { "id": "document:docs/architecture/adrs/0001-adapter-contract.md", @@ -6017,6 +6028,18 @@ ], "contentHash": "697a4c044d5d149a6215b4fcd99733612db5add00ad76c415c7f2b3ff95a918d" }, + { + "id": "document:docs/architecture/adrs/0041-adapter-content-serialization.md", + "type": "document", + "title": "0041 — Serialize attachments at the provider boundary", + "path": "docs/architecture/adrs/0041-adapter-content-serialization.md", + "description": "Status: proposed; implementation ready for maintainer review", + "tags": [ + "document", + "human" + ], + "contentHash": "ee7624765cefcbd803ffa7f0666307f5cf732aa75b517e25620f4b9d2d6096ac" + }, { "id": "document:docs/architecture/adrs/README.md", "type": "document", @@ -6461,6 +6484,18 @@ ], "contentHash": "77706fd8391e1e6cc4c31c835ee0e1685796559ef284d16675b983fb0cbacbdb" }, + { + "id": "document:docs/evidence/adapters-multimodal-transport.md", + "type": "document", + "title": "Adapter multimodal transport — local implementation report", + "path": "docs/evidence/adapters-multimodal-transport.md", + "description": "Status: BLOCKED at repository-wide validation; implementation available for maintainer review. No release, publication, deployment, push or PR was performed.", + "tags": [ + "document", + "human" + ], + "contentHash": "60375d0c705c750d4f69a9a4ce5aaa5711c5de0f2b6f2e39e64a7e2fcb1ec490" + }, { "id": "document:docs/evidence/ecosystem-documentation-quality/README.md", "type": "document", @@ -6557,6 +6592,30 @@ ], "contentHash": "40eddcd3c332ec3d987257b97cb51bfe651abcd586240e479dbe656f1fd1c632" }, + { + "id": "document:docs/qa/ci-timing.md", + "type": "document", + "title": "CI timing report", + "path": "docs/qa/ci-timing.md", + "description": "Run pnpm ci:timing from a checkout with GitHub CLI access and built workspace packages. It summarizes the latest 30 completed ci.yml runs on main and the latest 30 completed pull request runs, including queue and total duration plus job and step p50/p90 durations and sampled failure and rerun rates. Run pnpm build first if packages/cross-platform/dist is absent.", + "tags": [ + "document", + "human" + ], + "contentHash": "64489de48aa73856678229a0102fbec42420fc0f9edc6b54c66f37f146f7a8e4" + }, + { + "id": "document:docs/qa/guardrail-report.md", + "type": "document", + "title": "Periodic guardrail report", + "path": "docs/qa/guardrail-report.md", + "description": "The monthly Periodic guardrail report workflow runs on main and supports manual dispatch on main. It adds the Markdown report to the workflow summary and uploads Markdown and JSON as the guardrail-report artifact. It does not write to the repository or create issues.", + "tags": [ + "document", + "human" + ], + "contentHash": "6e7dd272bcaa28e987e055e16f483ada8618c46ff8b61e57624ae1b4574aa642" + }, { "id": "document:docs/qa/vitepress-starlight-adapters.md", "type": "document", @@ -6819,7 +6878,7 @@ "document", "project" ], - "contentHash": "81357860a2849bf61ee3e04ae289e76d5f2000fd3a8fdb401295013053ce7f31" + "contentHash": "e07396cc5fe4db7b7aaa3f730045650fd977dba1563d9653614b71110c61699a" }, { "id": "document:packages/angular/CONVENTIONS.md", @@ -6927,7 +6986,7 @@ "document", "project" ], - "contentHash": "f9fa2088d8d1a2eb8ebb160f219dc2b6680ee8fd93d218f280c9a202089927a3" + "contentHash": "0ec82bce2e5d6dec7e4c2467c9b88901baa65690bb5b225bdef864a0b96b0470" }, { "id": "document:packages/eval-braintrust/CONVENTIONS.md", @@ -7666,12 +7725,12 @@ "type": "document", "title": "scripts/", "path": "scripts/README.md", - "description": "Repo-level CI helpers. Each script is dependency-free Node ESM, runnable from the repo root. They run on every PR + push to main via .github/workflows/ci.yml and a husky pre-push hook.", + "description": "Repo-level CI helpers, runnable from the repo root. Most scripts use only Node ESM; the bundle-size helper also uses the already installed esbuild dependency. They run on every PR + push to main via .github/workflows/ci.yml and a husky pre-push hook.", "tags": [ "document", "project" ], - "contentHash": "eb18ae071d9c61f0d05ca3d25cf1d1681b38c30753431b0062b9dfc0a2cb0970" + "contentHash": "5083faa366e399f18bc8829453e21b881fe98ff06cd539d83304ff72a573f90f" }, { "id": "document:SECURITY.md", @@ -7697,6 +7756,18 @@ ], "contentHash": "762356339ba5e546e7f6d1e52f5416ba97ae0f2edf5e477eec4c03820b14590d" }, + { + "id": "module:.github/scripts/pnpm-bulk-audit.mjs", + "type": "module", + "title": "pnpm-bulk-audit.mjs", + "path": ".github/scripts/pnpm-bulk-audit.mjs", + "tags": [ + "module", + "mjs", + "scripts" + ], + "contentHash": "94073d1102119af54b7847da170f99bb1ab7836b9d9ca9833fa828ec0dc9c4ac" + }, { "id": "module:agents/ecosystem-doc-bridge-corpus-scanner/agent.ts", "type": "module", @@ -10956,6 +11027,22 @@ ], "contentHash": "273b344239525842155c2d30cb208e21d5c16ab1148744463278c5864e3cc251" }, + { + "id": "module:apps/docs-next/lib/rag/frontmatter.ts", + "type": "module", + "title": "frontmatter.ts", + "path": "apps/docs-next/lib/rag/frontmatter.ts", + "symbols": [ + "ParsedFrontmatter", + "parseFrontmatter" + ], + "tags": [ + "module", + "ts", + "rag" + ], + "contentHash": "3f24733ccc7c6ed2bd6bda36bae6a7af6c51be0b7f281be30e326adf3ab71a0f" + }, { "id": "module:apps/docs-next/lib/rag/ingest.ts", "type": "module", @@ -10978,7 +11065,7 @@ "ts", "rag" ], - "contentHash": "f4d5b765ee672670f2fb612b7e209fe3513ea2c3ed7cba69d43e6cf3ee50a831" + "contentHash": "85104d4887e9498a5b6f965d89a3c7c4b1a05709bf1478f977634b4f1f8235a2" }, { "id": "module:apps/docs-next/lib/rag/retrieve.ts", @@ -11515,6 +11602,19 @@ ], "contentHash": "9492dbaa7f0b21a6fbecb831e0160a2550e381636a362a5d1d9366991cc9a3b1" }, + { + "id": "module:apps/docs-next/tests/rag-frontmatter.test.ts", + "type": "module", + "title": "rag-frontmatter.test.ts", + "path": "apps/docs-next/tests/rag-frontmatter.test.ts", + "tags": [ + "module", + "ts", + "test", + "tests" + ], + "contentHash": "c5a11b367f9dd87b1afbb171c53de878b3e97352c3146f9622d239504ec1f44a" + }, { "id": "module:apps/docs-next/tests/seo-surfaces.test.ts", "type": "module", @@ -13936,7 +14036,7 @@ "ts", "src" ], - "contentHash": "fb3ca3d419ae02b01e18aacf3ab500d1788879b093834bb39af1d6cca9ab1d70" + "contentHash": "bb6a07e39c6dbe3f1c6bbcec23e69e7df5b0fa1e6795b521ed7a30971f737fc9" }, { "id": "module:packages/adapters/src/azure-openai.ts", @@ -13953,7 +14053,7 @@ "ts", "src" ], - "contentHash": "4017a1f2f14a212dc0642a8b2313df6484988abfcdee56512eab0be77386f248" + "contentHash": "78cbc4bdb3e81b722f9d3b604b2eadfb2380deaec9bf407389dbe11493460799" }, { "id": "module:packages/adapters/src/bail.ts", @@ -13971,7 +14071,7 @@ "ts", "src" ], - "contentHash": "9cd525a481d4b9d582ed6fa664a017d81a0c144d9195b7668622d85d66c61080" + "contentHash": "239b7e63d87852f1c3565b0e0b5a5cc26936c928a6d82b7072c9621b8f8cf483" }, { "id": "module:packages/adapters/src/bedrock.ts", @@ -13989,7 +14089,7 @@ "ts", "src" ], - "contentHash": "432b0daedd35f2b7b4985a62339794e1dce277a1ebd99b2d8a3db598125f6b9f" + "contentHash": "6f3708b7e3f113334d2544b06c2fbb050c76f25ad8edc5bea78e6916ce302f27" }, { "id": "module:packages/adapters/src/carbon.ts", @@ -14009,7 +14109,7 @@ "ts", "src" ], - "contentHash": "795cccc7924c848ae7c4c401cf0e1eea56e65f99f28ba4f2e1ddd1abdb18ad3f" + "contentHash": "f671a5f27bb157c3066334b6caded7542f46bc1216a933ad2872b370f385cdc2" }, { "id": "module:packages/adapters/src/catalog/dispatch.ts", @@ -14026,7 +14126,7 @@ "ts", "catalog" ], - "contentHash": "9f8c4781b140aba7797ae817cd399e7893b811954e80a74d0d10a659655b245a" + "contentHash": "5e3a07cad66d3db3e61cd5fe939e5e176bbd4da3902fd4fe98563a396077dece" }, { "id": "module:packages/adapters/src/catalog/drift.ts", @@ -14045,7 +14145,7 @@ "ts", "catalog" ], - "contentHash": "ac879d8c3c8282e0e9481fe04433dfaa9b1bc2ac016850a76bfd1a68b0fa78f6" + "contentHash": "5cb776fcaa0492fb75619157ffeed497cfde39a3cb4d8d7b374ad70e83fd7f4f" }, { "id": "module:packages/adapters/src/catalog/index.ts", @@ -14143,7 +14243,7 @@ "ts", "catalog" ], - "contentHash": "e8e70bb8874772bfb0b69c09ec49c45ed67586a80b131ff01ff37702936fa4ae" + "contentHash": "036fd52e5713b3b8a8fa45dc23f77ab83073bc51751b6c681af9812f88358226" }, { "id": "module:packages/adapters/src/catalog/schema.ts", @@ -14198,7 +14298,7 @@ "ts", "src" ], - "contentHash": "be5385a938b076992292d132ec5177ac7a49ea6ba1b0b5d63685c116f0e02c34" + "contentHash": "f11613d0d1774507faef2543de5506bddff1cb17d4d9bd8d9dbb803504e13576" }, { "id": "module:packages/adapters/src/cli/claude-code.ts", @@ -14266,7 +14366,7 @@ "ts", "cli" ], - "contentHash": "f2bf8dc1974c016ef3b47a12d33e5cd670b255b0422eb9c5fd6d4fe4d0e26b38" + "contentHash": "192c1e3a9735cec67e448e3bb1f56b3d2123db2c7ef0bbd609436fbbc888cf4d" }, { "id": "module:packages/adapters/src/cli/json.ts", @@ -14283,7 +14383,7 @@ "ts", "cli" ], - "contentHash": "6337382fc624c798c389560ee3dc1a06b1b31e7f5f0c991c8dea78fae8fba66a" + "contentHash": "040922be34ff5dfe1a2715f306acd8bdbe992599204a97bb0d6616681865f177" }, { "id": "module:packages/adapters/src/cli/manifests.ts", @@ -14308,7 +14408,7 @@ "ts", "cli" ], - "contentHash": "73d7fb6bb8b95166474d55896c86e6738f26a7a1d7cef78e018d5210aacf3a37" + "contentHash": "1990d52c3d45ea637784336c0db0ae3a7982f624ca480bec56ff918486f65d39" }, { "id": "module:packages/adapters/src/cli/process.ts", @@ -14332,7 +14432,7 @@ "ts", "cli" ], - "contentHash": "8565c1496bee4ad90bc4a6b0266f31c9a42593a15367e4140d2bcb47dcabd409" + "contentHash": "bfe304240d12144293aa4dc4cb8d690442cde24f71f83eb7f476a20882eb7825" }, { "id": "module:packages/adapters/src/cli/prompt.ts", @@ -14351,7 +14451,7 @@ "ts", "cli" ], - "contentHash": "44bb8db50024458eea63b7d8d6d5acc065cecc78ffd4fcc02f3e3b2c9e21899a" + "contentHash": "d5f2c02ce9ce6bdaa384a2349e7858dc96de8efbdb600c2b696443f430133823" }, { "id": "module:packages/adapters/src/cli/types.ts", @@ -14380,7 +14480,25 @@ "ts", "cli" ], - "contentHash": "b9c7e9a5f2188c3bdbe475446c0db0c6c8a0151b5ca8239639409950006fefd0" + "contentHash": "6a98e2a39cddfbded09b62bdc3d53a3c1b38f36b797c31b5d032187e2376e0ea" + }, + { + "id": "module:packages/adapters/src/cloudflare.ts", + "type": "module", + "title": "cloudflare.ts", + "path": "packages/adapters/src/cloudflare.ts", + "symbols": [ + "CloudflareAiGatewayConfig", + "WorkersAiConfig", + "cloudflareAiGateway", + "workersAi" + ], + "tags": [ + "module", + "ts", + "src" + ], + "contentHash": "79620d21cd40807b05e76f231a76b9b24bd6e87186508e9569decbfbc7e8b73b" }, { "id": "module:packages/adapters/src/cohere.ts", @@ -14397,7 +14515,23 @@ "ts", "src" ], - "contentHash": "6bb8fe82eb59bacf3ac6012b994ab681c000aa7b59411630e5288521714cd1b4" + "contentHash": "65c009fb57c33513f74adea37dd218e8eba5735ebac0ab511f3e7a3d3e2c731a" + }, + { + "id": "module:packages/adapters/src/content-parts.ts", + "type": "module", + "title": "content-parts.ts", + "path": "packages/adapters/src/content-parts.ts", + "symbols": [ + "CapabilityUnsupportedError", + "providerParts" + ], + "tags": [ + "module", + "ts", + "src" + ], + "contentHash": "188da6a73f154b21bf50a482b473529789fb115b965d0e0f8dd5caf82e46d680" }, { "id": "module:packages/adapters/src/createAdapter.ts", @@ -14412,7 +14546,7 @@ "ts", "src" ], - "contentHash": "ab8b72ccee8ca85dc74e58ff4915b502e8f24b35841918784b403f48169c0baf" + "contentHash": "395edba22859e7692a8a3687b5b2fd16720b89c4c887ac40542278f063a992d2" }, { "id": "module:packages/adapters/src/deepseek.ts", @@ -14428,7 +14562,7 @@ "ts", "src" ], - "contentHash": "feb9587d2e6e72187257b57fdf4b9a7cd00b17368480cc42927ecd6159ae0521" + "contentHash": "21e4bafb77651a403aea5882244a0615fd9083aa3c99b271409815516d7f5d20" }, { "id": "module:packages/adapters/src/deprecation.ts", @@ -14450,7 +14584,7 @@ "ts", "src" ], - "contentHash": "7e86de1f3935b8aee22112a18877b28cf67c9c88133942ae16fa5fd3d01cd474" + "contentHash": "c4c56377434c4aadee08959303fef37b296e9867e2c48c9a72894e59ad0987e5" }, { "id": "module:packages/adapters/src/embedders/deepseek.ts", @@ -14466,7 +14600,7 @@ "ts", "embedders" ], - "contentHash": "234ee99f7c66aeb10d4e8b7172c56222dc1975ca17d60d03a0c935142611ebf8" + "contentHash": "4770c7ee432e3ea685d68bd4bfbccde3a97eb6d3f02e26ec0b1fd142c5786445" }, { "id": "module:packages/adapters/src/embedders/gemini.ts", @@ -14482,7 +14616,7 @@ "ts", "embedders" ], - "contentHash": "b377361a9035dd481bf3194e2a5aceb18d2574d9ebdfaff60b0ce17df30acf5e" + "contentHash": "972b38b39a719c883baa896c2913fb73317d84f481c879541f1f669de21e9212" }, { "id": "module:packages/adapters/src/embedders/grok.ts", @@ -14498,7 +14632,7 @@ "ts", "embedders" ], - "contentHash": "0099900b24c6f0aa0055fbd64d228bccb05b390e3b2dd49d2382da42c27cc46e" + "contentHash": "e6ec3dccfd1fe5677597b9457b4b1844355bf5026c1314bf72806cf7365f9398" }, { "id": "module:packages/adapters/src/embedders/index.ts", @@ -14542,7 +14676,7 @@ "ts", "embedders" ], - "contentHash": "261e0030febb462dc788aa0e3259005fbb18f1d45466f2442b993b0770378a85" + "contentHash": "2cb42ee1bc7b24446818826f930328d1e3ea5f12cd666026b2beeb75f6a40b13" }, { "id": "module:packages/adapters/src/embedders/ollama.ts", @@ -14558,7 +14692,7 @@ "ts", "embedders" ], - "contentHash": "0bf2bd0a5ecef95dada59b58351e9e9c6e96572f572907f2bfe7babf9d81fd85" + "contentHash": "eee191d70d54d75393e463990288afc6e2ee902989dc7e013eac1fc514f7d556" }, { "id": "module:packages/adapters/src/embedders/openai-compatible.ts", @@ -14574,7 +14708,7 @@ "ts", "embedders" ], - "contentHash": "e795e9dcf1fbcd6548eb1cce78d1cd69a1f0edacf07cc170ab01998011735549" + "contentHash": "cc3b56627aca3e1e8203c289256bb35615b2cb6fa991ab48491c2e0f603f0a1c" }, { "id": "module:packages/adapters/src/embedders/openai.ts", @@ -14590,7 +14724,7 @@ "ts", "embedders" ], - "contentHash": "df747e737d294075f1be831bcb3505b31d407e23f3d0e25ceb599e1cf86e5e72" + "contentHash": "ea7440570ed22fefa420e9d3ba3590dd5a4e4450fd80c3941ac9494cd8021ea0" }, { "id": "module:packages/adapters/src/embedders/shared.ts", @@ -14627,7 +14761,7 @@ "ts", "src" ], - "contentHash": "cfd83f8db7f1985e280c158c72abced84e2e23c8f2a9fb2014fda00d1f84ecda" + "contentHash": "7620958727b941272c710c43dabafc9a6c56edfea753836cbf036f28f3e76a46" }, { "id": "module:packages/adapters/src/fallback.ts", @@ -14644,7 +14778,7 @@ "ts", "src" ], - "contentHash": "3cee2cb7f93c3e61cdc32c017cc9525f9aad0775026cd90161aa08b4dbcce44c" + "contentHash": "433b7b8a02e54b1891ccd9cbf920054f98c5e33e71b815a9b0f98c0d9240bc8c" }, { "id": "module:packages/adapters/src/fireworks.ts", @@ -14660,7 +14794,7 @@ "ts", "src" ], - "contentHash": "6946b285f8ddeaa930630c65b38f389c8b1ff3ba3d74a42e4fc846145af6c4bf" + "contentHash": "711c1be1530a07d1c559d516b08adfe4a65f6a495267da49c486f199b16b3ffa" }, { "id": "module:packages/adapters/src/gemini.ts", @@ -14676,7 +14810,7 @@ "ts", "src" ], - "contentHash": "2556dce4da5abc85f98a40ee83420fdfc3cfedf9e4dc6725104fce9bc3a1215c" + "contentHash": "b698488da5f5c2ba3c23963b3507c81809a881235f9a6b5cffc9a049433da2c8" }, { "id": "module:packages/adapters/src/generic.ts", @@ -14691,7 +14825,7 @@ "ts", "src" ], - "contentHash": "79a1a7b51551ecaa310a0d488975412ac4b73acfad6ea6e5e23a697f601e3f66" + "contentHash": "067f0806520295ef3cd9411c2b618d90b7c4dbd71d98598a925c685ed76200d1" }, { "id": "module:packages/adapters/src/grok.ts", @@ -14707,7 +14841,7 @@ "ts", "src" ], - "contentHash": "d4268220b30c79dbf54ba95ea40d5e6801285b30a88f094fd96a85332ee4eb80" + "contentHash": "8066d1d9dd418415737a23c96521f90dbe99a34390e5d596e53a2828e2800819" }, { "id": "module:packages/adapters/src/groq.ts", @@ -14724,7 +14858,7 @@ "ts", "src" ], - "contentHash": "b0bc17787f73a27b1adbfa23e2caa3ef5de34a6e3413f0c218deae389c7f7024" + "contentHash": "ac97deecaa43db66b678babd9b0120e7c8ec84b282d3d9df799133c54c279dd2" }, { "id": "module:packages/adapters/src/huggingface.ts", @@ -14740,7 +14874,7 @@ "ts", "src" ], - "contentHash": "04446032d7298fce2b2a7550397cd2b5c5562179952f387b0d24578c9586c9d9" + "contentHash": "6114499009e4084e2333def3babd7cdaf4d7bd987ccb90beb04aafaaa0c5e58a" }, { "id": "module:packages/adapters/src/index.ts", @@ -14754,8 +14888,10 @@ "BailConfig", "BedrockConfig", "BedrockRuntimeClientLike", + "CapabilityUnsupportedError", "CarbonTable", "CerebrasConfig", + "CloudflareAiGatewayConfig", "CohereConfig", "CreateAdapterConfig", "CredentialRefreshable", @@ -14792,7 +14928,9 @@ "ModelDeprecation", "OllamaConfig", "OllamaEmbedderConfig", + "OpenAICompatibleConfig", "OpenAICompatibleEmbedderConfig", + "OpenAICompatibleTransportConfig", "OpenAIConfig", "OpenAIEmbedderConfig", "OpenRouterConfig", @@ -14814,6 +14952,7 @@ "VertexConfig", "WebLlmConfig", "WebLlmEngineLike", + "WorkersAiConfig", "anthropic", "applyCarbonTable", "azureOpenAI", @@ -14825,6 +14964,7 @@ "cerebras", "cerebrasAdapter", "chunkText", + "cloudflareAiGateway", "cohere", "cohereAdapter", "createAdapter", @@ -14857,7 +14997,9 @@ "mockAdapter", "ollama", "ollamaEmbedder", + "openRouter", "openai", + "openaiCompatible", "openaiEmbedder", "openrouter", "qwen", @@ -14875,14 +15017,15 @@ "vllm", "webllm", "webllmAdapter", - "withDeprecationPolicy" + "withDeprecationPolicy", + "workersAi" ], "tags": [ "module", "ts", "src" ], - "contentHash": "219fd72d02c77632ca34d8c9247d0b3427a9b9cdcaf3837d7d400e386aafec1d" + "contentHash": "fc0b76056685ae8b01ec4c33e2d89fddebf702733de3993b9477b5af0d6f920a" }, { "id": "module:packages/adapters/src/kimi.ts", @@ -14898,7 +15041,7 @@ "ts", "src" ], - "contentHash": "a33269698e806a1d4e806dea7090aabf7da8f33fa8cc324f3ee345725f1f3845" + "contentHash": "47383ed5ccc0d4e6b26bed21610ad67fb7b5570e1c4af825115c8c98456fe46c" }, { "id": "module:packages/adapters/src/langchain-bridge.ts", @@ -14916,7 +15059,7 @@ "ts", "src" ], - "contentHash": "0f999b869e8e80c3a213af43181571e77ac40d3a56660f59f396f2ce3bc9e91e" + "contentHash": "341ed7c00d9948125ee29b88e010366460f35939c620d1a587b8228544617294" }, { "id": "module:packages/adapters/src/langchain.ts", @@ -14934,7 +15077,7 @@ "ts", "src" ], - "contentHash": "0a7fe77e0926762744ff187368b06407aa1cccb7610b409951ddcb5566f728b2" + "contentHash": "f27caaf163cd265022171e3587e27f5049aa15f175162769a3141763dc0c4361" }, { "id": "module:packages/adapters/src/llamacpp.ts", @@ -14950,7 +15093,7 @@ "ts", "src" ], - "contentHash": "5b21b186b14b5f535bd65009c2d22b8ef8b96836e48b1b5ee7128a44f6cee54b" + "contentHash": "61bb2c1883f5cd2064980b64faea51bfdd9b82de8e802f1fb6c4366f8b998c98" }, { "id": "module:packages/adapters/src/lmstudio.ts", @@ -14966,7 +15109,7 @@ "ts", "src" ], - "contentHash": "205045938e4caf5c858559f89ae39e758471bd1406cfd1bd0b3e1f5abd55badf" + "contentHash": "2615afd4a2b91cdb22dc6cbbf26bebb94e8977cac34a5f952f4ee5d15e40a057" }, { "id": "module:packages/adapters/src/mistral.ts", @@ -14982,7 +15125,7 @@ "ts", "src" ], - "contentHash": "b00e761af0cf646039ef53ed7cce2b63d629fe458e42f9a0df2756a73eec1c83" + "contentHash": "af943f8c2e0ef69ff3ed2a2864ae7b586e14c5d765cbcfc0c8c6211f64df4b44" }, { "id": "module:packages/adapters/src/mock.ts", @@ -15005,7 +15148,7 @@ "ts", "src" ], - "contentHash": "1db143903d47752c31e3da14f0ed7a51050f5ac51c54a9bd8a1ea4566b3c4f02" + "contentHash": "807690c70fae4f72a422807aa099267cfb33e23fe4e365d875b184c544b5ffe0" }, { "id": "module:packages/adapters/src/ollama.ts", @@ -15021,7 +15164,7 @@ "ts", "src" ], - "contentHash": "6858cd78e4ebb801a3ef3d9c36293dd7c9fe34f84683a671497fea45bf72162a" + "contentHash": "e1c04dc74efdc2cd8ea98b14caa0fe49bfc857d71aaca384327d3786ad148f7c" }, { "id": "module:packages/adapters/src/openai-compatible.ts", @@ -15030,14 +15173,16 @@ "path": "packages/adapters/src/openai-compatible.ts", "symbols": [ "OpenAICompatibleConfig", - "createOpenAICompatibleAdapter" + "OpenAICompatibleTransportConfig", + "createOpenAICompatibleAdapter", + "openaiCompatible" ], "tags": [ "module", "ts", "src" ], - "contentHash": "6810d8d6c52d0f3d659207dd7a186d82c78a0df9bbbf7e608dacc6b2169b7e64" + "contentHash": "5f923042374235e3aafbbef2974270d4faf76785b19286614540d0d09cd14f57" }, { "id": "module:packages/adapters/src/openai-stream.ts", @@ -15068,7 +15213,7 @@ "ts", "src" ], - "contentHash": "bd6ac4932d5b787e5c63041e1bbe4522d283f13ef418d8c6b6dc40e02c198c28" + "contentHash": "d0b43ebc80e543c2644c303eaf2e994f49295eb03a9684d4334c79c48a70bf74" }, { "id": "module:packages/adapters/src/openrouter.ts", @@ -15077,6 +15222,7 @@ "path": "packages/adapters/src/openrouter.ts", "symbols": [ "OpenRouterConfig", + "openRouter", "openrouter" ], "tags": [ @@ -15084,7 +15230,7 @@ "ts", "src" ], - "contentHash": "0c1e0e9e2d93513d83e9a59c5522bc8e74021e4ba1116e1b59229f58d15cf3b5" + "contentHash": "50f46dccd29e8ed0ef860d1466b69f2f40865c421fa0d8c6ed923f8ef9015b2f" }, { "id": "module:packages/adapters/src/replicate.ts", @@ -15101,7 +15247,7 @@ "ts", "src" ], - "contentHash": "14f2eae03bf1a0008e9ffe8f3c7c9139cee911be170031155c778f91d742891f" + "contentHash": "61ef29176923981427bd21efc5d99d6395c25087057a676e0f7055ae19da1b26" }, { "id": "module:packages/adapters/src/retry.ts", @@ -15135,7 +15281,7 @@ "ts", "src" ], - "contentHash": "ec818e29870ef046998c64f3f9074811d6463c3cae170eb0325e1e2bf6afa481" + "contentHash": "2ef50c99bbd92e9eb004e3a6628382f5549aa40bb16e3a1b1cefb53c22882678" }, { "id": "module:packages/adapters/src/stream-errors.ts", @@ -15217,7 +15363,7 @@ "ts", "src" ], - "contentHash": "841ae88db0a4acf3e5cd1cc4622e4371f3adca75c85832b0189aad516ed99d36" + "contentHash": "4c100f50f729ca893a5ed9763ede784134c696ea26ba9a76cd6a66bbf7fee568" }, { "id": "module:packages/adapters/src/tool-history.ts", @@ -15233,7 +15379,7 @@ "ts", "src" ], - "contentHash": "6fbcd004ffe0aa203d2e1338b87b7e4566ee8bddcaed5fd5a7a4fd5ea79e0ac1" + "contentHash": "bbb6d4cfc92b2fbf8cd13bff728fbb3d424d172a7194da0aaa54bcae24dc35bc" }, { "id": "module:packages/adapters/src/types.ts", @@ -15249,7 +15395,7 @@ "ts", "src" ], - "contentHash": "38f7dc214f0096326a35b9a17256485565659958712b1732713e9cce9a97ffa0" + "contentHash": "60a17d4444f280d8736d1204417088d1af9df438d53c11091427c37d9fa8ca9d" }, { "id": "module:packages/adapters/src/utils.ts", @@ -15275,7 +15421,7 @@ "ts", "src" ], - "contentHash": "a116b36e8da34bd4cf227428863e807c1eccd9999bd5ef183f8cbdcd1fee9883" + "contentHash": "b6a9e2a99fc39f1f0d21ac787c4cb170f7d9ca955a619d0d5673526eea0185e5" }, { "id": "module:packages/adapters/src/vercel-ai.ts", @@ -15292,7 +15438,7 @@ "ts", "src" ], - "contentHash": "8b48cb7b20d30fdb24436be34f93dad356beac31ee9c9f1ee6bf5eb76d6c744a" + "contentHash": "ad64103daf6ca6817f6308f6094fea1bd44ebeda5c27b2f59e53bc08d12a144d" }, { "id": "module:packages/adapters/src/vertex.ts", @@ -15309,7 +15455,7 @@ "ts", "src" ], - "contentHash": "b17e8ea80d0724412e050537b7b4e0db70c6d05d3f9e6cf7f16eec794ef52148" + "contentHash": "52d2f44a51bc1f1e2398cd2a80f023668a27e38fcccc729a4e2596e06aa91445" }, { "id": "module:packages/adapters/src/vllm.ts", @@ -15325,7 +15471,7 @@ "ts", "src" ], - "contentHash": "b078fda67d791cde347012173216c7d9b44ef5972cfa9380d153e78c03d41eb0" + "contentHash": "225abe0df46441de94e039d6ec2772a9317e5a45667c817083dda93bfc311003" }, { "id": "module:packages/adapters/src/webllm.ts", @@ -15343,7 +15489,7 @@ "ts", "src" ], - "contentHash": "1cb42c966799c8290701c06cf60fd1d2be1e08da12d97e38361104cdf44285a3" + "contentHash": "6d9baba959f78b6d3c358d11d625201d2aae6ce7e648bcdccd17d8ac13131ae8" }, { "id": "module:packages/adapters/tests/azure-openai.test.ts", @@ -15545,7 +15691,7 @@ "test", "tests" ], - "contentHash": "7a610015f17a2d6c47a535c0c6a4662f26b2ea79998ee11795495e8535aa3fa5" + "contentHash": "523cf3ca5a8cc0abd4454cf2294c96f895bc33953ec0f1bc5ec855fe4c4f9125" }, { "id": "module:packages/adapters/tests/cohere.test.ts", @@ -15729,6 +15875,19 @@ ], "contentHash": "45587e0795c55b9f5beb24614fcaf92d2844591d7d052ef3d5ad2ade2c59e7b2" }, + { + "id": "module:packages/adapters/tests/gateway-types.test-d.ts", + "type": "module", + "title": "gateway-types.test-d.ts", + "path": "packages/adapters/tests/gateway-types.test-d.ts", + "tags": [ + "module", + "ts", + "test", + "tests" + ], + "contentHash": "cb7ac059b1f0aa928142ea6359d62c57c7355221b4c97656ee51589a15b3dc6c" + }, { "id": "module:packages/adapters/tests/gemini.test.ts", "type": "module", @@ -15807,6 +15966,22 @@ ], "contentHash": "13a968c5c0c06720f03fe2730f9898950bf1c20d917340d4141f34ee6141c280" }, + { + "id": "module:packages/adapters/tests/multimodal-http.test.ts", + "type": "module", + "title": "multimodal-http.test.ts", + "path": "packages/adapters/tests/multimodal-http.test.ts", + "symbols": [ + "multimodalCases" + ], + "tags": [ + "module", + "ts", + "test", + "tests" + ], + "contentHash": "c0668ae950aa93876016f11e184826392d92f19ea175951905e38df847072931" + }, { "id": "module:packages/adapters/tests/net-migration-http.test.ts", "type": "module", @@ -16067,7 +16242,7 @@ "ts", "adapters" ], - "contentHash": "714be856737be775b63589b1d3cc320ce859c87d6fc66fdb578a5ee7ec823b47" + "contentHash": "8ea4aa1fc8d9af92c677fdff313f94099dc9d2ef4d800f8908f0a79ed6ac6789" }, { "id": "module:packages/adapters/vitest.config.ts", @@ -16134,7 +16309,7 @@ "ts", "src" ], - "contentHash": "b0aa25ac55d58d63e73d76783f1b77dbd769029f052586599d4acc9663320a47" + "contentHash": "c189feaa2ea89df2eabe317de403ae5e9ca8d89ad3094622f5bfc13112ebae4f" }, { "id": "module:packages/angular/src/index.ts", @@ -16223,7 +16398,7 @@ "ts", "angular" ], - "contentHash": "8602b3e31cf00d72ee52e07a47c40dbfabc2a932fb584bb984d2bb8668f96de6" + "contentHash": "ccfdd4944f8390c7dfd6c61c8e97c48882dfe76a7979089b6d6825dec475625f" }, { "id": "module:packages/angular/vitest.config.ts", @@ -16308,7 +16483,7 @@ "tsx", "app" ], - "contentHash": "8565e5297680f6fb8c0d6c4b5864ca5b5e54ed90dede714edc774a68a60a562b" + "contentHash": "e1abf3598610080b4af842508a5d7e42989defaed0e71cf98dd387851ff0d30e" }, { "id": "module:packages/cli/src/bin.ts", @@ -16489,7 +16664,7 @@ "ts", "commands" ], - "contentHash": "60f000d6cbd432560f0daa2b891c07eeb13e3c6dcd1960c5b5cd4e5836a7d750" + "contentHash": "5745811101852bd20c841d92ff9897bdf98a226109e99771d5201d0c0ee9b6a0" }, { "id": "module:packages/cli/src/commands/init.ts", @@ -16851,7 +17026,7 @@ "ts", "src" ], - "contentHash": "7aefbc94f169e27c0bc45151666aed15cd7b9d6966628a9d3e2aa6bb850fe030" + "contentHash": "d04801210b144c75e2c9236a6a4fed68698aa28680a91234c050a970d9959b99" }, { "id": "module:packages/cli/src/dev.ts", @@ -16869,7 +17044,7 @@ "ts", "src" ], - "contentHash": "472ae1e604a964addf578860cc8613e9fdb0794058e5b64c44a20e01d1755a22" + "contentHash": "afcb978bb6e0b41243849cc717db68cf1f3ef5a6ac51b66a6fcb302e36055a1f" }, { "id": "module:packages/cli/src/doctor.ts", @@ -16896,7 +17071,7 @@ "ts", "src" ], - "contentHash": "707efc2baa54e118a1546478917e55494ed7c9563056ef86a1e62e748f67e9b3" + "contentHash": "436b08aba47962cf6351cc80f22ab40cef9df39738869e5f7d23c274e9afeab3" }, { "id": "module:packages/cli/src/extensibility/hooks/index.ts", @@ -16931,7 +17106,7 @@ "ts", "hooks" ], - "contentHash": "cf2eab1e2cb611cfb8b8caaaf135974a71869cd9f70bc4c070b9802f30d5095c" + "contentHash": "2564db6a1bf83f379fb64c3bc48b2f9b915594905e52f49b14df819fe18da7ba" }, { "id": "module:packages/cli/src/extensibility/hooks/shell-hooks.ts", @@ -16948,7 +17123,7 @@ "ts", "hooks" ], - "contentHash": "f3a1dc4b9b0d9702b2f261d83d4c4b5a6e2667a9195417a9b23fa574cee813b8" + "contentHash": "4214cadb64cd9957a34912bf1353199bc26262f5440ad41a16b2a4d29de619a0" }, { "id": "module:packages/cli/src/extensibility/mcp/bridge.ts", @@ -16965,7 +17140,7 @@ "ts", "mcp" ], - "contentHash": "aa69f3bded8ab431c724564fdb69e5772a3849be4729a1baf2a8480099017ea9" + "contentHash": "e3a1fb7601a3579574648eb194882ccf082924e01e3a03856b5942d0d93a8323" }, { "id": "module:packages/cli/src/extensibility/mcp/client.ts", @@ -16981,7 +17156,7 @@ "ts", "mcp" ], - "contentHash": "289b9f5400817cc36c442bcce810756786446f61eae175869ebf9df206e4a494" + "contentHash": "bd294a8a6d54aaff4de817d9b076c7772b94a1a7fd10fb734e30662e9c05cdf4" }, { "id": "module:packages/cli/src/extensibility/mcp/index.ts", @@ -17044,7 +17219,7 @@ "ts", "permissions" ], - "contentHash": "105b974a3a1105f9f878c1e9bb47a9c9436b4157c59bed6889b20a615bef1893" + "contentHash": "731bc7141b697800a6ad1f82c483fcb41ccc934becd8e0b1d80e9acf98508dd5" }, { "id": "module:packages/cli/src/extensibility/plugins/index.ts", @@ -17078,7 +17253,7 @@ "ts", "plugins" ], - "contentHash": "23ad75fcf3b8e9b7bbf704475c32af2768350156aeec38b9001e192a077dec29" + "contentHash": "6fb38bbeca7c23572f7de287596570a5d74a73f4a3e39fc8afe484f2e01d4be9" }, { "id": "module:packages/cli/src/extensibility/plugins/types.ts", @@ -17102,7 +17277,7 @@ "ts", "plugins" ], - "contentHash": "8fe27734f16df90e4696e34951bd08a8018c53027d65b3116510bc448feacf87" + "contentHash": "19ffbddef4b62f7cd71c166cefc6c1a3d24b265bf22b3ba2a3ebbb7bdea9f8ea" }, { "id": "module:packages/cli/src/extensibility/rag/embedders.ts", @@ -17118,7 +17293,7 @@ "ts", "rag" ], - "contentHash": "36c5ad56faaa9e2b0ca58dc03da90e814b74f535cf47875db2f23bb6890eb1b4" + "contentHash": "adf3b1c45361d8a68c5a1e5990b16e78d55031873c897f2b7fae597c55479d20" }, { "id": "module:packages/cli/src/extensibility/rag/index.ts", @@ -17159,7 +17334,7 @@ "ts", "rag" ], - "contentHash": "7e0cf9f07721e69f0819628994936dc5996c46d7542d6b86596e204efc0f24d1" + "contentHash": "5fafd7ab3bb41006f745f55c1fe8b0143db69b0d050e97bf95de12ba95c2610a" }, { "id": "module:packages/cli/src/extensibility/telemetry/index.ts", @@ -17199,7 +17374,7 @@ "ts", "telemetry" ], - "contentHash": "ca603dfd3f9ddca2e1632ad312e98703ef6c736a08ccf640ac82d35a1f190dbc" + "contentHash": "03c51f0042d5c2e7507fa99233de80147bb225e63a28976aafd44b2647e97684" }, { "id": "module:packages/cli/src/index.ts", @@ -17370,7 +17545,7 @@ "ts", "src" ], - "contentHash": "a776d0f5dcde999f50ae14a9394041861089464964b94d1254bef93c17044b0c" + "contentHash": "c87e9d953d0a9c45e3522f9c13df4e6be118bcc4c7eeafd0f96dc56321d740b0" }, { "id": "module:packages/cli/src/pii.ts", @@ -17427,7 +17602,7 @@ "ts", "src" ], - "contentHash": "fd29a2fac4f9c9471ca4c31934ba8cbd68fdd105dc89dc8daf6e13687f277d44" + "contentHash": "7df066de11b6de2b5f010258344ca8edf56f857469a2bc54d51bd3527ea1312d" }, { "id": "module:packages/cli/src/registry.ts", @@ -17586,7 +17761,7 @@ "ts", "src" ], - "contentHash": "c32f2edf094eca9bea5b38935aeebace9289b289feb1dc985c2cf78ace57ef36" + "contentHash": "20c0122523dd4e994fc26454a1ba144ddc259960646793546e4037245ad95138" }, { "id": "module:packages/cli/src/runtime/use-runtime.ts", @@ -17661,7 +17836,7 @@ "ts", "src" ], - "contentHash": "a085df4057ebf01182b8c51e58bc66a6ed9355c910637b106cd24513b6417b55" + "contentHash": "f7a3750df0a2d81d67b77e77b8de1c4053f07e4df961920922849a39f5c1424d" }, { "id": "module:packages/cli/src/slash-commands.ts", @@ -17699,7 +17874,7 @@ "ts", "src" ], - "contentHash": "7579053f1eb126da9539c3ff3ea7bac62d6143a0f0c5e29e06c27671f77ab0a7" + "contentHash": "ab918ab229b433c63d3d4f31195a6e94539e2a5f6fa8de7fb8f231ec4710de4c" }, { "id": "module:packages/cli/tests/ai.test.ts", @@ -17842,7 +18017,7 @@ "test", "tests" ], - "contentHash": "d5113c960c14c60f0e2f7c14090820cdb1e8e5e5d683d1d8e85e0b8a6d0fb252" + "contentHash": "1bbf192a7ca5f148691c2d962c196b800cab0479e1ef183c9729b27eecb9291d" }, { "id": "module:packages/cli/tests/components-flow.test.ts", @@ -17855,7 +18030,7 @@ "test", "tests" ], - "contentHash": "4fccd2b220daccaa9e1dc90e838216cddbefa048539042967e27de9442892e97" + "contentHash": "1dc3587349bad713146dff7b9d534fd5ecb42db39546dac043832a21f4028d19" }, { "id": "module:packages/cli/tests/components-install.test.ts", @@ -18114,7 +18289,7 @@ "test", "tests" ], - "contentHash": "d6285c0f2e5acd578447403b9e07f6b0a7188aa022895a25796e028a3b94d4c5" + "contentHash": "3e5a025a2c2f30cadfcba1d6f3eadf57a02cd7bf12273064948e98bd1a68cc5d" }, { "id": "module:packages/cli/tests/mcp-extended.test.ts", @@ -18270,7 +18445,7 @@ "test", "tests" ], - "contentHash": "0c6029f53e5a42297475fd01949ea7de310247645ea2a759e897d3a250d43307" + "contentHash": "f55febb7ba121d1262a556733a9f9e11cc666ab21c8657d8085216978b0dc5ff" }, { "id": "module:packages/cli/tests/resolve.test.ts", @@ -18467,7 +18642,7 @@ "ts", "cli" ], - "contentHash": "8e41a9a70c4953b78040576bb678c39c8b87f43f14249a1d20b57ff8e14e5365" + "contentHash": "50b65d25105ae6012fc7c743fe7a8175a994486dc931d656fffddffb84f1d00c" }, { "id": "module:packages/cli/vitest.config.ts", @@ -18518,7 +18693,7 @@ "ts", "src" ], - "contentHash": "e180a9badae77b04069d1994863f982b92768fbcfc6dac28c6c75b3535369f48" + "contentHash": "ee6f1c8ce21515491b5c3ffd61f9d542059a8eb9b470689b61dbb69deb5400cb" }, { "id": "module:packages/core/src/agent-loop.ts", @@ -18539,7 +18714,7 @@ "ts", "src" ], - "contentHash": "ca8f3598ebf14f47f46d412bfda13fb0bcae779a2cc76a2e8871ea8ba27b37b0" + "contentHash": "7cf667360a45fe2d4572a987972fdf8c824589fcf3d105cda64a5f746cc20f8a" }, { "id": "module:packages/core/src/agent-schema.ts", @@ -18561,7 +18736,7 @@ "ts", "src" ], - "contentHash": "0227f4a2fb08c2b2db285e71d02500ab5cc93306cb8357aa44ad7127ca2c7449" + "contentHash": "86d003195129800633e4419755a4348c3dc94b8fab0a0842631ee1ab624a0cd7" }, { "id": "module:packages/core/src/auto-summarize.ts", @@ -18577,7 +18752,7 @@ "ts", "src" ], - "contentHash": "016913ab83641065a823dd3619924afa41c49ec216e416c08fbd0a7bcc2cd66d" + "contentHash": "2218ed6bbe84f3e5f1e6c5ec6fdad937b04e06ab35809f4036703e790d164ded" }, { "id": "module:packages/core/src/budget.ts", @@ -18596,7 +18771,7 @@ "ts", "src" ], - "contentHash": "8e6a6dc971e479c97d14c7be0db8015d44478077047f908a9e03fce87ae0cfee" + "contentHash": "d5271933434bd4e7389a210d8d393f56cb0d4f5a6898e35bdd955f020d4e9508" }, { "id": "module:packages/core/src/compose-tool.ts", @@ -18613,7 +18788,7 @@ "ts", "src" ], - "contentHash": "ad186aa317b9f32992db5c3e2fe6a057bce5199374af2cb01a44cf35288b95c8" + "contentHash": "f6e2b5c6242fa4e720df73a1e45415bbc1e529db94ab302fdbd20970562cbdd3" }, { "id": "module:packages/core/src/controller-helpers.ts", @@ -18682,7 +18857,7 @@ "ts", "src" ], - "contentHash": "01cab9eadbb2cd4e2fef2b9a588dea187779df2fbc21ec6d09f718fe77f5aa99" + "contentHash": "4a90940f2a0f10cb1b7c9e3b0ee12ac3657411bf5bc91418288992a7aac3489b" }, { "id": "module:packages/core/src/errors.ts", @@ -18705,7 +18880,7 @@ "ts", "src" ], - "contentHash": "504be503f3b49d25d42034ab36754ee6908bd5c721194f03b520f916b16fd83e" + "contentHash": "b68b22a0cc976f9288b1dadc2b79aae40d0fa5a883319d292a505dc123f573aa" }, { "id": "module:packages/core/src/eval-format.ts", @@ -18727,7 +18902,7 @@ "ts", "src" ], - "contentHash": "7976a613ff9b833dcd17c51471b2d1b70e6e9f59fce96a0cfb0db115f03c3aa2" + "contentHash": "9eb754992ab7490bf01b1d8545216025d3eae127a67846205fabc816a51dfbf3" }, { "id": "module:packages/core/src/fuzzy-match.ts", @@ -18744,7 +18919,7 @@ "ts", "src" ], - "contentHash": "3a9bc2dd060eb0991450bc4b878760d2c7ebdbd142d1331a8dda17cbcb4acabd" + "contentHash": "5a3d4bf46bc0d44daba392755decfdf8b6faab36bf5b95d6f1f966af1484011c" }, { "id": "module:packages/core/src/generative-ui.ts", @@ -18779,7 +18954,7 @@ "ts", "src" ], - "contentHash": "4e682b62d7cd4f8eb95f80fdaa1cf968da600f73b76a2163ad8d8977b18703a8" + "contentHash": "3b258a20e1cd93fd135a4fb18ef6921c754cf5af4dc206ab2ca01676a1fca26c" }, { "id": "module:packages/core/src/hash.ts", @@ -18816,7 +18991,7 @@ "ts", "src" ], - "contentHash": "8c81554f3aa3f6a8ea19a09d1f91c7a948173ce8f3e3eaaaf24438d787cb581c" + "contentHash": "785bcecd8f541385f53716e7971a5c055695f8af1936c59fbf028f31aa2260ce" }, { "id": "module:packages/core/src/index.ts", @@ -18986,7 +19161,7 @@ "ts", "src" ], - "contentHash": "783749c0079ea70eb48fc93a485d2dba9e5a2bd622bc176f91b5e167054b60ba" + "contentHash": "e36a8ba1acaa3c9670700e8323e29ec711c45efed8251fe94bf85ee89d78a29e" }, { "id": "module:packages/core/src/memory-validation.ts", @@ -19001,7 +19176,7 @@ "ts", "src" ], - "contentHash": "da281f7bc4f91eb945c78861fd72fa2269aca455478df09143152ba725685d0d" + "contentHash": "302d25ad24cc15142905f95c29f469faf709d6b92d48ab925eb9a5d7474c09a5" }, { "id": "module:packages/core/src/memory.ts", @@ -19019,7 +19194,7 @@ "ts", "src" ], - "contentHash": "e4a7b36a64321368582653b85a3b0754b83e085b3cac1f9d3f8d1071d6e112c9" + "contentHash": "f0582d943572f96b15d4e4d134ed594166e6f265aeffcadb93f5084658a71de7" }, { "id": "module:packages/core/src/primitives.ts", @@ -19046,7 +19221,7 @@ "ts", "src" ], - "contentHash": "7f47004238f37b3feccd631c94bd237aa85215f7872424a9f743d6740d8a6469" + "contentHash": "14931bc7dc1f4af3689ba5358cd4c302d9b8278683649632c1fc6f592a894a44" }, { "id": "module:packages/core/src/progressive.ts", @@ -19066,7 +19241,7 @@ "ts", "src" ], - "contentHash": "069825f96bcfa43e34ef8db97147d9e957c1a345e4c032b94c0d6edbe6403584" + "contentHash": "199ad752e7944b3a1eea967ce14db8f519e61b54f916df3771de566aab680456" }, { "id": "module:packages/core/src/prompt-experiments.ts", @@ -19088,7 +19263,7 @@ "ts", "src" ], - "contentHash": "77b1424e912ddba1cfee301f3732619d5a80308e598b7e9028076a7f7ddeccd7" + "contentHash": "938d27a79ce571598a000afa0847b7cee1ceb7e691e175c9451d960e67390b54" }, { "id": "module:packages/core/src/rag.ts", @@ -19105,7 +19280,7 @@ "ts", "src" ], - "contentHash": "b9d56411f70dcd459255a3481479a04183c00fb7c4652647cd931be0bbb20784" + "contentHash": "c9fcb80e65d8c36eea55076fe483f5b6a7de393170bc9df98242cca4db939915" }, { "id": "module:packages/core/src/rules.ts", @@ -19120,7 +19295,7 @@ "ts", "src" ], - "contentHash": "098cc9ac7b315cd90c3a758c465f1666bacf9e8e73431fe3b0f85bad21a66349" + "contentHash": "782839381c7c6b90fba79bfeb5f2dc503d18aa997c7b2cd2b8bb8fec0f38ef44" }, { "id": "module:packages/core/src/security/fence.ts", @@ -19137,7 +19312,7 @@ "ts", "security" ], - "contentHash": "bc1f9fdc4946d33c6ac5127e15fbe0a5b0f7cb0eed84ab06f4fd8c6b35826c66" + "contentHash": "6e732621034845da6140c867a9709e1c8a6bda63560ff802b0da6216ba440e60" }, { "id": "module:packages/core/src/security/index.ts", @@ -19221,7 +19396,7 @@ "ts", "security" ], - "contentHash": "5fbc9fa630fe3303cd2ac752073066a6dc5f1ae40993d3fe0c8449601ee53566" + "contentHash": "f49a66697a9da8f1d7d21bbd8615ec4b31245054ef3d5b125638954d77f43637" }, { "id": "module:packages/core/src/security/pii.ts", @@ -19242,7 +19417,7 @@ "ts", "security" ], - "contentHash": "130d9f5f810536e91fdeefe1747cab7ad00379ca7a863bd1573412b7654ba3f2" + "contentHash": "227a9c33cad070d782326928b5367ba21a6498a1816f4b3f4bda63af7222fae2" }, { "id": "module:packages/core/src/security/rate-limit.ts", @@ -19261,7 +19436,7 @@ "ts", "security" ], - "contentHash": "3df2335f2572d9860ae0978807744dbd9f0d3c4d9dc386f80e335ba54bc0581d" + "contentHash": "8c946fe4b7b2e4282e5678eb851fbe03224d1cb4e4fb891e1369dce497ba086b" }, { "id": "module:packages/core/src/security/read-jwks-body.ts", @@ -19296,7 +19471,7 @@ "ts", "security" ], - "contentHash": "49ce6e314c2ad7aa3b0dc14e15e7a4d4b45f2cf151463772fb9931d7cf920da6" + "contentHash": "04c008acd5c799123f1c7d3ed16e633e74a2fab9f9d69e8b82767f3f6b8e1c15" }, { "id": "module:packages/core/src/security/sso.ts", @@ -19319,7 +19494,7 @@ "ts", "security" ], - "contentHash": "d917a89543ce567cb416f66cf968b5f4127a8bc1b4e0baae51648b5a33588090" + "contentHash": "70451f0cb9c4ec6d98431eee16633475ccc50879c1ae7b55c25de478aea51d34" }, { "id": "module:packages/core/src/security/taxonomy.ts", @@ -19340,7 +19515,7 @@ "ts", "security" ], - "contentHash": "ab0c9e2827576ad11e3a91503117830287c2384e6021b8263d13db46682e88fa" + "contentHash": "bd70616ecf969168193ef01b207afa2ba46a95dec3113b27df9f1353794693c2" }, { "id": "module:packages/core/src/security/vault.ts", @@ -19364,7 +19539,7 @@ "ts", "security" ], - "contentHash": "7567b12701c695ed9aa4a5f54fc1443142d4a7f6a361c0ac4a01952ca0c2c79e" + "contentHash": "962e150d669c58a1eec38aefc3a5ae034f37bf86582645cd9ba1437816b2caca" }, { "id": "module:packages/core/src/self-debug.ts", @@ -19384,7 +19559,7 @@ "ts", "src" ], - "contentHash": "1f3bf9a232a17a3777a7d391bd331b376244a158180ad70fac7112d74f516619" + "contentHash": "cac109bb578adc231741a6e9cc3490d5bba276239a11651494d8e3a68b177512" }, { "id": "module:packages/core/src/tool-authorization-internal.ts", @@ -19429,7 +19604,7 @@ "ts", "src" ], - "contentHash": "9dffd9c3094410ff9b053b03f39492c0640892df697a9dfd04bafaa957e96910" + "contentHash": "7cf01e2f8615f4509db1151cb45c0448af952373627772a38d55f92c966abb52" }, { "id": "module:packages/core/src/types.ts", @@ -19519,7 +19694,7 @@ "ts", "types" ], - "contentHash": "074c96b951ae22092eee7d83d9012f16d9e9d56a3c5a10928e57bca199692a34" + "contentHash": "c6d7a558ae9ea2e3b263ca82a8d5d61745e6beaa03444d7eda256ef9cac90d48" }, { "id": "module:packages/core/src/types/agent.ts", @@ -19536,7 +19711,7 @@ "ts", "types" ], - "contentHash": "cb087a94f1e8822d7e485a682ed28407cd07779773ffa9c3ae76132c3e4212f9" + "contentHash": "fb5c9434e68e667a199ca991c96fdba289a4138bafaf2be7de7e1e8abbd037ef" }, { "id": "module:packages/core/src/types/chat.ts", @@ -19555,7 +19730,7 @@ "ts", "types" ], - "contentHash": "c6e3646f71599d8976c86fd2b3232eef33b4c154bfff743d9a14b4da1dde6489" + "contentHash": "cceb19fff995acdf84293eac2f192c757bfef4e6dc890b1d4d6a3768aeec83b5" }, { "id": "module:packages/core/src/types/common.ts", @@ -19571,7 +19746,7 @@ "ts", "types" ], - "contentHash": "8e06b85da24eff7a81f67df1acc964b7255b4bd4b5b54657eeb301bbaf8d1ff8" + "contentHash": "42d91647b5399d94e01c2998cef53ff1a9809d9096fa989b7bde2c4b5889b1d6" }, { "id": "module:packages/core/src/types/content.ts", @@ -19600,7 +19775,7 @@ "ts", "types" ], - "contentHash": "e99ee97a082342c8da0f7964f4f591819f2c6a00755f24a0b1d23600f33d129f" + "contentHash": "2feb60835eec99ce9af7f9addd63fc224042903b33c996b555208a651e6b3bb9" }, { "id": "module:packages/core/src/types/eval.ts", @@ -19617,7 +19792,7 @@ "ts", "types" ], - "contentHash": "6dac51f9a07fa605b126ac72850ebe42b2da8acdcb1d42a4fdc345050feef5bc" + "contentHash": "1e4948479dea98682b75c2d4568a6d68b330433728e223fc24fff04f08e8460b" }, { "id": "module:packages/core/src/types/finding.ts", @@ -19634,7 +19809,7 @@ "ts", "types" ], - "contentHash": "a759898a0a199fbc89d164980c43c76c8aefd48093b43acecd9cf57e62d14727" + "contentHash": "7b884aecd47165aabae6dc5c8c05e813f6c9b1511a530b9f7a913bc208d23007" }, { "id": "module:packages/core/src/types/index.ts", @@ -19740,7 +19915,7 @@ "ts", "types" ], - "contentHash": "f6991f90f1fccc76d295a298b73d6c750591d5a2c24b8257aa04b505a950a3cb" + "contentHash": "d892080f83035850f512b040328e46612d0cd9fb69be799e61c400b0c419c936" }, { "id": "module:packages/core/src/types/message.ts", @@ -19758,7 +19933,7 @@ "ts", "types" ], - "contentHash": "55504d45cb34c8dd6b8cb578909f751e458db62826064e8b857287b922330020" + "contentHash": "49bf3a34a3b08727881fefd20414d2ff24f4d890b225a86dbd5577025713b9d3" }, { "id": "module:packages/core/src/types/retrieval.ts", @@ -19775,7 +19950,7 @@ "ts", "types" ], - "contentHash": "73fdad4018dda16040a31e840b58bd6ea19acc4add5569524236fa0cca81931e" + "contentHash": "5df2677295a262c062bc3ab396c463aa1f1da2830c4107209576c7f22e2125b9" }, { "id": "module:packages/core/src/types/skill.ts", @@ -19790,7 +19965,7 @@ "ts", "types" ], - "contentHash": "fdaa98a900bfefa5e909f7ada72571c39ca3059f13ef11fecf1325ed7fedbf21" + "contentHash": "930f6fea586f74c8294893d59b38736752d51e91161bb96feac14d3922084bf1" }, { "id": "module:packages/core/src/types/stream.ts", @@ -19811,7 +19986,7 @@ "ts", "types" ], - "contentHash": "7258b55d586c583e2f8acc6e3c1edb3cec1fe18b2fbd0681a3f52c9917242a1d" + "contentHash": "eaa5b4f9ba44dffcd14eee7312aabccf9384e93f2ccdd12c891c8d5afe21e2cd" }, { "id": "module:packages/core/src/types/token-counter.ts", @@ -19857,7 +20032,7 @@ "ts", "types" ], - "contentHash": "8c688366d645f0a157b0887d6a24dd31fa5cb7b31c19fdbc89fa3a7d7ca8c052" + "contentHash": "491135808bcb5aee45409816aee3af5997fbb706c1b47abb01eaf54f91f36377" }, { "id": "module:packages/core/src/virtualized-memory.ts", @@ -19873,7 +20048,7 @@ "ts", "src" ], - "contentHash": "780974f1baed20c7b830630cc1f1575754fd3e086dc2967d532f3635b9f57427" + "contentHash": "fbde250ed0d99e4a9a83cfb7d54c1d6441b4811f4bd8e74e53265e4386769d31" }, { "id": "module:packages/core/tests/a2a.test.ts", @@ -20384,7 +20559,7 @@ "ts", "core" ], - "contentHash": "57517c35e4291f3bf1b9e8b96c30e980acdace443d73d5e7ce4592b6c2171b99" + "contentHash": "5fa0162919dba4b127bead4f60a4cdc6e23f83a189f9aed2f34bc428dfd18765" }, { "id": "module:packages/core/vitest.config.ts", @@ -20468,7 +20643,7 @@ "ts", "src" ], - "contentHash": "4481bf825ecd8bd31aca2b8d47d84bdb5b8444e8a5b28bf6f0363e980d6a089f" + "contentHash": "e41b37b882dee297534bf7804d866a0891491498d0078967d7a5c01998449b3e" }, { "id": "module:packages/cross-platform/src/errors.ts", @@ -20490,7 +20665,7 @@ "ts", "src" ], - "contentHash": "e33ed3c458262e99a3e00a630c208d19666748f4bfbcc7c20c1f8d53c83a0400" + "contentHash": "32e4e7197cd8e40cac09bda3611a36a039290435717d06a10134c9e289c4ab9a" }, { "id": "module:packages/cross-platform/src/file-url.ts", @@ -20531,7 +20706,7 @@ "ts", "src" ], - "contentHash": "790695db9ef6142f4393373c5d90d352a7814a1d2671feffe1e7d00774d7533a" + "contentHash": "29e129c12a4ac5a52998d955d6e7c9136cc70eb27436c7a3a7a3f440fcb4bb19" }, { "id": "module:packages/cross-platform/src/index.ts", @@ -20627,7 +20802,7 @@ "ts", "lint" ], - "contentHash": "953379c9457d89adf2b3842cafb43bc0e9afb92ee9372693622d8dfe6dc73ffb" + "contentHash": "699edf97dce03a5d80302e5d918d5717113059a563e662e8ca55d763f884eae6" }, { "id": "module:packages/cross-platform/src/lint/cli.ts", @@ -20645,7 +20820,7 @@ "ts", "lint" ], - "contentHash": "f7cee6ad8ff14f85d698aa4f0bdd4a9bd3295e373ff8d8021fa09ab659899f20" + "contentHash": "beb5c9b5e75fcb0bc3db45dd920e3711324701abb2bd9a02b1df38511e4abfcb" }, { "id": "module:packages/cross-platform/src/lint/rules.ts", @@ -20662,7 +20837,7 @@ "ts", "lint" ], - "contentHash": "9880a6fa16def4a85e1654f76d9f27816b06931979897c3cb718dbe623da8b1c" + "contentHash": "71c8de02217076b9825738cc3fc45960c0a77dcfc4d0abcadd6a109931cf9224" }, { "id": "module:packages/cross-platform/src/lint/scan.ts", @@ -20680,7 +20855,7 @@ "ts", "lint" ], - "contentHash": "516b16de5ee63101724e6a39e145b442db10e3ce942c755ade3e5531a7a6c14c" + "contentHash": "367931fefa93013a97eb52d7e19fc2a79b18474db935dfddc2c2ab7569aa662a" }, { "id": "module:packages/cross-platform/src/paths.ts", @@ -20707,7 +20882,7 @@ "ts", "src" ], - "contentHash": "e7b1dcaba75e6f00884115885189576eb5e92db7d5e0dd0aea957b0ea8d0a6d9" + "contentHash": "8acb00ce6e1f91f81fba94d1b22b2e5e779bb3e7bb89230d83e42635070f9b0d" }, { "id": "module:packages/cross-platform/src/process/bun-adapter.ts", @@ -20810,7 +20985,7 @@ "ts", "process" ], - "contentHash": "aaba2441ed56787b23d1db205fb1489e6f20dd0e0625b8697244e7d22f251626" + "contentHash": "cb21dcff795be5d840500d5fd23fc8111e34ec50d745777209e1e79b88f5bf86" }, { "id": "module:packages/cross-platform/src/process/run.ts", @@ -20828,7 +21003,7 @@ "ts", "process" ], - "contentHash": "eeec59ee7504524566fec360349b377c4cee0dd969b5ba7ce7053f66e354ef6e" + "contentHash": "178b4a8b42b8e2f4169271fddaabcf3693530c192aaebfbfa9c4be79dd3d17d2" }, { "id": "module:packages/cross-platform/src/process/spawn.ts", @@ -20867,7 +21042,7 @@ "ts", "process" ], - "contentHash": "a99202203823172b45ef79beded061bce931e9e3049e203bbc43f68db521543a" + "contentHash": "5609b42f809050bc4585384dd04cc4901e305721fe7647c04699a6cbece75e82" }, { "id": "module:packages/cross-platform/src/pure.ts", @@ -20933,7 +21108,26 @@ "ts", "src" ], - "contentHash": "fd16aa06870725ec20baed141ba8517c78fa8bea42e9d07129db02babbc57d23" + "contentHash": "396706b24c215e344c85534a0791adf0198103c1a7eb1cb61571782048315304" + }, + { + "id": "module:packages/cross-platform/src/testing.ts", + "type": "module", + "title": "testing.ts", + "path": "packages/cross-platform/src/testing.ts", + "symbols": [ + "FetchStubHandler", + "FetchStubResponses", + "createFetchStub", + "jsonResponse", + "withTempDir" + ], + "tags": [ + "module", + "ts", + "src" + ], + "contentHash": "168020f2e78f35d2da533de3b536396c8fa9b2f94b25cc618536a97a42b5f95d" }, { "id": "module:packages/cross-platform/src/text.ts", @@ -20954,7 +21148,7 @@ "ts", "src" ], - "contentHash": "414a653e2f84a1275553f695bc645222f35788ddf297ae37eb2cc36818ceb702" + "contentHash": "7c015451da2d5b4dfc61f6a5da22f1dc70a232dfc708424c32cfcafa8b05375d" }, { "id": "module:packages/cross-platform/src/vendor.d.ts", @@ -21164,7 +21358,7 @@ "test", "tests" ], - "contentHash": "3dc71a255467bc56c7907341f3cb637a80b843e02dd0ca1b80b0f4161a6d90c1" + "contentHash": "2e201787ceb39038ba64f79bc2491c0b5db1cd043889028c9bc4923208962e0d" }, { "id": "module:packages/cross-platform/tests/paths.test.ts", @@ -21296,6 +21490,19 @@ ], "contentHash": "ecc52e5fc218c927460952bb02891a0d2b272b92d5ca6f17dcb5d1d516d2169a" }, + { + "id": "module:packages/cross-platform/tests/testing.test.ts", + "type": "module", + "title": "testing.test.ts", + "path": "packages/cross-platform/tests/testing.test.ts", + "tags": [ + "module", + "ts", + "test", + "tests" + ], + "contentHash": "411258fbbfbef0df0203d2dea071015ac3d0372b1c64b26df5b1dc60dafcad6e" + }, { "id": "module:packages/cross-platform/tests/text.test.ts", "type": "module", @@ -21322,7 +21529,7 @@ "ts", "cross-platform" ], - "contentHash": "30995ffeda33f54a007c92ce8c4e4074f216fe1011d0826ae76d617c0e6c65d7" + "contentHash": "763d9177b33d704c1bd83b246cdd03fb8c958747202d4fed2ec7f3cd11262930" }, { "id": "module:packages/cross-platform/vitest.config.ts", @@ -21367,7 +21574,7 @@ "ts", "src" ], - "contentHash": "f67845ddc26b88a16b3a0563abf155e305f342e15528af6f090c6da27f344485" + "contentHash": "4fd54f10406ac5f85b7c73365c192d6e91143100a430360663e63d1621c78d42" }, { "id": "module:packages/eval-braintrust/src/index.ts", @@ -21429,7 +21636,7 @@ "ts", "src" ], - "contentHash": "057ccc14c381720f935d8ad65cb9515f99ff4f8f5178f66867a519bd04d13c18" + "contentHash": "f3681ff9a5d64a67820431e93f7b91c9579ccaf42d3f02d44e3d0f912b427138" }, { "id": "module:packages/eval-braintrust/src/scorers/index.ts", @@ -21461,7 +21668,7 @@ "ts", "scorers" ], - "contentHash": "1fbdbd73d19d9fa5c98e430436c509e884dfa49c13733fa3eb6d253c1bed6dd4" + "contentHash": "59c0690a89eca52d0728241f1230adfa5795a53db23ad798d2dbe680720b487e" }, { "id": "module:packages/eval-braintrust/src/scorers/quality.ts", @@ -21482,7 +21689,7 @@ "ts", "scorers" ], - "contentHash": "5b22dbc2c44236112312f67b35e109b54d9b113377604b93d822672d429051e9" + "contentHash": "407a756833a4245357a62a5cd70e4e0e650efc1ceb5373207d46f4683821186b" }, { "id": "module:packages/eval-braintrust/src/scorers/robustness.ts", @@ -21504,7 +21711,7 @@ "ts", "scorers" ], - "contentHash": "b41a663f253e6881f1d5241229b316a4749b122668388dbdeca8f2ed2e597dff" + "contentHash": "72e88b93e748c3065bc9e7d73c3c428298824b0e64fcb0694d2f6c2ba7e71aa3" }, { "id": "module:packages/eval-braintrust/src/types.ts", @@ -21522,7 +21729,7 @@ "ts", "src" ], - "contentHash": "5f2de5dbe888808be6b547720b102e09dbabd24cae398b6d647847fdbdb795f9" + "contentHash": "4c28bd69ce9a44ec2fd4939bd3e3d4896af44726e3fcf38f2463510bb76c7d95" }, { "id": "module:packages/eval-braintrust/tests/ci.test.ts", @@ -21576,7 +21783,7 @@ "ts", "eval-braintrust" ], - "contentHash": "723327aefe23738224ff377452784f29d3ef77ab30df5a3fd9854d6b4e71f3c2" + "contentHash": "16b6bb63d51d00b93e38d16c85d740bbde90ea325ca7e48791222d56bf7f352c" }, { "id": "module:packages/eval-braintrust/vitest.config.ts", @@ -21623,7 +21830,7 @@ "ts", "ci" ], - "contentHash": "c5acd3011977029a113fc954f0bd17e7e1b9624291b92897e5693cfafd7120de" + "contentHash": "d5b4c91c977c2f9719455e2421f9e85b8192d84b44ef5ece3075cde24db77dd0" }, { "id": "module:packages/eval/src/ci/reporters.ts", @@ -21664,7 +21871,7 @@ "ts", "diff" ], - "contentHash": "d27673b34d04ced3b62de30277afbef776fb37c309fc98c2a8471e5dd31082da" + "contentHash": "6dbad11f2285dff8f6f2987b7ac54021f7484e28fbf6a3dde98ee109c2ea4f16" }, { "id": "module:packages/eval/src/diff/index.ts", @@ -21714,7 +21921,7 @@ "ts", "replay" ], - "contentHash": "ffde0d69f15384bcce1e33d97077cfb40383ec3f30456e71be1c75622b7a01ac" + "contentHash": "cb38efe89184780ba1adb81ad2d5de193100d256571af090195caf28f3a8bc22" }, { "id": "module:packages/eval/src/replay/cassette.ts", @@ -21733,7 +21940,7 @@ "ts", "replay" ], - "contentHash": "3b0186d6342ce33a543ff45fca37d394f996de163b547c4030bdd902f249a9fb" + "contentHash": "7088ae8eca5502171999247f3bcde26c0113b9f38214489961115fce8ca9a67a" }, { "id": "module:packages/eval/src/replay/clone.ts", @@ -21796,7 +22003,7 @@ "ts", "replay" ], - "contentHash": "b72468ff576dc0501e98e62600bc29c8cabddc6e2baafc7117e94defc1b0fb3c" + "contentHash": "6c0f9bcc4b652761ac38d2f109d102090732707a2dd06bbe3f17d465ce668b49" }, { "id": "module:packages/eval/src/replay/player.ts", @@ -21811,7 +22018,7 @@ "ts", "replay" ], - "contentHash": "9dc6ed70276c6ad89e4351e32878c5b3b0bbc41e3bc134e9726bf35cf65c33bb" + "contentHash": "853272d9ebdeb3333ffd8c1b6aebbc20654eae64fda3bb418324c914c3fb1e65" }, { "id": "module:packages/eval/src/replay/recorder.ts", @@ -21827,7 +22034,7 @@ "ts", "replay" ], - "contentHash": "af29257ff426519c719f7aa4c3006a37b115971c5ac81583c977b15f747d32ce" + "contentHash": "e375b50880497970de0e01171b054e0d8df4295c48ad80502552cca68d229aa0" }, { "id": "module:packages/eval/src/replay/time-travel.ts", @@ -21843,7 +22050,7 @@ "ts", "replay" ], - "contentHash": "18a29ac6503ebbd612a1c8f256087dc8f02ba0e3712083266e577fea37b450e2" + "contentHash": "e591a434715e9de14bb53ec020723ba24a2d1a4a1b4c43e26940c51fdb8fbfdf" }, { "id": "module:packages/eval/src/replay/types.ts", @@ -21861,7 +22068,7 @@ "ts", "replay" ], - "contentHash": "86d0f5a3f027cdc28fb29122c87dd12fdccc3909edd21f2d0cbcad1c7db99671" + "contentHash": "ee0b4683855a0687f7b09adc35efec82ee5fdc59f12a970e19485e741ea96e48" }, { "id": "module:packages/eval/src/replay/universal.ts", @@ -21909,7 +22116,7 @@ "ts", "src" ], - "contentHash": "724600f4548988b31a437949969e75128c279e6fa63b76773c740da8ef8b3f1d" + "contentHash": "d965059fecc66da84b196f9be85b2cf0c2c715fc8ab9fca10ecc33eec6e152d9" }, { "id": "module:packages/eval/src/snapshot/index.ts", @@ -21945,7 +22152,7 @@ "ts", "snapshot" ], - "contentHash": "002f59368fcd768cc244ac55487603e11ca9f0460810c580f20ea5acc841fa8b" + "contentHash": "9cfc37d7fdd5a61bdb7e386578e56f8277ede5fd7c3a8bc26b9fb2901e1f6db6" }, { "id": "module:packages/eval/src/types.ts", @@ -21964,7 +22171,7 @@ "ts", "src" ], - "contentHash": "1b179b7a3bd97d0e1a406b1710d1b184b475b815c5bfff47d9f58472ececfaed" + "contentHash": "16450430693b0fd0bb0801bb1944e7b2937fba44da912ca4998fedb956a082e9" }, { "id": "module:packages/eval/tests/against.test.ts", @@ -22044,7 +22251,7 @@ "test", "tests" ], - "contentHash": "9885249c83b2b32d3cc2489403bab64887eefb91a3ea33d1f463eed34e775aa9" + "contentHash": "b0c04d63d609aabfaa366832c8252351a9f0d749ee0d896da067c69074f5bd8f" }, { "id": "module:packages/eval/tests/replay.test.ts", @@ -22111,7 +22318,7 @@ "ts", "eval" ], - "contentHash": "ea4aadc8e5b72d419c633b9fa92ebbc885c61a183d0520f78196e9bf0f70613f" + "contentHash": "87717dc1d8d98f1d7e33ff7615a9b60351480587e303514cead4e905bfa2eaa1" }, { "id": "module:packages/eval/vitest.config.ts", @@ -22154,7 +22361,7 @@ "tsx", "components" ], - "contentHash": "0bdca5ed770a22ec467206c71837c142b81e924b347ddac8c6bfabe39fd4e587" + "contentHash": "ad5ad4e99057d04b108ca5c5140526668431f8599eab4edcbbee6ef7220e74d3" }, { "id": "module:packages/ink/src/components/index.ts", @@ -22210,7 +22417,7 @@ "tsx", "components" ], - "contentHash": "d15dbbb959c61ac4fe5987bcf3cf734100c9f4ddc7ac4ddb1c671c743aadb646" + "contentHash": "8ab4ccfb4fb4bd850100611573bbf4595072642d073ce53c5592104827cb2aec" }, { "id": "module:packages/ink/src/components/MarkdownText.tsx", @@ -22226,7 +22433,7 @@ "tsx", "components" ], - "contentHash": "4be4b46deff775418adeb55265fa35221260589c34f6250b1dac97578547955a" + "contentHash": "fb79f71596e4d5dc6a4272f7740c959a812def7f1bdd06a8a5bbc4ca5e77732c" }, { "id": "module:packages/ink/src/components/Message.tsx", @@ -22242,7 +22449,7 @@ "tsx", "components" ], - "contentHash": "606c782dfcb4744275dec11486e862e3fea956de38eeee4c80fab2af707fd950" + "contentHash": "704547f98bba36fe54a8d8b4af9e8eebc271287e9bc64496f0e1a3838061d5d9" }, { "id": "module:packages/ink/src/components/StatusHeader.tsx", @@ -22258,7 +22465,7 @@ "tsx", "components" ], - "contentHash": "fbf57dcacf48eba3d29c35c745d50f8b913bb787e9b2a723be12cf98f07ef694" + "contentHash": "a249e95a386752c5af4a73ad16d3514c6ed4d4b359557f2c918e161f5200847b" }, { "id": "module:packages/ink/src/components/theme.tsx", @@ -22276,7 +22483,7 @@ "tsx", "components" ], - "contentHash": "bfedf5a4caac8024bc26630262695e3a2b3b1288f9438f1de7d99c261ad73aad" + "contentHash": "c00a097812e6169ef7d637c0a95022068b9bc978e11313d20cbce7cb08803341" }, { "id": "module:packages/ink/src/components/ThinkingIndicator.tsx", @@ -22292,7 +22499,7 @@ "tsx", "components" ], - "contentHash": "08ae528fd7722aab7e90c59b0068df52cbda3ecb40b5f649da8d928dfc9fc997" + "contentHash": "f559fdba15dffdfd30bfd056f277c67eeb8d2c9092b50b40c0057e821786d415" }, { "id": "module:packages/ink/src/components/ToolCallView.tsx", @@ -22308,7 +22515,7 @@ "tsx", "components" ], - "contentHash": "edfb9cd82053950f5a9f767984661c53698a5e6df65d2b9c078f98b4fe60e980" + "contentHash": "e544c2eddcf56b30996d9643b90a1cf9f1cbdb8e85a098419a789bb5d2795c34" }, { "id": "module:packages/ink/src/components/ToolConfirmation.tsx", @@ -22324,7 +22531,7 @@ "tsx", "components" ], - "contentHash": "04d473992144afe68e9ea57f3ecad47c59ee8e8de6883d04f870ff8915e75a38" + "contentHash": "51ac48ad13c7a5821e8408a01a562537118eecddc126339ba749c793b2c44685" }, { "id": "module:packages/ink/src/components/TopologyGraphView.tsx", @@ -22344,7 +22551,7 @@ "tsx", "components" ], - "contentHash": "a9e6c1f2ac3fd7e5922668b7ea431c0245779ac90aeeeac67f5e8931c2a33862" + "contentHash": "9643f93b764325cd1387d6cceabc569ea93a2c0510285cce9dfef537f63a66f2" }, { "id": "module:packages/ink/src/index.ts", @@ -22420,7 +22627,7 @@ "ts", "src" ], - "contentHash": "3e3eeac6902761f71e4076a1ce670e4746069cd73619b9cd79561401ef035ebb" + "contentHash": "d6d2ec8d9b21effca2b0271d5bc92f5419e34bd8c6d3de7bd0a913ab0a37ad35" }, { "id": "module:packages/ink/src/progress-observer.ts", @@ -22437,7 +22644,7 @@ "ts", "src" ], - "contentHash": "6783a4072f678da9a90f36f4bc73d7c7392dc483d6cdf0d92d4cffd4f278d510" + "contentHash": "805ff79b8a405cad8e6e6e129c4b294b994f3bee866804a8a0da0ee0dbcc4f68" }, { "id": "module:packages/ink/src/useChat.ts", @@ -22452,7 +22659,7 @@ "ts", "src" ], - "contentHash": "d4995d46dcc58e9cf341f6357a401e8bef31a00d45033f9ac159a5e5021e94c7" + "contentHash": "ad66fb4e66259b54e4172949c480555880c809f63319c12d8e400eb18c920c9d" }, { "id": "module:packages/ink/tests/exports.test.ts", @@ -22662,7 +22869,7 @@ "ts", "ink" ], - "contentHash": "2187180b95aa96eb2b2221d0e4308dfdb03732bbe44bfc8c48a4b0f6fcfb0ec5" + "contentHash": "811b8c6f990a7b91172ac5056e5185a4c88ca8141861dda41ed10342531f3936" }, { "id": "module:packages/ink/vitest.config.ts", @@ -22740,7 +22947,7 @@ "ts", "src" ], - "contentHash": "365a1a7c5659854cdbb38e86be5a73be1f9f7f693bed66aa48ec8793e72a3dc0" + "contentHash": "0be5fa2b614d0ad32941b9b22968a3169a05729d73023cd8185282c7c4d2a9a1" }, { "id": "module:packages/integrations/src/http-body.ts", @@ -22796,7 +23003,7 @@ "ts", "src" ], - "contentHash": "a4d7590d308a6cc574e2434ea5d3ff40c3102afd898394c19ded99ee170d77bd" + "contentHash": "2126243a04eb303d59561ebc01b3341188c0541b79aa4b6b54ae358e6878cdbe" }, { "id": "module:packages/integrations/src/index.ts", @@ -22939,7 +23146,7 @@ "ts", "src" ], - "contentHash": "e3f0f63d5537e7cc1a350ca8ba052f378c33aeac4b4678cc3576d919cbccc3ef" + "contentHash": "a6d46a1df88ccb087715177f1eb5d798f41914acbd0c180ec04e0207908bcfa3" }, { "id": "module:packages/integrations/src/services/_template/actions.ts", @@ -23033,7 +23240,7 @@ "ts", "acuity" ], - "contentHash": "b1e90e38ab5d71bd341d90449b3f186198e7c698568be83d77c7da8c59f717d7" + "contentHash": "975a9a7db7c6a8c8d24e6aba2e3c5efb44cedd5274672a02a056c7443a6317bc" }, { "id": "module:packages/integrations/src/services/airtable/actions.ts", @@ -23065,7 +23272,7 @@ "ts", "airtable" ], - "contentHash": "20dd3cb9320305b2814413c95e7a192aba4af8e2006e9ba12c4ec6f063c480a6" + "contentHash": "38aef20769f357a0f20763f859a8cc76230f883179212425073fdc251e634b7f" }, { "id": "module:packages/integrations/src/services/apollo/actions.ts", @@ -23096,7 +23303,7 @@ "ts", "apollo" ], - "contentHash": "4c14948cecd96401b8052c3ad92fee3c021e71acbc57e66098c138444f729501" + "contentHash": "89591cd186ba005f3bd0ada70c81e3339abc73e72c22e8e4fe0280d0807cf583" }, { "id": "module:packages/integrations/src/services/asana/actions.ts", @@ -23128,7 +23335,7 @@ "ts", "asana" ], - "contentHash": "37c46e81c39e99d486847faed101c151e521a616bec62607a4387889c57212f8" + "contentHash": "99c09eb72378109efc5c487c3caf14aaf2773948321222ec1da630929edb9814" }, { "id": "module:packages/integrations/src/services/assemblyai/actions.ts", @@ -23160,7 +23367,7 @@ "ts", "assemblyai" ], - "contentHash": "0049d061dbfdf74bed533f41a2f83d854631772901486cbed02a665999a07292" + "contentHash": "0b0711fbe34f582dfb6839cbc185e0f9cc26f079b7d17323da15fba3f19c73b6" }, { "id": "module:packages/integrations/src/services/attio/actions.ts", @@ -23192,7 +23399,7 @@ "ts", "attio" ], - "contentHash": "7717ebb10c54aa6070a6720348dfe63775bd6d259906582dbba414a9b4689a4f" + "contentHash": "2233fb4771f4b85f3c48141aaf0d1f405a4050794d4427faf90de180d6ff8b56" }, { "id": "module:packages/integrations/src/services/azure-openai/actions.ts", @@ -23223,7 +23430,7 @@ "ts", "azure-openai" ], - "contentHash": "872012d7f51e61d17059d1485e335d1de73b8c9e9f0fb4a4143f7a8b922f84eb" + "contentHash": "658a3f6177d5ad1c82e57d9264886175de5f85e124a2c85d0f82775727682069" }, { "id": "module:packages/integrations/src/services/baserow/actions.ts", @@ -23255,7 +23462,7 @@ "ts", "baserow" ], - "contentHash": "7a0bab09682f84e8ce93a896328fe4a6530484c676bb9be2173ab5d30e73ece5" + "contentHash": "9de2495887c1bf8de2c916928bfda34960f6379f1ce1bac69672a618dc6f103d" }, { "id": "module:packages/integrations/src/services/bigcommerce/actions.ts", @@ -23287,7 +23494,7 @@ "ts", "bigcommerce" ], - "contentHash": "adc4be6d0323a0090f4c922d33d2101ccd047166b26ab022dec10359159694e7" + "contentHash": "3e4b0ea89eaaa752aa23022cde92bcf3a8f14944f5d685ff7352a164fe7fdaf8" }, { "id": "module:packages/integrations/src/services/box/actions.ts", @@ -23319,7 +23526,7 @@ "ts", "box" ], - "contentHash": "09a04367b7ad893bf001246f35c4270ee93072ae0ed0bb474a4ebef4332c4d72" + "contentHash": "6f094a19a3d02e4842029413d59d9f343e852c5d102d892f244a1ac5c6f66a2f" }, { "id": "module:packages/integrations/src/services/cal-com/actions.ts", @@ -23351,7 +23558,7 @@ "ts", "cal-com" ], - "contentHash": "5f4563868c3f40bd98950d39a68ff4ba7589c737d6e1a6e0cb52762c59669cc0" + "contentHash": "2ea4683b1571b5baab0f7e8659f4f4ae3a6232992c8b8705142a8294295972e4" }, { "id": "module:packages/integrations/src/services/calendly/actions.ts", @@ -23383,7 +23590,7 @@ "ts", "calendly" ], - "contentHash": "21a13c9f88eeb3cc407f447f9e97f3e6d30daefe8a95b25bb4553343d516e669" + "contentHash": "6d920c793d06faf48079bb7bc573d725db682212710bd11371818bad2d82b508" }, { "id": "module:packages/integrations/src/services/coingecko/actions.ts", @@ -23415,7 +23622,7 @@ "ts", "coingecko" ], - "contentHash": "58633d740f6161a2849e873744ecbb76b154af2682ff8b43758d723fffa3be53" + "contentHash": "5c7105ae416d7520b997e17acda8484b7a4936aa7ff19f6d8090b1255efbf41d" }, { "id": "module:packages/integrations/src/services/confluence/actions.ts", @@ -23447,7 +23654,7 @@ "ts", "confluence" ], - "contentHash": "d6d57293cebf416ab2e52ff9e354bfbe4a0524aabe021b83147a998cbe003a65" + "contentHash": "4cc8b3f87dde74f9be9af4d8f8d1858635b2d439010bc7a4014f8dea3d85f5a6" }, { "id": "module:packages/integrations/src/services/deepgram/actions.ts", @@ -23478,7 +23685,7 @@ "ts", "deepgram" ], - "contentHash": "94cb7c69e68b963cb4b9a1acfa36e1fa687ca7ad9696a09157f125a228458504" + "contentHash": "82347b328d51c44f41b34c5265fd68eef42b252f43d20c8e542216ca30f44d71" }, { "id": "module:packages/integrations/src/services/discord/actions.ts", @@ -23509,7 +23716,7 @@ "ts", "discord" ], - "contentHash": "5646a2307dacd52734c4ac1917d206345ff8a622127f39f0b3d5d84fd9a063fa" + "contentHash": "9f1c1dc5a0840963206ed9dc53513732928da5e47d1f3f7366b1138b82c87185" }, { "id": "module:packages/integrations/src/services/discord/triggers.ts", @@ -23557,7 +23764,7 @@ "ts", "dropbox" ], - "contentHash": "09c95f68353b5fb4203606904f1687da8b5b138d142c873142e91d0bdda14e86" + "contentHash": "451347b1bf935a9b4bac22a6df057d9b160d6efa1f18fcfca74c58354aee435f" }, { "id": "module:packages/integrations/src/services/elevenlabs/actions.ts", @@ -23588,7 +23795,7 @@ "ts", "elevenlabs" ], - "contentHash": "cff0e67ed7242681807578b68304a1d25b82156731831a08d9f512c566843e79" + "contentHash": "710b6fac146c80ccecfe5d096d7c958274f932b5b3c44e475912717f219e7873" }, { "id": "module:packages/integrations/src/services/email/actions.ts", @@ -23628,7 +23835,7 @@ "ts", "email" ], - "contentHash": "d944ec91cecdbb119d495374e917fe4122bb375d42ee8f2a26f5ee915905b99a" + "contentHash": "00df9f73426b0d788a5e23e1b3b3ea904efc0badff9fea34498ecb52a2fa1ffe" }, { "id": "module:packages/integrations/src/services/email/types.ts", @@ -23650,7 +23857,7 @@ "ts", "email" ], - "contentHash": "9994e4e63a719954e3541cf3fdbba525a6153cecfedde43ffd6eb9aa2dbf4857" + "contentHash": "97f39d93d6c93a02ba2c3f456ffbf749f0243ddf144aecad27dfef8410faebd3" }, { "id": "module:packages/integrations/src/services/figma/actions.ts", @@ -23682,7 +23889,7 @@ "ts", "figma" ], - "contentHash": "6903e8ed87eedf67c17991bc9ca797705bf6ebbfd2da03f7adba23b88d4e8e3a" + "contentHash": "a7bed6e9d45226d39feb8c0afbb5d50269508adb334f09338d0d00bfa45f96f8" }, { "id": "module:packages/integrations/src/services/firecrawl/actions.ts", @@ -23714,7 +23921,7 @@ "ts", "firecrawl" ], - "contentHash": "796fd080090774817831bf196b2a19c05e708142b80720d796cbe1157a4ef2aa" + "contentHash": "b9818cc33bef3ac49d59857bb010c786f91c04bbb0f03f5e663e0e381d18267a" }, { "id": "module:packages/integrations/src/services/github-actions/actions.ts", @@ -23746,7 +23953,7 @@ "ts", "github-actions" ], - "contentHash": "da120dcad1528f769488b7df90b40e3674081041fe530a874074f082227e0eed" + "contentHash": "9b501d879867be4ccf2ba29f84161d9eb10a4f73d3471c1ee358587b80a0ae91" }, { "id": "module:packages/integrations/src/services/github/actions.ts", @@ -23781,7 +23988,7 @@ "ts", "github" ], - "contentHash": "b6cee39bb677084ae146178bcb6b8b91799d3d5055c37b5e049813bbd61b5015" + "contentHash": "a4327c634914fed5136472fb698ef274a075f9f16657ba92ccf91092492419e4" }, { "id": "module:packages/integrations/src/services/github/triggers.ts", @@ -23829,7 +24036,7 @@ "ts", "gmail" ], - "contentHash": "74d4e570bba14afccd48a1f32f46b1962aecb3a01700edcbd27c9b7357030c23" + "contentHash": "f4b5356f0e84619927fe296783c7ac109e597c8a7c664a43aeb1875e400744fe" }, { "id": "module:packages/integrations/src/services/google-calendar/actions.ts", @@ -23861,7 +24068,7 @@ "ts", "google-calendar" ], - "contentHash": "383264d255a588ef2689b7963aedd99cd13fdf180a3b09a1fe12ff81d5ee20b3" + "contentHash": "64f8c62f238b5c81b7b2e8e317d3b42e2f31044a78cfb74d26c3c1fa14cd029e" }, { "id": "module:packages/integrations/src/services/google-drive/actions.ts", @@ -23893,7 +24100,7 @@ "ts", "google-drive" ], - "contentHash": "490d808a9f91ae775b7927a82222a1882d826a8bca725fbebde7d7e8ef66a9bf" + "contentHash": "d8845c5ac318c50de94d06f27149f199afd75f2f5344e699431ad34c0d12f83b" }, { "id": "module:packages/integrations/src/services/hubspot/actions.ts", @@ -23925,7 +24132,7 @@ "ts", "hubspot" ], - "contentHash": "b5735c0331f5830561b9877421c782f54108b4282eae6254c9ede06c8f643172" + "contentHash": "471440138cb8d7e7f585438ef20316a2dd87a7a9f2746f2fa807de4ca049cbe8" }, { "id": "module:packages/integrations/src/services/index.ts", @@ -24018,7 +24225,7 @@ "ts", "intercom" ], - "contentHash": "38b091dd0d8646a27f264a3be62f0903c09fcc98d51a4246398e0d16d2daded0" + "contentHash": "e800d6be6286d5131b74ce71f2f28ff4447e5a14984a0903699459d3d4fedc63" }, { "id": "module:packages/integrations/src/services/jira/actions.ts", @@ -24050,7 +24257,7 @@ "ts", "jira" ], - "contentHash": "e5f06a65703e955ecbf940ca8f69468d802cf856681d4c2c15b726eac523ded7" + "contentHash": "6616173b07015631708ff25c96b29d062aed85702f3f87ccca4905cf97e0fa84" }, { "id": "module:packages/integrations/src/services/linear-triage/actions.ts", @@ -24082,7 +24289,7 @@ "ts", "linear-triage" ], - "contentHash": "6e52e33e01c6be0b95b549163d83662212e076fa577eee5979687cdb70f53647" + "contentHash": "0e1dbcd71addc450368dbdec8b3e3c81bf390a59e4aa55ef1c46d1e02e06bf0d" }, { "id": "module:packages/integrations/src/services/linear/actions.ts", @@ -24129,7 +24336,7 @@ "ts", "linear" ], - "contentHash": "8a856a80bb616ca945c84bdacdd56b1ab837997f7d84e1998dc587473bee1a12" + "contentHash": "fe23170372586c19b4387ad1f36c7240f9d86cf0b1ab97e1de372a8c581fb685" }, { "id": "module:packages/integrations/src/services/linear/triggers.ts", @@ -24177,7 +24384,7 @@ "ts", "mailchimp" ], - "contentHash": "268e0ee7c35ae6d9d4e70fc353e0cf0782796e5095bb490bcd7f29503e123d97" + "contentHash": "87cdd4e702d5128dc4f69d3fa2f6273fcdabd14821a02d9e46b741332a43771a" }, { "id": "module:packages/integrations/src/services/maps/actions.ts", @@ -24209,7 +24416,7 @@ "ts", "maps" ], - "contentHash": "b140b1efc3306d780ff5dcb9d6e0f877ece63ab02d8f2eb710afef6fdc3217d6" + "contentHash": "6bdc2077a3ca36d375ccbca1f3961084d8a0c8cbf7338dbd0fbb955179115fe3" }, { "id": "module:packages/integrations/src/services/notion/actions.ts", @@ -24241,7 +24448,7 @@ "ts", "notion" ], - "contentHash": "afe2c2b5490ea0f6dfa6f24dc0f1ac0b2a10aca250aa42b9eb3c646fc26b089d" + "contentHash": "c4d7315e8ba467958ad6135e23ff92025b4a5ee0772ad3a7ce3db78b6e00aff0" }, { "id": "module:packages/integrations/src/services/openai-images/actions.ts", @@ -24272,7 +24479,7 @@ "ts", "openai-images" ], - "contentHash": "390097b9f5e04bedb19c9e3192d6a5b57d468fe1d949f368626ecc68abdb173b" + "contentHash": "679d6c010a6b915cba4671dd51f7286b4a4ddfc078fa04a35a636829d7227d12" }, { "id": "module:packages/integrations/src/services/pagerduty/actions.ts", @@ -24307,7 +24514,7 @@ "ts", "pagerduty" ], - "contentHash": "3008ea4a8933dfdca477e207d25d0cc913f50bf7c3edc0273a27ce9c3a87b938" + "contentHash": "e38f3dd113f5a0afa834e4d5916be7752e501440e84072036e604130f11cacd4" }, { "id": "module:packages/integrations/src/services/pagerduty/triggers.ts", @@ -24355,7 +24562,7 @@ "ts", "pipedrive" ], - "contentHash": "9510ebb0bb60b2e2bc234b0cdd7d1a67f0720ea4f84b5d109a4087862fa8e736" + "contentHash": "4537623ddfd2a4333beabeccfdfd7d13658f9ddcd3d904a6fbb87317f42b3c3e" }, { "id": "module:packages/integrations/src/services/reader/actions.ts", @@ -24386,7 +24593,7 @@ "ts", "reader" ], - "contentHash": "2a21bc0a454d4ea775c7d139f729e43c342f30306de326a55cbdbdea1028707f" + "contentHash": "59c410d1f1b59a176cd5b2042c83b53ae79c6e59a72990fa91a204d391e7b54a" }, { "id": "module:packages/integrations/src/services/salesforce/actions.ts", @@ -24418,7 +24625,7 @@ "ts", "salesforce" ], - "contentHash": "a4b5930fcd1b5c6c70a55dab4d061ef089b563c4d190bbca4d9b93dd3d28bb09" + "contentHash": "c4fef3bd401bd0667f2f462a9a17c9fe72a6e7088bf53ead8d9dc37c985f2a62" }, { "id": "module:packages/integrations/src/services/sendgrid/actions.ts", @@ -24449,7 +24656,7 @@ "ts", "sendgrid" ], - "contentHash": "d0f37f5f815a20232d5d67fa778fe4a1a8cb345b429552266750ca635a86e5fa" + "contentHash": "fd2466f28ae9b96c26896c9d1bf55ea006332937166d3424c486c5828f0f99de" }, { "id": "module:packages/integrations/src/services/sentry/actions.ts", @@ -24481,7 +24688,7 @@ "ts", "sentry" ], - "contentHash": "7c5abd23e3e1b7a83e48f7e164ad215d75b3cc8cd2d7ad66cff5f0353f64d7f4" + "contentHash": "98d3c28a9efb6c41fa570f5250548ccd0a10eba6909d7091efdb2fde70ea2916" }, { "id": "module:packages/integrations/src/services/sentry/triggers.ts", @@ -24529,7 +24736,7 @@ "ts", "shopify" ], - "contentHash": "5df4a5485958e47d80dca3198eb6a1ac360d2e77cb57afb35ba899fd83d24dd5" + "contentHash": "f6cf7aa427307fd9c48aea8ca0642fedd26b7e4af1756d56cff0610a53e9fbf0" }, { "id": "module:packages/integrations/src/services/slack/actions.ts", @@ -24576,7 +24783,7 @@ "ts", "slack" ], - "contentHash": "ba769d31250cd12b7210e1fa4df18bddac313130452c9fbc2d5b2f2d4aa2b34e" + "contentHash": "d9c5e0153497b7b78c37d13d73e08e7f012fe7fdb92d60c329ab77d3336c20f2" }, { "id": "module:packages/integrations/src/services/slack/triggers.ts", @@ -24627,7 +24834,7 @@ "ts", "stripe" ], - "contentHash": "7d93559b9e2e661e4e5f1a7ad7813b5bf5afc2dfe2daf44fb358237282c3f18e" + "contentHash": "f1f6bc4ecab4913e9008168418cbac68995eceef0d61533800dec8fcded9530b" }, { "id": "module:packages/integrations/src/services/stripe/webhook.ts", @@ -24683,7 +24890,7 @@ "ts", "teams" ], - "contentHash": "79dc63e5126965322e61607acc7d78b424b95d34d80df32d904fc856ff8e6767" + "contentHash": "69e0e3e6b0431d3cbf2bc71aaf155bd79d2605da60bb0b46296387342d476f80" }, { "id": "module:packages/integrations/src/services/teams/index.ts", @@ -24707,7 +24914,7 @@ "ts", "teams" ], - "contentHash": "cedec38e21edb1212f326b84f6f0d741020bd0f8cb3529d7ce04d9e1e6b0549b" + "contentHash": "565cd516f98e8e1888f4b4391a3471187686202e5a9b86d8b799631d326e5a1b" }, { "id": "module:packages/integrations/src/services/telegram/actions.ts", @@ -24739,7 +24946,7 @@ "ts", "telegram" ], - "contentHash": "4adedd2196e31ecea933114860dd16156e67edf97530af886086d95ac2980716" + "contentHash": "a1b8d6e38c50954fbff41ff45d6f1c6a8a51bf3780bed79d870775f44e3930d2" }, { "id": "module:packages/integrations/src/services/telegram/triggers.ts", @@ -24787,7 +24994,7 @@ "ts", "twilio" ], - "contentHash": "e779b68e351e236983ad8ed3b3098b498a9e0479469eee01d1b2150418653bf3" + "contentHash": "ceeea7bc6c6cf3cef1825db57c3cf5a08d1d2ed68131e66db278d34f02f8f037" }, { "id": "module:packages/integrations/src/services/twilio/triggers.ts", @@ -24834,7 +25041,7 @@ "ts", "weather" ], - "contentHash": "5a5936ac2c5608ebdda33d54f7649404962b5dec178f4624302a1e48d36f576a" + "contentHash": "1f525b31853018c0baaba686c30e4f4c64d8b1b3c55dc7d6e405b914b6ecb91a" }, { "id": "module:packages/integrations/src/services/whatsapp/actions.ts", @@ -24865,7 +25072,7 @@ "ts", "whatsapp" ], - "contentHash": "940f731243be93d88a6905af26a55092545609a2a54024b2d16d3642f74cc956" + "contentHash": "ceeb0005852c1cafe9b16414e1b27cfcdea07db366aa39e57e70ea108e4d641d" }, { "id": "module:packages/integrations/src/services/whatsapp/triggers.ts", @@ -24912,7 +25119,7 @@ "ts", "whisper" ], - "contentHash": "24271f805b1e9968cc117b8018959c02060c22684426738855e3389dc5cc57a2" + "contentHash": "4490a585864cc082312ad1198abce7c9097db7a7aad63217dce8aedda26e2513" }, { "id": "module:packages/integrations/src/testing/index.ts", @@ -24950,7 +25157,7 @@ "ts", "testing" ], - "contentHash": "9f845fa858976d6c56022e63b45aab667da3403b6504bc6a3587355b1bed4908" + "contentHash": "b0f95e4f85925323fa76a4a3c730153f1b08f3edb5123bf2e77ccf0b40231a50" }, { "id": "module:packages/integrations/src/webhook-verify.ts", @@ -25104,7 +25311,7 @@ "test", "tests" ], - "contentHash": "5b1fc409aebb8cc7c12c89bf2fc834584e80d81464206018998595614e6a9021" + "contentHash": "73ff17189c1b7ab586ac963c040b22bd86331cc2a6811d34f4f70f31e3fcb574" }, { "id": "module:packages/integrations/tests/integration-tools.test.ts", @@ -25301,7 +25508,7 @@ "ts", "integrations" ], - "contentHash": "13e5b3b33a1c64cb087d298ffe16caadb368b4515aa3f7a6625c19e24340a105" + "contentHash": "e467ec8eed4d845cc455fbc9b4c4e5b757fc8f8e6bfc032b787d443c4dd8fc6d" }, { "id": "module:packages/integrations/vitest.config.ts", @@ -25387,7 +25594,7 @@ "ts", "src" ], - "contentHash": "c6afb5151227707fdbafec59ba20c448753dbc488dbabaaff60dd9d3f9984df5" + "contentHash": "1cfa0f0c33806a808a28aeb03072ecaa2f069b4756e4b458dd84cdeef4497668" }, { "id": "module:packages/mcp/src/bin.ts", @@ -25449,7 +25656,7 @@ "ts", "src" ], - "contentHash": "012e57b85b651cbd7a4bca0992f02102f1716cf8c7af53e0411b5215b847b839" + "contentHash": "a07c20f382e2a5be23007034baca75750cd4c284c6331193b0bbba60b28818b7" }, { "id": "module:packages/mcp/src/registry-fetch.ts", @@ -25580,7 +25787,7 @@ "ts", "mcp" ], - "contentHash": "a678405da7c58605cb2001c54200f2fa6c7ab40153cdbbf2bc08a296532633e5" + "contentHash": "97132788d087cc95be045c25473eafa3aac39dcb2fc1496da05884ed0f95e7aa" }, { "id": "module:packages/mcp/vitest.config.ts", @@ -25639,7 +25846,7 @@ "ts", "src" ], - "contentHash": "9f9f52b289a44f3b44cf968f46b76468a82a0d097cf141def584685e82b9ff47" + "contentHash": "beff64c6ee91a64e4fd174877e93e675de971a30e56fc3293c9e14fad0d791da" }, { "id": "module:packages/memory/src/file-chat.ts", @@ -25670,7 +25877,7 @@ "ts", "src" ], - "contentHash": "e55de1a16ecc865886051d940c32604f7e6f165bfa75b37347410eeb7fd23d82" + "contentHash": "7bc1de58e487346a7a0c207703292c18b8b3a6efecc60d6204d84524a19e54c8" }, { "id": "module:packages/memory/src/forget.ts", @@ -25689,7 +25896,7 @@ "ts", "src" ], - "contentHash": "2a500459aaca29926c9cc6374867fb5f81710b08e883d53b510fb6fe3a804e8b" + "contentHash": "e3a84372862fc9350c7ec329f519a57df41b130f2881cfad7603d37a462e036b" }, { "id": "module:packages/memory/src/graph.ts", @@ -25708,7 +25915,7 @@ "ts", "src" ], - "contentHash": "ad7d687389bf2b28d86b1c26af7da3dd2b2f8d87a943cc187dd6c7c3aa6a68d4" + "contentHash": "ead49465eb0bda622b13c04095a5b4da66af74d305ce4ede31f7f852e658aff3" }, { "id": "module:packages/memory/src/hierarchical.ts", @@ -25726,7 +25933,7 @@ "ts", "src" ], - "contentHash": "7fd20ca6a3ca5ef5e87e1ea593e42a63316f57f7b14320939cafc0b1f13bb460" + "contentHash": "6408a7da87f682562ce6019a87408034d3fd45bb82410baab54415bfc2ddd54e" }, { "id": "module:packages/memory/src/index.ts", @@ -25862,7 +26069,7 @@ "ts", "src" ], - "contentHash": "c3911598b801d77447bad008f0f86121f926cf4863aa221ea8ba02aaea261246" + "contentHash": "8ea60e72246bce59bc0217cc80c6b6cac609c8e18122d0566541dd6a2b87d663" }, { "id": "module:packages/memory/src/kv-store-factory.ts", @@ -25883,7 +26090,7 @@ "ts", "src" ], - "contentHash": "61825076c8adc2e4c1a65e4a052264c66fec67e1fa1da9cd8bbca6e90088a499" + "contentHash": "b914887c5e2ccc7c37e3d0a55e29c3f50a9ad95d0cf7b494a510d663e8e728a6" }, { "id": "module:packages/memory/src/kv-store-redis.ts", @@ -25901,7 +26108,7 @@ "ts", "src" ], - "contentHash": "98bbb934cf3da51e271888f1142b0c09921ec95978471ebc5e695a027a97448d" + "contentHash": "247c0d10d231bc6cda85dd6d0c9f73d9afeeab7fc1a4e81b85526b083cc747fd" }, { "id": "module:packages/memory/src/kv-store-sqlite.ts", @@ -25918,7 +26125,7 @@ "ts", "src" ], - "contentHash": "5b83e11c459207f809a133990d23cc2ac4de1710a93b932430657cf7aed30ac7" + "contentHash": "e267cf63b6658a02cc739330353f384d4b1c5b819b788cb432344d43d2d7cd37" }, { "id": "module:packages/memory/src/kv-store-types.ts", @@ -25951,7 +26158,7 @@ "ts", "src" ], - "contentHash": "5534e3ced18c630a065802e676ac271703cc64f8ab42c7ee240216e38a20a536" + "contentHash": "5ab56b0dbafedf2f9680bfb3581099720452b2fb4fc29722f7a05fbe35785fb3" }, { "id": "module:packages/memory/src/kv-store-vector.ts", @@ -25967,7 +26174,7 @@ "ts", "src" ], - "contentHash": "39546b1d9418556629836d3c038d7b45d8749bc1a7786834592fc1abf46b6833" + "contentHash": "2ed469b2773a6dc8e9e77c994f7048c1a257a28934614ed87453b1a9e4f4f7d1" }, { "id": "module:packages/memory/src/personalization.ts", @@ -25985,7 +26192,7 @@ "ts", "src" ], - "contentHash": "75778756eeb3055961c02752c86ee2e75c18aff6fc090f9573bda539725f6a2f" + "contentHash": "48035e5834b25982e781114da75b65dd69752663093dad985a12ee0b793d4d8a" }, { "id": "module:packages/memory/src/redaction.ts", @@ -26004,7 +26211,7 @@ "ts", "src" ], - "contentHash": "be88da0fdeddc12ffab9a4fdfb58a9d684e8754ccb5022de0ac6c134b9e37c3c" + "contentHash": "abca6ed8b182da7fa6074520dd47be543da3ddbe35465858aa7ebfc1d9d1e788" }, { "id": "module:packages/memory/src/redis-chat.ts", @@ -26020,7 +26227,7 @@ "ts", "src" ], - "contentHash": "f58bd44d325decbd675d15c1df2142dddc595878d33255c21eba56cf045e1c78" + "contentHash": "7db9e18cfe93b6caf7a21055dbd716a3e58b7756a359ff4fa3566a000490c3b9" }, { "id": "module:packages/memory/src/redis-client.ts", @@ -26037,7 +26244,7 @@ "ts", "src" ], - "contentHash": "7abdc54cea402f24edd760b06bfe26f4bedd7f92d77825d277d4d713c3d608a3" + "contentHash": "fd4900ce390aed0c7f562e0f074ec53a1b63f1bf35f0c85e15e241bbf565ec3b" }, { "id": "module:packages/memory/src/redis-vector.ts", @@ -26053,7 +26260,7 @@ "ts", "src" ], - "contentHash": "0626f2b3aa227fd07038481e32439e1ac3999921a4cb3535e8c92d69c1eb003a" + "contentHash": "e4cd3d67548fb17cf6dcd64abe1b9827400810180ea3c8bfb861afb289ced625" }, { "id": "module:packages/memory/src/sqlite.ts", @@ -26069,7 +26276,7 @@ "ts", "src" ], - "contentHash": "74109fe1748e9d017d4e41e35e38308e43831386398f83b0492dce150fd00c18" + "contentHash": "bfa5d769ac1c7de9af3f8b674b965ce65fc83be1501da7156581ce25bd8d8523" }, { "id": "module:packages/memory/src/turso.ts", @@ -26085,7 +26292,7 @@ "ts", "src" ], - "contentHash": "976cb3335bd77b43d9c800521fc968f056afb005a247dd62969bb3337ef19528" + "contentHash": "1c65883fe94239e02f09a9a417c83d4a1eb6f2deafdbcfabca6944dfbb538969" }, { "id": "module:packages/memory/src/vector-store.ts", @@ -26102,7 +26309,7 @@ "ts", "src" ], - "contentHash": "34dbd51a8f81aab90113ca3b3ef8942c3565b2d08d88a4f6ef4eded84bd18a64" + "contentHash": "efda67acb6bdd2c442cecd8f545d482b41aa7fdcf3b7b03a930bb774fa4e71cf" }, { "id": "module:packages/memory/src/vector/chroma.ts", @@ -26118,7 +26325,7 @@ "ts", "vector" ], - "contentHash": "80ae3677cb272a9ab02c862e822af5405ce323c080a43dc3abfc2d3e9afed4dd" + "contentHash": "906363e6350dfc4d957a77f5c96e344f70df87658a8a47ee29ca6e27dc64c82f" }, { "id": "module:packages/memory/src/vector/filter.ts", @@ -26149,7 +26356,7 @@ "ts", "vector" ], - "contentHash": "b569634f62a146a743ffbcbac4e822a0bd4c2b04bef224884fa8e8bc146d279d" + "contentHash": "28d9b5ab01c643d2548ccca739a6b98f102d7662e0c86b2223bbeb4fc93237be" }, { "id": "module:packages/memory/src/vector/index.ts", @@ -26201,7 +26408,7 @@ "ts", "vector" ], - "contentHash": "1da14a030d8ebdc7f2714ba1f13696563e4c9e0f62a5412b1f01fb2ce6ddc8d2" + "contentHash": "bafe0611feda28ad89c428981d921ff7cffd7acec8a3861d4b4214830fbe5a02" }, { "id": "module:packages/memory/src/vector/mongo-atlas.ts", @@ -26218,7 +26425,7 @@ "ts", "vector" ], - "contentHash": "c195b6d8518ba8a0424c830819a13ffef9bb80937541b0a89e25ac016ee8ec2e" + "contentHash": "8cf88f0a80d40f4cbd92885adb80724e57089257388d1c60a9521fea5a5a9161" }, { "id": "module:packages/memory/src/vector/pgvector.ts", @@ -26235,7 +26442,7 @@ "ts", "vector" ], - "contentHash": "e151645ecde32fe9e95512a457299abced6ab8fe65a96029c9e98475dd30b596" + "contentHash": "8dd43956b235380caa4b0e3a64054121f3d364688c6f46f480b8bd0fc78a3ead" }, { "id": "module:packages/memory/src/vector/pinecone.ts", @@ -26251,7 +26458,7 @@ "ts", "vector" ], - "contentHash": "d3e6fff4e62546d77805b3f74cecfceac41818d90378533940d1dcf812c2763d" + "contentHash": "cce054dc7ba74bec39467e77fc7744ce499eabd39a8525c9a275726b1d1f4937" }, { "id": "module:packages/memory/src/vector/qdrant.ts", @@ -26267,7 +26474,7 @@ "ts", "vector" ], - "contentHash": "f20c12a7132c53a0fceea4438deb9d56b6c5a97edd93a24a26751267e3e5c60f" + "contentHash": "f3006fb9618fb79259347d5c58184855c0e431cf1b8ab56deea413f7e59e34ed" }, { "id": "module:packages/memory/src/vector/supabase.ts", @@ -26283,7 +26490,7 @@ "ts", "vector" ], - "contentHash": "8215cb7633f68e5d18e5ea6bfe182a80435347782972d61deae885976ae8d5ae" + "contentHash": "5ebcebab951c961394f454189580eb6729c6e912c9fad70ae0d2265c0147416a" }, { "id": "module:packages/memory/src/vector/upstash.ts", @@ -26299,7 +26506,7 @@ "ts", "vector" ], - "contentHash": "1544ae086d9170cf584b23a8b7fe6c403cd3d8402a2c0543a1f6010073059a22" + "contentHash": "ca4ed0bbadb2f75a052d26b30a5fe21fb2d62dfeef4a182a4e06f4418f70b65e" }, { "id": "module:packages/memory/src/vector/validation.ts", @@ -26330,7 +26537,7 @@ "ts", "vector" ], - "contentHash": "ac72698bc70f734081f22b8fe56e056a8d435192014f6921e187795e037974da" + "contentHash": "ef027c13e34bb35c9351b00185ae3c095786e0527694e6a8ac162ff504193e20" }, { "id": "module:packages/memory/src/web-storage.ts", @@ -26348,7 +26555,7 @@ "ts", "src" ], - "contentHash": "0192c1d0ea55d523d98f5111e8cbf8fd994e546466a0085b6e79e6dfa02230a4" + "contentHash": "28d7c7ea439cf23e67534db856f87069050224cd3bc3fa97c75eca3399c2a027" }, { "id": "module:packages/memory/tests/cancellation.test.ts", @@ -26779,7 +26986,7 @@ "ts", "memory" ], - "contentHash": "a85a5005f4ebd5303b7d9e9c43d228cf4596b5258e206ec5c53520db6242f876" + "contentHash": "cfdef86d19de22e3fb91d47ccf2e8143bb065b22e00afa0f388fac42b93f7461" }, { "id": "module:packages/memory/vitest.config.ts", @@ -26826,7 +27033,7 @@ "ts", "src" ], - "contentHash": "43dd2bb58ce923e8b92f86173c73ffe7d7991439c0598fa1493aca05b66746a9" + "contentHash": "fcbc410066983fbc3f0feaf509472999746f0e1891a81d4cbe594b60a2d78f70" }, { "id": "module:packages/net/src/body.ts", @@ -26844,7 +27051,7 @@ "ts", "src" ], - "contentHash": "1766afe42910c4d3aa8efaf4023490f337e741dfc1d43fdf9e99d8ca94b3e073" + "contentHash": "1bfe4631020e3a1eceaae015e9d7456d508d5b19d08d320e9d6933a46d8ec5e2" }, { "id": "module:packages/net/src/errors.ts", @@ -26863,7 +27070,7 @@ "ts", "src" ], - "contentHash": "d413ac94db37bbfbc1abbe14feeb5dff4161d6378bd0ea6b5ebcd8eaa8132551" + "contentHash": "bf80787a2e59a9ffa5a61510acd4aa835d4312938e903e298e0ef9c1e93a2295" }, { "id": "module:packages/net/src/fetch.ts", @@ -26879,7 +27086,7 @@ "ts", "src" ], - "contentHash": "921a8e3c18e7522681e25fca00ab7f406b9b23eb1f9946162537e09c7f7b97cd" + "contentHash": "030252af951f8efe27462653dac753aeddbb58625321d0ad2cd3273f54ddebc3" }, { "id": "module:packages/net/src/index.ts", @@ -26948,7 +27155,7 @@ "ts", "src" ], - "contentHash": "f6737e9dab88ade4bf6056be2d1d82a429f8b317713cb913e6bf8a00489fa244" + "contentHash": "edb98dac830183d3bef9c64873835557389be2a2a2e5a7d6fe3e6f7092c78a81" }, { "id": "module:packages/net/src/rules.ts", @@ -26982,7 +27189,7 @@ "ts", "src" ], - "contentHash": "1c792bb438f87b9fa23284b7a932f90d82d0e282572479f1b092f4abc7c1db31" + "contentHash": "aa6231cb042cfc4f8c951970891822708d7c011e94279fd90d31df1ec6a080c8" }, { "id": "module:packages/net/src/timeout.ts", @@ -27118,7 +27325,7 @@ "ts", "net" ], - "contentHash": "2a65155d0166ce4f251a033a0a0247ba73478c79608167c15f5f51195cde7079" + "contentHash": "a5a2dd47991e0a5bb339de25cd396318038027d55ed09a9b4f806cdf33db91ea" }, { "id": "module:packages/net/vitest.config.ts", @@ -27207,7 +27414,7 @@ "ts", "src" ], - "contentHash": "ad78bb1975facf8743cff5cdf7c65625e75be0e23e83c9fca4c358323f4fdc95" + "contentHash": "9602218d87a1b61aced1a8725d67c1776ef248a93698b14571c622791415e5a5" }, { "id": "module:packages/observability-langfuse/src/langfuse.ts", @@ -27224,7 +27431,7 @@ "ts", "src" ], - "contentHash": "3700930621ea3f8d27839305b34abf494a6826882d36ad67d4892da53536ebac" + "contentHash": "b68a1d25e4cbb6027d034821c964e7d1f14920c0b063446d05b846384c10e934" }, { "id": "module:packages/observability-langfuse/tests/langfuse-missing.test.ts", @@ -27291,7 +27498,7 @@ "ts", "observability-langfuse" ], - "contentHash": "3005ef00e2bba37ee66f6b21258c5559017a025057dbf569047bd29ae4b84bf8" + "contentHash": "b037b2a62a5e0e747cc0d6a9ee764cb0027fd1e6cf218159217f3370181786ed" }, { "id": "module:packages/observability-langfuse/vitest.config.ts", @@ -27344,7 +27551,7 @@ "ts", "src" ], - "contentHash": "dd63c40380c4a3e644939a114aec8e0030fbada9e41ccce71edf73fd2d4345fb" + "contentHash": "e66daf7a6e96a85017c754f2e08edb0bf142c863215a81fd7d409741dad5f374" }, { "id": "module:packages/observability/src/axiom.ts", @@ -27361,7 +27568,7 @@ "ts", "src" ], - "contentHash": "98f27a0e798ae667a431fb5d0c673c351f7b68b3446beeae68862dbfefca9191" + "contentHash": "c8ecf5b8a5f8a57d95d2294164e5fee2cb99f3f5dfde256d56c858b1c1e61bc4" }, { "id": "module:packages/observability/src/console-logger.ts", @@ -27377,7 +27584,7 @@ "ts", "src" ], - "contentHash": "fd14d58fc43be31fc1a0c4ba166a4b804f5638e19f32a37bb37fd08a5d03aa23" + "contentHash": "e9b88d41850ecf1384beef2a12387a6c42ed00747c661d935c95e63b2391e5ff" }, { "id": "module:packages/observability/src/cost-chargeback.ts", @@ -27398,7 +27605,7 @@ "ts", "src" ], - "contentHash": "ac466e273bf7e496b43e53bd7444256352a06f4fa3f35dddd1ca890d04c0c117" + "contentHash": "ca22cd4f581e8bbb88d66243de5d3eadef928f5913b4b0c371e8bc6544d2af21" }, { "id": "module:packages/observability/src/cost-guard-advanced-internal.ts", @@ -27445,7 +27652,7 @@ "ts", "src" ], - "contentHash": "e79e329cc7c347744ef7ade7562014098e438c47f4c218bfce419eeadb06dd19" + "contentHash": "4b4343b1366f4405400fb2d7155e11b84702cee443666f45c20d400511cad29b" }, { "id": "module:packages/observability/src/cost-guard-advanced.ts", @@ -27472,7 +27679,7 @@ "ts", "src" ], - "contentHash": "b0f7970cc7620674800f2e834e3224f9e37f36ee41ad30101909d94f6f10c969" + "contentHash": "07048e517735836b3d0391c846119b17d3e49fe5279d9fcf9068cdd43256d6e8" }, { "id": "module:packages/observability/src/cost-guard-alert-sinks.ts", @@ -27490,7 +27697,7 @@ "ts", "src" ], - "contentHash": "8e76b2071aad84a93fc4207bca544d43070c40f6cf96d96d5497dee44ac1e7bf" + "contentHash": "2c06078b93de4480b2d4b62e449c0eea02e44a652d06145e84dfc4c6fc2cd619" }, { "id": "module:packages/observability/src/cost-guard-multi-tenant.ts", @@ -27506,7 +27713,7 @@ "ts", "src" ], - "contentHash": "4a5d9dc1a1748a6ef11c9e22a6ef4f09e5534ccc805d1b397487a344efa0762e" + "contentHash": "6721ce5463e504d1d2f343897677dba248b3594ea4fbb331229854e75b808d37" }, { "id": "module:packages/observability/src/cost-guard.ts", @@ -27538,7 +27745,7 @@ "ts", "src" ], - "contentHash": "72c6ea833ffa13fe62c3fb69d627680598eb3a765aa5dc8787f5eca5681e9a76" + "contentHash": "349e02829af7a7907cc897a9aae0598e3383e91726d53ded4ae351a68670e737" }, { "id": "module:packages/observability/src/datadog.ts", @@ -27555,7 +27762,7 @@ "ts", "src" ], - "contentHash": "61a69a27de83c4a43bf3b46f9505266633036cf993c219fd92280edf8a763801" + "contentHash": "39211a58fe83c597ee17f1202794b3a6af198545c3802809307460e6c0119f85" }, { "id": "module:packages/observability/src/devtools.ts", @@ -27575,7 +27782,7 @@ "ts", "src" ], - "contentHash": "ee225df25f9cc6d8d524b31ac0487ce20d12954f34b5995d4fba48dc3eb7dc84" + "contentHash": "e38613ec3d96f48382a7a164749fdbf2365eb4a5735b6a0ea50c742f5237a24f" }, { "id": "module:packages/observability/src/http-batch-sink.ts", @@ -27748,7 +27955,7 @@ "ts", "src" ], - "contentHash": "af20fe8fe6c3b734d5149da575db2190d96bd2fc254a7f12c2a2bbb4ff4254f7" + "contentHash": "8ad621c87f47ad0cec10d393bac8ddee4e314866ef2b81f9144a8871e672752c" }, { "id": "module:packages/observability/src/new-relic.ts", @@ -27765,7 +27972,7 @@ "ts", "src" ], - "contentHash": "34af982d17c413b3d35d9ab388da8d4406d574067b8cc5fd6316864e9300c924" + "contentHash": "05eba70cb1831453c9964b9fb97907746f51034259d78da55fa30e5a17a11149" }, { "id": "module:packages/observability/src/opentelemetry.ts", @@ -27782,7 +27989,7 @@ "ts", "src" ], - "contentHash": "0e36a98d0d629d11fd1280198b184d5864543db54a0bf220d94a5b3f78bc6bb5" + "contentHash": "1a3b7f76dd711d5eb0764274c557fed4a5d572e33cfedbb096a9b2b65b3b6b08" }, { "id": "module:packages/observability/src/prod-control.ts", @@ -27802,7 +28009,7 @@ "ts", "src" ], - "contentHash": "4c6096cc939d7a52784d580074c3a35c32028f74783d4f1cb481e39ee1ab0444" + "contentHash": "69eff4c45ab7c829891b310704a372bd8f8bc11f5421f384a233e56ed862da4f" }, { "id": "module:packages/observability/src/redaction.ts", @@ -27819,7 +28026,7 @@ "ts", "src" ], - "contentHash": "74c3b38b42412a67493a9fe03fa600692b09cabc4718d86d680c1e2fb3ccfd69" + "contentHash": "d92d52d424aa516ec02b6cfb8031f945c147c589cc621c5d03860101630acd27" }, { "id": "module:packages/observability/src/replay-bisect.ts", @@ -27837,7 +28044,7 @@ "ts", "src" ], - "contentHash": "3531e9cd1b1e72cb73c175fbb70de89ad99d7cadd1de8157b5de94b65c5005cc" + "contentHash": "556e9731852eca9af39b0ef997b77702111360eda30959bc22066602b02d119e" }, { "id": "module:packages/observability/src/replay-timeline.ts", @@ -27859,7 +28066,7 @@ "ts", "src" ], - "contentHash": "0ab4a84fe18275ba346e06c4f243c9a6ce1d3c00d307ffc70dee86905df8b89e" + "contentHash": "f39c8d23d34d0cbef6a59f49a3e8b6b65ecb283ab3ed0d9893265c933dde8995" }, { "id": "module:packages/observability/src/replay.ts", @@ -27875,7 +28082,7 @@ "ts", "src" ], - "contentHash": "4e51b1b03035ef3b781fae68330a76403dd45ea43475804617d5f2c3185e5b07" + "contentHash": "b00b434f9276a92be1e496eeb684d2aecef4e9c53a14621a2aff032570a1bd04" }, { "id": "module:packages/observability/src/slo.ts", @@ -27895,7 +28102,7 @@ "ts", "src" ], - "contentHash": "bf3c1c9b8bd85c78d6f09bfa21692eb653580d772c3ad2fd24d5fa6859330434" + "contentHash": "bb03e778593c9febc0d2055dc83b134056ec9466703e86d257fcf7d7d083a4fc" }, { "id": "module:packages/observability/src/token-counter.ts", @@ -27935,7 +28142,7 @@ "ts", "src" ], - "contentHash": "53ba62220b72281aad7c523bc2c52983e7e733f4a7c90e826c0479633e2c643e" + "contentHash": "ee1f153ae9840c77d0435fd8c9429baa712d49dffa542fa1c062ac0635f82c79" }, { "id": "module:packages/observability/src/trace-tracker.ts", @@ -27953,7 +28160,7 @@ "ts", "src" ], - "contentHash": "46d6fe4c9c75521c4dd7cbf36f6c015da906a05fb7fc824fbcf436e5815cd399" + "contentHash": "f9ea24c7bb6701d458d48da4ccd2643ee94a9fd073d0c082ee681d508a779460" }, { "id": "module:packages/observability/src/trace-viewer.ts", @@ -27972,7 +28179,7 @@ "ts", "src" ], - "contentHash": "992246fcf9c3b1d4eb0a0b413ff74dceff294604c2abf45d69dc21f08afe7f2c" + "contentHash": "13aa5bd38d33e9f32c030ed102735222a407ddcecb44e198b0404c914cb84ab2" }, { "id": "module:packages/observability/tests/audit-log.test.ts", @@ -28312,7 +28519,7 @@ "ts", "observability" ], - "contentHash": "64bb87b2040f6e9873a1c335587e94351300a596815054fbda4afb7e63875d58" + "contentHash": "a113333f9e05e5c05e240aab56326896c5938cad85959a208fa086f5c1ba89ce" }, { "id": "module:packages/observability/vitest.config.ts", @@ -28355,7 +28562,7 @@ "ts", "src" ], - "contentHash": "94c1dc42cff0a6b10b8f9eb3d32aff4d6da41b7964a233c0954cbc9b44c15ef5" + "contentHash": "13a07fe66816c11cb053b1ca7b8fa35499ff315cea3f45a095cfebc7fef0c276" }, { "id": "module:packages/rag/src/errors.ts", @@ -28372,7 +28579,7 @@ "ts", "src" ], - "contentHash": "4c2fb8e87d3c5185e9ec9f201025407464e5febe7b369d78851969605055e7c2" + "contentHash": "083d64b7c1f2521933c33b73d01de776f825e5ae8001fc28fadfb4d941e63e4b" }, { "id": "module:packages/rag/src/index-node.ts", @@ -28461,7 +28668,7 @@ "ts", "src" ], - "contentHash": "6ec4db47f8d7c8b25c24fd9da89f9bd3f37c2a92bbcfbdac7b7e371ddb14999e" + "contentHash": "5b2987840b7ce869ef74abb760ef2729ba6f62e96cdc1b20fec947aedfe32b2f" }, { "id": "module:packages/rag/src/loaders.ts", @@ -28519,7 +28726,7 @@ "ts", "loaders" ], - "contentHash": "8842c2d99d5f025e8270a4397ffe2f896e1005dedf1ed993b5490631f8c65ddb" + "contentHash": "dae2c9bd6f66379a4bb9e100816f3aeb67deb5b5eb4a4ced404bac54ab45d3ab" }, { "id": "module:packages/rag/src/loaders/documents.ts", @@ -28547,7 +28754,7 @@ "ts", "loaders" ], - "contentHash": "067c63076602f36a32db29a5d2f8487c9aae3cb30c413172a2bb2fcb9ba7c6a3" + "contentHash": "ce3f0a266d4a757fd658352a386a617fd6c764239caec433f04c648ed476db84" }, { "id": "module:packages/rag/src/loaders/s3.ts", @@ -28564,7 +28771,7 @@ "ts", "loaders" ], - "contentHash": "81047916a0c69926e3149602133d6eda13b37dc65f8d49709eb2f3ac4c5b2010" + "contentHash": "684be1a0e79bca93e834c3edf9f4b42a5cbc274645ef8484d4205a58cecaba2d" }, { "id": "module:packages/rag/src/loaders/shared.ts", @@ -28592,7 +28799,7 @@ "ts", "loaders" ], - "contentHash": "b160b82bece8bf9e9b2e41adaf72a0fad2dc3d67eff0394607b668a433f25f37" + "contentHash": "ba9ef05bec6dc1602a396e9f807fac73391d96c45a1633cbc73c74ad1a169f26" }, { "id": "module:packages/rag/src/markdown.ts", @@ -28633,7 +28840,7 @@ "ts", "src" ], - "contentHash": "9e33c78838c91bc32b6d7b38ddbe776936e61c74d8bc76c1790d4d79e567d5dd" + "contentHash": "8267dcd08c65236a8225c89ced66bd61fb2632c280120f04e5931f5ca942682f" }, { "id": "module:packages/rag/src/rerank.ts", @@ -28655,7 +28862,7 @@ "ts", "src" ], - "contentHash": "7a6b5c391c03021dae8bf7984b94852767b0ead0b2c962eddb81f0c358229faf" + "contentHash": "eb247a2269501c8667397a78e3b8d5766f70771f1afdb7c0b6250154cea164d1" }, { "id": "module:packages/rag/src/rerankers/index.ts", @@ -28689,7 +28896,7 @@ "ts", "rerankers" ], - "contentHash": "276f3b5aa9f72f823ea4228a2907f4c1f0b5a061e9fa5bf2b8050f3c50f90232" + "contentHash": "9450eecfb7c3cc3f60b98dda2d64cc4be501686a21f76e165616a1e4c454dbd7" }, { "id": "module:packages/rag/src/rerankers/voyage.ts", @@ -28705,7 +28912,7 @@ "ts", "rerankers" ], - "contentHash": "f87152dd3b41bd7dc09757e84811808ade6174f1d410545e296a66dfa75423fd" + "contentHash": "a95c40b953635606c3e3dd8c19da0f2bf8443a80db71240cdb5348164694cafd" }, { "id": "module:packages/rag/src/types.ts", @@ -28722,7 +28929,7 @@ "ts", "src" ], - "contentHash": "df3938f9c90fb4ae2df08edaa23ea9a7f714ef9db10059cef8d176d0de70b090" + "contentHash": "e3258bfef200783bee6fdb8e8663484ed5b6a6af9d05ba6c67e3a7f374806401" }, { "id": "module:packages/rag/tests/chunker.test.ts", @@ -28921,7 +29128,7 @@ "ts", "rag" ], - "contentHash": "45dd8d98a64c8512ea8a78bec9b30de88374cf1b21207439525ccfe171f316a0" + "contentHash": "e7180974aa5ecb6f1339d8bffef10d7416fe60dbad82d9b7ffcbea5108bac578" }, { "id": "module:packages/rag/vitest.config.ts", @@ -28981,7 +29188,7 @@ "tsx", "src" ], - "contentHash": "506fd4723adc285a0eb402816dddcfc524098894c0d1297f77b86584c09a1137" + "contentHash": "6769c62fef2158bea240d77b4815fa935c691abedbda89de1f975a102d264753" }, { "id": "module:packages/react-native/src/index.ts", @@ -29027,7 +29234,7 @@ "ts", "src" ], - "contentHash": "ccb2e61c5c4da537e2e0ae4aa1f70fadda57a6c466d929e0bbf044c9e73412f8" + "contentHash": "a88bd216ce66f3105b86bafd189410c0857f49d791b352cfe7f010c73db9955e" }, { "id": "module:packages/react-native/tests/components.test.tsx", @@ -29100,7 +29307,7 @@ "ts", "react-native" ], - "contentHash": "8bb57a4ec400df2626c4adea15a8d0e1667b43d994b992477e035dc8ef78b6ed" + "contentHash": "3d4b1b7803c468e1499871aef94728b7f3f5a1b73ac752e9aae5c2a839a84538" }, { "id": "module:packages/react-native/vitest.config.ts", @@ -29146,7 +29353,7 @@ "tsx", "components" ], - "contentHash": "1d12da5754b5ad895f88509f57d68183fa8a76f4381be48a29dd149cea1b7607" + "contentHash": "d25edc7b1af241e97bc8dd294d250721fc2381b54c6ac821bf489e0f652a5254" }, { "id": "module:packages/react/src/components/CodeBlock.tsx", @@ -29162,7 +29369,7 @@ "tsx", "components" ], - "contentHash": "802ed3db28ea706a6a8aa605d9ce10eba6912c110101ec60a8688ef046b1d49d" + "contentHash": "b9af7bf45d117ce55d11d5caea69b285e76529c3ab3ffad44c1384089e539d97" }, { "id": "module:packages/react/src/components/index.ts", @@ -29214,7 +29421,7 @@ "tsx", "components" ], - "contentHash": "96bfdf7e54d44676bb66dbc9d8ca551f774ea4176dc2e1bf05a28bc1e7da5761" + "contentHash": "cb2d7b567e81467a1f8288c3cb53af4490db98c368ed8269a842ca7309b3febc" }, { "id": "module:packages/react/src/components/Markdown.tsx", @@ -29230,7 +29437,7 @@ "tsx", "components" ], - "contentHash": "ef212e8fe08f67960d4e4c7168b78cc598fe845edafb36b2f38f8a722ab0f1cb" + "contentHash": "836f5a4fa8ea987157b21ab8b4b8347df86949398d6daecaa14301119de5c053" }, { "id": "module:packages/react/src/components/Message.tsx", @@ -29246,7 +29453,7 @@ "tsx", "components" ], - "contentHash": "dde8e67ed8169d30dd7cbe8e0a9d86c91d59a178a0859ea04fd753b2d6d6d40e" + "contentHash": "31ff8bb20626926aa08c6da788d66e9ce7bd679597f284b0b90626cf06ccef4e" }, { "id": "module:packages/react/src/components/ThinkingIndicator.tsx", @@ -29262,7 +29469,7 @@ "tsx", "components" ], - "contentHash": "fec7ed17ac9d5cac9df25de7699587f4f10fbd2471823be1c3fc0e2788c4dd49" + "contentHash": "8bbb3e90a420001748ddee596aa561d7af57b45ff4b518f00d4b7abfc16ffef0" }, { "id": "module:packages/react/src/components/ToolCallView.tsx", @@ -29278,7 +29485,7 @@ "tsx", "components" ], - "contentHash": "7d0233621e2ccbc9a454004d64719910dfa4c6fa68b9144314539487a34d80a4" + "contentHash": "dc62c74e18a47cd60471b09ac763ec520d556ea5eaac51faa30173859612c46e" }, { "id": "module:packages/react/src/components/ToolConfirmation.tsx", @@ -29294,7 +29501,7 @@ "tsx", "components" ], - "contentHash": "863bcecd4025453b13e7d9c11855d0492c04e96c33bd2bbae42a1d6f10eb1fcd" + "contentHash": "c7a053a16f9efe15ea85f8035d01f659505355856c67300df86477de09244b7d" }, { "id": "module:packages/react/src/components/TopologyGraphView.tsx", @@ -29314,7 +29521,7 @@ "tsx", "components" ], - "contentHash": "5dc7368e103456e8e958b067484136dfdf356f98279f0f32d35b492a0321001c" + "contentHash": "168f27ce463b0dc87ed517f34b1d2c3aa5ad05b2bc4d5f2b347cc1e8283213d1" }, { "id": "module:packages/react/src/index.ts", @@ -29385,7 +29592,7 @@ "ts", "src" ], - "contentHash": "e76f698fe2d882b24c76794095dc092c82425bfc2b7e4215f19946813c3c8e50" + "contentHash": "04d3f7e27cf833e2ae92c2ff67e2cc0c50030c212dd58b999391d7d81936c90c" }, { "id": "module:packages/react/src/useChat.ts", @@ -29400,7 +29607,7 @@ "ts", "src" ], - "contentHash": "95a6b5b46c07d8ae91622a924faafb568038b8864fea066cff00c1d6392a17f3" + "contentHash": "2aa4603bb07f840a66bf557b00182eea32b7569e04e2f58958c090e25389115d" }, { "id": "module:packages/react/src/useReactive.ts", @@ -29415,7 +29622,7 @@ "ts", "src" ], - "contentHash": "d706f03d8f41e727fd6b78a234345f73b67ff3e7b4ac58107ce7f0b162e68b9e" + "contentHash": "5a63604087f2e4ae14b567a55fd0873ab3d675b3fd1b05caddea9dd6e2a740d0" }, { "id": "module:packages/react/src/useStream.ts", @@ -29430,7 +29637,7 @@ "ts", "src" ], - "contentHash": "92a900a64a2380257bf0e4ac1dcc1cac15b991e02e09030633229fe18dc037f1" + "contentHash": "a3810fbbf1ff6553bb5d573ea46272445a4d7577cbaedd894e450f8345d384c9" }, { "id": "module:packages/react/tests/components/ChatContainer.test.tsx", @@ -29626,7 +29833,7 @@ "ts", "react" ], - "contentHash": "d00398e97617a5611fb0e8488176d6d897db2fe075dc6af1cac4442a46d9686c" + "contentHash": "c92248b21fc5dba6bf8e48caf4701dcd68b4dd760be8222b24c156cc4c521386" }, { "id": "module:packages/react/vitest.config.ts", @@ -29678,7 +29885,7 @@ "ts", "src" ], - "contentHash": "46eba8b0c3918c4d67f42a8411e0f8d417ab4b20f3047b692f08ae1b7322b368" + "contentHash": "0f26df976567abf33706c23fe9790d3dc8907e8b1020601d4344c8e9bab950eb" }, { "id": "module:packages/runtime/src/chat-trigger.ts", @@ -29709,7 +29916,7 @@ "ts", "src" ], - "contentHash": "1973d0154663b014c0e47b6cc736c214960d37826c90a76b4e384dd6fa3b8816" + "contentHash": "990d45822ccc6db1088742a1b0e3415d31b751f84f03693d86f45255fc7c0d47" }, { "id": "module:packages/runtime/src/delegates.ts", @@ -29746,7 +29953,7 @@ "ts", "src" ], - "contentHash": "d9387b086ebff5a6a3dbb0416a23e960c0c722f186a13d2e857923d452833060" + "contentHash": "8b6efb1c39a267d982027ebc5059b8a80c1425a7cb57b1910a5a6ae4a77d7faf" }, { "id": "module:packages/runtime/src/flow.ts", @@ -29774,7 +29981,7 @@ "ts", "src" ], - "contentHash": "383767e0679de833710f5efd474ea7947d765ffdd7b050de4e0b5a79ead9af5d" + "contentHash": "9a4b4bd1762de16aaec54e26beda075da9d5d96c11a58392c0f7886a1deac790" }, { "id": "module:packages/runtime/src/index.ts", @@ -29930,7 +30137,7 @@ "ts", "src" ], - "contentHash": "bc219dd69a06fac10cac4bd4520b61388133e17a2807ff0493bbe59a0ced56e1" + "contentHash": "eddfeb3cb80f4cfda723e5dfe9bd92103425852fd30be43bff48e260ac60fe74" }, { "id": "module:packages/runtime/src/multi-agent-compare.ts", @@ -29948,7 +30155,7 @@ "ts", "src" ], - "contentHash": "c52bdf176a8af603803b3276f3ee9732c89221d8e19d5707e2a4777736f75b4f" + "contentHash": "8f2718999602bb8b985b12c07810efdb5897c185189a855827bf35d3f90d8db0" }, { "id": "module:packages/runtime/src/multi-agent-debate.ts", @@ -29964,7 +30171,7 @@ "ts", "src" ], - "contentHash": "2dda8e92c4817626660ac96b975414c6f814abf2455f5deb48d99acd6b459aa4" + "contentHash": "70cd596c9bbd74b73c67c6eb6e7f8c6ba270562ed717470365c854797f0927d3" }, { "id": "module:packages/runtime/src/multi-agent-vote.ts", @@ -29981,7 +30188,7 @@ "ts", "src" ], - "contentHash": "2c07ec1f7932499c14d27baa8da24ea88cc19ff4a89e28987dc946a8b56e50cb" + "contentHash": "0fa7208913e3988e13bd939b3a9c0864362c7231f628a76f72594fc0ed12d9d8" }, { "id": "module:packages/runtime/src/multi-agent.ts", @@ -30009,7 +30216,7 @@ "ts", "src" ], - "contentHash": "2148a7766d0a4dea63a61f5a22babab734c57453ab34f218e200be345225327a" + "contentHash": "946ebee689cdc32f09a7fd6a7df6fcb7476bd3eb462ff8d173e7be03886b732e" }, { "id": "module:packages/runtime/src/pii-validator.ts", @@ -30046,7 +30253,7 @@ "ts", "src" ], - "contentHash": "4303060928050166009b0a6cd181e54cdfd579de322c26a68ee2a4b80a8bea9c" + "contentHash": "f589b9214dde1d15609e04e3dbbdb70963e2e1c837a15d5855d33da1707a62b6" }, { "id": "module:packages/runtime/src/runner.ts", @@ -30061,7 +30268,7 @@ "ts", "src" ], - "contentHash": "03c97ac5e1e35b1485b547add18ed4f0c8ce84c9da4265d45b14d9c80b00dfda" + "contentHash": "8c212e27b70db22f97eb6739cae48eda15dba899fd6725caa6e121e0389463f0" }, { "id": "module:packages/runtime/src/shared-context.ts", @@ -30078,7 +30285,7 @@ "ts", "src" ], - "contentHash": "4700d3974500b92b0ac854c781090fc989c8704718ead1e8ed81f20a094d4da8" + "contentHash": "ced47e8d8adc805e609059f428839ab2cbb7125a5f33a1c80915662271a75dd5" }, { "id": "module:packages/runtime/src/speculate.ts", @@ -30098,7 +30305,7 @@ "ts", "src" ], - "contentHash": "fcf8d6dc0be266217dbc40571a5be489157c7dd5d34c08934da9346ac5ef3961" + "contentHash": "fdd762c46f271dc68a1dc49fb942418f2f7597e7f58d49bf5bf9ea2e92e6f998" }, { "id": "module:packages/runtime/src/structured.ts", @@ -30139,7 +30346,7 @@ "ts", "src" ], - "contentHash": "37807da34695aa84a8babf74202e3dbbd85c6128f04cf9bb64c681000ccb0d39" + "contentHash": "5b43faf0ddbf0695ad24b3d48891b1dfba92adbc1a5dce65f51e1d6e8f27403b" }, { "id": "module:packages/runtime/src/types.ts", @@ -30157,7 +30364,7 @@ "ts", "src" ], - "contentHash": "223ae27bd3c9c5f19602d6091fd5ce4829c55e766792339cb2e1269620802e68" + "contentHash": "aaa6fa0b39d70a23f4bd48c066da11226e45ac5f2673b4d5e3313d6539c0e954" }, { "id": "module:packages/runtime/src/validator-guard.ts", @@ -30184,7 +30391,7 @@ "ts", "src" ], - "contentHash": "ab6c573bea63d1434713980732680dbaf747350108ed3c3c6929d3ec2d301a54" + "contentHash": "04b9639311039bdf91ce29388fbf7fa3c99cdedf9bba0d49905a1664a8c05a90" }, { "id": "module:packages/runtime/tests/agent-substrate.test.ts", @@ -30462,7 +30669,7 @@ "ts", "runtime" ], - "contentHash": "5861432568de29d8d1fa0e7b6b519102a9fb792f4f7c73917ebe910e8e41047c" + "contentHash": "ff1b794a35105c194e092262b91221eb9e23e8dc69d37d36629f1c2fe27a09e5" }, { "id": "module:packages/runtime/vitest.config.ts", @@ -30515,7 +30722,7 @@ "ts", "src" ], - "contentHash": "bae8b8304d6d73a226b881a1f7f5a297e699d621e7aa175382ce9d3968b11a08" + "contentHash": "58a15001d075ce2d43ac7950183d7c480bd1de8e87c414d666a423b9f1678f4b" }, { "id": "module:packages/sandbox/src/e2b-backend.ts", @@ -30532,7 +30739,7 @@ "ts", "src" ], - "contentHash": "ed1d8774705bfb915a47b3055921f91fe2734898c65c9516a0027d82cf2a4420" + "contentHash": "c784c40d98f9787663b453a1a9e64a09ac9a83337ad71445a411ccbab8f5bc3b" }, { "id": "module:packages/sandbox/src/index.ts", @@ -30613,7 +30820,7 @@ "ts", "src" ], - "contentHash": "a7f0b445d584e9a44785d809f2537236a39c8551a11431fae66214bb23b058fd" + "contentHash": "9d0672f47238a5cc2c2a74be648a14948a18e36ba0b5d52156b741b82276db85" }, { "id": "module:packages/sandbox/src/local-runtimes.ts", @@ -30635,7 +30842,7 @@ "ts", "src" ], - "contentHash": "ef47a37f7c6bf4f705ae5a1fc09a3712c3b1ac1e2f4184e6adbc82bd74be6020" + "contentHash": "6f063aafff7f3a4ee2b09343479b666cf97bfccc4822ee051bf71e6a040f8233" }, { "id": "module:packages/sandbox/src/local-sandbox-types.ts", @@ -30658,7 +30865,7 @@ "ts", "src" ], - "contentHash": "fb04d612fb060b998129077112167202903f4af0d9d1f028242c0fd7165b2cab" + "contentHash": "71f47e988c43a9b2f6398f840c374c2e9249e343c2b29d508f861ce7a097b934" }, { "id": "module:packages/sandbox/src/local-spawner.ts", @@ -30691,7 +30898,7 @@ "ts", "src" ], - "contentHash": "d3d7276a6c85cadaf28531fddd15cf9303debdebae333256808c5c3baacfa043" + "contentHash": "8954f0f80c48160bc565e4e4ea5b3612b5fafedd7f208c56df07d195f6f4dfa0" }, { "id": "module:packages/sandbox/src/sandbox.ts", @@ -30708,7 +30915,7 @@ "ts", "src" ], - "contentHash": "fcf60ac61131f6d64277d19e7be24d185ba658ecc234940c3f9bf7396b1cf1be" + "contentHash": "c9571a94db956ee98a67a9cdd54233b16e73714dc3845265d42b88e32b910ca1" }, { "id": "module:packages/sandbox/src/tool.ts", @@ -30740,7 +30947,7 @@ "ts", "src" ], - "contentHash": "a8082dd83ac85cbf3b5f982cfbc6ecea22f789e0b2de55a77e1238fa327f0981" + "contentHash": "cad991ba0fec9eee2d51eed46e2075b955d92fb12c2cca4fdb2c894a4cd8dc9e" }, { "id": "module:packages/sandbox/src/web/index.ts", @@ -31005,7 +31212,7 @@ "ts", "sandbox" ], - "contentHash": "7808c5ec47a3b002829715d90a40948629663ca0a822d117c448990fecf69598" + "contentHash": "58271b7289ba801fc54d7e8cecb16524f910c74568307b8e6121c6d8323595fb" }, { "id": "module:packages/sandbox/vitest.config.ts", @@ -31080,7 +31287,7 @@ "ts", "src" ], - "contentHash": "7ad37a7975428903042596cb22cc579eb98a6bc77ad3c163a14797d36331394a" + "contentHash": "29199902d126c48a90c2eac3722e2d20ba0e5b719ab0b4918c63da96e94b44cb" }, { "id": "module:packages/skills/src/coder.ts", @@ -31095,7 +31302,7 @@ "ts", "src" ], - "contentHash": "a6f25f31f2aa304f984bab1708c3e779d71e8610ee77c7b40e35ebab02375f1f" + "contentHash": "01696fec66c239d1097853ff6b122b78183eb39bfbfa9c6398791f85a918e7c8" }, { "id": "module:packages/skills/src/compose.ts", @@ -31110,7 +31317,7 @@ "ts", "src" ], - "contentHash": "600c532f64a440737c2edef3c6c259c811197698fec760be3e014a00f2c640ea" + "contentHash": "08a2e2e12b7604bbceb35ac28b928c54274051c9f5be0f22ce109dbcd1688a4b" }, { "id": "module:packages/skills/src/critic.ts", @@ -31125,7 +31332,7 @@ "ts", "src" ], - "contentHash": "a15b8049c64301ae4efae8bb51f63afeccb782d37f2a27852c5b902a0a775457" + "contentHash": "994d7f95ff3c2697950dc26021536ee03d758bd491442c2dc26d8d1c060619ac" }, { "id": "module:packages/skills/src/customer-support.ts", @@ -31140,7 +31347,7 @@ "ts", "src" ], - "contentHash": "769d4e0d4aac61181ef59da7d4c5a4900975a459c6c3492327cdc7183c496d53" + "contentHash": "4844324cbda2269c9b12763c96d81d4414aeb28e7dfb20b61a42b24067d0e427" }, { "id": "module:packages/skills/src/data-analyst.ts", @@ -31155,7 +31362,7 @@ "ts", "src" ], - "contentHash": "86ebe4bc868814fe9407c8915ac7f75ad81cea62368af7d5187b72fe037f5fc7" + "contentHash": "a7a7e7098e09e57d0151a00f5ce86f57bdee025a50749566d039be14d8bf263a" }, { "id": "module:packages/skills/src/discovery.ts", @@ -31172,7 +31379,7 @@ "ts", "src" ], - "contentHash": "f50eae9dd4269e64c1254036e2018132e4f3bfbf6849fdacdd5d3f5b501dd324" + "contentHash": "1eba2c18665634d2fb73b4d7fda89bd1fe4f393de1a5e39f5800f4166c7943fb" }, { "id": "module:packages/skills/src/ecommerce.ts", @@ -31188,7 +31395,7 @@ "ts", "src" ], - "contentHash": "2bb90ae4baf19b996f35b8ecb4dc360a8b8bff2c3791374a19c6e81de4a5a088" + "contentHash": "d87e427f633a4a994512b2bf1dbd587fa97d0eca26364f3ec3b26a66f539f6e0" }, { "id": "module:packages/skills/src/education.ts", @@ -31204,7 +31411,7 @@ "ts", "src" ], - "contentHash": "d350995b1b3e23e6803dbf9a54e0b665f0474547c67826f9cbae35982dddb5fb" + "contentHash": "c2919d3c6143e8b90f1bc6da497ee3cf3cc3e46320e2ab416cc8848174cc821c" }, { "id": "module:packages/skills/src/finance.ts", @@ -31220,7 +31427,7 @@ "ts", "src" ], - "contentHash": "8f5b44e3aa4debfe55a42f1cf1277f877ecaaf60e81876a05203dcaba3a4f79b" + "contentHash": "d4796a86632c330a599861fe3ea3071c09ed53b454f2ef247c17d868a7d5b4db" }, { "id": "module:packages/skills/src/healthcare.ts", @@ -31236,7 +31443,7 @@ "ts", "src" ], - "contentHash": "d2451c6bc17e48443455653e2127a6016289ac81294d58b126ca4f894c3198fd" + "contentHash": "1e646edf8a26d2a2ae7a1165761ee161019dcfa386065b6269cd0c1f44ea5f4c" }, { "id": "module:packages/skills/src/index.ts", @@ -31305,7 +31512,7 @@ "ts", "src" ], - "contentHash": "85cea1fe09498579a26d62d0140405d5321364f9797fd3ac7380a9c00fa17dd7" + "contentHash": "23316f8dea9118a57f13d712ccbdda33a09c6b4d34849217af7d83f7b1ea5f1e" }, { "id": "module:packages/skills/src/marketplace.ts", @@ -31326,7 +31533,7 @@ "ts", "src" ], - "contentHash": "6b4041b1de871452a403d37f9ed8d9421fe0341f1b08173c693a83a293558f64" + "contentHash": "758dc67c368493c77a8b9313d4d2a632f56cc4470b9081642c213344a2eac23f" }, { "id": "module:packages/skills/src/planner.ts", @@ -31341,7 +31548,7 @@ "ts", "src" ], - "contentHash": "eb6f2c49cf0f518efc65a2b645914c4efb239eb5094261f4135377516515f457" + "contentHash": "6b8071f9b1ad03a642d4e8bd0593c091586a46403045d6ce4a40bcc8d51384f7" }, { "id": "module:packages/skills/src/pr-reviewer.ts", @@ -31356,7 +31563,7 @@ "ts", "src" ], - "contentHash": "41f3ba7c36b74f38c3a1722d4e535ff60578a76eb81b3344aa733a10f39f08e5" + "contentHash": "32e7d32a4dd1b511e9e8372b6eeaaab2e2723cc57c327ce8dd64a5238586153d" }, { "id": "module:packages/skills/src/real-estate.ts", @@ -31372,7 +31579,7 @@ "ts", "src" ], - "contentHash": "7612ef6392a755ec4cc265bcb1ec35030d06969d6ae4ecb2123b5403e96db13a" + "contentHash": "d8d63399a68a9378394095fc3976e01186c9048792b3505e88ece639103c28dc" }, { "id": "module:packages/skills/src/researcher.ts", @@ -31387,7 +31594,7 @@ "ts", "src" ], - "contentHash": "90836f8cc68b0c87c794e68e044cff570d41d723500fdf72583fd3fdd7547988" + "contentHash": "c1d582c27be18f76839f7f770f127d6fb9618aa82150d7080f1388a8c3c1f5e9" }, { "id": "module:packages/skills/src/security-auditor.ts", @@ -31402,7 +31609,7 @@ "ts", "src" ], - "contentHash": "2d62a88f236ba89abed38178ef453ae05646f38bdc68ba68bf7960ca4bb55e77" + "contentHash": "acfd5bcce3aca40050dec37514ebd89780f6c1f2c8978647d84fb7d639c15ee3" }, { "id": "module:packages/skills/src/sql-analyst.ts", @@ -31417,7 +31624,7 @@ "ts", "src" ], - "contentHash": "595dc043af80c134e82a5f69b3c49303f58be0505b4cf5e69f0417df2f335867" + "contentHash": "1238badbc3fc6b8bdd773881dbc81dbad98c30934932eba24df4848978fe774a" }, { "id": "module:packages/skills/src/sql-gen.ts", @@ -31432,7 +31639,7 @@ "ts", "src" ], - "contentHash": "110acb468a9d7624af267dea3bdba27cf0618d861b59ce29026c8e7a024a3efe" + "contentHash": "190ccf5c3d45fc424e2f86adb6b33bc455bba544c6aa62aa54e145ffe8cc26c3" }, { "id": "module:packages/skills/src/summarizer.ts", @@ -31447,7 +31654,7 @@ "ts", "src" ], - "contentHash": "f3c8cd12af90268aecf8fa9529437ca64568efe5f50bbc56a28a515119bc7070" + "contentHash": "c7b2afe1a6e51fb6c76a6dc1159824d3ef63d9d091f7855770ced6c5c7235c3b" }, { "id": "module:packages/skills/src/technical-writer.ts", @@ -31462,7 +31669,7 @@ "ts", "src" ], - "contentHash": "933f6e89e60e10100ef787282d858aa0416a45dbae99d96a20cdbceb22affd79" + "contentHash": "a3b4ab1fae48c66ac09abe9b6d8562c54fa20cd57ee7342119ffb7c42e161fbc" }, { "id": "module:packages/skills/src/translator.ts", @@ -31479,7 +31686,7 @@ "ts", "src" ], - "contentHash": "93bf55f65d8a7090072091d2e4fb3ed080cd729851d780c861cf8e9bc6d1a175" + "contentHash": "7eb92b0144be5e761e24e3f0372011e2a1844b3238af1495a3bd05215beb79d4" }, { "id": "module:packages/skills/src/utils.ts", @@ -31688,7 +31895,7 @@ "ts", "skills" ], - "contentHash": "2a5330bf82ea4b7e1dddf7445151e0ff72be1bddae091b906e746cc52d395ad6" + "contentHash": "2cd06f22909f5a5747183b57768d18535b1525cc85e8bd621c0d7598e7995bd3" }, { "id": "module:packages/skills/vitest.config.ts", @@ -31734,7 +31941,7 @@ "tsx", "components" ], - "contentHash": "75336e37b993315cd95192507ef23c922c8859af8d999fbdba5a4774bc76d77c" + "contentHash": "0475616c2c83698cc67330db210214a43b5183d8e555aeb5db6050b7f45f9860" }, { "id": "module:packages/solid/src/components/CodeBlock.tsx", @@ -31750,7 +31957,7 @@ "tsx", "components" ], - "contentHash": "07b4cbaed940ba78224f13d15cd5cea7355ede8df438b90fb7ad061dfcdab1f1" + "contentHash": "f9012107ec198c6767803395f0d5ee82196cf79de8c56c0e6f09081591f91d38" }, { "id": "module:packages/solid/src/components/index.ts", @@ -31796,7 +32003,7 @@ "tsx", "components" ], - "contentHash": "c0d04672c6daf02871ac0fa11d3ff2781162cbbbd5f19f239dc07a20b2c83cbf" + "contentHash": "ba7e3cd4f6461cfe63429007def4fedd85eb082faacb3f4aa92f016e1f80374b" }, { "id": "module:packages/solid/src/components/Markdown.tsx", @@ -31812,7 +32019,7 @@ "tsx", "components" ], - "contentHash": "7f9b511e3354385d7568f2ba87d8984289a3f611cc5a53790d3d805195de38d3" + "contentHash": "e89a1154174ff736581f0482d2770a3eb225f528015c06def725e3fcaf2ad20f" }, { "id": "module:packages/solid/src/components/Message.tsx", @@ -31828,7 +32035,7 @@ "tsx", "components" ], - "contentHash": "4fa3ec15b84f16e0a3fbc9c6bb8c11344fda50e1322f9463dbf534b89ae14702" + "contentHash": "1ea368d0f0158a20a0038de7a520977f87635279aa60ef0a5f382116cb1d8827" }, { "id": "module:packages/solid/src/components/ThinkingIndicator.tsx", @@ -31844,7 +32051,7 @@ "tsx", "components" ], - "contentHash": "48ef04e1d713bf6da178fb0d611db3eb4875770bd9de05e84b9ee4bac8504044" + "contentHash": "7ba1df7f3b5fdb86d449e8ba08bf1e5bb80068f09ccdb42e80e5d9abf3d23158" }, { "id": "module:packages/solid/src/components/ToolCallView.tsx", @@ -31860,7 +32067,7 @@ "tsx", "components" ], - "contentHash": "a2c35bb3d9064ba4e96b6a0b69aed2c5f1680b363fa140dc56edae248b088b8c" + "contentHash": "3cbb40e501f379b207f4ccee862515098e3f38070248b494696305a7ff3a5658" }, { "id": "module:packages/solid/src/components/ToolConfirmation.tsx", @@ -31876,7 +32083,7 @@ "tsx", "components" ], - "contentHash": "954f39a491389e4a10bd92c36ecf3e698302ee909fa3db732318017d8db51c62" + "contentHash": "c527b65f9fadec8e0ee95cd79f8aa3aadbe91a10d6c3fee62d28ed129106d29f" }, { "id": "module:packages/solid/src/index.ts", @@ -31976,7 +32183,7 @@ "ts", "solid" ], - "contentHash": "0a712393b3990c039447d0edbc6514bcada8554d385b952da7d30b5ee645265d" + "contentHash": "b773b5c4ab0fcbed3980d48e99a85e940079f8839c65a749a66d73d74abab11d" }, { "id": "module:packages/solid/vitest.config.ts", @@ -32018,7 +32225,7 @@ "ts", "src" ], - "contentHash": "4a2ec4fb4214c6887301269900255752a7f04414d9dfa291b1d3ffa84a8c1312" + "contentHash": "3a6828c92f34f756203ec83d87594bc362e06f2741f3b2262087e87f97a44a32" }, { "id": "module:packages/statechart/src/index.ts", @@ -32096,7 +32303,7 @@ "ts", "src" ], - "contentHash": "a93b148f7eeeedf9eb8db2ccd6bbe6202cb1a4a5b8514c94ee8b4a3d09797e35" + "contentHash": "83e137540df6d11c28977352ae8c388c33627757695d841fb39ea3dc6f1e56f8" }, { "id": "module:packages/statechart/src/statechart.ts", @@ -32114,7 +32321,7 @@ "ts", "src" ], - "contentHash": "933d494e483df947cba6a8c290be798789167e738d9e672e38d8af1129b3145c" + "contentHash": "568661f113c121ccf5b6832581c6369556f5f53a2341f1c8b66fcbdc36188321" }, { "id": "module:packages/statechart/src/types.ts", @@ -32155,7 +32362,7 @@ "ts", "src" ], - "contentHash": "9c9b54e54a21c3e955c131de484a0f327e3fe48f3c46527730549e33f99e861d" + "contentHash": "d1d130c4653987b914fb0cbf6d1a6d856bc1aadb0c2ec0b225ac8e6cc42c4736" }, { "id": "module:packages/statechart/tests/json.test.ts", @@ -32222,7 +32429,7 @@ "ts", "statechart" ], - "contentHash": "e1790fca6e558e88486f3ba50c847b32be8bbb7b67d257db29b130b513a506d6" + "contentHash": "fd791a268e8b2d38684a9fa61f64d525779d6e10a93e1672118fc78d8bd96eba" }, { "id": "module:packages/statechart/vitest.config.ts", @@ -32264,7 +32471,7 @@ "ts", "components" ], - "contentHash": "39bdab922efad78b481cadaecdea356a42ff43f52e26ebec52b1687f9de38e16" + "contentHash": "7c84bfeb390c7dc290d0d52f7d760240e9ea5b2068c4a4ecd4610ff2f3e0443f" }, { "id": "module:packages/svelte/src/components/CodeBlock.svelte.d.ts", @@ -32279,7 +32486,7 @@ "ts", "components" ], - "contentHash": "ab9fea010d50de46ba998199608d05e033d65ee62480734c172f6f0a8fafab42" + "contentHash": "b65b92b359a73ee2cdfe839b077678071044157d063a8d93c9cb68bfe24fbd48" }, { "id": "module:packages/svelte/src/components/InputBar.svelte.d.ts", @@ -32294,7 +32501,7 @@ "ts", "components" ], - "contentHash": "38b70a4cff28e5017c6fd7774f63be6c3080664c6c5ed4a95e65de8e00828ac9" + "contentHash": "d61e85b2fa63e2c98cd06fb32183e403da0832c259e895d66268c93d924d740a" }, { "id": "module:packages/svelte/src/components/Markdown.svelte.d.ts", @@ -32309,7 +32516,7 @@ "ts", "components" ], - "contentHash": "91317b30ab88178f2ef59b80c8a5685f0464c1257426b89405bab348bc934b78" + "contentHash": "2657d9af43b334542049f5a8d0021887591116694bead438d17e1a0269813e3a" }, { "id": "module:packages/svelte/src/components/Message.svelte.d.ts", @@ -32324,7 +32531,7 @@ "ts", "components" ], - "contentHash": "e0e7aaef4878fd78fd3857c98602ad776ba2436e48c31b1eb4d9a7a7dbd7bf9b" + "contentHash": "8f1a6c233a612da34cb580bde49104bcdb4d7ac1a587b9c4163ae554c87e3c0e" }, { "id": "module:packages/svelte/src/components/ThinkingIndicator.svelte.d.ts", @@ -32339,7 +32546,7 @@ "ts", "components" ], - "contentHash": "d6206b3eced8590d444dc4098843d3bc71ba03a3235a3fba27696f381a7912a4" + "contentHash": "ea030756eae8de82c1090a82cc060b21db397da4c9f1b45f9fb9923016bf7de3" }, { "id": "module:packages/svelte/src/components/ToolCallView.svelte.d.ts", @@ -32354,7 +32561,7 @@ "ts", "components" ], - "contentHash": "09d59eb3fd8f047e5a5a0612168c5c4cc8718f36d60519de85eadfda663fbb2d" + "contentHash": "552263242d6da6f389d5677fd53ae83b7b1392bcc2e08cd0846eebe931d488d6" }, { "id": "module:packages/svelte/src/components/ToolConfirmation.svelte.d.ts", @@ -32369,7 +32576,7 @@ "ts", "components" ], - "contentHash": "584bc501671557e40077cd57561372bb4c33f9c04ff63b808940b5079ebbf008" + "contentHash": "41c63c1f5b3df8c89e4e9e106e792476ce2cbe52649ea93692165925a05b367a" }, { "id": "module:packages/svelte/src/index.ts", @@ -32393,7 +32600,7 @@ "ts", "src" ], - "contentHash": "81dbcd07e453900e9054327275bf2d356600e21d38e60e40bef645a3c83ed368" + "contentHash": "39980fd4c617067cb68239c641967a236b90ab4a0b62972e5b15ba08b4c9953d" }, { "id": "module:packages/svelte/src/svelte-shims.d.ts", @@ -32424,7 +32631,7 @@ "ts", "src" ], - "contentHash": "c5e00f018f1a90d59df8811e23e7a07f77a11a7b30163b771efe02020c9f6009" + "contentHash": "aac9fbfbe08346d6f5215895c704d8e76ac3d7801de4acf3a92769eba08f34c0" }, { "id": "module:packages/svelte/tests/components.test.ts", @@ -32742,7 +32949,7 @@ "ts", "src" ], - "contentHash": "e8a2c973b4ec18001cbff48911565bfb15c0ab12894d6354513913f684c28a06" + "contentHash": "4c512927a72d0e84d9d04ba4f2b25a045b8b2866da513c559f69df6596b75c5c" }, { "id": "module:packages/templates/src/index.ts", @@ -32790,7 +32997,7 @@ "ts", "src" ], - "contentHash": "c627186fe537c98cddea9100562dd70abf1af88b21cb531748a461dd6e8c3f70" + "contentHash": "38a56036c315d3b02d30442144985df0e342cd6e29e8291d9c23a1651b6b0afa" }, { "id": "module:packages/templates/src/scaffold-fs.ts", @@ -32831,7 +33038,7 @@ "ts", "src" ], - "contentHash": "d3bbfdb7fb3b4800a07dc2a2371ef6e7e4dec01a2c48f820eefafcf6b018070d" + "contentHash": "eddf055cf45eb451dd82d0bd698df0440455ca08ccd936839bcdebd8c3a726b6" }, { "id": "module:packages/templates/src/validate.ts", @@ -32848,7 +33055,7 @@ "ts", "src" ], - "contentHash": "f805a0e90012fff7efacde54b50be891ec52fb53ece11ba6d7d6f7e246a168c4" + "contentHash": "30257af0e4bf9a5abe73c4b244d1172129e5f88e127eff006772aaf8e9f0b62c" }, { "id": "module:packages/templates/tests/factories.test.ts", @@ -32915,7 +33122,7 @@ "ts", "templates" ], - "contentHash": "4d2a91f1dbcb0d99fc0d0794c30d9370aa5f6ca465c071e837e750b265ed6168" + "contentHash": "fd791a268e8b2d38684a9fa61f64d525779d6e10a93e1672118fc78d8bd96eba" }, { "id": "module:packages/templates/vitest.config.ts", @@ -32958,7 +33165,7 @@ "ts", "src" ], - "contentHash": "7b72f344adeccc86316737cbbc72f1fba85ff2ae6bf4add12e6810ea3d5f646b" + "contentHash": "8b0fbf02a1b669e72c5fb84fc49bc51a0b35079de2ebc82a9022064e0094a304" }, { "id": "module:packages/tools/src/fetch-url.ts", @@ -32974,7 +33181,7 @@ "ts", "src" ], - "contentHash": "33f2c4ec1e9632d122dce97e018c843caeb02bef7e75d63d9cce5236c8cc7b64" + "contentHash": "d66040a911be6ccd3934b2b75cd777aec45cfba2c24246128c7869aaab60dd21" }, { "id": "module:packages/tools/src/filesystem.ts", @@ -32990,7 +33197,7 @@ "ts", "src" ], - "contentHash": "7d8f3b0b376d88617730e72b8fb5e08785ab803dbe5ed7b0d624c39883f05b6e" + "contentHash": "a37361bfe69f0d66313a5112f0b995a3af25bfdf23ec1e88269bc6828b469d3a" }, { "id": "module:packages/tools/src/index.ts", @@ -33068,7 +33275,7 @@ "ts", "integrations" ], - "contentHash": "9dfb20b9c52750207be8ca15f34d18adefbe845472b064e412a0b49782a764a4" + "contentHash": "a7bc3f99c55cbbf90bd16dab933a9486bdadb2e254e877c1edb9d9934e8ce92e" }, { "id": "module:packages/tools/src/integrations/cloudflare-r2.ts", @@ -33093,7 +33300,7 @@ "ts", "integrations" ], - "contentHash": "1332a6016e80d9f14863225ba115ebd7868cdd4c1674ffba5471985fcaf5bbc0" + "contentHash": "b8b81fa85b681823acc0f13e5bff804d6b231d16445c7fd656c400a39811a99c" }, { "id": "module:packages/tools/src/integrations/coingecko.ts", @@ -33183,7 +33390,7 @@ "ts", "integrations" ], - "contentHash": "817461d16b24830ce09b7daa8d6b4c4937cfbb6a557be121e308273228e8bfae" + "contentHash": "61c52972a5004e71ed204ef985a9c68e77b2a4f767cbc129ff4fb2e17ea8bf69" }, { "id": "module:packages/tools/src/integrations/elevenlabs.ts", @@ -33733,7 +33940,7 @@ "ts", "integrations" ], - "contentHash": "9076ece7585f2136bfd453b86124520e89d91cb98419c129ecaa0c0c8a2fd89f" + "contentHash": "ca61eba9c93294b2f8ec95c5a420eaa574e0b0d71b1df2ffaab2b150814e2174" }, { "id": "module:packages/tools/src/integrations/postgres-roles.ts", @@ -33749,7 +33956,7 @@ "ts", "integrations" ], - "contentHash": "2a0474a66a2c6979bf4744c60a607c30bd8d8a01704eb2cff8f8b0709b7829dc" + "contentHash": "0381ab3bf41f5d405b51574d859231867b77a190132635e92104b0420cb6d61b" }, { "id": "module:packages/tools/src/integrations/postgres.ts", @@ -33767,7 +33974,7 @@ "ts", "integrations" ], - "contentHash": "d4e687f563da656838adbeb4b5bee15851658769b41964b414583cb2c92f6124" + "contentHash": "78bcaa4f99a30090263b20b1f1cb9a673f88b9897159ec87498a2059e99d314f" }, { "id": "module:packages/tools/src/integrations/reader.ts", @@ -33804,7 +34011,7 @@ "ts", "integrations" ], - "contentHash": "62f5a7e79adea66b3f009b4ae53768323079a756586f55e20e9bd0057f7a8b43" + "contentHash": "58a54faeee93b38527bb41f36c7bca89c12f16f877a4bc09f71043536fa509d5" }, { "id": "module:packages/tools/src/integrations/sentry.ts", @@ -34026,7 +34233,7 @@ "ts", "mcp-devtools" ], - "contentHash": "be88cdb3ce19812291d358664c5e6bca5bfba8e6cb38e69846b849dcaaceac7c" + "contentHash": "7ae2c3f6562517b1963d217a42a539024ad57f0f27d8076a4b0646bd26f950bb" }, { "id": "module:packages/tools/src/mcp-devtools/tools.ts", @@ -34042,7 +34249,7 @@ "ts", "mcp-devtools" ], - "contentHash": "a73b2d2cce4df9ba44c21df27e4f316b11cc38937391c7e82dc6beac87dc2cdc" + "contentHash": "6b73f70146486a016f602de9a82d6cf8c0e7c8889ae4d70f43f0ea3e775e63af" }, { "id": "module:packages/tools/src/mcp/client.ts", @@ -34060,7 +34267,7 @@ "ts", "mcp" ], - "contentHash": "344b3a9a2b523f4a5dca8852380d3d5e4740b717f6885de403364129763612c9" + "contentHash": "5a48a4be9322fbbd4d21376a418867f215726e5db25c71947c64a548ab649918" }, { "id": "module:packages/tools/src/mcp/index.ts", @@ -34110,7 +34317,7 @@ "ts", "mcp" ], - "contentHash": "a1179bd1006236c84dd0445a05faf23c95fa9575f0e8773a608fa822714412a7" + "contentHash": "b7a76d574044828a72d170ee240d47c3e6ef471d64164acc97e3235c8a6d182f" }, { "id": "module:packages/tools/src/mcp/transports.ts", @@ -34128,7 +34335,7 @@ "ts", "mcp" ], - "contentHash": "3e42e53892264df8cdd645a657efcef8258fab0c1cf77f8277db8aa1ae953db4" + "contentHash": "7e25b127ffca00d371c306d2d297d4c65bfd661ef54e6359c8d387dc41c335b5" }, { "id": "module:packages/tools/src/mcp/types.ts", @@ -34153,7 +34360,7 @@ "ts", "mcp" ], - "contentHash": "8f26db7132c4a184b82b403a26ff90a04c30de78de95f1544da1feb4046ee5b4" + "contentHash": "a78e432ac9908b215d983e3bcb63a02ff7e3e5318b563559d7d486e05320cd60" }, { "id": "module:packages/tools/src/safe-fetch.ts", @@ -34189,7 +34396,7 @@ "ts", "src" ], - "contentHash": "663557a2f8e622b61e3eb38198516321bca19f57f88901038da6bdee3bd8dab0" + "contentHash": "2687d42c51f5b103c93389883dca94d934600b301f0bd19a9cc4a399c44ecd5f" }, { "id": "module:packages/tools/src/slack.ts", @@ -34205,7 +34412,7 @@ "ts", "src" ], - "contentHash": "390f26719449d948ed78607df1ec3613141dd280cdad03bfd95230b5eabffa3d" + "contentHash": "5de240c1a98fc67e7aae93d4d63b251eba0a324e646ff5fcfd73388832db7709" }, { "id": "module:packages/tools/src/sqlite-query.ts", @@ -34221,7 +34428,7 @@ "ts", "src" ], - "contentHash": "c21f9403ac2233d7270fd5c6e2456b342ca1d6aab0ddfd43c8643aabb7330191" + "contentHash": "08def851c5cd860ca5a01940a583a5fd19412f00c2b705e98721c865cc7f994c" }, { "id": "module:packages/tools/src/web-search.ts", @@ -34239,7 +34446,7 @@ "ts", "src" ], - "contentHash": "d016db5379af630c5139bd63f9dc842bef2e9a0bd8d5d3d8776ef7f4f38629f0" + "contentHash": "6e1348e626807d81b1a20bde407134cac35464438545ac3e75680c7a59c3da59" }, { "id": "module:packages/tools/src/zod.ts", @@ -34255,7 +34462,7 @@ "ts", "src" ], - "contentHash": "3e0cf29b494804c90a03bfad6b12a9597cf54aec830a6ebd966c6795b366356f" + "contentHash": "d151b7ff4bcf7ff89d614c41c25fa70f4661821127e919b06becf0e027ce570f" }, { "id": "module:packages/tools/tests/discovery.test.ts", @@ -34530,7 +34737,7 @@ "ts", "tools" ], - "contentHash": "94d6a279af9f1ed32fff4f2997f4fbc709a6e5aa0e3f8fb80a6deb2a6acbcd16" + "contentHash": "252c95bb2449c06076cc4d5a87c1abbcfb4a4526950688961ce5701f226a04d4" }, { "id": "module:packages/tools/vitest.config.ts", @@ -34630,7 +34837,7 @@ "ts", "validation" ], - "contentHash": "3005ef00e2bba37ee66f6b21258c5559017a025057dbf569047bd29ae4b84bf8" + "contentHash": "b037b2a62a5e0e747cc0d6a9ee764cb0027fd1e6cf218159217f3370181786ed" }, { "id": "module:packages/validation/vitest.config.ts", @@ -34672,7 +34879,7 @@ "ts", "src" ], - "contentHash": "0cd5c3565d3d862211933ece29998c451152215d3380352288936561af531010" + "contentHash": "e57fc1669e99c1f86df279e469c3630fb924339b80473a4bf46e9e03907851e7" }, { "id": "module:packages/vue/src/components.ts", @@ -34694,7 +34901,7 @@ "ts", "src" ], - "contentHash": "5af5479bc1167caf91657a580c6af51b5eee64ed45fc238c8c15de22add419ea" + "contentHash": "0d80f5e8296b46340e40aabec57176fba30cd85889327fc466b61ed1e856e6cc" }, { "id": "module:packages/vue/src/index.ts", @@ -34733,7 +34940,7 @@ "ts", "src" ], - "contentHash": "a3f10305c379f2a53eecf81513104b0f928371356bca4bc5ddc6ee30cd8f8f6a" + "contentHash": "2fe5c5039e05a04b3be0784a5590d452ff863e5a2b765a83d4d6a3ccdd7a561b" }, { "id": "module:packages/vue/tests/components.test.ts", @@ -34787,7 +34994,7 @@ "ts", "vue" ], - "contentHash": "2d0e81fe1ff1820b4408203ab5fdf4b652a44b75de7cc45042afd14be14a3825" + "contentHash": "d983ead1c629cec3415b7f5458bf44cb261a1f0c035540a199e0e77b79dc4a13" }, { "id": "module:packages/vue/vitest.config.ts", @@ -34828,7 +35035,7 @@ "mjs", "scripts" ], - "contentHash": "1071a9df9c04e95e4b602b119bd2c8ea6865780a6fdf3564196d00cd78a190ed" + "contentHash": "6f6a568b444c3f5751ae9f77635bd16f05b4a5d5b3f976fbebb3793ba748b904" }, { "id": "module:scripts/check-content-pipeline.mjs", @@ -34901,7 +35108,7 @@ "mjs", "scripts" ], - "contentHash": "b294c08d0a12ad0afea8b1ec81ec5a60b5c0da760ec5f1e10e2d280308f44a23" + "contentHash": "6c44845d86ddb386f32f8b8f648669393ce60e09efcfebffc9f0f88e4e3e4fe3" }, { "id": "module:scripts/check-cross-platform.mjs", @@ -35011,6 +35218,31 @@ ], "contentHash": "1df938d4a6219875527eece4218813fb6d59173be8e36c2d87fc90b3170e8134" }, + { + "id": "module:scripts/check-jsdoc-coverage.mjs", + "type": "module", + "title": "check-jsdoc-coverage.mjs", + "path": "scripts/check-jsdoc-coverage.mjs", + "tags": [ + "module", + "mjs", + "scripts" + ], + "contentHash": "95f6df8de1f54f21b1ae7f76bd46a162680338da213f9d9acfccc0169e03c033" + }, + { + "id": "module:scripts/check-jsdoc-coverage.test.mjs", + "type": "module", + "title": "check-jsdoc-coverage.test.mjs", + "path": "scripts/check-jsdoc-coverage.test.mjs", + "tags": [ + "module", + "mjs", + "test", + "scripts" + ], + "contentHash": "d4ea9e42bb8a0f2436aa8e1d131343f8b4ce0053af9f8156b9cbf38c2a37de33" + }, { "id": "module:scripts/check-launch-package.mjs", "type": "module", @@ -35118,7 +35350,7 @@ "mjs", "scripts" ], - "contentHash": "eae3682677475ee1a6a6b2a90e10fcfadb7ef32240ce8e08327553954f230e93" + "contentHash": "70aa8bd52225502964aaeb25d3d76c191027e9fb9faccea98f6cc851e0d0bc31" }, { "id": "module:scripts/check-no-nested-ternary.test.mjs", @@ -35182,7 +35414,7 @@ "mjs", "scripts" ], - "contentHash": "7695ae834c1d33dbcf012bc458fba13ccac83ab377f7feb543ed48c674e0db16" + "contentHash": "b9f3891fa53fc79699097120667aeb450f44303ec3a9e577dad6fb8164fbe846" }, { "id": "module:scripts/check-publication-surface.mjs", @@ -35206,7 +35438,7 @@ "mjs", "scripts" ], - "contentHash": "dc2925e56c5fa52a2f5bd30d1bec73a4a7097050b48eddbeee34aa7231698b7c" + "contentHash": "e85cf73a88abe3cf894add87b68bccef3ca94001731200c0268da8f1a39a6542" }, { "id": "module:scripts/check-readme-badge.mjs", @@ -35317,6 +35549,18 @@ ], "contentHash": "e53d5106220be2dbdcf6fa424363857b0b86ea7e02e9520d02049f2def5bebaa" }, + { + "id": "module:scripts/ci-timing-report.mjs", + "type": "module", + "title": "ci-timing-report.mjs", + "path": "scripts/ci-timing-report.mjs", + "tags": [ + "module", + "mjs", + "scripts" + ], + "contentHash": "a7a87049ead39368eeb619917f5082059cca4c8ea57e162a93a79ac076c78871" + }, { "id": "module:scripts/commitlint.test.mjs", "type": "module", @@ -35526,6 +35770,18 @@ ], "contentHash": "7aef48d1093d57ef277a301803008a95b0645a7adab57d0d93b4dc2aa944de35" }, + { + "id": "module:scripts/gen-size-limit-subpaths.mjs", + "type": "module", + "title": "gen-size-limit-subpaths.mjs", + "path": "scripts/gen-size-limit-subpaths.mjs", + "tags": [ + "module", + "mjs", + "scripts" + ], + "contentHash": "d473d4d87f6caad75df211bd7b8b4e4e20240f025722222b76765e615fd8e911" + }, { "id": "module:scripts/generate-software-metadata.mjs", "type": "module", @@ -35538,6 +35794,35 @@ ], "contentHash": "9a2a906af1a0686fc5480c218fd5737ad4ce0626dd2f2aff98a22773270ab11f" }, + { + "id": "module:scripts/guardrail-report.mjs", + "type": "module", + "title": "guardrail-report.mjs", + "path": "scripts/guardrail-report.mjs", + "symbols": [ + "createDeltas", + "flattenNumbers" + ], + "tags": [ + "module", + "mjs", + "scripts" + ], + "contentHash": "16536dc12dcb3eeae2472c2c63b8f80deff7702f273b015404f1047adeb5a743" + }, + { + "id": "module:scripts/guardrail-report.test.mjs", + "type": "module", + "title": "guardrail-report.test.mjs", + "path": "scripts/guardrail-report.test.mjs", + "tags": [ + "module", + "mjs", + "test", + "scripts" + ], + "contentHash": "522732c58e8f62c64cbf8faf26e1c0e03dbbe636a917e0e2eb516f4bc2e03ef3" + }, { "id": "module:scripts/launch-package.test.mjs", "type": "module", @@ -35721,6 +36006,24 @@ ], "contentHash": "ad283c94f06797ff0ff6e52578feff2d18869ded6050c615f9935f0dd5d2118e" }, + { + "id": "module:scripts/lib/jsdoc-coverage.mjs", + "type": "module", + "title": "jsdoc-coverage.mjs", + "path": "scripts/lib/jsdoc-coverage.mjs", + "symbols": [ + "JSDOC_BASELINE_RELATIVE", + "calculateCoverage", + "findBaselineGrowth", + "serializeJsdocBaseline" + ], + "tags": [ + "module", + "mjs", + "lib" + ], + "contentHash": "664841032a1511ae5226b153e988c87c2947d82ee467886cabed192391fc5cf9" + }, { "id": "module:scripts/lib/launch-package.mjs", "type": "module", @@ -35902,6 +36205,7 @@ "findMissingBuildOutputs", "formatDiffDiagnostics", "formatStats", + "getDocumentedExportsFromSourceFile", "getExportsFromSourceFile", "isDeclarationTarget", "isLocalFileTarget", @@ -35921,7 +36225,7 @@ "mjs", "lib" ], - "contentHash": "9265198efdae5d57437a592c9230f7af67323bf0a2a204a82de126460ea37eba" + "contentHash": "eed539a529de197565183c33e5187b3551ea97d20d41a2ffb7573d6009b0c86f" }, { "id": "module:scripts/lib/publish-manifests.mjs", @@ -36048,6 +36352,19 @@ ], "contentHash": "80f33cde09d9db899e840aad2b23a41d584a936affbdb3f78a7f1399d1cdce43" }, + { + "id": "module:scripts/math-random-id-rule.test.mjs", + "type": "module", + "title": "math-random-id-rule.test.mjs", + "path": "scripts/math-random-id-rule.test.mjs", + "tags": [ + "module", + "mjs", + "test", + "scripts" + ], + "contentHash": "1a866f04dd50c0cfc1331b0cea6460263dd0f1a7ea45ac5abe51dda0dda2d0bc" + }, { "id": "module:scripts/models-dev-catalog.test.mjs", "type": "module", @@ -36611,6 +36928,20 @@ ], "contentHash": "dacd7c12d42383ecdf2ceb0a4b8a5a998d347b88b71628caab0c12e78ac51388" }, + { + "id": "module:tsup.shared.ts", + "type": "module", + "title": "tsup.shared.ts", + "path": "tsup.shared.ts", + "symbols": [ + "sharedTsupOptions" + ], + "tags": [ + "module", + "ts" + ], + "contentHash": "229976b8f87d7c3eda5bcb21bf781f34c3fcb38446204a921e94578f9b29d3fc" + }, { "id": "module:vitest.shared.ts", "type": "module", @@ -37733,8 +38064,8 @@ "changes": {} }, "inputs": { - "hash": "8d46a33633879d48490f5237538e6674133588cb6d9f104990b0cdec3544bbda", - "fileCount": 2507, + "hash": "24c4e2884cd8439780caba12dc5a0f8be9166b1ab05def2195acc100267d3b44", + "fileCount": 2530, "projectionVersion": 2 }, "retrieval": { @@ -37756,9 +38087,9 @@ "projection": { "type": "retrieval-index", "schemaVersion": 1, - "contentHash": "d9fc36bebae626e25a911f89327618fbb99c794a08548a767ecc63273b507bbd", + "contentHash": "87142bf5f2b2be22873cdaec6599fb7187fc421811a7621c79c83d991e3aaf30", "contentHashAlgo": "sha256-normalized-v1", - "snapshotHash": "4e2310c6f5e4c49d76990796dc2598c0910ad1dafe3cdafaf6d7e0e387dbc5d8", + "snapshotHash": "1b564d32ff9f6e03767c8a89f5f119b85152fedb7509c05e89a3c280dcd6e0dc", "overlayHash": "f99666ff9119084dd25c2974ae64eb6935ec2aa785ff5ad478fb9d541f7a5e94", "configurationHash": "9662cc07ea4ab203ff2ddf457d2db48b5375a7ab4a1f8fbc79dfebcaa8f9a00c", "lexiconVersion": 1, @@ -37778,7 +38109,7 @@ }, "lexical": { "version": 1, - "documentCount": 2461, + "documentCount": 2485, "fieldNames": [ "aliases", "body", @@ -37789,16 +38120,61 @@ "title" ], "averageFieldLength": { - "aliases": 3.015034538805364, - "body": 60.93742381145876, - "headings": 4.012190166598944, - "path": 7.623730190979277, - "summary": 4.541243396993092, - "symbols": 7.472572125152377, - "title": 3.340511986997156 + "aliases": 3.014486921529175, + "body": 61.03782696177063, + "headings": 4.0004024144869215, + "path": 7.613279678068411, + "summary": 4.53682092555332, + "symbols": 7.45271629778672, + "title": 3.348893360160966 } }, "entries": [ + { + "id": "area:.github", + "kind": "area", + "path": ".github", + "title": ".github", + "aliases": [], + "tags": [ + "area" + ], + "fields": { + "title": ".github", + "headings": "", + "path": ".github", + "symbols": "", + "summary": "", + "body": "", + "aliases": "area" + }, + "graph": { + "pagerank": 0, + "inboundLinks": 2, + "coveredBy": [], + "mentionedBy": [ + "document:docs/MASTER-EXECUTION-PLAN.md", + "document:docs/PHASE-0-FOUNDATION-PRD.md" + ], + "packageId": "package:agentskit", + "inbound": [ + { + "kind": "mentions", + "id": "document:docs/MASTER-EXECUTION-PLAN.md", + "confidence": "fuzzy" + }, + { + "kind": "mentions", + "id": "document:docs/PHASE-0-FOUNDATION-PRD.md", + "confidence": "fuzzy" + } + ], + "outbound": [] + }, + "contentHash": "c7a4f26e5fec76986a3433537a5eb0558ad48a76383d92ae5197c7e38ea90120", + "provenance": "observed", + "confidence": "observed" + }, { "id": "area:agents", "kind": "area", @@ -38146,7 +38522,7 @@ ], "outbound": [] }, - "contentHash": "3cfef275a3959dd1ecb6e2ebec950fbbda0f71f5d431529805fc222a1688e74c", + "contentHash": "db16d6e6aedd39af524b30cbbe07bf8224cfd08aecf940c59a6abe88485a2b25", "provenance": "observed", "confidence": "observed" }, @@ -38169,7 +38545,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.003649, + "pagerank": 0.00362, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/reference/examples/discord-bot.mdx" @@ -38208,7 +38584,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.003649, + "pagerank": 0.00362, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/reference/examples/dspy.mdx" @@ -38286,7 +38662,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.003649, + "pagerank": 0.00362, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/reference/examples/embedded.mdx" @@ -38607,7 +38983,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.003649, + "pagerank": 0.00362, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/reference/examples/slack-bot.mdx" @@ -38646,7 +39022,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.003649, + "pagerank": 0.00362, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/reference/examples/teams-bot.mdx" @@ -39002,7 +39378,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.003649, + "pagerank": 0.00362, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/data/providers/embedders.mdx" @@ -39117,7 +39493,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.003649, + "pagerank": 0.00362, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/production/cli/index.mdx" @@ -39280,7 +39656,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.003649, + "pagerank": 0.00362, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/production/security/index.mdx" @@ -39443,7 +39819,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.002811, + "pagerank": 0.002789, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/reference/packages/eval-braintrust.mdx" @@ -39527,7 +39903,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.002811, + "pagerank": 0.002789, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/production/evals/snapshots.mdx" @@ -39566,7 +39942,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.003649, + "pagerank": 0.00362, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/production/evals/replay.mdx" @@ -39605,7 +39981,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.002811, + "pagerank": 0.002789, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/production/evals/snapshots.mdx" @@ -39644,7 +40020,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.002392, + "pagerank": 0.002373, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/ui/index.mdx" @@ -39714,7 +40090,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.002811, + "pagerank": 0.002789, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/agents/tools/integrations-catalog.mdx" @@ -39784,7 +40160,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.003649, + "pagerank": 0.00362, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/data/memory/index.mdx" @@ -39823,7 +40199,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.003649, + "pagerank": 0.00362, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/data/rag/loaders.mdx" @@ -39862,7 +40238,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.003649, + "pagerank": 0.00362, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/data/rag/rerank.mdx" @@ -39901,7 +40277,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.002392, + "pagerank": 0.002373, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/ui/index.mdx" @@ -39940,7 +40316,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.002811, + "pagerank": 0.002789, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/production/security/sandbox.mdx" @@ -39979,7 +40355,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.002392, + "pagerank": 0.002373, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/ui/index.mdx" @@ -40018,7 +40394,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.002392, + "pagerank": 0.002373, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/ui/index.mdx" @@ -40088,7 +40464,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.002811, + "pagerank": 0.002789, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/agents/tools/integrations-catalog.mdx" @@ -40178,7 +40554,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.003649, + "pagerank": 0.00362, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/production/observability/devtools.mdx" @@ -40225,7 +40601,7 @@ "inbound": [], "outbound": [] }, - "contentHash": "7f842c148b03480860cf8ce76c52485b549b3cdc2ec1b07d4f894d6f23d9063f", + "contentHash": "3b6b06f2797b254c9ad8764883d607f7b2d8e68ca38a0dc06675443159b871bc", "provenance": "observed", "confidence": "observed" }, @@ -40840,6 +41216,11 @@ "kind": "mentions-symbol", "id": "module:packages/adapters/src/ollama.ts", "confidence": "observed" + }, + { + "kind": "mentions-symbol", + "id": "module:packages/adapters/src/openai-compatible.ts", + "confidence": "observed" } ] }, @@ -40999,7 +41380,7 @@ "aliases": "document unclassified" }, "graph": { - "pagerank": 0.001972, + "pagerank": 0.001957, "inboundLinks": 0, "coveredBy": [], "mentionedBy": [], @@ -41085,7 +41466,7 @@ "aliases": "document unclassified" }, "graph": { - "pagerank": 0.001972, + "pagerank": 0.001957, "inboundLinks": 0, "coveredBy": [], "mentionedBy": [], @@ -41138,7 +41519,7 @@ "aliases": "document unclassified" }, "graph": { - "pagerank": 0.005885, + "pagerank": 0.005839, "inboundLinks": 10, "coveredBy": [], "mentionedBy": [ @@ -41334,7 +41715,7 @@ "aliases": "document project" }, "graph": { - "pagerank": 0.001972, + "pagerank": 0.001957, "inboundLinks": 0, "coveredBy": [], "mentionedBy": [], @@ -43695,7 +44076,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.001972, + "pagerank": 0.001957, "inboundLinks": 0, "coveredBy": [], "mentionedBy": [], @@ -45734,7 +46115,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.001972, + "pagerank": 0.001957, "inboundLinks": 0, "coveredBy": [], "mentionedBy": [], @@ -45876,7 +46257,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.003649, + "pagerank": 0.00362, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -46555,7 +46936,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.001972, + "pagerank": 0.001957, "inboundLinks": 0, "coveredBy": [], "mentionedBy": [], @@ -47947,7 +48328,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.001972, + "pagerank": 0.001957, "inboundLinks": 0, "coveredBy": [], "mentionedBy": [], @@ -49160,19 +49541,25 @@ ], "fields": { "title": "openai.mdx", - "headings": "Options Model examples Env Notes Related", + "headings": "Options Model examples Env Notes Related Gateway presets", "path": "apps/docs-next/content/docs/data/providers/openai.mdx", "symbols": "", "summary": "gpt-4o · gpt-4o-mini · gpt-5 · o1 · o3-mini · gpt-4.1.", - "body": "Options Option Type Default --- --- --- apiKey string required model string required baseUrl string https://api.openai.com retry RetryOptions package default includeUsage boolean true for the canonical OpenAI host Model examples gpt-4o · gpt-4o-mini · gpt-5 · o1 · o3-mini · gpt-4.1 . Env Var Purpose --- --- OPENAI API KEY API key (standard or session key) Notes - Streaming via SSE; emits text + tool-call + done chunks. - Parallel tool calling enabled by default. - Multimodal: pass { type: 'image', url } content parts. - Azure OpenAI users should use — different routing. Related - · · — openaiEmbedder - Recipe:", + "body": "Options Option Type Default --- --- --- apiKey string required for openai ; optional for openaiCompatible and Cloudflare presets model string required baseUrl string https://api.openai.com path string /v1/chat/completions ; custom path appended to baseUrl headers HeadersInit additional headers; override defaults case-insensitively fetch typeof fetch global fetch capabilities Partialmajor-package", - "body": "@agentskit/adapters Profile: concise-package", - "body": "@agentskit/cross-platform Profile: Date: Tue, 6 Oct 2026 19:47:08 -0300 Subject: [PATCH 07/13] fix(adapters): classify inline media with native URL parsing --- packages/adapters/src/content-parts.ts | 6 +++++- packages/adapters/tests/content-parts.test.ts | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 packages/adapters/tests/content-parts.test.ts diff --git a/packages/adapters/src/content-parts.ts b/packages/adapters/src/content-parts.ts index 3fb71fb59..d7fb6fbd1 100644 --- a/packages/adapters/src/content-parts.ts +++ b/packages/adapters/src/content-parts.ts @@ -16,7 +16,11 @@ function unsupported(provider: Provider, part: ContentPart): never { } function dataSource(part: Exclude, provider: Provider) { - if (!part.source.startsWith('data:')) return undefined + try { + if (new URL(part.source).protocol !== 'data:') return undefined + } catch { + return undefined + } const match = /^data:([^;,]+);base64,([A-Za-z0-9+/]+={0,2})$/.exec(part.source) if (!match || match[2]!.length % 4 !== 0 || (part.mimeType && part.mimeType !== match[1])) unsupported(provider, part) return { mimeType: match[1]!, data: match[2]! } diff --git a/packages/adapters/tests/content-parts.test.ts b/packages/adapters/tests/content-parts.test.ts new file mode 100644 index 000000000..28ac9e40a --- /dev/null +++ b/packages/adapters/tests/content-parts.test.ts @@ -0,0 +1,19 @@ +import { expect, it } from 'vitest' +import type { Message } from '@agentskit/core' +import { CapabilityUnsupportedError, providerParts } from '../src/content-parts' + +it('classifies data URIs while retaining strict media validation and non-URL sources', () => { + const message: Message = { id: 'synthetic', role: 'user', content: '', status: 'complete', createdAt: new Date(0) } + for (const source of ['data:image/png;base64,aW1hZ2U=', 'https://example.test/image.png']) { + expect(providerParts({ ...message, parts: [{ type: 'image', source }] }, 'openai')).toEqual([ + { type: 'image_url', image_url: { url: source } }, + ]) + } + expect(providerParts({ ...message, parts: [{ type: 'file', source: 'file-synthetic' }] }, 'openai')).toEqual([ + { type: 'file', file: { file_id: 'file-synthetic' } }, + ]) + for (const source of ['unknown-reference', 'data:image/png;base64,invalid!', 'DATA:image/png;base64,aW1hZ2U=', 'data:image/png;base64,YQ=']) { + expect(() => providerParts({ ...message, parts: [{ type: 'image', source }] }, 'openai')).toThrow(CapabilityUnsupportedError) + } + expect(() => providerParts({ ...message, parts: [{ type: 'image', source: 'data:image/png;base64,aW1hZ2U=', mimeType: 'image/jpeg' }] }, 'openai')).toThrow(CapabilityUnsupportedError) +}) From 46a0fa0e7d82125facc11e4111518418895b5eaf Mon Sep 17 00:00:00 2001 From: EmersonBraun Date: Tue, 6 Oct 2026 19:48:28 -0300 Subject: [PATCH 08/13] test(adapters): align transport fixtures with supported configuration --- packages/adapters/tests/multimodal-http.test.ts | 10 ++++++++-- scripts/content-pipeline.test.mjs | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/adapters/tests/multimodal-http.test.ts b/packages/adapters/tests/multimodal-http.test.ts index ee0000787..5132acac5 100644 --- a/packages/adapters/tests/multimodal-http.test.ts +++ b/packages/adapters/tests/multimodal-http.test.ts @@ -127,7 +127,10 @@ describe('OpenAI-compatible presets', () => { const transport: typeof fetch = (input, init) => { const url = String(input) destinations.push(url) - return nativeFetch(`${baseUrl}${new URL(url).pathname}`, init) + const redirected = new URL(url) + redirected.host = new URL(baseUrl).host + redirected.protocol = 'http:' + return nativeFetch(redirected, init) } await send(openRouter({ model: 'google/gemini-2.5-flash-lite', apiKey: 'synthetic', fetch: transport, headers: { 'HTTP-Referer': 'https://example.test', 'X-Title': 'Synthetic' } }), [{ type: 'text', text: 'hello' }]) await send(cloudflareAiGateway({ accountId: 'account', gatewayId: 'gateway', gatewayToken: 'synthetic', model: 'openrouter/google/gemini-2.5-flash-lite', fetch: transport }), [{ type: 'text', text: 'hello' }]) @@ -150,7 +153,10 @@ describe('OpenAI-compatible presets', () => { let destination = '' const transport: typeof fetch = (input, init) => { destination = String(input) - return nativeFetch(`${baseUrl}${new URL(destination).pathname}`, init) + const redirected = new URL(destination) + redirected.host = new URL(baseUrl).host + redirected.protocol = 'http:' + return nativeFetch(redirected, init) } await send(dispatchFromCatalog({ provider: provider.id, model: 'custom', apiKey: 'synthetic', env: { CLOUDFLARE_ACCOUNT_ID: 'synthetic-account' }, fetch: transport }), [{ type: 'text', text: 'hello' }]) expect(destination).toBe('https://api.cloudflare.com/client/v4/accounts/synthetic-account/ai/v1/chat/completions') diff --git a/scripts/content-pipeline.test.mjs b/scripts/content-pipeline.test.mjs index 62792e24e..30175f5fc 100644 --- a/scripts/content-pipeline.test.mjs +++ b/scripts/content-pipeline.test.mjs @@ -221,7 +221,7 @@ test('provider recipe and canonical docs stay aligned with adapter configuration assert.match(recipe, /adapter compatibility matrix/) const unsupportedOptions = { - openai: ['organization', 'project', 'fetch'], + openai: ['organization', 'project'], anthropic: ['version', 'fetch'], gemini: ['apiVersion', 'fetch'], openrouter: ['appUrl', 'appName', 'fetch'], From de0a94da3bbf7f07b0405a87f881da6e8e587d5a Mon Sep 17 00:00:00 2001 From: EmersonBraun Date: Tue, 6 Oct 2026 19:49:33 -0300 Subject: [PATCH 09/13] docs(adapters): reconcile public exports and generated evidence --- .../content/docs/for-agents/adapters.mdx | 7 +++ .../lib/ecosystem-claims.snapshot.json | 4 +- .../lib/ecosystem-claims.snapshot.json | 4 +- docs/architecture/adrs/README.md | 1 + docs/stability/public-api-v1.json | 55 +++++++++++++++++++ ecosystem-claims.json | 4 +- packages/adapters/src/openai-compatible.ts | 1 + readme-standard-v1.json | 12 ++-- 8 files changed, 76 insertions(+), 12 deletions(-) diff --git a/apps/docs-next/content/docs/for-agents/adapters.mdx b/apps/docs-next/content/docs/for-agents/adapters.mdx index bb49d362d..2e610b985 100644 --- a/apps/docs-next/content/docs/for-agents/adapters.mdx +++ b/apps/docs-next/content/docs/for-agents/adapters.mdx @@ -151,6 +151,13 @@ npm install @agentskit/adapters `createOpenAICompatibleAdapter` base; each exposes a default `baseUrl` and accepts an override. +`openaiCompatible` accepts an explicit endpoint, path, headers and fetch +transport with optional Bearer authentication. `openRouter` aliases +`openrouter`; `cloudflareAiGateway` and `workersAi` provide Cloudflare REST +presets without runtime bindings. Ordered image/file parts are serialized at +the provider boundary; unsupported inputs throw `CapabilityUnsupportedError` +before transport I/O. See the [modality limits](/docs/reference/recipes/provider-swap). + ### Composition - `createRouter({ candidates, policy, classify, onRoute })` — pick diff --git a/apps/docs-next/lib/ecosystem-claims.snapshot.json b/apps/docs-next/lib/ecosystem-claims.snapshot.json index b215f019d..4e98c6dd1 100644 --- a/apps/docs-next/lib/ecosystem-claims.snapshot.json +++ b/apps/docs-next/lib/ecosystem-claims.snapshot.json @@ -35,7 +35,7 @@ }, { "id": "native-adapters", - "value": 25, + "value": 28, "noun": "native adapters", "evidence": { "type": "repository-derivation", @@ -43,7 +43,7 @@ "path": "scripts/compute-stats.mjs", "summary": "Provider exports in the adapters package excluding composition helpers." }, - "conservativeFloor": 25 + "conservativeFloor": 28 }, { "id": "integrations", diff --git a/apps/landing/lib/ecosystem-claims.snapshot.json b/apps/landing/lib/ecosystem-claims.snapshot.json index b215f019d..4e98c6dd1 100644 --- a/apps/landing/lib/ecosystem-claims.snapshot.json +++ b/apps/landing/lib/ecosystem-claims.snapshot.json @@ -35,7 +35,7 @@ }, { "id": "native-adapters", - "value": 25, + "value": 28, "noun": "native adapters", "evidence": { "type": "repository-derivation", @@ -43,7 +43,7 @@ "path": "scripts/compute-stats.mjs", "summary": "Provider exports in the adapters package excluding composition helpers." }, - "conservativeFloor": 25 + "conservativeFloor": 28 }, { "id": "integrations", diff --git a/docs/architecture/adrs/README.md b/docs/architecture/adrs/README.md index de8bcf3ce..d622e92a6 100644 --- a/docs/architecture/adrs/README.md +++ b/docs/architecture/adrs/README.md @@ -75,5 +75,6 @@ Do NOT write an ADR for: routine features, bug fixes, internal refactors, or any | [0038](./0038-canonical-json-hash.md) | Canonical JSON and SHA-256 helpers | Accepted | | [0039](./0039-cryptographic-ids.md) | Cryptographic IDs for generated identifiers | Accepted | | [0040](./0040-eval-replay-fingerprint-compatibility.md) | Preserve eval replay fingerprint compatibility | Proposed | +| [0041](./0041-adapter-content-serialization.md) | Serialize attachments at the provider boundary | Proposed | The 6 core contracts are formalized. Future ADRs will cover specific decisions (semver policy, licensing strategy, etc.) rather than additional foundational contracts. diff --git a/docs/stability/public-api-v1.json b/docs/stability/public-api-v1.json index 08ff7efaa..2fc526c75 100644 --- a/docs/stability/public-api-v1.json +++ b/docs/stability/public-api-v1.json @@ -94,6 +94,13 @@ "type" ] }, + { + "name": "CapabilityUnsupportedError", + "kinds": [ + "type", + "value" + ] + }, { "name": "CarbonTable", "kinds": [ @@ -124,6 +131,18 @@ "value" ] }, + { + "name": "cloudflareAiGateway", + "kinds": [ + "value" + ] + }, + { + "name": "CloudflareAiGatewayConfig", + "kinds": [ + "type" + ] + }, { "name": "cohere", "kinds": [ @@ -538,12 +557,30 @@ "value" ] }, + { + "name": "openaiCompatible", + "kinds": [ + "value" + ] + }, + { + "name": "OpenAICompatibleConfig", + "kinds": [ + "type" + ] + }, { "name": "OpenAICompatibleEmbedderConfig", "kinds": [ "type" ] }, + { + "name": "OpenAICompatibleTransportConfig", + "kinds": [ + "type" + ] + }, { "name": "OpenAIConfig", "kinds": [ @@ -568,6 +605,12 @@ "value" ] }, + { + "name": "openRouter", + "kinds": [ + "value" + ] + }, { "name": "OpenRouterConfig", "kinds": [ @@ -777,6 +820,18 @@ "kinds": [ "value" ] + }, + { + "name": "workersAi", + "kinds": [ + "value" + ] + }, + { + "name": "WorkersAiConfig", + "kinds": [ + "type" + ] } ] }, diff --git a/ecosystem-claims.json b/ecosystem-claims.json index b215f019d..4e98c6dd1 100644 --- a/ecosystem-claims.json +++ b/ecosystem-claims.json @@ -35,7 +35,7 @@ }, { "id": "native-adapters", - "value": 25, + "value": 28, "noun": "native adapters", "evidence": { "type": "repository-derivation", @@ -43,7 +43,7 @@ "path": "scripts/compute-stats.mjs", "summary": "Provider exports in the adapters package excluding composition helpers." }, - "conservativeFloor": 25 + "conservativeFloor": 28 }, { "id": "integrations", diff --git a/packages/adapters/src/openai-compatible.ts b/packages/adapters/src/openai-compatible.ts index 1ca52786a..d009dc230 100644 --- a/packages/adapters/src/openai-compatible.ts +++ b/packages/adapters/src/openai-compatible.ts @@ -1,6 +1,7 @@ import type { AdapterFactory } from '@agentskit/core' import { openai, type OpenAIConfig } from './openai' +/** Configuration for provider presets that require Bearer authentication. */ export interface OpenAICompatibleConfig extends OpenAIConfig {} /** Transport configuration for endpoints with optional Bearer authentication. */ diff --git a/readme-standard-v1.json b/readme-standard-v1.json index 1c22c7b4c..649b79946 100644 --- a/readme-standard-v1.json +++ b/readme-standard-v1.json @@ -207,7 +207,7 @@ "ecosystem.json", "scripts/readme-fixtures.test.mjs" ], - "sourceHash": "sha256:a85fbd255e698f3e689d34c150c15e38be267ce58aee5c79a9d290a76f6f8881" + "sourceHash": "sha256:3a5921eaaf01df895ff645c1a6e2cb95252d3cd2ee9b1c807957619098d191c7" }, "exceptions": [] }, @@ -285,7 +285,7 @@ "docs/STABILITY.md", "scripts/readme-fixtures.test.mjs" ], - "sourceHash": "sha256:38e4ff3f70e7463ab700af5ebd9ac3b1815365e4968d47107ccd107f02fcfd64" + "sourceHash": "sha256:5a3977f10a798b33fc42d07c46427c0672258cf173b153647b00257638a87234" }, "exceptions": [] }, @@ -2382,7 +2382,7 @@ "ecosystem-claims.json", "scripts/readme-fixtures.test.mjs" ], - "sourceHash": "sha256:0e4e7ae036016cb1258f3899acab4817d9827736f660049f9e7315567eb67277" + "sourceHash": "sha256:1e69ab8fd2fc64d2549d288bd07d1222aff23b9dd76c5a04d6e1fc705b6f4b65" }, "exceptions": [ { @@ -2466,7 +2466,7 @@ "ecosystem-claims.json", "scripts/readme-fixtures.test.mjs" ], - "sourceHash": "sha256:fa59326d7fbdd34731f081627a839dc14d38465f61a0e3e5fd5cfe749b1972dd" + "sourceHash": "sha256:d0cb36c6b27cc4a081192e7b38efb149acda80cd28c155d5ade9fc24b8c46176" }, "exceptions": [ { @@ -2550,7 +2550,7 @@ "ecosystem-claims.json", "scripts/readme-fixtures.test.mjs" ], - "sourceHash": "sha256:58bcdd16a16ef989d33a167ad23dedbacc257077fa591e213c6bc141d7470977" + "sourceHash": "sha256:34f6b0851407cf08a39c0746f9937d05258098c445e16675f0b1e26151bd4a97" }, "exceptions": [ { @@ -2634,7 +2634,7 @@ "ecosystem-claims.json", "scripts/readme-fixtures.test.mjs" ], - "sourceHash": "sha256:3e729fefb23f11b621248e557a5ae76283fd8569f751675d49a6f91981c103ee" + "sourceHash": "sha256:260d8b8e8631d8f46c5d3920206b664962a74600ae104ec21bae8be369bdb725" }, "exceptions": [ { From 9f47934b6b76a42355bd29aa6753c590d9e1ba2c Mon Sep 17 00:00:00 2001 From: EmersonBraun Date: Tue, 6 Oct 2026 20:11:32 -0300 Subject: [PATCH 10/13] docs(adapters): record green CH-A2 verification and refresh index --- .doc-bridge/capabilities.json | 2 +- .doc-bridge/index.json | 301 ++++++++++++------ .../evidence/adapters-multimodal-transport.md | 42 ++- 3 files changed, 243 insertions(+), 102 deletions(-) diff --git a/.doc-bridge/capabilities.json b/.doc-bridge/capabilities.json index 30b48c10f..d3e435af8 100644 --- a/.doc-bridge/capabilities.json +++ b/.doc-bridge/capabilities.json @@ -7,7 +7,7 @@ "name": "AgentsKit", "root": "." }, - "contentHash": "ffc68ea697f611ccfe61927c43c9466b6a864d38a02aab3778eaf7a14f8c1f35", + "contentHash": "5f8b076f01e5fe0040078ca70e19ce5d63e7c3e6fbe07c28a518e4519ae16757", "artifacts": { "index": ".doc-bridge/index.json", "llmsTxt": ".doc-bridge/llms.txt" diff --git a/.doc-bridge/index.json b/.doc-bridge/index.json index 083074165..559999cc5 100644 --- a/.doc-bridge/index.json +++ b/.doc-bridge/index.json @@ -1,8 +1,8 @@ { "schemaVersion": 1, - "contentHash": "ffc68ea697f611ccfe61927c43c9466b6a864d38a02aab3778eaf7a14f8c1f35", + "contentHash": "5f8b076f01e5fe0040078ca70e19ce5d63e7c3e6fbe07c28a518e4519ae16757", "contentHashAlgo": "sha256-normalized-v1", - "generatedAt": "2026-10-06T22:27:27.055Z", + "generatedAt": "2026-10-06T23:10:10.093Z", "project": { "name": "AgentsKit", "root": "." @@ -6050,7 +6050,7 @@ "document", "human" ], - "contentHash": "99830638ce4623c4a8e014db13f979133c6ad5f378b552ad3a1746f29bd31cfb" + "contentHash": "d114333cd957740925288fcdd81bba2af5684be61ce9aa48a651554c8104d306" }, { "id": "document:docs/architecture/ecosystem-manifest.md", @@ -6489,12 +6489,12 @@ "type": "document", "title": "Adapter multimodal transport — local implementation report", "path": "docs/evidence/adapters-multimodal-transport.md", - "description": "Status: BLOCKED at repository-wide validation; implementation available for maintainer review. No release, publication, deployment, push or PR was performed.", + "description": "Status: AWAITING_HUMAN_APPROVAL: all CH-A2 checks passed; coordinator evidence review remains required. Earlier BLOCKED results below are historical evidence. No release, publication, deployment, push or PR was performed.", "tags": [ "document", "human" ], - "contentHash": "60375d0c705c750d4f69a9a4ce5aaa5711c5de0f2b6f2e39e64a7e2fcb1ec490" + "contentHash": "4821916edffb5279caafdb46f646423762ea03e5b5a00faf6d6ae246247f6a38" }, { "id": "document:docs/evidence/ecosystem-documentation-quality/README.md", @@ -14531,7 +14531,7 @@ "ts", "src" ], - "contentHash": "188da6a73f154b21bf50a482b473529789fb115b965d0e0f8dd5caf82e46d680" + "contentHash": "75ebffb6d25332d5acee531ece62b895459953591feb9e6082a3fe671fd8f603" }, { "id": "module:packages/adapters/src/createAdapter.ts", @@ -15182,7 +15182,7 @@ "ts", "src" ], - "contentHash": "5f923042374235e3aafbbef2974270d4faf76785b19286614540d0d09cd14f57" + "contentHash": "a334373f594863a9392bb5d463db6c51e06c1ce78f3b57ce18aaae7ee3123cd7" }, { "id": "module:packages/adapters/src/openai-stream.ts", @@ -15706,6 +15706,19 @@ ], "contentHash": "0ebc486d8b6527079a6611a145036e9580c1fa402f1efc127e5c022ef5ca368b" }, + { + "id": "module:packages/adapters/tests/content-parts.test.ts", + "type": "module", + "title": "content-parts.test.ts", + "path": "packages/adapters/tests/content-parts.test.ts", + "tags": [ + "module", + "ts", + "test", + "tests" + ], + "contentHash": "63bcc1875bcc679bbd824d2bbc6d84873d2e54ea37fc0dd41addf1f715b73e68" + }, { "id": "module:packages/adapters/tests/contract.test.ts", "type": "module", @@ -15980,7 +15993,7 @@ "test", "tests" ], - "contentHash": "c0668ae950aa93876016f11e184826392d92f19ea175951905e38df847072931" + "contentHash": "09f1826fc75dfc8be7571e5d22ba541bb9c529b35de593d489f8801a58059cdb" }, { "id": "module:packages/adapters/tests/net-migration-http.test.ts", @@ -35601,7 +35614,7 @@ "test", "scripts" ], - "contentHash": "887101ed2c2622cb50bbaece632d06aa2e60f74dd8d6ede5f3caec0cec355291" + "contentHash": "ee5a0098d2323e8078ee64fad92efabd47bef684621a2342f1aa0ad36642e6e6" }, { "id": "module:scripts/doc-bridge-benchmark.mjs", @@ -38064,8 +38077,8 @@ "changes": {} }, "inputs": { - "hash": "24c4e2884cd8439780caba12dc5a0f8be9166b1ab05def2195acc100267d3b44", - "fileCount": 2530, + "hash": "2b7946f3b5d0f45961ee630dfddc8518f6c0075849e545f52b779bfe8adfaad8", + "fileCount": 2531, "projectionVersion": 2 }, "retrieval": { @@ -38087,9 +38100,9 @@ "projection": { "type": "retrieval-index", "schemaVersion": 1, - "contentHash": "87142bf5f2b2be22873cdaec6599fb7187fc421811a7621c79c83d991e3aaf30", + "contentHash": "e2bd45ca235a9910956ecbb271e31c62785fbcc0adf0d430f32afaa014738f93", "contentHashAlgo": "sha256-normalized-v1", - "snapshotHash": "1b564d32ff9f6e03767c8a89f5f119b85152fedb7509c05e89a3c280dcd6e0dc", + "snapshotHash": "21423df251b79707c4f907642899ef34a623d557530a2ea30878873c3ef68047", "overlayHash": "f99666ff9119084dd25c2974ae64eb6935ec2aa785ff5ad478fb9d541f7a5e94", "configurationHash": "9662cc07ea4ab203ff2ddf457d2db48b5375a7ab4a1f8fbc79dfebcaa8f9a00c", "lexiconVersion": 1, @@ -38109,7 +38122,7 @@ }, "lexical": { "version": 1, - "documentCount": 2485, + "documentCount": 2486, "fieldNames": [ "aliases", "body", @@ -38120,13 +38133,13 @@ "title" ], "averageFieldLength": { - "aliases": 3.014486921529175, - "body": 61.03782696177063, - "headings": 4.0004024144869215, - "path": 7.613279678068411, - "summary": 4.53682092555332, - "symbols": 7.45271629778672, - "title": 3.348893360160966 + "aliases": 3.0148833467417537, + "body": 61.01609010458568, + "headings": 4.00402252614642, + "path": 7.613435237329043, + "summary": 4.539420756234915, + "symbols": 7.449718423169751, + "title": 3.349557522123894 } }, "entries": [ @@ -38545,7 +38558,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/reference/examples/discord-bot.mdx" @@ -38584,7 +38597,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/reference/examples/dspy.mdx" @@ -38662,7 +38675,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/reference/examples/embedded.mdx" @@ -38983,7 +38996,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/reference/examples/slack-bot.mdx" @@ -39022,7 +39035,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/reference/examples/teams-bot.mdx" @@ -39378,7 +39391,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/data/providers/embedders.mdx" @@ -39493,7 +39506,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/production/cli/index.mdx" @@ -39656,7 +39669,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/production/security/index.mdx" @@ -39942,7 +39955,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/production/evals/replay.mdx" @@ -40160,7 +40173,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/data/memory/index.mdx" @@ -40199,7 +40212,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/data/rag/loaders.mdx" @@ -40238,7 +40251,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/data/rag/rerank.mdx" @@ -40554,7 +40567,7 @@ "aliases": "area" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [ "document:apps/docs-next/content/docs/production/observability/devtools.mdx" @@ -46257,7 +46270,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -50373,11 +50386,21 @@ "id": "module:packages/adapters/src/cli/prompt.ts", "confidence": "observed" }, + { + "kind": "mentions-symbol", + "id": "module:packages/adapters/src/cloudflare.ts", + "confidence": "observed" + }, { "kind": "mentions-symbol", "id": "module:packages/adapters/src/cohere.ts", "confidence": "observed" }, + { + "kind": "mentions-symbol", + "id": "module:packages/adapters/src/content-parts.ts", + "confidence": "observed" + }, { "kind": "mentions-symbol", "id": "module:packages/adapters/src/createAdapter.ts", @@ -50580,7 +50603,7 @@ } ] }, - "contentHash": "659404a68b66fe2cd9fa626d7b9aa7c9a586059a37f6138f4a43320a49254a3b", + "contentHash": "c1232c16c0a9ec5568474f0c2c2af385d76f4efbde73241bd7ec17422513631b", "provenance": "observed", "confidence": "observed" }, @@ -62560,7 +62583,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -66540,7 +66563,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -68244,7 +68267,7 @@ "aliases": "document unclassified" }, "graph": { - "pagerank": 0.007783, + "pagerank": 0.007784, "inboundLinks": 8, "coveredBy": [], "mentionedBy": [ @@ -68396,7 +68419,7 @@ "aliases": "document project" }, "graph": { - "pagerank": 0.030098, + "pagerank": 0.030099, "inboundLinks": 64, "coveredBy": [], "mentionedBy": [ @@ -68890,7 +68913,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.02351, + "pagerank": 0.023499, "inboundLinks": 11, "coveredBy": [], "mentionedBy": [], @@ -69000,7 +69023,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.01322, + "pagerank": 0.013214, "inboundLinks": 10, "coveredBy": [], "mentionedBy": [], @@ -69115,7 +69138,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.009042, + "pagerank": 0.009038, "inboundLinks": 8, "coveredBy": [], "mentionedBy": [], @@ -69225,7 +69248,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.006739, + "pagerank": 0.006737, "inboundLinks": 7, "coveredBy": [], "mentionedBy": [], @@ -69350,7 +69373,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.006176, + "pagerank": 0.006173, "inboundLinks": 7, "coveredBy": [], "mentionedBy": [], @@ -69465,7 +69488,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.006051, + "pagerank": 0.006048, "inboundLinks": 5, "coveredBy": [], "mentionedBy": [], @@ -69605,7 +69628,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002197, + "pagerank": 0.002195, "inboundLinks": 2, "coveredBy": [], "mentionedBy": [], @@ -69660,7 +69683,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002617, + "pagerank": 0.002615, "inboundLinks": 4, "coveredBy": [], "mentionedBy": [ @@ -69773,7 +69796,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.013291, + "pagerank": 0.013286, "inboundLinks": 5, "coveredBy": [], "mentionedBy": [], @@ -69858,7 +69881,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -69938,7 +69961,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -70008,7 +70031,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.003055, + "pagerank": 0.003053, "inboundLinks": 3, "coveredBy": [], "mentionedBy": [], @@ -70103,7 +70126,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -70173,7 +70196,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -70228,7 +70251,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -70273,7 +70296,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -70318,7 +70341,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.004924, + "pagerank": 0.004921, "inboundLinks": 5, "coveredBy": [], "mentionedBy": [], @@ -70398,7 +70421,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.003972, + "pagerank": 0.00397, "inboundLinks": 3, "coveredBy": [], "mentionedBy": [], @@ -70473,7 +70496,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -70512,7 +70535,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -70557,7 +70580,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.037656, + "pagerank": 0.037651, "inboundLinks": 13, "coveredBy": [], "mentionedBy": [], @@ -70702,7 +70725,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.019081, + "pagerank": 0.019079, "inboundLinks": 10, "coveredBy": [], "mentionedBy": [], @@ -70802,7 +70825,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.004164, + "pagerank": 0.004162, "inboundLinks": 5, "coveredBy": [], "mentionedBy": [], @@ -70917,7 +70940,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.003455, + "pagerank": 0.003453, "inboundLinks": 4, "coveredBy": [], "mentionedBy": [], @@ -70987,7 +71010,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.00314, + "pagerank": 0.003138, "inboundLinks": 3, "coveredBy": [], "mentionedBy": [], @@ -71062,7 +71085,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -71107,7 +71130,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002863, + "pagerank": 0.002861, "inboundLinks": 2, "coveredBy": [], "mentionedBy": [], @@ -71187,7 +71210,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -71226,7 +71249,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -71276,7 +71299,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -71336,7 +71359,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002585, + "pagerank": 0.002583, "inboundLinks": 3, "coveredBy": [], "mentionedBy": [ @@ -71433,7 +71456,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002585, + "pagerank": 0.002583, "inboundLinks": 3, "coveredBy": [], "mentionedBy": [ @@ -71555,7 +71578,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -71600,7 +71623,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -71650,7 +71673,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002031, + "pagerank": 0.002029, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -71705,11 +71728,16 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002789, - "inboundLinks": 1, + "pagerank": 0.002861, + "inboundLinks": 2, "coveredBy": [], "mentionedBy": [], "inbound": [ + { + "kind": "links-to", + "id": "document:docs/architecture/adrs/README.md", + "confidence": "observed" + }, { "kind": "links-to", "id": "document:docs/evidence/adapters-multimodal-transport.md", @@ -71746,7 +71774,7 @@ "path": "docs/architecture/adrs/README.md", "symbols": "", "summary": "This directory contains the formal, versioned contracts and architectural decisions for AgentsKit.", - "body": "Architecture Decision Records (ADRs) This directory contains the formal, versioned contracts and architectural decisions for AgentsKit. What is an ADR? An ADR captures a single, significant decision — a contract, a framework choice, a deliberate trade-off — along with the context that produced it and the consequences we accept. Once accepted, an ADR is immutable: changes happen by writing a new ADR that supersedes the old one. ADRs are stricter than RFCs. An RFC is a proposal open for discussion; an ADR is the conclusion we have committed to ship. When to write an ADR - A new cross-package contract (Adapter, Tool, Memory, Retriever, Skill, Runtime) - A breaking change to an existing contract - A framework or tooling choice with long-term consequences (e.g., Fumadocs over Docusaurus) - A deliberate trade-off that future contributors would otherwise re-litigate Do NOT write an ADR for: routine features, bug fixes, internal refactors, or anything already covered by the Manifesto. Format Index ADR Title Status --- --- --- Adapter contract (v1) Accepted Tool contract (v1) Accepted Memory contract (v1) Accepted Retriever contract (v1) Accepted Skill contract (v1) Accepted Runtime contract (v1) Accepted Documentation platform: Fumadocs Accepted Runtime argument validation Accepted Composition & dependency rules Accepted Network egress policy (safeFetch) Accepted Inbound request validation (chat triggers) Accepted Vendor adapter scope & granularity Accepted Runtime validation for serialized message records Accepted Trusted application tool-call proposal Accepted Tool authorization before proposal and execution Accepted Cancellable ChatMemory operations Accepted Serializable interaction state Accepted Versioned ecosystem manifest and evidence-backed claims Proposed Public package consolidation Accepted Strict ecosystem documentation quality profile Proposed Evidence-backed package graduation Accepted Public API snapshots and compatibility matrix Accepted Integration execution safety boundaries Accepted Statechart beta safety boundaries Accepted MCP bridge beta boundaries Accepted Shared ecosystem web shell Proposed Shared CLI adapter execution boundary Accepted Registry adopts the ecosystem shell Proposed Ecosystem shell v1 Accepted Documentation pruning and API reference route consolidation Accepted One package owns OS and runtime portability Proposed One package owns HTTP plumbing Proposed Canonical JSON and SHA-256 helpers Accepted Cryptographic IDs for generated identifiers Accepted Preserve eval replay fingerprint compatibility Proposed The 6 core contracts are formalized. Future ADRs will cover specific decisions (semver policy, licensing strategy, etc.) rather than additional foundational contracts.", + "body": "Architecture Decision Records (ADRs) This directory contains the formal, versioned contracts and architectural decisions for AgentsKit. What is an ADR? An ADR captures a single, significant decision — a contract, a framework choice, a deliberate trade-off — along with the context that produced it and the consequences we accept. Once accepted, an ADR is immutable: changes happen by writing a new ADR that supersedes the old one. ADRs are stricter than RFCs. An RFC is a proposal open for discussion; an ADR is the conclusion we have committed to ship. When to write an ADR - A new cross-package contract (Adapter, Tool, Memory, Retriever, Skill, Runtime) - A breaking change to an existing contract - A framework or tooling choice with long-term consequences (e.g., Fumadocs over Docusaurus) - A deliberate trade-off that future contributors would otherwise re-litigate Do NOT write an ADR for: routine features, bug fixes, internal refactors, or anything already covered by the Manifesto. Format Index ADR Title Status --- --- --- Adapter contract (v1) Accepted Tool contract (v1) Accepted Memory contract (v1) Accepted Retriever contract (v1) Accepted Skill contract (v1) Accepted Runtime contract (v1) Accepted Documentation platform: Fumadocs Accepted Runtime argument validation Accepted Composition & dependency rules Accepted Network egress policy (safeFetch) Accepted Inbound request validation (chat triggers) Accepted Vendor adapter scope & granularity Accepted Runtime validation for serialized message records Accepted Trusted application tool-call proposal Accepted Tool authorization before proposal and execution Accepted Cancellable ChatMemory operations Accepted Serializable interaction state Accepted Versioned ecosystem manifest and evidence-backed claims Proposed Public package consolidation Accepted Strict ecosystem documentation quality profile Proposed Evidence-backed package graduation Accepted Public API snapshots and compatibility matrix Accepted Integration execution safety boundaries Accepted Statechart beta safety boundaries Accepted MCP bridge beta boundaries Accepted Shared ecosystem web shell Proposed Shared CLI adapter execution boundary Accepted Registry adopts the ecosystem shell Proposed Ecosystem shell v1 Accepted Documentation pruning and API reference route consolidation Accepted One package owns OS and runtime portability Proposed One package owns HTTP plumbing Proposed Canonical JSON and SHA-256 helpers Accepted Cryptographic IDs for generated identifiers Accepted Preserve eval replay fingerprint compatibility Proposed Serialize attachments at the provider boundary Proposed The 6 core contracts are formalized. Future ADRs will cover specific decisions (semver policy, licensing strategy, etc.) rather than additional foundational contracts.", "aliases": "document human" }, "graph": { @@ -72006,10 +72034,15 @@ "kind": "links-to", "id": "document:docs/architecture/adrs/0040-eval-replay-fingerprint-compatibility.md", "confidence": "observed" + }, + { + "kind": "links-to", + "id": "document:docs/architecture/adrs/0041-adapter-content-serialization.md", + "confidence": "observed" } ] }, - "contentHash": "99830638ce4623c4a8e014db13f979133c6ad5f378b552ad3a1746f29bd31cfb", + "contentHash": "d114333cd957740925288fcdd81bba2af5684be61ce9aa48a651554c8104d306", "provenance": "observed", "confidence": "observed" }, @@ -73293,7 +73326,7 @@ "kind": "document", "path": "docs/evidence/adapters-multimodal-transport.md", "title": "Adapter multimodal transport — local implementation report", - "summary": "Status: BLOCKED at repository-wide validation; implementation available for maintainer review. No release, publication, deployment, push or PR was performed.", + "summary": "Status: AWAITING_HUMAN_APPROVAL: all CH-A2 checks passed; coordinator evidence review remains required. Earlier BLOCKED results below are historical evidence. No release, publication, deployment, push or PR was performed.", "audience": "human", "aliases": [], "tags": [ @@ -73302,11 +73335,11 @@ ], "fields": { "title": "Adapter multimodal transport — local implementation report", - "headings": "Adapter multimodal transport — local implementation report Contract and authorization Source and implementation Criterion reconciliation Validated Partially validated Blocked Not analyzed Not applicable Final gate and next action", + "headings": "Adapter multimodal transport — local implementation report Contract and authorization Source and implementation Criterion reconciliation Validated Partially validated Blocked Not analyzed Not applicable Final gate and next action CH-A2 — ratchet regression and branch gate reconciliation Final current-source results", "path": "docs/evidence/adapters-multimodal-transport.md", "symbols": "", - "summary": "Status: BLOCKED at repository-wide validation; implementation available for maintainer review. No release, publication, deployment, push or PR was performed.", - "body": "Adapter multimodal transport — local implementation report Status: BLOCKED at repository-wide validation; implementation available for maintainer review. No release, publication, deployment, push or PR was performed. Contract and authorization Intent: implement configurable OpenAI-compatible transport and serialize image/file inputs in the named native adapter families, with synthetic HTTP regression tests, local changeset and commits. The coordinator confirmed RF-01, RF-02, RF-04, RF-05 and RF-06 as the worker criteria; RF-03 belongs to a separate starter and is outside this contract. No core contract changes, new dependencies or real provider credentials are authorized. Scope: packages/adapters , its catalog dispatch, corresponding provider/recipe documentation, an ADR, local changeset and this evidence. Other repositories, starter/protocol/storage/cost work, live accounts and UI implementation are outside scope. Intermediate implementation and local verification were authorized together. The dispatch task specification is the approved contract; no separate parent contract hash was supplied and no subagents were dispatched. Validation budget: local and cached dependencies only; no CI or real inference calls; three repository-wide test attempts, one repository-wide build attempt, scoped checks for changed revisions, and documented doc-bridge operations. Redundant/stale task-owned jobs were stopped after source changes and repeated global failures, rather than weakening their gates. Temporary logs are reduced to allowlisted durable metadata below and removed at settlement; ambiguous/pre-existing files are retained. Source and implementation The source revision and adapter tree are recorded in . Subsequent report-only commits do not change that adapter tree. Local implementation commits: - 434ba87a : attachment serializers, configurable transport, Cloudflare presets, OpenRouter alias, catalog variables, regression suite and changeset. - 93a02265 : media validation and documented source limits. - e0cab7bc : explicit case-insensitive gateway authentication overrides. - f78b492b : retain required credential types for existing providers; add static API compatibility checks. The existing OpenAI transport supplies path , headers and injected fetch . The new openaiCompatible and Cloudflare presets allow omitted Bearer authentication. Existing OpenAI and provider configuration types retain required apiKey ; existing default /v1 routing and text-only requests without parts remain compatible. Shared history serializers send OpenAI image url / file , Anthropic image / document , Gemini/Vertex inlineData / fileData , and Ollama images . Unsupported sources/modalities fail with CapabilityUnsupportedError.code === 'CAPABILITY UNSUPPORTED' before I/O. Ollama accepts inline images, including image file parts, and rejects PDFs and remote URLs. Catalog placeholders are resolved only from explicitly supplied env values. No Cloudflare runtime binding is imported. The is generated by a Vitest file snapshot from the HTTP test cases and checked against the recipe. Refreshing it uses the existing suite's -u option. records the implementation decision for maintainer review; it does not revise a core contract. Criterion reconciliation Criterion Status Current evidence and limit --- --- --- RF-01: configurable endpoint/path/headers/fetch, no implicit Bearer, streaming/usage validated locally HTTP capture asserts full configured path, custom headers, injected fetch invocation, absent Authorization, text stream and token usage; explicit caller authentication overrides also pass RF-02: OpenRouter, AI Gateway, Workers AI presets and catalog account URL validated locally Captured requests assert all three official URLs and headers; missing catalog variables produce MISSING URL VARIABLE; library source contains no cloudflare: import RF-03: starter default/fallback model and ledger not applicable Separate starter contract, explicitly excluded by coordinator RF-", + "summary": "Status: AWAITING_HUMAN_APPROVAL: all CH-A2 checks passed; coordinator evidence review remains required. Earlier BLOCKED results below are historical evidence. No release, publication, deployment, push or PR was performed.", + "body": "Adapter multimodal transport — local implementation report Status: AWAITING HUMAN APPROVAL : all CH-A2 checks passed; coordinator evidence review remains required. Earlier BLOCKED results below are historical evidence. No release, publication, deployment, push or PR was performed. Contract and authorization Intent: implement configurable OpenAI-compatible transport and serialize image/file inputs in the named native adapter families, with synthetic HTTP regression tests, local changeset and commits. The coordinator confirmed RF-01, RF-02, RF-04, RF-05 and RF-06 as the worker criteria; RF-03 belongs to a separate starter and is outside this contract. No core contract changes, new dependencies or real provider credentials are authorized. Scope: packages/adapters , its catalog dispatch, corresponding provider/recipe documentation, an ADR, local changeset and this evidence. Other repositories, starter/protocol/storage/cost work, live accounts and UI implementation are outside scope. Intermediate implementation and local verification were authorized together. The dispatch task specification is the approved contract; no separate parent contract hash was supplied and no subagents were dispatched. Validation budget: local and cached dependencies only; no CI or real inference calls; three repository-wide test attempts, one repository-wide build attempt, scoped checks for changed revisions, and documented doc-bridge operations. Redundant/stale task-owned jobs were stopped after source changes and repeated global failures, rather than weakening their gates. Temporary logs are reduced to allowlisted durable metadata below and removed at settlement; ambiguous/pre-existing files are retained. Source and implementation The source revision and adapter tree are recorded in . Subsequent report-only commits do not change that adapter tree. Local implementation commits: - 434ba87a : attachment serializers, configurable transport, Cloudflare presets, OpenRouter alias, catalog variables, regression suite and changeset. - 93a02265 : media validation and documented source limits. - e0cab7bc : explicit case-insensitive gateway authentication overrides. - f78b492b : retain required credential types for existing providers; add static API compatibility checks. The existing OpenAI transport supplies path , headers and injected fetch . The new openaiCompatible and Cloudflare presets allow omitted Bearer authentication. Existing OpenAI and provider configuration types retain required apiKey ; existing default /v1 routing and text-only requests without parts remain compatible. Shared history serializers send OpenAI image url / file , Anthropic image / document , Gemini/Vertex inlineData / fileData , and Ollama images . Unsupported sources/modalities fail with CapabilityUnsupportedError.code === 'CAPABILITY UNSUPPORTED' before I/O. Ollama accepts inline images, including image file parts, and rejects PDFs and remote URLs. Catalog placeholders are resolved only from explicitly supplied env values. No Cloudflare runtime binding is imported. The is generated by a Vitest file snapshot from the HTTP test cases and checked against the recipe. Refreshing it uses the existing suite's -u option. records the implementation decision for maintainer review; it does not revise a core contract. Criterion reconciliation Criterion Status Current evidence and limit --- --- --- RF-01: configurable endpoint/path/headers/fetch, no implicit Bearer, streaming/usage validated locally HTTP capture asserts full configured path, custom headers, injected fetch invocation, absent Authorization, text stream and token usage; explicit caller authentication overrides also pass RF-02: OpenRouter, AI Gateway, Workers AI presets and catalog account URL validated locally Captured requests assert all three official URLs and headers; missing catalog variables produce MISSING URL VARIABLE; library source contains no cloudflare: import RF-03: starter default/fallback model and ledger not applicable ", "aliases": "document human" }, "graph": { @@ -73340,10 +73373,15 @@ "kind": "mentions-symbol", "id": "module:packages/adapters/src/openai-compatible.ts", "confidence": "observed" + }, + { + "kind": "mentions-symbol", + "id": "module:packages/net/src/sse.ts", + "confidence": "observed" } ] }, - "contentHash": "60375d0c705c750d4f69a9a4ce5aaa5711c5de0f2b6f2e39e64a7e2fcb1ec490", + "contentHash": "4821916edffb5279caafdb46f646423762ea03e5b5a00faf6d6ae246247f6a38", "provenance": "observed", "confidence": "observed" }, @@ -73472,7 +73510,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.002511, + "pagerank": 0.002512, "inboundLinks": 1, "coveredBy": [], "mentionedBy": [], @@ -74415,7 +74453,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 2, "coveredBy": [], "mentionedBy": [ @@ -74741,7 +74779,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.07763, + "pagerank": 0.077631, "inboundLinks": 64, "coveredBy": [], "mentionedBy": [ @@ -75295,7 +75333,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.020953, + "pagerank": 0.020952, "inboundLinks": 4, "coveredBy": [], "mentionedBy": [ @@ -75997,7 +76035,7 @@ "aliases": "document human" }, "graph": { - "pagerank": 0.035841, + "pagerank": 0.03584, "inboundLinks": 13, "coveredBy": [], "mentionedBy": [ @@ -76409,7 +76447,7 @@ "aliases": "document unclassified" }, "graph": { - "pagerank": 0.019597, + "pagerank": 0.019598, "inboundLinks": 10, "coveredBy": [], "mentionedBy": [ @@ -77170,7 +77208,7 @@ "aliases": "document unclassified" }, "graph": { - "pagerank": 0.002511, + "pagerank": 0.002512, "inboundLinks": 2, "coveredBy": [], "mentionedBy": [ @@ -104410,9 +104448,10 @@ }, "graph": { "pagerank": 0, - "inboundLinks": 1, + "inboundLinks": 2, "coveredBy": [], "mentionedBy": [ + "document:apps/docs-next/content/docs/for-agents/adapters.mdx", "document:packages/adapters/README.md" ], "packageId": "package:@agentskit/adapters", @@ -104422,6 +104461,11 @@ "id": "module:packages/adapters/tests/multimodal-http.test.ts", "confidence": "observed" }, + { + "kind": "mentions-symbol", + "id": "document:apps/docs-next/content/docs/for-agents/adapters.mdx", + "confidence": "observed" + }, { "kind": "mentions-symbol", "id": "document:packages/adapters/README.md", @@ -104563,9 +104607,10 @@ }, "graph": { "pagerank": 0, - "inboundLinks": 2, + "inboundLinks": 3, "coveredBy": [], "mentionedBy": [ + "document:apps/docs-next/content/docs/for-agents/adapters.mdx", "document:apps/docs-next/content/docs/reference/recipes/multi-modal.mdx", "document:packages/adapters/README.md" ], @@ -104586,6 +104631,16 @@ "id": "module:packages/adapters/src/utils.ts", "confidence": "observed" }, + { + "kind": "imports", + "id": "module:packages/adapters/tests/content-parts.test.ts", + "confidence": "observed" + }, + { + "kind": "mentions-symbol", + "id": "document:apps/docs-next/content/docs/for-agents/adapters.mdx", + "confidence": "observed" + }, { "kind": "mentions-symbol", "id": "document:apps/docs-next/content/docs/reference/recipes/multi-modal.mdx", @@ -104604,7 +104659,7 @@ ], "outbound": [] }, - "contentHash": "188da6a73f154b21bf50a482b473529789fb115b965d0e0f8dd5caf82e46d680", + "contentHash": "75ebffb6d25332d5acee531ece62b895459953591feb9e6082a3fe671fd8f603", "provenance": "observed", "confidence": "observed" }, @@ -108040,7 +108095,7 @@ } ] }, - "contentHash": "5f923042374235e3aafbbef2974270d4faf76785b19286614540d0d09cd14f57", + "contentHash": "a334373f594863a9392bb5d463db6c51e06c1ce78f3b57ce18aaae7ee3123cd7", "provenance": "observed", "confidence": "observed" }, @@ -110558,6 +110613,46 @@ "provenance": "observed", "confidence": "observed" }, + { + "id": "module:packages/adapters/tests/content-parts.test.ts", + "kind": "module", + "path": "packages/adapters/tests/content-parts.test.ts", + "title": "content-parts.test.ts", + "aliases": [], + "tags": [ + "module", + "ts", + "test", + "tests" + ], + "fields": { + "title": "content-parts.test.ts", + "headings": "", + "path": "packages/adapters/tests/content-parts.test.ts", + "symbols": "", + "summary": "", + "body": "", + "aliases": "module ts test tests" + }, + "graph": { + "pagerank": 0, + "inboundLinks": 0, + "coveredBy": [], + "mentionedBy": [], + "packageId": "package:@agentskit/adapters", + "inbound": [], + "outbound": [ + { + "kind": "imports", + "id": "module:packages/adapters/src/content-parts.ts", + "confidence": "observed" + } + ] + }, + "contentHash": "63bcc1875bcc679bbd824d2bbc6d84873d2e54ea37fc0dd41addf1f715b73e68", + "provenance": "observed", + "confidence": "observed" + }, { "id": "module:packages/adapters/tests/contract.test.ts", "kind": "module", @@ -111519,7 +111614,7 @@ } ] }, - "contentHash": "c0668ae950aa93876016f11e184826392d92f19ea175951905e38df847072931", + "contentHash": "09f1826fc75dfc8be7571e5d22ba541bb9c529b35de593d489f8801a58059cdb", "provenance": "observed", "confidence": "observed" }, @@ -155507,10 +155602,11 @@ }, "graph": { "pagerank": 0, - "inboundLinks": 5, + "inboundLinks": 6, "coveredBy": [], "mentionedBy": [ "document:docs/architecture/adrs/0037-net-package.md", + "document:docs/evidence/adapters-multimodal-transport.md", "document:packages/adapters/CONVENTIONS.md", "document:packages/adapters/README.md", "document:packages/net/CONVENTIONS.md", @@ -155528,6 +155624,11 @@ "id": "document:docs/architecture/adrs/0037-net-package.md", "confidence": "observed" }, + { + "kind": "mentions-symbol", + "id": "document:docs/evidence/adapters-multimodal-transport.md", + "confidence": "observed" + }, { "kind": "mentions-symbol", "id": "document:packages/adapters/CONVENTIONS.md", @@ -185863,7 +185964,7 @@ } ] }, - "contentHash": "887101ed2c2622cb50bbaece632d06aa2e60f74dd8d6ede5f3caec0cec355291", + "contentHash": "ee5a0098d2323e8078ee64fad92efabd47bef684621a2342f1aa0ad36642e6e6", "provenance": "observed", "confidence": "observed" }, @@ -191729,7 +191830,7 @@ "aliases": "eval @agentskit/eval package ownership" }, "graph": { - "pagerank": 0.007779, + "pagerank": 0.00778, "inboundLinks": 45, "coveredBy": [ "document:apps/docs-next/content/docs/for-agents/eval-braintrust.mdx", @@ -195584,7 +195685,7 @@ "aliases": "skills @agentskit/skills package ownership" }, "graph": { - "pagerank": 0.00362, + "pagerank": 0.003621, "inboundLinks": 30, "coveredBy": [ "document:apps/docs-next/content/docs/for-agents/skills.mdx", diff --git a/docs/evidence/adapters-multimodal-transport.md b/docs/evidence/adapters-multimodal-transport.md index e6018d6ae..dbbc2247e 100644 --- a/docs/evidence/adapters-multimodal-transport.md +++ b/docs/evidence/adapters-multimodal-transport.md @@ -1,6 +1,6 @@ # Adapter multimodal transport — local implementation report -Status: **BLOCKED** at repository-wide validation; implementation available for maintainer review. No release, publication, deployment, push or PR was performed. +Status: **AWAITING_HUMAN_APPROVAL**: all CH-A2 checks passed; coordinator evidence review remains required. Earlier BLOCKED results below are historical evidence. No release, publication, deployment, push or PR was performed. ## Contract and authorization @@ -87,3 +87,43 @@ Current package checks passed on source `f78b492b0345684c920c1ce2245248cccb21cc4 Cleanup: prebuild-generated ecosystem/knowledge/API-route changes outside the implementation diff were restored to their initially clean state; the task-created generated knowledge blob was removed. Stale task-owned build/lint/doc-bridge processes were stopped. Compiler outputs and installed dependencies remain ignored and available locally; no environment data or credentials were created. Raw task-owned temporary logs are removed after extracting allowlisted metadata. The final commit is report-only; the adapter tree hash remains the one recorded in the evidence metadata. The final tracked diff contains only adapters, matching docs, proposed ADR, generated modality table, local changeset and the evidence report. The coordinator's next action is to review these artifacts and resolve the documented global/doc-bridge gates; this dispatch reports failure because Stage 0 is not green. + +## CH-A2 — ratchet regression and branch gate reconciliation + +Intent: fix the CH-A regression reported by GATES, preserving data-URI validation and the existing guardrail rules/allowlists. The coordinator approved native URL protocol classification because `net-sse-data-prefix` targets SSE, while this serializer handles media data URIs; `parseSSE` is not applicable. `new URL` with `try/catch` avoids depending on `URL.canParse` availability in workerd. MIME matching, base64 syntax and length checks remain strict. + +The coordinator subsequently authorized fixing every quality-gate failure introduced by CH-A and comparing failures with clean main `0e1c1aa9`. Scope expanded to the direct serializer regression test, synthetic HTTP redirects, provider-recipe assertion, for-agents documentation, ADR index, public API snapshot and generated claims/README hashes. No gate rule, suppression, baseline allowance, dependency, core contract or UI implementation was changed. The public API snapshot records nine already-implemented exports; JSDoc coverage remains shrink-only and README review dates are preserved. + +Acceptance and evidence map: + +| ID | Criterion | Evidence method | +| --- | --- | --- | +| A2-01 | Ratchet passes without weakened rules or allowlists | Real `node scripts/check-net-rules.mjs`; net `tests/rules.test.ts` (14 tests); diff review of rules and baselines | +| A2-02 | Media serialization and strict rejection remain correct | Adapters build, full package tests, source/test typechecks; real loopback HTTP payload checks plus direct URI regression | +| A2-03 | Repository suite passes, or remaining failures are reproduced on main | `VITEST_MAX_WORKERS=1 pnpm test --env-mode=loose --force --continue=always` (Turbo concurrency 2), with adapters built first; matching main acceptance flow for each remaining failure | +| A2-04 | CH-A quality regressions are fixed and remaining failures classified | Full `check:quality-gates` on branch and a task-owned clean main worktree; no relaxed gates | +| A2-05 | Locked doc-bridge tool accepts a current index | `pnpm docs:bridge:index` only after observed staleness, then `pnpm docs:bridge:gate` | +| A2-06 | Local commits, truthful evidence and cleanup | Commit/diff/status review, this report, removal of task-owned main worktree and temporary logs; coordinator evidence review remains required | + +Budget: local cached dependencies only, no downloads/CI/provider inference; sequential build/test/gate commands within this worktree. A temporary main worktree installed the frozen lockfile offline with zero downloads. Other agents' processes and worktrees are untouched. The first overlapping global attempt failed on missing adapters declarations and is invalid due to competing builds; the next attempt was interrupted after discovering Turbo's strict environment could omit `VITEST_MAX_WORKERS`, and its wrapper exit code is not passing evidence. The final run explicitly uses loose environment forwarding and bypasses cache for whole-repository scanners. + +Implementation commits: `84bf9e90` (native URI classifier and direct regression), `46a0fa0e` (HTTP fixture redirects and supported OpenAI fetch assertion), `de0a94da` (documented exports, ADR link and generated evidence). The current implementation source is `de0a94da3bbf7f07b0405a87f881da6e8e587d5a`; later evidence/index-only changes do not change it. + +### Final current-source results + +Implementation source: `de0a94da3bbf7f07b0405a87f881da6e8e587d5a`; adapters tree: `71f24b88ef19ecf0d757c7f3d68377bf9c385539`. The commands below ran against that source, with the evidence note/index updated afterward. No runtime or test source changed after these results. + +| Criterion | Status | Current evidence | +| --- | --- | --- | +| A2-01 | validated | Ratchet CLI passed with 111 baselined findings; isolated net rules 14/14; global net package 8 files / 99 tests passed; no rule, allowance or suppression changed | +| A2-02 | validated locally | ESM/CJS/declarations build passed; source and test typechecks passed; adapters 54 files / 585 tests passed under one worker, including direct strict URI rejection and real loopback payload tests; global rerun also passed 585/585 | +| A2-03 | validated | `VITEST_MAX_WORKERS=1 pnpm test --env-mode=loose --force --continue=always`: 77/77 tasks, zero cache, 6m07s, exit 0; CLI 57 files / 526 tests, WebLLM build and docs-next production build passed | +| A2-04 | validated | `VITEST_MAX_WORKERS=1 pnpm check:quality-gates`: all 52 gates passed, exit 0; JSDoc 1957/1963 documented with the unchanged shrink-only baseline; all three recipe acceptance flows passed | +| A2-05 | validated | Locked `@agentskit/doc-bridge` 1.12.0 regenerated the observed stale index; gate passed freshness, 27 human-guide links and all seven required documentation rules; final evidence/index changes are followed by another gate before settlement | +| A2-06 | implemented; awaiting coordinator review | Three scoped implementation commits above, report and regenerated index; task-owned main worktree removed; generated build artifacts outside this follow-up restored; temporary run logs removed at settlement; final diff/status inspected | + +Baseline comparison: task-owned clean main `0e1c1aa92e69f29f41241e49753ecab8ae279119` installed the frozen lockfile offline with zero downloads, then ran the same quality-gate command. Main passed 50/52 gates, including JSDoc, test-reference parity, for-agents coverage, ADR index, claims, README, content-pipeline tests and cross-platform/net ratchets. Its two failures were `verified recipe factory` (stale doc-bridge index) and `ecosystem documentation quality contract` (live doctor certification failure). Both pass on the final branch; no pre-existing-failure exception is needed for the final result. + +**Validated:** A2-01 through A2-05 as scoped above. **Partially validated:** synthetic HTTP proves serialization and transport behavior, not live provider inference. **Not analyzed:** live accounts, media interpretation, quotas, latency and browser rendering. **Blocked:** none in CH-A2 verification; the earlier report's failed attempts remain historical. **Not applicable:** UI interaction/visual approval, database/storage, release, push, PR, CI and changes to core contracts. + +Cleanup and next action: the clean baseline worktree was removed after inspection; other agents' processes/worktrees were untouched. Task-owned generated API routes, deterministic knowledge/site blobs and statistics snapshots were restored to their starting tracked contents; generated claims snapshots remain because their documented freshness gate required them. Task-owned raw logs are deleted after reconciliation. The coordinator must review the current commits and this evidence before approving the parent delivery; this worker reports verified assigned work, not parent completion or enterprise readiness. From dd6c98e3d11dc4df15ed095dbfad5806cc5e8a51 Mon Sep 17 00:00:00 2001 From: EmersonBraun Date: Tue, 6 Oct 2026 21:57:24 -0300 Subject: [PATCH 11/13] fix(deps): pin patched production transitive dependencies --- pnpm-lock.yaml | 48 +++++++++++++++++++++++---------------------- pnpm-workspace.yaml | 4 +++- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab61ade52..9a5216a29 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,12 +5,14 @@ settings: excludeLinksFromLockfile: false overrides: + seroval: 1.6.8 + source-map-js: 1.2.2 serialize-javascript: '>=7.0.5 <8' axios: '>=1.20.0 <2' fast-xml-builder: '>=1.1.7 <2' next: '>=16.3.6 <17' postcss: '>=8.5.22 <9' - shell-quote: '>=1.9.0 <2' + shell-quote: 1.11.0 esbuild: '>=0.28.1 <1' form-data: '>=4.0.6 <5' dompurify: 3.4.13 @@ -8956,10 +8958,10 @@ packages: resolution: {integrity: sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==} engines: {node: '>=10'} peerDependencies: - seroval: ^1.0 + seroval: 1.6.8 - seroval@1.5.4: - resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} + seroval@1.6.8: + resolution: {integrity: sha512-HlSgSAkTk4EqHcje1ptJjfZi1YDv5KbhVJ/d3P7T/nAXua2VmDu+AKDX5VTdFfZf48nDkWB2TKYt0DrCSa+3wg==} engines: {node: '>=10'} serve-static@1.16.3: @@ -8993,8 +8995,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.10.0: - resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==} + shell-quote@1.11.0: + resolution: {integrity: sha512-JdxDPD0DBTyu08pq0kPC0xSNet/qsU07qT6IsX1AS8oO2ICNRY4ldNa8OAI6PuwAH8tG3lxEhbqmyp4Dw4036g==} engines: {node: '>= 0.4'} shiki@4.4.3: @@ -9061,8 +9063,8 @@ packages: peerDependencies: solid-js: ^1.3 - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} source-map-support@0.5.21: @@ -13418,7 +13420,7 @@ snapshots: jiti: 2.7.0 lightningcss: 1.32.0 magic-string: 0.30.21 - source-map-js: 1.2.1 + source-map-js: 1.2.2 tailwindcss: 4.3.3 '@tailwindcss/oxide-android-arm64@4.3.3': @@ -14041,7 +14043,7 @@ snapshots: '@vue/shared': 3.5.42 entities: 7.0.1 estree-walker: 2.0.2 - source-map-js: 1.2.1 + source-map-js: 1.2.2 '@vue/compiler-dom@3.5.42': dependencies: @@ -14058,7 +14060,7 @@ snapshots: estree-walker: 2.0.2 magic-string: 0.30.21 postcss: 8.5.28 - source-map-js: 1.2.1 + source-map-js: 1.2.2 '@vue/compiler-ssr@3.5.42': dependencies: @@ -14815,7 +14817,7 @@ snapshots: css-tree@3.2.1: dependencies: mdn-data: 2.27.1 - source-map-js: 1.2.1 + source-map-js: 1.2.2 css-what@6.2.2: {} @@ -16754,7 +16756,7 @@ snapshots: dependencies: '@babel/parser': 7.29.7 '@babel/types': 7.29.7 - source-map-js: 1.2.1 + source-map-js: 1.2.2 make-dir@4.0.0: dependencies: @@ -18306,7 +18308,7 @@ snapshots: dependencies: nanoid: 3.3.18 picocolors: 1.1.1 - source-map-js: 1.2.1 + source-map-js: 1.2.2 posthog-js@1.433.6(@types/react@19.2.17)(react@19.2.7): dependencies: @@ -18402,7 +18404,7 @@ snapshots: react-devtools-core@6.1.5: dependencies: - shell-quote: 1.10.0 + shell-quote: 1.11.0 ws: 7.5.13 transitivePeerDependencies: - bufferutil @@ -18901,7 +18903,7 @@ snapshots: dependencies: chokidar: 5.0.0 immutable: 5.1.9 - source-map-js: 1.2.1 + source-map-js: 1.2.2 optionalDependencies: '@parcel/watcher': 2.5.6 @@ -18989,11 +18991,11 @@ snapshots: dependencies: type-fest: 0.20.2 - seroval-plugins@1.5.4(seroval@1.5.4): + seroval-plugins@1.5.4(seroval@1.6.8): dependencies: - seroval: 1.5.4 + seroval: 1.6.8 - seroval@1.5.4: {} + seroval@1.6.8: {} serve-static@1.16.3: dependencies: @@ -19123,7 +19125,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.10.0: {} + shell-quote@1.11.0: {} shiki@4.4.3: dependencies: @@ -19196,8 +19198,8 @@ snapshots: solid-js@1.9.15: dependencies: csstype: 3.2.3 - seroval: 1.5.4 - seroval-plugins: 1.5.4(seroval@1.5.4) + seroval: 1.6.8 + seroval-plugins: 1.5.4(seroval@1.6.8) solid-refresh@0.6.3(solid-js@1.9.15): dependencies: @@ -19208,7 +19210,7 @@ snapshots: transitivePeerDependencies: - supports-color - source-map-js@1.2.1: {} + source-map-js@1.2.2: {} source-map-support@0.5.21: dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 07a7ce912..141fb1791 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -12,13 +12,15 @@ onlyBuiltDependencies: - esbuild - workerd overrides: + seroval: "1.6.8" + source-map-js: "1.2.2" serialize-javascript: ">=7.0.5 <8" # GHSA-3pq3-5fj3-cg6v, GHSA-542g-h47m-68v8, GHSA-r4gj-5m52-g5wh axios: ">=1.20.0 <2" fast-xml-builder: ">=1.1.7 <2" next: ">=16.3.6 <17" postcss: ">=8.5.22 <9" - shell-quote: ">=1.9.0 <2" + shell-quote: "1.11.0" esbuild: ">=0.28.1 <1" form-data: ">=4.0.6 <5" dompurify: "3.4.13" From 32e60a47245bc0d304e794439d23de05ea96c5e7 Mon Sep 17 00:00:00 2001 From: EmersonBraun Date: Wed, 7 Oct 2026 22:22:30 -0300 Subject: [PATCH 12/13] fix(adapters): preserve text fallback for multimodal history --- .changeset/quiet-adapters-images.md | 2 +- .doc-bridge/capabilities.json | 2 +- .doc-bridge/index.json | 48 +++++++++---------- .../content/docs/data/providers/openai.mdx | 2 +- .../content/docs/for-agents/adapters.mdx | 5 +- .../docs/reference/recipes/multi-modal.mdx | 5 +- packages/adapters/README.md | 7 ++- packages/adapters/src/content-parts.ts | 6 ++- packages/adapters/src/openai.ts | 4 +- packages/adapters/tests/capabilities.test.ts | 5 ++ .../adapters/tests/multimodal-http.test.ts | 36 ++++++++++++-- readme-standard-v1.json | 2 +- 12 files changed, 87 insertions(+), 37 deletions(-) diff --git a/.changeset/quiet-adapters-images.md b/.changeset/quiet-adapters-images.md index 295f7ca4e..c24969719 100644 --- a/.changeset/quiet-adapters-images.md +++ b/.changeset/quiet-adapters-images.md @@ -2,4 +2,4 @@ "@agentskit/adapters": minor --- -Serialize supported image/file parts in OpenAI-compatible, Anthropic, Gemini/Vertex and Ollama requests. Reject unsupported modalities and sources with CAPABILITY_UNSUPPORTED instead of silently dropping attachments. Add configurable path, headers and fetch, optional Bearer authentication for compatible endpoints, OpenAI-compatible and Cloudflare REST presets, an OpenRouter alias, and explicit catalog URL variables. Existing text-only and default endpoint behavior is preserved. +Serialize supported image/file parts in OpenAI-compatible, Anthropic, Gemini/Vertex and Ollama requests. Preserve text-only model behavior and older multimodal histories by falling back to message.content with a warning when multimodal capability is disabled; OpenAI assistant binary parts also use the text fallback. Unsupported modalities and sources still raise CAPABILITY_UNSUPPORTED when multimodal input is enabled. Explicit capabilities override the expanded model-name heuristic. Add configurable path, headers and fetch, optional Bearer authentication for compatible endpoints, OpenAI-compatible and Cloudflare REST presets, an OpenRouter alias, and explicit catalog URL variables. Existing text-only and default endpoint behavior is preserved. diff --git a/.doc-bridge/capabilities.json b/.doc-bridge/capabilities.json index 3ec3233bd..75c29785b 100644 --- a/.doc-bridge/capabilities.json +++ b/.doc-bridge/capabilities.json @@ -7,7 +7,7 @@ "name": "AgentsKit", "root": "." }, - "contentHash": "bc010b0e58b21cba0c72b82bcd0514448dfc91250dd5fa988c6b069669d0c895", + "contentHash": "7076e2a630c01c3e0361cd609ebaf04936f8bdf6bcfbed0681a4a66bb8325b4c", "artifacts": { "index": ".doc-bridge/index.json", "llmsTxt": ".doc-bridge/llms.txt" diff --git a/.doc-bridge/index.json b/.doc-bridge/index.json index 98310295d..f09122bc1 100644 --- a/.doc-bridge/index.json +++ b/.doc-bridge/index.json @@ -1,8 +1,8 @@ { "schemaVersion": 1, - "contentHash": "bc010b0e58b21cba0c72b82bcd0514448dfc91250dd5fa988c6b069669d0c895", + "contentHash": "7076e2a630c01c3e0361cd609ebaf04936f8bdf6bcfbed0681a4a66bb8325b4c", "contentHashAlgo": "sha256-normalized-v1", - "generatedAt": "2026-10-08T01:07:42.539Z", + "generatedAt": "2026-10-08T01:09:55.683Z", "project": { "name": "AgentsKit", "root": "." @@ -2308,7 +2308,7 @@ "document", "human" ], - "contentHash": "889bf47adcd4b58deb371ef42e54791b990954cde712b3c6a3939ec5cf379f14" + "contentHash": "84950026a2850c8197d102d4178b040ee44e8ef3186af200193a8258373711d8" }, { "id": "document:apps/docs-next/content/docs/data/providers/openrouter.mdx", @@ -4431,7 +4431,7 @@ "document", "human" ], - "contentHash": "0616db8b4ee20936940f6211c9b70d2f8883188dbfd9c53d5a572fff26adedf5" + "contentHash": "247a46146656041fa52a1aff8e9188abc035f7c5b91ce7795c0a07698f32865c" }, { "id": "document:apps/docs-next/content/docs/reference/recipes/open-specs.mdx", @@ -6902,7 +6902,7 @@ "document", "project" ], - "contentHash": "e07396cc5fe4db7b7aaa3f730045650fd977dba1563d9653614b71110c61699a" + "contentHash": "13505c354960686695ceb3ce5e8454670a821f9f5d74cd6f83cc1dd7a33d7d25" }, { "id": "document:packages/angular/CONVENTIONS.md", @@ -14555,7 +14555,7 @@ "ts", "src" ], - "contentHash": "75ebffb6d25332d5acee531ece62b895459953591feb9e6082a3fe671fd8f603" + "contentHash": "29ceb47f9fdc2f00244dfd606eb57aa30e8974243d744b707c500548c7f67bd7" }, { "id": "module:packages/adapters/src/createAdapter.ts", @@ -15237,7 +15237,7 @@ "ts", "src" ], - "contentHash": "d0b43ebc80e543c2644c303eaf2e994f49295eb03a9684d4334c79c48a70bf74" + "contentHash": "131ca615f9ae12c76a9850f04752d20bcf6a23109c6bcbbbcb334291c0f50c2b" }, { "id": "module:packages/adapters/src/openrouter.ts", @@ -15565,7 +15565,7 @@ "test", "tests" ], - "contentHash": "9e3804a4d7229c9e3bba9931675f8ec34995671fa12df068b624fde000f5f2e6" + "contentHash": "966aabd64ada7923c6bb1de3857e776f256bae73e3ab45e480414bda2b1ce39d" }, { "id": "module:packages/adapters/tests/carbon.test.ts", @@ -16017,7 +16017,7 @@ "test", "tests" ], - "contentHash": "09f1826fc75dfc8be7571e5d22ba541bb9c529b35de593d489f8801a58059cdb" + "contentHash": "490f09ef097a55b11e1100fed39c63943fa153a5942707f7f2acdfa2e3ce0f4e" }, { "id": "module:packages/adapters/tests/net-migration-http.test.ts", @@ -38150,7 +38150,7 @@ "changes": {} }, "inputs": { - "hash": "e17bd699f65b9c93220ac2985b15a92758210a77997c24746c709456294f0155", + "hash": "d9f3f5d67cce0f54684b5fd6b87e1ca81013216f9f62cfe6112450126be913f0", "fileCount": 2536, "projectionVersion": 2 }, @@ -38173,9 +38173,9 @@ "projection": { "type": "retrieval-index", "schemaVersion": 1, - "contentHash": "4669d20968a17cbadef3474dbacafb1f8fee7cfe7b7c8ed7fa1d47b6078eb9fb", + "contentHash": "d273bb78f57c5d5f8b6adf02c3b0bd34d3189c392bd7f81282e03f73cbfa4442", "contentHashAlgo": "sha256-normalized-v1", - "snapshotHash": "8222fa6d91e3674cfc6729c3c71a048ca154ea4de243f0bd40e3923eecfce2e4", + "snapshotHash": "49c91813bd3caa0bc18ccc4820a8be5637eb793f3bb47e84abe49b0d337b7b61", "overlayHash": "f99666ff9119084dd25c2974ae64eb6935ec2aa785ff5ad478fb9d541f7a5e94", "configurationHash": "9662cc07ea4ab203ff2ddf457d2db48b5375a7ab4a1f8fbc79dfebcaa8f9a00c", "lexiconVersion": 1, @@ -38207,7 +38207,7 @@ ], "averageFieldLength": { "aliases": 3.0144520272982738, - "body": 61.2328382175833, + "body": 61.252107587314335, "headings": 4.014853472501003, "path": 7.613809714973906, "summary": 4.553191489361702, @@ -49631,7 +49631,7 @@ "path": "apps/docs-next/content/docs/data/providers/openai.mdx", "symbols": "", "summary": "gpt-4o · gpt-4o-mini · gpt-5 · o1 · o3-mini · gpt-4.1.", - "body": "Options Option Type Default --- --- --- apiKey string required for openai ; optional for openaiCompatible and Cloudflare presets model string required baseUrl string https://api.openai.com path string /v1/chat/completions ; custom path appended to baseUrl headers HeadersInit additional headers; override defaults case-insensitively fetch typeof fetch global fetch capabilities Partialmajor-package", - "body": "@agentskit/adapters Profile: , provider: Prov return { mimeType: match[1]!, data: match[2]! } } -/** Serialize ordered parts; unsupported inputs fail instead of becoming text projections. */ +/** Serialize ordered parts, falling back to content when binary parts cannot be sent. */ export function providerParts(message: Message, provider: Provider, multiModal = true): Array> | undefined { if (!message.parts?.length) return undefined + if ((!multiModal || (provider === 'openai' && message.role === 'assistant')) && message.parts.some(part => part.type !== 'text')) { + console.warn(`${provider}: binary content parts omitted; using message.content text fallback`) + return undefined + } return message.parts.map(part => { if (part.type === 'text') return provider === 'gemini' ? { text: part.text } : { type: 'text', text: part.text } if (!multiModal || (message.role !== 'user' && message.role !== 'assistant') || (part.type !== 'image' && part.type !== 'file')) unsupported(provider, part) diff --git a/packages/adapters/src/openai.ts b/packages/adapters/src/openai.ts index d6e4ef944..ddd5e12f9 100644 --- a/packages/adapters/src/openai.ts +++ b/packages/adapters/src/openai.ts @@ -21,7 +21,7 @@ export interface OpenAIConfig { * Turn this on for vanilla `api.openai.com`. */ includeUsage?: boolean - /** Explicit capability facts for OpenAI-compatible providers with custom models. */ + /** Explicit capability facts take precedence over model-name heuristics. */ capabilities?: Partial } @@ -60,7 +60,7 @@ export function openai(config: OpenAIConfig): AdapterFactory { // o1 / o3 models emit reasoning; older models don't. Accurate per-model // detection would need a model registry; 'true' is the safer default here. reasoning: config.capabilities?.reasoning ?? (model.startsWith('o1') || model.startsWith('o3')), - multiModal: config.capabilities?.multiModal ?? (model.startsWith('gpt-4') || model.startsWith('gpt-5') || model.startsWith('o')), + multiModal: config.capabilities?.multiModal ?? /(^|\/)(gpt-[45]|o\d|gemini-|claude-(?:[3-9]|(?:sonnet|opus|haiku)-[3-9]))|vision/i.test(model), usage: true, ...config.capabilities, } diff --git a/packages/adapters/tests/capabilities.test.ts b/packages/adapters/tests/capabilities.test.ts index a60566b4b..873ebd4f0 100644 --- a/packages/adapters/tests/capabilities.test.ts +++ b/packages/adapters/tests/capabilities.test.ts @@ -4,6 +4,11 @@ import { openai, anthropic, gemini, ollama, mockAdapter, vercelAI } from '../src import { chunkText, simulateStream } from '../src/utils' describe('adapter capabilities', () => { + it.each(['meta-llama/llama-vision', 'google/gemini-2.5-flash', 'anthropic/claude-3.5-sonnet', 'anthropic/claude-sonnet-4-6', 'openai/gpt-4o', 'openai/o3'])('detects compatible multimodal model %s and honors explicit overrides', model => { + expect(openai({ apiKey: 'x', model }).capabilities?.multiModal).toBe(true) + expect(openai({ apiKey: 'x', model, capabilities: { multiModal: false } }).capabilities?.multiModal).toBe(false) + expect(openai({ apiKey: 'x', model: 'custom', capabilities: { multiModal: true } }).capabilities?.multiModal).toBe(true) + }) it('openai advertises streaming, tools, usage', () => { const adapter = openai({ apiKey: 'x', model: 'gpt-4o' }) expect(adapter.capabilities?.streaming).toBe(true) diff --git a/packages/adapters/tests/multimodal-http.test.ts b/packages/adapters/tests/multimodal-http.test.ts index 5132acac5..8d3ef20d1 100644 --- a/packages/adapters/tests/multimodal-http.test.ts +++ b/packages/adapters/tests/multimodal-http.test.ts @@ -94,12 +94,42 @@ describe('multimodal HTTP contract', () => { expect(body.messages).toEqual([{ role: 'user', content: 'inspect', images: ['aW1hZ2U='] }]) }) it('rejects unsupported modalities before network I/O', () => { - for (const adapter of [openai({ apiKey: 'synthetic', model: 'gpt-3.5', baseUrl }), ollama({ model: 'llama3', baseUrl })]) { - expect(() => adapter.createSource({ messages: [message([{ type: 'image', source: png }])] })).toThrow(expect.objectContaining({ code: 'CAPABILITY_UNSUPPORTED' })) - } expect(() => ollama({ model: 'llava', baseUrl }).createSource({ messages: [message([{ type: 'file', source: pdf }])] })).toThrow(expect.objectContaining({ code: 'CAPABILITY_UNSUPPORTED' })) expect(captured).toHaveLength(0) }) + it.each([ + ['gpt-3.5', undefined], ['gpt-4o', false], + ] as const)('falls back to text with a warning for %s, including old image history', async (model, multiModal) => { + const warning = vi.spyOn(console, 'warn').mockImplementation(() => {}) + try { + const adapter = openai({ apiKey: 'synthetic', model, baseUrl, ...(multiModal === undefined ? {} : { capabilities: { multiModal } }) }) + const messages = [message([{ type: 'image', source: png }, { type: 'file', source: pdf }]), + { ...message([], 'assistant'), content: 'old answer' }, + { ...message([{ type: 'text', text: 'followup' }]), content: 'followup' }] + const before = JSON.stringify(messages) + const chunks = [] + for await (const chunk of adapter.createSource({ messages }).stream()) chunks.push(chunk) + expect(chunks.at(-1)?.type).toBe('done') + expect(captured[0]?.body.messages).toEqual([ + { role: 'user', content: 'legacy projection' }, { role: 'assistant', content: 'old answer' }, + { role: 'user', content: [{ type: 'text', text: 'followup' }] }, + ]) + expect(warning).toHaveBeenCalledWith(expect.stringContaining('text fallback')) + expect(JSON.stringify(messages)).toBe(before) + } finally { warning.mockRestore() } + }) + it('omits binary assistant parts while preserving text and tool calls', async () => { + const warning = vi.spyOn(console, 'warn').mockImplementation(() => {}) + try { + const messages = [message([{ type: 'image', source: png }], 'assistant'), + { ...message([{ type: 'file', source: pdf }], 'assistant'), toolCalls: [{ id: 'call', name: 'inspect', args: {}, status: 'complete' as const }] }] + for await (const _chunk of openai({ apiKey: 'synthetic', model: 'gpt-4o', baseUrl }).createSource({ messages }).stream()) { /* drain */ } + expect(captured[0]?.body.messages).toEqual([ + { role: 'assistant', content: 'legacy projection' }, + { role: 'assistant', content: 'legacy projection', tool_calls: [{ id: 'call', type: 'function', function: { name: 'inspect', arguments: '{}' } }] }, + ]) + } finally { warning.mockRestore() } + }) it('custom gateway path/headers/fetch preserves streaming and usage without Bearer', async () => { const transport = vi.fn(globalThis.fetch) const config = { model: 'custom', baseUrl: `${baseUrl}/gateway`, path: '/compat/chat/completions', headers: { 'cf-aig-authorization': 'synthetic', 'X-Custom': 'present' }, fetch: transport, includeUsage: true } diff --git a/readme-standard-v1.json b/readme-standard-v1.json index 3c580168f..68b3b687e 100644 --- a/readme-standard-v1.json +++ b/readme-standard-v1.json @@ -285,7 +285,7 @@ "docs/STABILITY.md", "scripts/readme-fixtures.test.mjs" ], - "sourceHash": "sha256:5a3977f10a798b33fc42d07c46427c0672258cf173b153647b00257638a87234" + "sourceHash": "sha256:2f581a0863e59c436f63adf0b9e14db7ead6be3b0349da846e9196384edbaa0b" }, "exceptions": [] }, From ea4722b7b796597e2dab90dec7b367875e696145 Mon Sep 17 00:00:00 2001 From: EmersonBraun Date: Wed, 7 Oct 2026 22:42:45 -0300 Subject: [PATCH 13/13] fix(adapters): omit binary sources from text fallbacks --- .changeset/quiet-adapters-images.md | 2 +- .doc-bridge/capabilities.json | 2 +- .doc-bridge/index.json | 50 ++++++++-------- .../content/docs/data/providers/openai.mdx | 2 +- .../docs/reference/recipes/multi-modal.mdx | 5 +- packages/adapters/README.md | 5 +- packages/adapters/src/content-parts.ts | 21 +++++-- packages/adapters/src/ollama.ts | 3 +- packages/adapters/src/tool-history.ts | 3 +- packages/adapters/src/utils.ts | 3 +- .../adapters/tests/multimodal-http.test.ts | 60 +++++++++++++++---- readme-standard-v1.json | 2 +- 12 files changed, 107 insertions(+), 51 deletions(-) diff --git a/.changeset/quiet-adapters-images.md b/.changeset/quiet-adapters-images.md index c24969719..e85c6c2dc 100644 --- a/.changeset/quiet-adapters-images.md +++ b/.changeset/quiet-adapters-images.md @@ -2,4 +2,4 @@ "@agentskit/adapters": minor --- -Serialize supported image/file parts in OpenAI-compatible, Anthropic, Gemini/Vertex and Ollama requests. Preserve text-only model behavior and older multimodal histories by falling back to message.content with a warning when multimodal capability is disabled; OpenAI assistant binary parts also use the text fallback. Unsupported modalities and sources still raise CAPABILITY_UNSUPPORTED when multimodal input is enabled. Explicit capabilities override the expanded model-name heuristic. Add configurable path, headers and fetch, optional Bearer authentication for compatible endpoints, OpenAI-compatible and Cloudflare REST presets, an OpenRouter alias, and explicit catalog URL variables. Existing text-only and default endpoint behavior is preserved. +Serialize supported image/file parts in OpenAI-compatible, Anthropic, Gemini/Vertex and Ollama requests. Preserve text-only model behavior and older multimodal histories by falling back to text parts and short attachment markers, omitting binary data and data URLs, with at most one warning per request when multimodal capability is disabled; OpenAI and Anthropic assistant binary parts also use the text fallback. Unsupported modalities and sources still raise CAPABILITY_UNSUPPORTED when multimodal input is enabled. Explicit capabilities override the expanded model-name heuristic. Add configurable path, headers and fetch, optional Bearer authentication for compatible endpoints, OpenAI-compatible and Cloudflare REST presets, an OpenRouter alias, and explicit catalog URL variables. Existing text-only and default endpoint behavior is preserved. diff --git a/.doc-bridge/capabilities.json b/.doc-bridge/capabilities.json index 75c29785b..d04f65c4a 100644 --- a/.doc-bridge/capabilities.json +++ b/.doc-bridge/capabilities.json @@ -7,7 +7,7 @@ "name": "AgentsKit", "root": "." }, - "contentHash": "7076e2a630c01c3e0361cd609ebaf04936f8bdf6bcfbed0681a4a66bb8325b4c", + "contentHash": "de95fec2af4608ff2a437882c6c08c0cdc82c86637b2a49cc29ce29de2a43cca", "artifacts": { "index": ".doc-bridge/index.json", "llmsTxt": ".doc-bridge/llms.txt" diff --git a/.doc-bridge/index.json b/.doc-bridge/index.json index f09122bc1..487787324 100644 --- a/.doc-bridge/index.json +++ b/.doc-bridge/index.json @@ -1,8 +1,8 @@ { "schemaVersion": 1, - "contentHash": "7076e2a630c01c3e0361cd609ebaf04936f8bdf6bcfbed0681a4a66bb8325b4c", + "contentHash": "de95fec2af4608ff2a437882c6c08c0cdc82c86637b2a49cc29ce29de2a43cca", "contentHashAlgo": "sha256-normalized-v1", - "generatedAt": "2026-10-08T01:09:55.683Z", + "generatedAt": "2026-10-08T01:36:58.952Z", "project": { "name": "AgentsKit", "root": "." @@ -2308,7 +2308,7 @@ "document", "human" ], - "contentHash": "84950026a2850c8197d102d4178b040ee44e8ef3186af200193a8258373711d8" + "contentHash": "aeb25b23b2eca677189218974c32d3f042e317c690b4e7c464187c83034601e9" }, { "id": "document:apps/docs-next/content/docs/data/providers/openrouter.mdx", @@ -4431,7 +4431,7 @@ "document", "human" ], - "contentHash": "247a46146656041fa52a1aff8e9188abc035f7c5b91ce7795c0a07698f32865c" + "contentHash": "9eb91d2547f891f6a179bac361fa6a3d23902a822103480f355100cf19758376" }, { "id": "document:apps/docs-next/content/docs/reference/recipes/open-specs.mdx", @@ -6902,7 +6902,7 @@ "document", "project" ], - "contentHash": "13505c354960686695ceb3ce5e8454670a821f9f5d74cd6f83cc1dd7a33d7d25" + "contentHash": "337241356418b3cfc59e3fb28afa15beb2a157449e8b1b1257a1a7881fd07557" }, { "id": "document:packages/angular/CONVENTIONS.md", @@ -14555,7 +14555,7 @@ "ts", "src" ], - "contentHash": "29ceb47f9fdc2f00244dfd606eb57aa30e8974243d744b707c500548c7f67bd7" + "contentHash": "4541c6764430fb8e9e7546cfe457fa26b7ceb8e46debbbddc4c9e02b58d179f2" }, { "id": "module:packages/adapters/src/createAdapter.ts", @@ -15188,7 +15188,7 @@ "ts", "src" ], - "contentHash": "e1c04dc74efdc2cd8ea98b14caa0fe49bfc857d71aaca384327d3786ad148f7c" + "contentHash": "9f1a2e4365a8baf6b3c07d817b0b6fa574eb1d6e3c2c0adbe56ca4c580b4596f" }, { "id": "module:packages/adapters/src/openai-compatible.ts", @@ -15403,7 +15403,7 @@ "ts", "src" ], - "contentHash": "bbb6d4cfc92b2fbf8cd13bff728fbb3d424d172a7194da0aaa54bcae24dc35bc" + "contentHash": "16417cad54eee7d552ed45b70cfb870a2b90b6a45ca67b300bda51b5d89b5f28" }, { "id": "module:packages/adapters/src/types.ts", @@ -15445,7 +15445,7 @@ "ts", "src" ], - "contentHash": "b6a9e2a99fc39f1f0d21ac787c4cb170f7d9ca955a619d0d5673526eea0185e5" + "contentHash": "6bd9abaf3091be58f9c3de4cceb496b21931daa6d0bfce6eb0dd743f0e75869f" }, { "id": "module:packages/adapters/src/vercel-ai.ts", @@ -16017,7 +16017,7 @@ "test", "tests" ], - "contentHash": "490f09ef097a55b11e1100fed39c63943fa153a5942707f7f2acdfa2e3ce0f4e" + "contentHash": "e83d348b812952d2a5fe8d3bf30e6894a5191a11af07cbb3b9f12c7200f521d4" }, { "id": "module:packages/adapters/tests/net-migration-http.test.ts", @@ -38150,7 +38150,7 @@ "changes": {} }, "inputs": { - "hash": "d9f3f5d67cce0f54684b5fd6b87e1ca81013216f9f62cfe6112450126be913f0", + "hash": "24f8bb213b1054a6b0b61251b4ce7f91cb854760740820a7f028a72434cf0c24", "fileCount": 2536, "projectionVersion": 2 }, @@ -38173,9 +38173,9 @@ "projection": { "type": "retrieval-index", "schemaVersion": 1, - "contentHash": "d273bb78f57c5d5f8b6adf02c3b0bd34d3189c392bd7f81282e03f73cbfa4442", + "contentHash": "a3281eb0ac9d555bb67038a03f9124810b70d157a35a8577ab54a68a5eeab1b4", "contentHashAlgo": "sha256-normalized-v1", - "snapshotHash": "49c91813bd3caa0bc18ccc4820a8be5637eb793f3bb47e84abe49b0d337b7b61", + "snapshotHash": "b7f4c0990a396b5c64bf74375a2406e9ed9de4ef1e20bc36611d78e976d37d2b", "overlayHash": "f99666ff9119084dd25c2974ae64eb6935ec2aa785ff5ad478fb9d541f7a5e94", "configurationHash": "9662cc07ea4ab203ff2ddf457d2db48b5375a7ab4a1f8fbc79dfebcaa8f9a00c", "lexiconVersion": 1, @@ -38207,7 +38207,7 @@ ], "averageFieldLength": { "aliases": 3.0144520272982738, - "body": 61.252107587314335, + "body": 61.262545162585305, "headings": 4.014853472501003, "path": 7.613809714973906, "summary": 4.553191489361702, @@ -49631,7 +49631,7 @@ "path": "apps/docs-next/content/docs/data/providers/openai.mdx", "symbols": "", "summary": "gpt-4o · gpt-4o-mini · gpt-5 · o1 · o3-mini · gpt-4.1.", - "body": "Options Option Type Default --- --- --- apiKey string required for openai ; optional for openaiCompatible and Cloudflare presets model string required baseUrl string https://api.openai.com path string /v1/chat/completions ; custom path appended to baseUrl headers HeadersInit additional headers; override defaults case-insensitively fetch typeof fetch global fetch capabilities Partialmajor-package", - "body": "@agentskit/adapters Profile: , provider: Prov return { mimeType: match[1]!, data: match[2]! } } -/** Serialize ordered parts, falling back to content when binary parts cannot be sent. */ -export function providerParts(message: Message, provider: Provider, multiModal = true): Array> | undefined { +/** Serialize ordered parts, using short text markers when binary parts cannot be sent. */ +export function providerParts(message: Message, provider: Provider, multiModal = true, warning?: { emitted: boolean }): Array> | undefined { if (!message.parts?.length) return undefined - if ((!multiModal || (provider === 'openai' && message.role === 'assistant')) && message.parts.some(part => part.type !== 'text')) { - console.warn(`${provider}: binary content parts omitted; using message.content text fallback`) - return undefined + if ((!multiModal || ((provider === 'openai' || provider === 'anthropic') && message.role === 'assistant')) && message.parts.some(part => part.type !== 'text')) { + if (!warning?.emitted) { + console.warn(`${provider}: binary content parts omitted; using text fallback`) + if (warning) warning.emitted = true + } + const text = message.parts.map(part => { + if (part.type === 'text') return part.text + if (part.type === 'file') { + const name = part.filename && !/^\s*data:/i.test(part.filename) ? part.filename : 'omitted' + return `[file: ${name}]` + } + return `[${part.type} omitted]` + }).join('\n') + return provider === 'gemini' ? [{ text }] : [{ type: 'text', text }] } return message.parts.map(part => { if (part.type === 'text') return provider === 'gemini' ? { text: part.text } : { type: 'text', text: part.text } diff --git a/packages/adapters/src/ollama.ts b/packages/adapters/src/ollama.ts index 9ba5540f3..f05251f7c 100644 --- a/packages/adapters/src/ollama.ts +++ b/packages/adapters/src/ollama.ts @@ -31,11 +31,12 @@ export function ollama(config: OllamaConfig): AdapterFactory { multiModal: config.multiModal ?? (model.includes('llava') || model.includes('vision')), }, createSource: (request: AdapterRequest): StreamSource => { + const warning = { emitted: false } const body = { model, stream: true, messages: request.messages.map(message => { - const parts = providerParts(message, 'ollama', config.multiModal ?? (model.includes('llava') || model.includes('vision'))) + const parts = providerParts(message, 'ollama', config.multiModal ?? (model.includes('llava') || model.includes('vision')), warning) const images = parts?.filter(part => part.image !== undefined).map(part => part.image) return { role: message.role, diff --git a/packages/adapters/src/tool-history.ts b/packages/adapters/src/tool-history.ts index 33a6a4646..14b36c487 100644 --- a/packages/adapters/src/tool-history.ts +++ b/packages/adapters/src/tool-history.ts @@ -44,8 +44,9 @@ export function toAnthropicMessages( const knownNames = new Map() const output: Array<{ role: string; content: unknown }> = [] + const warning = { emitted: false } for (const message of messages) { - const parts = providerParts(message, 'anthropic') + const parts = providerParts(message, 'anthropic', true, warning) if (message.role === 'system') continue if (message.role === 'assistant' && message.toolCalls && message.toolCalls.length > 0) { diff --git a/packages/adapters/src/utils.ts b/packages/adapters/src/utils.ts index d7a0f481f..f7b13444f 100644 --- a/packages/adapters/src/utils.ts +++ b/packages/adapters/src/utils.ts @@ -25,8 +25,9 @@ export function toProviderMessages(messages: Message[], multiModal = true) { const knownToolCallIds = new Set() const output: Array> = [] + const warning = { emitted: false } for (const message of messages) { - const parts = providerParts(message, 'openai', multiModal) + const parts = providerParts(message, 'openai', multiModal, warning) const content = parts ?? message.content if (message.role === 'tool') { const id = message.toolCallId diff --git a/packages/adapters/tests/multimodal-http.test.ts b/packages/adapters/tests/multimodal-http.test.ts index 8d3ef20d1..d5bd2dc09 100644 --- a/packages/adapters/tests/multimodal-http.test.ts +++ b/packages/adapters/tests/multimodal-http.test.ts @@ -1,7 +1,7 @@ import { readFileSync } from 'node:fs' import { createServer, type IncomingHttpHeaders } from 'node:http' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import type { AdapterFactory, ContentPart, Message } from '@agentskit/core' +import { partsToText, type AdapterFactory, type ContentPart, type Message } from '@agentskit/core' import { openai } from '../src/openai' import { openaiCompatible } from '../src/openai-compatible' import { anthropic } from '../src/anthropic' @@ -23,7 +23,7 @@ export const multimodalCases = [ const png = 'data:image/png;base64,aW1hZ2U=' const pdf = 'data:application/pdf;base64,cGRm' function message(parts: ContentPart[], role: Message['role'] = 'user'): Message { - return { id: 'synthetic', role, content: 'legacy projection', parts, status: 'complete', createdAt: new Date(0) } + return { id: 'synthetic', role, content: partsToText(parts), parts, status: 'complete', createdAt: new Date(0) } } let server: ReturnType let baseUrl: string @@ -103,7 +103,9 @@ describe('multimodal HTTP contract', () => { const warning = vi.spyOn(console, 'warn').mockImplementation(() => {}) try { const adapter = openai({ apiKey: 'synthetic', model, baseUrl, ...(multiModal === undefined ? {} : { capabilities: { multiModal } }) }) - const messages = [message([{ type: 'image', source: png }, { type: 'file', source: pdf }]), + const messages = [message([{ type: 'text', text: 'inspect' }, { type: 'image', source: png }, { type: 'file', source: pdf, filename: 'sample.pdf' }]), + message([{ type: 'image', source: png }]), + message([{ type: 'file', source: pdf }]), { ...message([], 'assistant'), content: 'old answer' }, { ...message([{ type: 'text', text: 'followup' }]), content: 'followup' }] const before = JSON.stringify(messages) @@ -111,23 +113,61 @@ describe('multimodal HTTP contract', () => { for await (const chunk of adapter.createSource({ messages }).stream()) chunks.push(chunk) expect(chunks.at(-1)?.type).toBe('done') expect(captured[0]?.body.messages).toEqual([ - { role: 'user', content: 'legacy projection' }, { role: 'assistant', content: 'old answer' }, + { role: 'user', content: [{ type: 'text', text: 'inspect\n[image omitted]\n[file: sample.pdf]' }] }, + { role: 'user', content: [{ type: 'text', text: '[image omitted]' }] }, + { role: 'user', content: [{ type: 'text', text: '[file: omitted]' }] }, + { role: 'assistant', content: 'old answer' }, { role: 'user', content: [{ type: 'text', text: 'followup' }] }, ]) - expect(warning).toHaveBeenCalledWith(expect.stringContaining('text fallback')) + expect(warning).toHaveBeenCalledExactlyOnceWith(expect.stringContaining('text fallback')) + expect(JSON.stringify(captured[0]?.body)).not.toContain('data:') + expect(JSON.stringify(captured[0]?.body)).not.toContain('aW1hZ2U=') + for await (const _chunk of adapter.createSource({ messages }).stream()) { /* drain */ } + expect(warning).toHaveBeenCalledTimes(2) expect(JSON.stringify(messages)).toBe(before) } finally { warning.mockRestore() } }) - it('omits binary assistant parts while preserving text and tool calls', async () => { + it.each(['openai', 'anthropic'])('%s omits binary assistant parts while preserving text and tool calls', async provider => { const warning = vi.spyOn(console, 'warn').mockImplementation(() => {}) try { const messages = [message([{ type: 'image', source: png }], 'assistant'), - { ...message([{ type: 'file', source: pdf }], 'assistant'), toolCalls: [{ id: 'call', name: 'inspect', args: {}, status: 'complete' as const }] }] - for await (const _chunk of openai({ apiKey: 'synthetic', model: 'gpt-4o', baseUrl }).createSource({ messages }).stream()) { /* drain */ } + { ...message([{ type: 'text', text: 'checking' }, { type: 'file', source: pdf, filename: 'sample.pdf' }], 'assistant'), toolCalls: [{ id: 'call', name: 'inspect', args: {}, status: 'complete' as const }] }] + const adapter = provider === 'openai' ? openai({ apiKey: 'synthetic', model: 'gpt-4o', baseUrl }) : anthropic({ apiKey: 'synthetic', model: 'claude', baseUrl }) + for await (const _chunk of adapter.createSource({ messages }).stream()) { /* drain */ } + const text = { type: 'text', text: 'checking\n[file: sample.pdf]' } + expect(captured[0]?.body.messages).toEqual([ + { role: 'assistant', content: [{ type: 'text', text: '[image omitted]' }] }, + provider === 'openai' + ? { role: 'assistant', content: [text], tool_calls: [{ id: 'call', type: 'function', function: { name: 'inspect', arguments: '{}' } }] } + : { role: 'assistant', content: [text, { type: 'tool_use', id: 'call', name: 'inspect', input: {} }] }, + ]) + expect(warning).toHaveBeenCalledOnce() + expect(JSON.stringify(captured[0]?.body)).not.toContain('data:') + } finally { warning.mockRestore() } + }) + it('Ollama text-only requests omit binary sources and warn once per request', async () => { + const warning = vi.spyOn(console, 'warn').mockImplementation(() => {}) + try { + const messages = [ + message([{ type: 'image', source: png }]), + message([{ type: 'text', text: 'inspect' }, { type: 'file', source: pdf, filename: 'sample.pdf' }]), + message([{ type: 'file', source: pdf }]), + ] + const before = JSON.stringify(messages) + expect(messages[0]!.content).toBe(partsToText(messages[0]!.parts!)) + expect(messages[0]!.content).toContain(png) + const adapter = ollama({ model: 'llama3.1', baseUrl }) + for await (const _chunk of adapter.createSource({ messages }).stream()) { /* drain */ } expect(captured[0]?.body.messages).toEqual([ - { role: 'assistant', content: 'legacy projection' }, - { role: 'assistant', content: 'legacy projection', tool_calls: [{ id: 'call', type: 'function', function: { name: 'inspect', arguments: '{}' } }] }, + { role: 'user', content: '[image omitted]' }, + { role: 'user', content: 'inspect\n[file: sample.pdf]' }, + { role: 'user', content: '[file: omitted]' }, ]) + expect(warning).toHaveBeenCalledOnce() + expect(JSON.stringify(captured[0]?.body)).not.toContain('data:') + expect(JSON.stringify(messages)).toBe(before) + for await (const _chunk of adapter.createSource({ messages }).stream()) { /* drain */ } + expect(warning).toHaveBeenCalledTimes(2) } finally { warning.mockRestore() } }) it('custom gateway path/headers/fetch preserves streaming and usage without Bearer', async () => { diff --git a/readme-standard-v1.json b/readme-standard-v1.json index 68b3b687e..cb12d04d9 100644 --- a/readme-standard-v1.json +++ b/readme-standard-v1.json @@ -285,7 +285,7 @@ "docs/STABILITY.md", "scripts/readme-fixtures.test.mjs" ], - "sourceHash": "sha256:2f581a0863e59c436f63adf0b9e14db7ead6be3b0349da846e9196384edbaa0b" + "sourceHash": "sha256:5b20b7ab61f667e9a5801a71d15c6e9ad689bf25a22dc8d264cee669ba13032d" }, "exceptions": [] },